After building my MCP server, I figured it would be a shame to leave it sitting in a corner.
An unlisted MCP server is a bit like a restaurant with no sign out front. It exists, but nobody finds it. 😄
So I decided to publish it in the MCP registries. And as usual… it was “straightforward” 😅
What’s an MCP registry?
An MCP registry is a directory of MCP servers. Coding agents (Claude Desktop, Cursor, Augment…) can connect to it to discover and install servers.
There are several out there:
- mcp.so : the most accessible, web form based
- registry.modelcontextprotocol.io : the official registry, maintained by the MCP team
- GitHub MCP Registry (github.com/mcp) : automatically fed by the official registry
The idea: publish once to the official registry, and the others follow automatically.
Step 0: publish to npmjs
Before you can list your MCP server in the official registry, you need to publish your package to npm first. The registry checks that you actually own the package.
I already had a well-structured package.json, Claude had helped me put it together, so no real trouble there.
Well, almost. 😄
On my first publish, npm threw this warning:
npm warn publish npm auto-corrected some errors in your package.json when publishing.
npm warn publish errors corrected:
npm warn publish "bin[mo5-rag-mcp]" script name index.js was invalid and removed
The bin config was definitely there in my file. Probably an encoding issue. A quick:
npm pkg fix
npm publish --access public
…and it was sorted. ✅
Step 1: mcp.so — the easy one
mcp.so offers a web form. Name, GitHub URL, JSON config, description. Nothing complicated.
The one thing worth thinking about: the description should make people want to use it, not just describe what it does. I highlighted the full toolchain, the SDK, the template, the MCP server, because that’s the real value here.
Step 2: the official registry — slightly more involved
No web form here. Everything goes through a CLI: mcp-publisher.
What you need to prepare:
1. Add mcpName to package.json
"mcpName": "io.github.thlg057/mo5-mcp-server"
2. Bump the version and republish to npm
Small mistake on my end: I edited the version number by hand in package.json instead of using the proper command. It works, but it’s the kind of thing that can cause inconsistencies. The right way:
npm version patch # automatically updates package.json AND creates the git tag
npm publish --access public
3. Create a server.json file at the root of your repo
{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "io.github.thlg057/mo5-mcp-server",
"description": "MCP server for Thomson MO5 C development — 6809, CMOC, SDK, toolchain.",
"version": "1.0.2",
"repository": {
"url": "https://github.com/thlg057/mo5-mcp-server",
"source": "github"
},
"packages": [
{
"registryType": "npm",
"registryBaseUrl": "https://registry.npmjs.org",
"identifier": "@thlg057/mo5-rag-mcp",
"version": "1.0.2",
"transport": { "type": "stdio" },
"environmentVariables": [
{
"name": "RAG_BASE_URL",
"description": "URL of the MO5 RAG server",
"isRequired": true,
"isSecret": false,
"default": "https://retrocomputing-ai.cloud"
}
]
}
]
}
Pitfalls I ran into:
- The description field has a 100 character limit. I had written an essay. 😄
- The schema version changes fast, I had
2025-07-09, the correct one was2025-12-11 - Field names changed between versions (
registry_type→registryType)
Bottom line: mcp-publisher validate is your best friend. It tells you exactly what’s wrong.
4. Install the CLI, authenticate and publish
# Interactive GitHub authentication (enter the code at github.com/login/device)
mcp-publisher login github
mcp-publisher validate # always validate first!
mcp-publisher publish
5. Check that it’s live
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.thlg057"
200 response with your metadata → you’re good. ✅
What happens next
Once published to the official registry, sub-registries (GitHub MCP Registry, Smithery, PulseMCP, Glama…) automatically pick up the data. No need to submit everywhere.
In practice, that means any Claude Desktop or Cursor user can now find and install my MCP server without knowing my GitHub exists.
Not bad for a project that was originally just a personal tool. 😄
Wrap-up
All in all, listing an MCP server isn’t complicated, but you need to know the steps in the right order. And as usual with this project, the traps are in the details: a wrongly named field, a deprecated schema, a description that’s two words too long.
Nothing insurmountable, but worth documenting for the next person. 😉