basecamp-mcp 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +155 -0
  2. package/dist/constants.d.ts +14 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +14 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/index.d.ts +20 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +71 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/schemas/common.d.ts +13 -0
  11. package/dist/schemas/common.d.ts.map +1 -0
  12. package/dist/schemas/common.js +19 -0
  13. package/dist/schemas/common.js.map +1 -0
  14. package/dist/tools/comments.d.ts +7 -0
  15. package/dist/tools/comments.d.ts.map +1 -0
  16. package/dist/tools/comments.js +179 -0
  17. package/dist/tools/comments.js.map +1 -0
  18. package/dist/tools/kanban.d.ts +6 -0
  19. package/dist/tools/kanban.d.ts.map +1 -0
  20. package/dist/tools/kanban.js +390 -0
  21. package/dist/tools/kanban.js.map +1 -0
  22. package/dist/tools/messages.d.ts +8 -0
  23. package/dist/tools/messages.d.ts.map +1 -0
  24. package/dist/tools/messages.js +300 -0
  25. package/dist/tools/messages.js.map +1 -0
  26. package/dist/tools/people.d.ts +6 -0
  27. package/dist/tools/people.d.ts.map +1 -0
  28. package/dist/tools/people.js +142 -0
  29. package/dist/tools/people.js.map +1 -0
  30. package/dist/tools/projects.d.ts +11 -0
  31. package/dist/tools/projects.d.ts.map +1 -0
  32. package/dist/tools/projects.js +116 -0
  33. package/dist/tools/projects.js.map +1 -0
  34. package/dist/tools/todos.d.ts +6 -0
  35. package/dist/tools/todos.d.ts.map +1 -0
  36. package/dist/tools/todos.js +223 -0
  37. package/dist/tools/todos.js.map +1 -0
  38. package/dist/types.d.ts +27 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +5 -0
  41. package/dist/types.js.map +1 -0
  42. package/dist/utils/auth.d.ts +24 -0
  43. package/dist/utils/auth.d.ts.map +1 -0
  44. package/dist/utils/auth.js +62 -0
  45. package/dist/utils/auth.js.map +1 -0
  46. package/dist/utils/contentOperations.d.ts +55 -0
  47. package/dist/utils/contentOperations.d.ts.map +1 -0
  48. package/dist/utils/contentOperations.js +109 -0
  49. package/dist/utils/contentOperations.js.map +1 -0
  50. package/dist/utils/errorHandlers.d.ts +11 -0
  51. package/dist/utils/errorHandlers.d.ts.map +1 -0
  52. package/dist/utils/errorHandlers.js +87 -0
  53. package/dist/utils/errorHandlers.js.map +1 -0
  54. package/dist/utils/serializers.d.ts +27 -0
  55. package/dist/utils/serializers.d.ts.map +1 -0
  56. package/dist/utils/serializers.js +19 -0
  57. package/dist/utils/serializers.js.map +1 -0
  58. package/package.json +65 -0
@@ -0,0 +1,390 @@
1
+ /**
2
+ * Kanban tools for Basecamp MCP server (cards, columns, steps)
3
+ */
4
+ import { asyncPagedToArray } from "basecamp-client";
5
+ import { z } from "zod";
6
+ import { BasecampIdSchema } from "../schemas/common.js";
7
+ import { initializeBasecampClient } from "../utils/auth.js";
8
+ import { applyContentOperations, ContentOperationFields, htmlRules, validateContentOperations, } from "../utils/contentOperations.js";
9
+ import { handleBasecampError } from "../utils/errorHandlers.js";
10
+ import { serializePerson } from "../utils/serializers.js";
11
+ export function registerKanbanTools(server) {
12
+ server.registerTool("basecamp_list_kanban_columns", {
13
+ title: "List Kanban Columns",
14
+ description: "List all columns in a kanban board.",
15
+ inputSchema: {
16
+ bucket_id: BasecampIdSchema,
17
+ card_table_id: BasecampIdSchema,
18
+ },
19
+ annotations: {
20
+ readOnlyHint: true,
21
+ destructiveHint: false,
22
+ idempotentHint: true,
23
+ openWorldHint: true,
24
+ },
25
+ }, async (params) => {
26
+ try {
27
+ const client = await initializeBasecampClient();
28
+ const response = await client.cardTables.get({
29
+ params: {
30
+ bucketId: params.bucket_id,
31
+ cardTableId: params.card_table_id,
32
+ },
33
+ });
34
+ if (response.status !== 200 || !response.body) {
35
+ throw new Error("Failed to fetch card table");
36
+ }
37
+ const columns = response.body.lists || [];
38
+ return {
39
+ content: [
40
+ {
41
+ type: "text",
42
+ text: JSON.stringify(columns.map((col) => ({
43
+ id: col.id,
44
+ title: col.title,
45
+ position: col.position,
46
+ cards_count: col.cards_count,
47
+ type: col.type,
48
+ description: col.description,
49
+ })), null, 2),
50
+ },
51
+ ],
52
+ };
53
+ }
54
+ catch (error) {
55
+ return {
56
+ content: [{ type: "text", text: handleBasecampError(error) }],
57
+ };
58
+ }
59
+ });
60
+ server.registerTool("basecamp_list_kanban_cards", {
61
+ title: "List Kanban Cards",
62
+ description: "List cards in a kanban column.",
63
+ inputSchema: {
64
+ bucket_id: BasecampIdSchema,
65
+ column_id: BasecampIdSchema,
66
+ },
67
+ annotations: {
68
+ readOnlyHint: true,
69
+ destructiveHint: false,
70
+ idempotentHint: true,
71
+ openWorldHint: true,
72
+ },
73
+ }, async (params) => {
74
+ try {
75
+ const client = await initializeBasecampClient();
76
+ const cards = await asyncPagedToArray({
77
+ fetchPage: client.cardTableCards.list,
78
+ request: {
79
+ params: { bucketId: params.bucket_id, columnId: params.column_id },
80
+ query: {},
81
+ },
82
+ });
83
+ return {
84
+ content: [
85
+ {
86
+ type: "text",
87
+ text: JSON.stringify(cards.map((c) => ({
88
+ id: c.id,
89
+ title: c.title,
90
+ due_on: c.due_on,
91
+ url: c.app_url,
92
+ comments_count: c.comments_count,
93
+ created_at: c.created_at,
94
+ creator: serializePerson(c.creator),
95
+ assignees: c.assignees.map(serializePerson),
96
+ steps: c.steps?.map((s) => ({
97
+ title: s.title,
98
+ completed: s.completed,
99
+ })),
100
+ })), null, 2),
101
+ },
102
+ ],
103
+ };
104
+ }
105
+ catch (error) {
106
+ return {
107
+ content: [{ type: "text", text: handleBasecampError(error) }],
108
+ };
109
+ }
110
+ });
111
+ server.registerTool("basecamp_get_kanban_card", {
112
+ title: "Get Kanban Card",
113
+ description: "Get all details of a specific kanban card.",
114
+ inputSchema: {
115
+ bucket_id: BasecampIdSchema,
116
+ card_id: BasecampIdSchema,
117
+ },
118
+ annotations: {
119
+ readOnlyHint: true,
120
+ destructiveHint: false,
121
+ idempotentHint: true,
122
+ openWorldHint: true,
123
+ },
124
+ }, async (params) => {
125
+ try {
126
+ const client = await initializeBasecampClient();
127
+ const response = await client.cardTableCards.get({
128
+ params: {
129
+ bucketId: params.bucket_id,
130
+ cardId: params.card_id,
131
+ },
132
+ });
133
+ if (response.status !== 200 || !response.body) {
134
+ throw new Error("Failed to fetch card");
135
+ }
136
+ const card = response.body;
137
+ return {
138
+ content: [
139
+ {
140
+ type: "text",
141
+ text: JSON.stringify({
142
+ id: card.id,
143
+ title: card.title,
144
+ content: card.content,
145
+ due_on: card.due_on,
146
+ url: card.app_url,
147
+ comments_count: card.comments_count,
148
+ created_at: card.created_at,
149
+ updated_at: card.updated_at,
150
+ creator: serializePerson(card.creator),
151
+ assignees: card.assignees.map(serializePerson),
152
+ steps: card.steps?.map((s) => ({
153
+ id: s.id,
154
+ title: s.title,
155
+ completed: s.completed,
156
+ })),
157
+ }, null, 2),
158
+ },
159
+ ],
160
+ };
161
+ }
162
+ catch (error) {
163
+ return {
164
+ content: [{ type: "text", text: handleBasecampError(error) }],
165
+ };
166
+ }
167
+ });
168
+ server.registerTool("basecamp_create_kanban_card", {
169
+ title: "Create Kanban Card",
170
+ description: `Create a new card in a kanban column. ${htmlRules}`,
171
+ inputSchema: {
172
+ bucket_id: BasecampIdSchema,
173
+ column_id: BasecampIdSchema,
174
+ title: z.string().min(1),
175
+ content: z.string().optional(),
176
+ },
177
+ annotations: {
178
+ readOnlyHint: false,
179
+ destructiveHint: false,
180
+ idempotentHint: false,
181
+ openWorldHint: true,
182
+ },
183
+ }, async (params) => {
184
+ try {
185
+ const client = await initializeBasecampClient();
186
+ const response = await client.cardTableCards.create({
187
+ params: { bucketId: params.bucket_id, columnId: params.column_id },
188
+ body: { title: params.title, content: params.content },
189
+ });
190
+ if (response.status !== 201 || !response.body) {
191
+ throw new Error("Failed to create card");
192
+ }
193
+ return {
194
+ content: [
195
+ {
196
+ type: "text",
197
+ text: `Card created!\n\nID: ${response.body.id}\nTitle: ${response.body.title}`,
198
+ },
199
+ ],
200
+ };
201
+ }
202
+ catch (error) {
203
+ return {
204
+ content: [{ type: "text", text: handleBasecampError(error) }],
205
+ };
206
+ }
207
+ });
208
+ server.registerTool("basecamp_update_kanban_card", {
209
+ title: "Update Kanban Card",
210
+ description: `Update a kanban card. At least one field (title, content, or partial content operations) must be provided. Use partial content operations when possible to save on token usage. ${htmlRules}`,
211
+ inputSchema: {
212
+ bucket_id: BasecampIdSchema,
213
+ card_id: BasecampIdSchema,
214
+ title: z.string().min(1).optional().describe("New card title"),
215
+ ...ContentOperationFields,
216
+ due_on: z
217
+ .string()
218
+ .optional()
219
+ .describe("Due date (YYYY-MM-DD format) or null to clear"),
220
+ notify: z
221
+ .boolean()
222
+ .optional()
223
+ .describe("Whether to notify assignees of the update"),
224
+ assignee_ids: z
225
+ .array(z.number())
226
+ .optional()
227
+ .describe("Array of user IDs to assign to the card"),
228
+ },
229
+ annotations: {
230
+ readOnlyHint: false,
231
+ destructiveHint: false,
232
+ idempotentHint: false,
233
+ openWorldHint: true,
234
+ },
235
+ }, async (params) => {
236
+ try {
237
+ // Validate at least one operation is provided
238
+ validateContentOperations(params, [
239
+ "title",
240
+ "due_on",
241
+ "notify",
242
+ "assignee_ids",
243
+ ]);
244
+ const client = await initializeBasecampClient();
245
+ let finalContent;
246
+ // Check if we need to fetch current content for partial operations
247
+ const hasPartialOps = params.content_append ||
248
+ params.content_prepend ||
249
+ params.search_replace;
250
+ if (hasPartialOps || params.content !== undefined) {
251
+ // Fetch current card if needed for partial operations
252
+ if (hasPartialOps) {
253
+ const currentResponse = await client.cardTableCards.get({
254
+ params: {
255
+ bucketId: params.bucket_id,
256
+ cardId: params.card_id,
257
+ },
258
+ });
259
+ if (currentResponse.status !== 200 || !currentResponse.body) {
260
+ throw new Error(`Failed to fetch current card: ${currentResponse.status}`);
261
+ }
262
+ const currentContent = currentResponse.body.content || "";
263
+ finalContent = applyContentOperations(currentContent, params);
264
+ }
265
+ else {
266
+ // Full content replacement
267
+ finalContent = params.content;
268
+ }
269
+ }
270
+ const response = await client.cardTableCards.update({
271
+ params: { bucketId: params.bucket_id, cardId: params.card_id },
272
+ body: {
273
+ ...(params.title ? { title: params.title } : {}),
274
+ ...(finalContent !== undefined ? { content: finalContent } : {}),
275
+ ...(params.due_on !== undefined ? { due_on: params.due_on } : {}),
276
+ ...(params.notify !== undefined ? { notify: params.notify } : {}),
277
+ ...(params.assignee_ids !== undefined
278
+ ? { assignee_ids: params.assignee_ids }
279
+ : {}),
280
+ },
281
+ });
282
+ if (response.status !== 200 || !response.body) {
283
+ throw new Error("Failed to update card");
284
+ }
285
+ return {
286
+ content: [
287
+ {
288
+ type: "text",
289
+ text: `Card updated successfully!\n\nID: ${response.body.id}\nTitle: ${response.body.title}`,
290
+ },
291
+ ],
292
+ };
293
+ }
294
+ catch (error) {
295
+ return {
296
+ content: [{ type: "text", text: handleBasecampError(error) }],
297
+ };
298
+ }
299
+ });
300
+ server.registerTool("basecamp_move_kanban_card", {
301
+ title: "Move Kanban Card",
302
+ description: "Move a kanban card to a different column and/or position within that column.",
303
+ inputSchema: {
304
+ bucket_id: BasecampIdSchema,
305
+ card_id: BasecampIdSchema,
306
+ column_id: BasecampIdSchema,
307
+ position: z
308
+ .number()
309
+ .int()
310
+ .nonnegative()
311
+ .optional()
312
+ .describe("Position within the destination column (zero-indexed). If not specified, card will be added to the end of the column."),
313
+ },
314
+ annotations: {
315
+ readOnlyHint: false,
316
+ destructiveHint: false,
317
+ idempotentHint: false,
318
+ openWorldHint: true,
319
+ },
320
+ }, async (params) => {
321
+ try {
322
+ const client = await initializeBasecampClient();
323
+ const response = await client.cardTableCards.move({
324
+ params: { bucketId: params.bucket_id, cardId: params.card_id },
325
+ body: {
326
+ column_id: params.column_id,
327
+ ...(params.position !== undefined
328
+ ? { position: params.position }
329
+ : {}),
330
+ },
331
+ });
332
+ if (response.status !== 204) {
333
+ throw new Error("Failed to move card");
334
+ }
335
+ return {
336
+ content: [
337
+ {
338
+ type: "text",
339
+ text: `Card moved successfully to column ${params.column_id}${params.position !== undefined ? ` at position ${params.position}` : ""}!`,
340
+ },
341
+ ],
342
+ };
343
+ }
344
+ catch (error) {
345
+ return {
346
+ content: [{ type: "text", text: handleBasecampError(error) }],
347
+ };
348
+ }
349
+ });
350
+ server.registerTool("basecamp_create_kanban_step", {
351
+ title: "Create Kanban Step",
352
+ description: "Add a checklist step to a kanban card.",
353
+ inputSchema: {
354
+ bucket_id: BasecampIdSchema,
355
+ card_id: BasecampIdSchema,
356
+ title: z.string().min(1),
357
+ },
358
+ annotations: {
359
+ readOnlyHint: false,
360
+ destructiveHint: false,
361
+ idempotentHint: false,
362
+ openWorldHint: true,
363
+ },
364
+ }, async (params) => {
365
+ try {
366
+ const client = await initializeBasecampClient();
367
+ const response = await client.cardTableSteps.create({
368
+ params: { bucketId: params.bucket_id, cardId: params.card_id },
369
+ body: { title: params.title },
370
+ });
371
+ if (response.status !== 201 || !response.body) {
372
+ throw new Error("Failed to create step");
373
+ }
374
+ return {
375
+ content: [
376
+ {
377
+ type: "text",
378
+ text: `Step created!\n\nID: ${response.body.id}\nTitle: ${response.body.title}`,
379
+ },
380
+ ],
381
+ };
382
+ }
383
+ catch (error) {
384
+ return {
385
+ content: [{ type: "text", text: handleBasecampError(error) }],
386
+ };
387
+ }
388
+ });
389
+ }
390
+ //# sourceMappingURL=kanban.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kanban.js","sourceRoot":"","sources":["../../src/tools/kanban.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Message Board tools for Basecamp MCP server
3
+ *
4
+ * Includes special patch support for updating messages without passing full content
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ export declare function registerMessageTools(server: McpServer): void;
8
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/tools/messages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4V5D"}