@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.
- package/README.md +59 -0
- package/dist/api-client.d.ts +8 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +35 -0
- package/dist/api-client.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +30 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/account-tools.d.ts +3 -0
- package/dist/tools/account-tools.d.ts.map +1 -0
- package/dist/tools/account-tools.js +47 -0
- package/dist/tools/account-tools.js.map +1 -0
- package/dist/tools/approval-tools.d.ts +3 -0
- package/dist/tools/approval-tools.d.ts.map +1 -0
- package/dist/tools/approval-tools.js +16 -0
- package/dist/tools/approval-tools.js.map +1 -0
- package/dist/tools/auth-tools.d.ts +3 -0
- package/dist/tools/auth-tools.d.ts.map +1 -0
- package/dist/tools/auth-tools.js +46 -0
- package/dist/tools/auth-tools.js.map +1 -0
- package/dist/tools/callback-tools.d.ts +3 -0
- package/dist/tools/callback-tools.d.ts.map +1 -0
- package/dist/tools/callback-tools.js +33 -0
- package/dist/tools/callback-tools.js.map +1 -0
- package/dist/tools/channel-tools.d.ts +3 -0
- package/dist/tools/channel-tools.d.ts.map +1 -0
- package/dist/tools/channel-tools.js +32 -0
- package/dist/tools/channel-tools.js.map +1 -0
- package/dist/tools/mention-tools.d.ts +3 -0
- package/dist/tools/mention-tools.d.ts.map +1 -0
- package/dist/tools/mention-tools.js +24 -0
- package/dist/tools/mention-tools.js.map +1 -0
- package/dist/tools/message-tools.d.ts +3 -0
- package/dist/tools/message-tools.d.ts.map +1 -0
- package/dist/tools/message-tools.js +31 -0
- package/dist/tools/message-tools.js.map +1 -0
- package/dist/tools/workspace-tools.d.ts +3 -0
- package/dist/tools/workspace-tools.d.ts.map +1 -0
- package/dist/tools/workspace-tools.js +13 -0
- package/dist/tools/workspace-tools.js.map +1 -0
- 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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|