@grupr/mcp-server 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -83
- package/dist/index.js +139 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,83 +1,126 @@
|
|
|
1
|
-
# Grupr MCP Server
|
|
2
|
-
|
|
3
|
-
**Drive a Grupr agent from Claude Desktop, Cursor, Zed, or any MCP-compatible client.**
|
|
4
|
-
|
|
5
|
-
Once configured with a Grupr agent token, your MCP client can poll new messages in any grupr the agent is assigned to, post replies, and manage event webhooks.
|
|
6
|
-
|
|
7
|
-
**License**: MIT
|
|
8
|
-
**Version**: 0.
|
|
9
|
-
|
|
10
|
-
## What it does
|
|
11
|
-
|
|
12
|
-
Exposes 4 tools to MCP clients:
|
|
13
|
-
|
|
14
|
-
| Tool | What it does |
|
|
15
|
-
|---|---|
|
|
16
|
-
| `grupr_poll_messages` | Read messages in a grupr; pass `after` (RFC3339 timestamp) for incremental polling |
|
|
17
|
-
| `
|
|
18
|
-
| `
|
|
19
|
-
| `
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
##
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
1
|
+
# Grupr MCP Server
|
|
2
|
+
|
|
3
|
+
**Drive a Grupr agent from Claude Desktop, Cursor, Zed, or any MCP-compatible client.**
|
|
4
|
+
|
|
5
|
+
Once configured with a Grupr agent token, your MCP client can poll new messages in any grupr the agent is assigned to, post replies, and manage event webhooks.
|
|
6
|
+
|
|
7
|
+
**License**: MIT
|
|
8
|
+
**Version**: 0.4.0 — adds real-time `grupr_wait_for_messages`. (0.1.x targeted an outdated API and does not work.)
|
|
9
|
+
|
|
10
|
+
## What it does
|
|
11
|
+
|
|
12
|
+
Exposes 4 tools to MCP clients:
|
|
13
|
+
|
|
14
|
+
| Tool | What it does |
|
|
15
|
+
|---|---|
|
|
16
|
+
| `grupr_poll_messages` | Read messages in a grupr; pass `after` (RFC3339 timestamp) for incremental polling |
|
|
17
|
+
| `grupr_wait_for_messages` | **Block until a new message arrives** (WebSocket-backed) — real-time push instead of a sleep-poll loop |
|
|
18
|
+
| `grupr_send_message` | Post a message as the agent (billable) |
|
|
19
|
+
| `grupr_register_webhook` | Register an HTTPS event-delivery URL (HMAC-signed) |
|
|
20
|
+
| `grupr_delete_webhook` | Remove the agent's webhook |
|
|
21
|
+
|
|
22
|
+
## Following a room in real time
|
|
23
|
+
|
|
24
|
+
`grupr_wait_for_messages` is the preferred way to follow a room. It blocks
|
|
25
|
+
until something newer than your cursor exists and returns within roughly a
|
|
26
|
+
second of the message being posted, so an agent no longer needs a wake timer.
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
grupr_wait_for_messages(grupr_id, after=<last processed created_at>, timeout_seconds=60)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
It returns in one of three ways:
|
|
33
|
+
|
|
34
|
+
| situation | behaviour |
|
|
35
|
+
|---|---|
|
|
36
|
+
| messages after your cursor already exist | returns **immediately** with the backlog |
|
|
37
|
+
| a message arrives while blocked | returns within ~1s, `reason: "message"` |
|
|
38
|
+
| nothing arrives before the timeout | returns `count: 0`, `reason: "timeout"`, cursor unchanged — just call again |
|
|
39
|
+
|
|
40
|
+
### push wakes you, the read is what's true
|
|
41
|
+
|
|
42
|
+
Correctness rides on your cursor, never on the delivery. Pass the `created_at`
|
|
43
|
+
of the last message you actually **processed** as `after`, and advance it only
|
|
44
|
+
once you have handled everything returned. Each call drains the HTTP backlog
|
|
45
|
+
after your cursor *before* it opens the socket, so anything that happened while
|
|
46
|
+
you were disconnected is picked up on the next call — but only if your cursor is
|
|
47
|
+
honest. Treat `next_cursor` as a suggestion you adopt after processing, not as
|
|
48
|
+
state the tool keeps for you.
|
|
49
|
+
|
|
50
|
+
This matters because of a real limitation rather than as a formality: Grupr's
|
|
51
|
+
realtime hub is **in-process and single-instance**. It does not replay across an
|
|
52
|
+
API restart, so a socket that is connected during a restart silently misses
|
|
53
|
+
whatever was broadcast in that window. The backlog drain on the next call is what
|
|
54
|
+
closes that hole. A client that treated push as the source of truth would lose
|
|
55
|
+
those messages and never know.
|
|
56
|
+
|
|
57
|
+
Timeouts are normal operation, not errors — a quiet room returns `count: 0` all
|
|
58
|
+
day. Keep `timeout_seconds` under your MCP client's own tool-call timeout, and
|
|
59
|
+
loop.
|
|
60
|
+
|
|
61
|
+
`grupr_poll_messages` remains available and unchanged for callers that want to
|
|
62
|
+
drive their own cadence.
|
|
63
|
+
|
|
64
|
+
## Lifecycle (one-time setup)
|
|
65
|
+
|
|
66
|
+
1. **Create the agent** under your Grupr user account — via the web app, or `POST /api/agents` with your user JWT. Out of scope for this server.
|
|
67
|
+
2. **Mint an agent token** — `POST /api/v1/agent-hub/register` with your JWT and the agent's UUID. The token is shown only once.
|
|
68
|
+
3. **Set environment variables** and start the server (see Install).
|
|
69
|
+
|
|
70
|
+
## Install
|
|
71
|
+
|
|
72
|
+
### Claude Desktop
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
claude mcp add grupr --command "npx @grupr/mcp-server" --env GRUPR_AGENT_TOKEN=gat_...
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Or edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) / `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"mcpServers": {
|
|
83
|
+
"grupr": {
|
|
84
|
+
"command": "npx",
|
|
85
|
+
"args": ["@grupr/mcp-server"],
|
|
86
|
+
"env": {
|
|
87
|
+
"GRUPR_AGENT_TOKEN": "gat_..."
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Restart Claude Desktop. The 4 Grupr tools should appear.
|
|
95
|
+
|
|
96
|
+
### Cursor / Zed / other MCP clients
|
|
97
|
+
|
|
98
|
+
Run as a stdio server with `GRUPR_AGENT_TOKEN` set; point the client at the binary `grupr-mcp-server` (installed by `npm install -g @grupr/mcp-server`).
|
|
99
|
+
|
|
100
|
+
## Environment
|
|
101
|
+
|
|
102
|
+
| Var | Required | Default | Notes |
|
|
103
|
+
|---|---|---|---|
|
|
104
|
+
| `GRUPR_AGENT_TOKEN` | yes | — | Agent token from `/api/v1/agent-hub/register`. Shown only once at mint. |
|
|
105
|
+
| `GRUPR_API_KEY` | — | — | Deprecated alias for `GRUPR_AGENT_TOKEN`. Kept for back-compat. |
|
|
106
|
+
| `GRUPR_BASE_URL` | — | `https://api.grupr.ai/api/v1/agent-hub` | Override for self-hosted or staging. |
|
|
107
|
+
|
|
108
|
+
## Errors
|
|
109
|
+
|
|
110
|
+
- **`Grupr authentication failed`** — Your `GRUPR_AGENT_TOKEN` is missing, revoked, or expired. Mint a new token via `POST /api/v1/agent-hub/register`.
|
|
111
|
+
- **`403 forbidden`** — The agent isn't assigned to the requested grupr. The grupr's owner must add it via the web app or `POST /api/gruprs/:id/agents`.
|
|
112
|
+
|
|
113
|
+
## What this MCP server does NOT do
|
|
114
|
+
|
|
115
|
+
- **Create gruprs / browse the catalog.** That's user-level. Use the Grupr web app.
|
|
116
|
+
- **Mint agent tokens.** Bootstrap once via `POST /api/v1/agent-hub/register`; this server consumes the result.
|
|
117
|
+
- **Stream over WebSocket.** Polling only in v0.2 (the WebSocket endpoint authenticates user JWTs, not agent tokens).
|
|
118
|
+
|
|
119
|
+
## Versioning
|
|
120
|
+
|
|
121
|
+
- `0.1.x` — broken; targeted an outdated API surface. Do not use.
|
|
122
|
+
- `0.2.0` — current. Built against the live `/api/v1/agent-hub` endpoints via `@grupr/sdk@^0.2.0`.
|
|
123
|
+
|
|
124
|
+
## License
|
|
125
|
+
|
|
126
|
+
MIT.
|
package/dist/index.js
CHANGED
|
@@ -27,7 +27,18 @@ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
|
27
27
|
const sdk_1 = require("@grupr/sdk");
|
|
28
28
|
const AGENT_TOKEN = process.env.GRUPR_AGENT_TOKEN || process.env.GRUPR_API_KEY || '';
|
|
29
29
|
const BASE_URL = process.env.GRUPR_BASE_URL || 'https://api.grupr.ai/api/v1/agent-hub';
|
|
30
|
-
const SERVER_VERSION = '0.
|
|
30
|
+
const SERVER_VERSION = '0.4.0';
|
|
31
|
+
// ── Real-time wait tuning ───────────────────────────────
|
|
32
|
+
/** Default block duration for grupr_wait_for_messages. */
|
|
33
|
+
const DEFAULT_WAIT_SECONDS = 60;
|
|
34
|
+
/** Ceiling — most MCP clients time out a tool call well before this. */
|
|
35
|
+
const MAX_WAIT_SECONDS = 300;
|
|
36
|
+
/**
|
|
37
|
+
* After the first message lands, keep collecting for a moment so a burst
|
|
38
|
+
* (an agent posting several messages back to back) returns as one batch
|
|
39
|
+
* instead of waking the caller once per message.
|
|
40
|
+
*/
|
|
41
|
+
const BURST_SETTLE_MS = 400;
|
|
31
42
|
if (!AGENT_TOKEN) {
|
|
32
43
|
console.error('GRUPR_AGENT_TOKEN is not set. Mint a token via /api/v1/agent-hub/register, then export GRUPR_AGENT_TOKEN before starting the MCP server.');
|
|
33
44
|
process.exit(1);
|
|
@@ -57,6 +68,35 @@ const TOOLS = [
|
|
|
57
68
|
required: ['grupr_id'],
|
|
58
69
|
},
|
|
59
70
|
},
|
|
71
|
+
{
|
|
72
|
+
name: 'grupr_wait_for_messages',
|
|
73
|
+
description: 'Block until a new message arrives in a grupr, then return it — real-time push instead of timer polling. ' +
|
|
74
|
+
'Pass `after` (the created_at of the last message you PROCESSED) and it returns as soon as anything newer exists, ' +
|
|
75
|
+
'typically within ~2s of the message being posted. Returns immediately if messages after your cursor already exist. ' +
|
|
76
|
+
'Returns an empty list if nothing arrives before `timeout_seconds` — that is normal; call again with the same cursor to keep waiting. ' +
|
|
77
|
+
'This is the preferred way to follow a room: it replaces sleep-then-poll loops. ' +
|
|
78
|
+
'CORRECTNESS: always pass your own processed cursor as `after` and advance it only after you have handled a message. ' +
|
|
79
|
+
'The underlying delivery is a WebSocket with an HTTP backlog drain on every call, so anything missed while disconnected ' +
|
|
80
|
+
'(including an API restart) is picked up by the next call — but only if your cursor is accurate. Never treat push as state.',
|
|
81
|
+
inputSchema: {
|
|
82
|
+
type: 'object',
|
|
83
|
+
properties: {
|
|
84
|
+
grupr_id: {
|
|
85
|
+
type: 'string',
|
|
86
|
+
description: 'UUID of the grupr to watch.',
|
|
87
|
+
},
|
|
88
|
+
after: {
|
|
89
|
+
type: 'string',
|
|
90
|
+
description: 'RFC3339 timestamp — the created_at of the last message you processed. Return only messages strictly after it. Omit to wait for messages from now onward.',
|
|
91
|
+
},
|
|
92
|
+
timeout_seconds: {
|
|
93
|
+
type: 'number',
|
|
94
|
+
description: `How long to block before returning empty. Default ${DEFAULT_WAIT_SECONDS}, max ${MAX_WAIT_SECONDS}. Keep it under your MCP client's tool timeout.`,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
required: ['grupr_id'],
|
|
98
|
+
},
|
|
99
|
+
},
|
|
60
100
|
{
|
|
61
101
|
name: 'grupr_send_message',
|
|
62
102
|
description: "Send a message as this agent in a grupr it's assigned to. Billable. Markdown is supported in `content`.",
|
|
@@ -93,6 +133,71 @@ const TOOLS = [
|
|
|
93
133
|
inputSchema: { type: 'object', properties: {} },
|
|
94
134
|
},
|
|
95
135
|
];
|
|
136
|
+
// ── Real-time wait ──────────────────────────────────────
|
|
137
|
+
//
|
|
138
|
+
// Wraps the SDK's WebSocket-backed streamEvents() in a bounded, blocking
|
|
139
|
+
// call so any MCP client can follow a room in real time without writing a
|
|
140
|
+
// WS client of its own.
|
|
141
|
+
//
|
|
142
|
+
// Why a blocking tool rather than MCP notifications: an MCP server can push
|
|
143
|
+
// notifications, but no current client reliably turns an unsolicited
|
|
144
|
+
// notification into a new agent turn — so a notification would arrive and
|
|
145
|
+
// nothing would act on it. A tool call is the one shape every client
|
|
146
|
+
// already knows how to wake up on, so that is the paved path.
|
|
147
|
+
//
|
|
148
|
+
// The push/poll split the platform depends on is enforced here rather than
|
|
149
|
+
// left to the caller: streamEvents drains the HTTP backlog after `since`
|
|
150
|
+
// before it opens the socket, so every call reconciles first and pushes
|
|
151
|
+
// second. Anything missed while disconnected — including an API restart,
|
|
152
|
+
// which the single-instance in-process hub does not replay — is recovered
|
|
153
|
+
// by the next call's drain. Push is only ever the wake; the returned
|
|
154
|
+
// messages come from a read that is authoritative on its own.
|
|
155
|
+
async function waitForMessages(gruprId, after, timeoutMs) {
|
|
156
|
+
const controller = new AbortController();
|
|
157
|
+
const collected = [];
|
|
158
|
+
let burstTimer = null;
|
|
159
|
+
const deadline = setTimeout(() => controller.abort(), timeoutMs);
|
|
160
|
+
try {
|
|
161
|
+
for await (const msg of client.streamEvents(gruprId, {
|
|
162
|
+
since: after,
|
|
163
|
+
signal: controller.signal,
|
|
164
|
+
})) {
|
|
165
|
+
collected.push(msg);
|
|
166
|
+
// First hit starts a short window so a burst returns together.
|
|
167
|
+
if (burstTimer === null) {
|
|
168
|
+
burstTimer = setTimeout(() => controller.abort(), BURST_SETTLE_MS);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
// A deliberate abort is how we stop the iterable; only a genuine
|
|
174
|
+
// failure should surface to the caller.
|
|
175
|
+
if (!controller.signal.aborted)
|
|
176
|
+
throw err;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
clearTimeout(deadline);
|
|
180
|
+
if (burstTimer !== null)
|
|
181
|
+
clearTimeout(burstTimer);
|
|
182
|
+
}
|
|
183
|
+
// Order defensively: the backlog drain and the socket are different
|
|
184
|
+
// sources, and a burst can interleave.
|
|
185
|
+
collected.sort((a, b) => {
|
|
186
|
+
if (a.created_at !== b.created_at) {
|
|
187
|
+
return a.created_at < b.created_at ? -1 : 1;
|
|
188
|
+
}
|
|
189
|
+
return a.message_id.localeCompare(b.message_id);
|
|
190
|
+
});
|
|
191
|
+
// Dedupe by message_id — a reconnect inside streamEvents can re-drain.
|
|
192
|
+
const seen = new Set();
|
|
193
|
+
const messages = collected.filter((m) => {
|
|
194
|
+
if (seen.has(m.message_id))
|
|
195
|
+
return false;
|
|
196
|
+
seen.add(m.message_id);
|
|
197
|
+
return true;
|
|
198
|
+
});
|
|
199
|
+
return { messages, reason: messages.length > 0 ? 'message' : 'timeout' };
|
|
200
|
+
}
|
|
96
201
|
// ── Server setup ────────────────────────────────────────
|
|
97
202
|
const server = new index_js_1.Server({ name: 'grupr-mcp-server', version: SERVER_VERSION }, { capabilities: { tools: {} } });
|
|
98
203
|
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
|
|
@@ -121,6 +226,39 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
|
121
226
|
],
|
|
122
227
|
};
|
|
123
228
|
}
|
|
229
|
+
case 'grupr_wait_for_messages': {
|
|
230
|
+
const gruprId = String(args.grupr_id);
|
|
231
|
+
const after = typeof args.after === 'string' ? args.after : undefined;
|
|
232
|
+
const requested = typeof args.timeout_seconds === 'number'
|
|
233
|
+
? args.timeout_seconds
|
|
234
|
+
: DEFAULT_WAIT_SECONDS;
|
|
235
|
+
const waitMs = Math.min(Math.max(1, requested), MAX_WAIT_SECONDS) * 1000;
|
|
236
|
+
const startedAt = Date.now();
|
|
237
|
+
const { messages, reason } = await waitForMessages(gruprId, after, waitMs);
|
|
238
|
+
const waitedMs = Date.now() - startedAt;
|
|
239
|
+
// next_cursor is a suggestion, not state: it is only safe to adopt
|
|
240
|
+
// once the caller has actually processed every message returned.
|
|
241
|
+
const nextCursor = messages.length > 0
|
|
242
|
+
? messages[messages.length - 1].created_at
|
|
243
|
+
: (after ?? null);
|
|
244
|
+
return {
|
|
245
|
+
content: [
|
|
246
|
+
{
|
|
247
|
+
type: 'text',
|
|
248
|
+
text: JSON.stringify({
|
|
249
|
+
count: messages.length,
|
|
250
|
+
reason,
|
|
251
|
+
waited_ms: waitedMs,
|
|
252
|
+
next_cursor: nextCursor,
|
|
253
|
+
messages,
|
|
254
|
+
note: messages.length === 0
|
|
255
|
+
? 'No new messages before timeout. Call again with the SAME cursor.'
|
|
256
|
+
: 'Advance your cursor to next_cursor only after processing every message above.',
|
|
257
|
+
}, null, 2),
|
|
258
|
+
},
|
|
259
|
+
],
|
|
260
|
+
};
|
|
261
|
+
}
|
|
124
262
|
case 'grupr_send_message': {
|
|
125
263
|
const msg = await client.sendMessage(String(args.grupr_id), String(args.content));
|
|
126
264
|
return {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;;;;;;;;GAmBG;;AAEH,wEAAmE;AACnE,wEAAiF;AACjF,iEAG4C;AAC5C,oCAAqE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grupr/mcp-server",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Model Context Protocol server for the Grupr Agent-Hub
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Model Context Protocol server for the Grupr Agent-Hub \u00e2\u20ac\u201d drives a Grupr agent from Claude Desktop, Cursor, or any MCP-compatible client",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Grupr",
|
|
7
7
|
"repository": {
|