A Model Context Protocol (MCP) server for interacting with Basecamp 4. This server enables LLMs to manage projects, to-dos, messages, schedules, comments, and files in Basecamp through a standardized interface.
- Full OAuth 2.0 authentication with token persistence and automatic refresh
- Project management - List and view projects and team members
- To-do management - Create, update, complete, and organize to-dos and to-do lists
- Messages - Post and manage messages on project message boards
- Schedule - Create and manage calendar events and schedule entries
- Comments - Add comments to any Basecamp item (messages, to-dos, files, etc.)
- File management - Upload, download, and organize files in vaults
- Python 3.10+
- uv (recommended) or pip
- Basecamp OAuth application - Create one at launchpad.37signals.com/integrations
cd basecamp-mcp
uv syncpip install -e .Set the following environment variables:
export BASECAMP_CLIENT_ID="your_client_id"
export BASECAMP_CLIENT_SECRET="your_client_secret"
export BASECAMP_REDIRECT_URI="http://localhost:9292/callback" # Or your callback URL
export BASECAMP_USER_AGENT="YourApp (your@email.com)" # Required by Basecamp# With uv
uv run basecamp-mcp
# Or directly
python -m basecamp_mcp.serverAdd to your Claude Desktop configuration (~/.config/claude/claude_desktop_config.json):
{
"mcpServers": {
"basecamp": {
"command": "uv",
"args": ["--directory", "/path/to/basecamp-mcp", "run", "basecamp-mcp"],
"env": {
"BASECAMP_CLIENT_ID": "your_client_id",
"BASECAMP_CLIENT_SECRET": "your_client_secret",
"BASECAMP_USER_AGENT": "ClaudeDesktop (your@email.com)"
}
}
}
}- Run
basecamp_auth_startto get an authorization URL - Open the URL in a browser and authorize the application
- Copy the
codeparameter from the callback URL - Run
basecamp_auth_callbackwith the code - Run
basecamp_list_accountsto see available Basecamp accounts - Run
basecamp_set_accountwith the desired account ID
basecamp_auth_start- Start OAuth flowbasecamp_auth_callback- Complete OAuth with authorization codebasecamp_list_accounts- List available Basecamp accountsbasecamp_set_account- Select account to usebasecamp_auth_status- Check authentication status
basecamp_list_projects- List all projectsbasecamp_get_project- Get project details (including dock with tool IDs)basecamp_list_people- List all people in the accountbasecamp_get_person- Get person detailsbasecamp_get_my_profile- Get current user's profilebasecamp_get_project_people- List people in a project
basecamp_get_todoset- Get the to-do set for a projectbasecamp_list_todolists- List to-do listsbasecamp_get_todolist- Get a to-do listbasecamp_create_todolist- Create a new to-do listbasecamp_update_todolist- Update a to-do listbasecamp_list_todos- List to-dos in a listbasecamp_get_todo- Get a to-dobasecamp_create_todo- Create a new to-dobasecamp_update_todo- Update a to-dobasecamp_complete_todo- Mark to-do as completebasecamp_uncomplete_todo- Mark to-do as incompletebasecamp_reposition_todo- Change to-do position
basecamp_get_message_board- Get the message boardbasecamp_list_messages- List messagesbasecamp_get_message- Get a messagebasecamp_create_message- Post a new messagebasecamp_update_message- Update a messagebasecamp_pin_message- Pin/unpin a messagebasecamp_list_message_types- List message types
basecamp_get_schedule- Get the schedulebasecamp_list_schedule_entries- List schedule entriesbasecamp_get_schedule_entry- Get a schedule entrybasecamp_create_schedule_entry- Create a new eventbasecamp_update_schedule_entry- Update an event
basecamp_list_comments- List comments on an itembasecamp_get_comment- Get a commentbasecamp_create_comment- Add a commentbasecamp_update_comment- Update a comment
basecamp_get_vault- Get a vault (folder)basecamp_list_vaults- List sub-vaultsbasecamp_create_vault- Create a folderbasecamp_list_uploads- List files in a vaultbasecamp_get_upload- Get file detailsbasecamp_upload_file- Upload a filebasecamp_update_upload- Update file descriptionbasecamp_get_file_download_url- Get download URL
basecamp_search- Search across all projectsbasecamp_trash_recording- Move any item to trash
Every project has a "dock" containing its enabled tools. When you call basecamp_get_project, the response includes:
{
"dock": [
{"name": "message_board", "id": 123, "enabled": true},
{"name": "todoset", "id": 456, "enabled": true},
{"name": "schedule", "id": 789, "enabled": true},
{"name": "vault", "id": 101, "enabled": true}
]
}Use these IDs when calling tools that require message_board_id, todoset_id, schedule_id, or vault_id.
Project
└── To-do set (one per project, from dock)
└── To-do lists
└── To-dos
Project
└── Vault (root, from dock)
├── Uploads (files)
└── Vaults (sub-folders)
└── ...
The server handles common errors gracefully:
- 401 Unauthorized: Token expired, re-authenticate
- 404 Not Found: Resource deleted or no access
- 429 Rate Limited: Automatic retry with backoff
- 5xx Server Errors: Automatic retry with exponential backoff
Tokens are stored securely at ~/.config/basecamp_mcp/tokens.json with restrictive file permissions (600).
MIT