Basecamp
Interactúa con Basecamp 3 para gestionar proyectos, tareas pendientes y mensajes.
Documentación
Servidor MCP de Basecamp
Un servidor MCP para Basecamp 3. Permite que clientes compatibles con MCP, como Codex, Cursor y Claude Desktop, lean y gestionen proyectos de Basecamp mediante llamadas a la API de Basecamp autenticadas con OAuth.
El servidor principal es basecamp_fastmcp.py. Utiliza el SDK oficial de Python mcp.server.fastmcp y expone 79 herramientas que cubren proyectos, tareas pendientes, foros de mensajes, campfires, tableros de tarjetas, reenvíos de bandeja de entrada, documentos, cargas, comentarios, eventos, webhooks y búsqueda.
Qué Puede Hacer
- Explorar proyectos de Basecamp y sus detalles.
- Buscar en proyectos, tareas pendientes, mensajes, líneas de campfire, comentarios, cargas y horarios.
- Leer y gestionar listas de tareas, tareas pendientes, grupos de tareas y su estado de finalización.
- Leer y crear mensajes en foros de mensajes, incluidos borradores y categorías.
- Leer líneas de campfire.
- Leer y crear comentarios.
- Trabajar con tableros de tarjetas, columnas, tarjetas y pasos de tarjetas.
- Leer reenvíos y respuestas de la bandeja de entrada.
- Leer check-ins diarios y sus respuestas.
- Subir archivos adjuntos e inspeccionar cargas.
- Leer y gestionar documentos, incluidos borradores.
- Listar eventos y gestionar webhooks.
- Generar configuración local de MCP para Codex, Cursor y Claude Desktop.
Requisitos
- Python 3.10 o superior.
- Una cuenta de Basecamp 3.
- Una aplicación OAuth de Basecamp desde https://launchpad.37signals.com/integrations.
- Un cliente que pueda ejecutar servidores MCP locales, como Codex, Cursor o Claude Desktop.
Si el Python de tu sistema es más antiguo, usa uv; puede crear un entorno virtual con una versión más reciente de Python.
Inicio Rápido
Clona el repositorio e instala las dependencias:
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
O, si python ya apunta a Python 3.10 o superior:
python setup.py
Crea un archivo .env a partir del ejemplo y completa tus datos de OAuth de Basecamp:
cp .env.example .env
Valores requeridos:
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)"
Autentícate con Basecamp:
python oauth_app.py
Abre http://localhost:8000 y completa el flujo de OAuth. El token se almacena localmente en oauth_tokens.json de forma predeterminada.
Configura Tu Cliente MCP
Codex
python generate_codex_config.py
codex mcp get basecamp
Opciones útiles:
python generate_codex_config.py --dry-run
python generate_codex_config.py --legacy
El script escribe una entrada de servidor basecamp en ~/.codex/config.toml y la apunta al entorno virtual de este checkout y a basecamp_fastmcp.py.
Cursor
python generate_cursor_config.py
Luego reinicia Cursor y revisa Configuración -> MCP. El servidor debería aparecer como basecamp.
Claude Desktop
python generate_claude_desktop_config.py
Luego cierra y vuelve a abrir Claude Desktop por completo. La configuración generada se escribe en:
- 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
Verifica El Servidor
Ejecuta el servidor FastMCP a través de stdio y solicita su lista de herramientas:
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
Ejecuta las pruebas automatizadas:
python -m pytest tests/ -v
Herramientas Disponibles
El servidor FastMCP expone 82 herramientas.
Proyectos Y Búsqueda
get_projectsget_projectsearch_basecampglobal_search
Informes
get_assignable_people— todas las personas a las que se les pueden asignar tareas pendientes (GET /reports/todos/assigned.json)get_person_assignments— todas las tareas pendientes activas asignadas a una persona en todos los proyectos (GET /reports/todos/assigned/{id}.json,group_by: bucket|dateopcional). Prefiere esto sobre iterar proyectos cuando necesites todo lo asignado a una sola persona.get_overdue_todos— todas las tareas pendientes vencidas en todos los proyectos, agrupadas por retraso (GET /reports/todos/overdue.json)
Tareas Pendientes
get_todolistsget_todolistcreate_todolistupdate_todolisttrash_todolistget_todosget_todocreate_todoupdate_tododelete_todoarchive_todocomplete_todouncomplete_todoreposition_todoget_todolist_groupscreate_todolist_groupreposition_todolist_group
Mensajes, Campfires Y Check-Ins
get_message_boardget_messagesget_messageget_message_categoriescreate_messagecreate_draft_message
Pasa publish: false a create_message para crear un mensaje borrador en lugar
de publicarlo inmediatamente. Los agentes también pueden llamar a create_draft_message directamente
cuando la operación prevista sea específicamente crear un borrador.
get_campfire_linesget_daily_check_insget_question_answers
Comentarios
get_commentscreate_comment
Tableros De Tarjetas
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
Reenvíos De Bandeja De Entrada
get_inboxget_forwardsget_forwardget_inbox_repliesget_inbox_replytrash_forward
Documentos, Cargas, Archivos Adjuntos, Eventos Y Webhooks
create_attachmentget_uploadsget_uploaddownload_upload— descarga un registro de Upload de vault (Docs & Files) y devuelve sus bytes como contenido MCP (ImageContentpara tipos MIME de imagen,EmbeddedResource/BlobResourceContentsen caso contrario). El host MCP reenvía el blob al modelo, por lo que PDFs, imágenes y documentos se leen de forma nativa sin una búsqueda fuera de banda.download_attachment— descarga un archivo adjunto de comentario/mensaje en línea por sucontent_attachments[].download_urly lo devuelve como contenido MCP. Úsalo para archivos incrustados en el cuerpo de un comentario o mensaje. Los archivos adjuntos en línea son objetosAttachmentcon sus propios IDs y no se pueden resolver mediante/uploads/{id}— ese endpoint devuelve 404. Para archivos que son su propio registro de Upload en un vault, usadownload_uploaden su lugar.
Compatibilidad del host para
download_uploadydownload_attachment. Ambas herramientas devuelven bloques de contenido MCP. El archivo solo es legible por el modelo si el host MCP reenvíaImageContent/EmbeddedResource(BlobResourceContents). Estado a junio de 2026:
- Claude Code (CLI) — totalmente compatible, incluidos
application/pdfy otros recursos de blob binarios.- Claude Desktop / web de claude.ai — los bloques de contenido de imagen funcionan, pero los bloques
EmbeddedResourceque no son de imagen se rechazan con"Resources of type 'application/pdf' are not currently supported". Los bytes llegan al host pero nunca al modelo. Una vez que el cliente agregue soporte, estas herramientas serán útiles en esos frontends sin cambios en el servidor.
get_documentsget_documentcreate_documentcreate_draft_document
Pasa publish: false a create_document para crear un documento borrador en lugar
de publicarlo inmediatamente. Los agentes también pueden llamar a create_draft_document
directamente cuando la operación prevista sea específicamente crear un borrador.
update_documenttrash_documentget_eventsget_webhookscreate_webhookdelete_webhook
Ejemplos De Indicaciones
- "Muéstrame todos mis proyectos de Basecamp."
- "Busca en Basecamp la fecha límite."
- "Obtén las listas de tareas pendientes del proyecto 123456."
- "Crea una tarea pendiente llamada Revisar PR en la lista de tareas 987654."
- "Muéstrame las categorías del foro de mensajes del proyecto 123456."
- "Publica un Anuncio en el foro de mensajes del proyecto."
- "Muéstrame las columnas del tablero de tarjetas del proyecto 123456."
- "Mueve esta tarjeta a la columna Hecho."
- "Lista las últimas cargas en el vault de este proyecto."
- "Descarga la captura de pantalla adjunta a ese comentario para que puedas leerla."
Arquitectura
basecamp_fastmcp.py: servidor FastMCP stdio utilizado por los clientes MCP.basecamp_client.py: cliente síncrono de la API de Basecamp 3.search_utils.py: ayudantes de búsqueda de nivel superior en los recursos de Basecamp.oauth_app.py: flujo OAuth local de Flask para la autenticación de Basecamp.auth_manager.py: ayudante de renovación de OAuth utilizado antes de las llamadas a la API.token_storage.py: almacenamiento local de tokens OAuth.generate_codex_config.py: generador de configuración MCP para Codex.generate_cursor_config.py: generador de configuración MCP para Cursor.generate_claude_desktop_config.py: generador de configuración para Claude Desktop.mcp_server_cli.py: servidor JSON-RPC heredado mantenido por compatibilidad y pruebas.
Autenticación Y Almacenamiento De Tokens
La ruta recomendada es OAuth 2.0:
- Crea una aplicación OAuth de Basecamp.
- Coloca el ID de cliente, el secreto de cliente, el ID de cuenta, la URI de redirección y el agente de usuario en
.env. - Ejecuta
python oauth_app.py. - Completa el flujo del navegador en http://localhost:8000.
De forma predeterminada, los tokens OAuth se almacenan en <project>/oauth_tokens.json. Para contenedores, checkouts de solo lectura o volúmenes de tokens montados, establece BASECAMP_MCP_TOKEN_FILE:
export BASECAMP_MCP_TOKEN_FILE=/var/lib/basecamp-mcp/oauth_tokens.json
Tanto la aplicación OAuth como el servidor MCP leen la misma variable. token_storage.py expande ~ y las variables de entorno en esta ruta, crea el directorio principal si es necesario e intenta establecer los permisos del archivo de token a 0o600 al escribir. Los permisos del directorio principal siguen siendo tu responsabilidad.
El servidor web OAuth integrado omite las cadenas de consulta de su registro de acceso para que los códigos de autorización de devolución de llamada no se registren. Si lo ejecutas detrás de otro servidor web o proxy inverso, configura los registros de acceso de ese servidor para omitir también las cadenas de consulta.
Solución De Problemas
Si las herramientas no aparecen en tu cliente MCP:
-
Confirma que el entorno virtual existe y tiene el SDK de MCP:
./venv/bin/python -c "import mcp; print('MCP available')" -
Confirma que
.envcontieneBASECAMP_ACCOUNT_ID. -
Vuelve a ejecutar el generador de configuración correspondiente.
-
Cierra y reinicia tu cliente MCP por completo.
Si la autenticación falla:
python oauth_app.py
Luego abre http://localhost:8000 y completa el flujo de OAuth de Basecamp nuevamente.
Para Claude Desktop en macOS, los registros de MCP suelen estar en:
~/Library/Logs/Claude/
Notas De Seguridad
- No confirmes
.envnioauth_tokens.json. - Usa un
USER_AGENTdescriptivo que incluya información de contacto, ya que Basecamp espera que los clientes de API se identifiquen. - Mantén los archivos de token en almacenamiento local o con permisos adecuados.
- Este servidor está diseñado para uso local con clientes MCP. Revisa el código y el modelo de implementación antes de exponerlo en una red.
Licencia
MIT. Consulta LICENSE.