Guide · MCP Registry Distribution

Getting your MCP server listed on Smithery

Smithery (smithery.ai) is one of the most widely used MCP server registries. When a developer searches for an MCP server that does X, Smithery is often where they start. A good Smithery listing drives organic installs, GitHub stars, and waitlist signups — but it requires more than just submitting a URL. Smithery verifies that your server responds to the MCP protocol before it publishes your listing, and it re-checks on a recurring schedule. A server that is down when Smithery's crawler visits gets either marked as unhealthy or removed from featured results. This page explains what you need to do to get listed, what Smithery checks, and how to keep your listing in good standing.

TL;DR

Add a smithery.yaml manifest to your repository root, push your server to a public endpoint, submit the GitHub repository URL to Smithery. Smithery's crawler will send a real MCP initialize request to your endpoint and verify the response. Make sure your health check passes before submitting. Keep your server available — Smithery re-crawls periodically and a server that fails multiple consecutive probes loses its verified badge. AliveMCP monitors your endpoint between Smithery's crawls so you know about outages before they affect your listing's health score.

The smithery.yaml manifest

The smithery.yaml file lives in your repository root and tells Smithery's indexer how to find your server, what it does, and how to run it. It is the single most important file for a successful listing.

# smithery.yaml — place in repository root
startCommand:
  type: stdio
  configSchema:
    type: object
    properties:
      apiKey:
        type: string
        description: "Your API key for the data service"
      region:
        type: string
        enum: ["us-east-1", "eu-west-1", "ap-southeast-1"]
        description: "Target region for data queries"
        default: "us-east-1"
    required:
      - apiKey

# For HTTP/SSE servers, use the url type instead:
# startCommand:
#   type: url
#   url: https://your-mcp-server.example.com/mcp

The startCommand field tells Smithery how to invoke your server. For stdio servers (the most common type for locally-installed MCPs), you provide a type: stdio entry and describe the configuration schema — Smithery uses this to generate an interactive configuration UI when users click "Install". For remote HTTP/SSE servers, use type: url with the public endpoint URL.

The configSchema is a JSON Schema object describing the environment variables or arguments your server accepts. Smithery renders this as a form when a user installs the server through its UI. Well-written schemas — with description fields, enum constraints where applicable, and sensible default values — result in better listings and fewer confused users. Missing required fields with no defaults cause installation failures that show up as user complaints and rating drops.

Package.json metadata Smithery reads

Smithery's indexer reads your repository's package.json (for Node.js servers) alongside smithery.yaml. Several fields influence your listing's display and discoverability:

{
  "name": "@yourorg/mcp-your-server",
  "version": "1.2.0",
  "description": "MCP server for querying your analytics platform — surfaces metrics, funnels, and cohort data directly in Claude.",
  "keywords": [
    "mcp",
    "mcp-server",
    "analytics",
    "metrics",
    "model-context-protocol"
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/yourorg/mcp-your-server"
  },
  "license": "MIT",
  "bin": {
    "mcp-your-server": "./dist/index.js"
  }
}

The description field becomes the short description on your Smithery listing page. Write it from the user's perspective: what can they do with this MCP server? The keywords array feeds Smithery's search index — include mcp and mcp-server as base keywords plus the domain terms users would search for. The bin entry tells Smithery how to invoke your server for stdio mode installations.

For Python servers, Smithery reads pyproject.toml instead. The equivalent fields are project.description, project.keywords, and project.scripts.

What Smithery's crawler verifies

When you submit your server (or when Smithery re-crawls), its crawler performs a real MCP protocol handshake — not just an HTTP ping:

CheckWhat Smithery verifiesCommon failure reason
TCP reachabilityPort 443 (or your configured port) accepts connectionsFirewall rule, wrong port, server stopped
TLS handshakeValid certificate, chain complete, not expiredSelf-signed cert, expired Let's Encrypt
HTTP responseServer responds to POST or SSE endpointMisconfigured reverse proxy, wrong path
initialize requestServer responds with valid protocolVersionServer handles GET but not MCP initialize
tools/list requestServer returns a non-empty tools arrayServer initialized but tools are not registered
Tool schema validityEach tool has name, description, and valid inputSchemaMissing description, malformed JSON Schema

The most common submission failure is a server that responds to a browser GET request (returning an HTML page or a "Server is running" message) but does not handle the actual MCP JSON-RPC requests. Run the verification sequence manually before submitting:

# Quick manual verification — what Smithery's crawler does
curl -X POST https://your-server.example.com/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2024-11-05",
      "capabilities": {},
      "clientInfo": { "name": "smithery-crawler", "version": "1.0.0" }
    }
  }'

# Expect: {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","capabilities":{...},"serverInfo":{...}}}

# Then verify tools/list
curl -X POST https://your-server.example.com/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/list",
    "params": {}
  }'

# Expect: {"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"...","description":"...","inputSchema":{...}}]}}

If both commands return valid JSON-RPC responses with the correct structure, your server will pass Smithery's crawler. If either fails, fix the issue before submitting — failed crawls do not immediately surface a useful error message to you as the submitter.

Keeping your listing healthy after publication

Smithery re-crawls published listings on a recurring schedule. A server that passes one crawl and then goes down risks getting its verified badge removed or its listing demoted in search results. The crawl schedule is not publicly documented but observed behavior suggests weekly re-crawls with more frequent checks for servers that show a history of instability.

Three things protect your Smithery listing health:

  1. External protocol monitoring: HTTP uptime monitors (Pingdom, UptimeRobot) only verify that your server returns HTTP 200 — they do not verify that the MCP initialize handshake succeeds. You can have HTTP 200 and a broken MCP server simultaneously (common when a misconfigured reverse proxy returns 200 for unknown paths). AliveMCP probes the full MCP protocol sequence every 60 seconds and alerts you when the initialize or tools/list response breaks — before Smithery's next crawl discovers the regression.
  2. Tool schema stability: Smithery stores a hash of your tools array and flags schema changes as "tool surface drift". Frequent, unannounced changes to tool names or input schemas signal instability to potential users. Version your changes and update your smithery.yaml accordingly.
  3. Process supervision: If your server runs on a VPS, use PM2 or systemd to restart it automatically on crash. A 60-second restart window is invisible to users but a 10-minute outage is long enough to be caught by Smithery's re-crawl.

Related questions

How long does Smithery review take after I submit?

Smithery's crawler runs automatically — there is no human review queue for most servers. After submitting your repository URL, the crawler attempts to verify your server within minutes to a few hours. If verification succeeds, your listing appears in search results immediately. If it fails, you may not receive an explicit failure notification — check whether your listing appears after 24 hours and re-verify your endpoint manually if it doesn't.

Does Smithery list stdio servers differently from HTTP servers?

Yes. Stdio servers are listed as installable MCP packages — users install them via the Smithery UI or CLI and the server runs locally on their machine. HTTP/SSE servers are listed as remote endpoints that clients connect to over the network. The distinction matters for your smithery.yaml (use type: stdio vs type: url) and for monitoring: stdio servers do not have a public URL to monitor, so AliveMCP and other external monitors only apply to HTTP/SSE remote servers.

What should my tool descriptions look like for a good Smithery listing?

Smithery surfaces tool descriptions in search results and on your listing page. Write descriptions that explain what the tool does from the caller's perspective, not from an implementation perspective. "Queries the analytics database for event counts" is less useful than "Returns the count of a named event (page_view, purchase, etc.) for a date range, filtered by optional user properties." Include the key nouns (what you're querying) and the key parameters (what the caller needs to provide). Descriptions longer than 150 characters get truncated in Smithery's search result cards.

Can I have multiple MCP servers in one GitHub repository?

Smithery supports monorepos where multiple MCP servers live in subdirectories. Point Smithery at the specific subdirectory that contains each server's smithery.yaml during submission. Each subdirectory is treated as a separate listing. Keep each server's smithery.yaml in its own directory root, not at the monorepo top level, unless one server represents the entire repository.

Further reading