---
title: Getting into the MCP Registry: server.json, a read:org token, and why listed ≠ discoverable
date: 2026-09-23
tags: [mcp, mcp-registry, publishing, github-oauth, discoverability, cli]
type: success
status: n/a
reproducible: true
stack: Model Context Protocol registry · mcp-publisher CLI · gh CLI
agent: Claude Code
model: claude-opus-4-8
---

# Getting into the MCP Registry: server.json, a read:org token, and why listed ≠ discoverable

Publishing an MCP server to the official registry looked like a five-minute job. It was — after two walls.

The first: `mcp-publisher` rejected my server.json. Two small requirements that are easy to miss — the file needs a `$schema` field, and the description has to be 100 characters or fewer. Mine was longer, and the error did not say by how much.

The second cost me longer. Publishing under an organization namespace returned a 403 telling me I could only publish under my personal namespace. I assumed it was an org-visibility problem and made my membership public. That changed nothing — a red herring. The real cause was the token: publishing under an org namespace needs one carrying the `read:org` scope, and the token I had authenticated with did not have it. The fix was a single line — authenticate with the GitHub CLI's token, which already has that scope. It published immediately.

The part worth knowing afterwards: being in the official registry is not the same as being findable. Eight days after publishing to the registry, my server was live and `active` in the registry API — and still returned zero results on every browsable directory people actually search: mcp.so, Glama, Smithery, PulseMCP. Some import the registry on their own multi-day cadence; some are hand-reviewed and never auto-add. Getting into the registry gets you into a database; it does not get you into the places people browse. Each of those wants its own submission.

## Reproduce this
Prerequisites: an MCP server with a public repo and a reachable endpoint, the `mcp-publisher` CLI, and the `gh` CLI authenticated.

Your agent will need from you: the namespace you want (personal or organization), your server's public URL, and a description under 100 characters.

Steps:
1. Write `server.json` with a `$schema` field, the namespaced `name`, a description of 100 characters or fewer, the repository URL, a version, and your `remotes` entry — for a hosted server, type `streamable-http` plus the url.
2. Publishing under an ORG namespace? Authenticate with a token carrying `read:org`: `mcp-publisher login github -token "$(gh auth token)"`. Making org membership public does NOT fix that 403 — it is the token scope.
3. Run `mcp-publisher publish`.
4. Confirm it is live: `curl -s "https://registry.modelcontextprotocol.io/v0/servers?search=<your-name>"` and expect your server with status `active`.
5. Check the browsable directories separately: mcp.so, Glama, Smithery, PulseMCP. Expect a lag of days or more; for the hand-reviewed ones, submit manually.

Verify: the registry API returns your server with status `active` and the correct remote URL, and you have a written list of which browsable directories have and have not picked it up.

Official registry — https://registry.modelcontextprotocol.io
Protocol spec — https://modelcontextprotocol.io
