Skip to content

Commit 69fdd64

Browse files
kgprsclaude
andcommitted
Add remote server contribution guide and wizard
This commit adds comprehensive support for contributing remote MCP servers to the registry. ## Key Changes ### New `task remote-wizard` Command - Interactive wizard for creating remote server entries - Auto-generates server.yaml, tools.json (empty), and readme.md - Supports both OAuth and non-OAuth configurations - OAuth settings auto-generated from server name: - Provider: server name - Secret: {server-name}.personal_access_token - Env: {SERVER_NAME}_PERSONAL_ACCESS_TOKEN - Supports streamable-http and sse transport types ### Updated CONTRIBUTING.md - Clarified distinction between local and remote servers - Added dedicated section for remote server contributions - Included examples for both OAuth (linear) and non-OAuth (cloudflare-docs) servers - Step-by-step guide using the new wizard - Comparison table showing key differences ### Example Remote Server - Added pulumi-remote server created with task remote-wizard - Demonstrates the wizard output structure - Shows OAuth configuration with auto-generated fields 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 286c1cb commit 69fdd64

6 files changed

Lines changed: 492 additions & 1 deletion

File tree

CONTRIBUTING.md

Lines changed: 169 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,28 @@
33
Thank you for your interest in contributing to the official Docker MCP Registry.
44
This document outlines how to contribute to this project.
55

6+
## 📦 Types of MCP Servers
7+
8+
There are two types of MCP servers you can add to the registry:
9+
10+
### 🏠 Local Servers (Containerized)
11+
Local servers run in Docker containers on your machine. They:
12+
- Require a Dockerfile in the source repository
13+
- Are built and hosted as Docker images
14+
- Run locally with full container isolation
15+
- Can benefit from Docker-built images with enhanced security features (signatures, provenance, SBOMs, automatic updates)
16+
17+
**This guide primarily covers local servers.** If you're adding a local server, follow the instructions starting from "Step-by-Step Guide" below.
18+
19+
### 🌐 Remote Servers (Hosted)
20+
Remote servers are hosted externally and accessed via HTTP(S). They:
21+
- Don't require a Dockerfile (already deployed somewhere)
22+
- Use `streamable-http` or `sse` transport protocols
23+
- Often require OAuth authentication
24+
- Have dynamic tool discovery
25+
26+
**If you're adding a remote server,** skip to the [Adding a Remote MCP Server](#adding-a-remote-mcp-server) section below.
27+
628
## Prerequisites
729

830
- Go v1.24+
@@ -20,7 +42,7 @@ This document outlines how to contribute to this project.
2042
- Every pull request requires a review from the Docker team before merging.
2143
- Once approved, all of your commits will be squashed into a single commit with your PR title.
2244

23-
## 📋 Step-by-Step Guide
45+
## 📋 Step-by-Step Guide for Local Servers
2446

2547
### 1️⃣ Fork this repository
2648

@@ -180,6 +202,152 @@ Upon approval your entry will be processed and it will be available in 24 hours
180202
- [Docker Desktop's MCP Toolkit](https://www.docker.com/products/docker-desktop/)
181203
- [Docker Hub `mcp` namespace](https://hub.docker.com/u/mcp) (for MCP servers built by Docker)
182204

205+
---
206+
207+
## 🌐 Adding a Remote MCP Server
208+
209+
Remote MCP servers are already hosted externally and don't require Docker image building. They communicate via HTTP(S) protocols.
210+
211+
### Prerequisites for Remote Servers
212+
213+
- A publicly accessible MCP server endpoint (e.g., `https://mcp.example.com/mcp`)
214+
- Knowledge of the transport protocol (`streamable-http` or `sse`)
215+
- A documentation URL for your server
216+
- OAuth configuration details (if authentication is required)
217+
218+
### Step-by-Step Guide for Remote Servers
219+
220+
#### 1️⃣ Fork this repository
221+
222+
Fork the repository to your own GitHub account and clone it locally.
223+
224+
#### 2️⃣ Create your remote server entry using `task remote-wizard`
225+
226+
The easiest way to create a remote server configuration is using the wizard:
227+
228+
```bash
229+
task remote-wizard
230+
```
231+
232+
The wizard will guide you through:
233+
1. **Basic Information**: Server name and category
234+
2. **Server Details**: Title, description, icon URL, and documentation URL
235+
3. **Remote Configuration**: Transport type (streamable-http or sse) and server URL
236+
4. **OAuth Configuration**: Simple yes/no question
237+
238+
If OAuth is enabled, the wizard automatically generates:
239+
- **Provider**: Uses your server name (e.g., `linear`)
240+
- **Secret**: `{server-name}.personal_access_token` (e.g., `linear.personal_access_token`)
241+
- **Environment Variable**: `{SERVER_NAME}_PERSONAL_ACCESS_TOKEN` (e.g., `LINEAR_PERSONAL_ACCESS_TOKEN`)
242+
243+
This will create a directory under `servers/` with three files:
244+
- `server.yaml` - Server configuration
245+
- `tools.json` - Empty array (for dynamic tool discovery)
246+
- `readme.md` - Documentation link
247+
248+
#### 3️⃣ Review the generated files
249+
250+
The wizard has created all necessary files for you. The `tools.json` file is always an empty array `[]` for remote servers because they use dynamic tool discovery. The `readme.md` file contains your documentation link.
251+
252+
#### 4️⃣ Example remote server structure
253+
254+
Your remote server directory should look like this:
255+
256+
```
257+
servers/my-remote-server/
258+
├── server.yaml # Server configuration
259+
├── tools.json # Always [] for remote servers
260+
└── readme.md # Documentation link (required)
261+
```
262+
263+
Example `server.yaml` for a remote server **with OAuth** (like `servers/linear`):
264+
265+
```yaml
266+
name: linear
267+
type: remote
268+
dynamic:
269+
tools: true
270+
meta:
271+
category: productivity
272+
tags:
273+
- productivity
274+
- project-management
275+
- remote
276+
about:
277+
title: Linear
278+
description: Track issues and plan sprints
279+
icon: https://www.google.com/s2/favicons?domain=linear.app&sz=64
280+
remote:
281+
transport_type: streamable-http
282+
url: https://mcp.linear.app/mcp
283+
oauth:
284+
- provider: linear
285+
secret: linear.personal_access_token
286+
env: LINEAR_PERSONAL_ACCESS_TOKEN
287+
```
288+
289+
Example `server.yaml` for a remote server **without OAuth** (like `servers/cloudflare-docs`):
290+
291+
```yaml
292+
name: cloudflare-docs
293+
type: remote
294+
meta:
295+
category: documentation
296+
tags:
297+
- documentation
298+
- cloudflare
299+
- remote
300+
about:
301+
title: Cloudflare Docs
302+
description: Access the latest documentation on Cloudflare products
303+
icon: https://www.cloudflare.com/favicon.ico
304+
remote:
305+
transport_type: sse
306+
url: https://docs.mcp.cloudflare.com/sse
307+
```
308+
309+
**Note:** Remote servers without OAuth don't need the `oauth` field or `dynamic.tools` field in their configuration.
310+
311+
#### 5️⃣ Test your remote server locally
312+
313+
You can test your remote server configuration by importing it into Docker Desktop:
314+
315+
```bash
316+
task catalog -- my-remote-server
317+
docker mcp catalog import $PWD/catalogs/my-remote-server/catalog.yaml
318+
```
319+
320+
Now you can configure and test your remote server in the MCP Toolkit on Docker Desktop.
321+
322+
When done testing, reset the catalog:
323+
324+
```bash
325+
docker mcp catalog reset
326+
```
327+
328+
#### 6️⃣ Open a pull request
329+
330+
Create a pull request with your remote server files. Make sure to:
331+
- Include all required files (`server.yaml`, `tools.json`, and `readme.md`)
332+
- Verify that your server URL is publicly accessible
333+
- Test OAuth configuration if applicable
334+
- Ensure the documentation URL in `readme.md` is valid
335+
336+
### Key Differences: Local vs Remote Servers
337+
338+
| Feature | Local Server | Remote Server |
339+
|---------|-------------|---------------|
340+
| **Type** | `type: server` | `type: remote` |
341+
| **Requires Dockerfile** | ✅ Yes | ❌ No |
342+
| **Image Building** | ✅ Required | ❌ Not needed |
343+
| **Source Repository** | Required with `source.project` and `source.commit` | Not required |
344+
| **Remote Configuration** | ❌ Not applicable | ✅ Required: `remote.transport_type` and `remote.url` |
345+
| **Authentication** | Config secrets | OAuth (typically) |
346+
| **Tool Discovery** | Static (from container) | Dynamic (`dynamic.tools: true`) |
347+
| **Hosting** | Docker container locally | External HTTP(S) endpoint |
348+
349+
---
350+
183351
## 📜 Code of Conduct
184352

185353
This project follows a Code of Conduct. Please review it in

Taskfile.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ tasks:
1717
desc: Run the wizard
1818
cmd: go run ./cmd/wizard {{.CLI_ARGS}}
1919

20+
remote-wizard:
21+
desc: Run the remote server wizard
22+
cmd: go run ./cmd/remote-wizard {{.CLI_ARGS}}
23+
2024
validate:
2125
desc: Validate a server
2226
cmd: go run ./cmd/validate {{.CLI_ARGS}}

0 commit comments

Comments
 (0)