Skip to main content
Glama
Basecamp Classic MCP Server

Basecamp Classic MCP Server

by Boian

Basecamp Classic MCP Server

An MCP server for the Basecamp Classic API, built with FastMCP.

Setup

uv sync

Related MCP server: Basecamp MCP Server

Configuration

Set these environment variables before running:

Variable

Description

BASECAMP_URL

Your Basecamp account URL, e.g. https://yourcompany.basecamphq.com

BASECAMP_USERNAME

Your Basecamp username or API token

BASECAMP_PASSWORD

Your Basecamp password (or X if using an API token)

To use an API token instead of password: set BASECAMP_USERNAME to your token and BASECAMP_PASSWORD to X.

Running

# stdio (for Claude Desktop / MCP clients)
uv run python server.py

# or via entry point
uv run basecamp-classic-mcp

Development

Use the MCP Inspector to interactively test tools in a browser UI:

uv run --env-file .env fastmcp dev inspector server.py:mcp

Claude Desktop configuration

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "basecamp-classic": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/basecamp-classic-mcp", "python", "server.py"],
      "env": {
        "BASECAMP_URL": "https://yourcompany.basecamphq.com",
        "BASECAMP_USERNAME": "your-api-token",
        "BASECAMP_PASSWORD": "X"
      }
    }
  }
}

Available Tools

Projects

  • list_projects — List all active projects

  • get_project(project_id) — Get project details

To-do Lists

  • list_todo_lists(project_id) — List to-do lists in a project

  • get_todo_list(todo_list_id) — Get a to-do list with its items

To-do Items

  • list_todo_items(todo_list_id) — List items in a to-do list

  • create_todo_item(todo_list_id, content, ...) — Create a new to-do item

  • update_todo_item(todo_item_id, ...) — Update an existing to-do item

  • complete_todo_item(todo_item_id) — Mark an item complete

  • uncomplete_todo_item(todo_item_id) — Mark an item incomplete

  • delete_todo_item(todo_item_id) — Delete a to-do item

Messages

  • list_messages(project_id) — List recent messages in a project

  • get_message(message_id) — Get a message with its body

  • create_message(project_id, title, body, ...) — Post a new message

Comments

  • list_comments(message_id) — List comments on a message

  • create_comment(message_id, body) — Add a comment to a message

People

  • list_people — List all people in the account

  • get_person(person_id) — Get a person's details

  • get_current_person — Get the authenticated user's details

Milestones

  • list_milestones(project_id) — List milestones in a project

  • complete_milestone(milestone_id) — Mark a milestone complete

  • uncomplete_milestone(milestone_id) — Mark a milestone incomplete

Time Entries

  • list_time_entries(project_id) — List time entries for a project

  • create_time_entry(project_id, date, hours, description, ...) — Log time on a project

Available Tools

23 tools
complete_milestoneB

Mark a milestone as complete.

Args: milestone_id: The numeric milestone ID.

Inputs: milestone_id (required). Returns: result

complete_todo_itemB

Mark a to-do item as complete.

Args: todo_item_id: The numeric to-do item ID.

Inputs: todo_item_id (required). Returns: result

create_commentA

Add a comment to a message/post.

Args: message_id: The numeric message ID. body: The comment body (HTML allowed).

Inputs: body (required), message_id (required). Returns: object

create_messageA

Create a new message/post in a project.

Args: project_id: The numeric project ID. title: The message title. body: The message body (HTML allowed). category_id: Optional category ID for the message. private: Whether the message is private.

Inputs: body (required), title (required), project_id (required), private, +1 more. Returns: object

create_time_entryA

Log a time entry on a project.

Args: project_id: The numeric project ID. date: Date of the time entry in YYYY-MM-DD format. hours: Number of hours to log (e.g. 1.5). description: Description of work done. person_id: Optional person ID (defaults to current user). todo_item_id: Optional to-do item ID to associate the entry with.

Inputs: date (required), hours (required), project_id (required), description (required), +2 more. Returns: object

create_todo_itemA

Create a new to-do item in a to-do list.

Args: todo_list_id: The numeric to-do list ID. content: The text of the to-do item. responsible_party_id: Optional person ID to assign the item to. due_at: Optional due date in YYYY-MM-DD format. notify: Whether to notify the assigned person.

Inputs: content (required), todo_list_id (required), due_at, notify, +1 more. Returns: object

delete_todo_itemA
Destructive

Delete a to-do item.

Args: todo_item_id: The numeric to-do item ID.

Inputs: todo_item_id (required). Returns: result

get_current_personA
Read-only

Get the currently authenticated person's details.

Inputs: no named parameters. Returns: object

get_messageA
Read-only

Get a specific message/post with its body.

Args: message_id: The numeric message ID.

Inputs: message_id (required). Returns: object

get_personA
Read-only

Get details for a specific person.

Args: person_id: The numeric person ID.

Inputs: person_id (required). Returns: object

get_projectA
Read-only

Get details for a specific Basecamp Classic project.

Args: project_id: The numeric project ID.

Inputs: project_id (required). Returns: object

get_todo_listA
Read-only

Get a specific to-do list with its items.

Args: todo_list_id: The numeric to-do list ID.

Inputs: todo_list_id (required). Returns: object

list_commentsA
Read-only

List comments on a message/post.

Args: message_id: The numeric message ID.

Inputs: message_id (required). Returns: result

list_messagesA
Read-only

List recent messages/posts for a project.

Args: project_id: The numeric project ID.

Inputs: project_id (required). Returns: result

list_milestonesA
Read-only

List all milestones for a project.

Args: project_id: The numeric project ID.

Inputs: project_id (required). Returns: result

list_peopleA
Read-only

List all people in the Basecamp Classic account.

Inputs: no named parameters. Returns: result

list_projectsA
Read-only

List all active Basecamp Classic projects.

Inputs: no named parameters. Returns: result

list_time_entriesA
Read-only

List all time entries for a project.

Args: project_id: The numeric project ID.

Inputs: project_id (required). Returns: result

list_todo_itemsA
Read-only

List all to-do items in a to-do list.

Args: todo_list_id: The numeric to-do list ID.

Inputs: todo_list_id (required). Returns: result

list_todo_listsB
Read-only

List all to-do lists for a project.

Args: project_id: The numeric project ID.

Inputs: project_id (required). Returns: result

uncomplete_milestoneB

Mark a milestone as incomplete.

Args: milestone_id: The numeric milestone ID.

Inputs: milestone_id (required). Returns: result

uncomplete_todo_itemB

Mark a to-do item as incomplete.

Args: todo_item_id: The numeric to-do item ID.

Inputs: todo_item_id (required). Returns: result

update_todo_itemA

Update an existing to-do item.

Args: todo_item_id: The numeric to-do item ID. content: New text for the item. responsible_party_id: Person ID to assign the item to (use 0 to unassign). due_at: Due date in YYYY-MM-DD format. notify: Whether to notify the assigned person.

Inputs: todo_item_id (required), due_at, notify, content, +1 more. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 23 tools

    Disambiguation5/5

    Each tool targets a distinct resource and action (e.g., projects, todo lists/items, messages, comments, people, milestones, time entries). No two tools appear to perform the same function; even paired operations like complete_todo_item vs complete_milestone are clearly differentiated by resource type.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern using snake_case (e.g., list_projects, create_todo_item, complete_milestone). The verbs (list, get, create, update, delete, complete, uncomplete) are used uniformly across resource types, making the set predictable and readable.

    Tool Count4/5

    With 23 tools, the server is on the heavier side but still well-scoped for Basecamp Classic's broad feature set. Each area (projects, todos, messages, comments, people, milestones, time entries) has enough tools to be useful, though a few like get_current_person could be seen as extras.

    Completeness3/5

    The server covers full lifecycle for todo items and provides create/read for messages and time entries, but lacks create/update/delete for projects, messages, comments, and milestones. This leaves notable gaps in CRUD coverage, though the read-focused scope may be intentional.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Connects AI assistants to the Basecamp 2 API, enabling management of projects, todos, messages, and people directly through natural language.
      17
      10 npm
      MIT
    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables MCP-capable clients to browse, search, and manage Basecamp 3 projects, todolists, todos, messages, campfires, card tables, inbox forwards, documents, uploads, comments, events, and webhooks through OAuth-authenticated API calls, including downloading attachments as readable content.
      -
    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables MCP-capable clients such as Codex, Cursor, and Claude Desktop to read and manage Basecamp 3 projects through OAuth-authenticated API calls. Covers projects, todolists and todos, message boards, campfires, card tables, inbox forwards, documents, uploads, comments, events, webhooks, and search.
      -