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,319 +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 { mkdirSync, writeFileSync } from "node:fs";
8
- import { tmpdir } from "node:os";
9
- import { join } from "node:path";
10
- import { asyncPagedToArray } from "basecamp-client";
11
- import { z } from "zod";
12
- import { BasecampIdSchema } from "../schemas/common.js";
13
- import { initializeBasecampClient } from "../utils/auth.js";
14
- import { handleBasecampError } from "../utils/errorHandlers.js";
15
- import { serializePerson } from "../utils/serializers.js";
16
- const DOWNLOAD_DIR = join(tmpdir(), "basecamp-downloads");
17
- function saveToDisk(filename, data) {
18
- mkdirSync(DOWNLOAD_DIR, { recursive: true });
19
- const filePath = join(DOWNLOAD_DIR, filename);
20
- writeFileSync(filePath, Buffer.from(data));
21
- return filePath;
22
- }
23
- const IMAGE_CONTENT_TYPES = [
24
- "image/png",
25
- "image/jpeg",
26
- "image/gif",
27
- "image/webp",
28
- ];
29
- const TEXT_CONTENT_TYPES = [
30
- "text/plain",
31
- "text/csv",
32
- "text/html",
33
- "text/markdown",
34
- "application/json",
35
- "application/xml",
36
- "text/xml",
37
- ];
38
- function isImageContentType(contentType) {
39
- return IMAGE_CONTENT_TYPES.some((t) => contentType.startsWith(t));
40
- }
41
- function isTextContentType(contentType) {
42
- return TEXT_CONTENT_TYPES.some((t) => contentType.startsWith(t));
43
- }
44
- export function registerUploadTools(server) {
45
- // basecamp_list_uploads
46
- server.registerTool("basecamp_list_uploads", {
47
- title: "List Basecamp Uploads",
48
- description: "List files uploaded to a vault in the Docs & Files section.",
49
- inputSchema: {
50
- bucket_id: BasecampIdSchema.describe("Project/bucket ID"),
51
- vault_id: BasecampIdSchema.describe("Vault ID containing the uploads"),
52
- filter: z
53
- .string()
54
- .optional()
55
- .describe("Optional regular expression to filter uploads by filename"),
56
- },
57
- annotations: {
58
- readOnlyHint: true,
59
- destructiveHint: false,
60
- idempotentHint: true,
61
- openWorldHint: true,
62
- },
63
- }, async (params) => {
64
- try {
65
- const client = await initializeBasecampClient();
66
- const uploads = await asyncPagedToArray({
67
- fetchPage: client.uploads.list,
68
- request: {
69
- params: {
70
- bucketId: params.bucket_id,
71
- vaultId: params.vault_id,
72
- },
73
- query: {},
74
- },
75
- });
76
- let filtered = uploads;
77
- if (params.filter) {
78
- const regex = new RegExp(params.filter, "i");
79
- filtered = uploads.filter((u) => regex.test(u.filename) || regex.test(u.title));
80
- }
81
- return {
82
- content: [
83
- {
84
- type: "text",
85
- text: JSON.stringify(filtered.map((u) => ({
86
- id: u.id,
87
- title: u.title,
88
- filename: u.filename,
89
- content_type: u.content_type,
90
- byte_size: u.byte_size,
91
- width: u.width,
92
- height: u.height,
93
- description: u.description,
94
- creator: serializePerson(u.creator),
95
- created_at: u.created_at,
96
- updated_at: u.updated_at,
97
- url: u.app_url,
98
- download_url: u.download_url,
99
- })), null, 2),
100
- },
101
- ],
102
- };
103
- }
104
- catch (error) {
105
- return {
106
- content: [{ type: "text", text: handleBasecampError(error) }],
107
- };
108
- }
109
- });
110
- // basecamp_get_upload
111
- server.registerTool("basecamp_get_upload", {
112
- title: "Get Basecamp Upload",
113
- description: "Get a file uploaded to a vault. For images, returns the image content that the LLM can see directly. For text-based files (plain text, CSV, JSON, XML, etc.), returns the file content as text. For other binary formats, returns metadata only.",
114
- inputSchema: {
115
- bucket_id: BasecampIdSchema.describe("Project/bucket ID"),
116
- upload_id: BasecampIdSchema.describe("Upload ID to retrieve"),
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.uploads.get({
128
- params: {
129
- bucketId: params.bucket_id,
130
- uploadId: params.upload_id,
131
- },
132
- });
133
- if (response.status !== 200 || !response.body) {
134
- throw new Error(`Failed to fetch upload: ${response.status}`);
135
- }
136
- const upload = response.body;
137
- const metadata = {
138
- id: upload.id,
139
- title: upload.title,
140
- filename: upload.filename,
141
- content_type: upload.content_type,
142
- byte_size: upload.byte_size,
143
- width: upload.width,
144
- height: upload.height,
145
- description: upload.description,
146
- creator: serializePerson(upload.creator),
147
- created_at: upload.created_at,
148
- updated_at: upload.updated_at,
149
- url: upload.app_url,
150
- download_url: upload.download_url,
151
- };
152
- // Extract filename from download_url
153
- const urlFilename = upload.download_url.split("/").pop() || upload.filename;
154
- if (isImageContentType(upload.content_type)) {
155
- const downloadResponse = await client.uploads.download({
156
- params: {
157
- bucketId: params.bucket_id,
158
- uploadId: params.upload_id,
159
- filename: urlFilename,
160
- },
161
- });
162
- const base64 = Buffer.from(downloadResponse.body).toString("base64");
163
- return {
164
- content: [
165
- {
166
- type: "text",
167
- text: JSON.stringify(metadata, null, 2),
168
- },
169
- {
170
- type: "image",
171
- data: base64,
172
- mimeType: upload.content_type,
173
- },
174
- ],
175
- };
176
- }
177
- if (isTextContentType(upload.content_type)) {
178
- const downloadResponse = await client.uploads.download({
179
- params: {
180
- bucketId: params.bucket_id,
181
- uploadId: params.upload_id,
182
- filename: urlFilename,
183
- },
184
- });
185
- const text = new TextDecoder().decode(downloadResponse.body);
186
- return {
187
- content: [
188
- {
189
- type: "text",
190
- text: JSON.stringify(metadata, null, 2),
191
- },
192
- {
193
- type: "text",
194
- text: `--- File content of ${upload.filename} ---\n${text}`,
195
- },
196
- ],
197
- };
198
- }
199
- const downloadResponse = await client.uploads.download({
200
- params: {
201
- bucketId: params.bucket_id,
202
- uploadId: params.upload_id,
203
- filename: urlFilename,
204
- },
205
- });
206
- const filePath = saveToDisk(upload.filename, downloadResponse.body);
207
- return {
208
- content: [
209
- {
210
- type: "text",
211
- text: JSON.stringify({
212
- ...metadata,
213
- saved_to: filePath,
214
- note: `Binary file saved to disk. Use the file path to read it.`,
215
- }, null, 2),
216
- },
217
- ],
218
- };
219
- }
220
- catch (error) {
221
- return {
222
- content: [{ type: "text", text: handleBasecampError(error) }],
223
- };
224
- }
225
- });
226
- // basecamp_download_blob
227
- server.registerTool("basecamp_download_blob", {
228
- title: "Download Basecamp Blob",
229
- description: "Download an inline attachment from a <bc-attachment> tag found in document/message/comment HTML content. Extract the blob_id and filename from the href attribute (format: https://storage.3.basecamp.com/{accountId}/blobs/{blobId}/download/{filename}). For images, returns the image content that the LLM can see directly. For text-based files, returns the file content as text.",
230
- inputSchema: {
231
- blob_id: z
232
- .string()
233
- .describe("Blob UUID extracted from the <bc-attachment> href URL"),
234
- filename: z
235
- .string()
236
- .describe("Filename extracted from the <bc-attachment> href URL (URL-decoded)"),
237
- content_type: z
238
- .string()
239
- .optional()
240
- .describe('Content type from the <bc-attachment> content-type attribute (e.g. "image/png"). If not provided, will attempt to infer from filename.'),
241
- },
242
- annotations: {
243
- readOnlyHint: true,
244
- destructiveHint: false,
245
- idempotentHint: true,
246
- openWorldHint: true,
247
- },
248
- }, async (params) => {
249
- try {
250
- const client = await initializeBasecampClient();
251
- const downloadResponse = await client.blobs.download({
252
- params: {
253
- blobId: params.blob_id,
254
- filename: params.filename,
255
- },
256
- });
257
- const contentType = params.content_type || inferContentType(params.filename);
258
- if (isImageContentType(contentType)) {
259
- const base64 = Buffer.from(downloadResponse.body).toString("base64");
260
- return {
261
- content: [
262
- {
263
- type: "text",
264
- text: `Blob: ${params.filename} (${contentType})`,
265
- },
266
- {
267
- type: "image",
268
- data: base64,
269
- mimeType: contentType,
270
- },
271
- ],
272
- };
273
- }
274
- if (isTextContentType(contentType)) {
275
- const text = new TextDecoder().decode(downloadResponse.body);
276
- return {
277
- content: [
278
- {
279
- type: "text",
280
- text: `--- File content of ${params.filename} ---\n${text}`,
281
- },
282
- ],
283
- };
284
- }
285
- const filePath = saveToDisk(params.filename, downloadResponse.body);
286
- return {
287
- content: [
288
- {
289
- type: "text",
290
- text: `Downloaded ${params.filename} (${contentType}, ${downloadResponse.body.byteLength} bytes) and saved to: ${filePath}\n\nUse the file path to read it.`,
291
- },
292
- ],
293
- };
294
- }
295
- catch (error) {
296
- return {
297
- content: [{ type: "text", text: handleBasecampError(error) }],
298
- };
299
- }
300
- });
301
- }
302
- function inferContentType(filename) {
303
- const ext = filename.split(".").pop()?.toLowerCase();
304
- const map = {
305
- png: "image/png",
306
- jpg: "image/jpeg",
307
- jpeg: "image/jpeg",
308
- gif: "image/gif",
309
- webp: "image/webp",
310
- txt: "text/plain",
311
- csv: "text/csv",
312
- json: "application/json",
313
- xml: "application/xml",
314
- md: "text/markdown",
315
- html: "text/html",
316
- };
317
- return map[ext || ""] || "application/octet-stream";
318
- }
319
- //# sourceMappingURL=uploads.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../src/tools/uploads.ts"],"names":[],"mappings":"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"}