Add MCP Server to ToolHive Registry
Each entry is a server.json file in registries/toolhive/servers/<name>/ following the
MCP ServerJSON schema
with ToolHive extensions in _meta.
Workflow
- Determine type: Docker/OCI image → Container (
packages). HTTP endpoint → Remote (remotes).
- Choose name: lowercase, numbers, hyphens only. Append
-remote for remote variants.
- Create directory:
mkdir -p registries/toolhive/servers/<name>
- Gather info if needed: fetch README/docs for tools, transport, env vars, auth.
- Create
icon.svg: service logo, simple, standard SVG format.
- Create
server.json: use templates below.
- Validate:
task catalog:validate && task catalog:build
Minimal Container Template
{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "io.github.stacklok/<server-name>",
"description": "Clear, concise one-line description",
"title": "<Human-Readable Title>",
"repository": {
"url": "https://github.com/org/repo",
"source": "github"
},
"version": "1.0.0",
"packages": [
{
"registryType": "oci",
"identifier": "ghcr.io/org/server:v1.0.0",
"transport": {
"type": "stdio"
}
}
],
"icons": [
{
"src": "https://raw.githubusercontent.com/stacklok/toolhive-registry/main/registries/toolhive/servers/<server-name>/icon.svg",
"mimeType": "image/svg+xml",
"sizes": ["any"]
}
],
"_meta": {
"io.modelcontextprotocol.registry/publisher-provided": {
"io.github.stacklok": {
"ghcr.io/org/server:v1.0.0": {
"tier": "Community",
"status": "Active",
"tags": ["category1", "category2"],
"tools": ["tool_name"],
"overview": "## Server Title\n\nA 3-5 sentence markdown description of purpose and capabilities."
}
}
}
}
}
For complete templates with env vars, permissions, provenance: see references/container-servers.md.
Minimal Remote Template
{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "io.github.stacklok/<server-name>",
"description": "Clear, concise one-line description",
"title": "<Human-Readable Title> (Remote)",
"repository": {
"url": "https://github.com/org/repo",
"source": "github"
},
"version": "1.0.0",
"remotes": [
{
"type": "streamable-http",
"url": "https://api.example.com/mcp"
}
],
"icons": [
{
"src": "https://raw.githubusercontent.com/stacklok/toolhive-registry/main/registries/toolhive/servers/<server-name>/icon.svg",
"mimeType": "image/svg+xml",
"sizes": ["any"]
}
],
"_meta": {
"io.modelcontextprotocol.registry/publisher-provided": {
"io.github.stacklok": {
"https://api.example.com/mcp": {
"tier": "Community",
"status": "Active",
"tags": ["remote", "category1"],
"tools": ["tool_name"],
"overview": "## Server Title (Remote)\n\nA 3-5 sentence markdown description of purpose and capabilities."
}
}
}
}
}
For complete templates with OAuth, custom_metadata: see references/remote-servers.md.
Critical Rules
| Rule |
Detail |
| Extension key |
_meta key MUST exactly match packages[0].identifier (containers) or remotes[0].url (remotes) |
| Icons |
Every entry needs icons array + icon.svg file in server directory |
| Overview |
Markdown string starting with ## Title\n\n followed by 3-5 sentences |
| Name format |
io.github.stacklok/<server-name> |
| Title |
Human-readable display name (e.g., "Fetch", "GitHub (Remote)", "AWS Knowledge Bases") |
| Tier |
Exactly "Official" or "Community". Default to "Community" — "Official" is reserved for servers maintained by the ToolHive team, the MCP spec authors, or the platform owner of the integrated service |
| Status |
Exactly "Active" or "Deprecated" |
| Remote tags |
Must include "remote" in tags |
| Remote transport |
"streamable-http" or "sse" only (NEVER "stdio") |
| Container transport |
"stdio" (default) or "streamable-http" with "url": "http://localhost:8080" |
| No filesystem paths |
NEVER include filesystem paths in permissions — network only |
| Image tags |
Always pin version tags (never latest) |
Auto-Populated Fields (Do NOT Include)
CI workflows automatically populate these — omit from new entries:
metadata.stars, metadata.pulls, metadata.last_updated
tool_definitions (full MCP Tool objects with inputSchema)
The tools list is also auto-updated by CI on PR, but include your best-effort list in new entries.
Information Gathering
When the user provides only a URL or incomplete details:
- Repository README: tools, env vars, auth, quick start
- Official docs: transport, OAuth flows, API specs
- Container registry: image references, versions
Extract: tool names, description, transport type, env vars, auth method, network hosts.
Validation
# Validate schema compliance
task catalog:validate
# Build full registry
task catalog:build
# Verify entry in output
jq '.data.servers[] | select(.name == "io.github.stacklok/<name>")' build/toolhive/registry-upstream.json
Reference Examples
Study existing entries for patterns:
- Container, stdio:
registries/toolhive/servers/github/server.json
- Container, streamable-http:
registries/toolhive/servers/sqlite/server.json
- Remote, Official:
registries/toolhive/servers/semgrep-remote/server.json
- Remote, OAuth:
registries/toolhive/servers/github-remote/server.json
See Also
- references/container-servers.md — Full container template, transport variants, env vars, provenance, permissions
- references/remote-servers.md — Full remote template, OAuth configuration
- references/field-reference.md — All field details, overview format, network permissions, troubleshooting
- references/examples.md — Real-world patterns from the registry (heroku, sqlite, semgrep-remote, github-remote)
1---2name: add-mcp-server3description: Add new MCP server entries to the ToolHive registry. Creates server.json and icon.svg files with correct schema, _meta extensions, and validation. Use when adding a server, creating a registry entry, onboarding an MCP server, or writing server.json. NOT for reviewing existing entries (use mcp-review).4---56# Add MCP Server to ToolHive Registry78Each entry is a `server.json` file in `registries/toolhive/servers/<name>/` following the9[MCP ServerJSON schema](https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json)10with ToolHive extensions in `_meta`.1112## Workflow13141. **Determine type**: Docker/OCI image → Container (`packages`). HTTP endpoint → Remote (`remotes`).152. **Choose name**: lowercase, numbers, hyphens only. Append `-remote` for remote variants.163. **Create directory**: `mkdir -p registries/toolhive/servers/<name>`174. **Gather info** if needed: fetch README/docs for tools, transport, env vars, auth.185. **Create `icon.svg`**: service logo, simple, standard SVG format.196. **Create `server.json`**: use templates below.207. **Validate**: `task catalog:validate && task catalog:build`2122## Minimal Container Template2324```json25{26 "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",27 "name": "io.github.stacklok/<server-name>",28 "description": "Clear, concise one-line description",29 "title": "<Human-Readable Title>",30 "repository": {31 "url": "https://github.com/org/repo",32 "source": "github"33 },34 "version": "1.0.0",35 "packages": [36 {37 "registryType": "oci",38 "identifier": "ghcr.io/org/server:v1.0.0",39 "transport": {40 "type": "stdio"41 }42 }43 ],44 "icons": [45 {46 "src": "https://raw.githubusercontent.com/stacklok/toolhive-registry/main/registries/toolhive/servers/<server-name>/icon.svg",47 "mimeType": "image/svg+xml",48 "sizes": ["any"]49 }50 ],51 "_meta": {52 "io.modelcontextprotocol.registry/publisher-provided": {53 "io.github.stacklok": {54 "ghcr.io/org/server:v1.0.0": {55 "tier": "Community",56 "status": "Active",57 "tags": ["category1", "category2"],58 "tools": ["tool_name"],59 "overview": "## Server Title\n\nA 3-5 sentence markdown description of purpose and capabilities."60 }61 }62 }63 }64}65```6667For complete templates with env vars, permissions, provenance: see [references/container-servers.md](references/container-servers.md).6869## Minimal Remote Template7071```json72{73 "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",74 "name": "io.github.stacklok/<server-name>",75 "description": "Clear, concise one-line description",76 "title": "<Human-Readable Title> (Remote)",77 "repository": {78 "url": "https://github.com/org/repo",79 "source": "github"80 },81 "version": "1.0.0",82 "remotes": [83 {84 "type": "streamable-http",85 "url": "https://api.example.com/mcp"86 }87 ],88 "icons": [89 {90 "src": "https://raw.githubusercontent.com/stacklok/toolhive-registry/main/registries/toolhive/servers/<server-name>/icon.svg",91 "mimeType": "image/svg+xml",92 "sizes": ["any"]93 }94 ],95 "_meta": {96 "io.modelcontextprotocol.registry/publisher-provided": {97 "io.github.stacklok": {98 "https://api.example.com/mcp": {99 "tier": "Community",100 "status": "Active",101 "tags": ["remote", "category1"],102 "tools": ["tool_name"],103 "overview": "## Server Title (Remote)\n\nA 3-5 sentence markdown description of purpose and capabilities."104 }105 }106 }107 }108}109```110111For complete templates with OAuth, custom_metadata: see [references/remote-servers.md](references/remote-servers.md).112113## Critical Rules114115| Rule | Detail |116|------|--------|117| **Extension key** | `_meta` key MUST exactly match `packages[0].identifier` (containers) or `remotes[0].url` (remotes) |118| **Icons** | Every entry needs `icons` array + `icon.svg` file in server directory |119| **Overview** | Markdown string starting with `## Title\n\n` followed by 3-5 sentences |120| **Name format** | `io.github.stacklok/<server-name>` |121| **Title** | Human-readable display name (e.g., `"Fetch"`, `"GitHub (Remote)"`, `"AWS Knowledge Bases"`) |122| **Tier** | Exactly `"Official"` or `"Community"`. Default to `"Community"` — `"Official"` is reserved for servers maintained by the ToolHive team, the MCP spec authors, or the platform owner of the integrated service |123| **Status** | Exactly `"Active"` or `"Deprecated"` |124| **Remote tags** | Must include `"remote"` in tags |125| **Remote transport** | `"streamable-http"` or `"sse"` only (NEVER `"stdio"`) |126| **Container transport** | `"stdio"` (default) or `"streamable-http"` with `"url": "http://localhost:8080"` |127| **No filesystem paths** | NEVER include filesystem paths in permissions — network only |128| **Image tags** | Always pin version tags (never `latest`) |129130## Auto-Populated Fields (Do NOT Include)131132CI workflows automatically populate these — omit from new entries:133134- `metadata.stars`, `metadata.pulls`, `metadata.last_updated`135- `tool_definitions` (full MCP Tool objects with inputSchema)136137The `tools` list is also auto-updated by CI on PR, but include your best-effort list in new entries.138139## Information Gathering140141When the user provides only a URL or incomplete details:1421431. **Repository README**: tools, env vars, auth, quick start1442. **Official docs**: transport, OAuth flows, API specs1453. **Container registry**: image references, versions146147Extract: tool names, description, transport type, env vars, auth method, network hosts.148149## Validation150151```bash152# Validate schema compliance153task catalog:validate154155# Build full registry156task catalog:build157158# Verify entry in output159jq '.data.servers[] | select(.name == "io.github.stacklok/<name>")' build/toolhive/registry-upstream.json160```161162## Reference Examples163164Study existing entries for patterns:165166- **Container, stdio**: `registries/toolhive/servers/github/server.json`167- **Container, streamable-http**: `registries/toolhive/servers/sqlite/server.json`168- **Remote, Official**: `registries/toolhive/servers/semgrep-remote/server.json`169- **Remote, OAuth**: `registries/toolhive/servers/github-remote/server.json`170171## See Also172173- [references/container-servers.md](references/container-servers.md) — Full container template, transport variants, env vars, provenance, permissions174- [references/remote-servers.md](references/remote-servers.md) — Full remote template, OAuth configuration175- [references/field-reference.md](references/field-reference.md) — All field details, overview format, network permissions, troubleshooting176- [references/examples.md](references/examples.md) — Real-world patterns from the registry (heroku, sqlite, semgrep-remote, github-remote)