Skip to main content

Band MCP Server

Python Version License MCP Protocol

A Model Context Protocol (MCP) server that provides seamless integration with the Band AI platform. Enable AI agents to interact with Band's agent management, chat rooms, and messaging systems.

✨ Features

  • Dual-scope tool surface: serve agent tools (--scope agent), human tools (--scope human), or both
  • Opt-in contact directory (--tools contacts) and memory (--tools memory) tool groups
  • Room pinning with --room-id — hides the room field from the advertised schema and injects it at call time
  • STDIO transport for IDE integration; SSE transport for Docker and remote deployments
  • Tool definitions sourced from band-sdk so the MCP stays in lockstep with the platform SDK

Migrating from pre-v1.2.0

Every tool name changed. Tools are now prefixed with band_, and the agent surface was reshaped when the handwritten handlers were deleted in favor of the SDK-driven registrar. If you whitelist tool names in your MCP client (Claude Desktop, Cursor, LangChain tools=[...]), expect breakage until you update them.

Notable behavior changes:

  • Contact tools are no longer registered by default. Pass --tools contacts to restore them.

  • get_agent_me, list_agent_chats, and message-lifecycle tools (mark_agent_message_*) have been removed. AgentTools is room-scoped via the SDK; agent identity travels with the credential.

  • A handful of agent tools were renamed beyond the prefix (create_agent_chatband_create_chatroom, list_agent_peersband_lookup_peers, etc.).

  • All THENVOI_* environment variables have been dropped with no fallback — set the BAND_* equivalent before upgrading, or the server starts with empty credentials (ConfigError at best, 401s at worst):

    Old (THENVOI_*) New (BAND_*)
    THENVOI_API_KEY (removed — set BAND_USER_KEY and/or BAND_AGENT_KEY)
    THENVOI_BASE_URL BAND_BASE_URL
    THENVOI_USER_KEY BAND_USER_KEY
    THENVOI_AGENT_KEY BAND_AGENT_KEY
    THENVOI_MCP_SCOPE BAND_MCP_SCOPE
    THENVOI_MCP_TOOLS BAND_MCP_TOOLS
    THENVOI_MCP_ROOM_ID BAND_MCP_ROOM_ID

    The single-key BAND_API_KEY path (a later, separate fallback added after the THENVOI_* rename) has also been removed — there is no unscoped credential any more. Set BAND_USER_KEY (human scope) and/or BAND_AGENT_KEY (agent scope) explicitly.

🚀 Quick Start

Prerequisites

Install from PyPI

pip install band-mcp
# or, if you use uv
uv tool install band-mcp

This installs the band-mcp CLI on your PATH. No repo clone, no uv directory flags, no absolute paths required.

Getting Your API Key

  1. Log in to Band
  2. Navigate to Settings → API Keys
  3. Click Create New API Key
  4. Copy the key immediately (won't be shown again)

📦 Install in Your IDE

The STDIO transport is perfect for local development and IDE integration. The server starts automatically when your AI assistant needs it.

IDE Integration

Configure your AI assistant to use the Band MCP Server with the following JSON structure:

{
  "mcpServers": {
    "band": {
      "command": "band-mcp",
      "args": [
        "--scope",
        "agent,human",
        "--tools",
        "contacts"
      ],
      "env": {
        "BAND_AGENT_KEY": "band_a_your_agent_key",
        "BAND_USER_KEY": "band_u_your_user_key",
        "BAND_BASE_URL": "https://app.band.ai"
      }
    }
  }
}

Note: This assumes band-mcp is installed via pip or uv tool install so the band-mcp command is on your PATH. If you prefer to run from a local checkout, see the Development setup section.

See the Configuration section below for the breaking-change note about --tools contacts.

Cursor Setup
  1. Open Cursor settings:
    • Mac: Cmd+Shift+J
    • Windows: Ctrl+Shift+J
  2. Navigate to Tools & MCP
  3. Click New MCP Server
  4. Paste the configuration JSON above
  5. Update the path and API credentials
  6. Save and restart Cursor

The Band tools will appear automatically in the chat interface.

Claude Desktop Setup
  1. Locate your Claude Desktop configuration file:

    • Mac: ~/Library/Application\ Support/Claude/claude_desktop_config.json
    • Windows: %APPDATA%\Claude\claude_desktop_config.json
    • Linux: ~/.config/Claude/claude_desktop_config.json
  2. Open the file in a text editor

  3. Add the configuration JSON (merge with existing content if present)

  4. Update the path and API credentials

  5. Save the file

  6. Restart Claude Desktop

The Band tools will appear in the tools panel.

Claude Code (VS Code) Setup
  1. Open VS Code settings:

    • Mac: Cmd+,
    • Windows: Ctrl+,
  2. Search for "Claude MCP"

  3. Click "Edit in settings.json"

  4. Add the configuration using the claude.mcpServers key:

{
  "claude.mcpServers": {
    "band": {
      "command": "band-mcp",
      "env": {
        "BAND_AGENT_KEY": "band_a_your_agent_key",
        "BAND_BASE_URL": "https://app.band.ai"
      }
    }
  }
}
  1. Update the API credentials

  2. Save the settings file

  3. Reload VS Code window:

    • Mac: Cmd+Shift+P → "Reload Window"
    • Windows: Ctrl+Shift+P → "Reload Window"

The Band tools will be available in Claude Code.

Manual Testing (STDIO)

For testing or standalone usage without an IDE:

# After installing band-mcp from PyPI
BAND_AGENT_KEY=your-agent-key band-mcp

# Or, from a local checkout
uv run band-mcp

Expected output:

2025-11-19 17:09:51,621 - band-mcp - INFO - Starting band-mcp-server v1.3.2
2025-11-19 17:09:51,621 - band-mcp - INFO - Base URL: https://app.band.ai
2025-11-19 17:09:51,621 - band-mcp - INFO - Server ready - listening for MCP protocol messages on STDIO

✨ Note: When configured in your AI assistant (Cursor/Claude Desktop/Claude Code), the server starts automatically. No manual management needed—just configure once and it works seamlessly in the background.

SSE Transport Mode (Remote/Docker Deployments)

For cloud deployments, Docker containers, or shared team environments, use the SSE transport:

# Start SSE server on default port 8000
band-mcp --transport sse

# Custom host and port
band-mcp --transport sse --host 0.0.0.0 --port 3000

Expected output:

2025-12-18 17:15:55 - band-mcp - INFO - Starting band-mcp-server v1.3.2
2025-12-18 17:15:55 - band-mcp - INFO - Base URL: https://app.band.ai
2025-12-18 17:15:55 - band-mcp - INFO - Transport: SSE (HTTP server mode)
2025-12-18 17:15:55 - band-mcp - INFO - Server ready - listening on http://127.0.0.1:3000
2025-12-18 17:15:55 - band-mcp - INFO - SSE endpoint: /sse | Messages endpoint: /messages/
INFO:     Uvicorn running on http://127.0.0.1:3000 (Press CTRL+C to quit)

Testing SSE Mode with curl

SSE requires maintaining a persistent connection. Use three terminals:

Terminal 1 - Start the server:

band-mcp --transport sse --port 3000

Terminal 2 - Connect to SSE stream (keep running):

curl -N http://127.0.0.1:3000/sse

You'll receive a session ID:

event: endpoint
data: /messages/?session_id=abc123def456...

Terminal 3 - Send requests (use the session ID from Terminal 2):

# 1. Initialize the connection (required first)
curl -X POST "http://127.0.0.1:3000/messages/?session_id=YOUR_SESSION_ID" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'

# 2. List available tools
curl -X POST "http://127.0.0.1:3000/messages/?session_id=YOUR_SESSION_ID" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'

# 3. Call a tool (e.g., health_check)
curl -X POST "http://127.0.0.1:3000/messages/?session_id=YOUR_SESSION_ID" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"health_check","arguments":{}}}'

Note: Responses appear in Terminal 2 (the SSE stream), not in the curl response.

Environment Variables for SSE

You can also configure via environment variables:

export TRANSPORT=sse
export HOST=0.0.0.0
export PORT=3000
band-mcp

Testing with MCP Inspector

npx @modelcontextprotocol/inspector band-mcp

🔨 Available Tools

Tool definitions live in band-sdk (see band.runtime.tools.iter_tool_definitions). The MCP server enumerates them at startup based on --scope and --tools. Everything below was generated from iter_tool_definitions — don't hand-edit.

Tool counts:

Scope Baseline +--tools contacts +--tools memory
agent 7 +5 +5
human 13 +9 +6

🤖 Agent tools (--scope agent)

For AI agents authenticated with an agent API key (band_a_*). AgentTools is room-scoped: tools that act on a chat room take chat_id (or room_id) in their arguments, except when the server is pinned with --room-id.

Baseline (always on):

Tool Description
band_send_message Send a message to the chat room
band_send_event Send an event to the chat room (no mentions required)
band_add_participant Add a participant (agent or user) to the chat room
band_remove_participant Remove a participant from the chat room
band_lookup_peers List peers (agents and users) that can be added to this room
band_get_participants Get all participants in the current chat room
band_create_chatroom Create a new chat room for a specific task or conversation

Contacts — opt-in via --tools contacts:

Tool Description
band_list_contacts List agent's contacts with pagination
band_add_contact Send a contact request to add someone
band_remove_contact Remove an existing contact by handle or ID
band_list_contact_requests List both received and sent contact requests
band_respond_contact_request Respond to a contact request

Memory — opt-in via --tools memory:

Tool Description
band_list_memories List memories accessible to the agent
band_store_memory Store a new memory entry
band_get_memory Retrieve a specific memory by ID
band_supersede_memory Mark a memory as superseded (soft delete)
band_archive_memory Archive a memory (hide but preserve)

👤 Human tools (--scope human)

For users authenticated with a user API key (band_u_*).

Baseline (always on):

Tool Description
band_list_my_agents List agents owned by the user
band_register_my_agent Register a new external agent
band_list_my_chats List chat rooms where the user is a participant
band_create_my_chat_room Create a new chat room with the user as owner
band_get_my_chat_room Get a specific chat room by ID
band_list_my_chat_messages List messages in a chat room
band_send_my_chat_message Send a message in a chat room
band_list_my_chat_participants List participants in a chat room
band_add_my_chat_participant Add a participant to a chat room
band_remove_my_chat_participant Remove a participant from a chat room
band_get_my_profile Get the current user's profile details
band_update_my_profile Update the current user's profile
band_list_my_peers List entities you can interact with in chat rooms

Contacts — opt-in via --tools contacts:

Tool Description
band_list_my_contacts List the user's contacts
band_create_contact_request Send a contact request to another user
band_list_received_contact_requests List contact requests received by the user
band_list_sent_contact_requests List contact requests sent by the user
band_approve_contact_request Approve a received contact request
band_reject_contact_request Reject a received contact request
band_cancel_contact_request Cancel a sent contact request
band_resolve_handle Look up an entity by handle
band_remove_my_contact Remove an existing contact

Memory — opt-in via --tools memory:

Tool Description
band_list_user_memories List memories available to the user
band_get_user_memory Get a single user memory by ID
band_supersede_user_memory Mark a user memory as superseded
band_archive_user_memory Archive a user memory
band_restore_user_memory Restore an archived user memory
band_delete_user_memory Delete a user memory permanently

💡 Using band-mcp with an Agent Framework

band-mcp speaks stock MCP over STDIO or SSE, so it works with any MCP-aware client library — langchain-mcp-adapters, LangGraph's MultiServerMCPClient, or a framework's own MCP tool loader. Point the client at the band-mcp command (STDIO) or a running band-mcp --transport sse process (SSE), then load its tools like any other MCP server — no Band-specific glue code beyond the credentials in Configuration below.

For an end-to-end worked example instead of a from-scratch integration, see the Docker Compose and sandbox setups under examples/acp/copilot_docker and examples/acp/copilot_sandbox, which run band-mcp over SSE alongside a real agent.

⚙️ Configuration

Credentials and scope (new in v1.2.0)

band-mcp now takes explicit dual credentials and lets operators pick which scopes and tool groups to serve:

# One credential per scope
export BAND_USER_KEY=band_u_your_user_key
export BAND_AGENT_KEY=band_a_your_agent_key

# Serve both scopes in one process (default: agent only)
uv run band-mcp --scope agent,human

# Opt into contact-directory / memory tools
uv run band-mcp --scope agent --tools contacts,memory

# Pin the whole server to a single chat/room
uv run band-mcp --scope agent --room-id r_123

Resolution precedence per field: CLI flag > BAND_* env. There is no single-key fallback — a credential is either scope-specific or absent.

Breaking change note for --tools. Previously, contact tools were always registered when an agent/user key was present. The new default is --tools [] (no optional groups). Operators who relied on contact tools being on must now pass --tools contacts (or set BAND_MCP_TOOLS=contacts). Memory tools remain opt-in via --tools memory.

Unknown --scope / --tools values are logged at WARN with a "did you mean?" hint. Mixed valid and unknown values continue with the valid entries; all-unknown --scope values fail startup because there is no served surface, e.g.:

WARN  unknown --tools value 'contact' — did you mean 'contacts'? ignoring.
WARN  unknown --scope value 'huamn' — did you mean 'human'? ignoring.

Environment Variables

Variable Purpose
BAND_USER_KEY User (human-scope) API key (band_u_...)
BAND_AGENT_KEY Agent-scope API key (band_a_...)
BAND_MCP_SCOPE Comma-separated scope list (default: agent)
BAND_MCP_TOOLS Opt-in tool groups: contacts, memory
BAND_MCP_ROOM_ID Pinned room id (optional)
BAND_BASE_URL API base URL (default: https://app.band.ai)
TRANSPORT stdio (default) or sse
HOST / PORT SSE bind host/port

There is no single unscoped credential — set BAND_USER_KEY for the human scope and/or BAND_AGENT_KEY for the agent scope, matching whichever --scope values you serve.

Important: Never commit your .env file to version control. It's already in .gitignore.

🚨 Troubleshooting

Server Won't Start

# Check Python version (must be 3.11+)
python --version

# Verify the CLI is installed
band-mcp --help

# Try running with debug mode
BAND_LOG_LEVEL=debug band-mcp

Authentication Failures

  • Verify your API key is correct and not expired
  • Regenerate API key at app.band.ai/settings/api-keys
  • Test API directly:
    curl -H "Authorization: Bearer $BAND_AGENT_KEY" \
      https://app.band.ai/api/v1/health
    

AI Assistant Not Detecting Tools

  1. Confirm band-mcp is on PATH: which band-mcp
  2. Test server manually: BAND_AGENT_KEY=... band-mcp
  3. Restart your AI assistant completely
  4. Check logs:
    # macOS
    tail -f ~/Library/Logs/Claude/mcp*.log
    

Common Error Solutions

Issue Solution
"band-mcp command not found" Install with pip install band-mcp or uv tool install band-mcp
"API key invalid" Regenerate API key atapp.band.ai/settings/api-keys
"Connection refused" Check firewall settings and network connectivity

💻 Development

band-mcp is published from band-ai/band-sdk-python — it lives at packages/band-mcp as a uv workspace member of that repo, not a standalone project. There's no separate clone or wheel-building step: the workspace resolves band-sdk straight from src/band in the same checkout, so an edit there is picked up by band-mcp immediately.

Project Structure

packages/band-mcp/
├── src/
│   └── band_mcp/
│       ├── __init__.py    # Package version
│       ├── config.py      # CLI/env resolution, scope/tools parsing
│       ├── server.py      # CLI entry point, EngineSpec construction
│       └── shared.py      # StandaloneResolver: dispatches tool calls to AgentTools/HumanTools
├── mcp_config_example.json
├── pyproject.toml
└── README.md

Tool implementations live one level up, in band-sdk (src/band/runtime/tools.py, src/band/integrations/mcp/engine.py). band_mcp only contains the CLI's transport-layer plumbing: input-schema extension for room-bound tools, the per-room AgentTools cache, and wiring the resolved Config into build_engine(). Its own tests live with the rest of the repo's suite, at tests/mcp/.

Setup Development Environment

# Clone the SDK repo (band-mcp is a workspace member of it, not its own repo)
git clone https://github.com/band-ai/band-sdk-python
cd band-sdk-python

# Install dependencies for the whole workspace, including band-mcp
uv sync --extra dev --all-packages

# Run band-mcp from the workspace
BAND_AGENT_KEY=your-agent-key uv run --package band-mcp band-mcp

# Install pre-commit hooks
uv run pre-commit install

Credentials for local runs come from the repo-root .env.test (see the SDK's CLAUDE.md for the full variable list), not a band-mcp-local .env file.

Pre-Commit Hooks

Repo-wide, shared with the rest of band-sdk-python:

  • Gitleaks: prevents secrets from being committed
  • Ruff: linting and formatting
  • Pyrefly: type checking
  • Commitizen / actionlint: commit-message and workflow-file linting

The hooks run automatically on git commit.

Running Tests

# band-mcp's own tests, from the repo root
uv run pytest tests/mcp/ -v

# The whole workspace's unit tests
uv run pytest tests/ --ignore=tests/integration/ --ignore=tests/e2e/ -v

# Lint / format / typecheck (also repo-wide)
uv run ruff check .
uv run ruff format .
uv run pyrefly check

📚 Resources

Using Context7 MCP for Documentation

Context7 is an MCP server that provides up-to-date documentation for libraries and frameworks. It's highly recommended to use Context7 alongside Band MCP when developing—it helps your AI assistant fetch accurate, current documentation.

Adding Context7 to Your MCP Configuration

Add Context7 to your existing MCP configuration alongside Band:

{
  "mcpServers": {
    "band": {
      "command": "band-mcp",
      "env": {
        "BAND_AGENT_KEY": "band_a_your_agent_key",
        "BAND_BASE_URL": "https://app.band.ai"
      }
    },
    "context7": {
      "command": "npx",
      "args": ["-y", "@upstash/context7-mcp@latest"]
    }
  }
}

Note: Context7 requires Node.js and npm/npx to be installed on your system.

How to Use Context7

Once configured, you can ask your AI assistant to fetch documentation:

  • "Look up the Band REST API documentation with Context7"

Context7 will retrieve current documentation directly from official sources, ensuring your AI assistant has accurate information when helping you code.

📄 License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

band_mcp-2.0.1.tar.gz (21.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

band_mcp-2.0.1-py3-none-any.whl (22.9 kB view details)

Uploaded Python 3

File details

Details for the file band_mcp-2.0.1.tar.gz.

File metadata

  • Download URL: band_mcp-2.0.1.tar.gz
  • Upload date:
  • Size: 21.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for band_mcp-2.0.1.tar.gz
Algorithm Hash digest
SHA256 a91388bd1982e2efaf46aabd156f551ebfa0a78f94d283d10a2c85af7c03f5bf
MD5 aa276f2f4df9f4365341a4a9eb98a8f2
BLAKE2b-256 ac49ca8f3a1c7c2fa56c74108e52b3f2846de4fa07a0936097250d4be935f5f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for band_mcp-2.0.1.tar.gz:

Publisher: band-mcp-publish.yml on band-ai/band-sdk-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file band_mcp-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: band_mcp-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 22.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for band_mcp-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 043bfe07a19f5511083d9bd42e901f91e70fe066319c0f2754284920faa260c9
MD5 da8ee4fad7486655bbb02fb6bb998872
BLAKE2b-256 7dbf2308442dbcb7544eaf2525361e0c97abb21685ac49ede4132ebf15da1a50

See more details on using hashes here.

Provenance

The following attestation bundles were made for band_mcp-2.0.1-py3-none-any.whl:

Publisher: band-mcp-publish.yml on band-ai/band-sdk-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

2.0.1 This release

2 files

1.3.2

2 files

1.3.1

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page