A Model Context Protocol (MCP) server for complete Basecamp automation. This server allows AI assistants like Claude to interact with Basecamp projects, cards, todos, comments, and more.
Author: Varun Dubey (vapvarun) | Company: Wbcom Designs
If you cloned this from GitHub, you need to create your config.json file:
# 1. Copy the example config
cp config.example.json config.json
# 2. Edit config.json and add your Basecamp credentials
# (See "Getting Basecamp Credentials" section below)Note: config.json is gitignored and will never be committed to keep your credentials safe.
✅ Complete Basecamp API Coverage
- Read and comment on cards/todos
- Create, update, move, and trash cards
- Manage projects, columns, and steps
- Handle todos and checklists
- List and manage people
- Track events and activity
✅ 40+ MCP Tools Available
- Complete Basecamp API integration via MCP tools
- Full CRUD operations for all Basecamp resources
- Search and utility functions
✅ Smart Features
- Auto-detect account ID
- Extract images from comments
- Parse Basecamp URLs
- Fuzzy project search
cd basecamp-mcp-server
npm installnpm run buildYou have two options:
export BASECAMP_ACCESS_TOKEN="your_access_token_here"
export BASECAMP_ACCOUNT_ID="your_account_id" # Optional, will auto-detectCreate a config.json file in the project root:
{
"accessToken": "your_access_token_here",
"accountId": "your_account_id"
}Note: Use config.example.json as a template. Never commit config.json to version control.
- Go to Basecamp Integrations
- Click "Register a new app"
- Fill in the details:
- Name: Your app name (e.g., "My MCP Server")
- Company: Your company/name
- Website: Your website URL
- Redirect URI:
http://localhost:3000/callback(or your callback URL)
From your app page, note down:
- Client ID
- Client Secret
Implement OAuth flow to get your access token:
import { BasecampAPI } from './src/basecamp-api.js';
// 1. Get authorization URL
const authUrl = BasecampAPI.getOAuthUrl(clientId, redirectUri);
// Direct user to this URL
// 2. Exchange code for token (after OAuth redirect)
const tokens = await BasecampAPI.exchangeAuthCode(
clientId,
clientSecret,
redirectUri,
code
);
console.log(tokens.access_token); // Use this in your configEdit your Claude Desktop config file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Add the server:
{
"mcpServers": {
"basecamp": {
"command": "node",
"args": ["/absolute/path/to/basecamp-mcp-server/build/index.js"],
"env": {
"BASECAMP_ACCESS_TOKEN": "your_access_token_here",
"BASECAMP_ACCOUNT_ID": "your_account_id"
}
}
}
}The Basecamp tools will now be available in Claude.
basecamp_read- Read card/todo with comments and imagesbasecamp_comment- Post a comment to any card/todo
basecamp_list_projects- List all projectsbasecamp_get_project- Get project detailsbasecamp_create_project- Create a new projectbasecamp_update_project- Update projectbasecamp_trash_project- Delete project
basecamp_list_columns- List columns in a card tablebasecamp_list_cards- List cards in a columnbasecamp_get_card- Get card detailsbasecamp_create_card- Create a new cardbasecamp_update_card- Update card detailsbasecamp_move_card- Move card to different columnbasecamp_trash_card- Delete card
basecamp_list_steps- List steps on a cardbasecamp_add_step- Add a new stepbasecamp_complete_step- Mark step as donebasecamp_uncomplete_step- Mark step as not done
basecamp_get_todo- Get todo detailsbasecamp_create_todo- Create a new todobasecamp_complete_todo- Complete todobasecamp_uncomplete_todo- Uncomplete todo
basecamp_list_people- List all peoplebasecamp_get_person- Get person details
basecamp_get_events- Get recent activity
basecamp_find_project- Search projects by namebasecamp_parse_url- Parse Basecamp URL to extract IDs
// In Claude Desktop, you can simply ask:
// "Read this Basecamp card: https://3.basecamp.com/5798509/buckets/37594834/card_tables/cards/9010883489"
// The tool will be called automatically:
{
"tool": "basecamp_read",
"arguments": {
"url": "https://3.basecamp.com/5798509/buckets/37594834/card_tables/cards/9010883489",
"include_comments": true,
"include_images": true
}
}// "Create a card in project 37594834, column 7389123 titled 'New Feature' with description 'Implement OAuth'"
{
"tool": "basecamp_create_card",
"arguments": {
"project_id": "37594834",
"column_id": "7389123",
"title": "New Feature",
"content": "Implement OAuth authentication",
"due_on": "2024-12-31"
}
}// "Move card 9010883489 to the Done column (column 7389456)"
{
"tool": "basecamp_move_card",
"arguments": {
"project_id": "37594834",
"card_id": "9010883489",
"to_column": "7389456"
}
}// "Post a comment to this card saying 'Work completed!'"
{
"tool": "basecamp_comment",
"arguments": {
"url": "https://3.basecamp.com/5798509/buckets/37594834/card_tables/cards/9010883489",
"comment": "Work completed! ✅"
}
}npm run dev # Watch mode - rebuilds on changes# Build first
npm run build
# Run directly
node build/index.js
# Or with explicit config
BASECAMP_ACCESS_TOKEN="your_token" node build/index.jsnpx @modelcontextprotocol/inspector node build/index.jsbasecamp-mcp-server/
├── src/
│ ├── index.ts # Entry point
│ ├── server.ts # Main MCP server implementation
│ ├── basecamp-api.ts # Basecamp API client
│ ├── tools.ts # MCP tool definitions
│ └── config.ts # Configuration loader
├── build/ # Compiled JavaScript (generated)
├── package.json
├── tsconfig.json
├── config.example.json # Example config
└── README.md
-
BasecampAPI (
basecamp-api.ts)- Complete Basecamp API v3 client
- Handles OAuth and all API endpoints
- Full TypeScript implementation
-
BasecampMCPServer (
server.ts)- Implements MCP protocol
- Routes tool calls to API methods
- Handles responses and errors
-
Tools (
tools.ts)- Defines all available MCP tools
- Includes input schemas and descriptions
-
Config (
config.ts)- Loads credentials from env or file
- Handles configuration management
Make sure you've set either:
- Environment variables (
BASECAMP_ACCESS_TOKEN) - Or created a
config.jsonfile
Your access token has expired. Get a new one via OAuth or use a refresh token.
Make sure the URL format is correct:
- Cards:
https://3.basecamp.com/{account}/buckets/{project}/card_tables/cards/{card_id} - Todos:
https://3.basecamp.com/{account}/buckets/{project}/todos/{todo_id}
- Check Claude Desktop config file path is correct
- Ensure the
commandpath points tobuild/index.js - Restart Claude Desktop completely
- Check Claude Desktop logs for errors
Full Basecamp API documentation: https://github.com/basecamp/bc3-api
Contributions are welcome! To contribute:
- Fork the repository
- Make changes in the appropriate files
- Build:
npm run build - Test with MCP Inspector
- Submit a pull request
For detailed guidelines, see CONTRIBUTING.md
GPL v2 or later
Created by: Varun Dubey (vapvarun) Company: Wbcom Designs Email: varun@wbcomdesigns.com
- Basecamp API: Basecamp 3 API by 37signals
- MCP Protocol: Model Context Protocol by Anthropic
For issues related to:
- MCP Server: Open an issue on GitHub
- Basecamp API: Check Basecamp API documentation
- Claude Desktop: Check Anthropic MCP documentation
For professional support, custom development, or enterprise solutions:
- Website: https://wbcomdesigns.com
- Email: varun@wbcomdesigns.com
Made with ❤️ by Varun Dubey at Wbcom Designs