Foundry Boards MCP
Servidor MCP (Model Context Protocol) que deja a Claude Code, Codex, OpenCode, Gemini y otros clientes compatibles trabajar con los tableros y las notas de Foundry: leer y mover tarjetas, gestionar épicas, sprints y etiquetas, dejar avances y verificaciones con su commit, proponer criterios y decisiones para que una persona los apruebe, y leer y escribir la documentación del Área.
An MCP server that lets AI coding agents work with Foundry's agile boards and notes.
Agente IA ──stdio──► foundry-boards (este MCP) ──HTTP + JWT──► Foundry API (/api/v1)
(permisos por rol)
No toca el backend de Foundry: habla el mismo contrato REST que usa la aplicación web y se autentica con tu cuenta. Los permisos los decide el servidor: lo que tu cuenta no puede hacer en la web, el agente tampoco puede hacerlo.
Empezar en un minuto
Necesitas dos cosas:
uven el PATH. Con él no hace falta instalar Python ni el paquete:uvxlo baja, lo guarda en su caché y lo ejecuta.- Una cuenta de Foundry. Para editar los tableros de un Área, tienes que ser colaborador o dueño de ella.
Claude Code
claude mcp add-json foundry-boards '{"type":"stdio","command":"uvx","args":["foundry-boards-mcp"]}'
Clientes que usan mcpServers (Claude Desktop, Gemini CLI, Cursor…), en su fichero de
configuración. Es lo mismo que trae mcp.json.example:
{
"mcpServers": {
"foundry-boards": {
"command": "uvx",
"args": ["foundry-boards-mcp"],
"env": { "FOUNDRY_AGENT_SOURCE": "auto" }
}
}
}
Codex, en ~/.codex/config.toml:
[mcp_servers.foundry-boards]
command = "uvx"
args = ["foundry-boards-mcp"]
OpenCode, en opencode.json:
{
"mcp": {
"foundry-boards": { "type": "local", "command": ["uvx", "foundry-boards-mcp"], "enabled": true }
}
}
Para comprobarlo, pídele al agente «usa whoami de foundry-boards». La primera vez se abre un diálogo para entrar con tu correo y tu contraseña; si marcas «recordar», no te lo vuelve a pedir hasta que caduque la sesión (ver Autenticación).
No hay que configurar ningún backend: por omisión habla con el Foundry público. Para fijar una
versión concreta, usa "args": ["foundry-boards-mcp@0.1.1"].
Qué puedes pedirle
- «Lista mis tableros y enséñame las tarjetas del de Marketing.»
- «Crea la tarea "Migrar auth a OAuth" en En progreso, prioridad alta, y asígnasela a Ana.»
- «Pasa a Hecho todas las tarjetas de En revisión que tengan sus casos de prueba en verde.»
- «Deja en la FNV-42 el avance con el commit que acabo de hacer y la verificación con los tests.»
- «Lee la nota de arquitectura del Área y dime qué decisiones siguen abiertas.»
Configuración
Todo es opcional. Se pasa como variable de entorno (el bloque env de la configuración del
cliente) o, si trabajas con una copia del código, en un .env en su raíz.
| Variable | Para qué |
|---|---|
FOUNDRY_API_BASE |
Otro backend: el tuyo en local (http://localhost:8000/api/v1) o uno propio. Por omisión, https://foundry.collie.digital/api/v1. |
FOUNDRY_TIMEOUT |
Segundos de espera a la API (30 por omisión). |
FOUNDRY_AGENT_SOURCE |
Qué cliente firma lo que crea el agente. auto lo deduce de la sesión MCP; si tu cliente se anuncia con un nombre genérico, fíjalo (codex, claude_code, opencode, gemini…). |
FOUNDRY_AGENT_MODEL |
El modelo que usa el agente, si es siempre el mismo. |
FOUNDRY_TOKEN, o FOUNDRY_EMAIL + FOUNDRY_PASSWORD |
Solo para automatización o para clientes sin diálogo: el MCP entra sin preguntar. Para uso normal, no los definas. |
Identidad del agente
Todo lo que crea el MCP (descripciones, comentarios, avances, verificaciones y cambios del historial) queda marcado como hecho por una IA, con dos datos aparte:
agent_source: qué cliente lo hizo (claude_code,codex,opencode,gemini,otherounknown).agent_model: con qué modelo, por ejemploclaude-sonnet-*ogpt-5.
Foundry lo enseña como IA · Codex · gpt-5 junto a cada aporte, así que no hace falta firmar el
texto. MCP no estandariza el modelo, así que conviene declararlo: con FOUNDRY_AGENT_MODEL si el
proceso usa siempre el mismo, o con el argumento agent_model de cada herramienta si cambia
durante la sesión. El servidor también reconoce CODEX_MODEL, CLAUDE_MODEL, ANTHROPIC_MODEL,
OPENCODE_MODEL y GEMINI_MODEL.
La identidad la declara el cliente: no es una certificación y no da permisos. Lo que puede hacer el agente lo decide el rol de la cuenta.
Autenticación
No hay credenciales en ficheros ni en la configuración. La primera herramienta que necesita
sesión, o la tool login, abre un diálogo en tu cliente que pide correo y contraseña, o un
token.
- La contraseña no se guarda en ningún sitio: solo sirve para obtener el token.
- El token vive en memoria durante la sesión. Si marcas «recordar», se guarda en el gestor de credenciales del sistema (Windows Credential Manager, macOS Keychain o Secret Service), nunca en un fichero.
- El token dura 24 horas y no se renueva solo. Al caducar, el MCP mira primero el gestor de credenciales: si otra ventana ya renovó la sesión, la reutiliza sin preguntar. Con varias ventanas abiertas, solo la primera pide entrar.
logincambia de cuenta;logoutolvida el token, en memoria y en el sistema.
El diálogo usa elicitation de MCP. Si tu cliente no la soporta, usa FOUNDRY_TOKEN o
FOUNDRY_EMAIL + FOUNDRY_PASSWORD (ver Configuración).
Herramientas
74 herramientas y 3 prompts. Cada una declara si solo lee (23), si crea o actualiza (45) o si borra (6): el cliente lo usa para saber qué puede aprobar solo y dónde pararse. Las que borran (tarjeta, nota, adjunto, columna) además preguntan antes y dicen qué se va a perder.
Sesión y panorama
| Herramienta | Qué hace |
|---|---|
login · logout |
Entra (abre el diálogo) o cambia de cuenta · olvida el token. |
whoami |
La cuenta con la que actúa el MCP. |
list_spaces |
Las Áreas de trabajo que ves. |
list_boards · list_all_boards |
Tableros personales o de un Área · todos a la vez. |
get_board |
Un tablero entero: sus columnas, cada una con sus tarjetas. |
Tableros y columnas
| Herramienta | Qué hace |
|---|---|
list_board_presets |
Las plantillas de columnas entre las que se elige al crear un tablero. |
create_board |
Tablero nuevo, personal o de un Área, con una plantilla o columnas a medida. |
move_board_to_space |
Lleva un tablero personal a un Área para compartirlo. |
add_column · rename_column · reorder_columns |
Añadir, renombrar (el historial no se toca) y reordenar columnas. |
set_column_category · set_column_color |
Su tipo (todo, in_progress, done) y su color. |
delete_column |
Borra una columna; si tiene tarjetas, dices a dónde se mudan. |
Tarjetas
| Herramienta | Qué hace |
|---|---|
create_task · create_epic |
Tarjeta nueva · épica, la raíz que agrupa historias, tareas y bugs. |
edit_task |
Edita título, descripción, prioridad, tipo o responsable (solo lo que pases). |
move_task · transition_task |
Mueve de columna o de posición · cambia de estado y lo deja en el historial. |
set_task_hierarchy |
Tipo y padre: épica → historia → tarea/bug → subtarea. |
set_task_details · set_task_labels |
Puntos, fechas y bandera · etiquetas por nombre (crea las que falten). |
link_tasks · get_task_links · unlink_tasks |
Vínculos entre tarjetas: blocks, is_blocked_by, relates_to. |
link_repo · get_repo_links · unlink_repo |
Ata la tarjeta a un repositorio, rama, PR o commit. |
list_epics |
Las épicas del tablero. |
create_tasks_from_seeds |
Convierte ideas del Vivero en tarjetas propuestas. |
delete_task |
Borra una tarjeta. Irreversible. |
Sprints
| Herramienta | Qué hace |
|---|---|
list_sprints · create_sprint |
Los sprints del tablero · uno nuevo, planificado. |
start_sprint · complete_sprint |
Arrancarlo · cerrarlo (lo no terminado vuelve al backlog). |
assign_task_to_sprint |
Mete una tarjeta en un sprint, o la devuelve al backlog. |
El hilo de la tarjeta
| Herramienta | Qué hace |
|---|---|
report_progress |
Un avance: qué se hizo, cuánto queda y en qué commit se ve. |
report_verification |
La evidencia de que funciona: ok, fallo o parcial, con su detalle. |
flag_blocker |
Marca la tarjeta como bloqueada y explica por qué. |
add_task_entry · add_task_comment |
Un aporte tipado (avance, bloqueo, pregunta…) · una nota libre. |
get_task_comments · get_task_history |
El hilo · el historial estructurado (qué cambió, de qué a qué, quién y cuándo). |
Lo que decide una persona
La IA propone y una persona acepta o descarta, en la web o con estas herramientas. Las de revisión son la decisión de una persona: un agente no debería aprobar lo que él mismo propuso.
| Herramienta | Qué hace |
|---|---|
propose_criterion · list_criteria · review_criterion |
Criterios de aceptación: proponer, leer su estado, aceptar o descartar. |
record_decision · list_decisions · review_decision |
Decisiones de diseño, que se pueden atar a un commit. |
review_task_proposal |
Acepta o rechaza una tarjeta propuesta por la IA. |
Casos de prueba
| Herramienta | Qué hace |
|---|---|
add_test_case · list_test_cases |
Pasos y resultado esperado · su estado (pending, passed, failed). |
mark_test_case · list_test_executions |
Registra el resultado de una ejecución · la bitácora de ejecuciones. |
Adjuntos
| Herramienta | Qué hace |
|---|---|
list_task_attachments · read_task_attachment |
Lista y lee adjuntos: las imágenes llegan como imagen y el texto como texto. |
upload_task_attachment |
Sube un fichero desde el disco, desde un texto o desde base64. |
delete_task_attachment |
Borra un adjunto y dice qué se borró. |
Notas
| Herramienta | Qué hace |
|---|---|
list_notes · read_note · search_notes |
El árbol de notas del Área · una nota en markdown · buscar por contenido. |
create_note · create_note_collection · write_note |
Crear una nota · una carpeta con su árbol · escribir en una que ya existe. |
rename_note · move_note · delete_note |
Renombrar, mover y borrar. |
link_notes · get_note_backlinks |
Enlazar dos notas · qué apunta a una nota. |
link_note_to_task · get_task_notes |
Atar una nota a una tarjeta · qué documentación respalda una tarjeta. |
extract_tasks_from_note |
Saca tarjetas de una nota, con la referencia al párrafo del que salen. |
Prompts, que lanzas tú desde el cliente como un comando:
| Prompt | Qué hace |
|---|---|
trabajar_tarjeta |
El ciclo de una tarjeta: plan visible, avance con su commit, evidencia y entrega. «Hecho» lo decide una persona. |
dejar_avance |
Un avance que se entiende dentro de un mes, con su evidencia y su commit. |
repasar_tablero |
Qué está atascado, qué espera una decisión y qué se puede cerrar. Solo lee. |
Detalles pensados para el agente
- Las columnas se nombran por nombre (sin importar tildes ni mayúsculas) o por id. Cada tablero
tiene las suyas, así que se leen con
get_boarden vez de suponerlas: lo único estable de una columna es sucategory. Una tarjeta creada sin columna nace en la primera de tipotodo. - El responsable se da por nombre o correo en los tableros de un Área. Para quitarlo:
edit_task(..., assignee=""). priority:highest,high,medium,low,lowest(tambiénbaja,media,alta).issue_type:epic,historia,tarea,bug,incidencia,subtarea.
Lo que todavía no hace
- Borrar un tablero entero: la web puede, el MCP aún no.
- Editar el flujo de estados de un tablero más allá de sus columnas.
Si te hace falta algo, abre una incidencia.
Seguridad
- Los permisos los aplica el servidor según el rol de la cuenta; el MCP no puede saltárselos.
- No se guardan contraseñas. El token solo se guarda si lo pides, y en el gestor de credenciales del sistema.
- Da a la cuenta que use el agente solo el acceso que necesite: invítala como colaboradora únicamente a las Áreas que deba tocar.
Solución de problemas
| Síntoma | Qué pasa |
|---|---|
| El servidor no arranca | uv no está en el PATH de tu cliente. Comprueba uvx --version en una terminal y reinicia el cliente. |
| Pide entrar cada vez | No marcaste «recordar»: la sesión se queda solo en memoria. |
| «Este cliente no puede pedir credenciales…» | Tu cliente no soporta elicitation: usa FOUNDRY_TOKEN o FOUNDRY_EMAIL + FOUNDRY_PASSWORD. |
| 403 al cambiar algo | La cuenta es observadora o no es miembro de esa Área. |
| 404 en un tablero o una tarjeta | El id no es correcto, o la cuenta no ve ese tablero. |
| Las tools nuevas no aparecen | Los clientes leen la lista de tools al arrancar: reinícialo. |
Desarrollo
git clone https://github.com/Collie-Valley/foundry-mcp.git
cd foundry-mcp
uv sync # crea .venv con las dependencias y el grupo dev
uv run pytest -q # las pruebas
uvx ruff check . # el estilo, con la configuración de pyproject.toml
En Windows, .\run.ps1 hace el uv sync y comprueba que el servidor carga y lista sus tools.
Para que tu cliente use tu copia en vez del paquete publicado, lánzalo con uv run apuntando a
la carpeta (ruta absoluta):
{
"mcpServers": {
"foundry-boards": {
"command": "uv",
"args": ["run", "--directory", "/ruta/a/foundry-mcp", "python", "run_server.py"]
}
}
}
Con una copia del código, el MCP lee el .env de la raíz del repositorio:
.env.example dice qué admite. Ese .env gana sobre el bloque env del cliente, y nunca se versiona.
El estilo se comprueba con ruff check y nada más: el formateador automático no se usa en este
proyecto. Las pruebas cubren el cliente HTTP y los ayudantes del servidor con dobles, sin hablar
con un Foundry real.
Publicar una versión
Se publica desde una etiqueta, nunca a mano. Una versión subida a PyPI no se puede reemplazar.
- Sube
versionenpyproject.tomly haz merge amain. git tag v<versión> && git push origin v<versión>
El workflow publish.yml comprueba que la etiqueta coincide
con la versión, pasa las pruebas, construye el paquete y lo sube a PyPI por trusted publishing
(OIDC), sin ningún token guardado.
Licencia
MIT © Collie Valley.
Metadata
Release files for foundry-boards-mcp 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| foundry_boards_mcp-0.1.1.tar.gz | 121.4 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| foundry_boards_mcp-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 168.1 kB
Release files / foundry_boards_mcp-0.1.1.tar.gz
| Download URL | foundry_boards_mcp-0.1.1.tar.gz |
|---|---|
| Size | 121.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
293b6bb423e6e68674c7864be666a05a83f6bb6f06d6b350d1dc5ed0edbb88ee
|
|
BLAKE2b-256 checksum How to use checksums |
b8cf799321a726b7cbc6715aacfc23436f4c977ffb13b5b227cc7d1ee26b93ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.
Transparency logRelease files / foundry_boards_mcp-0.1.1-py3-none-any.whl
| Download URL | foundry_boards_mcp-0.1.1-py3-none-any.whl |
|---|---|
| Size | 46.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
908fb6734fb357113435bb1fb0632e2aab3bb8fe8d1b97cb9def2ad34ebfe9dc
|
|
BLAKE2b-256 checksum How to use checksums |
f67b9e1033c33d94afbd30860e86f8dfa4b94b6a215a4174bbff71ebf78024a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.
Transparency logSecurity for foundry-boards-mcp 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for foundry_boards_mcp-0.1.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.