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

URL: https://shortformkit.com/publish-mcp-server-registry/
Updated: 2026-10-14

The [official MCP Registry](https://registry.modelcontextprotocol.io) 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](https://shortformkit.com/mcp-server/); 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](https://shortformkit.com/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 like com.example/server needs 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-http for current servers, sse for the older transport. Add headers only 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](https://shortformkit.com/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](https://shortformkit.com/free-remote-mcp-servers/) is built from the same registry.

## How it works

1. **Write server.json** Name, description, version, icons and the remote URL, in a public GitHub repo.
2. **Add the GitHub Action** mcp-publisher logs in with GitHub OIDC and publishes.
3. **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.


Source: Shortform Kit (https://shortformkit.com/publish-mcp-server-registry/). Free, no login.