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.
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -7
- package/dist/index.js.map +1 -1
- package/dist/tools/activity.d.ts +6 -4
- package/dist/tools/activity.d.ts.map +1 -1
- package/dist/tools/activity.js +13 -285
- package/dist/tools/activity.js.map +1 -1
- package/dist/tools/auth.d.ts.map +1 -1
- package/dist/tools/auth.js +5 -11
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/campfires.d.ts +13 -0
- package/dist/tools/campfires.d.ts.map +1 -0
- package/dist/tools/campfires.js +221 -0
- package/dist/tools/campfires.js.map +1 -0
- package/dist/tools/checkins.d.ts.map +1 -1
- package/dist/tools/checkins.js +10 -74
- package/dist/tools/checkins.js.map +1 -1
- package/dist/tools/comments.d.ts.map +1 -1
- package/dist/tools/comments.js +9 -44
- package/dist/tools/comments.js.map +1 -1
- package/dist/tools/files.d.ts +21 -0
- package/dist/tools/files.d.ts.map +1 -0
- package/dist/tools/files.js +659 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/kanban.d.ts.map +1 -1
- package/dist/tools/kanban.js +78 -137
- package/dist/tools/kanban.js.map +1 -1
- package/dist/tools/messages.d.ts.map +1 -1
- package/dist/tools/messages.js +31 -71
- package/dist/tools/messages.js.map +1 -1
- package/dist/tools/people.d.ts.map +1 -1
- package/dist/tools/people.js +5 -19
- package/dist/tools/people.js.map +1 -1
- package/dist/tools/projects.d.ts.map +1 -1
- package/dist/tools/projects.js +4 -16
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/todos.d.ts.map +1 -1
- package/dist/tools/todos.js +60 -84
- package/dist/tools/todos.js.map +1 -1
- package/dist/utils/auth.d.ts +7 -2
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/auth.js +19 -11
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/contentOperations.d.ts +2 -2
- package/dist/utils/credentials.d.ts.map +1 -1
- package/dist/utils/credentials.js.map +1 -1
- package/dist/utils/errorHandlers.d.ts.map +1 -1
- package/dist/utils/errorHandlers.js +53 -29
- package/dist/utils/errorHandlers.js.map +1 -1
- package/dist/utils/oauth.d.ts +1 -0
- package/dist/utils/oauth.d.ts.map +1 -1
- package/dist/utils/oauth.js +18 -0
- package/dist/utils/oauth.js.map +1 -1
- package/dist/utils/pagination.d.ts +43 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +72 -0
- package/dist/utils/pagination.js.map +1 -0
- package/dist/utils/parseSince.d.ts +11 -0
- package/dist/utils/parseSince.d.ts.map +1 -0
- package/dist/utils/parseSince.js +48 -0
- package/dist/utils/parseSince.js.map +1 -0
- package/dist/utils/serializers.d.ts +17 -2
- package/dist/utils/serializers.d.ts.map +1 -1
- package/dist/utils/serializers.js +16 -0
- package/dist/utils/serializers.js.map +1 -1
- package/package.json +5 -3
- package/dist/tools/documents.d.ts +0 -11
- package/dist/tools/documents.d.ts.map +0 -1
- package/dist/tools/documents.js +0 -453
- package/dist/tools/documents.js.map +0 -1
- package/dist/tools/uploads.d.ts +0 -9
- package/dist/tools/uploads.d.ts.map +0 -1
- package/dist/tools/uploads.js +0 -319
- package/dist/tools/uploads.js.map +0 -1
package/dist/tools/todos.js
CHANGED
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TODO tools for Basecamp MCP server
|
|
3
3
|
*/
|
|
4
|
-
import { asyncPagedToArray } from "basecamp-client";
|
|
5
4
|
import { z } from "zod";
|
|
6
5
|
import { BasecampIdSchema } from "../schemas/common.js";
|
|
7
6
|
import { initializeBasecampClient } from "../utils/auth.js";
|
|
8
7
|
import { applyContentOperations, ContentOperationFields, htmlRules, validateContentOperations, } from "../utils/contentOperations.js";
|
|
9
8
|
import { handleBasecampError } from "../utils/errorHandlers.js";
|
|
10
9
|
import { serializePerson } from "../utils/serializers.js";
|
|
10
|
+
/**
|
|
11
|
+
* Optional date field for todos. Accepts an ISO date (YYYY-MM-DD) or an empty
|
|
12
|
+
* string. Empty/omitted leaves the date unset on create and clears it on update.
|
|
13
|
+
*/
|
|
14
|
+
const TodoDateSchema = z
|
|
15
|
+
.string()
|
|
16
|
+
.regex(/^(\d{4}-\d{2}-\d{2})?$/, "Date must be in YYYY-MM-DD format or empty")
|
|
17
|
+
.optional();
|
|
11
18
|
export function registerTodoTools(server) {
|
|
12
19
|
server.registerTool("basecamp_get_todoset", {
|
|
13
20
|
title: "Get Basecamp Todo Set",
|
|
14
21
|
description: "Get todo set container for a project. Returns todo lists and groups.",
|
|
15
22
|
inputSchema: {
|
|
16
|
-
bucket_id: BasecampIdSchema,
|
|
17
23
|
todoset_id: BasecampIdSchema,
|
|
18
24
|
},
|
|
19
25
|
annotations: {
|
|
@@ -25,23 +31,8 @@ export function registerTodoTools(server) {
|
|
|
25
31
|
}, async (params) => {
|
|
26
32
|
try {
|
|
27
33
|
const client = await initializeBasecampClient();
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
});
|
|
31
|
-
if (responseTodoSet.status !== 200 || !responseTodoSet.body) {
|
|
32
|
-
throw new Error("Failed to fetch todo set");
|
|
33
|
-
}
|
|
34
|
-
const todoLists = await asyncPagedToArray({
|
|
35
|
-
fetchPage: client.todoLists.list,
|
|
36
|
-
request: {
|
|
37
|
-
params: {
|
|
38
|
-
bucketId: params.bucket_id,
|
|
39
|
-
todosetId: params.todoset_id,
|
|
40
|
-
},
|
|
41
|
-
query: {},
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
const todoSet = responseTodoSet.body;
|
|
34
|
+
const todoSet = await client.todosets.get(params.todoset_id);
|
|
35
|
+
const todoLists = await client.todolists.list(params.todoset_id);
|
|
45
36
|
return {
|
|
46
37
|
content: [
|
|
47
38
|
{
|
|
@@ -73,7 +64,6 @@ export function registerTodoTools(server) {
|
|
|
73
64
|
title: "List Basecamp Todos",
|
|
74
65
|
description: "List todos in a todo list. Filter by status: 'active' or 'archived'.",
|
|
75
66
|
inputSchema: {
|
|
76
|
-
bucket_id: BasecampIdSchema,
|
|
77
67
|
todolist_id: BasecampIdSchema,
|
|
78
68
|
status: z.enum(["active", "archived"]).default("active").optional(),
|
|
79
69
|
completed: z.literal(true).optional(),
|
|
@@ -87,15 +77,9 @@ export function registerTodoTools(server) {
|
|
|
87
77
|
}, async (params) => {
|
|
88
78
|
try {
|
|
89
79
|
const client = await initializeBasecampClient();
|
|
90
|
-
const todos = await
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
params: {
|
|
94
|
-
bucketId: params.bucket_id,
|
|
95
|
-
todolistId: params.todolist_id,
|
|
96
|
-
},
|
|
97
|
-
query: { status: params.status, completed: params.completed },
|
|
98
|
-
},
|
|
80
|
+
const todos = await client.todos.list(params.todolist_id, {
|
|
81
|
+
status: params.status,
|
|
82
|
+
completed: params.completed,
|
|
99
83
|
});
|
|
100
84
|
return {
|
|
101
85
|
content: [
|
|
@@ -107,7 +91,9 @@ export function registerTodoTools(server) {
|
|
|
107
91
|
id: t.id,
|
|
108
92
|
title: t.content,
|
|
109
93
|
completed: t.completed,
|
|
110
|
-
|
|
94
|
+
due_on: t.due_on,
|
|
95
|
+
starts_on: t.starts_on,
|
|
96
|
+
assignees: (t.assignees || []).map(serializePerson),
|
|
111
97
|
})),
|
|
112
98
|
}, null, 2),
|
|
113
99
|
},
|
|
@@ -124,7 +110,6 @@ export function registerTodoTools(server) {
|
|
|
124
110
|
title: "Create Basecamp Todo",
|
|
125
111
|
description: `Create a new todo item in a todo list. ${htmlRules}`,
|
|
126
112
|
inputSchema: {
|
|
127
|
-
bucket_id: BasecampIdSchema,
|
|
128
113
|
todolist_id: BasecampIdSchema,
|
|
129
114
|
title: z.string().min(1),
|
|
130
115
|
content: z.string().optional(),
|
|
@@ -132,6 +117,12 @@ export function registerTodoTools(server) {
|
|
|
132
117
|
.array(BasecampIdSchema)
|
|
133
118
|
.optional()
|
|
134
119
|
.describe("Array of person IDs to assign to this todo"),
|
|
120
|
+
due_on: TodoDateSchema.describe("Due date in YYYY-MM-DD format. Pass an empty string to leave the due date unset."),
|
|
121
|
+
starts_on: TodoDateSchema.describe("Start date in YYYY-MM-DD format (for a date range; requires due_on). Pass an empty string to leave it unset."),
|
|
122
|
+
notify: z
|
|
123
|
+
.boolean()
|
|
124
|
+
.optional()
|
|
125
|
+
.describe("Whether to notify the assignees about this todo"),
|
|
135
126
|
},
|
|
136
127
|
annotations: {
|
|
137
128
|
readOnlyHint: false,
|
|
@@ -142,25 +133,19 @@ export function registerTodoTools(server) {
|
|
|
142
133
|
}, async (params) => {
|
|
143
134
|
try {
|
|
144
135
|
const client = await initializeBasecampClient();
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
},
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
description: params.content,
|
|
153
|
-
assignee_ids: params.assignee_ids,
|
|
154
|
-
},
|
|
136
|
+
const todo = await client.todos.create(params.todolist_id, {
|
|
137
|
+
content: params.title,
|
|
138
|
+
description: params.content,
|
|
139
|
+
assigneeIds: params.assignee_ids,
|
|
140
|
+
...(params.due_on ? { dueOn: params.due_on } : {}),
|
|
141
|
+
...(params.starts_on ? { startsOn: params.starts_on } : {}),
|
|
142
|
+
...(params.notify !== undefined ? { notify: params.notify } : {}),
|
|
155
143
|
});
|
|
156
|
-
if (response.status !== 201 || !response.body) {
|
|
157
|
-
throw new Error("Failed to create todo");
|
|
158
|
-
}
|
|
159
144
|
return {
|
|
160
145
|
content: [
|
|
161
146
|
{
|
|
162
147
|
type: "text",
|
|
163
|
-
text: `Todo created!\n\nID: ${
|
|
148
|
+
text: `Todo created!\n\nID: ${todo.id}\nContent: ${todo.content}${todo.due_on ? `\nDue: ${todo.due_on}` : ""}${todo.starts_on ? `\nStarts: ${todo.starts_on}` : ""}`,
|
|
164
149
|
},
|
|
165
150
|
],
|
|
166
151
|
};
|
|
@@ -175,7 +160,6 @@ export function registerTodoTools(server) {
|
|
|
175
160
|
title: "Complete Basecamp Todo",
|
|
176
161
|
description: "Mark a todo as completed.",
|
|
177
162
|
inputSchema: {
|
|
178
|
-
bucket_id: BasecampIdSchema,
|
|
179
163
|
todo_id: BasecampIdSchema,
|
|
180
164
|
},
|
|
181
165
|
annotations: {
|
|
@@ -187,9 +171,7 @@ export function registerTodoTools(server) {
|
|
|
187
171
|
}, async (params) => {
|
|
188
172
|
try {
|
|
189
173
|
const client = await initializeBasecampClient();
|
|
190
|
-
await client.todos.complete(
|
|
191
|
-
params: { bucketId: params.bucket_id, todoId: params.todo_id },
|
|
192
|
-
});
|
|
174
|
+
await client.todos.complete(params.todo_id);
|
|
193
175
|
return {
|
|
194
176
|
content: [{ type: "text", text: "Todo marked as completed!" }],
|
|
195
177
|
};
|
|
@@ -204,7 +186,6 @@ export function registerTodoTools(server) {
|
|
|
204
186
|
title: "Uncomplete Basecamp Todo",
|
|
205
187
|
description: "Mark a todo as incomplete (undo completion).",
|
|
206
188
|
inputSchema: {
|
|
207
|
-
bucket_id: BasecampIdSchema,
|
|
208
189
|
todo_id: BasecampIdSchema,
|
|
209
190
|
},
|
|
210
191
|
annotations: {
|
|
@@ -216,9 +197,7 @@ export function registerTodoTools(server) {
|
|
|
216
197
|
}, async (params) => {
|
|
217
198
|
try {
|
|
218
199
|
const client = await initializeBasecampClient();
|
|
219
|
-
await client.todos.uncomplete(
|
|
220
|
-
params: { bucketId: params.bucket_id, todoId: params.todo_id },
|
|
221
|
-
});
|
|
200
|
+
await client.todos.uncomplete(params.todo_id);
|
|
222
201
|
return {
|
|
223
202
|
content: [{ type: "text", text: "Todo marked as incomplete!" }],
|
|
224
203
|
};
|
|
@@ -233,13 +212,18 @@ export function registerTodoTools(server) {
|
|
|
233
212
|
title: "Update Basecamp Todo",
|
|
234
213
|
description: `Update a todo item. Use partial content operations when possible to save on token usage. ${htmlRules}`,
|
|
235
214
|
inputSchema: {
|
|
236
|
-
bucket_id: BasecampIdSchema,
|
|
237
215
|
todo_id: BasecampIdSchema,
|
|
238
216
|
title: z.string().optional().describe("New todo title"),
|
|
239
217
|
assignee_ids: z
|
|
240
218
|
.array(BasecampIdSchema)
|
|
241
219
|
.optional()
|
|
242
220
|
.describe("Array of person IDs to assign to this todo"),
|
|
221
|
+
due_on: TodoDateSchema.describe("Due date in YYYY-MM-DD format. Pass an empty string to clear the due date."),
|
|
222
|
+
starts_on: TodoDateSchema.describe("Start date in YYYY-MM-DD format (for a date range; requires due_on). Pass an empty string to clear it."),
|
|
223
|
+
notify: z
|
|
224
|
+
.boolean()
|
|
225
|
+
.optional()
|
|
226
|
+
.describe("Whether to notify the assignees about this todo"),
|
|
243
227
|
...ContentOperationFields,
|
|
244
228
|
},
|
|
245
229
|
annotations: {
|
|
@@ -251,27 +235,25 @@ export function registerTodoTools(server) {
|
|
|
251
235
|
}, async (params) => {
|
|
252
236
|
try {
|
|
253
237
|
// Validate at least one operation is provided
|
|
254
|
-
validateContentOperations(params, [
|
|
238
|
+
validateContentOperations(params, [
|
|
239
|
+
"title",
|
|
240
|
+
"assignee_ids",
|
|
241
|
+
"due_on",
|
|
242
|
+
"starts_on",
|
|
243
|
+
"notify",
|
|
244
|
+
]);
|
|
255
245
|
const client = await initializeBasecampClient();
|
|
256
246
|
// Fetch current todo to get existing values
|
|
257
|
-
const
|
|
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
|
-
}
|
|
247
|
+
const currentTodo = await client.todos.get(params.todo_id);
|
|
266
248
|
// Determine final title (maps to Basecamp's content field)
|
|
267
|
-
const finalTitle = params.title ??
|
|
249
|
+
const finalTitle = params.title ?? currentTodo.content;
|
|
268
250
|
// Determine final content (maps to Basecamp's description field)
|
|
269
251
|
let finalContent;
|
|
270
252
|
const hasPartialOps = params.content_append ||
|
|
271
253
|
params.content_prepend ||
|
|
272
254
|
params.search_replace;
|
|
273
255
|
if (hasPartialOps) {
|
|
274
|
-
const currentContent =
|
|
256
|
+
const currentContent = currentTodo.description || "";
|
|
275
257
|
const result = applyContentOperations(currentContent, params);
|
|
276
258
|
if (result === undefined) {
|
|
277
259
|
throw new Error("Content operations resulted in undefined content");
|
|
@@ -282,29 +264,23 @@ export function registerTodoTools(server) {
|
|
|
282
264
|
// Full content replacement
|
|
283
265
|
finalContent = params.content;
|
|
284
266
|
}
|
|
285
|
-
const
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
? { assignee_ids: params.assignee_ids }
|
|
297
|
-
: {}),
|
|
298
|
-
},
|
|
267
|
+
const todo = await client.todos.update(params.todo_id, {
|
|
268
|
+
content: finalTitle,
|
|
269
|
+
...(finalContent !== undefined ? { description: finalContent } : {}),
|
|
270
|
+
...(params.assignee_ids !== undefined
|
|
271
|
+
? { assigneeIds: params.assignee_ids }
|
|
272
|
+
: {}),
|
|
273
|
+
...(params.due_on !== undefined ? { dueOn: params.due_on } : {}),
|
|
274
|
+
...(params.starts_on !== undefined
|
|
275
|
+
? { startsOn: params.starts_on }
|
|
276
|
+
: {}),
|
|
277
|
+
...(params.notify !== undefined ? { notify: params.notify } : {}),
|
|
299
278
|
});
|
|
300
|
-
if (response.status !== 200 || !response.body) {
|
|
301
|
-
throw new Error("Failed to update todo");
|
|
302
|
-
}
|
|
303
279
|
return {
|
|
304
280
|
content: [
|
|
305
281
|
{
|
|
306
282
|
type: "text",
|
|
307
|
-
text: `Todo updated!\n\nID: ${
|
|
283
|
+
text: `Todo updated!\n\nID: ${todo.id}\nContent: ${todo.content}${todo.due_on ? `\nDue: ${todo.due_on}` : ""}${todo.starts_on ? `\nStarts: ${todo.starts_on}` : ""}`,
|
|
308
284
|
},
|
|
309
285
|
],
|
|
310
286
|
};
|
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,
|
|
1
|
+
{"version":3,"file":"todos.js","sourceRoot":"","sources":["../../src/tools/todos.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/auth.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
|
|
1
|
+
import { type BasecampClient } from "@37signals/basecamp";
|
|
2
|
+
/**
|
|
3
|
+
* Return a valid bearer token, refreshing (and caching) one if necessary.
|
|
4
|
+
* Throws if the user is not logged in.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getBearerToken(): Promise<string>;
|
|
7
|
+
export declare function initializeBasecampClient(): Promise<BasecampClient>;
|
|
3
8
|
export declare function clearTokenCache(): void;
|
|
4
9
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/utils/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAwB,MAAM,qBAAqB,CAAC;AAMhF;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAiBtD;AAED,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,cAAc,CAAC,CAaxE;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
package/dist/utils/auth.js
CHANGED
|
@@ -1,23 +1,31 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createBasecampClient } from "@37signals/basecamp";
|
|
2
2
|
import { readCredentials } from "./credentials.js";
|
|
3
|
-
import { getClientCredentials } from "./oauth.js";
|
|
3
|
+
import { getClientCredentials, refreshAccessToken } from "./oauth.js";
|
|
4
4
|
let cachedBearerToken = null;
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Return a valid bearer token, refreshing (and caching) one if necessary.
|
|
7
|
+
* Throws if the user is not logged in.
|
|
8
|
+
*/
|
|
9
|
+
export async function getBearerToken() {
|
|
6
10
|
const creds = await readCredentials();
|
|
7
11
|
if (!creds) {
|
|
8
12
|
throw new Error("Not logged in. Use basecamp_login to authenticate.");
|
|
9
13
|
}
|
|
10
|
-
const { clientId, clientSecret } = getClientCredentials();
|
|
11
14
|
if (!cachedBearerToken) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
const { clientId, clientSecret } = getClientCredentials();
|
|
16
|
+
cachedBearerToken = await refreshAccessToken(creds.refreshToken, clientId, clientSecret);
|
|
17
|
+
}
|
|
18
|
+
return cachedBearerToken;
|
|
19
|
+
}
|
|
20
|
+
export async function initializeBasecampClient() {
|
|
21
|
+
const creds = await readCredentials();
|
|
22
|
+
if (!creds) {
|
|
23
|
+
throw new Error("Not logged in. Use basecamp_login to authenticate.");
|
|
17
24
|
}
|
|
18
|
-
|
|
19
|
-
|
|
25
|
+
const accessToken = await getBearerToken();
|
|
26
|
+
return createBasecampClient({
|
|
20
27
|
accountId: creds.accountId,
|
|
28
|
+
accessToken,
|
|
21
29
|
});
|
|
22
30
|
}
|
|
23
31
|
export function clearTokenCache() {
|
package/dist/utils/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtE,IAAI,iBAAiB,GAAkB,IAAI,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,oBAAoB,EAAE,CAAC;QAC1D,iBAAiB,GAAG,MAAM,kBAAkB,CAC1C,KAAK,CAAC,YAAY,EAClB,QAAQ,EACR,YAAY,CACb,CAAC;IACJ,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAE3C,OAAO,oBAAoB,CAAC;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC"}
|
|
@@ -16,11 +16,11 @@ export declare const ContentOperationFields: {
|
|
|
16
16
|
find: z.ZodString;
|
|
17
17
|
replace: z.ZodString;
|
|
18
18
|
}, "strip", z.ZodTypeAny, {
|
|
19
|
-
replace: string;
|
|
20
19
|
find: string;
|
|
21
|
-
}, {
|
|
22
20
|
replace: string;
|
|
21
|
+
}, {
|
|
23
22
|
find: string;
|
|
23
|
+
replace: string;
|
|
24
24
|
}>, "many">>;
|
|
25
25
|
};
|
|
26
26
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG;
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AASF,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAanE;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAO1C,MAAM,gBAAgB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAO1C,MAAM,gBAAgB,GAAG,IAAI,CAC3B,OAAO,EAAE,EACT,SAAS,EACT,cAAc,EACd,kBAAkB,CACnB,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEjC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAkB;IACvD,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3E,MAAM,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorHandlers.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandlers.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"errorHandlers.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAwC1D"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Error handling utilities for Basecamp API
|
|
3
3
|
*/
|
|
4
|
+
import { isBasecampError } from "@37signals/basecamp";
|
|
4
5
|
/**
|
|
5
6
|
* Convert Basecamp API errors to helpful, actionable error messages for LLMs.
|
|
6
7
|
*
|
|
@@ -8,38 +9,20 @@
|
|
|
8
9
|
* @returns Human-readable error message with guidance
|
|
9
10
|
*/
|
|
10
11
|
export function handleBasecampError(error) {
|
|
12
|
+
// Structured errors thrown by the official SDK carry a code, message, and
|
|
13
|
+
// (often) an actionable hint. Prefer those, falling back to status-based
|
|
14
|
+
// guidance below when no HTTP status is available.
|
|
15
|
+
if (isBasecampError(error)) {
|
|
16
|
+
if (error.httpStatus) {
|
|
17
|
+
return statusMessage(error.httpStatus, error.message, error.hint);
|
|
18
|
+
}
|
|
19
|
+
const hint = error.hint ? ` ${error.hint}` : "";
|
|
20
|
+
return `Error [${error.code}]: ${error.message}.${hint}`;
|
|
21
|
+
}
|
|
11
22
|
// Handle HTTP response errors
|
|
12
23
|
if (error && typeof error === "object" && "status" in error) {
|
|
13
24
|
const status = error.status;
|
|
14
|
-
|
|
15
|
-
case 400:
|
|
16
|
-
return ("Error: Bad request. Check that all required parameters are provided and formatted correctly. " +
|
|
17
|
-
extractErrorDetails(error));
|
|
18
|
-
case 401:
|
|
19
|
-
return ("Error: Authentication failed. Your access token may have expired. " +
|
|
20
|
-
"Try restarting the server to refresh the token, or check your BASECAMP_REFRESH_TOKEN is valid.");
|
|
21
|
-
case 403:
|
|
22
|
-
return ("Error: Access denied. You don't have permission to access this resource. " +
|
|
23
|
-
"Check that you're using the correct account ID and that your Basecamp user has access to this project/resource.");
|
|
24
|
-
case 404:
|
|
25
|
-
return ("Error: Resource not found. The requested resource (message, todo, project, etc.) doesn't exist or has been deleted. " +
|
|
26
|
-
"Verify the ID is correct and the resource hasn't been moved to trash.");
|
|
27
|
-
case 422:
|
|
28
|
-
return ("Error: Validation failed. The request data didn't pass Basecamp's validation rules. " +
|
|
29
|
-
extractErrorDetails(error) +
|
|
30
|
-
" Check the data format and required fields.");
|
|
31
|
-
case 429:
|
|
32
|
-
return ("Error: Rate limit exceeded. Too many requests have been made to the Basecamp API. " +
|
|
33
|
-
"Please wait a moment before trying again.");
|
|
34
|
-
case 500:
|
|
35
|
-
case 502:
|
|
36
|
-
case 503:
|
|
37
|
-
case 504:
|
|
38
|
-
return ("Error: Basecamp server error. The Basecamp API is experiencing issues. " +
|
|
39
|
-
"Please try again in a moment.");
|
|
40
|
-
default:
|
|
41
|
-
return `Error: API request failed with status ${status}. ${extractErrorDetails(error)}`;
|
|
42
|
-
}
|
|
25
|
+
return statusMessage(status, extractErrorDetails(error));
|
|
43
26
|
}
|
|
44
27
|
// Handle network/connection errors
|
|
45
28
|
if (error && typeof error === "object" && "code" in error) {
|
|
@@ -56,6 +39,47 @@ export function handleBasecampError(error) {
|
|
|
56
39
|
// Generic error fallback
|
|
57
40
|
return `Error: ${error instanceof Error ? error.message : String(error)}`;
|
|
58
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Map an HTTP status code to actionable guidance for LLMs.
|
|
44
|
+
*
|
|
45
|
+
* @param status - HTTP status code
|
|
46
|
+
* @param details - Extra details to append (from SDK message or response body)
|
|
47
|
+
* @param hint - Optional actionable hint from the SDK error
|
|
48
|
+
* @returns Human-readable error message with guidance
|
|
49
|
+
*/
|
|
50
|
+
function statusMessage(status, details = "", hint = "") {
|
|
51
|
+
const suffix = [details, hint].filter(Boolean).join(" ");
|
|
52
|
+
const tail = suffix ? ` ${suffix}` : "";
|
|
53
|
+
switch (status) {
|
|
54
|
+
case 400:
|
|
55
|
+
return ("Error: Bad request. Check that all required parameters are provided and formatted correctly." +
|
|
56
|
+
tail);
|
|
57
|
+
case 401:
|
|
58
|
+
return ("Error: Authentication failed. Your access token may have expired. " +
|
|
59
|
+
"Try restarting the server to refresh the token, or check your BASECAMP_REFRESH_TOKEN is valid.");
|
|
60
|
+
case 403:
|
|
61
|
+
return ("Error: Access denied. You don't have permission to access this resource. " +
|
|
62
|
+
"Check that you're using the correct account ID and that your Basecamp user has access to this project/resource.");
|
|
63
|
+
case 404:
|
|
64
|
+
return ("Error: Resource not found. The requested resource (message, todo, project, etc.) doesn't exist or has been deleted. " +
|
|
65
|
+
"Verify the ID is correct and the resource hasn't been moved to trash.");
|
|
66
|
+
case 422:
|
|
67
|
+
return ("Error: Validation failed. The request data didn't pass Basecamp's validation rules." +
|
|
68
|
+
tail +
|
|
69
|
+
" Check the data format and required fields.");
|
|
70
|
+
case 429:
|
|
71
|
+
return ("Error: Rate limit exceeded. Too many requests have been made to the Basecamp API. " +
|
|
72
|
+
"Please wait a moment before trying again.");
|
|
73
|
+
case 500:
|
|
74
|
+
case 502:
|
|
75
|
+
case 503:
|
|
76
|
+
case 504:
|
|
77
|
+
return ("Error: Basecamp server error. The Basecamp API is experiencing issues. " +
|
|
78
|
+
"Please try again in a moment.");
|
|
79
|
+
default:
|
|
80
|
+
return `Error: API request failed with status ${status}.${tail}`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
59
83
|
/**
|
|
60
84
|
* Extract additional error details from API response if available.
|
|
61
85
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorHandlers.js","sourceRoot":"","sources":["../../src/utils/errorHandlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,
|
|
1
|
+
{"version":3,"file":"errorHandlers.js","sourceRoot":"","sources":["../../src/utils/errorHandlers.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/oauth.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export declare function getClientCredentials(): {
|
|
|
2
2
|
clientId: string;
|
|
3
3
|
clientSecret: string;
|
|
4
4
|
};
|
|
5
|
+
export declare function refreshAccessToken(refreshToken: string, clientId: string, clientSecret: string): Promise<string>;
|
|
5
6
|
export declare function performBasecampOAuthLogin(): Promise<{
|
|
6
7
|
accessToken: string;
|
|
7
8
|
refreshToken: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/utils/oauth.ts"],"names":[],"mappings":"AAeA,wBAAgB,oBAAoB,IAAI;
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/utils/oauth.ts"],"names":[],"mappings":"AAeA,wBAAgB,oBAAoB,IAAI;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,CAWA;AA8CD,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAmBjB;AA+FD,wBAAsB,yBAAyB,IAAI,OAAO,CAAC;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CAqBD;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,EAAE,CAAC,CAe5B"}
|
package/dist/utils/oauth.js
CHANGED
|
@@ -47,6 +47,24 @@ async function exchangeCodeForTokens(code, clientId, clientSecret) {
|
|
|
47
47
|
const data = (await response.json());
|
|
48
48
|
return { accessToken: data.access_token, refreshToken: data.refresh_token };
|
|
49
49
|
}
|
|
50
|
+
export async function refreshAccessToken(refreshToken, clientId, clientSecret) {
|
|
51
|
+
const response = await fetch(TOKEN_URL, {
|
|
52
|
+
method: "POST",
|
|
53
|
+
headers: { "Content-Type": "application/json" },
|
|
54
|
+
body: JSON.stringify({
|
|
55
|
+
type: "refresh",
|
|
56
|
+
refresh_token: refreshToken,
|
|
57
|
+
client_id: clientId,
|
|
58
|
+
client_secret: clientSecret,
|
|
59
|
+
}),
|
|
60
|
+
});
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
const body = await response.text();
|
|
63
|
+
throw new Error(`Token refresh failed (${response.status}): ${body}`);
|
|
64
|
+
}
|
|
65
|
+
const data = (await response.json());
|
|
66
|
+
return data.access_token;
|
|
67
|
+
}
|
|
50
68
|
const SUCCESS_HTML = `<!DOCTYPE html>
|
|
51
69
|
<html>
|
|
52
70
|
<head><title>Basecamp MCP</title></head>
|
package/dist/utils/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/utils/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/utils/oauth.ts"],"names":[],"mappings":"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"}
|