basecamp_list_people
Retrieve all users in a Basecamp account, optionally filtering by name, email, or title using regular expressions.
Instructions
List all people in the Basecamp account.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Optional regular expression to filter people by name, email, or title |
Implementation Reference
- src/tools/people.ts:83-127 (handler)Executes the tool logic: initializes Basecamp client, lists all people using paged API, applies optional regex filter on name/email/title, returns JSON array of people data, handles errors.async (params) => { try { const client = await initializeBasecampClient(); const people = await asyncPagedToArray({ fetchPage: client.people.list, request: { query: {} }, }); // Apply filter if provided let filteredPeople = people; if (params.filter) { const regex = new RegExp(params.filter, "i"); filteredPeople = people.filter( (p) => regex.test(p.name) || regex.test(p.email_address || "") || regex.test(p.title || ""), ); } return { content: [ { type: "text", text: JSON.stringify( filteredPeople.map((p) => ({ id: p.id, name: p.name, email: p.email_address, title: p.title, attachable_sgid: p.attachable_sgid, })), null, 2, ), }, ], }; } catch (error) { return { content: [{ type: "text", text: handleBasecampError(error) }], }; } },
- src/tools/people.ts:68-75 (schema)Zod input schema defining optional 'filter' string parameter for filtering people list.inputSchema: { filter: z .string() .optional() .describe( "Optional regular expression to filter people by name, email, or title", ), },
- src/tools/people.ts:63-128 (registration)Registers the basecamp_list_people tool on the MCP server with title, description, input schema, annotations, and handler function.server.registerTool( "basecamp_list_people", { title: "List Basecamp People", description: "List all people in the Basecamp account.", inputSchema: { filter: z .string() .optional() .describe( "Optional regular expression to filter people by name, email, or title", ), }, annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true, }, }, async (params) => { try { const client = await initializeBasecampClient(); const people = await asyncPagedToArray({ fetchPage: client.people.list, request: { query: {} }, }); // Apply filter if provided let filteredPeople = people; if (params.filter) { const regex = new RegExp(params.filter, "i"); filteredPeople = people.filter( (p) => regex.test(p.name) || regex.test(p.email_address || "") || regex.test(p.title || ""), ); } return { content: [ { type: "text", text: JSON.stringify( filteredPeople.map((p) => ({ id: p.id, name: p.name, email: p.email_address, title: p.title, attachable_sgid: p.attachable_sgid, })), null, 2, ), }, ], }; } catch (error) { return { content: [{ type: "text", text: handleBasecampError(error) }], }; } }, );
- src/index.ts:65-65 (registration)Top-level invocation of registerPeopleTools which includes registration of basecamp_list_people.registerPeopleTools(server);