basecamp-mcp 1.0.1 → 1.0.2
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 +4 -4
- package/dist/tools/todos.d.ts.map +1 -1
- package/dist/tools/todos.js +101 -5
- package/dist/tools/todos.js.map +1 -1
- package/dist/utils/contentOperations.d.ts +1 -1
- package/dist/utils/contentOperations.d.ts.map +1 -1
- package/dist/utils/contentOperations.js +7 -2
- package/dist/utils/contentOperations.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ The baseline setup applies across most tools:
|
|
|
15
15
|
"mcpServers": {
|
|
16
16
|
"basecamp": {
|
|
17
17
|
"command": "npx",
|
|
18
|
-
"args": ["-y", "
|
|
18
|
+
"args": ["-y", "basecamp-mcp@latest"],
|
|
19
19
|
"env": {
|
|
20
20
|
"BASECAMP_CLIENT_ID": "your_client_id",
|
|
21
21
|
"BASECAMP_CLIENT_SECRET": "your_client_secret",
|
|
@@ -32,7 +32,7 @@ The baseline setup applies across most tools:
|
|
|
32
32
|
|
|
33
33
|
**Claude Code CLI:**
|
|
34
34
|
```bash
|
|
35
|
-
claude mcp add basecamp npx
|
|
35
|
+
claude mcp add basecamp npx basecamp-mcp@latest \
|
|
36
36
|
-e BASECAMP_CLIENT_ID=your_client_id \
|
|
37
37
|
-e BASECAMP_CLIENT_SECRET=your_client_secret \
|
|
38
38
|
-e BASECAMP_REFRESH_TOKEN=your_refresh_token \
|
|
@@ -46,7 +46,7 @@ claude mcp add basecamp npx @basecamp/mcp@latest \
|
|
|
46
46
|
|
|
47
47
|
**VS Code:** One-click installation provided, or use the CLI:
|
|
48
48
|
```bash
|
|
49
|
-
code --add-mcp '{"name":"basecamp","command":"npx","args":["-y", "
|
|
49
|
+
code --add-mcp '{"name":"basecamp","command":"npx","args":["-y", "basecamp-mcp@latest"]}'
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
**Gemini CLI & Windsurf:** Refer to their respective documentation; use the standard config template.
|
|
@@ -68,7 +68,7 @@ The server requires the following environment variables:
|
|
|
68
68
|
"mcpServers": {
|
|
69
69
|
"basecamp": {
|
|
70
70
|
"command": "npx",
|
|
71
|
-
"args": ["-y", "
|
|
71
|
+
"args": ["-y", "basecamp-mcp@latest"],
|
|
72
72
|
"env": {
|
|
73
73
|
"BASECAMP_CLIENT_ID": "your_client_id",
|
|
74
74
|
"BASECAMP_CLIENT_SECRET": "your_client_secret",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"todos.d.ts","sourceRoot":"","sources":["../../src/tools/todos.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"todos.d.ts","sourceRoot":"","sources":["../../src/tools/todos.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwWzD"}
|
package/dist/tools/todos.js
CHANGED
|
@@ -5,8 +5,9 @@ import { asyncPagedToArray } from "basecamp-client";
|
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { BasecampIdSchema } from "../schemas/common.js";
|
|
7
7
|
import { initializeBasecampClient } from "../utils/auth.js";
|
|
8
|
-
import { htmlRules } from "../utils/contentOperations.js";
|
|
8
|
+
import { applyContentOperations, ContentOperationFields, htmlRules, validateContentOperations, } from "../utils/contentOperations.js";
|
|
9
9
|
import { handleBasecampError } from "../utils/errorHandlers.js";
|
|
10
|
+
import { serializePerson } from "../utils/serializers.js";
|
|
10
11
|
export function registerTodoTools(server) {
|
|
11
12
|
server.registerTool("basecamp_get_todoset", {
|
|
12
13
|
title: "Get Basecamp Todo Set",
|
|
@@ -104,8 +105,9 @@ export function registerTodoTools(server) {
|
|
|
104
105
|
count: todos.length,
|
|
105
106
|
todos: todos.map((t) => ({
|
|
106
107
|
id: t.id,
|
|
107
|
-
|
|
108
|
+
title: t.content,
|
|
108
109
|
completed: t.completed,
|
|
110
|
+
assignees: t.assignees.map(serializePerson),
|
|
109
111
|
})),
|
|
110
112
|
}, null, 2),
|
|
111
113
|
},
|
|
@@ -124,8 +126,12 @@ export function registerTodoTools(server) {
|
|
|
124
126
|
inputSchema: {
|
|
125
127
|
bucket_id: BasecampIdSchema,
|
|
126
128
|
todolist_id: BasecampIdSchema,
|
|
127
|
-
|
|
128
|
-
|
|
129
|
+
title: z.string().min(1),
|
|
130
|
+
content: z.string().optional(),
|
|
131
|
+
assignee_ids: z
|
|
132
|
+
.array(BasecampIdSchema)
|
|
133
|
+
.optional()
|
|
134
|
+
.describe("Array of person IDs to assign to this todo"),
|
|
129
135
|
},
|
|
130
136
|
annotations: {
|
|
131
137
|
readOnlyHint: false,
|
|
@@ -141,7 +147,11 @@ export function registerTodoTools(server) {
|
|
|
141
147
|
bucketId: params.bucket_id,
|
|
142
148
|
todolistId: params.todolist_id,
|
|
143
149
|
},
|
|
144
|
-
body: {
|
|
150
|
+
body: {
|
|
151
|
+
content: params.title,
|
|
152
|
+
description: params.content,
|
|
153
|
+
assignee_ids: params.assignee_ids,
|
|
154
|
+
},
|
|
145
155
|
});
|
|
146
156
|
if (response.status !== 201 || !response.body) {
|
|
147
157
|
throw new Error("Failed to create todo");
|
|
@@ -219,5 +229,91 @@ export function registerTodoTools(server) {
|
|
|
219
229
|
};
|
|
220
230
|
}
|
|
221
231
|
});
|
|
232
|
+
server.registerTool("basecamp_update_todo", {
|
|
233
|
+
title: "Update Basecamp Todo",
|
|
234
|
+
description: `Update a todo item. Use partial content operations when possible to save on token usage. ${htmlRules}`,
|
|
235
|
+
inputSchema: {
|
|
236
|
+
bucket_id: BasecampIdSchema,
|
|
237
|
+
todo_id: BasecampIdSchema,
|
|
238
|
+
title: z.string().optional().describe("New todo title"),
|
|
239
|
+
assignee_ids: z
|
|
240
|
+
.array(BasecampIdSchema)
|
|
241
|
+
.optional()
|
|
242
|
+
.describe("Array of person IDs to assign to this todo"),
|
|
243
|
+
...ContentOperationFields,
|
|
244
|
+
},
|
|
245
|
+
annotations: {
|
|
246
|
+
readOnlyHint: false,
|
|
247
|
+
destructiveHint: false,
|
|
248
|
+
idempotentHint: true,
|
|
249
|
+
openWorldHint: true,
|
|
250
|
+
},
|
|
251
|
+
}, async (params) => {
|
|
252
|
+
try {
|
|
253
|
+
// Validate at least one operation is provided
|
|
254
|
+
validateContentOperations(params, ["title", "assignee_ids"]);
|
|
255
|
+
const client = await initializeBasecampClient();
|
|
256
|
+
// Fetch current todo to get existing values
|
|
257
|
+
const currentResponse = await client.todos.get({
|
|
258
|
+
params: {
|
|
259
|
+
bucketId: params.bucket_id,
|
|
260
|
+
todoId: params.todo_id,
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
if (currentResponse.status !== 200 || !currentResponse.body) {
|
|
264
|
+
throw new Error(`Failed to fetch current todo: ${currentResponse.status}`);
|
|
265
|
+
}
|
|
266
|
+
// Determine final title (maps to Basecamp's content field)
|
|
267
|
+
const finalTitle = params.title ?? currentResponse.body.content;
|
|
268
|
+
// Determine final content (maps to Basecamp's description field)
|
|
269
|
+
let finalContent;
|
|
270
|
+
const hasPartialOps = params.content_append ||
|
|
271
|
+
params.content_prepend ||
|
|
272
|
+
params.search_replace;
|
|
273
|
+
if (hasPartialOps) {
|
|
274
|
+
const currentContent = currentResponse.body.description || "";
|
|
275
|
+
const result = applyContentOperations(currentContent, params);
|
|
276
|
+
if (result === undefined) {
|
|
277
|
+
throw new Error("Content operations resulted in undefined content");
|
|
278
|
+
}
|
|
279
|
+
finalContent = result;
|
|
280
|
+
}
|
|
281
|
+
else if (params.content !== undefined) {
|
|
282
|
+
// Full content replacement
|
|
283
|
+
finalContent = params.content;
|
|
284
|
+
}
|
|
285
|
+
const response = await client.todos.update({
|
|
286
|
+
params: {
|
|
287
|
+
bucketId: params.bucket_id,
|
|
288
|
+
todoId: params.todo_id,
|
|
289
|
+
},
|
|
290
|
+
body: {
|
|
291
|
+
content: finalTitle,
|
|
292
|
+
...(finalContent !== undefined
|
|
293
|
+
? { description: finalContent }
|
|
294
|
+
: {}),
|
|
295
|
+
...(params.assignee_ids !== undefined
|
|
296
|
+
? { assignee_ids: params.assignee_ids }
|
|
297
|
+
: {}),
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
if (response.status !== 200 || !response.body) {
|
|
301
|
+
throw new Error("Failed to update todo");
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
content: [
|
|
305
|
+
{
|
|
306
|
+
type: "text",
|
|
307
|
+
text: `Todo updated!\n\nID: ${response.body.id}\nContent: ${response.body.content}`,
|
|
308
|
+
},
|
|
309
|
+
],
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
return {
|
|
314
|
+
content: [{ type: "text", text: handleBasecampError(error) }],
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
});
|
|
222
318
|
}
|
|
223
319
|
//# sourceMappingURL=todos.js.map
|
package/dist/tools/todos.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"todos.js","sourceRoot":"","sources":["../../src/tools/todos.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"todos.js","sourceRoot":"","sources":["../../src/tools/todos.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Used by messages, comments, and other content-based tools
|
|
4
4
|
*/
|
|
5
5
|
import { z } from "zod";
|
|
6
|
-
export declare const htmlRules = "\n\nHTML rules for content:\n\n* Allowed tags: div, h1, br, strong, em, strike, a (with an href attribute), pre, ol, ul, li, blockquote, bc-attachment (with sgid attribute).\n* Try to be semantic despite the limitations of tags. Use double <br>
|
|
6
|
+
export declare const htmlRules = "\n\nHTML rules for content:\n\n* Allowed tags: div, span, h1, br, strong, em, strike, a (with an href attribute), pre, ol, ul, li, blockquote, bc-attachment (with sgid attribute).\n* Try to be semantic despite the limitations of tags. Use double <br> to create paragraph spacing\n* To mention people: <bc-attachment sgid=\"{ person.attachable_sgid }\"></bc-attachment>\n* To consume less tokens, existing <bc-attachment> tags can be rewritten by dropping any attributes/inner content and just leave the \"sgid\" and \"caption\" attributes, without loosing any information\n* You can highlight parts of the content in this format <span style=\"background-color: rgb(...);\">...</span> valid colors are:\n * red: 255, 229, 229\n * yellow: 250, 247, 133\n * green: 228, 248, 226\n";
|
|
7
7
|
/**
|
|
8
8
|
* Shared Zod schema for content operation fields
|
|
9
9
|
* These fields can be composed into tool-specific schemas
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentOperations.d.ts","sourceRoot":"","sources":["../../src/utils/contentOperations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"contentOperations.d.ts","sourceRoot":"","sources":["../../src/utils/contentOperations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,SAAS,ixBAYrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;CAgClC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,sBAAsB,GACjC,MAAM,GAAG,SAAS,CAkDpB;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,sBAAsB,EAClC,gBAAgB,GAAE,MAAM,EAAO,GAC9B,IAAI,CAmBN"}
|
|
@@ -7,9 +7,14 @@ export const htmlRules = `
|
|
|
7
7
|
|
|
8
8
|
HTML rules for content:
|
|
9
9
|
|
|
10
|
-
* Allowed tags: div, h1, br, strong, em, strike, a (with an href attribute), pre, ol, ul, li, blockquote, bc-attachment (with sgid attribute).
|
|
11
|
-
* Try to be semantic despite the limitations of tags. Use double <br>
|
|
10
|
+
* Allowed tags: div, span, h1, br, strong, em, strike, a (with an href attribute), pre, ol, ul, li, blockquote, bc-attachment (with sgid attribute).
|
|
11
|
+
* Try to be semantic despite the limitations of tags. Use double <br> to create paragraph spacing
|
|
12
12
|
* To mention people: <bc-attachment sgid="{ person.attachable_sgid }"></bc-attachment>
|
|
13
|
+
* To consume less tokens, existing <bc-attachment> tags can be rewritten by dropping any attributes/inner content and just leave the "sgid" and "caption" attributes, without loosing any information
|
|
14
|
+
* You can highlight parts of the content in this format <span style="background-color: rgb(...);">...</span> valid colors are:
|
|
15
|
+
* red: 255, 229, 229
|
|
16
|
+
* yellow: 250, 247, 133
|
|
17
|
+
* green: 228, 248, 226
|
|
13
18
|
`;
|
|
14
19
|
/**
|
|
15
20
|
* Shared Zod schema for content operation fields
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentOperations.js","sourceRoot":"","sources":["../../src/utils/contentOperations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,SAAS,GAAG
|
|
1
|
+
{"version":3,"file":"contentOperations.js","sourceRoot":"","sources":["../../src/utils/contentOperations.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "basecamp-mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Model Context Protocol (MCP) server for Basecamp integration. Enables LLMs to interact with Basecamp projects, messages, todos, comments, people, and kanban boards.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|