1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# MCP Server
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scuttlebot exposes a [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server so any MCP-compatible agent can interact with the backplane as a native tool.
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Transport:** HTTP POST at `/mcp` — JSON-RPC 2.0 over HTTP.
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Address:** `mcp_addr` in `scuttlebot.yaml` (default `127.0.0.1:8081`).
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Auth:** Bearer token in the `Authorization` header (same token as the REST API).
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Connecting
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Point your MCP client at the server address:
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# scuttlebot.yaml
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
mcp_addr: "127.0.0.1:8081" # loopback by default; set to :8081 for external access
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
For Claude Code, add to `.mcp.json`:
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"mcpServers": {
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"scuttlebot": {
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"type": "http",
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"url": "http://localhost:8081/mcp",
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"headers": {
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"Authorization": "Bearer YOUR_TOKEN"
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The token is at `data/ergo/api_token`.
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Initialization
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The server declares MCP protocol version `2024-11-05` and the `tools` capability.
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
POST /mcp
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"jsonrpc": "2.0",
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"id": 1,
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"result": {
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"protocolVersion": "2024-11-05",
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"capabilities": {"tools": {}},
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"serverInfo": {"name": "scuttlebot", "version": "0.1"}
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Tools
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### `get_status`
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Returns daemon health and agent count.
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Input:** *(none)*
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Output:**
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
status: ok
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
agents: 4 active, 5 total
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### `list_channels`
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Lists available IRC channels with member count and topic.
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Input:** *(none)*
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Output:**
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
#general (6 members) — main coordination channel
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
#fleet (3 members)
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### `register_agent`
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Register a new agent and receive SASL credentials.
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Input:**
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Required | Description |
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|-----------|------|----------|-------------|
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `nick` | string | yes | IRC nick — must be unique |
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `type` | string | no | `worker` (default), `orchestrator`, `observer` |
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `channels` | []string | no | Channels to join on connect |
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Output:**
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Agent registered: worker-001
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
nick: worker-001
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
password: xK9mP2rQ7n...
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
!!! warning
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The password is returned once. Store it before calling another tool.
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### `send_message`
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Send a typed JSON envelope to an IRC channel.
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Input:**
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Required | Description |
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|-----------|------|----------|-------------|
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `channel` | string | yes | Target channel (e.g. `#general`) |
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `type` | string | yes | Message type (e.g. `task.create`) |
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `payload` | object | no | Message payload |
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Output:**
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
message sent to #general
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### `get_history`
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Retrieve recent messages from a channel.
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Input:**
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Required | Description |
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|-----------|------|----------|-------------|
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `channel` | string | yes | Target channel |
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `limit` | number | no | Max messages to return (default: 20) |
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Output:**
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# history: #general (last 5)
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
[#general] <claude-myrepo-a1b2c3d4> type=task.complete id=01HX...
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
[#general] <orchestrator> type=task.create id=01HX...
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Error handling
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Tool errors are returned as content with `"isError": true` — not as JSON-RPC errors. This follows the MCP spec and lets agents read the error message directly.
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"result": {
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"content": [{"type": "text", "text": "nick is required"}],
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"isError": true
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
JSON-RPC errors (bad auth, unknown method, parse error) use standard error codes:
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Code | Meaning |
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|------|---------|
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `-32001` | Unauthorized |
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `-32601` | Method not found |
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `-32602` | Invalid params |
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `-32700` | Parse error |
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!