Basecamp MCP Server
Manage Basecamp content from an MCP client: authenticate, browse and edit projects, messages, todos, comments, kanban cards, docs/files, check-ins, and activity.
Authenticate via OAuth (
basecamp_login), logout, and check current user (basecamp_whoami,basecamp_get_me).List/get projects, people, and message types.
Messages: list, get, create, update (full or partial HTML content with append/prepend/search-replace).
TODOs: get todo set, list todos, create/update/complete/uncomplete todos with due dates, assignees, and rich content.
Comments: list, create, and update comments on any resource.
Kanban: list columns/cards, get/create/update cards with checklist steps, move cards.
Activity: cross-project recording search and campfire message browsing with filters (type, person, date, text, project, status).
Docs & Files: manage vaults, documents, and uploads; download inline blobs; upload files/URLs to get embeddable sgids.
Check-ins: list questions/answers, get details, and post answers.
Supports rich text with mentions by person ID and attachments via
<bc-attachment>tags.
Enables comprehensive project management through Basecamp's API, including managing projects, messages, todos, comments, people, and kanban boards with support for creating, reading, updating content and handling pagination.
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 MCP Server list active todos in the 'Website Redesign' 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 MCP Server
Model Context Protocol (MCP) server for Basecamp. Gives LLMs tools for projects, messages, todos, comments, people, kanban boards, docs & files, check-ins, and campfire chat.
48 tools, published on npm and installable with one npx command: no cloning, no virtualenv, no manual OAuth script to run.
Why this server
Zero-install setup:
npx basecamp-mcp@latestruns the server directly from npm. Authentication is one MCP tool call (basecamp_login) that opens a browser; there's no separate script to clone and run by hand.Full Docs & Files support: read and write vaults (folders), documents, and uploads, and download inline
<bc-attachment>blobs embedded in rich text. Images come back inline, text files as text, everything else saved to disk. Upload a local file or a remote URL to get thesgidthat embeds it in rich text.Check-ins (Q&A) support: list automatic check-in questions and their answers, or post new answers programmatically.
Granular content editing: messages, comments, documents, and kanban cards all support append, prepend, and search-replace operations, not just full-text replacement, so an LLM can make a small edit without resending the whole document.
Mentions by person ID: every tool that writes rich text takes
<bc-attachment person-id="123">anywhere in the HTML and turns it into a real mention. An unknown ID is an error and nothing is posted, instead of a broken mention that notifies nobody.Cross-project activity feed:
basecamp_list_recordingssearches across every project by type, person, date range, and free text in one call, with automatic response-size management and pagination.Type-safe end to end: written in TypeScript with Zod schemas validating every tool input.
Tested against the real API: the test suite exercises every tool category (messages, todos, kanban, comments, docs/files, check-ins, campfires, activity) against a live Basecamp account, not mocks.
Related MCP server: Basecamp MCP Server
Getting Started
The Basecamp MCP server requires Node.js 18+ and works with various MCP clients including Claude Code CLI, Claude Desktop, Cursor, VS Code, and others.
Prerequisites
You need a Basecamp OAuth app. Register one at 37signals Launchpad with the redirect URI set to http://localhost:7652/callback.
Installation
Add the MCP server to your client with your OAuth credentials:
{
"mcpServers": {
"basecamp": {
"command": "npx",
"args": ["-y", "basecamp-mcp@latest"],
"env": {
"BASECAMP_CLIENT_ID": "your_client_id",
"BASECAMP_CLIENT_SECRET": "your_client_secret"
}
}
}
}Claude Code CLI:
claude mcp add basecamp npx basecamp-mcp@latest \
-e BASECAMP_CLIENT_ID=your_client_id \
-e BASECAMP_CLIENT_SECRET=your_client_secretClaude Desktop: Follow the MCP install guide using the JSON config above.
Cursor: Add configuration through Settings → Tools & Integrations → New MCP Server.
VS Code:
code --add-mcp '{"name":"basecamp","command":"npx","args":["-y", "basecamp-mcp@latest"]}'Authentication
Once the MCP server is running, authenticate using the built-in login tool:
Call
basecamp_loginto open a browser window for Basecamp authorizationAuthorize the app in your browser
If you have multiple Basecamp accounts, call
basecamp_loginagain with the desiredaccount_idDone! Credentials are saved to
~/.config/basecamp-mcp/credentials.json
Use basecamp_whoami to check who you're logged in as, and basecamp_logout to remove stored credentials.
Configuration
The server requires these environment variables:
BASECAMP_CLIENT_ID— Your Basecamp OAuth client IDBASECAMP_CLIENT_SECRET— Your Basecamp OAuth client secret
Available Tools
Authentication
basecamp_login- Authenticate with Basecamp via OAuth browser flowbasecamp_logout- Remove stored credentialsbasecamp_whoami- Show the currently authenticated user
Projects
basecamp_list_projects- List all accessible projects with optional filteringbasecamp_get_project- Get detailed project information including dock configuration
Messages
basecamp_list_messages- List messages in a message board with optional filteringbasecamp_list_message_types- List available message types/categories for a projectbasecamp_get_message- Get single message detailsbasecamp_create_message- Create new message with optional category and draft statusbasecamp_update_message- Update message with advanced content editing (supports full replacement, append, prepend, search/replace)
TODOs
basecamp_get_todoset- Get todo set container with all todo listsbasecamp_create_todolist- Create a todo list in a todo set, with an optional descriptionbasecamp_update_todolist- Rename a todo list or a group (section), or edit its descriptionbasecamp_move_todolist- Move a todo list to the top, the bottom, or before/after another listbasecamp_create_todolist_group- Create a group (section) in a todo list, at the bottom or at a given placebasecamp_move_todolist_group- Move a group (section) among the groups of its todo listbasecamp_list_todos- List todos in a list, with their groups, and status filtering (active/archived)basecamp_create_todo- Create new todo with optional descriptionbasecamp_update_todo- Update a todo's title, description, due date, or assigneesbasecamp_move_todo- Move a todo to the top, the bottom, or before/after another todo, also into a different list or groupbasecamp_reorder_todos- Set the order of all the todos in a list or group, for example to sort them by due datebasecamp_complete_todo- Mark todo as completebasecamp_uncomplete_todo- Mark todo as incomplete
Comments
basecamp_list_comments- List comments on any resource (works universally on all recording types)basecamp_create_comment- Add comment to any resourcebasecamp_update_comment- Update comment with advanced content editing (supports full replacement, append, prepend, search/replace)
People
basecamp_get_me- Get personal information for the authenticated userbasecamp_list_people- List all people with optional filtering by name, email, or titlebasecamp_get_person- Get person details
Kanban
basecamp_list_kanban_columns- List all columns in a kanban boardbasecamp_list_kanban_cards- List cards in a column with steps and assigneesbasecamp_get_kanban_card- Get complete details of a specific cardbasecamp_create_kanban_card- Create new card with title, content, and optional checklist stepsbasecamp_update_kanban_card- Update card with advanced content editing (supports full replacement, append, prepend, search/replace, plus title, due date, assignees, notifications, and complete step array management)basecamp_move_kanban_card- Move a card to a different column and/or position
Activity
basecamp_list_recordings- Browse recent activity globally or across specific projects, with filtering by type, date range, person, and text search. All filters support multiple values for OR-matching (e.g., multiple project IDs, person IDs, types, or search terms)basecamp_list_campfire_messages- Browse chat messages from Campfires with filtering by campfire, person, text content, and date range. All filters support multiple values for OR-matching
Docs & Files
basecamp_list_vaults- List sub-vaults (folders) under a parent vaultbasecamp_get_vault- Get a vault's details, including document/upload/sub-vault countsbasecamp_create_vault- Create a new vault (folder)basecamp_update_vault- Rename a vaultbasecamp_list_documents- List documents in a vault, with optional title/content filteringbasecamp_get_document- Get a document's full HTML contentbasecamp_create_document- Create a new document (active or draft)basecamp_update_document- Update a document with advanced content editing (supports full replacement, append, prepend, search/replace)basecamp_list_uploads- List files uploaded to a vaultbasecamp_get_upload- Retrieve an uploaded file: images are returned inline, text files as text, other binary formats saved to diskbasecamp_download_blob- Download an inline<bc-attachment>attachment referenced in document/message/comment HTML contentbasecamp_create_attachment- Upload a local file or a remote URL and get theattachable_sgidto embed it with<bc-attachment>
Check-ins (Q&A)
basecamp_get_questionnaire- Get a project's check-ins containerbasecamp_list_questions- List automatic check-in questions with schedule and answer countsbasecamp_get_question- Get a single check-in questionbasecamp_list_answers- List answers to a check-in questionbasecamp_get_answer- Get a single check-in answerbasecamp_create_answer- Post a new answer to a check-in question
Trash
basecamp_trash- Move any item (todo list, group, todo, message, comment, document, folder, upload, card) to the trash, with the items in itbasecamp_restore- Bring an item back from the trash or the archive
Development
# Install dependencies
npm install
# Run type checking
npx tsc --noEmit
# Build
npm run build
# Run the live test suite (requires a real, authenticated Basecamp account)
npm test
# Clean build artifacts
npm run cleanLicense
MIT
Available Tools
57 toolsbasecamp_complete_todoComplete Basecamp TodoBIdempotent
Mark a todo as completed.
Inputs: todo_id (required).
basecamp_create_answerCreate Basecamp Check-in AnswerB
Create a new answer for a check-in question. Content must be HTML.
Inputs: content (required), group_on (required), question_id (required).
basecamp_create_attachmentCreate Basecamp AttachmentA
Upload a file to Basecamp and get the attachable_sgid needed to embed it in rich text. Use this when you want to show an image or a video in a message, comment, document, card or todo, and that file is not in Basecamp yet — for example an image at an external URL, or a screenshot on disk. Give either file_path or url. The returned sgid goes into a tag. An sgid is tied to this account and does not expire, but it is only shown once here, so embed it in the same session.
Inputs: url, name, file_path, content_type.
basecamp_create_commentCreate Basecamp CommentB
Add a comment to any Basecamp resource (message, todo, card, etc.).
Inputs: content (required), recording_id (required).
basecamp_create_documentCreate Basecamp DocumentA
Create a new document in a vault.
HTML rules for content:
Allowed tags: p, span, h2, h3, h4, br, strong, em, strike, code, a (with href attribute), pre, ol, ul, li, blockquote, mark, figure, figcaption, table, tbody, tr, th, td, div, bc-attachment.
Wrap every paragraph in ..., and put between one paragraph and the next. Both parts are necessary: newlines and blank lines in your HTML are discarded, and Basecamp shows no space around a on its own, so two paragraphs with nothing between them are shown as one block of text. Do not rely on line breaks in your HTML to separate paragraphs.
Headings: use , , as appropriate.
Inline code: text. Preformatted blocks: text.
Ordered lists: .... Unordered: ....
Tables: Heading...Cell...
To mention a person: . Put the tag where the name must show in the text, for example "Thanks for the fix". The person gets a notification. If the ID is not a person, the tool returns an error and writes nothing. Get person IDs from basecamp_list_people, or from the people in other responses (assignees, creators).
Single image:
Image gallery: wrap multiple in a .
A bc-attachment needs an attachable_sgid. For a file that is already in Basecamp, take the sgid from the HTML content of the message, comment or card that shows it, or use basecamp_list_recordings. For a file that is not in Basecamp yet, such as an image at an external URL or a screenshot on disk, upload it with basecamp_create_attachment and use the sgid that it returns. There is no tag, so an external image URL can never be embedded directly: upload it, or accept that it stays a plain link.
Basecamp auto-enriches bc-attachment tags after saving (adds url, href, filename, content-type, etc.) — you never need to write those.
When you see an existing, already-enriched tag (e.g. from a previous list/get call), leave its inner HTML alone. Before any content_append/content_prepend/search_replace runs, it is automatically collapsed back to its minimal form (sgid, presentation, caption, and content-type for mentions) — you don't need to strip it yourself, and doing so manually is unnecessary and risks mismatched find strings.
Background highlights: ...
Text color highlights: ...
For both, N is 1 (yellow), 2 (amber), 3 (red), 4 (pink), 5 (purple), 6 (blue), 7 (teal), 8 (near-white), or 9 (light gray).
Inputs: title (required), content (required), vault_id (required), status.
basecamp_create_kanban_cardCreate Kanban CardA
Create a new card in a kanban column with optional checklist steps.
HTML rules for content:
Allowed tags: p, span, h2, h3, h4, br, strong, em, strike, code, a (with href attribute), pre, ol, ul, li, blockquote, mark, figure, figcaption, table, tbody, tr, th, td, div, bc-attachment.
Wrap every paragraph in ..., and put between one paragraph and the next. Both parts are necessary: newlines and blank lines in your HTML are discarded, and Basecamp shows no space around a on its own, so two paragraphs with nothing between them are shown as one block of text. Do not rely on line breaks in your HTML to separate paragraphs.
Headings: use , , as appropriate.
Inline code: text. Preformatted blocks: text.
Ordered lists: .... Unordered: ....
Tables: Heading...Cell...
To mention a person: . Put the tag where the name must show in the text, for example "Thanks for the fix". The person gets a notification. If the ID is not a person, the tool returns an error and writes nothing. Get person IDs from basecamp_list_people, or from the people in other responses (assignees, creators).
Single image:
Image gallery: wrap multiple in a .
A bc-attachment needs an attachable_sgid. For a file that is already in Basecamp, take the sgid from the HTML content of the message, comment or card that shows it, or use basecamp_list_recordings. For a file that is not in Basecamp yet, such as an image at an external URL or a screenshot on disk, upload it with basecamp_create_attachment and use the sgid that it returns. There is no tag, so an external image URL can never be embedded directly: upload it, or accept that it stays a plain link.
Basecamp auto-enriches bc-attachment tags after saving (adds url, href, filename, content-type, etc.) — you never need to write those.
When you see an existing, already-enriched tag (e.g. from a previous list/get call), leave its inner HTML alone. Before any content_append/content_prepend/search_replace runs, it is automatically collapsed back to its minimal form (sgid, presentation, caption, and content-type for mentions) — you don't need to strip it yourself, and doing so manually is unnecessary and risks mismatched find strings.
Background highlights: ...
Text color highlights: ...
For both, N is 1 (yellow), 2 (amber), 3 (red), 4 (pink), 5 (purple), 6 (blue), 7 (teal), 8 (near-white), or 9 (light gray).
Inputs: title (required), column_id (required), steps, due_on, +3 more.
basecamp_create_messageCreate Basecamp MessageB
Create a new message in a Basecamp message board.
Inputs: subject (required), message_board_id (required), status, content, +1 more.
basecamp_create_todoCreate Basecamp TodoB
Create a new todo item in a todo list.
HTML rules for content:
Allowed tags: p, span, h2, h3, h4, br, strong, em, strike, code, a (with href attribute), pre, ol, ul, li, blockquote, mark, figure, figcaption, table, tbody, tr, th, td, div, bc-attachment.
Wrap every paragraph in ..., and put between one paragraph and the next. Both parts are necessary: newlines and blank lines in your HTML are discarded, and Basecamp shows no space around a on its own, so two paragraphs with nothing between them are shown as one block of text. Do not rely on line breaks in your HTML to separate paragraphs.
Headings: use , , as appropriate.
Inline code: text. Preformatted blocks: text.
Ordered lists: .... Unordered: ....
Tables: Heading...Cell...
To mention a person: . Put the tag where the name must show in the text, for example "Thanks for the fix". The person gets a notification. If the ID is not a person, the tool returns an error and writes nothing. Get person IDs from basecamp_list_people, or from the people in other responses (assignees, creators).
Single image:
Image gallery: wrap multiple in a .
A bc-attachment needs an attachable_sgid. For a file that is already in Basecamp, take the sgid from the HTML content of the message, comment or card that shows it, or use basecamp_list_recordings. For a file that is not in Basecamp yet, such as an image at an external URL or a screenshot on disk, upload it with basecamp_create_attachment and use the sgid that it returns. There is no tag, so an external image URL can never be embedded directly: upload it, or accept that it stays a plain link.
Basecamp auto-enriches bc-attachment tags after saving (adds url, href, filename, content-type, etc.) — you never need to write those.
When you see an existing, already-enriched tag (e.g. from a previous list/get call), leave its inner HTML alone. Before any content_append/content_prepend/search_replace runs, it is automatically collapsed back to its minimal form (sgid, presentation, caption, and content-type for mentions) — you don't need to strip it yourself, and doing so manually is unnecessary and risks mismatched find strings.
Background highlights: ...
Text color highlights: ...
For both, N is 1 (yellow), 2 (amber), 3 (red), 4 (pink), 5 (purple), 6 (blue), 7 (teal), 8 (near-white), or 9 (light gray).
Inputs: title (required), todolist_id (required), due_on, notify, +3 more.
basecamp_create_todolistCreate Basecamp Todo ListA
Create a new todo list in a todo set. Get the todoset_id from the project dock (basecamp_get_project).
HTML rules for content:
Allowed tags: p, span, h2, h3, h4, br, strong, em, strike, code, a (with href attribute), pre, ol, ul, li, blockquote, mark, figure, figcaption, table, tbody, tr, th, td, div, bc-attachment.
Wrap every paragraph in ..., and put between one paragraph and the next. Both parts are necessary: newlines and blank lines in your HTML are discarded, and Basecamp shows no space around a on its own, so two paragraphs with nothing between them are shown as one block of text. Do not rely on line breaks in your HTML to separate paragraphs.
Headings: use , , as appropriate.
Inline code: text. Preformatted blocks: text.
Ordered lists: .... Unordered: ....
Tables: Heading...Cell...
To mention a person: . Put the tag where the name must show in the text, for example "Thanks for the fix". The person gets a notification. If the ID is not a person, the tool returns an error and writes nothing. Get person IDs from basecamp_list_people, or from the people in other responses (assignees, creators).
Single image:
Image gallery: wrap multiple in a .
A bc-attachment needs an attachable_sgid. For a file that is already in Basecamp, take the sgid from the HTML content of the message, comment or card that shows it, or use basecamp_list_recordings. For a file that is not in Basecamp yet, such as an image at an external URL or a screenshot on disk, upload it with basecamp_create_attachment and use the sgid that it returns. There is no tag, so an external image URL can never be embedded directly: upload it, or accept that it stays a plain link.
Basecamp auto-enriches bc-attachment tags after saving (adds url, href, filename, content-type, etc.) — you never need to write those.
When you see an existing, already-enriched tag (e.g. from a previous list/get call), leave its inner HTML alone. Before any content_append/content_prepend/search_replace runs, it is automatically collapsed back to its minimal form (sgid, presentation, caption, and content-type for mentions) — you don't need to strip it yourself, and doing so manually is unnecessary and risks mismatched find strings.
Background highlights: ...
Text color highlights: ...
For both, N is 1 (yellow), 2 (amber), 3 (red), 4 (pink), 5 (purple), 6 (blue), 7 (teal), 8 (near-white), or 9 (light gray).
Inputs: name (required), todoset_id (required), description.
basecamp_create_todolist_groupCreate Basecamp Todo List GroupA
Create a group (section) in a todo list, to split its todos. The new group goes at the bottom of the groups, or at the place that placement tells. Then create todos in the group with basecamp_create_todo (give the group ID as todolist_id), or move todos into it with basecamp_move_todo (destination_id). To rename the group or to give it a description, use basecamp_update_todolist with the group ID.
Inputs: name (required), todolist_id (required), placement, relative_to_id.
basecamp_create_vaultCreate Basecamp VaultB
Create a new vault (folder) under a parent vault.
Inputs: title (required), parent_vault_id (required).
basecamp_download_blobDownload Basecamp BlobARead-onlyIdempotent
Download an inline attachment from a 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.
Inputs: blob_id (required), filename (required), content_type.
basecamp_get_answerGet Basecamp Check-in AnswerARead-onlyIdempotent
Get a single check-in answer by its ID.
Inputs: answer_id (required).
basecamp_get_documentGet Basecamp DocumentARead-onlyIdempotent
Retrieve a single document with its full content.
Inputs: document_id (required).
basecamp_get_kanban_cardGet Kanban CardARead-onlyIdempotent
Get all details of a specific kanban card.
Inputs: card_id (required).
basecamp_get_meGet My Basecamp ProfileARead-onlyIdempotent
Get your full profile for the authenticated user (id, name, email, title, attachable_sgid). To simply check whether you're logged in, use basecamp_whoami.
Inputs: no named parameters.
basecamp_get_messageGet Basecamp MessageARead-onlyIdempotent
Retrieve a single message from a Basecamp message board.
Inputs: message_id (required).
basecamp_get_personGet Basecamp PersonBRead-onlyIdempotent
Get details about a specific person.
Inputs: person_id (required).
basecamp_get_projectGet Basecamp Project DetailsARead-onlyIdempotent
Fetch detailed information about a specific Basecamp project. This tool retrieves complete project details including name, description, dock configuration, and metadata.
Examples:
Use when: "Get details for project 12345"
Use when: Need full project information including dock configuration
Inputs: project_id (required).
basecamp_get_questionGet Basecamp Check-in QuestionARead-onlyIdempotent
Get a single automatic check-in question with its schedule and metadata.
Inputs: question_id (required).
basecamp_get_questionnaireGet Basecamp QuestionnaireARead-onlyIdempotent
Get the questionnaire (check-ins container) for a project. Returns the number of questions and their URL.
Inputs: questionnaire_id (required).
basecamp_get_todosetGet Basecamp Todo SetBRead-onlyIdempotent
Get todo set container for a project. Returns todo lists and groups.
Inputs: todoset_id (required).
basecamp_get_uploadGet Basecamp UploadARead-onlyIdempotent
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.
Inputs: upload_id (required).
basecamp_get_vaultGet Basecamp VaultARead-onlyIdempotent
Get details of a vault (folder) including document/upload/sub-vault counts.
Inputs: vault_id (required).
basecamp_list_answersList Basecamp Check-in AnswersARead-onlyIdempotent
List answers to a specific check-in question. Returns each answer's content, author, and check-in date.
Inputs: question_id (required).
basecamp_list_campfire_messagesList Campfire MessagesARead-onlyIdempotent
Browse chat messages from Basecamp Campfires. Campfires are real-time chat rooms within projects.
Use this tool to:
See recent chat activity across all campfires or specific ones
Find messages from specific people
Search message content for keywords
Review chat history since a specific date or time period
All filters support multiple values for OR-matching.
Examples:
"What's been discussed in chat today?" → since: "today"
"Show messages from Alice and Bob" → person_ids: [111, 222]
"Find chat messages mentioning deploy or release" → query: ["deploy", "release"]
"Recent messages in campfire 12345" → campfire_ids: [12345]
Inputs: limit, query, since, person_ids, +1 more.
basecamp_list_commentsList Basecamp CommentsARead-onlyIdempotent
List comments on any Basecamp resource (message, todo, card, etc.). Works universally on all recording types.
Inputs: recording_id (required).
basecamp_list_documentsList Basecamp DocumentsARead-onlyIdempotent
List documents in a vault.
Inputs: vault_id (required), filter.
basecamp_list_kanban_cardsList Kanban CardsBRead-onlyIdempotent
List cards in a kanban column.
Inputs: column_id (required).
basecamp_list_kanban_columnsList Kanban ColumnsARead-onlyIdempotent
List all columns in a kanban board.
Inputs: card_table_id (required).
basecamp_list_messagesList Basecamp MessagesARead-onlyIdempotent
List messages in a Basecamp message board (a single project). For cross-project or time-based browsing across content types, use basecamp_list_recordings instead.
Inputs: message_board_id (required), filter.
basecamp_list_message_typesList Basecamp Message TypesARead-onlyIdempotent
List available message types/categories for a Basecamp project
Inputs: bucket_id (required).
basecamp_list_peopleList Basecamp PeopleARead-onlyIdempotent
List all people in the Basecamp account.
Inputs: filter.
basecamp_list_projectsList Basecamp ProjectsARead-onlyIdempotent
List all projects visible to the authenticated user in a Basecamp account. This tool returns active projects with their IDs, names, descriptions, and metadata. Use this to discover project/bucket IDs needed for accessing messages, todos, and other resources.
Inputs: filter.
basecamp_list_questionsList Basecamp Check-in QuestionsARead-onlyIdempotent
List all automatic check-in questions in a questionnaire. Returns each question's title, schedule, paused status, and answer count.
Inputs: questionnaire_id (required).
basecamp_list_recordingsList Basecamp Activity (Recordings)ARead-onlyIdempotent
Browse recent activity across Basecamp by listing recordings. Recordings represent all content in Basecamp: todos, messages, documents, comments, uploads, and more.
Use this tool to:
See what's been happening across all projects or specific projects
Find recent activity by one or more people
Review changes since a specific date or time period
Filter activity by content type (todos, messages, documents, etc.)
Search activity by title text
When to use this vs. the per-resource list tools: use the per-project list tools (basecamp_list_messages, basecamp_list_todos, basecamp_list_documents, basecamp_list_comments, basecamp_list_kanban_cards) to browse items WITHIN a single project; use basecamp_list_recordings for CROSS-project, time-based, or multi-type activity browsing.
All filters support multiple values for OR-matching.
Examples:
"What happened in the last 24 hours?" → since: "24h"
"Show recent todos in project 12345" → project_ids: [12345], type: ["todo"]
"What did Alice and Bob do this week?" → person_ids: [111, 222], since: "7d"
"Find messages mentioning launch across projects 1 and 2" → project_ids: [1, 2], type: ["message"], query: ["launch"]
"Find items about design or UX" → query: ["design", "UX"]
"List all messages across projects" → type: ["message"]
Inputs: sort, type, limit, query, +5 more.
basecamp_list_todosList Basecamp TodosARead-onlyIdempotent
List todos in a todo list. Filter by status: 'active' or 'archived'. The todos come in display order: first the todos that are not in a group, then the todos of each group. The response also lists the groups (sections) of the todo list, also the empty groups.
Inputs: todolist_id (required), status, completed.
basecamp_list_uploadsList Basecamp UploadsARead-onlyIdempotent
List files uploaded to a vault in the Docs & Files section.
Inputs: vault_id (required), filter.
basecamp_list_vaultsList Basecamp VaultsARead-onlyIdempotent
List sub-vaults (folders) under a parent vault in the Docs & Files section.
Inputs: parent_vault_id (required), filter.
basecamp_loginLogin to BasecampAIdempotent
Authenticate with Basecamp via OAuth. Opens a browser window for authorization. If you have multiple Basecamp accounts, call first without account_id to see the list, then call again with the desired account_id.
Inputs: account_id.
basecamp_logoutLogout from BasecampADestructiveIdempotent
Remove stored Basecamp credentials.
Inputs: no named parameters.
basecamp_move_kanban_cardMove Kanban CardB
Move a kanban card to a different column and/or position within that column.
Inputs: card_id (required), column_id (required), position.
basecamp_move_todoMove Basecamp TodoAIdempotent
Move a todo to a different place: in its todo list, into a group (section), or into a different todo list.
Examples:
Put a todo at the top of its list: placement "top".
Put a todo after another todo: placement "after" and relative_to_id. If the other todo is in a different list or group, the todo moves there.
Move a todo to the bottom of another list or group: placement "bottom" and destination_id.
Only the todos that are not complete have a position. To set the order of many todos, use basecamp_reorder_todos.
Inputs: todo_id (required), placement (required), destination_id, relative_to_id.
basecamp_move_todolistMove Basecamp Todo ListAIdempotent
Move a todo list to a different place among the todo lists of its project. Get the todo list IDs from basecamp_get_todoset. To move a group (section), use basecamp_move_todolist_group.
Inputs: placement (required), todolist_id (required), relative_to_id.
basecamp_move_todolist_groupMove Basecamp Todo List GroupAIdempotent
Move a group (section) to a different place among the groups of its todo list. The groups always show after the todos that are not in a group. Get the group IDs from basecamp_list_todos. You cannot move a group to a different todo list.
Inputs: group_id (required), placement (required), relative_to_id.
basecamp_reorder_todosReorder Basecamp TodosAIdempotent
Set the order of all the todos in a todo list or in a group (section). Give the IDs of all the todos that are not complete, in the new order. Use this to sort todos, for example by due date. To move one todo, use basecamp_move_todo. The todos in a group are not part of the todo list: to reorder them, give the group ID.
Inputs: todo_ids (required), parent_id (required).
basecamp_restoreRestore Basecamp ItemAIdempotent
Bring an item back from the trash or from the archive. The items in it come back too, for example the todos of a todo list. To find the IDs of trashed items, use basecamp_list_recordings with status "trashed".
Inputs: recording_id (required).
basecamp_trashMove Basecamp Item to TrashADestructiveIdempotent
Move an item to the trash: a todo list, a group (section), a todo, a message, a comment, a document, a folder, an upload or a kanban card. The items in it go too, for example the todos of a todo list. Basecamp deletes the items in the trash permanently after some time. Until then, basecamp_restore brings the item back with the same ID.
Inputs: recording_id (required).
basecamp_uncomplete_todoUncomplete Basecamp TodoAIdempotent
Mark a todo as incomplete (undo completion).
Inputs: todo_id (required).
basecamp_update_commentUpdate Basecamp CommentA
Update a comment. Use partial content operations when possible to save on token usage.
HTML rules for content:
Allowed tags: p, span, h2, h3, h4, br, strong, em, strike, code, a (with href attribute), pre, ol, ul, li, blockquote, mark, figure, figcaption, table, tbody, tr, th, td, div, bc-attachment.
Wrap every paragraph in ..., and put between one paragraph and the next. Both parts are necessary: newlines and blank lines in your HTML are discarded, and Basecamp shows no space around a on its own, so two paragraphs with nothing between them are shown as one block of text. Do not rely on line breaks in your HTML to separate paragraphs.
Headings: use , , as appropriate.
Inline code: text. Preformatted blocks: text.
Ordered lists: .... Unordered: ....
Tables: Heading...Cell...
To mention a person: . Put the tag where the name must show in the text, for example "Thanks for the fix". The person gets a notification. If the ID is not a person, the tool returns an error and writes nothing. Get person IDs from basecamp_list_people, or from the people in other responses (assignees, creators).
Single image:
Image gallery: wrap multiple in a .
A bc-attachment needs an attachable_sgid. For a file that is already in Basecamp, take the sgid from the HTML content of the message, comment or card that shows it, or use basecamp_list_recordings. For a file that is not in Basecamp yet, such as an image at an external URL or a screenshot on disk, upload it with basecamp_create_attachment and use the sgid that it returns. There is no tag, so an external image URL can never be embedded directly: upload it, or accept that it stays a plain link.
Basecamp auto-enriches bc-attachment tags after saving (adds url, href, filename, content-type, etc.) — you never need to write those.
When you see an existing, already-enriched tag (e.g. from a previous list/get call), leave its inner HTML alone. Before any content_append/content_prepend/search_replace runs, it is automatically collapsed back to its minimal form (sgid, presentation, caption, and content-type for mentions) — you don't need to strip it yourself, and doing so manually is unnecessary and risks mismatched find strings.
Background highlights: ...
Text color highlights: ...
For both, N is 1 (yellow), 2 (amber), 3 (red), 4 (pink), 5 (purple), 6 (blue), 7 (teal), 8 (near-white), or 9 (light gray).
Inputs: comment_id (required), content, content_append, search_replace, +1 more.
basecamp_update_documentUpdate Basecamp DocumentA
Update a document. Use partial content operations when possible to save on token usage.
HTML rules for content:
Allowed tags: p, span, h2, h3, h4, br, strong, em, strike, code, a (with href attribute), pre, ol, ul, li, blockquote, mark, figure, figcaption, table, tbody, tr, th, td, div, bc-attachment.
Wrap every paragraph in ..., and put between one paragraph and the next. Both parts are necessary: newlines and blank lines in your HTML are discarded, and Basecamp shows no space around a on its own, so two paragraphs with nothing between them are shown as one block of text. Do not rely on line breaks in your HTML to separate paragraphs.
Headings: use , , as appropriate.
Inline code: text. Preformatted blocks: text.
Ordered lists: .... Unordered: ....
Tables: Heading...Cell...
To mention a person: . Put the tag where the name must show in the text, for example "Thanks for the fix". The person gets a notification. If the ID is not a person, the tool returns an error and writes nothing. Get person IDs from basecamp_list_people, or from the people in other responses (assignees, creators).
Single image:
Image gallery: wrap multiple in a .
A bc-attachment needs an attachable_sgid. For a file that is already in Basecamp, take the sgid from the HTML content of the message, comment or card that shows it, or use basecamp_list_recordings. For a file that is not in Basecamp yet, such as an image at an external URL or a screenshot on disk, upload it with basecamp_create_attachment and use the sgid that it returns. There is no tag, so an external image URL can never be embedded directly: upload it, or accept that it stays a plain link.
Basecamp auto-enriches bc-attachment tags after saving (adds url, href, filename, content-type, etc.) — you never need to write those.
When you see an existing, already-enriched tag (e.g. from a previous list/get call), leave its inner HTML alone. Before any content_append/content_prepend/search_replace runs, it is automatically collapsed back to its minimal form (sgid, presentation, caption, and content-type for mentions) — you don't need to strip it yourself, and doing so manually is unnecessary and risks mismatched find strings.
Background highlights: ...
Text color highlights: ...
For both, N is 1 (yellow), 2 (amber), 3 (red), 4 (pink), 5 (purple), 6 (blue), 7 (teal), 8 (near-white), or 9 (light gray).
Inputs: document_id (required), title, content, content_append, +2 more.
basecamp_update_kanban_cardUpdate Kanban CardA
Update a kanban card including its steps. At least one field (title, content, partial content operations, or steps) must be provided. Use partial content operations when possible to save on token usage.
HTML rules for content:
Allowed tags: p, span, h2, h3, h4, br, strong, em, strike, code, a (with href attribute), pre, ol, ul, li, blockquote, mark, figure, figcaption, table, tbody, tr, th, td, div, bc-attachment.
Wrap every paragraph in ..., and put between one paragraph and the next. Both parts are necessary: newlines and blank lines in your HTML are discarded, and Basecamp shows no space around a on its own, so two paragraphs with nothing between them are shown as one block of text. Do not rely on line breaks in your HTML to separate paragraphs.
Headings: use , , as appropriate.
Inline code: text. Preformatted blocks: text.
Ordered lists: .... Unordered: ....
Tables: Heading...Cell...
To mention a person: . Put the tag where the name must show in the text, for example "Thanks for the fix". The person gets a notification. If the ID is not a person, the tool returns an error and writes nothing. Get person IDs from basecamp_list_people, or from the people in other responses (assignees, creators).
Single image:
Image gallery: wrap multiple in a .
A bc-attachment needs an attachable_sgid. For a file that is already in Basecamp, take the sgid from the HTML content of the message, comment or card that shows it, or use basecamp_list_recordings. For a file that is not in Basecamp yet, such as an image at an external URL or a screenshot on disk, upload it with basecamp_create_attachment and use the sgid that it returns. There is no tag, so an external image URL can never be embedded directly: upload it, or accept that it stays a plain link.
Basecamp auto-enriches bc-attachment tags after saving (adds url, href, filename, content-type, etc.) — you never need to write those.
When you see an existing, already-enriched tag (e.g. from a previous list/get call), leave its inner HTML alone. Before any content_append/content_prepend/search_replace runs, it is automatically collapsed back to its minimal form (sgid, presentation, caption, and content-type for mentions) — you don't need to strip it yourself, and doing so manually is unnecessary and risks mismatched find strings.
Background highlights: ...
Text color highlights: ...
For both, N is 1 (yellow), 2 (amber), 3 (red), 4 (pink), 5 (purple), 6 (blue), 7 (teal), 8 (near-white), or 9 (light gray).
Inputs: card_id (required), steps, title, due_on, +5 more.
basecamp_update_messageUpdate Basecamp MessageA
Update a message. Use partial content operations when possible to save on token usage.
HTML rules for content:
Allowed tags: p, span, h2, h3, h4, br, strong, em, strike, code, a (with href attribute), pre, ol, ul, li, blockquote, mark, figure, figcaption, table, tbody, tr, th, td, div, bc-attachment.
Wrap every paragraph in ..., and put between one paragraph and the next. Both parts are necessary: newlines and blank lines in your HTML are discarded, and Basecamp shows no space around a on its own, so two paragraphs with nothing between them are shown as one block of text. Do not rely on line breaks in your HTML to separate paragraphs.
Headings: use , , as appropriate.
Inline code: text. Preformatted blocks: text.
Ordered lists: .... Unordered: ....
Tables: Heading...Cell...
To mention a person: . Put the tag where the name must show in the text, for example "Thanks for the fix". The person gets a notification. If the ID is not a person, the tool returns an error and writes nothing. Get person IDs from basecamp_list_people, or from the people in other responses (assignees, creators).
Single image:
Image gallery: wrap multiple in a .
A bc-attachment needs an attachable_sgid. For a file that is already in Basecamp, take the sgid from the HTML content of the message, comment or card that shows it, or use basecamp_list_recordings. For a file that is not in Basecamp yet, such as an image at an external URL or a screenshot on disk, upload it with basecamp_create_attachment and use the sgid that it returns. There is no tag, so an external image URL can never be embedded directly: upload it, or accept that it stays a plain link.
Basecamp auto-enriches bc-attachment tags after saving (adds url, href, filename, content-type, etc.) — you never need to write those.
When you see an existing, already-enriched tag (e.g. from a previous list/get call), leave its inner HTML alone. Before any content_append/content_prepend/search_replace runs, it is automatically collapsed back to its minimal form (sgid, presentation, caption, and content-type for mentions) — you don't need to strip it yourself, and doing so manually is unnecessary and risks mismatched find strings.
Background highlights: ...
Text color highlights: ...
For both, N is 1 (yellow), 2 (amber), 3 (red), 4 (pink), 5 (purple), 6 (blue), 7 (teal), 8 (near-white), or 9 (light gray).
Inputs: message_id (required), content, subject, content_append, +3 more.
basecamp_update_todoUpdate Basecamp TodoAIdempotent
Update a todo item. Use partial content operations when possible to save on token usage.
HTML rules for content:
Allowed tags: p, span, h2, h3, h4, br, strong, em, strike, code, a (with href attribute), pre, ol, ul, li, blockquote, mark, figure, figcaption, table, tbody, tr, th, td, div, bc-attachment.
Wrap every paragraph in ..., and put between one paragraph and the next. Both parts are necessary: newlines and blank lines in your HTML are discarded, and Basecamp shows no space around a on its own, so two paragraphs with nothing between them are shown as one block of text. Do not rely on line breaks in your HTML to separate paragraphs.
Headings: use , , as appropriate.
Inline code: text. Preformatted blocks: text.
Ordered lists: .... Unordered: ....
Tables: Heading...Cell...
To mention a person: . Put the tag where the name must show in the text, for example "Thanks for the fix". The person gets a notification. If the ID is not a person, the tool returns an error and writes nothing. Get person IDs from basecamp_list_people, or from the people in other responses (assignees, creators).
Single image:
Image gallery: wrap multiple in a .
A bc-attachment needs an attachable_sgid. For a file that is already in Basecamp, take the sgid from the HTML content of the message, comment or card that shows it, or use basecamp_list_recordings. For a file that is not in Basecamp yet, such as an image at an external URL or a screenshot on disk, upload it with basecamp_create_attachment and use the sgid that it returns. There is no tag, so an external image URL can never be embedded directly: upload it, or accept that it stays a plain link.
Basecamp auto-enriches bc-attachment tags after saving (adds url, href, filename, content-type, etc.) — you never need to write those.
When you see an existing, already-enriched tag (e.g. from a previous list/get call), leave its inner HTML alone. Before any content_append/content_prepend/search_replace runs, it is automatically collapsed back to its minimal form (sgid, presentation, caption, and content-type for mentions) — you don't need to strip it yourself, and doing so manually is unnecessary and risks mismatched find strings.
Background highlights: ...
Text color highlights: ...
For both, N is 1 (yellow), 2 (amber), 3 (red), 4 (pink), 5 (purple), 6 (blue), 7 (teal), 8 (near-white), or 9 (light gray).
Inputs: todo_id (required), title, due_on, notify, +6 more.
basecamp_update_todolistUpdate Basecamp Todo ListAIdempotent
Update the name or the description of a todo list, or of a group (section) in a todo list. Use partial content operations on the description when possible to save on token usage. A todo list is complete when all its todos are complete, so this tool cannot complete it.
HTML rules for content:
Allowed tags: p, span, h2, h3, h4, br, strong, em, strike, code, a (with href attribute), pre, ol, ul, li, blockquote, mark, figure, figcaption, table, tbody, tr, th, td, div, bc-attachment.
Wrap every paragraph in ..., and put between one paragraph and the next. Both parts are necessary: newlines and blank lines in your HTML are discarded, and Basecamp shows no space around a on its own, so two paragraphs with nothing between them are shown as one block of text. Do not rely on line breaks in your HTML to separate paragraphs.
Headings: use , , as appropriate.
Inline code: text. Preformatted blocks: text.
Ordered lists: .... Unordered: ....
Tables: Heading...Cell...
To mention a person: . Put the tag where the name must show in the text, for example "Thanks for the fix". The person gets a notification. If the ID is not a person, the tool returns an error and writes nothing. Get person IDs from basecamp_list_people, or from the people in other responses (assignees, creators).
Single image:
Image gallery: wrap multiple in a .
A bc-attachment needs an attachable_sgid. For a file that is already in Basecamp, take the sgid from the HTML content of the message, comment or card that shows it, or use basecamp_list_recordings. For a file that is not in Basecamp yet, such as an image at an external URL or a screenshot on disk, upload it with basecamp_create_attachment and use the sgid that it returns. There is no tag, so an external image URL can never be embedded directly: upload it, or accept that it stays a plain link.
Basecamp auto-enriches bc-attachment tags after saving (adds url, href, filename, content-type, etc.) — you never need to write those.
When you see an existing, already-enriched tag (e.g. from a previous list/get call), leave its inner HTML alone. Before any content_append/content_prepend/search_replace runs, it is automatically collapsed back to its minimal form (sgid, presentation, caption, and content-type for mentions) — you don't need to strip it yourself, and doing so manually is unnecessary and risks mismatched find strings.
Background highlights: ...
Text color highlights: ...
For both, N is 1 (yellow), 2 (amber), 3 (red), 4 (pink), 5 (purple), 6 (blue), 7 (teal), 8 (near-white), or 9 (light gray).
Inputs: todolist_id (required), name, content, content_append, +2 more.
basecamp_update_vaultUpdate Basecamp VaultAIdempotent
Update the title of a vault (folder).
Inputs: title (required), vault_id (required).
basecamp_whoamiWho Am I (Basecamp)ARead-onlyIdempotent
Check login state: show whether you're authenticated and, if so, the basic Basecamp user + account id. For your full profile (id, title, attachable_sgid) use basecamp_get_me.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 57 tools
Each tool targets a distinct resource+action, and the descriptions explicitly differentiate overlapping cases (e.g. list_recordings vs per-project list tools, move_todo vs reorder_todos, complete_todo vs uncomplete_todo). A few conceptual overlaps remain (get_upload vs download_blob, list_documents vs list_recordings), but they are clearly scoped.
Every tool follows the same basecamp_verb_noun convention (basecamp_create_message, basecamp_update_todo, basecamp_list_projects, basecamp_move_kanban_card, basecamp_trash, basecamp_restore). Verbs and resource nouns are used predictably throughout, with no mixing of conventions.
57 tools is well beyond the typical 3-15 sweet spot and is heavy even for a broad domain like Basecamp. To their credit the tools are not redundant and each covers a real resource/operation, but the surface is large enough to strain discovery.
Coverage spans the full Basecamp domain: projects, people, messages, todos/todolists/groups, vaults, documents, uploads, kanban, check-ins (questionnaires/questions/answers), campfire, recordings, comments, attachments, plus auth. CRUD is complete for each area, with trash/restore handling deletion and dedicated tools for ordering and moving items.
Maintenance
Related MCP Connectors
Basecamp's official server: projects, to-dos, cards, messages, docs, schedules, and Campfire.
Manage Redbooth tasks, task lists, comments, tags and files from Claude and other AI assistants.
Remote MCP for Kanban AI boards—manage projects, tasks, and comments from AI tools.
Manage projects, tasks, time tracking, and team collaboration through natural language.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables seamless integration with Basecamp 3 through 46 comprehensive API tools, allowing users to manage projects, todos, card tables, documents, campfire messages, and other Basecamp features through natural language interactions in Claude Desktop and Cursor IDE.335MIT
- AlicenseBqualityDmaintenanceEnables AI assistants to interact with Basecamp projects through natural language commands. Supports managing projects, to-do lists, messages, and creating tasks with full content rendering capabilities.695 npmISC
- AlicenseBqualityDmaintenanceConnects AI assistants to the Basecamp 2 API, enabling management of projects, todos, messages, and people directly through natural language.1710 npmMIT
- FlicenseNot gradedqualityAmaintenanceEnables MCP-capable clients such as Codex, Cursor, and Claude Desktop to read and manage Basecamp 3 projects through OAuth-authenticated API calls, covering projects, todos, messages, card tables, documents, uploads, and search. It exposes these capabilities as tools for browsing, creating, updating, and organizing Basecamp content via natural language.-