Skip to content

Connect Basecamp to Claude: Sync Documentation & Project Schedules via MCP

Learn how to connect Basecamp to Claude using a managed MCP server. Automate task delegation, sync project schedules, and manage team communication.

Uday Gajavalli Uday Gajavalli · · 11 min read
Connect Basecamp to Claude: Sync Documentation & Project Schedules via MCP

A 2025 Forrester report indicates that 73% of enterprise automation initiatives fail to scale because AI agents lack secure, authenticated access to core project management systems. You want to connect Basecamp to Claude so your AI agents can query project statuses, assign tasks, and manage cross-functional workflows entirely through natural language. If your team uses ChatGPT, check out our guide on connecting Basecamp to ChatGPT or read our broader architectural overview on connecting Basecamp to AI Agents.

To connect Basecamp to Claude, you need a Model Context Protocol (MCP) server. This server acts as a translation layer, converting an LLM's standardized tool calls into Basecamp's specific REST API requests, while handling OAuth token management and schema validation.

You have two options: spend weeks building, hosting, and maintaining a custom MCP server, or use a managed infrastructure layer that handles the boilerplate dynamically. This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for Basecamp, connect it natively to Claude, and execute complex project management workflows using natural language.

The Engineering Reality of the Basecamp API

A custom MCP server is a self-hosted integration layer. While the Model Context Protocol provides a predictable way for models to discover tools, implementing it against vendor APIs requires heavy engineering lifting, similar to the challenges of connecting Asana to Claude. Basecamp's REST API has specific architectural quirks that make building a reliable agent integration difficult.

1. The Bucket and Tool Hierarchy Basecamp does not use a flat data model. Almost every resource exists inside a bucket (a Project or a Team). Inside that bucket, features are isolated into specific tools (like a todoset, a vault for documents, or a chat for Campfires). You cannot simply "create a to-do" globally. An AI agent must first query the project to find the specific todoset ID, and then query that todoset to find the specific todolist ID, before it can finally issue a POST request to create the task. If your MCP server does not expose this hierarchy clearly, Claude will hallucinate endpoints that do not exist.

2. Polymorphic Parent Relationships Comments in Basecamp are highly polymorphic. You can comment on a message, a to-do, a document, or a schedule entry. The API requires the agent to know the exact recording_id (the parent object) and the bucket_id. Your tool schemas must clearly define these required parameters so the LLM understands how to thread its responses correctly.

3. Rich Text Content Constraints Basecamp relies heavily on its own rich text format for documents, messages, and comments. When Claude attempts to write a document or post a message, it naturally outputs Markdown. If your integration layer does not handle the translation between Markdown and Basecamp's expected HTML structures, formatting will break, and API calls will fail validation.

How to Generate a Basecamp MCP Server

Instead of building and hosting a custom Node.js or Python server to handle these quirks, you can use Truto to generate a managed MCP server dynamically. Truto normalizes the Basecamp API, handles the OAuth token refresh cycle, and exposes the endpoints as ready-to-use LLM tools.

You can generate the MCP server URL using either the Truto UI or the API.

Method 1: Via the Truto UI

For quick testing or manual setup, the UI is the fastest path:

  1. Navigate to the Integrated Accounts page in your Truto dashboard and select your connected Basecamp account.
  2. Click the MCP Servers tab.
  3. Click Create MCP Server.
  4. Select your desired configuration (e.g., restrict to read-only methods or filter by specific tags).
  5. Copy the generated MCP server URL. It will look like https://api.truto.one/mcp/a1b2c3d4e5f6....

Method 2: Via the API

For programmatic provisioning - such as generating temporary MCP servers for automated workflows - use the REST API. Truto generates a secure, hashed token and returns the connection URL.

curl -X POST https://api.truto.one/integrated-account/<INTEGRATED_ACCOUNT_ID>/mcp \
  -H "Authorization: Bearer <YOUR_TRUTO_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Basecamp Claude Server",
    "config": {
      "methods": ["read", "write"]
    },
    "expires_at": "2026-12-31T23:59:59Z"
  }'

The response contains the URL Claude needs to connect:

{
  "id": "mcp_abc123",
  "name": "Basecamp Claude Server",
  "url": "https://api.truto.one/mcp/a1b2c3d4e5f6...",
  "expires_at": "2026-12-31T23:59:59Z"
}

Connecting the MCP Server to Claude

Once you have the Truto MCP URL, connecting it to Claude takes seconds. You can do this via the Claude application UI or by modifying the desktop configuration file.

Method A: Via the Claude UI (Team/Enterprise)

If you are using Claude on a Team or Enterprise plan, you can add the server directly through the web interface:

  1. Open Claude and navigate to Settings.
  2. Click on Integrations (or Connectors depending on your plan tier).
  3. Click Add MCP Server.
  4. Paste the Truto MCP URL you generated earlier and click Add.

Claude will immediately ping the server, complete the JSON-RPC 2.0 handshake, and load the available Basecamp tools into its context window.

Method B: Via Manual Configuration (Claude Desktop)

If you are using the Claude Desktop app for local development, you need to update your claude_desktop_config.json file. Truto's MCP servers operate over Server-Sent Events (SSE), so you will use the official @modelcontextprotocol/server-sse package to proxy the connection.

{
  "mcpServers": {
    "basecamp": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "https://api.truto.one/mcp/a1b2c3d4e5f6..."
      ]
    }
  }
}

Restart Claude Desktop. You will see a plug icon indicating that the Basecamp tools are now active and ready to be called.

Basecamp MCP Tool Inventory

Truto automatically generates tools directly from Basecamp's API documentation and schema definitions. Here are the most critical tools for agentic workflows.

list_all_basecamp_projects

  • Description: Retrieves all active projects visible to the current user. This is the mandatory first step for an AI agent, as it needs the bucket_id to interact with any tasks, messages, or documents.
  • Contextual Notes: The returned payload includes the dock array, which contains the IDs for the project's specific tools (todoset, vault, campfire).
  • Example Prompt: "List all of my active Basecamp projects and tell me which ones have client access enabled."

list_all_basecamp_todos

  • Description: Fetches active to-dos for a specific bucket_id and todolist_id.
  • Contextual Notes: Agents must supply both the project ID and the list ID. The response includes completion status, assignees, and due dates.
  • Example Prompt: "Pull all open to-dos from the 'Q3 Marketing Launch' project under the 'Copywriting' list."

create_a_basecamp_todo

  • Description: Creates a new to-do inside a specific list.
  • Contextual Notes: Requires content (the task title). You can optionally pass description, due_on, starts_on, and assignee_ids.
  • Example Prompt: "Create a new to-do in the Engineering project's Backlog list called 'Fix OAuth token refresh bug' and assign it to me."

list_all_basecamp_campfires

  • Description: Retrieves a list of all active Campfires (chat rooms) visible to the user.
  • Contextual Notes: Useful for finding the chat_id before attempting to read or post messages.
  • Example Prompt: "Find the Campfire chat for the Design Team project."

create_a_basecamp_message

  • Description: Posts a new message to a Message Board.
  • Contextual Notes: Requires bucket_id, message_board_id, subject, and status. This is ideal for having an agent post daily standup summaries or automated reports.
  • Example Prompt: "Post a new message to the Leadership board summarizing the three biggest blockers from our active projects."

create_a_basecamp_document

  • Description: Creates a new document in a specific Vault.
  • Contextual Notes: Requires bucket_id, vault_id, title, and content.
  • Example Prompt: "Draft a new technical spec document in the Architecture vault outlining our new database schema."

Complete Basecamp Tool Inventory

Here is the complete inventory of additional Basecamp tools available. For full schema details, visit the Basecamp integration page.

  • list_all_basecamp_people: Get all people visible to the current user, including roles and contact info.
  • get_single_basecamp_person_by_id: Get a specific person's profile by their ID.
  • get_single_basecamp_project_by_id: Retrieve detailed metadata for a single project.
  • create_a_basecamp_project: Provision a brand new project workspace.
  • update_a_basecamp_project_by_id: Modify a project's name, description, or schedule.
  • delete_a_basecamp_project_by_id: Move a project to the trash.
  • get_single_basecamp_todo_by_id: Fetch deep details on a specific task.
  • update_a_basecamp_todo_by_id: Change a task's assignee, due date, or content.
  • delete_a_basecamp_todo_by_id: Trash a specific to-do.
  • list_all_basecamp_todo_lists: Find all to-do lists within a project's todoset.
  • get_single_basecamp_todo_list_by_id: Get details for a specific to-do list.
  • create_a_basecamp_todo_list: Create a new category list for tasks.
  • update_a_basecamp_todo_list_by_id: Rename or update a to-do list.
  • list_all_basecamp_comments: Retrieve a thread of comments on any recording (message, task, etc.).
  • get_single_basecamp_comment_by_id: Fetch a specific comment.
  • create_a_basecamp_comment: Reply to a thread or task.
  • update_a_basecamp_comment_by_id: Edit an existing comment.
  • list_all_basecamp_deleted_people: Audit users who have been removed from the account.
  • list_all_basecamp_card_tables: Retrieve Kanban-style card tables.
  • list_all_basecamp_card_table_columns: Get columns for a specific card table.
  • create_a_basecamp_card_table_column: Add a new column to a board.
  • update_a_basecamp_card_table_column_by_id: Rename a board column.
  • list_all_basecamp_card_table_cards: Get all cards within a column.
  • get_single_basecamp_card_table_card_by_id: Fetch details for a specific card.
  • create_a_basecamp_card_table_card: Add a new card to a board.
  • update_a_basecamp_card_table_card_by_id: Modify a card's details or move it.
  • list_all_basecamp_attachments: Retrieve metadata for all uploaded files.
  • get_single_basecamp_campfire_by_id: Get metadata for a specific chat room.
  • list_all_basecamp_campfire_lines: Read the message history of a Campfire chat.
  • get_single_basecamp_campfire_line_by_id: Fetch a specific chat message.
  • create_a_basecamp_campfire_line: Send a message to a Campfire chat.
  • delete_a_basecamp_campfire_line_by_id: Delete a chat message.
  • create_a_basecamp_card_table_step: Add a checklist step to a card.
  • update_a_basecamp_card_table_step_by_id: Modify a card step.
  • list_all_basecamp_chatbots: View configured chatbots in a project.
  • get_single_basecamp_chatbot_by_id: Fetch chatbot configuration details.
  • create_a_basecamp_chatbot: Register a new chatbot webhook.
  • update_a_basecamp_chatbot_by_id: Modify a chatbot's settings.
  • delete_a_basecamp_chatbot_by_id: Remove a chatbot.
  • list_all_basecamp_client_approvals: Check the status of client sign-offs.
  • get_single_basecamp_client_approval_by_id: View a specific client approval request.
  • list_all_basecamp_client_correspondences: View emails sent to/from clients.
  • get_single_basecamp_client_correspondence_by_id: Read a specific client email thread.
  • list_all_basecamp_client_replies: View replies from clients on shared items.
  • get_single_basecamp_client_reply_by_id: Read a specific client reply.
  • update_a_basecamp_client_visibility_by_id: Toggle whether a client can see an internal item.
  • list_all_basecamp_documents: List all text documents in a vault.
  • get_single_basecamp_document_by_id: Read the contents of a specific document.
  • update_a_basecamp_document_by_id: Edit an existing document.
  • list_all_basecamp_events: View the audit log of actions in a project.
  • list_all_basecamp_forwards: View emails forwarded into Basecamp.
  • get_single_basecamp_forward_by_id: Read a specific forwarded email.
  • list_all_basecamp_inbox_replies: View replies to forwarded emails.
  • get_single_basecamp_inbox_reply_by_id: Read a specific inbox reply.
  • list_all_basecamp_inbox: View the configuration of a project's inbox.
  • create_a_basecamp_lineup_maker: Set a milestone marker on the timeline.
  • update_a_basecamp_lineup_maker_by_id: Move a timeline marker.
  • delete_a_basecamp_lineup_maker_by_id: Remove a timeline marker.
  • list_all_basecamp_message_boards: Get the ID for a project's message board.
  • list_all_basecamp_message_types: View available categories for messages.
  • get_single_basecamp_message_type_by_id: View a specific message category.
  • create_a_basecamp_message_type: Add a new message category.
  • update_a_basecamp_message_type_by_id: Modify a message category.
  • delete_a_basecamp_message_type_by_id: Remove a message category.
  • list_all_basecamp_messages: Read the subject lines of board posts.
  • get_single_basecamp_message_by_id: Read the full content of a board post.
  • update_a_basecamp_message_by_id: Edit a board post.
  • delete_a_basecamp_message_by_id: Unpin a message.
  • list_all_basecamp_question_answers: Read team responses to automatic check-ins.
  • get_single_basecamp_question_answer_by_id: Read a specific check-in answer.
  • list_all_basecamp_questionnaires: View active automatic check-ins.
  • list_all_basecamp_questions: List the specific questions being asked in a check-in.
  • get_single_basecamp_question_by_id: View check-in question details.
  • list_all_basecamp_recordings: Query any item in Basecamp by its generic recording type.
  • list_all_basecamp_schedule_entries: View calendar events for a project.
  • get_single_basecamp_schedule_entry_by_id: Read details for a specific calendar event.
  • create_a_basecamp_schedule_entry: Add a new meeting or deadline to the calendar.
  • update_a_basecamp_schedule_entry_by_id: Modify a calendar event.
  • get_single_basecamp_schedule_by_id: Retrieve the schedule tool for a project.
  • update_a_basecamp_schedule_by_id: Modify schedule settings.
  • list_all_basecamp_templates: View available project templates.
  • get_single_basecamp_template_by_id: View details of a specific template.
  • create_a_basecamp_template: Build a new reusable project template.
  • update_a_basecamp_template_by_id: Edit an existing template.
  • delete_a_basecamp_template_by_id: Trash a template.
  • get_single_basecamp_todo_set_by_id: Retrieve the root task manager for a project.
  • list_all_basecamp_uploads: View files uploaded to a vault.
  • get_single_basecamp_upload_by_id: Get metadata for a specific file.
  • create_a_basecamp_upload: Upload a new file.
  • update_a_basecamp_upload_by_id: Rename a file.
  • list_all_basecamp_vaults: View folders within a project's document storage.
  • get_single_basecamp_vault_by_id: View a specific vault folder.
  • create_a_basecamp_vault: Add a new folder for documents.
  • update_a_basecamp_vault_by_id: Rename a document folder.
  • list_all_basecamp_webhooks: View active webhooks for a project.
  • get_single_basecamp_webhook_by_id: Check delivery status of a webhook.
  • create_a_basecamp_webhook: Register a new outbound webhook.
  • update_a_basecamp_webhook_by_id: Change a webhook's destination URL.
  • delete_a_basecamp_webhook_by_id: Remove a webhook.

Workflows in Action

When Claude has direct access to Basecamp via MCP, it can execute complex, multi-step workflows that would normally require a human to click through dozens of screens.

Scenario 1: The Automated Daily Standup (Project Manager)

Instead of chasing engineers for updates, a Project Manager can ask Claude to generate a comprehensive status report based on actual system data.

"Review the 'Q3 Platform Rewrite' project. Find all to-dos completed in the last 24 hours, summarize the technical discussions from the Campfire chat, and draft a new Message Board post with the summary."

How the agent executes this:

  1. Calls list_all_basecamp_projects to find the ID for "Q3 Platform Rewrite".
  2. Inspects the project's dock array to locate the IDs for the todoset, chat, and message_board.
  3. Calls list_all_basecamp_todo_lists and iterates through them using list_all_basecamp_todos to find tasks where completed is true and the timestamp is within 24 hours.
  4. Calls list_all_basecamp_campfire_lines to read the recent chat history and synthesizes the technical decisions.
  5. Calls create_a_basecamp_message to post the final, formatted summary directly to the team's message board.

Scenario 2: Bug Triage and Delegation (Tech Lead)

A Tech Lead needs to turn a vague customer complaint posted in a message board into an actionable, assigned task.

"Read the latest post on the Support Escalations message board. If it describes a software bug, create a new to-do in the Engineering project's 'Triage' list, assign it to Sarah, and reply to the original message saying the ticket has been logged."

How the agent executes this:

  1. Calls list_all_basecamp_messages on the Support project to find the newest post, then get_single_basecamp_message_by_id to read the content.
  2. Uses its internal LLM capabilities to classify the text as a software bug.
  3. Calls list_all_basecamp_projects to find the Engineering project, locates the todoset, and finds the 'Triage' todolist.
  4. Calls list_all_basecamp_people to find Sarah's user ID.
  5. Calls create_a_basecamp_todo with the bug details and Sarah's ID as the assignee.
  6. Calls create_a_basecamp_comment on the original support message, confirming the action.

Security and Access Control

Giving an AI agent access to your company's core project management system requires strict governance. Truto's MCP servers provide granular access controls to ensure Claude only operates within defined boundaries:

  • Method filtering: Prevent Claude from modifying data by configuring the MCP server to only allow read operations (config.methods: ["read"]). The agent will be able to query tasks and messages but will be physically blocked from creating or deleting them.
  • Tag filtering: Restrict the server to specific functional areas (e.g., only exposing tools tagged with documents or tasks), reducing the attack surface and keeping the agent focused.
  • Token auth: For enterprise deployments, enable require_api_token_auth: true. This forces the MCP client to pass a valid Truto API token in the Authorization header, ensuring that possession of the MCP URL alone is not enough to access the tools.
  • Ephemeral access: Use the expires_at field to create temporary MCP servers. If you are granting access to a contractor's AI agent or a short-lived automation script, the server will automatically self-destruct at the specified time, leaving no stale credentials behind.

Next Steps

Connecting Basecamp to Claude via a managed MCP server eliminates the need to build custom integration middleware. By exposing Basecamp's complex bucket and tool hierarchy as standardized, schema-validated tools, your AI agents can navigate projects, assign work, and manage documentation autonomously.

FAQ

How do I connect Basecamp to Claude?
You use a Model Context Protocol (MCP) server to act as a translation layer, converting Claude's standard tool calls into Basecamp REST API requests.
What is the Basecamp bucket hierarchy?
Basecamp organizes data into buckets (projects), which contain specific tools (todosets, vaults). API requests must traverse this hierarchy to access or create resources.
Can Claude create Basecamp to-dos automatically?
Yes, by exposing the create_a_basecamp_todo MCP tool, Claude can dynamically assign tasks, set due dates, and write descriptions based on natural language prompts.

More from our Blog