- Go 92.9%
- PLpgSQL 3.1%
- HTML 1.9%
- Shell 1.6%
- Makefile 0.5%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
[//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps [github.com/golang/glog](https://github.com/golang/glog) from 0.0.0-20160126235308-23def4e6c14b to 1.2.4. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/golang/glog/releases">github.com/golang/glog's releases</a>.</em></p> <blockquote> <h2>v1.2.4</h2> <h2>What's Changed</h2> <ul> <li>Fail if log file already exists by <a href="https://github.com/chressie"><code>@chressie</code></a> in <a href="https://redirect.github.com/golang/glog/pull/74">golang/glog#74</a>: <ul> <li>glog: Don't try to create/rotate a given syncBuffer twice in the same second</li> <li>glog: introduce createInDir function as in internal version</li> <li>glog: have createInDir fail if the file already exists</li> </ul> </li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/golang/glog/compare/v1.2.3...v1.2.4">https://github.com/golang/glog/compare/v1.2.3...v1.2.4</a></p> <h2>v1.2.3</h2> <h2>What's Changed</h2> <ul> <li>glog: check that stderr is valid before using it by default by <a href="https://github.com/chressie"><code>@chressie</code></a> in <a href="https://redirect.github.com/golang/glog/pull/72">golang/glog#72</a></li> <li>glog: fix typo by <a href="https://github.com/chressie"><code>@chressie</code></a> in <a href="https://redirect.github.com/golang/glog/pull/73">golang/glog#73</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/golang/glog/compare/v1.2.2...v1.2.3">https://github.com/golang/glog/compare/v1.2.2...v1.2.3</a></p> <h2>v1.2.2</h2> <h2>What's Changed</h2> <ul> <li>glog: avoid calling user.Current() on windows by <a href="https://github.com/bentekkie"><code>@bentekkie</code></a> in <a href="https://redirect.github.com/golang/glog/pull/69">golang/glog#69</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/golang/glog/compare/v1.2.1...v1.2.2">https://github.com/golang/glog/compare/v1.2.1...v1.2.2</a></p> <h2>v1.2.1</h2> <h2>What's Changed</h2> <ul> <li>glog: don't hold mutex when sync'ing by <a href="https://github.com/chressie"><code>@chressie</code></a> in <a href="https://redirect.github.com/golang/glog/pull/68">golang/glog#68</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/golang/glog/compare/v1.2.0...v1.2.1">https://github.com/golang/glog/compare/v1.2.0...v1.2.1</a></p> <h2>v1.2.0</h2> <h2>What's Changed</h2> <ul> <li>glog: add context variants and logsink tests by <a href="https://github.com/chressie"><code>@chressie</code></a> in <a href="https://redirect.github.com/golang/glog/pull/66">golang/glog#66</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/golang/glog/compare/v1.1.2...v1.2.0">https://github.com/golang/glog/compare/v1.1.2...v1.2.0</a></p> <h2>v1.1.2</h2> <p>Bugfix release.</p> <h2>What's Changed</h2> <ul> <li>glog: populate symlinks -log_link directory by <a href="https://github.com/chressie"><code>@chressie</code></a> in <a href="https://redirect.github.com/golang/glog/pull/64">golang/glog#64</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/golang/glog/compare/v1.1.1...v1.1.2">https://github.com/golang/glog/compare/v1.1.1...v1.1.2</a></p> <h2>v1.1.1</h2> <p>Bugfixes since the larger v1.1.0, which have been addressed.</p> <h2>v1.1.0</h2> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/golang/glog/commits/v1.2.4">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/modelcontextprotocol/registry/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: adam jones <adamj+git@anthropic.com> |
||
| .githooks | ||
| .github/workflows | ||
| .vscode | ||
| cmd/registry | ||
| data | ||
| deploy | ||
| docs | ||
| internal | ||
| scripts | ||
| tests/integration | ||
| tools | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| .golangci.yml | ||
| CLAUDE.md | ||
| docker-compose.yml | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| Makefile | ||
| README.md | ||
MCP Registry
A community driven registry service for Model Context Protocol (MCP) servers.
Development Status
This project is being built in the open and is currently in the early stages of development. Please see the overview discussion for the project scope and goals.
Contributing
Use Discussions to propose and discuss product and/or technical requirements.
Use Issues to track well-scoped technical work that the community agrees should be done at some point.
Open Pull Requests when you want to contribute work towards an Issue, or you feel confident that your contribution is desireable and small enough to forego community discussion at the requirements and planning levels.
Overview
The MCP Registry service provides a centralized repository for MCP server entries. It allows discovery and management of various MCP implementations with their associated metadata, configurations, and capabilities.
Features
- RESTful API for managing MCP registry entries (list, get, create, update, delete)
- Health check endpoint for service monitoring
- Support for various environment configurations
- Graceful shutdown handling
- MongoDB and in-memory database support
- Comprehensive API documentation
- Pagination support for listing registry entries
- Seed data export/import composability with HTTP support
- Registry instance data sharing via HTTP endpoints
Getting Started
Prerequisites
- Go 1.24.x (required - check with
go version) - MongoDB
- Docker (optional, but recommended for development)
For development:
- golangci-lint v2.3.1 - Install with:
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.3.1
Running
The easiest way to get the registry running is uses docker compose. This will setup the MCP Registry service, import the seed data and run MongoDB in a local Docker environment.
# Run the registry and MongoDB with docker compose
make dev-compose
This will start the MCP Registry service and MongoDB with Docker, running at localhost:8080.
Building
If you prefer to run the service locally without Docker, you can build and run it directly:
# Build a registry executable
make build
This will create the registry binary in the current directory. You'll need to have MongoDB running locally or with Docker.
To run the service locally:
# Run registry locally (requires MongoDB)
make dev-local
By default, the service will run on localhost:8080.
To build the CLI tool for publishing MCP servers to the registry:
# Build the publisher tool
make publisher
Development
Available Make Targets
To see all available make targets:
make help
Key development commands:
# Development
make dev-compose # Start development environment with Docker Compose
make dev-local # Run registry locally (requires MongoDB)
# Build targets
make build # Build the registry application
make publisher # Build the publisher tool
# Testing
make test-unit # Run unit tests with coverage report
make test-integration # Run integration tests
make test-endpoints # Test API endpoints (requires running server)
make test-publish # Test publish endpoint (requires BEARER_TOKEN)
make test-all # Run all tests
# Code quality
make lint # Run linter (same as CI)
make lint-fix # Run linter with auto-fix
# Validation
make validate-schemas # Validate JSON schemas
make validate-examples # Validate examples against schemas
make validate # Run all validation checks
# Combined workflows
make check # Run all checks (lint, validate, unit tests)
# Utilities
make clean # Clean build artifacts and coverage files
Linting
The project uses golangci-lint with extensive checks. Always run linting before pushing:
# Run all linters (same as CI)
make lint
# Run linter with auto-fix
make lint-fix
Git Hooks (Optional)
To automatically run linting before commits:
git config core.hooksPath .githooks
This will prevent commits that fail linting or have formatting issues.
Project Structure
├── api/ # OpenApi specification
├── cmd/ # Application entry points
├── config/ # Configuration files
├── internal/ # Private application code
│ ├── api/ # HTTP server and request handlers (routing)
│ ├── auth/ # GitHub OAuth integration
│ ├── config/ # Configuration management
│ ├── database/ # Data persistence abstraction (MongoDB and in-memory)
│ ├── model/ # Data models and domain structures
│ └── service/ # Business logic implementation
├── pkg/ # Public libraries
├── scripts/ # Utility scripts
└── tools/ # Command line tools
└── publisher/ # Tool to publish MCP servers to the registry
Architecture Overview
Request Flow
- HTTP requests enter through router (
internal/api/router/) - Handlers in
internal/api/handlers/v0/validate and process requests - Service layer executes business logic
- Database interface handles persistence
- JSON responses returned to clients
Key Interfaces
- Database Interface (
internal/database/database.go) - Abstracts data persistence with MongoDB and memory implementations - RegistryService (
internal/service/service.go) - Business logic abstraction over database - Auth Service (
internal/auth/auth.go) - GitHub OAuth token validation
Authentication Flow
Publishing requires GitHub OAuth validation:
- Extract bearer token from Authorization header
- Validate token with GitHub API
- Verify repository ownership matches token owner
- Check organization membership if applicable
Design Patterns
- Factory Pattern for service creation with dependency injection
- Repository Pattern for database abstraction
- Context Pattern for timeout management (5-second DB operations)
- Cursor-based Pagination using UUIDs for stateless pagination
API Endpoints
API Documentation
GET /v0/swagger/index.html
The API is documented using Swagger/OpenAPI. This page provides a complete reference of all endpoints with request/response schemas and examples, and allows you to test the API directly from your browser.
Configuration
The service can be configured using environment variables:
| Variable | Description | Default |
|---|---|---|
MCP_REGISTRY_APP_VERSION |
Application version | dev |
MCP_REGISTRY_DATABASE_TYPE |
Database type | mongodb |
MCP_REGISTRY_COLLECTION_NAME |
MongoDB collection name | servers_v2 |
MCP_REGISTRY_DATABASE_NAME |
MongoDB database name | mcp-registry |
MCP_REGISTRY_DATABASE_URL |
MongoDB connection string | mongodb://localhost:27017 |
MCP_REGISTRY_GITHUB_CLIENT_ID |
GitHub App Client ID | |
MCP_REGISTRY_GITHUB_CLIENT_SECRET |
GitHub App Client Secret | |
MCP_REGISTRY_LOG_LEVEL |
Log level | info |
MCP_REGISTRY_SEED_FROM |
Path or URL to import seed data (supports local files and HTTP URLs) | data/seed.json |
MCP_REGISTRY_SERVER_ADDRESS |
Listen address for the server | :8080 |
Pre-built Docker Images
Pre-built Docker images are automatically published to GitHub Container Registry on each release and main branch commit:
# Run latest from main branch
docker run -p 8080:8080 ghcr.io/modelcontextprotocol/registry:latest
# Run specific commit build
docker run -p 8080:8080 ghcr.io/modelcontextprotocol/registry:main-20250806-a1b2c3d
Available image tags:
latest- Latest commit from main branchmain-<date>-<sha>- Specific commit builds
Configuration: The Docker images support all environment variables listed in the Configuration section. For production deployments, you'll need to configure the database connection and other settings via environment variables.
Import Seed Data
Registry instances can import data from:
Local files:
MCP_REGISTRY_SEED_FROM=data/seed.json ./registry
HTTP endpoints:
MCP_REGISTRY_SEED_FROM=http://other-registry:8080 ./registry
Testing
Run the test script to validate API endpoints:
./scripts/test_endpoints.sh
You can specify specific endpoints to test:
./scripts/test_endpoints.sh --endpoint health
./scripts/test_endpoints.sh --endpoint servers
License
See the LICENSE file for details.