## Motivation and Context Docs currently don't have very clear organisation, and don't explain core flows. This fixes #89 (although we still might want to push these to `https://modelcontextprotocol.io/docs/`), based on the plan there. One minor change from that plan is that I merged tutorials and guides, because they ended up basically being duplicates which I thought would be annoying for us to keep in sync. Additionally in the Diátaxis framework, tutorials and guides are separated by whether they are focused on acquisition of skills (e.g. in a learning environment) or application of skills (e.g. in a work environment). I expect the registry to be something that will be used occasionally in a work environment, rather than a fundamental 'learnable' skill so I think it's reasonable not to have tutorials and fold these into guides. ## How Has This Been Tested? - Read through all these updated docs - Unit and integration tests (that previously used examples.md and use the schema) working - Ran `npx markdown-link-check .` to check all the links work ## Breaking Changes Links to old docs will break, but I don't think there are any. All internal links have been checked and updated. ## Types of changes <!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply: --> - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [x] Documentation update
202 lines
No EOL
5.4 KiB
Markdown
202 lines
No EOL
5.4 KiB
Markdown
# MCP Registry Technical Architecture
|
|
|
|
This document describes the technical architecture of the MCP Registry, including system components, deployment strategies, and data flows.
|
|
|
|
## System Overview
|
|
|
|
The MCP Registry is designed as a lightweight metadata service that bridges MCP server creators with consumers (MCP clients and aggregators).
|
|
|
|
## Core Components
|
|
|
|
### REST API (Go)
|
|
|
|
The main application server implemented in Go, providing:
|
|
- Public read endpoints for server discovery
|
|
- Authenticated write endpoints for server publication
|
|
- GitHub OAuth integration (extensible to other providers)
|
|
- DNS verification system (optional for custom namespaces)
|
|
|
|
### Database (PostgreSQL)
|
|
|
|
Primary data store for:
|
|
- Versioned server metadata (server.json contents)
|
|
- User authentication state
|
|
- DNS verification records
|
|
|
|
### CDN Layer
|
|
|
|
Critical for scalability:
|
|
- Caches all public read endpoints
|
|
- Reduces load on origin servers
|
|
- Enables global distribution
|
|
- Designed for daily consumer polling patterns
|
|
|
|
### CLI Tool
|
|
|
|
Developer interface for:
|
|
- Server publication workflow
|
|
- GitHub OAuth flow
|
|
- DNS verification
|
|
|
|
## Deployment Architecture
|
|
|
|
### Kubernetes Deployment (Helm)
|
|
|
|
The registry is designed to run on Kubernetes using Helm charts:
|
|
|
|
```mermaid
|
|
graph TB
|
|
subgraph "Kubernetes Cluster"
|
|
subgraph "Namespace: mcp-registry"
|
|
subgraph "Registry Service"
|
|
LB[Load Balancer<br/>:80]
|
|
RS[Registry Service<br/>:8080]
|
|
RP1[Registry Pod 1]
|
|
RP2[Registry Pod 2]
|
|
RP3[Registry Pod N]
|
|
end
|
|
|
|
subgraph "Database Service"
|
|
DBS[DB Service<br/>:27017]
|
|
SS[StatefulSet]
|
|
PV[Persistent Volume]
|
|
end
|
|
|
|
subgraph "Secrets"
|
|
GHS[GitHub OAuth Secret]
|
|
end
|
|
end
|
|
end
|
|
|
|
LB --> RS
|
|
RS --> RP1
|
|
RS --> RP2
|
|
RS --> RP3
|
|
RP1 --> DBS
|
|
RP2 --> DBS
|
|
RP3 --> DBS
|
|
DBS --> SS
|
|
SS --> PV
|
|
RP1 -.-> GHS
|
|
RP2 -.-> GHS
|
|
RP3 -.-> GHS
|
|
```
|
|
|
|
## Data Flow Patterns
|
|
|
|
### 1. Server Publication Flow
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant Dev as Developer
|
|
participant CLI as CLI Tool
|
|
participant API as Registry API
|
|
participant DB as Database
|
|
participant GH as GitHub
|
|
participant DNS as DNS Provider
|
|
|
|
Dev->>CLI: mcp publish server.json
|
|
CLI->>CLI: Validate server.json
|
|
CLI->>GH: OAuth flow
|
|
GH-->>CLI: Access token
|
|
CLI->>API: POST /servers
|
|
API->>GH: Verify token
|
|
API->>DNS: Verify domain (if applicable)
|
|
API->>DB: Store metadata
|
|
API-->>CLI: Success
|
|
CLI-->>Dev: Published!
|
|
```
|
|
|
|
### 2. Consumer Discovery Flow
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant Client as MCP Client Host App
|
|
participant INT as Intermediary<br/>(Marketplace/Aggregator)
|
|
participant CDN as CDN Cache
|
|
participant API as Registry API
|
|
participant DB as Database
|
|
|
|
Note over INT,CDN: Daily ETL Process
|
|
INT->>CDN: GET /servers
|
|
alt Cache Hit
|
|
CDN-->>INT: Cached response
|
|
else Cache Miss
|
|
CDN->>API: GET /servers
|
|
API->>DB: Query servers
|
|
DB-->>API: Server list
|
|
API-->>CDN: Response + cache headers
|
|
CDN-->>INT: Response
|
|
end
|
|
INT->>INT: Process & enhance data
|
|
INT->>INT: Store in local cache
|
|
|
|
Note over Client,INT: Real-time Client Access
|
|
Client->>INT: Request server list
|
|
INT-->>Client: Curated/enhanced data
|
|
```
|
|
|
|
### 3. DNS Verification Flow
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant User as User
|
|
participant CLI as CLI Tool
|
|
participant API as Registry API
|
|
participant DNS as DNS Provider
|
|
participant DB as Database
|
|
|
|
User->>CLI: mcp verify-domain example.com
|
|
CLI->>API: POST /verify-domain
|
|
API->>API: Generate verification token
|
|
API->>DB: Store pending verification
|
|
API-->>CLI: TXT record: mcp-verify=abc123
|
|
CLI-->>User: Add TXT record to DNS
|
|
User->>DNS: Configure TXT record
|
|
User->>CLI: Confirm added
|
|
CLI->>API: POST /verify-domain/check
|
|
API->>DNS: Query TXT records
|
|
DNS-->>API: TXT records
|
|
API->>API: Validate token
|
|
API->>DB: Store verification
|
|
API-->>CLI: Domain verified
|
|
CLI-->>User: Success!
|
|
```
|
|
|
|
### 4. Admin OIDC Authentication Flow
|
|
|
|
For registry administration, users with @modelcontextprotocol.io Google Cloud Identity accounts can authenticate using OIDC:
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant Admin as Admin User
|
|
participant CLI as Admin CLI
|
|
participant GCP as Google Cloud Identity
|
|
participant API as Registry API
|
|
|
|
Admin->>CLI: Request admin token
|
|
CLI->>GCP: gcloud auth print-identity-token --audiences=mcp-registry
|
|
GCP-->>CLI: ID Token (with hd: "modelcontextprotocol.io")
|
|
CLI->>API: POST /v0/auth/oidc {"oidc_token": "eyJ..."}
|
|
API->>GCP: Verify token signature (JWKS)
|
|
API->>API: Validate claims (issuer, audience, hd)
|
|
API->>API: Grant admin permissions (edit: *, publish: *)
|
|
API-->>CLI: Registry JWT Token
|
|
CLI->>API: POST /admin/* (with Registry JWT)
|
|
API->>API: Validate JWT + permissions
|
|
API-->>CLI: Admin operation success
|
|
```
|
|
|
|
**Usage:**
|
|
```bash
|
|
# Get Google Cloud Identity token
|
|
ID_TOKEN=$(gcloud auth print-identity-token)
|
|
|
|
# Exchange for Registry JWT token
|
|
REGISTRY_TOKEN=$(curl -X POST /v0/auth/oidc \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"oidc_token": "'$ID_TOKEN'"}' | jq -r .registry_token)
|
|
|
|
# Use for admin operations
|
|
curl -H "Authorization: Bearer $REGISTRY_TOKEN" /v0/...
|
|
``` |