@yashwant.dharmdas/basecamp-mcp
v1.8.0
Published
MCP Server for Basecamp 3 - manage projects, todos, messages, and more via Claude
Downloads
2,663
Maintainers
Readme
Basecamp MCP Server
An MCP (Model Context Protocol) server that enables LLMs like Claude to interact with your Basecamp 3 projects, to-dos, messages, campfire, and more.
Features
- 18 MCP Tools covering Basecamp's core features:
- Projects: list, get details, create, update
- To-do Lists: list, create
- To-dos: list, get, create, update, complete, uncomplete
- Messages: list, get, create
- Campfire (Chat): list messages, send message
- Comments: list, create on any recording
- People: list all, get own profile
- Dual Transport: Stdio (Claude Desktop) and HTTP/SSE (remote hosting)
- Auto Token Refresh: Automatically refreshes expired OAuth tokens
Quick Start
1. Register a Basecamp OAuth App
Go to launchpad.37signals.com/integrations and register a new application.
Set the Redirect URI to: http://localhost:3000/callback
2. Configure Environment
cp .env.example .envEdit .env and fill in your BASECAMP_CLIENT_ID and BASECAMP_CLIENT_SECRET.
3. Install Dependencies
npm install4. Authenticate
npm run authThis opens your browser to authorize the app and automatically saves your tokens.
5. Use with Claude Desktop
Add to your Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"basecamp": {
"command": "node",
"args": ["D:/Projects/basecamp-mcp/dist/index.js", "--stdio"]
}
}
}Then restart Claude Desktop.
Available Tools
| Tool | Description |
|------|-------------|
| list_projects | List all accessible projects |
| get_project | Get project details + dock (tool IDs) |
| create_project | Create a new project |
| update_project | Update project name/description |
| list_todolists | List to-do lists in a todoset |
| create_todolist | Create a new to-do list |
| list_todos | List to-dos in a to-do list |
| get_todo | Get to-do details |
| create_todo | Create a new to-do |
| update_todo | Update a to-do |
| complete_todo | Mark to-do as done |
| uncomplete_todo | Re-open a to-do |
| list_messages | List messages on a board |
| get_message | Get full message content |
| create_message | Post a new message |
| list_campfire_lines | List recent chat messages |
| send_campfire_message | Send a campfire message |
| list_comments | List comments on a recording |
| create_comment | Add a comment to a recording |
| list_people | List all people on the account |
| get_my_profile | Get authenticated user profile |
| screenshot_basecamp_page | Screenshot any Basecamp URL via headless browser (workaround for image CDN auth) |
Viewing images on Basecamp pages
Basecamp's image CDN (preview.3.basecamp.com, storage.3.basecamp.com) only accepts session cookies, not OAuth tokens — so attached images cannot be downloaded via the API. The screenshot_basecamp_page tool drives a headless Chrome that returns the rendered page (or a specific comment) as an image.
One-time browser login (recommended)
Run this once in your terminal:
npx --package="@yashwant.dharmdas/basecamp-mcp" basecamp-mcp-loginA Chrome window opens, navigates to Basecamp's Launchpad — log in there. The window closes automatically once you're signed in, saving the session in a dedicated MCP profile at ~/.config/basecamp-mcp/chrome-profile.
After that, screenshot_basecamp_page works automatically. The cookie auto-refreshes from inside Chrome as long as the tool is used at least once every ~2 weeks. If the session ever expires, just re-run the same command.
Why a dedicated profile (and not a clone of your real Chrome profile)? Chrome 127+ uses App-Bound Encryption for cookies on Windows, which binds encryption to both the Chrome binary and the user-data-dir path. Cloning your live profile to a different path silently breaks decryption — sessions look empty and Basecamp redirects to sign-in. A dedicated profile encrypted at its own path works reliably.
Optional env overrides:
CHROME_PATH=C:\Path\To\chrome.exe # if Chrome isn't in a default locationThe tool auto-detects Chrome (Google Chrome → Microsoft Edge fallback) on Windows, macOS, and Linux.
Manual fallback (if you can't run the CLI)
Set BASECAMP_SESSION_COOKIE in your .env to a value copied from DevTools → Cookies → _bc3_session. The presence of this env var disables persistent-profile mode and uses your pasted value instead. The cookie expires every ~2 weeks and you'll need to re-paste.
Behaviour
When the URL contains a #__recording_<id> anchor, the tool automatically scopes the screenshot to just that comment. Otherwise it captures the full page. Override with mode: "viewport" | "fullpage" | "element" and an optional selector.
This tool is intentionally named differently from the Elementor MCP's screenshot-page so the two don't collide.
HTTP Mode (for hosting)
npm run startThe server runs on port 3000 (configurable via PORT env var).
Health check:
GET /healthMCP endpoint:
POST /mcpMCP endpoint:
POST /mcp
Deployment (Render.com)
This server is ready to be deployed to Render as a Web Service.
1. Push to GitHub
Push your local repository to a private GitHub repository.
2. Connect to Render
- Create a new Web Service on Render.
- Connect your GitHub repository.
- Render will automatically detect the settings from
render.yaml.
3. Configure Environment Variables
Add the following variables in the Render Dashboard (or via the Blueprint setup):
BASECAMP_CLIENT_IDBASECAMP_CLIENT_SECRETBASECAMP_REDIRECT_URI:https://your-service-name.onrender.com/callbackBASECAMP_ACCESS_TOKENBASECAMP_REFRESH_TOKENBASECAMP_ACCOUNT_ID
[!IMPORTANT] Since Render's free tier has an ephemeral filesystem, the server cannot permanently update your
.envfile when tokens are refreshed. If the server is restarted/redeployed, it will revert to the initial tokens you provided in the environment variables. If tokens expire, you may need to re-runnpm run authlocally and update the Render environment variables with the new tokens.
4. Update Basecamp Redirect URI
Don't forget to add your Render URL (e.g., https://your-service-name.onrender.com/callback) to your application's Redirect URIs in the Basecamp Launchpad.
