Skip to main content
Glama

Basecamp MCP Server

npm version npm downloads license

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@latest runs 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 the sgid that 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_recordings searches 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_secret

Claude 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:

  1. Call basecamp_login to open a browser window for Basecamp authorization

  2. Authorize the app in your browser

  3. If you have multiple Basecamp accounts, call basecamp_login again with the desired account_id

  4. Done! 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 ID

  • BASECAMP_CLIENT_SECRET — Your Basecamp OAuth client secret

Available Tools

Authentication

  • basecamp_login - Authenticate with Basecamp via OAuth browser flow

  • basecamp_logout - Remove stored credentials

  • basecamp_whoami - Show the currently authenticated user

Projects

  • basecamp_list_projects - List all accessible projects with optional filtering

  • basecamp_get_project - Get detailed project information including dock configuration

Messages

  • basecamp_list_messages - List messages in a message board with optional filtering

  • basecamp_list_message_types - List available message types/categories for a project

  • basecamp_get_message - Get single message details

  • basecamp_create_message - Create new message with optional category and draft status

  • basecamp_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 lists

  • basecamp_create_todolist - Create a todo list in a todo set, with an optional description

  • basecamp_update_todolist - Rename a todo list or a group (section), or edit its description

  • basecamp_move_todolist - Move a todo list to the top, the bottom, or before/after another list

  • basecamp_create_todolist_group - Create a group (section) in a todo list, at the bottom or at a given place

  • basecamp_move_todolist_group - Move a group (section) among the groups of its todo list

  • basecamp_list_todos - List todos in a list, with their groups, and status filtering (active/archived)

  • basecamp_create_todo - Create new todo with optional description

  • basecamp_update_todo - Update a todo's title, description, due date, or assignees

  • basecamp_move_todo - Move a todo to the top, the bottom, or before/after another todo, also into a different list or group

  • basecamp_reorder_todos - Set the order of all the todos in a list or group, for example to sort them by due date

  • basecamp_complete_todo - Mark todo as complete

  • basecamp_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 resource

  • basecamp_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 user

  • basecamp_list_people - List all people with optional filtering by name, email, or title

  • basecamp_get_person - Get person details

Kanban

  • basecamp_list_kanban_columns - List all columns in a kanban board

  • basecamp_list_kanban_cards - List cards in a column with steps and assignees

  • basecamp_get_kanban_card - Get complete details of a specific card

  • basecamp_create_kanban_card - Create new card with title, content, and optional checklist steps

  • basecamp_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 vault

  • basecamp_get_vault - Get a vault's details, including document/upload/sub-vault counts

  • basecamp_create_vault - Create a new vault (folder)

  • basecamp_update_vault - Rename a vault

  • basecamp_list_documents - List documents in a vault, with optional title/content filtering

  • basecamp_get_document - Get a document's full HTML content

  • basecamp_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 vault

  • basecamp_get_upload - Retrieve an uploaded file: images are returned inline, text files as text, other binary formats saved to disk

  • basecamp_download_blob - Download an inline <bc-attachment> attachment referenced in document/message/comment HTML content

  • basecamp_create_attachment - Upload a local file or a remote URL and get the attachable_sgid to embed it with <bc-attachment>

Check-ins (Q&A)

  • basecamp_get_questionnaire - Get a project's check-ins container

  • basecamp_list_questions - List automatic check-in questions with schedule and answer counts

  • basecamp_get_question - Get a single check-in question

  • basecamp_list_answers - List answers to a check-in question

  • basecamp_get_answer - Get a single check-in answer

  • basecamp_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 it

  • basecamp_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 clean

License

MIT

Available Tools

57 tools
basecamp_complete_todoComplete Basecamp TodoB
Idempotent

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 BlobA
Read-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 AnswerA
Read-onlyIdempotent

Get a single check-in answer by its ID.

Inputs: answer_id (required).

basecamp_get_documentGet Basecamp DocumentA
Read-onlyIdempotent

Retrieve a single document with its full content.

Inputs: document_id (required).

basecamp_get_kanban_cardGet Kanban CardA
Read-onlyIdempotent

Get all details of a specific kanban card.

Inputs: card_id (required).

basecamp_get_meGet My Basecamp ProfileA
Read-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 MessageA
Read-onlyIdempotent

Retrieve a single message from a Basecamp message board.

Inputs: message_id (required).

basecamp_get_personGet Basecamp PersonB
Read-onlyIdempotent

Get details about a specific person.

Inputs: person_id (required).

basecamp_get_projectGet Basecamp Project DetailsA
Read-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 QuestionA
Read-onlyIdempotent

Get a single automatic check-in question with its schedule and metadata.

Inputs: question_id (required).

basecamp_get_questionnaireGet Basecamp QuestionnaireA
Read-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 SetB
Read-onlyIdempotent

Get todo set container for a project. Returns todo lists and groups.

Inputs: todoset_id (required).

basecamp_get_uploadGet Basecamp UploadA
Read-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 VaultA
Read-onlyIdempotent

Get details of a vault (folder) including document/upload/sub-vault counts.

Inputs: vault_id (required).

basecamp_list_answersList Basecamp Check-in AnswersA
Read-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 MessagesA
Read-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 CommentsA
Read-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 DocumentsA
Read-onlyIdempotent

List documents in a vault.

Inputs: vault_id (required), filter.

basecamp_list_kanban_cardsList Kanban CardsB
Read-onlyIdempotent

List cards in a kanban column.

Inputs: column_id (required).

basecamp_list_kanban_columnsList Kanban ColumnsA
Read-onlyIdempotent

List all columns in a kanban board.

Inputs: card_table_id (required).

basecamp_list_messagesList Basecamp MessagesA
Read-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 TypesA
Read-onlyIdempotent

List available message types/categories for a Basecamp project

Inputs: bucket_id (required).

basecamp_list_peopleList Basecamp PeopleA
Read-onlyIdempotent

List all people in the Basecamp account.

Inputs: filter.

basecamp_list_projectsList Basecamp ProjectsA
Read-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 QuestionsA
Read-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)A
Read-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 TodosA
Read-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 UploadsA
Read-onlyIdempotent

List files uploaded to a vault in the Docs & Files section.

Inputs: vault_id (required), filter.

basecamp_list_vaultsList Basecamp VaultsA
Read-onlyIdempotent

List sub-vaults (folders) under a parent vault in the Docs & Files section.

Inputs: parent_vault_id (required), filter.

basecamp_loginLogin to BasecampA
Idempotent

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 BasecampA
DestructiveIdempotent

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 TodoA
Idempotent

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 ListA
Idempotent

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 GroupA
Idempotent

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 TodosA
Idempotent

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 ItemA
Idempotent

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 TrashA
DestructiveIdempotent

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 TodoA
Idempotent

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 TodoA
Idempotent

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 ListA
Idempotent

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 VaultA
Idempotent

Update the title of a vault (folder).

Inputs: title (required), vault_id (required).

basecamp_whoamiWho Am I (Basecamp)A
Read-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

    A3.7/5.0

    Scored across 57 tools

    Disambiguation4/5

    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.

    Naming Consistency5/5

    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.

    Tool Count3/5

    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.

    Completeness5/5

    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

    ActivitySlowing
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Enables 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.
      33
      5
      MIT
    • A
      license
      B
      quality
      D
      maintenance
      Connects AI assistants to the Basecamp 2 API, enabling management of projects, todos, messages, and people directly through natural language.
      17
      10 npm
      MIT
    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables 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.
      -