Claude-skill-registry-data mcp-registry
Official MCP Registry for discovering and publishing Model Context Protocol servers - the app store for MCP servers
git clone https://github.com/majiayu000/claude-skill-registry-data
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry-data "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/mcp-registry" ~/.claude/skills/majiayu000-claude-skill-registry-data-mcp-registry && rm -rf "$T"
data/mcp-registry/SKILL.mdMCP Registry
The MCP Registry provides MCP clients with a list of MCP servers, functioning like an app store for MCP servers. It enables discoverability and integration of Model Context Protocol servers across the ecosystem.
Key Features
- Server Discovery - Find and integrate MCP servers
- Multi-Platform Publishing - npm, PyPI, NuGet, Docker, MCPB support
- Authentication Options - GitHub OAuth, OIDC, DNS, HTTP verification
- Remote Servers - Streamable HTTP and SSE transport
- Version Management - Semantic versioning with immutable publications
- GitHub Actions - Automated CI/CD publishing workflows
- Namespace Validation - Verified ownership of server identities
API Status
The Registry API is at v0.1 (API Freeze) - no breaking changes while validating real-world implementations. General availability planned after feedback period.
Live API Documentation: https://registry.modelcontextprotocol.io/docs
Quick Start
1. Install Publisher CLI
# macOS (Homebrew) brew install modelcontextprotocol/tap/mcp-publisher # Or download pre-built binaries from GitHub releases # https://github.com/modelcontextprotocol/registry/releases
2. Initialize Server Configuration
# Generate server.json template mcp-publisher init # Validate without publishing mcp-publisher validate
3. Authenticate
# GitHub OAuth (interactive) mcp-publisher login github # GitHub Actions OIDC (automated) mcp-publisher login github-oidc # DNS verification mcp-publisher login dns --domain example.com --private-key-file key.pem # HTTP verification mcp-publisher login http --domain example.com --private-key-file key.pem
4. Publish
mcp-publisher publish
Publisher CLI Commands
| Command | Description |
|---|---|
| Create server.json template (auto-detects project metadata) |
| Authenticate with the registry |
| Clear saved authentication |
| Publish server.json to the registry |
| Validate server.json without publishing |
| Display version, commit hash, and build timestamp |
Server Configuration (server.json)
Basic Structure
{ "$schema": "https://registry.modelcontextprotocol.io/schemas/server.json", "name": "io.github.username/server-name", "title": "My MCP Server", "description": "A useful MCP server for...", "version": "1.0.0", "repository": "https://github.com/username/server-name", "website": "https://example.com", "icon": "https://example.com/icon.png", "packages": [...], "remotes": [...] }
Name Format Requirements
| Auth Method | Name Pattern | Example |
|---|---|---|
| GitHub | | |
| GitHub Org | | |
| Domain | | |
Constraints:
- Pattern:
^[a-zA-Z0-9.-]+/[a-zA-Z0-9._-]+$ - Length: 3-200 characters
- Must contain exactly one forward slash
Description Limits
- Length: 1-100 characters
- Keep concise and descriptive
Package Types
npm Packages
{ "packages": [{ "registryType": "npm", "name": "@username/my-server", "version": "1.0.0", "runtime": "node", "runtimeArgs": ["--experimental-fetch"] }] }
Verification: Add
mcpName to package.json matching server name.
{ "name": "@username/my-server", "mcpName": "io.github.username/my-server" }
PyPI Packages
{ "packages": [{ "registryType": "pypi", "name": "my-mcp-server", "version": "1.0.0", "runtime": "python" }] }
Verification: Add to README (can be hidden in comment):
mcp-name: io.github.username/my-server
NuGet Packages
{ "packages": [{ "registryType": "nuget", "name": "MyMcpServer", "version": "1.0.0", "runtime": "dotnet" }] }
Verification: Same as PyPI -
mcp-name in README.
Docker/OCI Images
{ "packages": [{ "registryType": "oci", "identifier": "ghcr.io/username/my-server:1.0.0" }] }
Supported Registries:
- Docker Hub
- GitHub Container Registry (ghcr.io)
- Google Artifact Registry
- Azure Container Registry
- Microsoft Container Registry
Verification: Add Dockerfile label:
LABEL io.modelcontextprotocol.server.name="io.github.username/my-server"
MCPB Packages (Binary Releases)
{ "packages": [{ "registryType": "mcpb", "identifier": "https://github.com/username/server/releases/download/v1.0.0/server-mcp-linux-amd64", "fileSha256": "abc123..." }] }
Requirements:
- URL must contain the string "mcp"
- SHA256 checksum required for integrity
Remote Servers
Streamable HTTP (Recommended)
{ "remotes": [{ "type": "streamable-http", "url": "https://api.example.com/mcp" }] }
Server-Sent Events (SSE)
{ "remotes": [{ "type": "sse", "url": "https://api.example.com/mcp/sse" }] }
URL Template Variables
Support dynamic configuration for multi-tenant deployments:
{ "remotes": [{ "type": "streamable-http", "url": "https://api.example.com/{tenant_id}/mcp", "variables": { "tenant_id": { "description": "Your organization's tenant identifier", "isRequired": true } } }] }
Variable Properties:
- Explains the variable's purposedescription
- Marks mandatory fieldsisRequired
- Provides fallback valuesdefault
- Offers predefined optionschoices
- Indicates sensitive dataisSecret
HTTP Headers
Configure authentication headers for clients:
{ "remotes": [{ "type": "streamable-http", "url": "https://api.example.com/mcp", "headers": [{ "name": "Authorization", "description": "Bearer token for API access", "isRequired": true, "isSecret": true }] }] }
Hybrid Deployment
Combine remote and local packages in same server.json:
{ "packages": [{ "registryType": "npm", "name": "@example/server" }], "remotes": [{ "type": "streamable-http", "url": "https://api.example.com/mcp" }] }
Authentication Methods
GitHub OAuth
Interactive browser-based authentication:
mcp-publisher login github # Opens browser for GitHub authorization # Enter device code when prompted
GitHub OIDC (CI/CD)
For automated publishing from GitHub Actions:
mcp-publisher login github-oidc
Requires
id-token: write permission in workflow.
DNS Verification
Domain ownership via TXT record:
- Generate Ed25519, ECDSA P-384, or cloud KMS key pair
- Create TXT record:
_mcp-registry.example.com TXT "v=MCPv1; k=ed25519; p=${PUBLIC_KEY}" - Login:
mcp-publisher login dns --domain example.com --private-key-file key.pem
HTTP Verification
Domain ownership via well-known file:
- Generate key pair
- Host file at
:https://example.com/.well-known/mcp-registry-authv=MCPv1; k=ed25519; p=${PUBLIC_KEY} - Login:
mcp-publisher login http --domain example.com --private-key-file key.pem
Versioning
Requirements
- Version must be unique for each publication
- Once published, version and metadata are immutable
- Version range indicators are prohibited (
,^
,~
,>=
)*
Recommended Formats
| Format | Example |
|---|---|
| Semantic | |
| Prerelease | , |
| Date-based | |
| Prefixed | |
Best Practices
- Align server version with underlying package versions
- For remote APIs, match server version to API version
- Use prerelease notation (
) for metadata-only updates1.2.3-1
GitHub Actions Integration
OIDC Authentication (Recommended)
name: Publish MCP Server on: push: tags: - 'v*' jobs: publish: runs-on: ubuntu-latest permissions: id-token: write contents: read steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' registry-url: 'https://registry.npmjs.org' - name: Install dependencies run: npm ci - name: Build and test run: | npm run build npm test - name: Publish to npm run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Install mcp-publisher run: | curl -L https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher-linux-amd64 -o mcp-publisher chmod +x mcp-publisher - name: Publish to MCP Registry run: | ./mcp-publisher login github-oidc ./mcp-publisher publish
GitHub PAT Authentication
- name: Publish to MCP Registry run: | ./mcp-publisher login github --token ${{ secrets.MCP_GITHUB_TOKEN }} ./mcp-publisher publish
Required scopes:
read:org, read:user
DNS Authentication
- name: Publish to MCP Registry run: | echo "${{ secrets.MCP_PRIVATE_KEY }}" > key.pem ./mcp-publisher login dns --domain example.com --private-key-file key.pem ./mcp-publisher publish rm key.pem
Triggering Deployment
git tag v1.0.0 git push origin v1.0.0
API Reference
List Servers
GET https://registry.modelcontextprotocol.io/api/v0/servers
Get Server
GET https://registry.modelcontextprotocol.io/api/v0/servers/{name}
Search Servers
GET https://registry.modelcontextprotocol.io/api/v0/servers?q=weather
Response Structure
{ "servers": [{ "name": "io.github.username/weather-server", "title": "Weather Server", "description": "Get weather data from any location", "version": "1.0.0", "packages": [...], "remotes": [...], "meta": { "io.modelcontextprotocol.registry": { "status": "published", "publishedAt": "2025-01-15T12:00:00Z", "updatedAt": "2025-01-15T12:00:00Z", "isLatest": true } } }], "meta": { "cursor": "abc123", "count": 100 } }
Development Setup
Prerequisites
- Docker
- Go 1.24.x
- ko (container image builder)
- golangci-lint v2.4.0
Running Locally
# Clone repository git clone https://github.com/modelcontextprotocol/registry.git cd registry # Start development environment make dev-compose # Registry available at localhost:8080 # Database resets on restart # Build publisher CLI make publisher ./bin/mcp-publisher --help
Pre-built Container Images
Available at GitHub Container Registry:
- Release tags
- Continuous builds from main
- Development builds
Publishing Workflow (npm Example)
Step 1: Add Verification Metadata
// package.json { "name": "@username/my-mcp-server", "version": "1.0.0", "mcpName": "io.github.username/my-server" }
Step 2: Publish to npm
npm run build npm publish
Step 3: Create server.json
mcp-publisher init
Edit generated file:
{ "$schema": "https://registry.modelcontextprotocol.io/schemas/server.json", "name": "io.github.username/my-server", "title": "My Server", "description": "Useful MCP server", "version": "1.0.0", "repository": "https://github.com/username/my-server", "packages": [{ "registryType": "npm", "name": "@username/my-mcp-server", "version": "1.0.0", "runtime": "node" }] }
Step 4: Authenticate and Publish
mcp-publisher login github mcp-publisher publish
Step 5: Verify
curl "https://registry.modelcontextprotocol.io/api/v0/servers/io.github.username/my-server"
Troubleshooting
Authentication Errors
| Issue | Solution |
|---|---|
| Token expired | Re-run |
| Namespace mismatch | Ensure server name matches your GitHub username/org |
| OIDC permission denied | Add to workflow |
Validation Failures
| Issue | Solution |
|---|---|
| Missing mcpName | Add to package.json matching server name |
| Invalid version | Use semantic versioning without range indicators |
| Name format error | Use reverse-DNS format with single slash |
Publishing Failures
| Issue | Solution |
|---|---|
| Package not found | Ensure npm/PyPI package is published first |
| Verification failed | Check mcpName/mcp-name matches exactly |
| Already published | Increment version number |
Community & Resources
- Discord - Real-time discussion
- GitHub Discussions - Product/technical requirements
- GitHub Issues - Technical work tracking
- API Docs - https://registry.modelcontextprotocol.io/docs
Maintainers
- Adam Jones (Anthropic)
- Tadas Antanavicius (PulseMCP)
- Toby Padilla (GitHub)
- Radoslav Dimitrov (Stacklok)
Resources
- Registry: https://registry.modelcontextprotocol.io
- GitHub: https://github.com/modelcontextprotocol/registry
- MCP Specification: https://modelcontextprotocol.io
- API Documentation: https://registry.modelcontextprotocol.io/docs