Connect Basecamp to ChatGPT: Manage Tasks & Team Communication via MCP
Learn how to connect Basecamp to ChatGPT using a managed MCP server. Automate task creation, sync project communication, and manage workflows with AI.
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 ChatGPT so your AI agents can query project statuses, assign tasks, and manage cross-functional workflows entirely through natural language. If your team uses Claude, check out our guide on connecting Basecamp to Claude or read our broader architectural overview on connecting Basecamp to AI Agents.
To connect Basecamp to ChatGPT, 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 ChatGPT, 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. 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." An agent must first identify the correct bucket_id, then locate the todolist_id within that bucket's active tools, and finally post the item. This requires an LLM to execute multi-step discovery sequences before taking action.
2. The Polymorphic "Recordings" Architecture
Under the hood, Basecamp treats messages, to-dos, documents, and schedule entries as polymorphic recordings. When an agent lists comments or events, the API returns references to these parent recordings. Handling these responses requires your integration layer to properly parse the recordable_type to understand what kind of entity the agent is actually interacting with.
3. Soft Deletes and the Trash Lifecycle Basecamp APIs rarely execute immediate hard deletes. Instead, calling a delete endpoint "trashes" the item, entering it into a 30-day grace period. If your agent is auditing deleted users or managing project cleanup, it must understand the difference between an active resource, a trashed recording, and a permanently deleted entity.
How to Generate a Basecamp MCP Server
Truto automatically generates MCP tools based on Basecamp's API documentation and your connected account's specific schema. You can spin up a Basecamp MCP server via the Truto dashboard or programmatically via the API.
Method 1: Via the Truto UI
- Log into your Truto dashboard and navigate to the Integrated Accounts page.
- Select your connected Basecamp account.
- Click the MCP Servers tab.
- Click Create MCP Server.
- Select your desired configuration (e.g., restrict to read-only methods or filter by specific resource tags).
- Copy the generated MCP server URL. This URL contains a secure cryptographic token scoped specifically to this account.
Method 2: Via the Truto API
For teams building automated provisioning pipelines, you can generate MCP servers programmatically. Send a POST request to the /integrated-account/:id/mcp endpoint.
curl -X POST https://api.truto.one/integrated-account/YOUR_ACCOUNT_ID/mcp \
-H "Authorization: Bearer YOUR_TRUTO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Basecamp ChatGPT Agent",
"config": {
"methods": ["read", "write"]
}
}'The API returns a database record containing the ready-to-use MCP server URL:
{
"id": "mcp_abc123",
"name": "Basecamp ChatGPT Agent",
"config": { "methods": ["read", "write"] },
"expires_at": null,
"url": "https://api.truto.one/mcp/a1b2c3d4e5f6..."
}How to Connect the Basecamp MCP Server to ChatGPT
Once you have your MCP server URL, you need to register it with ChatGPT. You can do this directly in the ChatGPT desktop app or via a local configuration file if you are using a proxy layer.
Method A: Via the ChatGPT UI
- Open the ChatGPT desktop application.
- Navigate to Settings -> Apps -> Advanced settings.
- Enable Developer mode (MCP support requires this flag to be active).
- Under MCP servers / Custom connectors, click Add new server.
- Enter a name (e.g., "Basecamp via Truto").
- Paste your Truto MCP URL into the Server URL field.
- Save the configuration. ChatGPT will immediately connect, perform an initialization handshake, and load the Basecamp tool inventory.
Method B: Via Manual Config File
If you are running a local agent environment or want to proxy the connection through the standard MCP SSE (Server-Sent Events) bridge, you can configure your MCP client manually using the @modelcontextprotocol/server-sse package.
Add the following to your MCP client configuration file (e.g., mcp_config.json):
{
"mcpServers": {
"basecamp-truto": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sse",
"--url",
"https://api.truto.one/mcp/YOUR_TRUTO_TOKEN"
]
}
}
}sequenceDiagram
participant ChatGPT
participant Truto MCP Server
participant Basecamp API
ChatGPT->>Truto MCP Server: POST /mcp/:token (tools/call)<br>{"method": "create_a_basecamp_todo"}
Truto MCP Server->>Truto MCP Server: Validate Token & Schema
Truto MCP Server->>Basecamp API: POST /buckets/:id/todolists/:id/todos.json
Basecamp API-->>Truto MCP Server: 201 Created (To-do data)
Truto MCP Server-->>ChatGPT: JSON-RPC ResponseBasecamp MCP Tool Inventory
Truto exposes Basecamp's API surface as standardized, LLM-friendly tools. Below are the core tools your agent will use most often, followed by the complete inventory.
Hero Tools
list_all_basecamp_projects
- Description: Retrieves all active projects visible to the current user in Basecamp, returning IDs, names, descriptions, and the array of enabled tools (docks) within each project.
- Example Prompt: "Pull a list of all active projects and tell me which ones have the Campfire chat enabled."
list_all_basecamp_todos
- Description: Fetches active to-dos for a specific
bucket_idandtodolist_id. Returns titles, descriptions, assignees, and completion statuses. - Example Prompt: "Get all the open to-dos in the 'Website Redesign' project under the 'Frontend' list."
create_a_basecamp_todo
- Description: Creates a new to-do inside a specific project bucket and to-do list. Accepts content, descriptions, due dates, and assignee IDs.
- Example Prompt: "Create a new to-do to 'Update the hero image' in the Marketing project. Assign it to user ID 12345 and set the due date for this Friday."
create_a_basecamp_comment
- Description: Posts a comment on any recording (a message, to-do, or document) within a project bucket.
- Example Prompt: "Add a comment to the 'Database Migration' to-do saying that the staging environment is now ready for testing."
list_all_basecamp_campfire_lines
- Description: Retrieves the chat history (lines) from a specific Campfire chat within a project bucket.
- Example Prompt: "Read the last 20 messages in the Engineering Campfire and summarize the discussion about the API rate limit issue."
create_a_basecamp_document
- Description: Creates a new rich-text document inside a specific project's Vault.
- Example Prompt: "Draft a new document in the HR project vault titled 'Q3 Onboarding Guide' and paste the standard welcome text."
Complete 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.
- get_single_basecamp_person_by_id: Get a specific person's profile by ID.
- get_single_basecamp_project_by_id: Retrieve details for a specific project.
- create_a_basecamp_project: Create a new project bucket.
- update_a_basecamp_project_by_id: Update a project's name or description.
- delete_a_basecamp_project_by_id: Trash a project (marks for 30-day deletion).
- get_single_basecamp_todo_by_id: Retrieve a specific to-do.
- update_a_basecamp_todo_by_id: Modify an existing to-do's content or assignees.
- delete_a_basecamp_todo_by_id: Trash a specific to-do.
- list_all_basecamp_todo_lists: Get all to-do lists within a project's todoset.
- get_single_basecamp_todo_list_by_id: Retrieve a specific to-do list.
- create_a_basecamp_todo_list: Create a new to-do list.
- update_a_basecamp_todo_list_by_id: Rename a to-do list.
- list_all_basecamp_comments: Get comments for a specific recording.
- get_single_basecamp_comment_by_id: Retrieve a specific comment.
- update_a_basecamp_comment_by_id: Edit an existing comment.
- list_all_basecamp_deleted_people: Retrieve a list of deleted users for auditing.
- list_all_basecamp_card_tables: Get a specific card table (Kanban board).
- list_all_basecamp_card_table_columns: Get columns within a card table.
- create_a_basecamp_card_table_column: Add a new column to a card table.
- update_a_basecamp_card_table_column_by_id: Rename a card table column.
- list_all_basecamp_card_table_cards: Get cards within a specific column.
- get_single_basecamp_card_table_card_by_id: Retrieve a specific card.
- create_a_basecamp_card_table_card: Create a new card on a board.
- update_a_basecamp_card_table_card_by_id: Modify a card's content or assignees.
- list_all_basecamp_attachments: Retrieve metadata about uploaded files across projects.
- list_all_basecamp_campfires: Get all active Campfires visible to the user.
- get_single_basecamp_campfire_by_id: Retrieve details for a specific Campfire.
- get_single_basecamp_campfire_line_by_id: Retrieve a specific chat message.
- create_a_basecamp_campfire_line: Post a new message to a Campfire.
- delete_a_basecamp_campfire_line_by_id: Delete a Campfire 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: Get chatbots configured for a Campfire.
- get_single_basecamp_chatbot_by_id: Retrieve a specific chatbot.
- create_a_basecamp_chatbot: Register a new chatbot.
- update_a_basecamp_chatbot_by_id: Modify a chatbot configuration.
- delete_a_basecamp_chatbot_by_id: Remove a chatbot.
- list_all_basecamp_client_approvals: Get client approvals for a project.
- get_single_basecamp_client_approval_by_id: Retrieve a specific client approval.
- list_all_basecamp_client_correspondences: Get client correspondences for a project.
- get_single_basecamp_client_correspondence_by_id: Retrieve a specific correspondence.
- list_all_basecamp_client_replies: Get client replies on a recording.
- get_single_basecamp_client_reply_by_id: Retrieve a specific client reply.
- update_a_basecamp_client_visibility_by_id: Toggle client visibility on a recording.
- list_all_basecamp_documents: Get active documents in a project Vault.
- get_single_basecamp_document_by_id: Retrieve a specific document.
- update_a_basecamp_document_by_id: Edit a document's content.
- list_all_basecamp_events: Get the event timeline for a recording.
- list_all_basecamp_forwards: Get email forwards in a project Inbox.
- get_single_basecamp_forward_by_id: Retrieve a specific forward.
- list_all_basecamp_inbox_replies: Get replies to an inbox forward.
- get_single_basecamp_inbox_reply_by_id: Retrieve a specific inbox reply.
- list_all_basecamp_inbox: Get inbox details for a project.
- create_a_basecamp_lineup_maker: Create a timeline marker.
- update_a_basecamp_lineup_maker_by_id: Modify a timeline marker.
- delete_a_basecamp_lineup_maker_by_id: Destroy a timeline marker.
- list_all_basecamp_message_boards: Get the message board for a project.
- list_all_basecamp_message_types: Get configured message categories.
- get_single_basecamp_message_type_by_id: Retrieve a specific message category.
- create_a_basecamp_message_type: Create 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: Get active messages on a board.
- get_single_basecamp_message_by_id: Retrieve a specific message.
- create_a_basecamp_message: Post a new message to a board.
- update_a_basecamp_message_by_id: Edit an existing message.
- delete_a_basecamp_message_by_id: Unpin or delete a message.
- list_all_basecamp_question_answers: Get answers to an automatic check-in.
- get_single_basecamp_question_answer_by_id: Retrieve a specific check-in answer.
- list_all_basecamp_questionnaires: Get check-in questionnaires for a project.
- list_all_basecamp_questions: Get specific questions from a questionnaire.
- get_single_basecamp_question_by_id: Retrieve a specific check-in question.
- list_all_basecamp_recordings: Get generic recordings filtered by type.
- list_all_basecamp_schedule_entries: Get calendar events for a project.
- get_single_basecamp_schedule_entry_by_id: Retrieve a specific calendar event.
- create_a_basecamp_schedule_entry: Create a new calendar event.
- update_a_basecamp_schedule_entry_by_id: Modify a calendar event.
- get_single_basecamp_schedule_by_id: Get the schedule tool for a project.
- update_a_basecamp_schedule_by_id: Modify project schedule settings.
- list_all_basecamp_templates: Get active project templates.
- get_single_basecamp_template_by_id: Retrieve a specific template.
- create_a_basecamp_template: Create a new project template.
- update_a_basecamp_template_by_id: Modify an existing template.
- delete_a_basecamp_template_by_id: Trash a project template.
- get_single_basecamp_todo_set_by_id: Get the todoset tool for a project.
- list_all_basecamp_uploads: Get active file uploads in a Vault.
- get_single_basecamp_upload_by_id: Retrieve a specific file upload.
- create_a_basecamp_upload: Register a new file upload.
- update_a_basecamp_upload_by_id: Modify file upload metadata.
- list_all_basecamp_vaults: Get document vaults for a project.
- get_single_basecamp_vault_by_id: Retrieve a specific vault.
- create_a_basecamp_vault: Create a new vault.
- update_a_basecamp_vault_by_id: Rename a vault.
- list_all_basecamp_webhooks: Get configured webhooks for a project bucket.
- get_single_basecamp_webhook_by_id: Retrieve a specific webhook.
- create_a_basecamp_webhook: Register a new webhook.
- update_a_basecamp_webhook_by_id: Modify an existing webhook.
- delete_a_basecamp_webhook_by_id: Remove a webhook.
Workflows in Action
AI agents excel at orchestrating multi-step API sequences. Here is how ChatGPT uses these tools to automate real Basecamp workflows.
Scenario 1: Project Kickoff & Task Delegation
When starting a new initiative, project managers spend hours setting up infrastructure. An AI agent can handle the entire setup sequence based on a single prompt.
User Prompt: "Set up the 'Q4 Enterprise Launch' project in Basecamp. Inside it, create a to-do list called 'Go-To-Market Assets'. Add a to-do for drafting the press release and assign it to Sarah. Finally, post a message in the Campfire letting the team know the project is ready."
Execution Steps:
create_a_basecamp_project: The agent creates the bucket and captures the returnedbucket_idand the IDs of the generated tools (like the todoset and chat).create_a_basecamp_todo_list: Using thebucket_idandtodoset_id, the agent creates the "Go-To-Market Assets" list.list_all_basecamp_people: The agent searches for "Sarah" to retrieve her user ID.create_a_basecamp_todo: The agent creates the press release task, injecting Sarah's ID into theassignee_idsarray.create_a_basecamp_campfire_line: Using thechat_idfrom step 1, the agent broadcasts the welcome message to the team.
Scenario 2: Triage Client Feedback
Basecamp's client correspondence features allow external stakeholders to email feedback directly into a project. An agent can monitor these emails and convert actionable feedback into engineering tasks.
User Prompt: "Check the latest client correspondences in the 'Website Redesign' project. If the client requested any specific changes, turn them into to-dos in the 'Client Feedback' list and add a comment to the original correspondence confirming they were logged."
Execution Steps:
list_all_basecamp_projects: The agent finds thebucket_idfor "Website Redesign".list_all_basecamp_client_correspondences: The agent reads the latest messages, parsing the text to identify actionable requests.list_all_basecamp_todo_lists: The agent locates the ID for the "Client Feedback" list.create_a_basecamp_todo: The agent loops through the identified requests, creating a distinct to-do for each one.create_a_basecamp_comment: The agent posts a reply on the original client correspondence recording, noting that the tasks have been queued.
Security and Access Control
Giving an LLM access to your company's Basecamp environment requires strict boundaries. Truto provides several mechanisms to secure your MCP servers at the infrastructure level:
- Method Filtering: Restrict an agent to read-only operations. By setting
config.methods: ["read"]during server creation, Truto will strip out allcreate,update, anddeletetools before the LLM even sees them. - Tag Filtering: Scope the agent's access to specific resource types. You can configure the server to only expose tools tagged as
todosorcampfires, preventing the model from accidentally modifying billing settings or project templates. - API Token Authentication: By default, the MCP server URL acts as a bearer token. For enterprise deployments, enable
require_api_token_auth: true. This forces the MCP client to also provide a valid Truto API token in the Authorization header, ensuring the URL alone cannot grant access. - Ephemeral Access: Set an
expires_attimestamp when creating the MCP server. Truto's scheduled cleanup routines will automatically invalidate the token and delete the server when the time expires, making it perfect for temporary contractor access or limited-duration CI/CD runs. - Rate Limit Handling: Truto does not absorb or automatically retry Basecamp rate limit errors. If the Basecamp API returns an HTTP 429, Truto passes it directly to the caller with normalized
ratelimit-*headers. Your agent orchestration layer is responsible for reading these headers and implementing intelligent backoff.
FAQ
- Does Truto store my Basecamp project data?
- No. Truto operates as a pass-through proxy. Tool calls are translated and forwarded to Basecamp in real-time, and responses are returned directly to the LLM without caching the underlying data.
- Can I limit ChatGPT to read-only access in Basecamp?
- Yes. When creating the MCP server, you can configure method filtering to only expose 'read' operations, preventing the AI from creating, updating, or deleting Basecamp resources.
- How does the MCP server handle Basecamp's API rate limits?
- Truto passes HTTP 429 rate limit errors directly to the caller alongside normalized rate limit headers. Your AI agent or orchestration layer is responsible for reading these headers and applying exponential backoff.