Refs #28. After some thinking, this tries for a 'best of both worlds' approach. Simple arguments can be present essentially as the original spec recommended. As discussed, we don't specify the args for `npx` and friends directly, so a simple package is merely... ```yaml - name: my-api-mcp # ... packages: - type: npm name: "@c4312/my-api-mcp" version: "0.0.1" arguments: # Named inputs in 'arguments' generate a `--name=<value>` - type: named name: "api-key" is_required: true is_secret: true ``` However, I think we need to be able to specify runtime args in some cases, otherwise the registry eventually mirrors all docker configs and options which is not a great situation to be in. So, I suggest a `runtime_args` in the same format. Say I wanted that for npm, I could: ```yaml - name: my-api-mcp # ... packages: - type: npm name: "@c4312/my-api-mcp" version: "0.0.1" runtime_arguments: # Arguments with a pre-specified `value` don't get prompted for input - type: positional value: "--experimental-eventsource" ``` But Docker mounts are... complex, and ultimately we may deal with cases that need multiple inputs in an argument like that. So for that I suggest the third kind of "templated" input that does basic replacements and has `properties` that follow the same general input schema: ```yaml - name: server-filesystem # ... packages: - type: docker name: "mcp/filesystem" version: "0.0.1" runtime_arguments: - type: template description: Mount paths to access. required: true repated: true template: "--mount=type=bind,src={host_path},dst={container_path}" values: host_path: description: Path to access on the local machine required: true format: filepath container_path: description: Path to mount in the container. It should be rooted in `/project` directory. required: true format: string default: "/project" arguments: - type: positional value: "/project" ``` And then client config ends up being pretty simple, for the above case for example a client could have this config: ``` { "filesystem": { "server": "@modelcontextprotocol/servers/src/filesystem@1.0.2", "package": "docker", "settings": { "mount_config": [ { "source_path": "/Users/username/Desktop", "target_path": "/project/desktop" }, { "source_path": "/path/to/other/allowed/dir", "target_path": "//projects/other/allowed/dir,ro" }, ] } } } ``` Which might generate a CLI: ``` docker run \ --mount=type=bind,src=/Users/username/Desktop,dst=/project/desktop \ --mount=type=bind,src=/path/to/other/allowed/dir,dst=/project/other/allowed/dir,ro \ mcp/filesystem:1.0.2 \ /project ``` I think this does a good job of accomplishing the goals we care about: - We get nicely defined inputs that are easy to extend, easy to process, and easy for clients to configure. - Versioning is enforced as we don't require the package to specify the identifier to npx/uvx/etc. - We _usually_ can break away from a dependency on a specific runtime. This promise is broken a bit with `runtime_arguments`, most packages should not need this and those that do are those inherently more tightly coupled to a specific runtime like Docker (e.g. they would be pretty uncommon for Node or Python.) - We don't have a suple complex template system with loops and fallbacks and conditionals, like we would if we tried to have a single template string for a command.
289 lines
6.8 KiB
Markdown
289 lines
6.8 KiB
Markdown
# Examples
|
|
|
|
## /v0/servers
|
|
|
|
### Request
|
|
|
|
```http
|
|
GET /v0/servers?limit=5000&offset=0
|
|
```
|
|
|
|
### Response
|
|
|
|
```json
|
|
{
|
|
"servers": [
|
|
{
|
|
"id": "a5e8a7f0-d4e4-4a1d-b12f-2896a23fd4f1",
|
|
"name": "@modelcontextprotocol/servers/src/filesystem",
|
|
"description": "Node.js server implementing Model Context Protocol (MCP) for filesystem operations.",
|
|
"repository": {
|
|
"url": "https://github.com/modelcontextprotocol/servers",
|
|
"source": "github",
|
|
"id": "b94b5f7e-c7c6-d760-2c78-a5e9b8a5b8c9"
|
|
},
|
|
"version_detail": {
|
|
"version": "1.0.2",
|
|
"release_date": "2023-06-15T10:30:00Z",
|
|
"is_latest": true
|
|
}
|
|
}
|
|
],
|
|
"next": "https://registry.modelcontextprotocol.io/servers?offset=50",
|
|
"total_count": 1
|
|
}
|
|
```
|
|
|
|
## /v0/servers/:id
|
|
|
|
### Request
|
|
|
|
```http
|
|
GET /v0/servers/a5e8a7f0-d4e4-4a1d-b12f-2896a23fd4f1?version=0.0.3
|
|
```
|
|
|
|
### Response
|
|
|
|
```json
|
|
{
|
|
"id": "a5e8a7f0-d4e4-4a1d-b12f-2896a23fd4f1",
|
|
"name": "@modelcontextprotocol/servers/src/filesystem",
|
|
"description": "Node.js server implementing Model Context Protocol (MCP) for filesystem operations.",
|
|
"repository": {
|
|
"url": "https://github.com/modelcontextprotocol/servers",
|
|
"source": "github",
|
|
"id": "b94b5f7e-c7c6-d760-2c78-a5e9b8a5b8c9"
|
|
},
|
|
"version_detail": {
|
|
"version": "1.0.2",
|
|
"release_date": "2023-06-15T10:30:00Z",
|
|
"is_latest": true
|
|
},
|
|
"package_canonical": "npm",
|
|
"packages": [
|
|
{
|
|
"registry_name": "npm",
|
|
"name": "@modelcontextprotocol/server-filesystem",
|
|
"version": "1.0.2",
|
|
"arguments": [
|
|
{
|
|
"type": "positional",
|
|
"description": "Path to access",
|
|
"default": "/Users/username/Desktop",
|
|
"is_required": true,
|
|
"is_repeated": true
|
|
}
|
|
],
|
|
"environment_variables": [
|
|
{
|
|
"type": "named",
|
|
"name": "LOG_LEVEL",
|
|
"description": "Logging level (debug, info, warn, error)",
|
|
"default": "info"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"registry_name": "docker",
|
|
"name": "mcp/filesystem",
|
|
"version": "1.0.2",
|
|
"runtime_arguments": [
|
|
{
|
|
"type": "template",
|
|
"description": "Mount a volume into the container",
|
|
"template": "--mount=type=bind,src={source_path},dst={target_path}",
|
|
"is_required": true,
|
|
"is_repeated": true,
|
|
"properties": {
|
|
"source_path": {
|
|
"description": "Source path on host",
|
|
"format": "filepath",
|
|
"is_required": true
|
|
},
|
|
"target_path": {
|
|
"description": "Path to mount in the container. It should be rooted in `/project` directory.",
|
|
"is_required": true,
|
|
"default": "/project",
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"arguments": [
|
|
{
|
|
"type": "positional",
|
|
"value": "/project",
|
|
}
|
|
]
|
|
"environment_variables": [
|
|
{
|
|
"type": "named",
|
|
"name": "LOG_LEVEL",
|
|
"description": "Logging level (debug, info, warn, error)",
|
|
"default": "info"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"remotes": [
|
|
{
|
|
"transport_type": "sse",
|
|
"url": "https://mcp-fs.example.com/sse"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Server Configuration Examples
|
|
|
|
#### Local Server with npx
|
|
|
|
API Response:
|
|
```json
|
|
{
|
|
"id": "brave-search-12345",
|
|
"name": "@modelcontextprotocol/server-brave-search",
|
|
"description": "MCP server for Brave Search API integration",
|
|
"repository": {
|
|
"url": "https://github.com/modelcontextprotocol/servers",
|
|
"source": "github",
|
|
"id": "abc123de-f456-7890-ghij-klmnopqrstuv"
|
|
},
|
|
"version_detail": {
|
|
"version": "1.0.2",
|
|
"release_date": "2023-06-15T10:30:00Z",
|
|
"is_latest": true
|
|
},
|
|
"package_canonical": "npm",
|
|
"packages": [
|
|
{
|
|
"registry_name": "npm",
|
|
"name": "@modelcontextprotocol/server-brave-search",
|
|
"version": "1.0.2",
|
|
"environment_variables": [
|
|
{
|
|
"type": "named",
|
|
"name": "BRAVE_API_KEY",
|
|
"description": "Brave Search API Key",
|
|
"is_required": true,
|
|
"is_secret": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
claude_desktop_config.json:
|
|
```json
|
|
{
|
|
"brave-search": {
|
|
"command": "npx",
|
|
"args": [
|
|
"-y",
|
|
"@modelcontextprotocol/server-brave-search"
|
|
],
|
|
"env": {
|
|
"BRAVE_API_KEY": "YOUR_API_KEY_HERE"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Local Server with Docker
|
|
|
|
API Response:
|
|
```json
|
|
{
|
|
"id": "filesystem-67890",
|
|
"name": "@modelcontextprotocol/servers/src/filesystem",
|
|
"description": "Node.js server implementing Model Context Protocol (MCP) for filesystem operations",
|
|
"repository": {
|
|
"url": "https://github.com/modelcontextprotocol/servers",
|
|
"source": "github",
|
|
"id": "d94b5f7e-c7c6-d760-2c78-a5e9b8a5b8c9"
|
|
},
|
|
"version_detail": {
|
|
"version": "1.0.2",
|
|
"release_date": "2023-06-15T10:30:00Z",
|
|
"is_latest": true
|
|
},
|
|
"package_canonical": "docker",
|
|
"packages": [
|
|
{
|
|
"registry_name": "docker",
|
|
"name": "mcp/filesystem",
|
|
"version": "1.0.2",
|
|
"runtime_arguments": [
|
|
{
|
|
"type": "template",
|
|
"description": "Mount a volume into the container",
|
|
"template": "--mount=type=bind,src={source_path},dst={target_path}",
|
|
"is_required": true,
|
|
"is_repeated": true,
|
|
"properties": {
|
|
"source_path": {
|
|
"description": "Source path on host",
|
|
"format": "filepath",
|
|
"is_required": true
|
|
},
|
|
"target_path": {
|
|
"description": "Path to mount in the container. It should be rooted in `/project` directory.",
|
|
"is_required": true,
|
|
"default": "/project",
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"arguments": [
|
|
{
|
|
"type": "positional",
|
|
"value": "/project",
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
claude_desktop_config.json:
|
|
```json
|
|
{
|
|
"filesystem": {
|
|
"server": "@modelcontextprotocol/servers/src/filesystem@1.0.2",
|
|
"package": "docker",
|
|
"settings": {
|
|
"mount_config": [
|
|
{ "source_path": "/Users/username/Desktop", "target_path": "/project/desktop" },
|
|
{ "source_path": "/path/to/other/allowed/dir", "target_path": "/project/other/allowed/dir,ro" },
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Remote Server
|
|
|
|
API Response:
|
|
```json
|
|
{
|
|
"id": "remote-fs-54321",
|
|
"name": "Remote Brave Search Server",
|
|
"description": "Cloud-hosted MCP Brave Search server",
|
|
"repository": {
|
|
"url": "https://github.com/example/remote-fs",
|
|
"source": "github",
|
|
"id": "xyz789ab-cdef-0123-4567-890ghijklmno"
|
|
},
|
|
"version_detail": {
|
|
"version": "1.0.2",
|
|
"release_date": "2023-06-15T10:30:00Z",
|
|
"is_latest": true
|
|
},
|
|
"remotes": [
|
|
{
|
|
"transport_type": "sse",
|
|
"url": "https://mcp-fs.example.com/sse"
|
|
}
|
|
]
|
|
}
|
|
```
|