basecamp-mcp-server 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. basecamp_mcp_server-1.0.0/.gitignore +71 -0
  2. basecamp_mcp_server-1.0.0/LICENSE +21 -0
  3. basecamp_mcp_server-1.0.0/PKG-INFO +546 -0
  4. basecamp_mcp_server-1.0.0/README.md +519 -0
  5. basecamp_mcp_server-1.0.0/auth_manager.py +70 -0
  6. basecamp_mcp_server-1.0.0/basecamp_client.py +3250 -0
  7. basecamp_mcp_server-1.0.0/basecamp_fastmcp.py +6158 -0
  8. basecamp_mcp_server-1.0.0/basecamp_mcp_server/__init__.py +3 -0
  9. basecamp_mcp_server-1.0.0/basecamp_mcp_server/__main__.py +3 -0
  10. basecamp_mcp_server-1.0.0/basecamp_mcp_server/cli.py +427 -0
  11. basecamp_mcp_server-1.0.0/basecamp_oauth.py +141 -0
  12. basecamp_mcp_server-1.0.0/basecamp_retrieval_mcp.py +196 -0
  13. basecamp_mcp_server-1.0.0/basecamp_tool_retrieval.py +272 -0
  14. basecamp_mcp_server-1.0.0/payload_shaping.py +488 -0
  15. basecamp_mcp_server-1.0.0/pyproject.toml +98 -0
  16. basecamp_mcp_server-1.0.0/pytest.ini +2 -0
  17. basecamp_mcp_server-1.0.0/recording_utils.py +68 -0
  18. basecamp_mcp_server-1.0.0/requirements.txt +15 -0
  19. basecamp_mcp_server-1.0.0/search_utils.py +664 -0
  20. basecamp_mcp_server-1.0.0/sign_in_messages.py +37 -0
  21. basecamp_mcp_server-1.0.0/tests/__init__.py +1 -0
  22. basecamp_mcp_server-1.0.0/tests/test_account_reports.py +408 -0
  23. basecamp_mcp_server-1.0.0/tests/test_account_upload_visibility_tools.py +116 -0
  24. basecamp_mcp_server-1.0.0/tests/test_assignment_reports.py +169 -0
  25. basecamp_mcp_server-1.0.0/tests/test_campfire_lifecycle.py +88 -0
  26. basecamp_mcp_server-1.0.0/tests/test_card_step_completion.py +75 -0
  27. basecamp_mcp_server-1.0.0/tests/test_card_tables.py +210 -0
  28. basecamp_mcp_server-1.0.0/tests/test_card_wormhole_tools.py +90 -0
  29. basecamp_mcp_server-1.0.0/tests/test_checkin_tools.py +82 -0
  30. basecamp_mcp_server-1.0.0/tests/test_cli_fastmcp_parity.py +205 -0
  31. basecamp_mcp_server-1.0.0/tests/test_cli_server.py +368 -0
  32. basecamp_mcp_server-1.0.0/tests/test_cli_vault_upload_tools.py +157 -0
  33. basecamp_mcp_server-1.0.0/tests/test_dock_lookup.py +124 -0
  34. basecamp_mcp_server-1.0.0/tests/test_dock_tools.py +90 -0
  35. basecamp_mcp_server-1.0.0/tests/test_docstring_contract.py +153 -0
  36. basecamp_mcp_server-1.0.0/tests/test_download_attachment.py +245 -0
  37. basecamp_mcp_server-1.0.0/tests/test_draft_creation.py +257 -0
  38. basecamp_mcp_server-1.0.0/tests/test_fastmcp_comments.py +106 -0
  39. basecamp_mcp_server-1.0.0/tests/test_fastmcp_error_response.py +52 -0
  40. basecamp_mcp_server-1.0.0/tests/test_gauge_tools.py +113 -0
  41. basecamp_mcp_server-1.0.0/tests/test_get_todos_filters.py +102 -0
  42. basecamp_mcp_server-1.0.0/tests/test_hill_chart_tools.py +71 -0
  43. basecamp_mcp_server-1.0.0/tests/test_http_helper_timeouts.py +45 -0
  44. basecamp_mcp_server-1.0.0/tests/test_message_category_tools.py +73 -0
  45. basecamp_mcp_server-1.0.0/tests/test_message_lifecycle.py +69 -0
  46. basecamp_mcp_server-1.0.0/tests/test_notification_tools.py +127 -0
  47. basecamp_mcp_server-1.0.0/tests/test_oauth_log_safety.py +88 -0
  48. basecamp_mcp_server-1.0.0/tests/test_oauth_timeouts.py +39 -0
  49. basecamp_mcp_server-1.0.0/tests/test_packaging.py +300 -0
  50. basecamp_mcp_server-1.0.0/tests/test_pagination.py +184 -0
  51. basecamp_mcp_server-1.0.0/tests/test_payload_shaping.py +257 -0
  52. basecamp_mcp_server-1.0.0/tests/test_personal_surfaces.py +122 -0
  53. basecamp_mcp_server-1.0.0/tests/test_project_people_tools.py +128 -0
  54. basecamp_mcp_server-1.0.0/tests/test_question_management_tools.py +151 -0
  55. basecamp_mcp_server-1.0.0/tests/test_recording_lifecycle.py +51 -0
  56. basecamp_mcp_server-1.0.0/tests/test_schedule_client.py +149 -0
  57. basecamp_mcp_server-1.0.0/tests/test_schedule_tools.py +97 -0
  58. basecamp_mcp_server-1.0.0/tests/test_search_api.py +117 -0
  59. basecamp_mcp_server-1.0.0/tests/test_server_path_parity.py +536 -0
  60. basecamp_mcp_server-1.0.0/tests/test_template_tools.py +97 -0
  61. basecamp_mcp_server-1.0.0/tests/test_timesheet_tools.py +153 -0
  62. basecamp_mcp_server-1.0.0/tests/test_todo_completion.py +90 -0
  63. basecamp_mcp_server-1.0.0/tests/test_todolist_aggregation.py +147 -0
  64. basecamp_mcp_server-1.0.0/tests/test_token_storage.py +46 -0
  65. basecamp_mcp_server-1.0.0/tests/test_tool_retrieval.py +251 -0
  66. basecamp_mcp_server-1.0.0/tests/test_update_todo_preserves_fields.py +123 -0
  67. basecamp_mcp_server-1.0.0/tests/test_webhook_tools.py +69 -0
  68. basecamp_mcp_server-1.0.0/token_storage.py +141 -0
@@ -0,0 +1,71 @@
1
+ # Virtual Environment
2
+ venv/
3
+ env/
4
+ ENV/
5
+
6
+ # Python
7
+ __pycache__/
8
+ *.py[cod]
9
+ *$py.class
10
+ *.so
11
+ .Python
12
+ build/
13
+ develop-eggs/
14
+ dist/
15
+ downloads/
16
+ eggs/
17
+ .eggs/
18
+ lib/
19
+ lib64/
20
+ parts/
21
+ sdist/
22
+ var/
23
+ wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+
28
+ # Logs
29
+ *.log
30
+ logs/
31
+
32
+ # Sensitive data
33
+ oauth_tokens.json
34
+ .env
35
+ .flaskenv
36
+
37
+ # macOS
38
+ .DS_Store
39
+ .AppleDouble
40
+ .LSOverride
41
+ Icon
42
+ ._*
43
+
44
+ # Testing
45
+ .pytest_cache/
46
+
47
+ # Claude Code
48
+ .claude/
49
+
50
+ # Project specific
51
+ unused/
52
+ icons/
53
+
54
+ # IDE
55
+ .idea/
56
+ .vscode/
57
+ *.swp
58
+ *.swo
59
+
60
+ # Composio integration files
61
+ composio_client_example.py
62
+ *composio*
63
+ .composio/
64
+
65
+ .env
66
+ card_table_implementation.md
67
+ card-tables-docs.md
68
+ reference/
69
+ local_queries/
70
+
71
+ AGENTS.md
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 The Basecamp MCP Server Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,546 @@
1
+ Metadata-Version: 2.5
2
+ Name: basecamp-mcp-server
3
+ Version: 1.0.0
4
+ Summary: MCP server that connects Claude, Cursor and other AI assistants to Basecamp 3 and 4
5
+ Project-URL: Homepage, https://github.com/georgeantonopoulos/Basecamp-MCP-Server
6
+ Project-URL: Issues, https://github.com/georgeantonopoulos/Basecamp-MCP-Server/issues
7
+ Author: George Antonopoulos
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: ai,basecamp,claude,cursor,mcp,model-context-protocol
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Office/Business :: Groupware
20
+ Requires-Python: >=3.10
21
+ Requires-Dist: anyio>=4.0.0
22
+ Requires-Dist: httpx>=0.25.0
23
+ Requires-Dist: mcp[cli]<2,>=1.28.1
24
+ Requires-Dist: python-dotenv>=1.0.0
25
+ Requires-Dist: requests>=2.31.0
26
+ Description-Content-Type: text/markdown
27
+
28
+ # Basecamp MCP Server
29
+
30
+ [![PyPI](https://img.shields.io/pypi/v/basecamp-mcp-server.svg)](https://pypi.org/project/basecamp-mcp-server/)
31
+ [![Tests](https://github.com/georgeantonopoulos/Basecamp-MCP-Server/actions/workflows/tests.yml/badge.svg)](https://github.com/georgeantonopoulos/Basecamp-MCP-Server/actions/workflows/tests.yml)
32
+ [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
33
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
34
+
35
+ Connect Claude, Cursor, Codex and other AI assistants to your **Basecamp 3 or 4** account. Ask in plain language to find, read, create and update projects, to-dos, messages, card tables, schedules, documents and more: 210 Basecamp operations in all.
36
+
37
+ > "What's overdue across all my projects?" · "Summarise this week's messages in the Website project." · "Move this card to Done and comment that it shipped."
38
+
39
+ ## Contents
40
+
41
+ - [Quick start](#quick-start)
42
+ - [Add it to your AI app](#add-it-to-your-ai-app)
43
+ - [What it can do](#what-it-can-do)
44
+ - [All 210 tools](#all-210-tools)
45
+ - [Settings and sign-in](#settings-and-sign-in)
46
+ - [Troubleshooting](#troubleshooting)
47
+ - [Run from a git checkout](#run-from-a-git-checkout)
48
+ - [Security](#security)
49
+
50
+ ## Quick start
51
+
52
+ You need [uv](https://docs.astral.sh/uv/getting-started/installation/) (it installs Python for you) and a Basecamp 3 or 4 account. Setup takes about five minutes.
53
+
54
+ **1. Install uv**, if you don't have it:
55
+
56
+ ```bash
57
+ # macOS and Linux
58
+ curl -LsSf https://astral.sh/uv/install.sh | sh
59
+ ```
60
+
61
+ ```powershell
62
+ # Windows
63
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
64
+ ```
65
+
66
+ **2. Sign in to Basecamp:**
67
+
68
+ ```bash
69
+ uvx basecamp-mcp-server login
70
+ ```
71
+
72
+ The first time, it walks you through registering a free Basecamp app at [launchpad.37signals.com/integrations](https://launchpad.37signals.com/integrations) (set its **Redirect URI** to `http://localhost:8000/auth/callback`), then asks for the Client ID and Client Secret it shows you. Your browser then opens for Basecamp sign-in, and the token is saved for you. Tokens refresh automatically after that.
73
+
74
+ **3. Add the server to your AI app**, using the snippet from the next section, and restart the app.
75
+
76
+ Check everything is working at any time:
77
+
78
+ ```bash
79
+ uvx basecamp-mcp-server status
80
+ ```
81
+
82
+ ## Add it to your AI app
83
+
84
+ `uvx basecamp-mcp-server config <app>` prints the exact snippet for your machine. The app can be `claude-desktop`, `cursor`, `claude-code`, `codex` or `generic`.
85
+
86
+ <details open>
87
+ <summary><b>Claude Desktop</b></summary>
88
+
89
+ Open **Settings → Developer → Edit Config** and add:
90
+
91
+ ```json
92
+ {
93
+ "mcpServers": {
94
+ "basecamp": {
95
+ "command": "uvx",
96
+ "args": ["basecamp-mcp-server"]
97
+ }
98
+ }
99
+ }
100
+ ```
101
+
102
+ Quit Claude Desktop completely and reopen it. If it says it can't find `uvx`, use the full path that `uvx basecamp-mcp-server config claude-desktop` prints.
103
+
104
+ </details>
105
+
106
+ <details>
107
+ <summary><b>Claude Code</b></summary>
108
+
109
+ ```bash
110
+ claude mcp add basecamp -- uvx basecamp-mcp-server
111
+ ```
112
+
113
+ </details>
114
+
115
+ <details>
116
+ <summary><b>Cursor</b></summary>
117
+
118
+ Add the same JSON as Claude Desktop to `~/.cursor/mcp.json` (or `.cursor/mcp.json` in a project), then restart Cursor and check **Settings → MCP**.
119
+
120
+ </details>
121
+
122
+ <details>
123
+ <summary><b>Codex</b></summary>
124
+
125
+ Add to `~/.codex/config.toml`:
126
+
127
+ ```toml
128
+ [mcp_servers.basecamp]
129
+ command = "uvx"
130
+ args = ["basecamp-mcp-server"]
131
+ ```
132
+
133
+ </details>
134
+
135
+ <details>
136
+ <summary><b>Any other MCP client</b></summary>
137
+
138
+ Run `uvx basecamp-mcp-server` as a local (stdio) MCP server. The JSON above works for most clients.
139
+
140
+ </details>
141
+
142
+ ### Four tools or all 210?
143
+
144
+ By default the server shows your AI app **four small tools** that find and run the right Basecamp operation on demand. That keeps the app's context small, and it can still reach all 210 operations. Reading and changing data are separate tools, so apps that ask before making changes still do.
145
+
146
+ To list all 210 tools up front instead, add `--full`: `"args": ["basecamp-mcp-server", "--full"]`.
147
+
148
+ ## What it can do
149
+
150
+ - **Projects and people:** list, create and update projects and templates; see who's on a project and grant or revoke access.
151
+ - **To-dos:** read, create, assign, complete, move and archive to-dos and to-do lists; see what's assigned to anyone and what's overdue.
152
+ - **Messages and comments:** read and post messages (or save drafts), pin them, manage categories, and comment on anything.
153
+ - **Chat and check-ins:** read and post in Campfire chats; create, pause and read automatic check-in questions and answers.
154
+ - **Schedules:** read, create and update events, including recurring ones.
155
+ - **Card tables:** work with columns, cards and card steps; move cards between columns.
156
+ - **Files and documents:** list, read and create documents; download uploads and inline attachments straight into the conversation.
157
+ - **Search and activity:** search the whole account; browse activity timelines and account-wide feeds of messages, files, to-dos and cards.
158
+ - **Time and progress:** timesheets, progress gauges and Hill Charts.
159
+ - **Personal and admin:** notifications, bookmarks, your private note, subscriptions, webhooks and project tools.
160
+
161
+ Big lists (projects, to-dos, comments, messages, cards, assignments) come back as compact summaries so they fit in the AI's context. Those tools take `detail: "full"` when you need every field, or set `BASECAMP_MCP_FULL_RESPONSES=1` to make that the default.
162
+
163
+ ## All 210 tools
164
+
165
+ Grouped the same way the server groups them for discovery. Click a group to expand it.
166
+
167
+ <details>
168
+ <summary><b>Projects and people</b> (18 tools)</summary>
169
+
170
+ - `create_project` — Create a Basecamp project
171
+ - `create_project_from_template` — Start constructing a project from a Basecamp template
172
+ - `create_template` — Create a Basecamp project template
173
+ - `get_assignable_people` — Get all people who can have to-dos assigned to them
174
+ - `get_people` — Get people available in the authenticated Basecamp account
175
+ - `get_person` — Get one Basecamp person's profile
176
+ - `get_pingable_people` — Get Basecamp people who can be pinged
177
+ - `get_project` — Get one project's details, including its dock IDs
178
+ - `get_project_construction` — Get the status of a project being constructed from a template
179
+ - `get_project_people` — Get active people on a Basecamp project
180
+ - `get_projects` — List Basecamp projects. Returns a compact summary by default
181
+ - `get_template` — Get a Basecamp project template
182
+ - `get_templates` — List visible Basecamp project templates
183
+ - `trash_project` — Move a Basecamp project to the trash
184
+ - `trash_template` — Move a Basecamp project template to the trash
185
+ - `update_project` — Update a project's name, description, access policy, or date range
186
+ - `update_project_people` — Grant, revoke, or invite people on a Basecamp project
187
+ - `update_template` — Update a Basecamp project template
188
+
189
+ </details>
190
+
191
+ <details>
192
+ <summary><b>Todos and assignments</b> (25 tools)</summary>
193
+
194
+ - `archive_todo` — Archive a todo item
195
+ - `complete_todo` — Mark a todo item as complete
196
+ - `create_todo` — Create a new todo item in a todo list
197
+ - `create_todolist` — Create a new todo list in a project
198
+ - `create_todolist_group` — Create a new group inside a todo list
199
+ - `delete_todo` — Move a todo item to the trash
200
+ - `deprioritize_assignment` — Remove an assignment from the authenticated user's Up Next list
201
+ - `get_completed_assignments` — Get the authenticated user's completed assignments
202
+ - `get_due_assignments` — Get the authenticated user's assignments by due-date scope
203
+ - `get_my_assignments` — Get the authenticated user's active assignments grouped by priority
204
+ - `get_overdue_todos` — Get overdue to-dos for the WHOLE ACCOUNT, grouped by how late they are
205
+ - `get_person_assignments` — Get all active, pending to-dos assigned to a specific person
206
+ - `get_todo` — Get a single todo item by its ID
207
+ - `get_todolist` — Get a specific todo list by ID
208
+ - `get_todolist_groups` — Get all groups in a todo list
209
+ - `get_todolists` — Get todo lists for a project
210
+ - `get_todos` — Get todos from a todo list
211
+ - `prioritize_assignment` — Add an assignment to the authenticated user's Up Next list
212
+ - `reorder_priority` — Move an assignment to a position in the authenticated user's Up Next list
213
+ - `reposition_todo` — Reposition a todo within its list, or move it to another list or group
214
+ - `reposition_todolist_group` — Reposition a todo list group to a new location within its list
215
+ - `trash_todolist` — Move a todo list to the trash
216
+ - `uncomplete_todo` — Mark a todo item as incomplete
217
+ - `update_todo` — Update an existing todo item
218
+ - `update_todolist` — Update an existing todo list
219
+
220
+ </details>
221
+
222
+ <details>
223
+ <summary><b>Messages and comments</b> (24 tools)</summary>
224
+
225
+ - `create_comment` — Create a comment on a Basecamp item
226
+ - `create_draft_message` — Create a draft message on a project's message board without publishing it
227
+ - `create_message` — Create a new message on a project's message board
228
+ - `create_message_category` — Create a message type/category
229
+ - `delete_comment` — Delete a comment by moving it to the project's trash (Basecamp has no hard delete)
230
+ - `delete_message_category` — Delete a message type/category
231
+ - `get_comment` — Get a specific comment by ID
232
+ - `get_comments` — Get comments for a Basecamp item
233
+ - `get_forward` — Get a specific forwarded email by ID
234
+ - `get_forwards` — Get all forwarded emails from a project's inbox
235
+ - `get_inbox` — Get the inbox for a project (for email forwards)
236
+ - `get_inbox_replies` — Get all replies to a forwarded email
237
+ - `get_inbox_reply` — Get a specific reply to a forwarded email
238
+ - `get_message` — Get a specific message by ID
239
+ - `get_message_board` — Get the message board for a project
240
+ - `get_message_categories` — Get message categories (types) for a project
241
+ - `get_message_category` — Get one message type/category
242
+ - `get_messages` — Get all messages from a project's message board
243
+ - `pin_message` — Pin a message to the top of its message board
244
+ - `trash_forward` — Move a forwarded email to trash
245
+ - `unpin_message` — Remove a message from the top of its message board
246
+ - `update_comment` — Update a comment's content
247
+ - `update_message` — Update one or more fields on a message
248
+ - `update_message_category` — Update a message type/category
249
+
250
+ </details>
251
+
252
+ <details>
253
+ <summary><b>Campfires and check-ins</b> (17 tools)</summary>
254
+
255
+ - `create_campfire_line` — Create a plain-text line in a Basecamp campfire
256
+ - `create_question` — Create a question in a Basecamp automatic check-ins questionnaire
257
+ - `delete_campfire_line` — Permanently delete a line from a Basecamp campfire
258
+ - `get_campfire_line` — Get one line from a Basecamp campfire
259
+ - `get_campfire_lines` — Get recent messages from a Basecamp campfire (chat room)
260
+ - `get_campfires` — List campfire/chat rooms enabled in a project
261
+ - `get_daily_check_ins` — Get project's daily checking questionnaire
262
+ - `get_question` — Get one automatic check-in question
263
+ - `get_question_answer` — Get one automatic check-in answer
264
+ - `get_question_answerers` — List people who have answered a Basecamp automatic check-in question
265
+ - `get_question_answers` — Get answers on daily check-in question
266
+ - `get_question_reminders` — Get pending automatic check-in reminders for the authenticated user
267
+ - `get_questionnaire` — Get the automatic check-ins questionnaire for a project
268
+ - `get_questions` — Get questions from an automatic check-ins questionnaire
269
+ - `pause_question` — Pause a Basecamp automatic check-in question
270
+ - `resume_question` — Resume a paused Basecamp automatic check-in question
271
+ - `update_question` — Update selected fields on a Basecamp automatic check-in question
272
+
273
+ </details>
274
+
275
+ <details>
276
+ <summary><b>Schedules and calendars</b> (13 tools)</summary>
277
+
278
+ - `create_lineup_marker` — Create an account-wide Basecamp Lineup marker
279
+ - `create_schedule_entry` — Create a schedule entry in a Basecamp project's schedule
280
+ - `delete_lineup_marker` — Delete an account-wide Basecamp Lineup marker
281
+ - `get_calendar` — Get a Basecamp calendar by ID
282
+ - `get_lineup_markers` — List account-wide Basecamp Lineup markers
283
+ - `get_schedule` — Get the schedule for a Basecamp project
284
+ - `get_schedule_entries` — Get schedule entries for a Basecamp project
285
+ - `get_schedule_entry` — Get one schedule entry from a Basecamp project
286
+ - `get_schedule_entry_occurrence` — Get one occurrence of a recurring schedule entry
287
+ - `get_upcoming_schedule` — Get upcoming events and due work across all accessible projects
288
+ - `update_calendar` — Update a Basecamp calendar's display color
289
+ - `update_lineup_marker` — Update an account-wide Basecamp Lineup marker
290
+ - `update_schedule_entry` — Update one or more fields on a Basecamp schedule entry
291
+
292
+ </details>
293
+
294
+ <details>
295
+ <summary><b>Card tables</b> (29 tools)</summary>
296
+
297
+ - `complete_card` — Mark a card as complete
298
+ - `complete_card_step` — Mark a card step as complete
299
+ - `create_card` — Create a new card in a column
300
+ - `create_card_step` — Create a new step (sub-task) for a card
301
+ - `create_card_table_wormhole` — Create a cross-project card-table wormhole
302
+ - `create_column` — Create a new column in a card table
303
+ - `delete_card_step` — Delete a card step
304
+ - `delete_card_table_wormhole` — Delete a card-table wormhole
305
+ - `get_card` — Get details for a specific card
306
+ - `get_card_step` — Get details for a specific card step
307
+ - `get_card_steps` — Get all steps (sub-tasks) for a card
308
+ - `get_card_table` — Get the card table details for a project, including its columns
309
+ - `get_card_tables` — Get all card tables for a project
310
+ - `get_cards` — Get all cards in a column
311
+ - `get_column` — Get details for a specific column
312
+ - `get_columns` — Get all columns in a card table
313
+ - `move_card` — Move a card to a column or linked cross-project wormhole
314
+ - `move_column` — Move a column to a new position
315
+ - `put_column_on_hold` — Put a column on hold (freeze work)
316
+ - `remove_column_hold` — Remove hold from a column (unfreeze work)
317
+ - `uncomplete_card` — Mark a card as incomplete
318
+ - `uncomplete_card_step` — Mark a card step as incomplete
319
+ - `unwatch_column` — Unsubscribe from notifications for a column
320
+ - `update_card` — Update a card
321
+ - `update_card_step` — Update a card step
322
+ - `update_card_table_wormhole` — Change a card-table wormhole's destination column
323
+ - `update_column` — Update a column title
324
+ - `update_column_color` — Update a column color
325
+ - `watch_column` — Subscribe to notifications for changes in a column
326
+
327
+ </details>
328
+
329
+ <details>
330
+ <summary><b>Files and documents</b> (20 tools)</summary>
331
+
332
+ - `archive_recording` — Archive any Basecamp recording
333
+ - `create_attachment` — Upload a file as an attachment
334
+ - `create_document` — Create a document in a vault
335
+ - `create_draft_document` — Create a draft document in a vault without publishing it
336
+ - `create_upload_version` — Replace an upload's file while preserving its recording URL
337
+ - `download_attachment` — Download an inline comment/message attachment as MCP content
338
+ - `download_upload` — Download the binary content of an upload (PDF, image, document, ...)
339
+ - `get_document` — Get a single document
340
+ - `get_documents` — List documents in a vault
341
+ - `get_recordings` — List every recording of one supported type in a project or account
342
+ - `get_upload` — Get details for a specific upload
343
+ - `get_upload_versions` — Get raw version events for an upload, optionally filtered by action
344
+ - `get_uploads` — List uploads in a project or vault
345
+ - `get_vaults` — List child vaults in a vault
346
+ - `restore_recording` — Restore an archived Basecamp recording to active status
347
+ - `trash_document` — Move a document to trash
348
+ - `trash_recording` — Move any Basecamp recording to the trash
349
+ - `update_document` — Update a document
350
+ - `update_recording_visibility` — Toggle client visibility for a Basecamp recording
351
+ - `update_upload` — Update an upload's metadata without replacing its file
352
+
353
+ </details>
354
+
355
+ <details>
356
+ <summary><b>Search, activity, and reports</b> (15 tools)</summary>
357
+
358
+ - `get_events` — Get events for a recording
359
+ - `get_everything_cards` — Get filtered cards grouped by project across the whole account
360
+ - `get_everything_checkins` — Get automatic check-in answers across every accessible project
361
+ - `get_everything_comments` — Get recent comments across every accessible Basecamp project
362
+ - `get_everything_files` — Get files across every accessible project, optionally filtered by kind or creator
363
+ - `get_everything_forwards` — Get inbox forwards across every accessible Basecamp project
364
+ - `get_everything_messages` — Get recent messages across every accessible Basecamp project
365
+ - `get_everything_todos` — Get filtered to-dos grouped by project across the whole account
366
+ - `get_person_timeline` — Get timeline activity created by one Basecamp person
367
+ - `get_project_timeline` — Get recent activity within one Basecamp project
368
+ - `get_search_metadata` — Get the valid filters and content types for native Basecamp search
369
+ - `get_timeline` — Get recent activity across every accessible Basecamp project
370
+ - `global_search` — Search projects, todos and campfire messages across all projects
371
+ - `search_basecamp` — Search across Basecamp projects, todos, and messages
372
+ - `search_recordings` — Search Basecamp content, returning one page or at most ``limit`` results
373
+
374
+ </details>
375
+
376
+ <details>
377
+ <summary><b>Timesheets and progress</b> (17 tools)</summary>
378
+
379
+ - `create_gauge_needle` — Record a new progress update for a Basecamp project gauge
380
+ - `create_timesheet_entry` — Log time against a Basecamp timesheetable recording
381
+ - `delete_gauge_needle` — Permanently delete a Basecamp gauge needle
382
+ - `delete_timesheet_entry` — Permanently delete a Basecamp timesheet entry
383
+ - `get_gauge_needle` — Get one Basecamp gauge needle
384
+ - `get_gauge_needles` — Get a project's gauge history, newest first
385
+ - `get_gauges` — List project gauges across the authenticated Basecamp account
386
+ - `get_hill_chart` — Get the Basecamp Hill Chart for a to-do set
387
+ - `get_project_hill_chart` — Resolve and get a project's Basecamp Hill Chart
388
+ - `get_project_timesheet` — Get paginated timesheet entries for a Basecamp project
389
+ - `get_recording_timesheet` — Get paginated timesheet entries for a Basecamp recording
390
+ - `get_timesheet_entry` — Get one Basecamp timesheet entry
391
+ - `get_timesheet_report` — Get the account-wide, non-paginated Basecamp timesheet report
392
+ - `toggle_gauge` — Enable or disable a Basecamp project's gauge
393
+ - `update_gauge_needle` — Update the description of a Basecamp gauge needle
394
+ - `update_hill_chart_settings` — Track or untrack to-do lists on a Basecamp Hill Chart
395
+ - `update_timesheet_entry` — Update selected fields on a Basecamp timesheet entry
396
+
397
+ </details>
398
+
399
+ <details>
400
+ <summary><b>Notifications and personal tools</b> (16 tools)</summary>
401
+
402
+ - `create_bookmark` — Bookmark a Basecamp recording for the authenticated user
403
+ - `delete_bookmark` — Remove a recording from the authenticated user's bookmarks
404
+ - `get_bookmark_status` — Get the authenticated user's bookmark status for a recording
405
+ - `get_bubble_ups` — Get the authenticated user's current and scheduled bubble-ups
406
+ - `get_my_bookmarks` — Get recordings bookmarked by the authenticated user
407
+ - `get_my_drafts` — Get unpublished drafts owned by the authenticated user
408
+ - `get_my_note` — Get the authenticated user's personal Basecamp note
409
+ - `get_my_profile` — Get the authenticated person's Basecamp profile
410
+ - `get_notifications` — Get the authenticated user's grouped Basecamp notification inbox
411
+ - `get_subscription` — Get subscription state and subscribers for a Basecamp recording
412
+ - `mark_notifications_read` — Mark notification readable SGIDs as read
413
+ - `subscribe_to_recording` — Subscribe the authenticated user to a Basecamp recording
414
+ - `unsubscribe_from_recording` — Unsubscribe the authenticated user from a Basecamp recording
415
+ - `update_my_note` — Replace the authenticated user's personal Basecamp note
416
+ - `update_question_notification_settings` — Update the authenticated user's automatic check-in notification settings
417
+ - `update_subscription` — Add or remove people from a recording's subscriber list
418
+
419
+ </details>
420
+
421
+ <details>
422
+ <summary><b>Administration and integrations</b> (16 tools)</summary>
423
+
424
+ - `create_dock_tool` — Add a tool to a Basecamp project's dock
425
+ - `create_webhook` — Create a webhook
426
+ - `delete_webhook` — Delete a webhook
427
+ - `disable_dock_tool` — Hide a recording from a Basecamp project's dock without deleting it
428
+ - `enable_dock_tool` — Enable a recording in a Basecamp project's dock
429
+ - `get_account` — Get the Basecamp account associated with the current access token
430
+ - `get_dock_tool` — Get one Basecamp project dock tool
431
+ - `get_webhook` — Get one project webhook and its recent deliveries
432
+ - `get_webhooks` — List webhooks for a project
433
+ - `remove_account_logo` — Remove the account logo (administrator/owner only)
434
+ - `reposition_dock_tool` — Move a Basecamp project dock tool to a one-based position
435
+ - `trash_dock_tool` — Permanently delete a Basecamp dock tool and its content
436
+ - `update_account_logo` — Upload or replace the account logo (administrator/owner only)
437
+ - `update_account_name` — Rename the current Basecamp account (owner only)
438
+ - `update_dock_tool` — Rename a Basecamp project dock tool
439
+ - `update_webhook` — Update a project webhook destination, event types, or active state
440
+
441
+ </details>
442
+
443
+
444
+ > **Reading files in chat.** `download_upload` and `download_attachment` return files as MCP content. Claude Code passes PDFs, images and other files to the model. Claude Desktop and claude.ai currently pass images only; other file types are rejected by the app, not by this server.
445
+
446
+ ## Settings and sign-in
447
+
448
+ The installed server keeps its settings in one folder:
449
+
450
+ | System | Folder |
451
+ | --- | --- |
452
+ | macOS and Linux | `~/.config/basecamp-mcp-server/` (or `$XDG_CONFIG_HOME/basecamp-mcp-server/`) |
453
+ | Windows | `%APPDATA%\basecamp-mcp-server\` |
454
+
455
+ It holds `.env` (your Basecamp app's Client ID and Secret), `oauth_tokens.json` (your sign-in) and log files. The `.env` and token files are readable only by you. To use a different folder, set `BASECAMP_MCP_HOME`.
456
+
457
+ **Several Basecamp accounts?** `login` asks which one to use, or you can pass `--account-id 1234567`. The ID is the number in your Basecamp URL: `https://3.basecamp.com/1234567/projects`.
458
+
459
+ **Signing in on a machine without a browser?** Run `uvx basecamp-mcp-server login --no-browser`, open the printed link on any browser that can reach `localhost` on that machine, and approve.
460
+
461
+ **Other settings** go in the environment or as lines in the settings `.env` file. `BASECAMP_MCP_HOME` is the exception: it says where that file is, so set it in the environment, or in your AI app's `env` block (`config` adds it for you).
462
+
463
+ | Variable | What it does |
464
+ | --- | --- |
465
+ | `BASECAMP_MCP_HOME` | Settings folder (see above). Environment only. |
466
+ | `BASECAMP_MCP_TOKEN_FILE` | Token file location, for example on a mounted volume. |
467
+ | `BASECAMP_REDIRECT_URI` | Must match your Basecamp app. Default `http://localhost:8000/auth/callback`. |
468
+ | `BASECAMP_ACCOUNT_ID` | Fallback account if the token doesn't record one. |
469
+ | `USER_AGENT` | Name sent to Basecamp's API. Basecamp asks for contact details; the default points to this project. |
470
+ | `BASECAMP_MCP_FULL_RESPONSES` | `1` returns full records instead of compact summaries. |
471
+
472
+ ## Troubleshooting
473
+
474
+ | Problem | Fix |
475
+ | --- | --- |
476
+ | The Basecamp tools don't appear in your app | Quit the app completely and reopen it. Check the JSON is valid. |
477
+ | "spawn uvx ENOENT" or "command not found: uvx" | Desktop apps may not see your shell's PATH. Use the full path from `uvx basecamp-mcp-server config claude-desktop`. |
478
+ | "Authentication required" or "token expired" | Run `uvx basecamp-mcp-server login` again. |
479
+ | Login says the address is already in use | Something else is using port 8000 (often an old `oauth_app.py`). Stop it and retry. |
480
+ | Login says there's no Basecamp 3 or 4 account | You signed in as a user who isn't in a Basecamp 3/4 account. Sign in with a different user. |
481
+ | Basecamp shows "redirect_uri mismatch" | Your Basecamp app's Redirect URI must be exactly `http://localhost:8000/auth/callback` (or whatever `BASECAMP_REDIRECT_URI` is set to). |
482
+ | 403 errors on some tools | Some Basecamp features (Lineup, account settings, timesheets) need an account admin or owner, or need the feature turned on. |
483
+
484
+ Still stuck? `uvx basecamp-mcp-server status` shows where settings live and checks your sign-in. Logs are in the settings folder. Claude Desktop's own logs are in `~/Library/Logs/Claude/` (macOS) or `%APPDATA%\Claude\logs\` (Windows). Please [open an issue](https://github.com/georgeantonopoulos/Basecamp-MCP-Server/issues) with what you ran and the error.
485
+
486
+ ## Run from a git checkout
487
+
488
+ Use this for development, or if you'd rather not install from PyPI. A checkout keeps its settings in the repository folder, as before.
489
+
490
+ ```bash
491
+ git clone https://github.com/georgeantonopoulos/Basecamp-MCP-Server.git
492
+ cd Basecamp-MCP-Server
493
+ uv venv --python 3.12 venv
494
+ source venv/bin/activate # Windows: venv\Scripts\activate
495
+ uv pip install -r requirements.txt
496
+ cp .env.example .env # then fill in your Basecamp app details
497
+ python oauth_app.py # sign in at http://localhost:8000
498
+ ```
499
+
500
+ Then point your app at the checkout. These scripts write the config for you:
501
+
502
+ ```bash
503
+ python generate_claude_desktop_config.py # or generate_cursor_config.py, generate_codex_config.py
504
+ ```
505
+
506
+ Each accepts `--full` for all 210 tools, or `--legacy` for the older JSON-RPC server.
507
+
508
+ Run the tests with `python -m pytest tests/`.
509
+
510
+ <details>
511
+ <summary><b>How the code is organised</b></summary>
512
+
513
+ | File | Role |
514
+ | --- | --- |
515
+ | [`basecamp_mcp_server/cli.py`](basecamp_mcp_server/cli.py) | The installed command: `login`, `status`, `config` and running the server. |
516
+ | [`basecamp_retrieval_mcp.py`](basecamp_retrieval_mcp.py) | Default server: four tools that discover and run the others. |
517
+ | [`basecamp_tool_retrieval.py`](basecamp_tool_retrieval.py) | Categories, read/write split, and ranking for discovery. |
518
+ | [`basecamp_fastmcp.py`](basecamp_fastmcp.py) | All 210 tool definitions; also the `--full` server. |
519
+ | [`basecamp_client.py`](basecamp_client.py) | Basecamp API client. |
520
+ | [`payload_shaping.py`](payload_shaping.py) | Compact summaries for large responses. |
521
+ | [`basecamp_oauth.py`](basecamp_oauth.py), [`auth_manager.py`](auth_manager.py), [`token_storage.py`](token_storage.py) | Sign-in, automatic token refresh, and token storage. |
522
+ | [`oauth_app.py`](oauth_app.py) | Browser sign-in page for git checkouts. |
523
+ | [`mcp_server_cli.py`](mcp_server_cli.py) | Older JSON-RPC server, kept for compatibility. |
524
+
525
+ </details>
526
+
527
+ ## Security
528
+
529
+ - Your Basecamp app's secret and your token stay on your machine, in files only you can read. Never commit `.env` or `oauth_tokens.json`.
530
+ - Sign-in uses a one-time random check value, and the local sign-in page only accepts the response it's waiting for.
531
+ - Write tools are marked as such, so MCP apps that ask before making changes will ask.
532
+ - This server is built to run locally for one person. Read [the design notes](https://github.com/georgeantonopoulos/Basecamp-MCP-Server/blob/codex/central-hosting-design/CENTRAL_HOSTING_DESIGN.md) before hosting it for a team.
533
+
534
+ ## License
535
+
536
+ MIT. See [`LICENSE`](LICENSE).
537
+
538
+ ## Star History
539
+
540
+ <a href="https://www.star-history.com/#georgeantonopoulos/Basecamp-MCP-Server&Date">
541
+ <picture>
542
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=georgeantonopoulos/Basecamp-MCP-Server&type=Date&theme=dark" />
543
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=georgeantonopoulos/Basecamp-MCP-Server&type=Date" />
544
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=georgeantonopoulos/Basecamp-MCP-Server&type=Date" />
545
+ </picture>
546
+ </a>