Basecamp 2 MCP Server
This server lets Claude (or any MCP client) manage Basecamp 2 projects, todo lists, todos, comments, attachments, people, and activity feeds through natural language.
Projects: list/search projects, get project details, archive or unarchive a project
Todo lists: list all lists in a project, get a specific list with its todos, create new todo lists
Todos: create todos with assignee, due date, and attachments; update todo content, assignee, due date, completion, or position; get a todo including its comments
Comments: add comments to todos or todo lists, optionally with attachments and subscriber notifications
Attachments: upload a local file to Basecamp 2 to get an attachment token, then attach it to todos or comments
People: list all visible people and list people with access to a specific project
Activity feeds: get account-wide events (who did what, when, in which project) and per-person activity, with normalized summaries and optional raw payloads
Allows managing Basecamp 2 projects, todo lists, and todo items (including assignees, due dates, and attachments) via the Basecamp REST API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Basecamp 2 MCP ServerCreate a new todo list for the design project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Basecamp 2 MCP Server
An MCP (Model Context Protocol) server that wraps the Basecamp 2 REST API, enabling Claude to create and manage todos through natural language.
Prerequisites
Node.js 18+
A Basecamp 2 account with API credentials (username/password)
Related MCP server: Basecamp MCP Server by CData
Setup
Clone the repo and install dependencies:
git clone <repo-url>
cd Basecamp2_mcp
npm installCreate a
.envfile (or set environment variables directly):
cp .env.example .envFill in the 4 required variables:
Variable | Description |
| Your Basecamp account ID (the number in your Basecamp URL) |
| Your Basecamp login email |
| Your Basecamp login password |
| A User-Agent string identifying your app (e.g. |
Basecamp 2 requires a User-Agent with contact info per their API policy.
MCP Client Configuration
Claude Desktop
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"basecamp2": {
"command": "node",
"args": ["/absolute/path/to/Basecamp2_mcp/src/index.js"],
"env": {
"BASECAMP_ACCOUNT_ID": "your-account-id",
"BASECAMP_USERNAME": "your-email",
"BASECAMP_PASSWORD": "your-password",
"BASECAMP_USER_AGENT": "YourApp (you@example.com)"
}
}
}
}Claude Code
Add to your Claude Code settings (.claude/settings.json or via claude mcp add):
claude mcp add basecamp2 -- node /absolute/path/to/Basecamp2_mcp/src/index.jsSet the environment variables in your shell or .env file before starting Claude Code.
Tools
Tool | Description |
| List all active projects |
| Get details of a specific project |
| List all todo lists in a project |
| Get a todo list with its todos |
| Create a new todo list |
| Create a todo item (with optional assignee, due date, attachments) |
| Update a todo (content, assignee, due date, completion, position) |
| Get a todo item including its comments |
| Comment on a todo or todo list (with optional attachments) |
| Upload a file and get an attachment token + name |
| List all people visible to you |
| List people with access to a project |
| Account-wide activity feed — who did what, when, in which project |
| One person's activity — what they commented on, changed, completed or created |
Troubleshooting
"Missing required environment variables" — Ensure all 4 env vars are set. Check .env.example for the list.
401 Unauthorized — Verify your username and password. Basecamp 2 uses HTTP Basic Auth with your login credentials.
403 Forbidden — Your User-Agent may be missing or not include contact info.
429 Too Many Requests — The server automatically retries once after the Retry-After delay. If you still hit rate limits, slow down your requests.
Connection errors — Confirm your BASECAMP_ACCOUNT_ID is correct and that you can access https://basecamp.com/<id> in a browser.
Activity feeds
list_events and list_person_events wrap Basecamp 2's events.json endpoints. They exist for
answering "what has this person been up to" without asking them — the per-person route is the one
BC2 serves best.
Both return a normalized row by default:
{ "id": 2814733369,
"created_at": "2026-09-16T04:07:22.000-07:00",
"action": "commented on",
"summary": "commented on TIME QUOTE: CV2 - Envisia Learning - Adding results from another as...",
"target": "TIME QUOTE: CV2 - Envisia Learning - Adding results from another as...",
"excerpt": "The import file would be around 5-6 hours The report scoring would be around 4 hours",
"creator": null,
"project": { "id": 17514231, "name": "@Time Quotes" },
"eventable": { "type": "Todo", "id": 519880692 },
"url": "https://basecamp.com/1757845/projects/17514231/todos/519880692#comment_978900828" }Two things worth knowing:
actionandsummaryarrive with raw HTML. A renamed to-do comes back aschanged a to-do from '<img alt="x" src="https://bcx-production-assets-cdn…'. Both tools strip tags and entities;excerptprefers Basecamp's already-plainraw_excerpt. Passraw: truefor the untouched payload.creatorisnullonlist_person_events— Basecamp omits it because the person is implied by the path. Attribute from theperson_idyou asked for, never from this field. It IS populated onlist_events.
Always pass since (ISO8601); without it you get only the most recent page. all_pages: true
paginates the whole window, which can be slow over a long one.
Available Tools
13 toolsarchive_projectC
Archive or unarchive a Basecamp 2 project
| Name | Required | Description | Default |
|---|---|---|---|
| archived | Yes | true to archive, false to unarchive | |
| project_id | Yes | The project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It implies a reversible mutation ('or unarchive'), but does not state permission requirements, side effects, or whether archiving hides the project from other listings. These gaps matter for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with zero waste, front-loading the action and the target resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is too thin. It should explain side effects (e.g., visibility to other users), required permissions, and whether the operation is reversible, but leaves these unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented. The description restates the archive/unarchive concept but adds no syntax or extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Archive or unarchive a Basecamp 2 project.' It clearly covers both the archive and unarchive operations. However, it does not explicitly differentiate itself from any sibling tool, though no sibling overlaps this capability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, prerequisites, or alternative tools are mentioned. The agent must infer that this is the correct tool for changing project archival status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_commentC
Create a comment on a todo or todo list
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Whether to comment on a todo or todolist | |
| content | Yes | The comment text | |
| project_id | Yes | The project ID | |
| attachments | No | Files to attach, as { token, name } objects (token from upload_attachment) | |
| resource_id | Yes | The ID of the todo or todolist | |
| subscribers | No | Person IDs to notify about this comment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states that it creates a comment but does not mention required permissions, whether the comment triggers notifications (subscribers parameter exists), whether it is reversible, or what the response looks like. This is a significant gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with no waste. It is appropriately sized and front-loaded, though it could be slightly more informative without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, 4 required, mutation operation, relationships with siblings like upload_attachment and list_people), the description is incomplete. It lacks usage context, behavioral details, and any information about side effects or integration with other tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds no additional parameter semantics beyond what is in the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a comment on a todo or todo list'), which is clear and matches the tool's function. However, it does not differentiate from sibling tools like create_todo or create_todolist, which are similarly named, so an agent might confuse which creation tool to use without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives. It does not mention prerequisites such as needing a todo or todolist to exist, or how it relates to sibling tools like upload_attachment for attachments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_todoC
Create a new todo item in a todo list
| Name | Required | Description | Default |
|---|---|---|---|
| due_at | No | Due date in ISO 8601 format (YYYY-MM-DD) | |
| content | Yes | The todo text | |
| project_id | Yes | The project ID | |
| assignee_id | No | Person ID to assign the todo to | |
| attachments | No | Files to attach, as { token, name } objects (token from upload_attachment) | |
| todolist_id | Yes | The todo list ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, but only restates the mutation. It says nothing about required permissions, whether the created todo is assigned/notified, whether attachments must be uploaded first via upload_attachment, or what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with zero padding or redundancy. It is lean, though the brevity veers toward under-specification rather than over-explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter creation tool with no annotations and no output schema, the description omits the project/todolist scoping requirement and the attachment workflow, leaving significant gaps an agent must infer from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (due_at format, attachment token origin, assignee_id) is already documented in the schema. The description adds no format, default, or relationship detail beyond 'todo item in a todo list', so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Create a new todo item') with immediate scope ('in a todo list'), so the agent knows this creates rather than updates or lists todos. However, it never distinguishes itself from siblings like create_todolist or create_comment beyond the resource name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as update_todo for modifying an existing item. The agent gets no routing help beyond the tool name itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_todolistC
Create a new todo list in a project
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the todo list | |
| project_id | Yes | The project ID | |
| description | No | Description of the todo list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It implies a mutation but says nothing about required permissions, whether the list name must be unique within the project, or whether the project_id must reference an existing project.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler or redundancy. It is efficient, though its brevity leaves room for more useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter creation tool with a fully documented schema and no output schema, the description is minimally adequate. It omits any behavioral context around the mutation, which is a gap given the absence of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (name, project_id, description) are already documented in the schema. The description adds no syntax or format detail beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource combination ("Create a new todo list") and adds scope ("in a project"). It does not explicitly differentiate from siblings like create_todo, though the name and resource make the distinction reasonably obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as create_todo, nor any stated prerequisites. The agent must infer that this is used when a new list is needed inside an existing project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectC
Get details of a specific project
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It says nothing about read-only nature, authentication needs, or return shape. For a read tool with zero annotation coverage, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no waste. It is appropriately sized for a simple getter, though it is almost too terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required parameter, no output schema, no annotations). The description covers the basic purpose but omits any behavioral context such as read-only semantics or expected response. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single required project_id parameter. The description adds no parameter details beyond what the schema provides; baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (project) with scope (specific project). Distinguishes from list_projects by implying single-item retrieval, though it does not explicitly name or contrast with siblings like get_project_accesses or list_projects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no alternatives mentioned, and no exclusions. The agent must infer that this is for fetching one project by ID rather than listing projects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_accessesC
List all people with access to a specific project
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the entire burden. It implies a read-only list operation but says nothing about required permissions, whether owners/admins/guests are included, what the 'access' concept covers, or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. It is efficient, though its brevity borders on under-specification rather than tight concision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter list tool with no output schema, the description is minimally adequate. It omits what the returned access entries contain (roles, permissions) and any authorization context, which would help an agent call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so project_id is already documented in the schema. The description adds only the notion of 'a specific project', matching the schema baseline without extra syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (people with access to a specific project), which is clear enough to distinguish it from siblings like list_people and get_project. However, it doesn't explicitly contrast itself with list_people, which could be confused as a broader version of the same thing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as list_people or get_project. The agent must infer usage purely from the one-line purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_todoB
Get a specific todo item including its comments
| Name | Required | Description | Default |
|---|---|---|---|
| todo_id | Yes | The todo ID | |
| project_id | Yes | The project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses one useful trait — that comments are bundled into the response — but says nothing about read-only safety, permission requirements, or behavior when the todo_id is not found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and the inclusion of comments are both stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool this is minimally adequate, particularly since 100% schema coverage documents the inputs. However, with no output schema and no annotations, the description could have described the returned item shape or error behavior and does not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both project_id and todo_id are documented in the schema), so the baseline of 3 applies. The description adds no extra meaning about parameter format or constraints beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (todo item), and adds a scope detail — that comments are included — which distinguishes it from a bare item fetch or the sibling list_todolists/create_todo tools. It stops short of naming get_todolist or explaining how it differs from that sibling, so it isn't fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus get_todolist, list_todolists, or update_todo, and no prerequisites or context are given. The description simply says what it does, leaving the agent to infer selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_todolistB
Get a specific todo list with its todos
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The project ID | |
| todolist_id | Yes | The todo list ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It doesn't mention whether this is a read-only operation (though implied by 'get'), nor does it describe error behavior, permissions, or response format. It only says it gets the list and its todos.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that is front-loaded with the action and resource. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (2 parameters, no output schema, no annotations), the description is adequate but minimal. It doesn't explain what 'with its todos' means (e.g., whether it includes nested todos or just a list), leaving some ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds no additional parameter semantics beyond what is in the schema. A baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (get) and resource (a specific todo list with its todos), which is clear. It distinguishes itself from list_todolists (which would list all lists) and from get_todo (which gets a single todo). However, it doesn't explicitly contrast with these siblings in the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like list_todolists or get_todo. The description merely states what it does, not when it should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_peopleA
List all people visible to the current user. Returns id, name, and email.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose two useful behavioral facts: results are filtered to the current user's visibility, and the return shape is id/name/email. It says nothing about pagination, ordering, or whether the list can be empty, which for a directory-style listing is a real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the scoping constraint front-loaded before the return-value statement. Nothing could be trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read with no annotations and no output schema, the description covers purpose, scope, and return fields. The only missing element is any note on result size or pagination, which is minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description adds the returned field set (id, name, email), which is useful given there is no output schema, and introduces no misleading parameter expectations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (people) with an explicit scope: 'visible to the current user.' That scope clause is genuinely informative, but the description does not distinguish it from the other list_* siblings (list_todolists, list_projects), which the name already largely separates by resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and by the visibility scope, but there is no explicit when-to-use, no exclusions, and no mention of alternatives among the many sibling list tools. Adequate for a trivial tool, but nothing is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsA
Search for active Basecamp 2 projects by name. Returns id, name, and description. Use a search term to filter — omit to list all.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Case-insensitive search term to filter projects by name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full load. It helpfully discloses scope ('active' projects only, implying archived ones are excluded) and the returned fields (id, name, description), but says nothing about pagination, result limits, or auth despite being a listing operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and what is returned, with no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields and the active-only scope. It omits pagination and result-limit behavior, but is otherwise sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (case-insensitive filter is documented there), and the description adds the behavioral meaning of omitting the term ('omit to list all'), which the schema alone does not convey. Slight value-add beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Search for active Basecamp 2 projects by name.' The resource 'projects' is distinguishable from siblings like get_project and list_todolists, though it does not explicitly contrast itself with get_project for a single project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how to use the search term ('omit to list all'), which is param usage rather than when-to-use guidance. It never states when to choose this over get_project or another sibling, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_todolistsB
List all todo lists in a project
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it only restates the listing action. It never states that this is a read-only operation, whether project access/permissions are required, whether results are paginated or truncated, or what happens if project_id does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the verb and resource, with no filler or redundancy. Nothing could be removed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter list tool, the definition covers the minimum: what it lists and its scope. Without annotations or an output schema it should at least note the read-only nature and return shape, which it omits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single required parameter, so the schema already documents project_id fully. The phrase 'in a project' implies the scoping but adds no format, type, or validity detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('todo lists') with scope ('in a project'), so an agent can distinguish it from get_todolist and create_todolist by intent. It stops short of naming a sibling explicitly, so it does not reach the 5 tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no reference to the alternatives (get_todolist for a single list, create_todolist for creation). The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_todoC
Update an existing todo item
| Name | Required | Description | Default |
|---|---|---|---|
| due_at | No | Due date (YYYY-MM-DD), or null to remove | |
| content | No | New todo text | |
| todo_id | Yes | The todo ID | |
| position | No | Position in the list (1-based) | |
| completed | No | Whether the todo is completed | |
| project_id | Yes | The project ID | |
| assignee_id | No | Person ID to assign to, or null to unassign |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it discloses almost nothing. It doesn't say whether this is a partial/patch update, what permissions are required, whether omitted fields are preserved, or whether the change is reversible. 'Update' at least signals a mutation, but that is the bare minimum.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single, front-loaded sentence with no wasted words. The downside is under-specification rather than verbosity, which is properly penalized in other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no annotations and no output schema, one sentence is insufficient. The agent learns nothing about partial-update semantics, permission requirements, or side effects, leaving gaps the schema cannot fill.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all seven parameters individually documented (including null semantics for due_at and assignee_id). The description adds no parameter meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb ('Update') and resource ('an existing todo item'), so the purpose is unambiguous. It does not differentiate from sibling operations like create_todo or get_todo, nor does it indicate which fields are mutable, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as create_todo or get_todo, and no prerequisites or conditions are stated. The agent must infer usage entirely from the name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_attachmentA
Upload a file to Basecamp 2 and get an attachment token. Returns { token, name }; pass both (as one of the "attachments" entries) to create_todo or create_comment to actually attach the file.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Absolute path to the file to upload | |
| content_type | Yes | MIME type of the file (e.g. image/png) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. It does disclose the return payload and the non-obvious two-step semantics (upload then attach), which is genuinely useful. However it says nothing about permissions, file size limits, failure modes, or whether the token expires, all of which matter for a write-oriented upload endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler. The purpose is front-loaded and the downstream handoff follows immediately, so the most actionable information appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by spelling out the returned shape and how to consume it, which is the main ambiguity an agent faces. It is nearly complete for a 2-parameter tool, falling short only on error/limit behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in the schema itself (absolute path, MIME type). The description adds no syntax, format, or constraint detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (upload) and resource (a file to Basecamp 2), and goes further by naming the concrete artifact produced (an attachment token). It also differentiates itself from siblings by naming create_todo and create_comment as the consumers of its output, so an agent can place it in the workflow without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent that uploading alone does not attach anything and that both returned fields must be passed as an 'attachments' entry to create_todo or create_comment. That is an unambiguous when-to-use and how-to-chain instruction, which is exactly the guidance missing from most mutation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v1.1.0- First observed
archive_project - First observed
create_comment - First observed
create_todo - First observed
create_todolist - First observed
get_project - First observed
get_project_accesses - First observed
get_todo - First observed
get_todolist - First observed
list_people - First observed
list_projects - First observed
list_todolists - First observed
update_todo - First observed
upload_attachment
TDQS
Scored across 13 tools
Tools are mostly distinct, but the presence of both 'list_todolists' and 'get_todolist' could be confused, as they both retrieve todo lists. However, descriptions clarify the difference between listing all and getting a specific one with todos.
All tool names follow a consistent verb_noun pattern (e.g., list_todolists, get_project, create_todo). There are no naming inconsistencies; even compound nouns like 'todolists' are used consistently.
13 tools is well within the ideal range (3-15) and each tool serves a clear purpose in the Basecamp 2 domain. The count is appropriate for covering core operations without being excessive.
The toolset covers projects, todolists, todos, comments, attachments, and people, but lacks delete operations for todos/todolists, and doesn't include updates for projects or todolists. These gaps may hinder full lifecycle management.
Maintenance
Related MCP Connectors
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that connects Claude with Todoist for complete task and project management through natural language.86199 npm247MIT
- AlicenseNot gradedqualityDmaintenanceThis read-only MCP Server allows you to connect to Basecamp data from Claude Desktop through CData JDBC Drivers. Free (beta) read/write servers available at https://www.cdata.com/solutions/mcp2MIT
- AlicenseAqualityCmaintenanceA local MCP server for Todoist task management, enabling Claude to create, read, update, complete, delete, and move tasks, manage projects and labels, and add comments via the Todoist REST and Sync APIs.151MIT
- FlicenseNot gradedqualityFmaintenanceMCP server that connects Claude to Todoist, enabling full CRUD operations on tasks, projects, sections, comments, and labels.-