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 install
npm run build
You have two options:
export BASECAMP_ACCESS_TOKEN="your_access_token_here"
export BASECAMP_ACCOUNT_ID="your_account_id" # Optional, will auto-detect
Create 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 config
Edit 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.js
npx @modelcontextprotocol/inspector node build/index.js
basecamp-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.json
file
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
command
path 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