Publish an MCP Server to the Official Registry
The exact files we use to publish our remote MCP server: one server.json, one GitHub Action, and a tag. After that, directories like Glama pick it up on their own.
The official MCP Registry is the catalog many MCP directories and clients read from. Publishing there once gets a server listed in several places without submitting it to each one. This is the setup we use for Shortform Kit; the run below published version 1.0.1 on 16 October 2026.
1. Test the endpoint first
Make sure the server answers initialize and tools/list over HTTPS before you publish it. Our MCP Server Tester does exactly that and shows whether each parameter has a description, which directories use for their quality scores.
2. Write server.json
Put it in the root of a public GitHub repository. For a remote server this is all it needs:
{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "io.github.YOUR-GITHUB-NAME/your-server",
"title": "Your Server",
"description": "One line, at most 100 characters, that says what the tools do",
"version": "1.0.0",
"websiteUrl": "https://example.com/docs/",
"icons": [
{ "src": "https://example.com/icon-512.png", "mimeType": "image/png", "sizes": ["512x512"] },
{ "src": "https://example.com/icon.svg", "mimeType": "image/svg+xml", "sizes": ["any"] }
],
"repository": { "url": "https://github.com/YOUR-GITHUB-NAME/your-server", "source": "github" },
"remotes": [ { "type": "streamable-http", "url": "https://example.com/mcp" } ]
}
- name: with GitHub login the namespace is
io.github.plus your GitHub user or organisation. A reverse-DNS name likecom.example/serverneeds proof that you own the domain; see the registry's publishing guide. - description: the schema allows at most 100 characters (maxLength 100). Directories show it as the one-line summary.
- version: use semantic versions and bump it for every change you publish; version ranges like ^1.2.3 are rejected.
- icons: allowed types are PNG, JPEG, SVG and WebP. Without an icon, directories show a placeholder.
- remotes:
streamable-httpfor current servers,ssefor the older transport. Addheadersonly if clients must send a key.
3. Publish from GitHub Actions
Save this as .github/workflows/publish.yml. The id-token: write permission lets mcp-publisher log in with GitHub OIDC, so there is no token to store:
name: Publish to MCP Registry
on:
push:
tags: ["v*"]
workflow_dispatch:
jobs:
publish:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v5
- name: Install mcp-publisher
run: |
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
- name: Authenticate to MCP Registry
run: ./mcp-publisher login github-oidc
- name: Publish server to MCP Registry
run: ./mcp-publisher publish
Then tag a release: git tag v1.0.1 && git push origin v1.0.1. The run takes under a minute and ends with ✓ Successfully published and the server name and version.
4. Check the listing
curl -s "https://registry.modelcontextprotocol.io/v0/servers?search=io.github.YOUR-GITHUB-NAME/your-server&version=latest"
The answer lists the latest version with your remotes and icons. Glama picked our server up from the registry without a separate submission and grades every tool; directories such as PulseMCP also read from the registry.
5. Make the listing worth clicking
- Describe every tool parameter in its JSON schema. Directories grade this, and assistants call undocumented parameters wrong.
- Say in each tool description when to use it and which sibling tool to use instead.
- Add a live status badge to your README from the MCP Server Tester, and submit the server to curated lists such as the remote MCP server lists on GitHub.
Looking for servers to learn from? Our list of free remote MCP servers is built from the same registry.
How it works
- Write server.json Name, description, version, icons and the remote URL, in a public GitHub repo.
- Add the GitHub Action mcp-publisher logs in with GitHub OIDC and publishes.
- Tag a release Every new version tag publishes; check the listing with the registry API.
FAQ
How do I publish an MCP server to the official registry?
Add a server.json to a public GitHub repo, run mcp-publisher login github-oidc and mcp-publisher publish in a GitHub Action with id-token: write, and push a version tag. The exact files are on this page.
What is the description limit in server.json?
100 characters. The registry schema sets maxLength 100 for description; it is the one-line summary directories show.
Do I need a new version for every change?
Bump version in server.json before each publish, for example from 1.0.0 to 1.0.1, so clients and directories see the update as the latest version.
How do I add an icon to my MCP server listing?
Add an icons array to server.json with src, mimeType (PNG, JPEG, SVG or WebP) and sizes, then publish a new version.