basecamp-mcp 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/index.d.ts +7 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +16 -7
  4. package/dist/index.js.map +1 -1
  5. package/dist/tools/activity.d.ts +6 -4
  6. package/dist/tools/activity.d.ts.map +1 -1
  7. package/dist/tools/activity.js +13 -285
  8. package/dist/tools/activity.js.map +1 -1
  9. package/dist/tools/auth.d.ts.map +1 -1
  10. package/dist/tools/auth.js +5 -11
  11. package/dist/tools/auth.js.map +1 -1
  12. package/dist/tools/campfires.d.ts +13 -0
  13. package/dist/tools/campfires.d.ts.map +1 -0
  14. package/dist/tools/campfires.js +221 -0
  15. package/dist/tools/campfires.js.map +1 -0
  16. package/dist/tools/checkins.d.ts.map +1 -1
  17. package/dist/tools/checkins.js +10 -74
  18. package/dist/tools/checkins.js.map +1 -1
  19. package/dist/tools/comments.d.ts.map +1 -1
  20. package/dist/tools/comments.js +9 -44
  21. package/dist/tools/comments.js.map +1 -1
  22. package/dist/tools/files.d.ts +21 -0
  23. package/dist/tools/files.d.ts.map +1 -0
  24. package/dist/tools/files.js +659 -0
  25. package/dist/tools/files.js.map +1 -0
  26. package/dist/tools/kanban.d.ts.map +1 -1
  27. package/dist/tools/kanban.js +78 -137
  28. package/dist/tools/kanban.js.map +1 -1
  29. package/dist/tools/messages.d.ts.map +1 -1
  30. package/dist/tools/messages.js +31 -71
  31. package/dist/tools/messages.js.map +1 -1
  32. package/dist/tools/people.d.ts.map +1 -1
  33. package/dist/tools/people.js +5 -19
  34. package/dist/tools/people.js.map +1 -1
  35. package/dist/tools/projects.d.ts.map +1 -1
  36. package/dist/tools/projects.js +4 -16
  37. package/dist/tools/projects.js.map +1 -1
  38. package/dist/tools/todos.d.ts.map +1 -1
  39. package/dist/tools/todos.js +60 -84
  40. package/dist/tools/todos.js.map +1 -1
  41. package/dist/utils/auth.d.ts +7 -2
  42. package/dist/utils/auth.d.ts.map +1 -1
  43. package/dist/utils/auth.js +19 -11
  44. package/dist/utils/auth.js.map +1 -1
  45. package/dist/utils/contentOperations.d.ts +2 -2
  46. package/dist/utils/credentials.d.ts.map +1 -1
  47. package/dist/utils/credentials.js.map +1 -1
  48. package/dist/utils/errorHandlers.d.ts.map +1 -1
  49. package/dist/utils/errorHandlers.js +53 -29
  50. package/dist/utils/errorHandlers.js.map +1 -1
  51. package/dist/utils/oauth.d.ts +1 -0
  52. package/dist/utils/oauth.d.ts.map +1 -1
  53. package/dist/utils/oauth.js +18 -0
  54. package/dist/utils/oauth.js.map +1 -1
  55. package/dist/utils/pagination.d.ts +43 -0
  56. package/dist/utils/pagination.d.ts.map +1 -0
  57. package/dist/utils/pagination.js +72 -0
  58. package/dist/utils/pagination.js.map +1 -0
  59. package/dist/utils/parseSince.d.ts +11 -0
  60. package/dist/utils/parseSince.d.ts.map +1 -0
  61. package/dist/utils/parseSince.js +48 -0
  62. package/dist/utils/parseSince.js.map +1 -0
  63. package/dist/utils/serializers.d.ts +17 -2
  64. package/dist/utils/serializers.d.ts.map +1 -1
  65. package/dist/utils/serializers.js +16 -0
  66. package/dist/utils/serializers.js.map +1 -1
  67. package/package.json +5 -3
  68. package/dist/tools/documents.d.ts +0 -11
  69. package/dist/tools/documents.d.ts.map +0 -1
  70. package/dist/tools/documents.js +0 -453
  71. package/dist/tools/documents.js.map +0 -1
  72. package/dist/tools/uploads.d.ts +0 -9
  73. package/dist/tools/uploads.d.ts.map +0 -1
  74. package/dist/tools/uploads.js +0 -319
  75. package/dist/tools/uploads.js.map +0 -1
@@ -1,453 +0,0 @@
1
- /**
2
- * Document, Vault & File download tools for Basecamp MCP server
3
- *
4
- * Vaults are folders in Basecamp's "Docs & Files" section.
5
- * Documents are rich-text documents stored inside vaults.
6
- * Uploads are files stored in vaults.
7
- * Blobs are inline attachments embedded in rich text via <bc-attachment> tags.
8
- */
9
- import { asyncPagedToArray } from "basecamp-client";
10
- import { z } from "zod";
11
- import { BasecampIdSchema } from "../schemas/common.js";
12
- import { initializeBasecampClient } from "../utils/auth.js";
13
- import { applyContentOperations, ContentOperationFields, htmlRules, validateContentOperations, } from "../utils/contentOperations.js";
14
- import { handleBasecampError } from "../utils/errorHandlers.js";
15
- import { serializePerson } from "../utils/serializers.js";
16
- export function registerDocumentTools(server) {
17
- // basecamp_list_vaults
18
- server.registerTool("basecamp_list_vaults", {
19
- title: "List Basecamp Vaults",
20
- description: "List sub-vaults (folders) under a parent vault in the Docs & Files section.",
21
- inputSchema: {
22
- bucket_id: BasecampIdSchema.describe("Project/bucket ID"),
23
- parent_vault_id: BasecampIdSchema.describe("Parent vault ID (use the vault ID from the project's dock)"),
24
- filter: z
25
- .string()
26
- .optional()
27
- .describe("Optional regular expression to filter vaults by title"),
28
- },
29
- annotations: {
30
- readOnlyHint: true,
31
- destructiveHint: false,
32
- idempotentHint: true,
33
- openWorldHint: true,
34
- },
35
- }, async (params) => {
36
- try {
37
- const client = await initializeBasecampClient();
38
- const vaults = await asyncPagedToArray({
39
- fetchPage: client.vaults.list,
40
- request: {
41
- params: {
42
- bucketId: params.bucket_id,
43
- parentVaultId: params.parent_vault_id,
44
- },
45
- query: {},
46
- },
47
- });
48
- let filtered = vaults;
49
- if (params.filter) {
50
- const regex = new RegExp(params.filter, "i");
51
- filtered = vaults.filter((v) => regex.test(v.title));
52
- }
53
- return {
54
- content: [
55
- {
56
- type: "text",
57
- text: JSON.stringify(filtered.map((v) => ({
58
- id: v.id,
59
- title: v.title,
60
- documents_count: v.documents_count,
61
- uploads_count: v.uploads_count,
62
- vaults_count: v.vaults_count,
63
- creator: serializePerson(v.creator),
64
- created_at: v.created_at,
65
- url: v.app_url,
66
- })), null, 2),
67
- },
68
- ],
69
- };
70
- }
71
- catch (error) {
72
- return {
73
- content: [{ type: "text", text: handleBasecampError(error) }],
74
- };
75
- }
76
- });
77
- // basecamp_get_vault
78
- server.registerTool("basecamp_get_vault", {
79
- title: "Get Basecamp Vault",
80
- description: "Get details of a vault (folder) including document/upload/sub-vault counts.",
81
- inputSchema: {
82
- bucket_id: BasecampIdSchema.describe("Project/bucket ID containing the vault"),
83
- vault_id: BasecampIdSchema.describe("Vault ID to retrieve"),
84
- },
85
- annotations: {
86
- readOnlyHint: true,
87
- destructiveHint: false,
88
- idempotentHint: true,
89
- openWorldHint: true,
90
- },
91
- }, async (params) => {
92
- try {
93
- const client = await initializeBasecampClient();
94
- const response = await client.vaults.get({
95
- params: {
96
- bucketId: params.bucket_id,
97
- vaultId: params.vault_id,
98
- },
99
- });
100
- if (response.status !== 200 || !response.body) {
101
- throw new Error(`Failed to fetch vault: ${response.status}`);
102
- }
103
- const vault = response.body;
104
- return {
105
- content: [
106
- {
107
- type: "text",
108
- text: JSON.stringify({
109
- id: vault.id,
110
- title: vault.title,
111
- documents_count: vault.documents_count,
112
- documents_url: vault.documents_url,
113
- uploads_count: vault.uploads_count,
114
- uploads_url: vault.uploads_url,
115
- vaults_count: vault.vaults_count,
116
- vaults_url: vault.vaults_url,
117
- creator: serializePerson(vault.creator),
118
- created_at: vault.created_at,
119
- updated_at: vault.updated_at,
120
- url: vault.app_url,
121
- }, null, 2),
122
- },
123
- ],
124
- };
125
- }
126
- catch (error) {
127
- return {
128
- content: [{ type: "text", text: handleBasecampError(error) }],
129
- };
130
- }
131
- });
132
- // basecamp_create_vault
133
- server.registerTool("basecamp_create_vault", {
134
- title: "Create Basecamp Vault",
135
- description: "Create a new vault (folder) under a parent vault.",
136
- inputSchema: {
137
- bucket_id: BasecampIdSchema.describe("Project/bucket ID"),
138
- parent_vault_id: BasecampIdSchema.describe("Parent vault ID to create the new vault under"),
139
- title: z.string().min(1).describe("Vault title/name"),
140
- },
141
- annotations: {
142
- readOnlyHint: false,
143
- destructiveHint: false,
144
- idempotentHint: false,
145
- openWorldHint: true,
146
- },
147
- }, async (params) => {
148
- try {
149
- const client = await initializeBasecampClient();
150
- const response = await client.vaults.create({
151
- params: {
152
- bucketId: params.bucket_id,
153
- parentVaultId: params.parent_vault_id,
154
- },
155
- body: {
156
- title: params.title,
157
- },
158
- });
159
- if (response.status !== 201 || !response.body) {
160
- throw new Error("Failed to create vault");
161
- }
162
- return {
163
- content: [
164
- {
165
- type: "text",
166
- text: `Vault created successfully!\n\nID: ${response.body.id}\nTitle: ${response.body.title}\nURL: ${response.body.app_url}`,
167
- },
168
- ],
169
- };
170
- }
171
- catch (error) {
172
- return {
173
- content: [{ type: "text", text: handleBasecampError(error) }],
174
- };
175
- }
176
- });
177
- // basecamp_update_vault
178
- server.registerTool("basecamp_update_vault", {
179
- title: "Update Basecamp Vault",
180
- description: "Update the title of a vault (folder).",
181
- inputSchema: {
182
- bucket_id: BasecampIdSchema.describe("Project/bucket ID"),
183
- vault_id: BasecampIdSchema.describe("Vault ID to update"),
184
- title: z.string().min(1).describe("New vault title"),
185
- },
186
- annotations: {
187
- readOnlyHint: false,
188
- destructiveHint: false,
189
- idempotentHint: true,
190
- openWorldHint: true,
191
- },
192
- }, async (params) => {
193
- try {
194
- const client = await initializeBasecampClient();
195
- const response = await client.vaults.update({
196
- params: {
197
- bucketId: params.bucket_id,
198
- vaultId: params.vault_id,
199
- },
200
- body: {
201
- title: params.title,
202
- },
203
- });
204
- if (response.status !== 200 || !response.body) {
205
- throw new Error("Failed to update vault");
206
- }
207
- return {
208
- content: [
209
- {
210
- type: "text",
211
- text: `Vault updated successfully!\n\nID: ${response.body.id}\nTitle: ${response.body.title}`,
212
- },
213
- ],
214
- };
215
- }
216
- catch (error) {
217
- return {
218
- content: [{ type: "text", text: handleBasecampError(error) }],
219
- };
220
- }
221
- });
222
- // basecamp_list_documents
223
- server.registerTool("basecamp_list_documents", {
224
- title: "List Basecamp Documents",
225
- description: "List documents in a vault.",
226
- inputSchema: {
227
- bucket_id: BasecampIdSchema.describe("Project/bucket ID"),
228
- vault_id: BasecampIdSchema.describe("Vault ID containing the documents"),
229
- filter: z
230
- .string()
231
- .optional()
232
- .describe("Optional regular expression to filter documents by title"),
233
- },
234
- annotations: {
235
- readOnlyHint: true,
236
- destructiveHint: false,
237
- idempotentHint: true,
238
- openWorldHint: true,
239
- },
240
- }, async (params) => {
241
- try {
242
- const client = await initializeBasecampClient();
243
- const documents = await asyncPagedToArray({
244
- fetchPage: client.documents.list,
245
- request: {
246
- params: {
247
- bucketId: params.bucket_id,
248
- vaultId: params.vault_id,
249
- },
250
- query: {},
251
- },
252
- });
253
- let filtered = documents;
254
- if (params.filter) {
255
- const regex = new RegExp(params.filter, "i");
256
- filtered = documents.filter((d) => regex.test(d.title) || regex.test(d.content || ""));
257
- }
258
- return {
259
- content: [
260
- {
261
- type: "text",
262
- text: JSON.stringify(filtered.map((d) => ({
263
- id: d.id,
264
- title: d.title,
265
- creator: serializePerson(d.creator),
266
- created_at: d.created_at,
267
- updated_at: d.updated_at,
268
- url: d.app_url,
269
- })), null, 2),
270
- },
271
- ],
272
- };
273
- }
274
- catch (error) {
275
- return {
276
- content: [{ type: "text", text: handleBasecampError(error) }],
277
- };
278
- }
279
- });
280
- // basecamp_get_document
281
- server.registerTool("basecamp_get_document", {
282
- title: "Get Basecamp Document",
283
- description: "Retrieve a single document with its full content.",
284
- inputSchema: {
285
- bucket_id: BasecampIdSchema.describe("Project/bucket ID containing the document"),
286
- document_id: BasecampIdSchema.describe("Document ID to retrieve"),
287
- },
288
- annotations: {
289
- readOnlyHint: true,
290
- destructiveHint: false,
291
- idempotentHint: true,
292
- openWorldHint: true,
293
- },
294
- }, async (params) => {
295
- try {
296
- const client = await initializeBasecampClient();
297
- const response = await client.documents.get({
298
- params: {
299
- bucketId: params.bucket_id,
300
- documentId: params.document_id,
301
- },
302
- });
303
- if (response.status !== 200 || !response.body) {
304
- throw new Error(`Failed to fetch document: ${response.status}`);
305
- }
306
- const doc = response.body;
307
- return {
308
- content: [
309
- {
310
- type: "text",
311
- text: JSON.stringify({
312
- id: doc.id,
313
- title: doc.title,
314
- content: doc.content || "",
315
- author: serializePerson(doc.creator),
316
- created_at: doc.created_at,
317
- updated_at: doc.updated_at,
318
- url: doc.app_url,
319
- }, null, 2),
320
- },
321
- ],
322
- };
323
- }
324
- catch (error) {
325
- return {
326
- content: [{ type: "text", text: handleBasecampError(error) }],
327
- };
328
- }
329
- });
330
- // basecamp_create_document
331
- server.registerTool("basecamp_create_document", {
332
- title: "Create Basecamp Document",
333
- description: `Create a new document in a vault. ${htmlRules}`,
334
- inputSchema: {
335
- bucket_id: BasecampIdSchema.describe("Project/bucket ID"),
336
- vault_id: BasecampIdSchema.describe("Vault ID to create the document in"),
337
- title: z.string().min(1).describe("Document title"),
338
- content: z.string().describe("HTML document content"),
339
- status: z
340
- .enum(["active", "draft"])
341
- .default("active")
342
- .describe("Document status"),
343
- },
344
- annotations: {
345
- readOnlyHint: false,
346
- destructiveHint: false,
347
- idempotentHint: false,
348
- openWorldHint: true,
349
- },
350
- }, async (params) => {
351
- try {
352
- const client = await initializeBasecampClient();
353
- const response = await client.documents.create({
354
- params: {
355
- bucketId: params.bucket_id,
356
- vaultId: params.vault_id,
357
- },
358
- body: {
359
- title: params.title,
360
- content: params.content,
361
- status: params.status,
362
- },
363
- });
364
- if (response.status !== 201 || !response.body) {
365
- throw new Error("Failed to create document");
366
- }
367
- return {
368
- content: [
369
- {
370
- type: "text",
371
- text: `Document created successfully!\n\nID: ${response.body.id}\nTitle: ${response.body.title}\nURL: ${response.body.app_url}`,
372
- },
373
- ],
374
- };
375
- }
376
- catch (error) {
377
- return {
378
- content: [{ type: "text", text: handleBasecampError(error) }],
379
- };
380
- }
381
- });
382
- // basecamp_update_document
383
- server.registerTool("basecamp_update_document", {
384
- title: "Update Basecamp Document",
385
- description: `Update a document. Use partial content operations when possible to save on token usage. ${htmlRules}`,
386
- inputSchema: {
387
- bucket_id: BasecampIdSchema.describe("Project/bucket ID"),
388
- document_id: BasecampIdSchema.describe("Document ID to update"),
389
- title: z.string().min(1).optional().describe("New document title"),
390
- ...ContentOperationFields,
391
- },
392
- annotations: {
393
- readOnlyHint: false,
394
- destructiveHint: false,
395
- idempotentHint: false,
396
- openWorldHint: true,
397
- },
398
- }, async (params) => {
399
- try {
400
- validateContentOperations(params, ["title"]);
401
- const client = await initializeBasecampClient();
402
- let finalContent;
403
- const hasPartialOps = params.content_append ||
404
- params.content_prepend ||
405
- params.search_replace;
406
- if (hasPartialOps || params.content !== undefined) {
407
- if (hasPartialOps) {
408
- const currentResponse = await client.documents.get({
409
- params: {
410
- bucketId: params.bucket_id,
411
- documentId: params.document_id,
412
- },
413
- });
414
- if (currentResponse.status !== 200 || !currentResponse.body) {
415
- throw new Error(`Failed to fetch current document for partial update: ${currentResponse.status}`);
416
- }
417
- const currentContent = currentResponse.body.content || "";
418
- finalContent = applyContentOperations(currentContent, params);
419
- }
420
- else {
421
- finalContent = params.content;
422
- }
423
- }
424
- const response = await client.documents.update({
425
- params: {
426
- bucketId: params.bucket_id,
427
- documentId: params.document_id,
428
- },
429
- body: {
430
- ...(params.title ? { title: params.title } : {}),
431
- ...(finalContent !== undefined ? { content: finalContent } : {}),
432
- },
433
- });
434
- if (response.status !== 200 || !response.body) {
435
- throw new Error("Failed to update document");
436
- }
437
- return {
438
- content: [
439
- {
440
- type: "text",
441
- text: `Document updated successfully!\n\nID: ${response.body.id}\nTitle: ${response.body.title}`,
442
- },
443
- ],
444
- };
445
- }
446
- catch (error) {
447
- return {
448
- content: [{ type: "text", text: handleBasecampError(error) }],
449
- };
450
- }
451
- });
452
- }
453
- //# sourceMappingURL=documents.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Upload & Blob download tools for Basecamp MCP server
3
- *
4
- * Uploads are files stored in vaults (Docs & Files section).
5
- * Blobs are inline attachments embedded in rich text via <bc-attachment> tags.
6
- */
7
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
- export declare function registerUploadTools(server: McpServer): void;
9
- //# sourceMappingURL=uploads.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/tools/uploads.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0CzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuT3D"}