YunoHost MCP server
Nostr-authenticated MCP server for secure YunoHost administration.
0 stars
Reviews
Write oneNobody has reviewed YunoHost MCP yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
YunoHost MCP tools (100, 20 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
app_change_urlMove an installed YunoHost app to a new domain and/or path, in place.
app_config_getRead an installed app's config-panel settings.
app_config_setSet one config-panel setting on an installed app. Requires confirmation.
app_infoReturn details (manifest, settings, permissions, upgradability) for one installed app.
app_installInstall a YunoHost app.
app_removewrite actionRemove an installed YunoHost app. Requires confirmation and a recent backup archive.
app_resourcesReturn the declared YunoHost resources for one installed app.
app_setting_getRead one key from an installed app's settings.yml.
app_setting_setwrite actionWrite or delete one key in an installed app's settings.yml. Requires confirmation.
app_upgradeUpgrade one installed YunoHost app, or all upgradable apps if none is specified.
approve_operationOwner 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.
apps_listList installed YunoHost apps.
audit_getReturn 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.
audit_listList audit trail entries, newest first. Requires Scope.AUDIT_READ (app-admin and above) plus owner co-signature per call - see audit_get.
backup_createwrite actionCreate a new local backup archive.
backup_deletewrite actionPermanently delete one local backup archive. Requires owner approval.
backup_infoDetails 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
backup_restoreRestore from a local backup archive. Requires confirmation.
backups_listList available backup archives.
diagnosis_getReturn the current (cached) aggregated diagnosis report.
diagnosis_runwrite actionTrigger a fresh YunoHost diagnosis run. Can take real time (network/port checks).
domain_addRegister 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
domain_cert_infoRead-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.
domain_cert_installIssue 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.
domain_dns_pushPush 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
domain_dns_push_previewCompute 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
domain_dns_suggestSuggest 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
domain_removewrite actionRemove 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. `
domains_listList domains configured on this YunoHost server.
execute_planwrite actionExecute 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.
firewall_closeClose 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.
firewall_is_openReturn whether a port is open. `protocol` is "tcp" or "udp". Read-only.
firewall_listList firewall rules. `protocol` is "tcp" or "udp" (ignored if `raw`); `forwarded` lists UPnP-forwarded ports instead of open ports. Read-only.
firewall_openOpen 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.
firewall_reloadRe-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.
health_checkReturn a summary YunoHost diagnosis report.
http_probeProbe an HTTP(S) endpoint and return status, timing, and content type.
incident_snapshotCollect the main read-only evidence for one incident time window.
journal_queryQuery allowlisted system journals, including kernel, OOM, SSH, fail2ban, firewall, systemd, and application units.
memory_contextAssemble bounded working context from Polypack.
memory_feedbackRecord whether a Polypack memory helped this authenticated agent.
memory_getReturn one Polypack memory by exact ID.
memory_list_contextsList Polypack context namespaces visible to the local store.
memory_recallRecall bounded Polypack memories for an authenticated agent.
memory_storeStore durable Polypack memory with server-authored provenance.
memory_threadWalk a bounded Polypack response/supersession thread.
migrations_listList known migrations. `pending`/`done` filter; the default (neither set) returns all of them. Read-only - same scope as updates_check.
migrations_runwrite actionRun (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.
migrations_stateReturn the recorded state (done/pending/skipped) of every migration that has ever run on this server. Read-only.
network_snapshotReturn local addresses, routes, and listening sockets.
operation_logsReturn 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.
operation_statusReturn success/failure status and metadata for one YunoHost operation.
operations_listList recent YunoHost operation log entries.
package_backup_testwrite actionCreate a backup of an installed test app, to verify its backup script works.
package_change_url_testMove a test app to a new domain/path, to verify its change_url script works.
package_inspectReturn the manifest and declared resources for a candidate package.
package_install_testInstall a candidate package from a local path/git URL, for testing.
package_lintwrite actionRun the upstream package_linter against a local package path.
package_logsReturn 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.
package_remove_testwrite actionRemove a test app, to verify its remove script works. Purges data by default.
package_restore_testRestore a test app from a backup archive, to verify its restore script works.
package_run_testswrite actionRun 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.
package_test_preparePrepare a short-lived package-test session without changing the host.
package_upgrade_testUpgrade an already-installed `app` from a candidate local path/tarball, for testing.
plan_app_upgradeReport 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).
regenconf_applyRegenerate (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.
regenconf_pendingList 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.
server_infoReturn YunoHost server/component version information.
service_historyReturn service state, exit details, restart counts, and timestamps.
service_logsStructured systemd journal entries for one YunoHost-managed service (must be a name services_list() reports) - normalized timestamp/service/priority/message per entry.
service_restartRestart one or more YunoHost services.
service_startStart one or more stopped YunoHost services.
service_statusReturn status for one or more named services.
service_stopStop one or more YunoHost services. Call service_start to bring them back up.
services_listList all YunoHost-managed services and their status.
settings_getRead one global setting by key (see settings_list for known keys). `full` additionally returns its type/description/default. Read-only.
settings_listList 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.
settings_setSet 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.
ssh_diagnoseCollect SSH listener, fail2ban, firewall, service, and auth evidence.
system_rebootReboot 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.
system_shutdownPower 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.
system_snapshotReturn host uptime, boot, resource, process, disk, and OOM evidence.
system_upgradeUpgrade system (OS-level) packages. Requires confirmation.
updates_checkList apps and system components with pending updates, from cache (no network refresh).
updates_refreshRefresh 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
user_createwrite actionCreate 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.
user_deletewrite actionDelete a YunoHost user account. Requires owner co-signature (approve_operation) in addition to confirmation - see PLAN.md Phase 13.
user_group_createwrite actionCreate 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.
user_group_deletewrite actionDelete a YunoHost user group. Requires owner co-signature (approve_operation) in addition to confirmation - see PLAN.md Phase 13.
user_group_listList YunoHost user groups (e.g. `all_users`, `admins`, and any per-app permission groups) and their members.
user_group_updatewrite actionAdd or remove usernames from a YunoHost group (e.g. adding a user to `admins` grants webadmin/SSH access - grant with care).
user_permission_addGrant 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.
user_permission_infoRead one permission's full info (allowed users/groups, label, show_tile, protected, URL(s)) - see user_permission_list for known permission names. Read-only.
user_permission_listList app/system permissions and which users/groups are allowed each one (e.g. which apps a given group can access).
user_permission_removewrite actionRevoke 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.
user_permission_updatewrite actionUpdate 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
user_updatewrite actionUpdate an existing YunoHost user's mail/password/quota/fullname. Only the fields passed are changed; omitted fields are left as-is.
users_listList YunoHost user accounts.
web_logsRead bounded, structured Nginx access and error logs.
wrapper
Public scan report
scanner v0.1.9 · 2026-09-20 · same rubric, same numbers if you re-run it
- Code scan76 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 4 days ago15/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
Install directly
claude mcp add yunohost-mcp -- uvx yunohost-mcp-connect
YunoHost MCP: common questions
- Is YunoHost MCP server safe?
- Yes, by our scan: it is graded A (92/100). Read the YunoHost MCP safety report
- How do I install YunoHost MCP?
- It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
- Does YunoHost MCP need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is YunoHost MCP maintained?
- The last commit was 5 days ago (2026-09-15). The latest release is v0.8.46.