{"name":"io.github.imattau/yunohost-mcp","slug":"imattau-yunohost-mcp","title":"YunoHost MCP","description":"Nostr-authenticated MCP server for secure YunoHost administration.","url":"https://mcp.market/server/imattau-yunohost-mcp","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":15,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-09-15T21:59:12.000Z","license":"AGPL-3.0"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/imattau/yunohost-mcp","website":null,"version":"0.8.46","remotes":[],"packages":[{"registryType":"pypi","identifier":"yunohost-mcp-connect","version":"0.8.46","transport":{"type":"stdio"}}],"tools":[{"name":"app_change_url","description":"Move an installed YunoHost app to a new domain and/or path, in place.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_config_get","description":"Read an installed app's config-panel settings.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_config_set","description":"Set one config-panel setting on an installed app. Requires confirmation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_info","description":"Return details (manifest, settings, permissions, upgradability) for one installed app.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_install","description":"Install a YunoHost app.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_remove","description":"Remove an installed YunoHost app. Requires confirmation and a recent backup archive.","write_action":true,"price_micros":0,"input_schema":null},{"name":"app_resources","description":"Return the declared YunoHost resources for one installed app.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_setting_get","description":"Read one key from an installed app's settings.yml.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_setting_set","description":"Write or delete one key in an installed app's settings.yml. Requires confirmation.","write_action":true,"price_micros":0,"input_schema":null},{"name":"app_upgrade","description":"Upgrade one installed YunoHost app, or all upgradable apps if none is specified.","write_action":false,"price_micros":0,"input_schema":null},{"name":"approve_operation","description":"Owner co-signature (PLAN.md Phase 13; owner-approval-plan.md's `solo` profile for v1) for a pending high-risk operation (system. upgrade, backups.restore - see policy/rules.py's require_owner_signature). Marks the confirmation approved so its original requester can then execute it by calling the same tool again with this confirmation_id - approving does not execute anything itself.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apps_list","description":"List installed YunoHost apps.","write_action":false,"price_micros":0,"input_schema":null},{"name":"audit_get","description":"Return one audit trail entry by id. Requires Scope.AUDIT_READ (app-admin and above) plus owner co-signature per call: unlike other confirmed reads, this isn't gated for the caller's own protection - it's gated because the trail exposes every *other* identity's calls too, so the owner approves each read rather than it being a standing grant.","write_action":false,"price_micros":0,"input_schema":null},{"name":"audit_list","description":"List audit trail entries, newest first. Requires Scope.AUDIT_READ (app-admin and above) plus owner co-signature per call - see audit_get.","write_action":false,"price_micros":0,"input_schema":null},{"name":"backup_create","description":"Create a new local backup archive.","write_action":true,"price_micros":0,"input_schema":null},{"name":"backup_delete","description":"Permanently delete one local backup archive. Requires owner approval.","write_action":true,"price_micros":0,"input_schema":null},{"name":"backup_info","description":"Details for one backup archive - creation time, description, size, and its on-disk `path` - and, with `with_details=True`, the apps and system parts it actually contains. Read-only. There is no MCP tool to fetch the archive's bytes: `path` is where an admin retrieves it from (e.g. over SSH/SCP/SFTP) - YunoHost's own backup_download is an HTTP-file-serving action tied to its REST API, not something","write_action":false,"price_micros":0,"input_schema":null},{"name":"backup_restore","description":"Restore from a local backup archive. Requires confirmation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"backups_list","description":"List available backup archives.","write_action":false,"price_micros":0,"input_schema":null},{"name":"diagnosis_get","description":"Return the current (cached) aggregated diagnosis report.","write_action":false,"price_micros":0,"input_schema":null},{"name":"diagnosis_run","description":"Trigger a fresh YunoHost diagnosis run. Can take real time (network/port checks).","write_action":true,"price_micros":0,"input_schema":null},{"name":"domain_add","description":"Register a new domain or subdomain on this YunoHost server - a prerequisite for app_install's `domain` question, which only accepts already-registered domains. Always adds a plain custom domain, never subscribes to a new top-level DynDNS domain (nohost.me/noho.st/ynh.fr) even if the name would otherwise qualify - a same-host subdomain of an already-registered DynDNS domain (e.g. new-app.example.no","write_action":false,"price_micros":0,"input_schema":null},{"name":"domain_cert_info","description":"Read-only certificate status for an already-registered domain (must already appear in domains_list()): CA type/name, remaining validity in days, a style/summary badge, whether it's ACME-eligible right now, and whether a wildcard covers it - the checks worth doing before calling domain_cert_install.","write_action":false,"price_micros":0,"input_schema":null},{"name":"domain_cert_install","description":"Issue or renew a certificate for an existing domain (must already be registered - see domain_add/domains_list) via YunoHost's own certificate-install path, not a remove-and-recreate of the domain.","write_action":false,"price_micros":0,"input_schema":null},{"name":"domain_dns_push","description":"Push domain_dns_suggest's recommended records to the domain's configured DNS registrar. Requires a registrar to already be set up via the domain's own `dns.registrar` config panel (`app_config_get`/ `app_config_set` don't cover per-domain config panels - this fails with a clear error if none is configured, it does not silently no-op). Call domain_dns_push_preview first, always - it shows the exact","write_action":false,"price_micros":0,"input_schema":null},{"name":"domain_dns_push_preview","description":"Compute what domain_dns_push would actually change on the domain's configured DNS registrar - a create/update/delete/unchanged diff against the records currently live there - without touching anything. Read-only; requires the domain to already have a registrar configured (fails clearly if not - see domain_dns_push's docstring). Without `force`, the diff only considers records YunoHost itself previ","write_action":false,"price_micros":0,"input_schema":null},{"name":"domain_dns_suggest","description":"Suggest DNS records for an already-registered domain - basic A/AAAA, mail (MX/SPF/DKIM/DMARC), and any extra records YunoHost's installed apps contribute - as a formatted zone-file-style block of text, the same output `yunohost domain dns suggest` prints. Read-only, computed locally from this server's own state; does not contact or compare against the domain's actual registrar (see domain_dns_push","write_action":false,"price_micros":0,"input_schema":null},{"name":"domain_remove","description":"Remove a registered domain. Refuses to run - and lists the offending apps - if any app is still installed on this domain, unless `remove_apps=True`, which removes those apps too as part of the same call (each one via its own app_remove-equivalent path, with the same data loss that implies - check apps_list for this domain first). Cannot remove the main domain while any other domain still exists. `","write_action":true,"price_micros":0,"input_schema":null},{"name":"domains_list","description":"List domains configured on this YunoHost server.","write_action":false,"price_micros":0,"input_schema":null},{"name":"execute_plan","description":"Execute a plan previously returned by plan_app_upgrade(). Re-checks apps.upgrade's hard policy at execute time, not just at plan time - state (free space, backup age) may have drifted in between.","write_action":true,"price_micros":0,"input_schema":null},{"name":"firewall_close","description":"Close a port. `protocol` is \"tcp\" or \"udp\"; `port` may be a dash-separated range. Requires confirmation and owner co-signature - see the warning in the confirmation plan before approving this on port 22/80/443.","write_action":false,"price_micros":0,"input_schema":null},{"name":"firewall_is_open","description":"Return whether a port is open. `protocol` is \"tcp\" or \"udp\". Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"firewall_list","description":"List firewall rules. `protocol` is \"tcp\" or \"udp\" (ignored if `raw`); `forwarded` lists UPnP-forwarded ports instead of open ports. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"firewall_open","description":"Open a port. `protocol` is \"tcp\" or \"udp\"; `port` may be a dash-separated range. Requires confirmation and owner co-signature - a wrong port/protocol here is externally visible and reachable, same risk tier as system_upgrade/backup_restore.","write_action":false,"price_micros":0,"input_schema":null},{"name":"firewall_reload","description":"Re-apply the full current firewall rule set. Requires confirmation and owner co-signature, same tier as firewall_open/firewall_close - this is the point at which any pending rule change actually takes effect.","write_action":false,"price_micros":0,"input_schema":null},{"name":"health_check","description":"Return a summary YunoHost diagnosis report.","write_action":false,"price_micros":0,"input_schema":null},{"name":"http_probe","description":"Probe an HTTP(S) endpoint and return status, timing, and content type.","write_action":false,"price_micros":0,"input_schema":null},{"name":"incident_snapshot","description":"Collect the main read-only evidence for one incident time window.","write_action":false,"price_micros":0,"input_schema":null},{"name":"journal_query","description":"Query allowlisted system journals, including kernel, OOM, SSH, fail2ban, firewall, systemd, and application units.","write_action":false,"price_micros":0,"input_schema":null},{"name":"memory_context","description":"Assemble bounded working context from Polypack.","write_action":false,"price_micros":0,"input_schema":null},{"name":"memory_feedback","description":"Record whether a Polypack memory helped this authenticated agent.","write_action":false,"price_micros":0,"input_schema":null},{"name":"memory_get","description":"Return one Polypack memory by exact ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"memory_list_contexts","description":"List Polypack context namespaces visible to the local store.","write_action":false,"price_micros":0,"input_schema":null},{"name":"memory_recall","description":"Recall bounded Polypack memories for an authenticated agent.","write_action":false,"price_micros":0,"input_schema":null},{"name":"memory_store","description":"Store durable Polypack memory with server-authored provenance.","write_action":false,"price_micros":0,"input_schema":null},{"name":"memory_thread","description":"Walk a bounded Polypack response/supersession thread.","write_action":false,"price_micros":0,"input_schema":null},{"name":"migrations_list","description":"List known migrations. `pending`/`done` filter; the default (neither set) returns all of them. Read-only - same scope as updates_check.","write_action":false,"price_micros":0,"input_schema":null},{"name":"migrations_run","description":"Run (or skip, or force-rerun) migrations. Defaults to all pending migrations if `targets` is empty. `skip` and `force_rerun` require explicit `targets` (never applied to \"all pending\"). Requires confirmation and owner co-signature - same tier as system_upgrade.","write_action":true,"price_micros":0,"input_schema":null},{"name":"migrations_state","description":"Return the recorded state (done/pending/skipped) of every migration that has ever run on this server. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"network_snapshot","description":"Return local addresses, routes, and listening sockets.","write_action":false,"price_micros":0,"input_schema":null},{"name":"operation_logs","description":"Return the log content for one YunoHost operation - most recent `tail_lines` lines only (default: a bounded tail, not the whole log; pass a larger tail_lines for more). Secret-shaped content (a password/token/api_key/... assignment) in the log text is redacted.","write_action":false,"price_micros":0,"input_schema":null},{"name":"operation_status","description":"Return success/failure status and metadata for one YunoHost operation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"operations_list","description":"List recent YunoHost operation log entries.","write_action":false,"price_micros":0,"input_schema":null},{"name":"package_backup_test","description":"Create a backup of an installed test app, to verify its backup script works.","write_action":true,"price_micros":0,"input_schema":null},{"name":"package_change_url_test","description":"Move a test app to a new domain/path, to verify its change_url script works.","write_action":false,"price_micros":0,"input_schema":null},{"name":"package_inspect","description":"Return the manifest and declared resources for a candidate package.","write_action":false,"price_micros":0,"input_schema":null},{"name":"package_install_test","description":"Install a candidate package from a local path/git URL, for testing.","write_action":false,"price_micros":0,"input_schema":null},{"name":"package_lint","description":"Run the upstream package_linter against a local package path.","write_action":true,"price_micros":0,"input_schema":null},{"name":"package_logs","description":"Return the log for one operation - an alias over operation_logs() for the package-development workflow (PLAN.md Phase 8). See that tool's docstring for the default tail size and log-text redaction.","write_action":false,"price_micros":0,"input_schema":null},{"name":"package_remove_test","description":"Remove a test app, to verify its remove script works. Purges data by default.","write_action":true,"price_micros":0,"input_schema":null},{"name":"package_restore_test","description":"Restore a test app from a backup archive, to verify its restore script works.","write_action":false,"price_micros":0,"input_schema":null},{"name":"package_run_tests","description":"Run the standard install -> backup -> remove -> restore -> remove cycle against a candidate package in one call. Stops at the first failing step; see yunohost/adapter.py's package_run_tests for exactly what each step does and why this isn't package_check's full CI matrix.","write_action":true,"price_micros":0,"input_schema":null},{"name":"package_test_prepare","description":"Prepare a short-lived package-test session without changing the host.","write_action":false,"price_micros":0,"input_schema":null},{"name":"package_upgrade_test","description":"Upgrade an already-installed `app` from a candidate local path/tarball, for testing.","write_action":false,"price_micros":0,"input_schema":null},{"name":"plan_app_upgrade","description":"Report what an upgrade of `app` would involve, without doing it: current/target version, and whether apps.upgrade's policy (recent backup, free space) would currently block it and why. Pass the returned plan_id to execute_plan() to actually upgrade - read-only, no lock, no audit entry (nothing in YunoHost changes here).","write_action":false,"price_micros":0,"input_schema":null},{"name":"regenconf_apply","description":"Regenerate (apply) pending system-service config files. `names` restricts this to specific categories (default: all pending); `force` additionally overwrites manually-edited files. Requires confirmation and owner co-signature, same tier as firewall_open/firewall_close - a bad regeneration can lock the admin out the same way a bad firewall rule can.","write_action":false,"price_micros":0,"input_schema":null},{"name":"regenconf_pending","description":"List system-service config files (nginx, ssowat, mysql, ...) that are out of date versus YunoHost's current internal state, without changing anything. `names` restricts the check to specific categories (default: all); `with_diff` includes the actual diff text. Read-only - call this before regenconf_apply to see what would change.","write_action":false,"price_micros":0,"input_schema":null},{"name":"server_info","description":"Return YunoHost server/component version information.","write_action":false,"price_micros":0,"input_schema":null},{"name":"service_history","description":"Return service state, exit details, restart counts, and timestamps.","write_action":false,"price_micros":0,"input_schema":null},{"name":"service_logs","description":"Structured systemd journal entries for one YunoHost-managed service (must be a name services_list() reports) - normalized timestamp/service/priority/message per entry.","write_action":false,"price_micros":0,"input_schema":null},{"name":"service_restart","description":"Restart one or more YunoHost services.","write_action":false,"price_micros":0,"input_schema":null},{"name":"service_start","description":"Start one or more stopped YunoHost services.","write_action":false,"price_micros":0,"input_schema":null},{"name":"service_status","description":"Return status for one or more named services.","write_action":false,"price_micros":0,"input_schema":null},{"name":"service_stop","description":"Stop one or more YunoHost services. Call service_start to bring them back up.","write_action":false,"price_micros":0,"input_schema":null},{"name":"services_list","description":"List all YunoHost-managed services and their status.","write_action":false,"price_micros":0,"input_schema":null},{"name":"settings_get","description":"Read one global setting by key (see settings_list for known keys). `full` additionally returns its type/description/default. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"settings_list","description":"List YunoHost's global settings (SSO behavior, security toggles, misc display options) and their current values. `full` additionally returns each setting's type/description/default. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"settings_set","description":"Set one global setting (see settings_list for known keys). `value` is always passed as a string - YunoHost coerces it to the setting's actual type internally. Requires confirmation and owner co-signature, same tier as firewall_open/firewall_close.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_diagnose","description":"Collect SSH listener, fail2ban, firewall, service, and auth evidence.","write_action":false,"price_micros":0,"input_schema":null},{"name":"system_reboot","description":"Reboot the host (`systemctl reboot`) immediately once confirmed - no further in-process delay or grace period. Requires confirmation and owner co-signature, same tier as system_upgrade. Comes back up on its own; contrast with system_shutdown, which does not.","write_action":false,"price_micros":0,"input_schema":null},{"name":"system_shutdown","description":"Power off the host (`systemctl poweroff`) immediately once confirmed. Requires confirmation and owner co-signature, same tier as system_upgrade. Does NOT come back up on its own - without remote power management, someone needs physical access to the machine to restore it. Prefer system_reboot unless a real power-off is actually what's wanted.","write_action":false,"price_micros":0,"input_schema":null},{"name":"system_snapshot","description":"Return host uptime, boot, resource, process, disk, and OOM evidence.","write_action":false,"price_micros":0,"input_schema":null},{"name":"system_upgrade","description":"Upgrade system (OS-level) packages. Requires confirmation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"updates_check","description":"List apps and system components with pending updates, from cache (no network refresh).","write_action":false,"price_micros":0,"input_schema":null},{"name":"updates_refresh","description":"Refresh cached update metadata over the network: apt-get update and/or a re-fetch of every registered app catalog source (including a local nostr_catalog feed, if installed), then report what's now upgradable. target is \"apps\", \"system\", or \"all\". Can take real time. Use this after catalog_publish to confirm a package actually shows up in the live catalog - updates_check alone only reads the exist","write_action":false,"price_micros":0,"input_schema":null},{"name":"user_create","description":"Create a YunoHost user account/mailbox on `domain` (must already be registered - see domain_add/domains_list). `admin` adds the new user to the `admins` group, granting webadmin/SSH access - grant with care.","write_action":true,"price_micros":0,"input_schema":null},{"name":"user_delete","description":"Delete a YunoHost user account. Requires owner co-signature (approve_operation) in addition to confirmation - see PLAN.md Phase 13.","write_action":true,"price_micros":0,"input_schema":null},{"name":"user_group_create","description":"Create a new YunoHost user group - a prerequisite for granting a custom set of users access to an app permission (see user_permission_add) rather than an individual username.","write_action":true,"price_micros":0,"input_schema":null},{"name":"user_group_delete","description":"Delete a YunoHost user group. Requires owner co-signature (approve_operation) in addition to confirmation - see PLAN.md Phase 13.","write_action":true,"price_micros":0,"input_schema":null},{"name":"user_group_list","description":"List YunoHost user groups (e.g. `all_users`, `admins`, and any per-app permission groups) and their members.","write_action":false,"price_micros":0,"input_schema":null},{"name":"user_group_update","description":"Add or remove usernames from a YunoHost group (e.g. adding a user to `admins` grants webadmin/SSH access - grant with care).","write_action":true,"price_micros":0,"input_schema":null},{"name":"user_permission_add","description":"Grant a user or group access to an app permission (e.g. \"myapp.main\" - see user_permission_list for existing permission names). Requires owner co-signature (approve_operation) in addition to confirmation - see PLAN.md Phase 13's \"permission changes\" candidate.","write_action":false,"price_micros":0,"input_schema":null},{"name":"user_permission_info","description":"Read one permission's full info (allowed users/groups, label, show_tile, protected, URL(s)) - see user_permission_list for known permission names. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"user_permission_list","description":"List app/system permissions and which users/groups are allowed each one (e.g. which apps a given group can access).","write_action":false,"price_micros":0,"input_schema":null},{"name":"user_permission_remove","description":"Revoke a user or group's access to an app permission. Requires owner co-signature (approve_operation) in addition to confirmation - see PLAN.md Phase 13's \"permission changes\" candidate.","write_action":true,"price_micros":0,"input_schema":null},{"name":"user_permission_update","description":"Update a permission's label or dashboard tile visibility (`show_tile`) - not who has access, use user_permission_add/ user_permission_remove for that. Leave an argument None to leave it unchanged. `protected` is accepted for backward compatibility but, on the currently-installed YunoHost version, raises rather than silently doing nothing - the real user_permission_update() has no such parameter; p","write_action":true,"price_micros":0,"input_schema":null},{"name":"user_update","description":"Update an existing YunoHost user's mail/password/quota/fullname. Only the fields passed are changed; omitted fields are left as-is.","write_action":true,"price_micros":0,"input_schema":null},{"name":"users_list","description":"List YunoHost user accounts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"web_logs","description":"Read bounded, structured Nginx access and error logs.","write_action":false,"price_micros":0,"input_schema":null},{"name":"wrapper","description":"","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-09-20T00:26:08.089Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T00:26:08.097Z","components":{"code":{"score":25,"max":25,"notes":["76 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 4 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"yunohost-mcp-connect","version":"0.8.46","found":true,"license":"AGPL-3.0-or-later","dependencyCount":10,"publishedAt":"2026-09-07T21:33:23.368532Z"}],"repo":{"found":true,"owner":"imattau","repo":"yunohost-mcp","archived":false,"pushedAt":"2026-09-15T21:59:12Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/17115417?v=4","ownerCreatedAt":"2016-02-08T01:45:16Z","license":"AGPL-3.0"},"icon":{"url":"https://avatars.githubusercontent.com/u/17115417?v=4&s=128","source":"github"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"AGPL-3.0","lastPushAt":"2026-09-15T21:59:12.000Z","score":15}}}},"grade_history":[],"reviews":[]}