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 was 2025-12-11
  • Field names changed between versions (registry_typeregistryType)

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. 😉