Basecamp
Interaja com o Basecamp 3 para gerenciar projetos, tarefas e mensagens.
Documentação
Servidor MCP Basecamp
Um servidor MCP para Basecamp 3. Ele permite que clientes compatíveis com MCP, como Codex, Cursor e Claude Desktop, leiam e gerenciem projetos do Basecamp por meio de chamadas à API do Basecamp autenticadas via OAuth.
O servidor principal é basecamp_fastmcp.py. Ele usa o SDK Python oficial mcp.server.fastmcp e expõe 79 ferramentas que cobrem projetos, tarefas, quadros de mensagens, campfires, tabelas de cartões, encaminhamentos de caixa de entrada, documentos, uploads, comentários, eventos, webhooks e pesquisa.
O Que Ele Pode Fazer
- Navegar por projetos do Basecamp e detalhes de projetos.
- Pesquisar em projetos, tarefas, mensagens, linhas de campfire, comentários, uploads e agendas.
- Ler e gerenciar listas de tarefas, tarefas, grupos de tarefas e estado de conclusão.
- Ler e criar mensagens em quadros de mensagens, incluindo rascunhos e categorias.
- Ler linhas de campfire.
- Ler e criar comentários.
- Trabalhar com tabelas de cartões, colunas, cartões e etapas de cartões.
- Ler encaminhamentos e respostas da caixa de entrada.
- Ler check-ins diários e respostas.
- Enviar anexos e inspecionar uploads.
- Ler e gerenciar documentos, incluindo rascunhos.
- Listar eventos e gerenciar webhooks.
- Gerar configuração MCP local para Codex, Cursor e Claude Desktop.
Requisitos
- Python 3.10 ou mais recente.
- Uma conta Basecamp 3.
- Um aplicativo OAuth do Basecamp de https://launchpad.37signals.com/integrations.
- Um cliente que possa executar servidores MCP locais, como Codex, Cursor ou Claude Desktop.
Se o Python do seu sistema for mais antigo, use uv; ele pode criar um ambiente virtual com uma versão mais recente do Python.
Início Rápido
Clone o repositório e instale as dependências:
git clone https://github.com/georgeantonopoulos/Basecamp-MCP-Server.git
cd Basecamp-MCP-Server
uv venv --python 3.12 venv
source venv/bin/activate
uv pip install -r requirements.txt
Ou, se python já apontar para Python 3.10 ou mais recente:
python setup.py
Crie um arquivo .env a partir do exemplo e preencha com seus detalhes de OAuth do Basecamp:
cp .env.example .env
Valores obrigatórios:
BASECAMP_CLIENT_ID=your-client-id
BASECAMP_CLIENT_SECRET=your-client-secret
BASECAMP_ACCOUNT_ID=your-account-id
USER_AGENT="Your App Name (your@email.com)"
Autentique-se com o Basecamp:
python oauth_app.py
Abra http://localhost:8000 e conclua o fluxo OAuth. O token é armazenado localmente em oauth_tokens.json por padrão.
Configure Seu Cliente MCP
Codex
python generate_codex_config.py
codex mcp get basecamp
Opções úteis:
python generate_codex_config.py --dry-run
python generate_codex_config.py --legacy
O script grava uma entrada de servidor basecamp em ~/.codex/config.toml e a aponta para o ambiente virtual deste checkout e para basecamp_fastmcp.py.
Cursor
python generate_cursor_config.py
Em seguida, reinicie o Cursor e verifique em Configurações -> MCP. O servidor deve aparecer como basecamp.
Claude Desktop
python generate_claude_desktop_config.py
Em seguida, saia completamente e reabra o Claude Desktop. A configuração gerada é gravada em:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
~/AppData/Roaming/Claude/claude_desktop_config.json - Linux:
~/.config/claude-desktop/claude_desktop_config.json
Verifique o Servidor
Execute o servidor FastMCP via stdio e solicite a lista de ferramentas:
printf '%s\n%s\n%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized","params":{}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
| python basecamp_fastmcp.py
Execute os testes automatizados:
python -m pytest tests/ -v
Ferramentas Disponíveis
O servidor FastMCP expõe 82 ferramentas.
Projetos e Pesquisa
get_projectsget_projectsearch_basecampglobal_search
Relatórios
get_assignable_people— todas as pessoas que podem receber tarefas atribuídas (GET /reports/todos/assigned.json)get_person_assignments— todas as tarefas ativas e pendentes atribuídas a uma pessoa em todos os projetos (GET /reports/todos/assigned/{id}.json,group_by: bucket|dateopcional). Prefira esta opção em vez de iterar projetos quando precisar de tudo atribuído a uma única pessoa.get_overdue_todos— todas as tarefas atrasadas em todos os projetos, agrupadas por atraso (GET /reports/todos/overdue.json)
Tarefas
get_todolistsget_todolistcreate_todolistupdate_todolisttrash_todolistget_todosget_todocreate_todoupdate_tododelete_todoarchive_todocomplete_todouncomplete_todoreposition_todoget_todolist_groupscreate_todolist_groupreposition_todolist_group
Mensagens, Campfires e Check-Ins
get_message_boardget_messagesget_messageget_message_categoriescreate_messagecreate_draft_message
Passe publish: false para create_message para criar uma mensagem de rascunho em vez
de publicá-la imediatamente. Os agentes também podem chamar create_draft_message diretamente
quando a operação pretendida for especificamente criar um rascunho.
get_campfire_linesget_daily_check_insget_question_answers
Comentários
get_commentscreate_comment
Tabelas de Cartões
get_card_tablesget_card_tableget_columnsget_columncreate_columnupdate_columnmove_columnupdate_column_colorput_column_on_holdremove_column_holdwatch_columnunwatch_columnget_cardsget_cardcreate_cardupdate_cardmove_cardcomplete_carduncomplete_cardget_card_stepscreate_card_stepget_card_stepupdate_card_stepdelete_card_stepcomplete_card_stepuncomplete_card_step
Encaminhamentos de Caixa de Entrada
get_inboxget_forwardsget_forwardget_inbox_repliesget_inbox_replytrash_forward
Documentos, Uploads, Anexos, Eventos e Webhooks
create_attachmentget_uploadsget_uploaddownload_upload— baixa um registro de Upload do vault (Documentos e Arquivos) e retorna seus bytes como conteúdo MCP (ImageContentpara tipos MIME de imagem,EmbeddedResource/BlobResourceContentscaso contrário). O host MCP encaminha o blob para o modelo, então PDFs, imagens e documentos são lidos nativamente sem uma busca fora de banda.download_attachment— baixa um anexo inline de comentário/mensagem pelo seucontent_attachments[].download_urle o retorna como conteúdo MCP. Use esta ferramenta para arquivos incorporados ao corpo de um comentário ou mensagem. Anexos inline são objetosAttachmentcom seus próprios IDs e não podem ser resolvidos por meio de/uploads/{id}— esse endpoint retorna 404. Para arquivos que são seu próprio registro de Upload em um vault, usedownload_uploadem vez disso.
Compatibilidade de host para
download_uploadedownload_attachment. Ambas as ferramentas retornam blocos de conteúdo MCP. O arquivo só é legível pelo modelo se o host MCP encaminharImageContent/EmbeddedResource(BlobResourceContents). Status em junho de 2026:
- Claude Code (CLI) — totalmente suportado, incluindo
application/pdfe outros recursos de blob binário.- Claude Desktop / web claude.ai — blocos de conteúdo de imagem funcionam, mas blocos
EmbeddedResourceque não são de imagem são rejeitados com"Resources of type 'application/pdf' are not currently supported". Os bytes chegam ao host, mas nunca ao modelo. Quando o cliente adicionar suporte, essas ferramentas se tornarão úteis nesses frontends sem alterações no servidor.
get_documentsget_documentcreate_documentcreate_draft_document
Passe publish: false para create_document para criar um documento de rascunho em vez
de publicá-lo imediatamente. Os agentes também podem chamar create_draft_document
diretamente quando a operação pretendida for especificamente criar um rascunho.
update_documenttrash_documentget_eventsget_webhookscreate_webhookdelete_webhook
Exemplos de Prompts
- "Mostre-me todos os meus projetos do Basecamp."
- "Pesquise no Basecamp por prazo."
- "Obtenha as listas de tarefas do projeto 123456."
- "Crie uma tarefa chamada Revisar PR na lista de tarefas 987654."
- "Mostre-me as categorias do quadro de mensagens do projeto 123456."
- "Publique um Anúncio no quadro de mensagens do projeto."
- "Mostre-me as colunas da tabela de cartões do projeto 123456."
- "Mova este cartão para a coluna Concluído."
- "Liste os uploads mais recentes no vault deste projeto."
- "Baixe a captura de tela anexada àquele comentário para que você possa lê-la."
Arquitetura
basecamp_fastmcp.py: servidor stdio FastMCP usado por clientes MCP.basecamp_client.py: cliente síncrono da API Basecamp 3.search_utils.py: auxiliares de pesquisa de nível superior em recursos do Basecamp.oauth_app.py: fluxo OAuth Flask local para autenticação do Basecamp.auth_manager.py: auxiliar de renovação OAuth usado antes das chamadas de API.token_storage.py: armazenamento local de tokens OAuth.generate_codex_config.py: gerador de configuração MCP do Codex.generate_cursor_config.py: gerador de configuração MCP do Cursor.generate_claude_desktop_config.py: gerador de configuração do Claude Desktop.mcp_server_cli.py: servidor JSON-RPC legado mantido para compatibilidade e testes.
Autenticação e Armazenamento de Tokens
O caminho recomendado é OAuth 2.0:
- Crie um aplicativo OAuth do Basecamp.
- Coloque o ID do cliente, o segredo do cliente, o ID da conta, o URI de redirecionamento e o agente do usuário em
.env. - Execute
python oauth_app.py. - Conclua o fluxo do navegador em http://localhost:8000.
Por padrão, os tokens OAuth são armazenados em <project>/oauth_tokens.json. Para contêineres, checkouts somente leitura ou volumes de tokens montados, defina BASECAMP_MCP_TOKEN_FILE:
export BASECAMP_MCP_TOKEN_FILE=/var/lib/basecamp-mcp/oauth_tokens.json
Tanto o aplicativo OAuth quanto o servidor MCP leem a mesma variável. token_storage.py expande ~ e variáveis de ambiente neste caminho, cria o diretório pai se necessário e tenta definir as permissões do arquivo de token para 0o600 ao gravar. As permissões do diretório pai continuam sendo sua responsabilidade.
O servidor web OAuth integrado omite strings de consulta de seu log de acesso para que os códigos de autorização de callback não sejam registrados. Se você o executar atrás de outro servidor web ou proxy reverso, configure os logs de acesso desse servidor para omitir strings de consulta também.
Solução de Problemas
Se as ferramentas não aparecerem no seu cliente MCP:
-
Confirme se o ambiente virtual existe e tem o SDK MCP:
./venv/bin/python -c "import mcp; print('MCP available')" -
Confirme se
.envcontémBASECAMP_ACCOUNT_ID. -
Execute novamente o gerador de configuração relevante.
-
Saia completamente e reinicie seu cliente MCP.
Se a autenticação falhar:
python oauth_app.py
Em seguida, abra http://localhost:8000 e conclua o fluxo OAuth do Basecamp novamente.
Para Claude Desktop no macOS, os logs MCP geralmente ficam em:
~/Library/Logs/Claude/
Notas de Segurança
- Não faça commit de
.envouoauth_tokens.json. - Use um
USER_AGENTdescritivo que inclua informações de contato, pois o Basecamp espera que os clientes de API se identifiquem. - Mantenha os arquivos de token em armazenamento local ou com permissões adequadas.
- Este servidor foi projetado para uso local com clientes MCP. Revise o código e o modelo de implantação antes de expô-lo em uma rede.
Licença
MIT. Consulte LICENSE.