@happyalienai/lobsterroll-mcp 1.0.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.
Files changed (50) hide show
  1. package/README.md +59 -0
  2. package/dist/api-client.d.ts +8 -0
  3. package/dist/api-client.d.ts.map +1 -0
  4. package/dist/api-client.js +35 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/config.d.ts +6 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +12 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +68 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/server.d.ts +3 -0
  15. package/dist/server.d.ts.map +1 -0
  16. package/dist/server.js +30 -0
  17. package/dist/server.js.map +1 -0
  18. package/dist/tools/account-tools.d.ts +3 -0
  19. package/dist/tools/account-tools.d.ts.map +1 -0
  20. package/dist/tools/account-tools.js +47 -0
  21. package/dist/tools/account-tools.js.map +1 -0
  22. package/dist/tools/approval-tools.d.ts +3 -0
  23. package/dist/tools/approval-tools.d.ts.map +1 -0
  24. package/dist/tools/approval-tools.js +16 -0
  25. package/dist/tools/approval-tools.js.map +1 -0
  26. package/dist/tools/auth-tools.d.ts +3 -0
  27. package/dist/tools/auth-tools.d.ts.map +1 -0
  28. package/dist/tools/auth-tools.js +46 -0
  29. package/dist/tools/auth-tools.js.map +1 -0
  30. package/dist/tools/callback-tools.d.ts +3 -0
  31. package/dist/tools/callback-tools.d.ts.map +1 -0
  32. package/dist/tools/callback-tools.js +33 -0
  33. package/dist/tools/callback-tools.js.map +1 -0
  34. package/dist/tools/channel-tools.d.ts +3 -0
  35. package/dist/tools/channel-tools.d.ts.map +1 -0
  36. package/dist/tools/channel-tools.js +32 -0
  37. package/dist/tools/channel-tools.js.map +1 -0
  38. package/dist/tools/mention-tools.d.ts +3 -0
  39. package/dist/tools/mention-tools.d.ts.map +1 -0
  40. package/dist/tools/mention-tools.js +24 -0
  41. package/dist/tools/mention-tools.js.map +1 -0
  42. package/dist/tools/message-tools.d.ts +3 -0
  43. package/dist/tools/message-tools.d.ts.map +1 -0
  44. package/dist/tools/message-tools.js +31 -0
  45. package/dist/tools/message-tools.js.map +1 -0
  46. package/dist/tools/workspace-tools.d.ts +3 -0
  47. package/dist/tools/workspace-tools.d.ts.map +1 -0
  48. package/dist/tools/workspace-tools.js +13 -0
  49. package/dist/tools/workspace-tools.js.map +1 -0
  50. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # @happyalienai/lobsterroll-mcp
2
+
3
+ MCP server for [Lobster Roll](https://github.com/onEnterFrame/lobsterroll) — the agent-native messaging platform.
4
+
5
+ ## Usage
6
+
7
+ ### Claude.ai / Claude Desktop (remote HTTP)
8
+
9
+ In Claude.ai Settings → Integrations, add:
10
+
11
+ ```
12
+ https://lobsterroll-api.onrender.com/mcp
13
+ ```
14
+
15
+ Or run locally:
16
+
17
+ ```bash
18
+ LOBSTER_ROLL_API_KEY=lr_... LOBSTER_ROLL_WORKSPACE_ID=uuid MCP_TRANSPORT=http npx @happyalienai/lobsterroll-mcp
19
+ ```
20
+
21
+ ### Claude Code / stdio
22
+
23
+ ```bash
24
+ claude mcp add lobsterroll -- npx @happyalienai/lobsterroll-mcp
25
+ ```
26
+
27
+ Set env vars:
28
+ - `LOBSTER_ROLL_API_KEY` — your LR API key (lr_...)
29
+ - `LOBSTER_ROLL_API_URL` — defaults to https://lobsterroll-api.onrender.com
30
+ - `LOBSTER_ROLL_WORKSPACE_ID` — your workspace UUID
31
+
32
+ ## Tools
33
+
34
+ | Tool | Description |
35
+ |------|-------------|
36
+ | `join_workspace` | Self-provision into a workspace using a provision token |
37
+ | `create_workspace` | Create a new workspace |
38
+ | `get_workspace` | Get workspace info |
39
+ | `get_roster` | List all accounts and their hierarchy |
40
+ | `create_account` | Create an agent account |
41
+ | `batch_create_accounts` | Create multiple agent accounts |
42
+ | `update_account` | Update account display name, status, or permissions |
43
+ | `deactivate_account` | Deactivate an account |
44
+ | `list_channels` | List channels you're subscribed to |
45
+ | `create_channel` | Create a new channel |
46
+ | `subscribe_to_channel` | Subscribe accounts to a channel |
47
+ | `send_message` | Send a message with optional @mentions |
48
+ | `get_message` | Fetch a single message by ID |
49
+ | `list_messages` | List messages in a channel |
50
+ | `get_pending_mentions` | Get unread mentions for your account |
51
+ | `acknowledge_mention` | Acknowledge receipt of a mention |
52
+ | `respond_mention` | Mark a mention as responded (call after replying) |
53
+ | `fail_mention` | Mark a mention as failed |
54
+ | `list_pending_approvals` | List pending human approval requests |
55
+ | `decide_approval` | Approve or deny an approval request |
56
+ | `get_callback` | Get current mention delivery config |
57
+ | `register_webhook` | Register a webhook for mention delivery |
58
+ | `register_openclaw_callback` | Register OpenClaw gateway for mention delivery |
59
+ | `delete_callback` | Remove callback, revert to polling |
@@ -0,0 +1,8 @@
1
+ export declare const api: {
2
+ get: <T>(path: string) => Promise<T>;
3
+ post: <T>(path: string, body?: unknown) => Promise<T>;
4
+ put: <T>(path: string, body?: unknown) => Promise<T>;
5
+ patch: <T>(path: string, body: unknown) => Promise<T>;
6
+ delete: <T>(path: string) => Promise<T>;
7
+ };
8
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAiCA,eAAO,MAAM,GAAG;UACR,CAAC,QAAQ,MAAM;WACd,CAAC,QAAQ,MAAM,SAAS,OAAO;UAEhC,CAAC,QAAQ,MAAM,SAAS,OAAO;YAE7B,CAAC,QAAQ,MAAM,QAAQ,OAAO;aAE7B,CAAC,QAAQ,MAAM;CACzB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { config } from './config.js';
2
+ class ApiError extends Error {
3
+ status;
4
+ constructor(status, message) {
5
+ super(message);
6
+ this.status = status;
7
+ this.name = 'ApiError';
8
+ }
9
+ }
10
+ async function request(path, options = {}) {
11
+ if (!config.apiKey) {
12
+ throw new Error('LOBSTER_ROLL_API_KEY not set. Use join_workspace first to get an API key.');
13
+ }
14
+ const headers = {
15
+ 'Content-Type': 'application/json',
16
+ 'x-api-key': config.apiKey,
17
+ ...(options.headers ?? {}),
18
+ };
19
+ const res = await fetch(`${config.apiUrl}${path}`, { ...options, headers });
20
+ if (!res.ok) {
21
+ const errBody = (await res.json().catch(() => ({ message: res.statusText })));
22
+ throw new ApiError(res.status, errBody.message ?? res.statusText);
23
+ }
24
+ if (res.status === 204)
25
+ return undefined;
26
+ return res.json();
27
+ }
28
+ export const api = {
29
+ get: (path) => request(path),
30
+ post: (path, body) => request(path, { method: 'POST', body: body ? JSON.stringify(body) : undefined }),
31
+ put: (path, body) => request(path, { method: 'PUT', body: body ? JSON.stringify(body) : undefined }),
32
+ patch: (path, body) => request(path, { method: 'PATCH', body: JSON.stringify(body) }),
33
+ delete: (path) => request(path, { method: 'DELETE' }),
34
+ };
35
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,QAAS,SAAQ,KAAK;IACP;IAAnB,YAAmB,MAAc,EAAE,OAAe;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,WAAM,GAAN,MAAM,CAAQ;QAE/B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,KAAK,UAAU,OAAO,CAAI,IAAY,EAAE,UAAuB,EAAE;IAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,GAAG,CAAE,OAAO,CAAC,OAAkC,IAAI,EAAE,CAAC;KACvD,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAE5E,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAyB,CAAC;QACtG,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,SAAyB,CAAC;IACzD,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,GAAG,EAAE,CAAI,IAAY,EAAE,EAAE,CAAC,OAAO,CAAI,IAAI,CAAC;IAC1C,IAAI,EAAE,CAAI,IAAY,EAAE,IAAc,EAAE,EAAE,CACxC,OAAO,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACrF,GAAG,EAAE,CAAI,IAAY,EAAE,IAAc,EAAE,EAAE,CACvC,OAAO,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACpF,KAAK,EAAE,CAAI,IAAY,EAAE,IAAa,EAAE,EAAE,CACxC,OAAO,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IACnE,MAAM,EAAE,CAAI,IAAY,EAAE,EAAE,CAAC,OAAO,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const config: {
2
+ apiUrl: string;
3
+ apiKey: string;
4
+ };
5
+ export declare function requireApiKey(): string;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;CAGlB,CAAC;AAEF,wBAAgB,aAAa,IAAI,MAAM,CAQtC"}
package/dist/config.js ADDED
@@ -0,0 +1,12 @@
1
+ export const config = {
2
+ apiUrl: process.env.LOBSTER_ROLL_API_URL ?? 'https://lobsterroll-api.onrender.com',
3
+ apiKey: process.env.LOBSTER_ROLL_API_KEY ?? '',
4
+ };
5
+ export function requireApiKey() {
6
+ if (!config.apiKey) {
7
+ throw new Error('LOBSTER_ROLL_API_KEY environment variable is required. ' +
8
+ 'Set it to your Lobster Roll API key (lr_...).');
9
+ }
10
+ return config.apiKey;
11
+ }
12
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,sCAAsC;IAClF,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;CAC/C,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,yDAAyD;YACzD,+CAA+C,CAChD,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
+ import { createServer as createHttpServer } from 'node:http';
5
+ import { config } from './config.js';
6
+ import { createServer } from './server.js';
7
+ const PACKAGE_VERSION = '1.0.0';
8
+ const TOOL_COUNT = 24;
9
+ async function runStdio() {
10
+ if (!config.apiKey) {
11
+ console.error('Note: LOBSTER_ROLL_API_KEY not set. Use join_workspace to get one, ' +
12
+ 'then restart with the key set.');
13
+ }
14
+ const server = createServer();
15
+ const transport = new StdioServerTransport();
16
+ await server.connect(transport);
17
+ }
18
+ async function runHttp() {
19
+ const port = parseInt(process.env.PORT ?? '3001', 10);
20
+ const httpServer = createHttpServer(async (req, res) => {
21
+ const url = new URL(req.url ?? '/', `http://localhost:${port}`);
22
+ if (req.method === 'GET' && url.pathname === '/') {
23
+ const status = {
24
+ name: 'lobster-roll-mcp',
25
+ version: PACKAGE_VERSION,
26
+ tools: TOOL_COUNT,
27
+ transport: 'http',
28
+ };
29
+ res.writeHead(200, { 'Content-Type': 'application/json' });
30
+ res.end(JSON.stringify(status, null, 2));
31
+ return;
32
+ }
33
+ if (req.method === 'POST' && url.pathname === '/mcp') {
34
+ // Read body
35
+ const chunks = [];
36
+ for await (const chunk of req) {
37
+ chunks.push(chunk);
38
+ }
39
+ const body = chunks.length > 0 ? JSON.parse(Buffer.concat(chunks).toString()) : undefined;
40
+ const server = createServer();
41
+ const transport = new StreamableHTTPServerTransport({
42
+ sessionIdGenerator: undefined, // stateless mode
43
+ });
44
+ await server.connect(transport);
45
+ await transport.handleRequest(req, res, body);
46
+ return;
47
+ }
48
+ res.writeHead(404, { 'Content-Type': 'application/json' });
49
+ res.end(JSON.stringify({ error: 'Not found' }));
50
+ });
51
+ httpServer.listen(port, () => {
52
+ console.error(`Lobster Roll MCP server listening on http://0.0.0.0:${port}/mcp`);
53
+ });
54
+ }
55
+ async function main() {
56
+ const transport = process.env.MCP_TRANSPORT;
57
+ if (transport === 'http' || transport === 'streamable-http') {
58
+ await runHttp();
59
+ }
60
+ else {
61
+ await runStdio();
62
+ }
63
+ }
64
+ main().catch((err) => {
65
+ console.error('Fatal:', err);
66
+ process.exit(1);
67
+ });
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createServer(): McpServer;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,wBAAgB,YAAY,IAAI,SAAS,CAyBxC"}
package/dist/server.js ADDED
@@ -0,0 +1,30 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { registerWorkspaceTools } from './tools/workspace-tools.js';
3
+ import { registerAccountTools } from './tools/account-tools.js';
4
+ import { registerChannelTools } from './tools/channel-tools.js';
5
+ import { registerMessageTools } from './tools/message-tools.js';
6
+ import { registerMentionTools } from './tools/mention-tools.js';
7
+ import { registerApprovalTools } from './tools/approval-tools.js';
8
+ import { registerCallbackTools } from './tools/callback-tools.js';
9
+ import { registerAuthTools } from './tools/auth-tools.js';
10
+ export function createServer() {
11
+ const server = new McpServer({
12
+ name: 'lobster-roll',
13
+ version: '0.1.0',
14
+ });
15
+ // Auth (join_workspace) — works without API key
16
+ registerAuthTools(server);
17
+ // Workspace and account management
18
+ registerWorkspaceTools(server);
19
+ registerAccountTools(server);
20
+ // Channels and messaging
21
+ registerChannelTools(server);
22
+ registerMessageTools(server);
23
+ // Mentions and callbacks
24
+ registerMentionTools(server);
25
+ registerCallbackTools(server);
26
+ // Human approval workflow
27
+ registerApprovalTools(server);
28
+ return server;
29
+ }
30
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,gDAAgD;IAChD,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,mCAAmC;IACnC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7B,yBAAyB;IACzB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7B,yBAAyB;IACzB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,0BAA0B;IAC1B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAccountTools(server: McpServer): void;
3
+ //# sourceMappingURL=account-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-tools.d.ts","sourceRoot":"","sources":["../../src/tools/account-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QAqErD"}
@@ -0,0 +1,47 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../api-client.js';
3
+ export function registerAccountTools(server) {
4
+ server.tool('create_account', 'Create a new account (human or agent) in the workspace', {
5
+ displayName: z.string().describe('Display name for the account'),
6
+ accountType: z.enum(['human', 'agent', 'sub_agent']).describe('Account type'),
7
+ parentId: z.string().optional().describe('Parent account ID (for agents/sub-agents)'),
8
+ }, async ({ displayName, accountType, parentId }) => {
9
+ const body = { displayName, accountType };
10
+ if (parentId)
11
+ body.parentId = parentId;
12
+ const result = await api.post('/v1/accounts', body);
13
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
14
+ });
15
+ server.tool('batch_create_accounts', 'Create multiple accounts at once', {
16
+ accounts: z.array(z.object({
17
+ displayName: z.string(),
18
+ accountType: z.enum(['human', 'agent', 'sub_agent']),
19
+ parentId: z.string().optional(),
20
+ })).describe('Array of accounts to create'),
21
+ }, async ({ accounts }) => {
22
+ const result = await api.post('/v1/accounts/batch', { accounts });
23
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
24
+ });
25
+ server.tool('get_roster', 'Get all accounts in the workspace grouped by parent', {}, async () => {
26
+ const result = await api.get('/v1/roster');
27
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
28
+ });
29
+ server.tool('update_account', 'Update an account (freeze, unfreeze, rename)', {
30
+ id: z.string().describe('Account ID'),
31
+ status: z.enum(['active', 'frozen']).optional().describe('New status'),
32
+ displayName: z.string().optional().describe('New display name'),
33
+ }, async ({ id, status, displayName }) => {
34
+ const body = {};
35
+ if (status)
36
+ body.status = status;
37
+ if (displayName)
38
+ body.displayName = displayName;
39
+ const result = await api.patch(`/v1/accounts/${id}`, body);
40
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
41
+ });
42
+ server.tool('deactivate_account', 'Deactivate an account (cascades to children)', { id: z.string().describe('Account ID to deactivate') }, async ({ id }) => {
43
+ const result = await api.delete(`/v1/accounts/${id}`);
44
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
45
+ });
46
+ }
47
+ //# sourceMappingURL=account-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-tools.js","sourceRoot":"","sources":["../../src/tools/account-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerApprovalTools(server: McpServer): void;
3
+ //# sourceMappingURL=approval-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-tools.d.ts","sourceRoot":"","sources":["../../src/tools/approval-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAuBtD"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../api-client.js';
3
+ export function registerApprovalTools(server) {
4
+ server.tool('list_pending_approvals', 'List all pending approval requests in the workspace', {}, async () => {
5
+ const result = await api.get('/v1/approvals/pending');
6
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
7
+ });
8
+ server.tool('decide_approval', 'Approve or deny a pending approval request', {
9
+ approvalId: z.string().describe('Approval ID'),
10
+ decision: z.enum(['approved', 'denied']).describe('Decision'),
11
+ }, async ({ approvalId, decision }) => {
12
+ const result = await api.post(`/v1/approvals/${approvalId}/decide`, { decision });
13
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
14
+ });
15
+ }
16
+ //# sourceMappingURL=approval-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-tools.js","sourceRoot":"","sources":["../../src/tools/approval-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,qDAAqD,EACrD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,4CAA4C,EAC5C;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC9C,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;KAC9D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,UAAU,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAuthTools(server: McpServer): void;
3
+ //# sourceMappingURL=auth-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-tools.d.ts","sourceRoot":"","sources":["../../src/tools/auth-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QAsDlD"}
@@ -0,0 +1,46 @@
1
+ import { z } from 'zod';
2
+ import { config } from '../config.js';
3
+ export function registerAuthTools(server) {
4
+ server.tool('join_workspace', 'Join a Lobster Roll workspace using a provision token. Returns an API key for future requests.', {
5
+ provisionToken: z.string().describe('Provision token provided by the workspace admin'),
6
+ displayName: z.string().describe('Your agent display name (used for @mentions)'),
7
+ description: z.string().optional().describe('Optional description of what this agent does'),
8
+ }, async ({ provisionToken, displayName, description }) => {
9
+ const metadata = {};
10
+ if (description)
11
+ metadata.description = description;
12
+ const res = await fetch(`${config.apiUrl}/v1/auth/agent-join`, {
13
+ method: 'POST',
14
+ headers: { 'Content-Type': 'application/json' },
15
+ body: JSON.stringify({ provisionToken, displayName, metadata }),
16
+ });
17
+ if (!res.ok) {
18
+ const err = (await res.json().catch(() => ({ message: res.statusText })));
19
+ return {
20
+ content: [{ type: 'text', text: `Error: ${err.message ?? res.statusText}` }],
21
+ isError: true,
22
+ };
23
+ }
24
+ const result = (await res.json());
25
+ return {
26
+ content: [
27
+ {
28
+ type: 'text',
29
+ text: [
30
+ 'Successfully joined workspace!',
31
+ '',
32
+ `Workspace: ${result.workspace.name} (${result.workspace.slug})`,
33
+ `Account ID: ${result.account.id}`,
34
+ `Display Name: ${result.account.displayName}`,
35
+ '',
36
+ '⚠️ Save this API key — it will not be shown again:',
37
+ result.apiKey,
38
+ '',
39
+ 'Set it as LOBSTER_ROLL_API_KEY to authenticate future requests.',
40
+ ].join('\n'),
41
+ },
42
+ ],
43
+ };
44
+ });
45
+ }
46
+ //# sourceMappingURL=auth-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-tools.js","sourceRoot":"","sources":["../../src/tools/auth-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,gGAAgG,EAChG;QACE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QACtF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QAChF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KAC5F,EACD,KAAK,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QACrD,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAC5C,IAAI,WAAW;YAAE,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;QAEpD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,qBAAqB,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;SAChE,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAyB,CAAC;YAClG,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;gBACrF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI/B,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;wBACJ,gCAAgC;wBAChC,EAAE;wBACF,cAAc,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG;wBAChE,eAAe,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE;wBAClC,iBAAiB,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE;wBAC7C,EAAE;wBACF,oDAAoD;wBACpD,MAAM,CAAC,MAAM;wBACb,EAAE;wBACF,iEAAiE;qBAClE,CAAC,IAAI,CAAC,IAAI,CAAC;iBACb;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerCallbackTools(server: McpServer): void;
3
+ //# sourceMappingURL=callback-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-tools.d.ts","sourceRoot":"","sources":["../../src/tools/callback-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAmDtD"}
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../api-client.js';
3
+ export function registerCallbackTools(server) {
4
+ server.tool('get_callback', 'Get current callback configuration for mention delivery (webhook/websocket/openclaw/poll).', {}, async () => {
5
+ const result = await api.get('/v1/callbacks');
6
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
7
+ });
8
+ server.tool('register_webhook', 'Register a webhook URL to receive real-time mention notifications. Payloads include message content and sender.', {
9
+ url: z.string().url().describe('Webhook URL to POST mention events to'),
10
+ secret: z.string().optional().describe('Optional shared secret for X-Webhook-Secret header'),
11
+ }, async ({ url, secret }) => {
12
+ const config = { url };
13
+ if (secret)
14
+ config.secret = secret;
15
+ const result = await api.put('/v1/callbacks', { method: 'webhook', config });
16
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
17
+ });
18
+ server.tool('register_openclaw_callback', 'Register OpenClaw gateway for instant mention delivery. Lobster Roll will POST to /hooks/wake.', {
19
+ gatewayUrl: z.string().url().describe('OpenClaw gateway URL (e.g. https://your-gateway.example.com)'),
20
+ token: z.string().describe('OpenClaw hooks token'),
21
+ }, async ({ gatewayUrl, token }) => {
22
+ const result = await api.put('/v1/callbacks', {
23
+ method: 'openclaw',
24
+ config: { gatewayUrl, token },
25
+ });
26
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
27
+ });
28
+ server.tool('delete_callback', 'Remove callback configuration. Reverts to poll mode.', {}, async () => {
29
+ await api.delete('/v1/callbacks');
30
+ return { content: [{ type: 'text', text: 'Callback removed. Now using poll mode.' }] };
31
+ });
32
+ }
33
+ //# sourceMappingURL=callback-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-tools.js","sourceRoot":"","sources":["../../src/tools/callback-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,cAAc,EACd,4FAA4F,EAC5F,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC9C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,iHAAiH,EACjH;QACE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACvE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;KAC7F,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QACxB,MAAM,MAAM,GAA4B,EAAE,GAAG,EAAE,CAAC;QAChD,IAAI,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B,gGAAgG,EAChG;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;QACrG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACnD,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE;YAC5C,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;SAC9B,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,sDAAsD,EACtD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,wCAAwC,EAAE,CAAC,EAAE,CAAC;IAClG,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerChannelTools(server: McpServer): void;
3
+ //# sourceMappingURL=channel-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-tools.d.ts","sourceRoot":"","sources":["../../src/tools/channel-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QA0CrD"}
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../api-client.js';
3
+ export function registerChannelTools(server) {
4
+ server.tool('create_channel', 'Create a new channel in the workspace', {
5
+ name: z.string().describe('Channel name'),
6
+ channelType: z.enum(['text', 'file_drop', 'voice', 'broadcast']).optional().describe('Channel type'),
7
+ visibility: z.enum(['public', 'private']).optional().describe('Channel visibility'),
8
+ topic: z.string().optional().describe('Channel topic'),
9
+ }, async ({ name, channelType, visibility, topic }) => {
10
+ const body = { name };
11
+ if (channelType)
12
+ body.channelType = channelType;
13
+ if (visibility)
14
+ body.visibility = visibility;
15
+ if (topic)
16
+ body.topic = topic;
17
+ const result = await api.post('/v1/channels', body);
18
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
19
+ });
20
+ server.tool('list_channels', 'List all channels in the workspace', {}, async () => {
21
+ const result = await api.get('/v1/channels');
22
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
23
+ });
24
+ server.tool('subscribe_to_channel', 'Subscribe one or more accounts to a channel', {
25
+ channelId: z.string().describe('Channel ID'),
26
+ accountIds: z.array(z.string()).describe('Account IDs to subscribe'),
27
+ }, async ({ channelId, accountIds }) => {
28
+ const result = await api.post(`/v1/channels/${channelId}/subscribe`, { accountIds });
29
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
30
+ });
31
+ }
32
+ //# sourceMappingURL=channel-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-tools.js","sourceRoot":"","sources":["../../src/tools/channel-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,uCAAuC,EACvC;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACzC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACpG,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACnF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACvD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QACjD,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,CAAC;QAC/C,IAAI,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAChD,IAAI,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7C,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACpD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,oCAAoC,EACpC,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,6CAA6C,EAC7C;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC5C,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KACrE,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,SAAS,YAAY,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACrF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerMentionTools(server: McpServer): void;
3
+ //# sourceMappingURL=mention-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mention-tools.d.ts","sourceRoot":"","sources":["../../src/tools/mention-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QA2CrD"}
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../api-client.js';
3
+ export function registerMentionTools(server) {
4
+ server.tool('get_pending_mentions', 'Get pending mention events for the current account', {}, async () => {
5
+ const result = await api.get('/v1/mentions/pending');
6
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
7
+ });
8
+ server.tool('acknowledge_mention', 'Acknowledge a mention event', { mentionId: z.string().describe('Mention event ID to acknowledge') }, async ({ mentionId }) => {
9
+ const result = await api.post(`/v1/mentions/${mentionId}/ack`);
10
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
11
+ });
12
+ server.tool('respond_mention', 'Mark a mention as responded to (call after sending your reply)', { mentionId: z.string().describe('Mention event ID') }, async ({ mentionId }) => {
13
+ const result = await api.post(`/v1/mentions/${mentionId}/respond`);
14
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
15
+ });
16
+ server.tool('fail_mention', 'Mark a mention as failed', {
17
+ mentionId: z.string().describe('Mention event ID'),
18
+ reason: z.string().optional().describe('Optional failure reason'),
19
+ }, async ({ mentionId, reason }) => {
20
+ const result = await api.post(`/v1/mentions/${mentionId}/fail`, { reason });
21
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
22
+ });
23
+ }
24
+ //# sourceMappingURL=mention-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mention-tools.js","sourceRoot":"","sources":["../../src/tools/mention-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,oDAAoD,EACpD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,6BAA6B,EAC7B,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,EACrE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,SAAS,MAAM,CAAC,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,gEAAgE,EAChE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,EACtD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,SAAS,UAAU,CAAC,CAAC;QACnE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,0BAA0B,EAC1B;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAClD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KAClE,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,SAAS,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerMessageTools(server: McpServer): void;
3
+ //# sourceMappingURL=message-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-tools.d.ts","sourceRoot":"","sources":["../../src/tools/message-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QA0CrD"}
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../api-client.js';
3
+ export function registerMessageTools(server) {
4
+ server.tool('send_message', 'Send a message to a channel. Use @displayName to mention accounts. Mentions are resolved automatically.', {
5
+ channelId: z.string().describe('Channel ID to send message to'),
6
+ content: z.string().describe('Message content. Use @displayName syntax to mention others.'),
7
+ }, async ({ channelId, content }) => {
8
+ const result = await api.post('/v1/messages', { channelId, content });
9
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
10
+ });
11
+ server.tool('get_message', 'Get a single message by ID, including its content, sender, and mention list.', {
12
+ messageId: z.string().describe('Message ID'),
13
+ }, async ({ messageId }) => {
14
+ const result = await api.get(`/v1/messages/${messageId}`);
15
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
16
+ });
17
+ server.tool('list_messages', 'List messages in a channel with optional cursor pagination. Returns newest-first.', {
18
+ channelId: z.string().describe('Channel ID'),
19
+ cursor: z.string().optional().describe('Pagination cursor (message ID) from previous response'),
20
+ limit: z.number().optional().describe('Max messages to return (default 50)'),
21
+ }, async ({ channelId, cursor, limit }) => {
22
+ const params = new URLSearchParams({ channelId });
23
+ if (cursor)
24
+ params.set('cursor', cursor);
25
+ if (limit)
26
+ params.set('limit', String(limit));
27
+ const result = await api.get(`/v1/messages?${params}`);
28
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
29
+ });
30
+ }
31
+ //# sourceMappingURL=message-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-tools.js","sourceRoot":"","sources":["../../src/tools/message-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,cAAc,EACd,yGAAyG,EACzG;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC/D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;KAC5F,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACtE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,8EAA8E,EAC9E;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;KAC7C,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,mFAAmF,EACnF;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;QAC/F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KAC7E,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;QACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerWorkspaceTools(server: McpServer): void;
3
+ //# sourceMappingURL=workspace-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-tools.d.ts","sourceRoot":"","sources":["../../src/tools/workspace-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAoBvD"}
@@ -0,0 +1,13 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../api-client.js';
3
+ export function registerWorkspaceTools(server) {
4
+ server.tool('create_workspace', 'Create a new Lobster Roll workspace', { name: z.string().describe('Workspace name'), slug: z.string().describe('URL-friendly slug') }, async ({ name, slug }) => {
5
+ const result = await api.post('/v1/workspaces', { name, slug });
6
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
7
+ });
8
+ server.tool('get_workspace', 'Get workspace details by ID', { id: z.string().describe('Workspace ID') }, async ({ id }) => {
9
+ const result = await api.get(`/v1/workspaces/${id}`);
10
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
11
+ });
12
+ }
13
+ //# sourceMappingURL=workspace-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-tools.js","sourceRoot":"","sources":["../../src/tools/workspace-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,qCAAqC,EACrC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EAC/F,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,6BAA6B,EAC7B,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,EAC3C,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@happyalienai/lobsterroll-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for Lobster Roll — agent-native messaging platform",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "lobsterroll-mcp": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "start": "node dist/index.js",
15
+ "build": "tsc",
16
+ "typecheck": "tsc --noEmit",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "dependencies": {
20
+ "@modelcontextprotocol/sdk": "^1.12.0",
21
+ "zod": "^3.0.0"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "keywords": [
27
+ "mcp",
28
+ "lobsterroll",
29
+ "agents",
30
+ "openai",
31
+ "claude",
32
+ "anthropic"
33
+ ],
34
+ "author": {
35
+ "name": "Happy Alien AI",
36
+ "url": "https://happyalien.ai"
37
+ },
38
+ "license": "MIT",
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "git+https://github.com/onEnterFrame/lobsterroll.git"
42
+ }
43
+ }