1. Pick your namespace
Every server name starts with a namespace you must prove you own. With GitHub login the name must start with io.github.your-username/. With DNS login you can use your own domain in reverse, such as com.yourdomain/, which reads better in directories and ties the listing to your brand.
The registry checks that you control the namespace. For remote servers it does not check that you control the URL, so keep the endpoint on your own domain to make ownership obvious to users.
2. Write server.json
Run mcp-publisher init in your project to generate a template, or write it by hand. A remote-only server needs a remotes entry and can leave out packages. For an npm package, add the same name as mcpName in package.json so the registry can verify the package.
{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "com.yourdomain/your-server",
"title": "Your Server",
"description": "One line on what your MCP server does.",
"version": "1.0.0",
"remotes": [
{ "type": "streamable-http", "url": "https://mcp.yourdomain.com/mcp" }
]
}3. Install mcp-publisher
Install the publisher CLI with Homebrew, or download the release binary for your platform from the registry's GitHub releases.
brew install mcp-publisher4. Log in and publish
Log in with GitHub for an io.github namespace; it prints a device code to enter at github.com/login/device. Use DNS authentication instead to publish under your domain. Then publish from the folder that holds server.json.
mcp-publisher login github
mcp-publisher publish5. Check it's live
Search the registry API for your name. If your entry comes back, you're published, and directories that import from the registry can pick it up.
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=com.yourdomain/your-server"Common errors
Most failures are a namespace or verification mismatch.
- "You do not have permission to publish this server": your login method doesn't match the namespace. GitHub login only publishes io.github.your-username/ names.
- "Registry validation failed for package": the package is missing its ownership marker, such as mcpName in package.json for npm.
- "Invalid or expired Registry JWT token": run the login command again.
Keep going
Listed is step one. Found is what brings installs.
Get your MCP server's pages indexed by Google and Bing for free, then get backlinks on autopilot from real sites in your niche.
Create a free account