@nimbus-app/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 ADDED
@@ -0,0 +1,212 @@
1
+ # Nimbus MCP Server
2
+
3
+ Connect Claude to your task memory. This MCP server lets Claude access your captured tasks and platform knowledge from Nimbus, so it can learn how you perform tasks and help you more effectively.
4
+
5
+ ## Quick Start
6
+
7
+ ### 1. Install
8
+
9
+ ```bash
10
+ npm install -g @nimbus-app/mcp
11
+ ```
12
+
13
+ ### 2. Get Your API Key
14
+
15
+ 1. Open the Nimbus desktop app
16
+ 2. Go to **Settings** → **Account**
17
+ 3. Click **Generate MCP API Key**
18
+ 4. Copy the key (starts with `nimbus_`)
19
+
20
+ ### 3. Configure Claude Desktop
21
+
22
+ Add to your Claude Desktop config file:
23
+
24
+ **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
25
+ **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
26
+
27
+ ```json
28
+ {
29
+ "mcpServers": {
30
+ "nimbus": {
31
+ "command": "nimbus-mcp",
32
+ "env": {
33
+ "NIMBUS_API_KEY": "nimbus_your_api_key_here"
34
+ }
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ ### 4. Restart Claude Desktop
41
+
42
+ Quit and reopen Claude Desktop. You should see "nimbus" in the MCP servers list.
43
+
44
+ ## Available Tools
45
+
46
+ Once connected, Claude has access to these tools:
47
+
48
+ ### `nimbus_search_tasks`
49
+
50
+ Search for task patterns you've performed. Returns matching tasks with confidence scores and associated platforms.
51
+
52
+ **Example prompts:**
53
+ - "Search my tasks for submitting homework on Canvas"
54
+ - "Find how I usually file expense reports"
55
+ - "Look for tasks involving VS Code"
56
+
57
+ ### `nimbus_get_task`
58
+
59
+ Get full details for a specific task, including platform knowledge, subtasks, and recent execution examples with step-by-step screenshots.
60
+
61
+ **Example prompts:**
62
+ - "Show me the full details for that Canvas task"
63
+ - "Get the execution steps with screenshots"
64
+
65
+ ### `nimbus_search_workflows`
66
+
67
+ Search for recorded workflows/sessions by natural language query. Returns matching workflows with status, counts, and top related tasks.
68
+
69
+ **Example prompts:**
70
+ - "Find workflows where I submitted homework"
71
+ - "Show my recent workflows about expense reports"
72
+ - "Search my workflows for VS Code setup"
73
+
74
+ ### `nimbus_get_workflow_steps`
75
+
76
+ Get detailed task executions and ordered workflow steps for a specific workflow.
77
+
78
+ **Example prompts:**
79
+ - "Show the step-by-step flow for this workflow"
80
+ - "Get workflow steps including screenshots"
81
+ - "Explain the executions in this workflow"
82
+
83
+ ### `nimbus_search_platforms`
84
+
85
+ Search for platforms (apps/websites) you work with. Returns platform knowledge and related tasks.
86
+
87
+ **Example prompts:**
88
+ - "What platforms do I use for development?"
89
+ - "Find information about Canvas"
90
+
91
+ ### `nimbus_get_platform`
92
+
93
+ Get full details for a specific platform, including accumulated knowledge about how it works and all tasks you perform on it.
94
+
95
+ **Example prompts:**
96
+ - "Show me everything about how I use VS Code"
97
+ - "Get full details on this platform"
98
+
99
+ ### `nimbus_ask_user`
100
+
101
+ Ask you a question (you'll be notified in the Nimbus app).
102
+
103
+ **Example prompts:**
104
+ - "Ask the user which email to use for this form"
105
+ - "Check with the user if they want to proceed"
106
+
107
+ ### `nimbus_get_question_status`
108
+
109
+ Check if you've answered a question.
110
+
111
+ ## Example Conversation
112
+
113
+ ```
114
+ You: Help me submit my CS101 homework on Canvas
115
+
116
+ Claude: Let me search your tasks to see how you usually do this.
117
+ [Uses nimbus_search_tasks with "submit homework Canvas"]
118
+
119
+ I found a task called "Submit Canvas Assignment" that you've done 5 times.
120
+ Let me get the detailed steps.
121
+ [Uses nimbus_get_task with include_executions=1]
122
+
123
+ Here's how you typically submit homework on Canvas:
124
+
125
+ 1. Navigate to canvas.instructure.com
126
+ 2. Click on "CS101" in the course list
127
+ 3. Click "Assignments" in the left sidebar
128
+ 4. Find your assignment and click on it
129
+ 5. Click "Submit Assignment" button
130
+ 6. Upload your file using the file picker
131
+ 7. Click "Submit" to confirm
132
+
133
+ Would you like me to walk you through this step by step?
134
+ ```
135
+
136
+ ## Configuration Options
137
+
138
+ ### Environment Variables
139
+
140
+ | Variable | Description | Default |
141
+ |----------|-------------|---------|
142
+ | `NIMBUS_API_KEY` | Your Nimbus API key (required) | - |
143
+ | `NIMBUS_API_URL` | API endpoint URL | `https://api.nimbusai.cloud/mcp/v1` |
144
+
145
+ ### Staging/Development
146
+
147
+ To use the staging API:
148
+
149
+ ```json
150
+ {
151
+ "mcpServers": {
152
+ "nimbus": {
153
+ "command": "nimbus-mcp",
154
+ "env": {
155
+ "NIMBUS_API_KEY": "nimbus_your_key",
156
+ "NIMBUS_API_URL": "https://api.staging.nimbusai.cloud/mcp/v1"
157
+ }
158
+ }
159
+ }
160
+ }
161
+ ```
162
+
163
+ ## Troubleshooting
164
+
165
+ ### "NIMBUS_API_KEY is required"
166
+
167
+ Make sure you've added the API key to your Claude Desktop config and restarted Claude.
168
+
169
+ ### "Invalid or missing API key"
170
+
171
+ Your API key may be incorrect or expired. Generate a new one in Nimbus Settings → Account.
172
+
173
+ ### "Rate limit exceeded"
174
+
175
+ The API has limits of:
176
+ - 100 requests per minute
177
+ - 1,000 requests per hour
178
+ - 10,000 requests per day
179
+
180
+ Wait a moment and try again.
181
+
182
+ ### Server not appearing in Claude
183
+
184
+ 1. Check your config file path is correct
185
+ 2. Ensure the JSON is valid (no trailing commas)
186
+ 3. Completely quit and restart Claude Desktop
187
+ 4. Check Claude's logs for errors
188
+
189
+ ### Testing the server manually
190
+
191
+ ```bash
192
+ NIMBUS_API_KEY=your_key nimbus-mcp
193
+ ```
194
+
195
+ The server should start and wait for MCP protocol messages on stdin.
196
+
197
+ ## Privacy & Security
198
+
199
+ - Your API key authenticates requests to your own workflow data
200
+ - Nimbus only captures what you've allowed in Privacy Settings
201
+ - Screenshots and workflow data are encrypted in transit and at rest
202
+ - You can delete your data anytime from the Nimbus app
203
+
204
+ ## Support
205
+
206
+ - **Documentation:** https://nimbusai.cloud/docs/mcp
207
+ - **Issues:** https://github.com/nimbus-app/nimbus/issues
208
+ - **Email:** support@nimbusai.cloud
209
+
210
+ ## License
211
+
212
+ MIT
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Nimbus API Client
3
+ *
4
+ * HTTP client for the Nimbus MCP REST API.
5
+ */
6
+ import type { SearchTasksInput, SearchTasksOutput, SearchWorkflowsInput, SearchWorkflowsOutput, GetTaskInput, GetTaskOutput, SearchPlatformsInput, SearchPlatformsOutput, GetWorkflowInput, GetWorkflowOutput, AskUserInput, AskUserOutput, QuestionStatus } from './types.js';
7
+ export declare class NimbusAPIError extends Error {
8
+ code: string;
9
+ details?: Record<string, unknown> | undefined;
10
+ constructor(code: string, message: string, details?: Record<string, unknown> | undefined);
11
+ }
12
+ export declare class NimbusClient {
13
+ private apiUrl;
14
+ private apiKey;
15
+ constructor(apiKey: string, apiUrl?: string);
16
+ private request;
17
+ searchTasks(input: SearchTasksInput): Promise<SearchTasksOutput>;
18
+ searchWorkflows(input: SearchWorkflowsInput): Promise<SearchWorkflowsOutput>;
19
+ getTask(input: GetTaskInput): Promise<GetTaskOutput>;
20
+ searchPlatforms(input: SearchPlatformsInput): Promise<SearchPlatformsOutput>;
21
+ getWorkflow(input: GetWorkflowInput): Promise<GetWorkflowOutput>;
22
+ askUser(input: AskUserInput): Promise<AskUserOutput>;
23
+ getQuestionStatus(questionId: string): Promise<QuestionStatus>;
24
+ }
25
+ //# 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":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAGV,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,cAAc,EACf,MAAM,YAAY,CAAA;AAKnB,qBAAa,cAAe,SAAQ,KAAK;IAE9B,IAAI,EAAE,MAAM;IAEZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjC,IAAI,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAK3C;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;YAQ7B,OAAO;IA+Bf,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIhE,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAI5E,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAI5E,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIhE,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAGrE"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Nimbus API Client
3
+ *
4
+ * HTTP client for the Nimbus MCP REST API.
5
+ */
6
+ import fetch from 'node-fetch';
7
+ // Default MCP API URL — requires NIMBUS_API_URL env var or explicit URL in constructor
8
+ const DEFAULT_API_URL = 'https://api.nimbusai.cloud/mcp/v1';
9
+ export class NimbusAPIError extends Error {
10
+ code;
11
+ details;
12
+ constructor(code, message, details) {
13
+ super(message);
14
+ this.code = code;
15
+ this.details = details;
16
+ this.name = 'NimbusAPIError';
17
+ }
18
+ }
19
+ export class NimbusClient {
20
+ apiUrl;
21
+ apiKey;
22
+ constructor(apiKey, apiUrl) {
23
+ if (!apiKey) {
24
+ throw new Error('NIMBUS_API_KEY is required');
25
+ }
26
+ this.apiKey = apiKey;
27
+ this.apiUrl = apiUrl || process.env.NIMBUS_API_URL || DEFAULT_API_URL;
28
+ }
29
+ async request(endpoint, method = 'POST', body) {
30
+ const url = `${this.apiUrl}${endpoint}`;
31
+ const response = await fetch(url, {
32
+ method,
33
+ headers: {
34
+ 'Content-Type': 'application/json',
35
+ 'X-Api-Key': this.apiKey,
36
+ 'User-Agent': 'nimbus-mcp/1.0.0',
37
+ },
38
+ body: body ? JSON.stringify(body) : undefined,
39
+ });
40
+ const json = await response.json();
41
+ if (!response.ok) {
42
+ const error = json;
43
+ throw new NimbusAPIError(error.error?.code || 'UNKNOWN_ERROR', error.error?.message || 'An unknown error occurred', error.error?.details);
44
+ }
45
+ return json.data;
46
+ }
47
+ async searchTasks(input) {
48
+ return this.request('/tools/nimbus_search_tasks', 'POST', input);
49
+ }
50
+ async searchWorkflows(input) {
51
+ return this.request('/tools/nimbus_search_workflows', 'POST', input);
52
+ }
53
+ async getTask(input) {
54
+ return this.request('/tools/nimbus_get_task', 'POST', input);
55
+ }
56
+ async searchPlatforms(input) {
57
+ return this.request('/tools/nimbus_search_platforms', 'POST', input);
58
+ }
59
+ async getWorkflow(input) {
60
+ return this.request('/tools/nimbus_get_workflow', 'POST', input);
61
+ }
62
+ async askUser(input) {
63
+ return this.request('/tools/nimbus_ask_user', 'POST', input);
64
+ }
65
+ async getQuestionStatus(questionId) {
66
+ return this.request(`/questions/${questionId}`, 'GET');
67
+ }
68
+ }
69
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,YAAY,CAAA;AAmB9B,uFAAuF;AACvF,MAAM,eAAe,GAAG,mCAAmC,CAAA;AAE3D,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE9B;IAEA;IAHT,YACS,IAAY,EACnB,OAAe,EACR,OAAiC;QAExC,KAAK,CAAC,OAAO,CAAC,CAAA;QAJP,SAAI,GAAJ,IAAI,CAAQ;QAEZ,YAAO,GAAP,OAAO,CAA0B;QAGxC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IACf,MAAM,CAAQ;IACd,MAAM,CAAQ;IAEtB,YAAY,MAAc,EAAE,MAAe;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAC/C,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,eAAe,CAAA;IACvE,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,QAAgB,EAChB,SAAyB,MAAM,EAC/B,IAAc;QAEd,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAA;QAEvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,IAAI,CAAC,MAAM;gBACxB,YAAY,EAAE,kBAAkB;aACjC;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAElC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,IAAmB,CAAA;YACjC,MAAM,IAAI,cAAc,CACtB,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,eAAe,EACpC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,2BAA2B,EACnD,KAAK,CAAC,KAAK,EAAE,OAAO,CACrB,CAAA;QACH,CAAC;QAED,OAAQ,IAA0B,CAAC,IAAI,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAuB;QACvC,OAAO,IAAI,CAAC,OAAO,CAAoB,4BAA4B,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACrF,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAA2B;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAwB,gCAAgC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAC7F,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAmB;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAgB,wBAAwB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAC7E,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAA2B;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAwB,gCAAgC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAC7F,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAuB;QACvC,OAAO,IAAI,CAAC,OAAO,CAAoB,4BAA4B,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACrF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAmB;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAgB,wBAAwB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAC7E,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,UAAkB;QACxC,OAAO,IAAI,CAAC,OAAO,CAAiB,cAAc,UAAU,EAAE,EAAE,KAAK,CAAC,CAAA;IACxE,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Nimbus MCP Server
4
+ *
5
+ * A Model Context Protocol server that provides access to your Nimbus task memory.
6
+ * This allows AI assistants like Claude to query your captured tasks, platforms,
7
+ * and learn how you perform tasks.
8
+ *
9
+ * Usage:
10
+ * NIMBUS_API_KEY=your_key nimbus-mcp
11
+ *
12
+ * Or configure in Claude Desktop:
13
+ * {
14
+ * "mcpServers": {
15
+ * "nimbus": {
16
+ * "command": "nimbus-mcp",
17
+ * "env": { "NIMBUS_API_KEY": "your_key" }
18
+ * }
19
+ * }
20
+ * }
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
package/dist/index.js ADDED
@@ -0,0 +1,493 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Nimbus MCP Server
4
+ *
5
+ * A Model Context Protocol server that provides access to your Nimbus task memory.
6
+ * This allows AI assistants like Claude to query your captured tasks, platforms,
7
+ * and learn how you perform tasks.
8
+ *
9
+ * Usage:
10
+ * NIMBUS_API_KEY=your_key nimbus-mcp
11
+ *
12
+ * Or configure in Claude Desktop:
13
+ * {
14
+ * "mcpServers": {
15
+ * "nimbus": {
16
+ * "command": "nimbus-mcp",
17
+ * "env": { "NIMBUS_API_KEY": "your_key" }
18
+ * }
19
+ * }
20
+ * }
21
+ */
22
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
23
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
24
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
25
+ import { z } from 'zod';
26
+ import { NimbusClient, NimbusAPIError } from './api-client.js';
27
+ // ============================================================================
28
+ // CONFIGURATION
29
+ // ============================================================================
30
+ const SERVER_NAME = 'nimbus';
31
+ const SERVER_VERSION = '1.0.0';
32
+ const SERVER_INSTRUCTIONS = `Nimbus is the user's task memory. It watches their screen as they complete their computer work and learns HOW they perform tasks across apps and websites. Use Nimbus tools whenever you need to do something the way the user does it, understand how they use a specific app, or find out how they've done something before.
33
+
34
+ Data hierarchy: Workflow → Tasks → Steps. A workflow contains tasks, and each task contains steps with screenshots.
35
+
36
+ **Task** — A recurring action the user performs, like "submit an expense report" or "onboard a new vendor". Built from repeated observations across multiple recordings. Has steps, associated platforms, and a confidence score that reflects how reliably Nimbus has identified this as a distinct, repeatable task (higher = seen it more times with consistent patterns).
37
+
38
+ **Workflow** — One recording session. The user pressed Record, did work on their computer, and pressed Stop. Everything they did in that window of time — the screenshots, the apps they touched, the AI analysis of what was happening — lives under that workflow.
39
+
40
+ **Platform** — An app or website (e.g., Salesforce, Google Sheets, SAP). Nimbus accumulates knowledge about how the user navigates each one over time.`;
41
+ // ============================================================================
42
+ // INPUT SCHEMAS (Zod for validation)
43
+ // ============================================================================
44
+ const searchTasksSchema = z.object({
45
+ query: z.string().min(1).max(1000),
46
+ platform_filter: z.string().max(200).optional(),
47
+ limit: z.number().int().min(1).max(20).optional().default(5),
48
+ });
49
+ const searchWorkflowsSchema = z.object({
50
+ query: z.string().min(1).max(1000),
51
+ limit: z.number().int().min(1).max(20).optional().default(5),
52
+ });
53
+ const getTaskSchema = z.object({
54
+ task_id: z.string().uuid(),
55
+ include_executions: z.number().int().min(1).max(5).optional().default(2),
56
+ });
57
+ const searchPlatformsSchema = z.object({
58
+ query: z.string().min(1).max(1000),
59
+ limit: z.number().int().min(1).max(20).optional().default(5),
60
+ });
61
+ const getWorkflowSchema = z.object({
62
+ workflow_id: z.string().uuid(),
63
+ });
64
+ const askUserSchema = z.object({
65
+ question: z.string().min(1).max(1000),
66
+ context: z.string().max(5000).optional(),
67
+ suggested_answers: z.array(z.string().max(500)).max(5).optional(),
68
+ });
69
+ const getQuestionStatusSchema = z.object({
70
+ question_id: z.string().uuid(),
71
+ });
72
+ // ============================================================================
73
+ // TOOL DEFINITIONS (JSON Schema format for MCP protocol)
74
+ // ============================================================================
75
+ const TOOLS = [
76
+ {
77
+ name: 'nimbus_search_tasks',
78
+ description: 'Search how the user does something. Searches their recorded task library — recurring actions like "submit an expense report", "onboard a new vendor", or "update the weekly forecast". Returns task names, descriptions, and platform names to help you identify the right task. Pass a task_id to nimbus_get_task for the full playbook with steps, screenshots, and platform knowledge.',
79
+ inputSchema: {
80
+ type: 'object',
81
+ properties: {
82
+ query: {
83
+ type: 'string',
84
+ description: 'Natural language search query',
85
+ },
86
+ platform_filter: {
87
+ type: 'string',
88
+ description: 'Filter results by platform name (e.g., "SAP Concur", "Salesforce")',
89
+ },
90
+ limit: {
91
+ type: 'number',
92
+ description: 'Maximum number of results to return (default 5, max 20)',
93
+ },
94
+ },
95
+ required: ['query'],
96
+ },
97
+ },
98
+ {
99
+ name: 'nimbus_get_task',
100
+ description: 'Get the full playbook for a task. Returns everything needed to replicate or understand it: description, subtasks, platform-specific knowledge (how to navigate each app), and recent executions with step-by-step screenshots showing exactly how the user performed it. Includes 2 recent executions by default — set include_executions (1-5) to control how many.',
101
+ inputSchema: {
102
+ type: 'object',
103
+ properties: {
104
+ task_id: {
105
+ type: 'string',
106
+ description: 'UUID of the task to retrieve',
107
+ },
108
+ include_executions: {
109
+ type: 'number',
110
+ description: 'Number of recent executions to include (1-5, default 2). Each execution includes steps with screenshot URLs.',
111
+ },
112
+ },
113
+ required: ['task_id'],
114
+ },
115
+ },
116
+ {
117
+ name: 'nimbus_search_workflows',
118
+ description: 'Search the user\'s recording sessions. Each workflow is one recorded block of work — everything the user did between pressing Record and Stop. Use this to find a specific session (e.g., "setting up the new hire\'s accounts" or "yesterday\'s budget review"). Returns session summary, capture/analysis counts, and the top tasks identified. Pass a workflow_id to nimbus_get_workflow for the full task breakdown.',
119
+ inputSchema: {
120
+ type: 'object',
121
+ properties: {
122
+ query: {
123
+ type: 'string',
124
+ description: 'Natural language query for matching workflows',
125
+ },
126
+ limit: {
127
+ type: 'number',
128
+ description: 'Maximum number of results to return (default 5, max 20)',
129
+ },
130
+ },
131
+ required: ['query'],
132
+ },
133
+ },
134
+ {
135
+ name: 'nimbus_get_workflow',
136
+ description: 'Get a high-level overview of a recording session — which tasks the user performed, in what order, with brief descriptions and the platforms involved. Use this to understand what happened in a session without the fine details. To drill into a specific task\'s steps and screenshots, pass its task_id to nimbus_get_task. Requires a workflow_id from nimbus_search_workflows.',
137
+ inputSchema: {
138
+ type: 'object',
139
+ properties: {
140
+ workflow_id: {
141
+ type: 'string',
142
+ description: 'UUID of the workflow to retrieve',
143
+ },
144
+ },
145
+ required: ['workflow_id'],
146
+ },
147
+ },
148
+ {
149
+ name: 'nimbus_search_platforms',
150
+ description: 'Look up an app or website the user works with. Returns the full accumulated knowledge Nimbus has about the platform — how to navigate it, where things are, UI quirks — along with identifiers, every task the user performs on it, and usage history. Use this when you need to understand how a specific tool works from the user\'s perspective.',
151
+ inputSchema: {
152
+ type: 'object',
153
+ properties: {
154
+ query: {
155
+ type: 'string',
156
+ description: 'Platform name or natural language query',
157
+ },
158
+ limit: {
159
+ type: 'number',
160
+ description: 'Maximum number of results to return (default 5, max 20)',
161
+ },
162
+ },
163
+ required: ['query'],
164
+ },
165
+ },
166
+ {
167
+ name: 'nimbus_ask_user',
168
+ description: 'Ask the user a question when Nimbus data alone isn\'t enough. Delivered as a notification in the Nimbus desktop app. This is async — poll nimbus_get_question_status for their answer. Only use this after checking tasks, workflows, and platforms first.',
169
+ inputSchema: {
170
+ type: 'object',
171
+ properties: {
172
+ question: {
173
+ type: 'string',
174
+ description: 'Question to ask the user',
175
+ },
176
+ context: {
177
+ type: 'string',
178
+ description: "Why you're asking this question",
179
+ },
180
+ suggested_answers: {
181
+ type: 'array',
182
+ items: { type: 'string' },
183
+ description: 'Suggested quick responses (max 5)',
184
+ },
185
+ },
186
+ required: ['question'],
187
+ },
188
+ },
189
+ {
190
+ name: 'nimbus_get_question_status',
191
+ description: 'Poll for the user\'s answer to a question sent via nimbus_ask_user. Returns status (pending/answered/expired/dismissed) and the answer text if they responded. Pass the question_id from the nimbus_ask_user response.',
192
+ inputSchema: {
193
+ type: 'object',
194
+ properties: {
195
+ question_id: {
196
+ type: 'string',
197
+ description: 'Question ID from nimbus_ask_user response (UUID format)',
198
+ },
199
+ },
200
+ required: ['question_id'],
201
+ },
202
+ },
203
+ ];
204
+ // ============================================================================
205
+ // HELPER FUNCTIONS
206
+ // ============================================================================
207
+ function formatError(error) {
208
+ if (error instanceof NimbusAPIError) {
209
+ return `Nimbus API Error [${error.code}]: ${error.message}`;
210
+ }
211
+ if (error instanceof Error) {
212
+ return error.message;
213
+ }
214
+ return String(error);
215
+ }
216
+ function textContent(text) {
217
+ return { type: 'text', text };
218
+ }
219
+ // ============================================================================
220
+ // TOOL HANDLERS
221
+ // ============================================================================
222
+ async function handleSearchTasks(client, args) {
223
+ try {
224
+ const input = searchTasksSchema.parse(args);
225
+ const result = await client.searchTasks(input);
226
+ if (result.tasks.length === 0) {
227
+ return {
228
+ content: [
229
+ textContent(`No tasks found matching "${input.query}". The user may not have performed this task yet, or it may be described differently.`),
230
+ ],
231
+ };
232
+ }
233
+ const taskList = result.tasks
234
+ .map((t, i) => {
235
+ const platforms = t.platforms.length > 0 ? ` (${t.platforms.join(', ')})` : '';
236
+ return `${i + 1}. **${t.name}**${platforms}
237
+ ID: ${t.id}
238
+ ${t.description}`;
239
+ })
240
+ .join('\n\n');
241
+ return {
242
+ content: [
243
+ textContent(`Found ${result.total_matches} task(s) matching "${input.query}":\n\n${taskList}\n\nUse nimbus_get_task with a task_id for the full step-by-step playbook.`),
244
+ ],
245
+ };
246
+ }
247
+ catch (error) {
248
+ return { content: [textContent(formatError(error))], isError: true };
249
+ }
250
+ }
251
+ async function handleGetTask(client, args) {
252
+ try {
253
+ const input = getTaskSchema.parse(args);
254
+ const result = await client.getTask(input);
255
+ const { task } = result;
256
+ const platformsInfo = task.platforms.length > 0
257
+ ? `\n\n**Platforms:**\n${task.platforms.map((p) => `- **${p.name}**: ${p.knowledge}`).join('\n')}`
258
+ : '';
259
+ const subtasksInfo = task.subtasks.length > 0
260
+ ? `\n\n**Subtasks:**\n${task.subtasks.map((s) => `- **${s.name}**: ${s.description}`).join('\n')}`
261
+ : '';
262
+ const executionsInfo = result.recent_executions.length > 0
263
+ ? `\n\n**Recent Executions (${result.recent_executions.length}):**\n${result.recent_executions
264
+ .map((exec) => {
265
+ const steps = exec.steps
266
+ .map((step) => {
267
+ const screenshot = step.screenshot_url ? ` [Screenshot](${step.screenshot_url})` : '';
268
+ return ` ${step.position}. ${step.description}${screenshot}`;
269
+ })
270
+ .join('\n');
271
+ return `\n- **${new Date(exec.performed_at).toLocaleDateString()}** - ${exec.context}\n${steps}`;
272
+ })
273
+ .join('\n')}`
274
+ : '';
275
+ return {
276
+ content: [
277
+ textContent(`# ${task.name}\n\n${task.description}\n\nConfidence: ${(task.confidence * 100).toFixed(0)}% | Performed: ${task.occurrence_count} time(s)${platformsInfo}${subtasksInfo}${executionsInfo}`),
278
+ ],
279
+ };
280
+ }
281
+ catch (error) {
282
+ return { content: [textContent(formatError(error))], isError: true };
283
+ }
284
+ }
285
+ async function handleSearchWorkflows(client, args) {
286
+ try {
287
+ const input = searchWorkflowsSchema.parse(args);
288
+ const result = await client.searchWorkflows(input);
289
+ if (result.workflows.length === 0) {
290
+ return {
291
+ content: [
292
+ textContent(`No workflows found matching "${input.query}". The user may need to record additional sessions.`),
293
+ ],
294
+ };
295
+ }
296
+ const workflowList = result.workflows
297
+ .map((workflow, index) => {
298
+ const topTasks = workflow.top_tasks.length > 0
299
+ ? `\n Top tasks: ${workflow.top_tasks.map((task) => task.name).join(', ')}`
300
+ : '';
301
+ const endedAt = workflow.ended_at
302
+ ? ` | Ended: ${new Date(workflow.ended_at).toLocaleDateString()}`
303
+ : ' | In progress';
304
+ return `${index + 1}. **${workflow.name}**
305
+ ID: ${workflow.id}
306
+ Status: ${workflow.status} | Captures: ${workflow.capture_count} | Analyses: ${workflow.analysis_count}${endedAt}
307
+ Started: ${new Date(workflow.started_at).toLocaleDateString()}${topTasks}`;
308
+ })
309
+ .join('\n\n');
310
+ return {
311
+ content: [
312
+ textContent(`Found ${result.total_matches} workflow(s) matching "${input.query}":\n\n${workflowList}\n\nUse nimbus_get_workflow with a workflow_id for the full task breakdown.`),
313
+ ],
314
+ };
315
+ }
316
+ catch (error) {
317
+ return { content: [textContent(formatError(error))], isError: true };
318
+ }
319
+ }
320
+ async function handleSearchPlatforms(client, args) {
321
+ try {
322
+ const input = searchPlatformsSchema.parse(args);
323
+ const result = await client.searchPlatforms(input);
324
+ if (result.platforms.length === 0) {
325
+ return {
326
+ content: [
327
+ textContent(`No platforms found matching "${input.query}". The user may not have used this platform yet.`),
328
+ ],
329
+ };
330
+ }
331
+ const platformList = result.platforms
332
+ .map((p, i) => {
333
+ const identifiers = [];
334
+ if (p.identifiers?.bundleIds?.length) {
335
+ identifiers.push(`Bundle IDs: ${p.identifiers.bundleIds.join(', ')}`);
336
+ }
337
+ if (p.identifiers?.domains?.length) {
338
+ identifiers.push(`Domains: ${p.identifiers.domains.join(', ')}`);
339
+ }
340
+ const identifiersInfo = identifiers.length > 0 ? `\n ${identifiers.join('\n ')}` : '';
341
+ const tasks = p.related_tasks.length > 0
342
+ ? `\n\n **Tasks (${p.related_tasks.length}):**\n${p.related_tasks.map((t) => ` - **${t.name}** (${t.occurrence_count} time(s)) — ID: ${t.id}`).join('\n')}`
343
+ : '';
344
+ return `${i + 1}. **${p.name}** (${p.type})${identifiersInfo}
345
+ First seen: ${new Date(p.first_seen).toLocaleDateString()} | Last seen: ${new Date(p.last_seen).toLocaleDateString()} | Workflows: ${p.workflow_count}
346
+
347
+ **Knowledge:**
348
+ ${p.knowledge}${tasks}`;
349
+ })
350
+ .join('\n\n');
351
+ return {
352
+ content: [
353
+ textContent(`Found ${result.total_matches} platform(s) matching "${input.query}":\n\n${platformList}`),
354
+ ],
355
+ };
356
+ }
357
+ catch (error) {
358
+ return { content: [textContent(formatError(error))], isError: true };
359
+ }
360
+ }
361
+ async function handleGetWorkflow(client, args) {
362
+ try {
363
+ const input = getWorkflowSchema.parse(args);
364
+ const result = await client.getWorkflow(input);
365
+ const taskList = result.tasks.length > 0
366
+ ? result.tasks
367
+ .map((task, index) => {
368
+ return `${index + 1}. **${task.name}**
369
+ ID: ${task.id}
370
+ ${task.description}`;
371
+ })
372
+ .join('\n\n')
373
+ : 'No tasks identified in this workflow.';
374
+ return {
375
+ content: [
376
+ textContent(`# ${result.workflow.name}\n\nStatus: ${result.workflow.status} | Captures: ${result.workflow.capture_count} | Analyses: ${result.workflow.analysis_count}\nStarted: ${new Date(result.workflow.started_at).toLocaleDateString()}${result.workflow.ended_at ? ` | Ended: ${new Date(result.workflow.ended_at).toLocaleDateString()}` : ''}\n\nTasks performed (${result.tasks.length}):\n\n${taskList}\n\nUse nimbus_get_task with a task ID to get the full step-by-step playbook with screenshots.`),
377
+ ],
378
+ };
379
+ }
380
+ catch (error) {
381
+ return { content: [textContent(formatError(error))], isError: true };
382
+ }
383
+ }
384
+ async function handleAskUser(client, args) {
385
+ try {
386
+ const input = askUserSchema.parse(args);
387
+ const result = await client.askUser(input);
388
+ return {
389
+ content: [
390
+ textContent(`Question queued successfully!\n\nQuestion ID: ${result.question_id}\nStatus: ${result.status}\n\nThe user will be notified via the Nimbus app. Use nimbus_get_question_status to check for their response.`),
391
+ ],
392
+ };
393
+ }
394
+ catch (error) {
395
+ return { content: [textContent(formatError(error))], isError: true };
396
+ }
397
+ }
398
+ async function handleGetQuestionStatus(client, args) {
399
+ try {
400
+ const input = getQuestionStatusSchema.parse(args);
401
+ const result = await client.getQuestionStatus(input.question_id);
402
+ if (result.status === 'answered') {
403
+ return {
404
+ content: [
405
+ textContent(`**Question:** ${result.question}\n**Status:** Answered\n**Answer:** ${result.answer}\n**Answered at:** ${result.answered_at}`),
406
+ ],
407
+ };
408
+ }
409
+ const statusMessages = {
410
+ pending: 'Waiting for user response...',
411
+ expired: 'Question expired before user responded.',
412
+ dismissed: 'User dismissed the question without answering.',
413
+ };
414
+ return {
415
+ content: [
416
+ textContent(`**Question:** ${result.question}\n**Status:** ${result.status}\n${statusMessages[result.status] || ''}`),
417
+ ],
418
+ };
419
+ }
420
+ catch (error) {
421
+ return { content: [textContent(formatError(error))], isError: true };
422
+ }
423
+ }
424
+ // ============================================================================
425
+ // MAIN
426
+ // ============================================================================
427
+ async function main() {
428
+ // Validate API key
429
+ const apiKey = process.env.NIMBUS_API_KEY;
430
+ if (!apiKey) {
431
+ console.error('Error: NIMBUS_API_KEY environment variable is required');
432
+ console.error('');
433
+ console.error('Get your API key from the Nimbus app:');
434
+ console.error(' Settings -> Account -> MCP API Key');
435
+ console.error('');
436
+ console.error('Then run:');
437
+ console.error(' NIMBUS_API_KEY=your_key nimbus-mcp');
438
+ process.exit(1);
439
+ }
440
+ // Initialize API client
441
+ const client = new NimbusClient(apiKey);
442
+ // Create MCP server
443
+ const server = new Server({
444
+ name: SERVER_NAME,
445
+ version: SERVER_VERSION,
446
+ }, {
447
+ capabilities: {
448
+ tools: {},
449
+ },
450
+ instructions: SERVER_INSTRUCTIONS,
451
+ });
452
+ // Handle tools/list request
453
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
454
+ return { tools: TOOLS };
455
+ });
456
+ // Handle tools/call request
457
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
458
+ const { name, arguments: args } = request.params;
459
+ switch (name) {
460
+ case 'nimbus_search_tasks':
461
+ return handleSearchTasks(client, args);
462
+ case 'nimbus_get_task':
463
+ return handleGetTask(client, args);
464
+ case 'nimbus_search_workflows':
465
+ return handleSearchWorkflows(client, args);
466
+ case 'nimbus_get_workflow':
467
+ return handleGetWorkflow(client, args);
468
+ case 'nimbus_search_platforms':
469
+ return handleSearchPlatforms(client, args);
470
+ case 'nimbus_ask_user':
471
+ return handleAskUser(client, args);
472
+ case 'nimbus_get_question_status':
473
+ return handleGetQuestionStatus(client, args);
474
+ default:
475
+ // Return structured error for unknown tools
476
+ return {
477
+ content: [textContent(`Error: Unknown tool "${name}". Available tools: ${TOOLS.map(t => t.name).join(', ')}`)],
478
+ isError: true,
479
+ };
480
+ }
481
+ });
482
+ // Start server with stdio transport
483
+ const transport = new StdioServerTransport();
484
+ await server.connect(transport);
485
+ // Log to stderr (stdout is for MCP protocol)
486
+ console.error(`Nimbus MCP server v${SERVER_VERSION} started`);
487
+ }
488
+ // Run
489
+ main().catch((error) => {
490
+ console.error('Fatal error:', error);
491
+ process.exit(1);
492
+ });
493
+ //# 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,162 @@
1
+ /**
2
+ * Nimbus MCP Server Types
3
+ *
4
+ * These types match the Nimbus REST API responses.
5
+ */
6
+ export interface NimbusResponse<T> {
7
+ data: T;
8
+ meta?: {
9
+ requestId: string;
10
+ took?: number;
11
+ pagination?: {
12
+ offset: number;
13
+ limit: number;
14
+ total: number;
15
+ };
16
+ };
17
+ }
18
+ export interface NimbusError {
19
+ error: {
20
+ code: string;
21
+ message: string;
22
+ details?: Record<string, unknown>;
23
+ };
24
+ }
25
+ export interface SearchTasksInput {
26
+ query: string;
27
+ platform_filter?: string;
28
+ limit?: number;
29
+ }
30
+ export interface TaskResult {
31
+ id: string;
32
+ name: string;
33
+ description: string;
34
+ confidence: number;
35
+ occurrence_count: number;
36
+ last_performed: string | null;
37
+ platforms: string[];
38
+ }
39
+ export interface SearchTasksOutput {
40
+ tasks: TaskResult[];
41
+ total_matches: number;
42
+ }
43
+ export interface SearchWorkflowsInput {
44
+ query: string;
45
+ limit?: number;
46
+ }
47
+ export interface WorkflowResult {
48
+ id: string;
49
+ name: string;
50
+ status: string;
51
+ started_at: string;
52
+ ended_at: string | null;
53
+ summary: string | null;
54
+ capture_count: number;
55
+ analysis_count: number;
56
+ top_tasks: Array<{
57
+ id: string;
58
+ name: string;
59
+ }>;
60
+ }
61
+ export interface SearchWorkflowsOutput {
62
+ workflows: WorkflowResult[];
63
+ total_matches: number;
64
+ }
65
+ export interface GetTaskInput {
66
+ task_id: string;
67
+ include_executions?: number;
68
+ }
69
+ export interface GetTaskOutput {
70
+ task: {
71
+ id: string;
72
+ name: string;
73
+ description: string;
74
+ confidence: number;
75
+ occurrence_count: number;
76
+ platforms: Array<{
77
+ id: string;
78
+ name: string;
79
+ knowledge: string;
80
+ }>;
81
+ subtasks: Array<{
82
+ id: string;
83
+ name: string;
84
+ description: string;
85
+ }>;
86
+ };
87
+ recent_executions: Array<{
88
+ id: string;
89
+ performed_at: string;
90
+ context: string;
91
+ steps: Array<{
92
+ position: number;
93
+ description: string;
94
+ screenshot_url: string | null;
95
+ }>;
96
+ }>;
97
+ }
98
+ export interface SearchPlatformsInput {
99
+ query: string;
100
+ limit?: number;
101
+ }
102
+ export interface PlatformResult {
103
+ id: string;
104
+ name: string;
105
+ type: string;
106
+ identifiers: {
107
+ bundleIds?: string[];
108
+ domains?: string[];
109
+ };
110
+ knowledge: string;
111
+ workflow_count: number;
112
+ first_seen: string;
113
+ last_seen: string;
114
+ related_tasks: Array<{
115
+ id: string;
116
+ name: string;
117
+ occurrence_count: number;
118
+ }>;
119
+ }
120
+ export interface SearchPlatformsOutput {
121
+ platforms: PlatformResult[];
122
+ total_matches: number;
123
+ }
124
+ export interface GetWorkflowInput {
125
+ workflow_id: string;
126
+ }
127
+ export interface GetWorkflowOutput {
128
+ workflow: {
129
+ id: string;
130
+ name: string;
131
+ status: string;
132
+ started_at: string;
133
+ ended_at: string | null;
134
+ summary: string | null;
135
+ capture_count: number;
136
+ analysis_count: number;
137
+ };
138
+ tasks: Array<{
139
+ id: string;
140
+ name: string;
141
+ description: string;
142
+ }>;
143
+ }
144
+ export interface AskUserInput {
145
+ question: string;
146
+ context?: string;
147
+ suggested_answers?: string[];
148
+ }
149
+ export interface AskUserOutput {
150
+ question_id: string;
151
+ status: 'queued';
152
+ }
153
+ export interface QuestionStatus {
154
+ question_id: string;
155
+ question: string;
156
+ status: 'pending' | 'answered' | 'expired' | 'dismissed';
157
+ answer: string | null;
158
+ answered_at: string | null;
159
+ created_at: string;
160
+ expires_at: string | null;
161
+ }
162
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Nimbus MCP Server Types
3
+ *
4
+ * These types match the Nimbus REST API responses.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@nimbus-app/mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for Nimbus - Access your workflow memory from Claude",
5
+ "author": "Nimbus <support@nimbusai.cloud>",
6
+ "license": "UNLICENSED",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/nimbus-app/nimbus.git",
10
+ "directory": "packages/mcp-server"
11
+ },
12
+ "homepage": "https://nimbusai.cloud/docs/mcp",
13
+ "bugs": {
14
+ "url": "https://github.com/nimbus-app/nimbus/issues"
15
+ },
16
+ "keywords": [
17
+ "mcp",
18
+ "model-context-protocol",
19
+ "claude",
20
+ "ai",
21
+ "workflow",
22
+ "automation",
23
+ "nimbus"
24
+ ],
25
+ "type": "module",
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "bin": {
29
+ "nimbus-mcp": "./dist/index.js"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md"
34
+ ],
35
+ "scripts": {
36
+ "build": "tsc",
37
+ "dev": "tsc --watch",
38
+ "start": "node dist/index.js",
39
+ "prepublishOnly": "npm run build",
40
+ "typecheck": "tsc --noEmit"
41
+ },
42
+ "dependencies": {
43
+ "@modelcontextprotocol/sdk": "^1.26.0",
44
+ "node-fetch": "^3.3.2",
45
+ "zod": "^3.24.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^20.11.0",
49
+ "typescript": "^5.3.0"
50
+ },
51
+ "engines": {
52
+ "node": ">=18.0.0"
53
+ }
54
+ }