Nostr-authenticated MCP server for secure YunoHost administration.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Secure MCP server for YunoHost: Nostr-authenticated, policy-controlled, auditable administration, diagnostics, and _ynh package development for AI clients (Codex, Claude, OpenCode, ChatGPT-compatible MCP clients).
See PLAN.md for the full design and phased roadmap, and PHASE0_INVESTIGATION.md for how it maps onto YunoHost's actual Python API.
By default fake_yunohost is off (real mode) β set YUNOHOST_MCP_FAKE_YUNOHOST=true to run against canned data on a machine without YunoHost installed. See identity.example.toml for identity.toml's shape (pubkey β role mapping; required before any HTTP request can do anything).
The server can act as an authenticated faΓ§ade for a separately installed
Polypack MCP service. Set YUNOHOST_MCP_POLYPACK_URL to that service's
loopback /mcp/ endpoint; the URL must resolve to 127.0.0.1, ::1, or
localhost, and Polypack remains the sole owner of its database. The YunoHost
MCP HTTP endpoint is still the only endpoint agents should expose publicly.
The initial integration exposes bounded memory_get, memory_list_contexts,
memory_recall, memory_context, memory_thread, memory_store, and
memory_feedback tools. Memory reads, writes, and feedback have separate
memory.read, memory.write, and memory.feedback scopes; writes are locked
and audited, while content is represented in the audit log only by length and
hash. Provenance is added by this server, and user metadata cannot forge its
reserved _yunohost_* fields. The integration is optional and core YunoHost
tools continue to work when Polypack is not installed or not configured.
The recommended client-side path is uvx, which creates an isolated
environment for the command without requiring users to manage a Python virtual
environment:
For a persistent command-line installation, use:
The package is also installable with python3 -m pip install yunohost-mcp-connect; that path is mainly useful for development or systems
where uv is not available.
The setup wizard is designed to be run by an AI agent on the user's local machine. It generates a fresh client identity, writes the selected MCP client configuration, and prints the one remaining security-sensitive step: granting the generated npub an appropriate role on the YunoHost server.
Supported clients are codex, claude-desktop, claude-code, gemini,
hermes, and opencode.
Setup is safe to rerun, refuses conflicting server definitions, backs up an
existing configuration before changing it, and never prints the private key.
Use --print-only when the agent should display configuration without writing
it. After granting the npub and restarting the client, diagnose the connection:
Mainstream MCP clients (Claude Desktop, a plain Codex install, etc.) have no way to sign a NIP-98 Authorization header β that's specific to this server. yunohost-mcp-connect bridges the gap: a small local process that speaks plain MCP over stdio to your actual client, and forwards every request to the remote --transport http server, signed with your own Nostr key.
--key-file (or $YUNOHOST_MCP_CLIENT_KEY_FILE) points at a file holding a hex or nsec1... private key β preferred over --key/$YUNOHOST_MCP_CLIENT_KEY, which put the key in argv/environment where other processes on the same machine can read it.--generate-key PATH writes a fresh private key to PATH (0600; refuses to overwrite an existing file), prints its npub, and exits without connecting anywhere β the way to get a --key-file in the first place. Use a distinct PATH per client; see "Give each client its own key file" below.--delegation-file (or $YUNOHOST_MCP_CLIENT_DELEGATION_FILE) presents a delegation event (PLAN.md Phase 11) alongside your own signature, for a disposable agent identity an owner granted a subset of their access to.tools/list, tools/call, resources/list, and resources/read are forwarded verbatim; authorization, policy, and audit still happen on the remote server.Each connector starts its local MCP endpoint independently of the remote YunoHost handshake. If one configured YunoHost instance is offline, that connector stays alive, reports no discovered tools until the instance returns, and retries on later requests; other configured MCP servers can still start and remain usable.
The server includes bounded, read-only diagnostics for intermittent outages:
Log paths, output limits, command timeouts, and whether private HTTP targets are permitted are configurable with YUNOHOST_MCP_* settings. All of these tools are read-only and enforce bounded output.
Both point at yunohost-mcp-connect, not at the server directly β the bridge is what signs each request with your Nostr key. Use the full path to yunohost-mcp-connect in whatever environment you installed yunohost-mcp into (e.g. ~/.local/pipx/venvs/yunohost-mcp/bin/yunohost-mcp-connect, or a venv's bin/ directory β which yunohost-mcp-connect after activating it will tell you).
Give each client its own key file. YUNOHOST_MCP_CLIENT_KEY_FILE is the identity β whichever key signs a request determines its role and scopes on the server, nothing else. Point two different clients (or two different config files for the same client β a project-local .codex/config.toml shadows ~/.codex/config.toml) at the same key file and the second one silently authenticates as the first, with its exact permissions - no error, nothing to notice. Generate a fresh key per client rather than copying one that already works:
Each prints the new key's npub - grant it whatever role is appropriate for that specific client (see "Granting a disposable agent identity access" below, or identity.toml directly), not the role you already gave a different one. --generate-key refuses to overwrite a file that already exists.
Claude Desktop (claude_desktop_config.json β Settings β Developer β Edit Config):
Codex CLI (~/.codex/config.toml):
Run yunohost-mcp-connect --key-file <path> once per new key to see its npub (yunohost-mcp-connect: signing as npub1...), then grant that npub whatever role is actually appropriate for that client in identity.toml - not the role you already gave a different one.
For a delegated (disposable) identity instead of your own key, add YUNOHOST_MCP_CLIENT_DELEGATION_FILE pointing at the file yunohost-mcp-delegate produced (see below). Restart the client after editing its config β both read this file once, at startup.
An identity.toml entry grants access to one specific pubkey, permanently (until edited). A delegation (PLAN.md Phase 11) is the other way to grant access: an owner signs a short-lived, scoped grant to an agent's own disposable key, without ever adding that key to identity.toml or handing over any private key. yunohost-mcp-delegate is what an owner runs to create one:
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/yunohost-mcp)<a href="https://allmcps.com/mcp/yunohost-mcp"><img src="https://allmcps.com/api/badge/yunohost-mcp?style=directory" alt="YunoHost MCP on AllMCPs" /></a>