Servidor MCP
La plataforma habla Model Context Protocol sobre Streamable HTTP y ofrece a un modelo las mismas operaciones que el CLI: crear proyectos, desplegar, cablear servicios, leer registros, mirar métricas. No hay nada que instalar.
POST https://infrastructure.fundaia.com/api/infra/mcp
Authorization: Bearer fdi_…
El token es el mismo que usa el CLI. Se saca de un botón en la pantalla Agentes de la aplicación, que además rellena la configuración con él.
Conectarlo
Claude Code, en una línea:
claude mcp add --transport http --scope user fundaia \
https://infrastructure.fundaia.com/api/infra/mcp \
--header "Authorization: Bearer fdi_…"
Claude Desktop, Cursor y VS Code leen el mismo bloque, cada uno en su fichero de configuración MCP:
{
"mcpServers": {
"fundaia": {
"type": "http",
"url": "https://infrastructure.fundaia.com/api/infra/mcp",
"headers": { "Authorization": "Bearer fdi_…" }
}
}
}
El servidor no guarda sesión: cada llamada es una petición completa, y sobrevive a que la plataforma se reinicie mientras el agente está conectado.
Qué alcanza
Lo mismo que la persona cuyo token lleva, ni un proyecto más: un proyecto de otro espacio responde igual que uno que no existe. Cada escritura queda en el historial del proyecto a nombre de esa persona.
Si la instancia se ha configurado en solo lectura, solo se ofrecen las herramientas que leen.
Las herramientas
La lista exacta, con sus descripciones, la publica el propio servidor: tools/list, o GET /api/infra/mcp/tools con curl. Por áreas:
| Área | Herramientas |
|---|---|
| Orientación | get_status (todo en una llamada: por aquí se empieza), read_attention (lo que está mal, en toda la instancia), search (cualquier cosa por su nombre, en todos los proyectos: guía), list_projects, list_workspaces, read_capacity, list_sign_ins |
| Orientación | get_status (todo en una llamada: por aquí se empieza), read_attention (lo que está mal, en toda la instancia), list_projects, list_workspaces, read_capacity, list_sign_ins, read_platform_changelog (qué trajo cada versión de la plataforma, para saber si algo existe ya en esta instancia) |
| Diagnóstico | read_project_health, diagnose_service, audit_variables, search_logs, read_dependencies, export_project, compare_deployments, probe_service, wake_service |
| Proyectos | create_project, import_project, import_compose, list_stacks, add_stack, deploy_link, require_second_factor, rename_project, find_project_picture, remove_project_picture, read_project_notes, write_project_notes, move_project, favorite_project, delete_project, list_activity, list_templates |
| Entornos | list_environments, create_environment, rename_environment, delete_environment, copy_service_to_environment, promote_environment, copy_environment_data, compare_environments, set_environment_expiry, read_preview_environments, set_preview_environments |
| Servidores | list_servers, read_server, add_server, update_server, cordon_server, drain_server, remove_server, read_environment_server, move_environment, label_server, require_server_labels, rebalance_servers, read_server_metrics, read_server_bootstrap, test_server_connection |
| Lienzo | get_canvas, move_services, arrange_canvas |
| Servicios | list_services, get_service, create_service, duplicate_service, rename_service, delete_service, update_service_settings (con autoscale para el autoescalado), list_replicas, expose_service, get_capabilities, list_uploads |
| Conexiones | list_connectable, connect_services, disconnect_services |
| Consola | run_command |
| Tareas programadas | list_scheduled_tasks, create_scheduled_task, update_scheduled_task, delete_scheduled_task, run_scheduled_task |
| Despliegues | deploy_service, redeploy_service, rollback_service, cancel_deployment, stop_service, bulk_action, list_deployments, list_recent_deployments (todos los proyectos), get_deployment, read_commit, read_logs, pull_image, list_deploy_hooks, remove_deploy_hook |
| GitHub | list_deployment_approvals, approve_deployment, reject_deployment, read_repository_access, request_repository_access |
| Variables | list_variables, set_variable, import_variables, unset_variable, seal_variable, list_shared_variables, set_shared_variable, unset_shared_variable |
| Dominios y acceso | list_domains, add_domain, verify_domain, remove_domain, set_maintenance, protect_service, unprotect_service, set_ip_allowlist, set_rate_limit |
| Volúmenes y copias | list_volumes, attach_volume, resize_volume, detach_volume, list_files, read_file, list_backups, create_backup, schedule_backups, lock_backup, restore_backup, delete_backup, set_bucket_encryption |
| Datos | list_tables, query_database, execute_sql |
| Recetas y configuración | read_recipe, edit_recipe, read_config, edit_config |
| Observabilidad | read_metrics, read_usage, list_requests, read_incidents, decide_incident, fix_incident, read_autofix |
| Avisos | list_webhooks, add_webhook, update_webhook, remove_webhook, test_webhook |
| Analítica web | read_web_analytics (guía) |
| Envío de logs | list_log_drains, add_log_drain, update_log_drain, test_log_drain, remove_log_drain (guía) |
| Monitores | list_monitors, read_monitor, create_monitor, update_monitor, delete_monitor (guía); kind: "heartbeat" crea uno de cron, cuya URL de ping nunca devuelve: se ve una vez en la web o con fundaia monitors rotate (de cron) |
| Alertas | list_alerts, create_alert, update_alert, delete_alert (guía) |
| Costes y ahorro | read_cost_forecast, set_project_budget, list_savings, apply_saving, apply_destructive_saving, read_weekly_digest (guía) |
| Página de estado | read_status_page, set_status_page, list_status_incidents, open_status_incident, update_status_incident, resolve_status_incident, edit_status_incident_update, delete_status_incident_update, delete_status_incident, schedule_status_maintenance, cancel_status_maintenance (guía) |
| Estado de Fundaia | read_platform_status; del administrador: list_platform_incidents, open_platform_incident, update_platform_incident, resolve_platform_incident, edit_platform_incident_update, delete_platform_incident_update, delete_platform_incident, schedule_platform_maintenance, cancel_platform_maintenance (guía) |
| Arreglos con Claude | fix_deployment, scan_vulnerabilities, read_security_scan, open_issue (guía) |
| Agente | configure_agent, read_consumption, read_agent_activity, read_credit |
| Workflows | list_workflows, list_workflow_runs, read_workflow_run, read_workflow_job_log, run_workflow, rerun_workflow, cancel_workflow_run, wait_for_workflow_run, read_workflow_stats |
| Reglas de la pasarela | read_gateway_rules, update_gateway_rules, preview_gateway_rules (guía) |
| Control de despliegues | get_freeze, freeze_deploys, lift_freeze, protect_environment, list_scheduled_actions, schedule_action, remove_scheduled_action, list_auto_promotions, add_auto_promotion, remove_auto_promotion (congelar, entornos protegidos) |
| Foro | list_forum_threads, read_forum_thread, post_forum_thread, reply_forum_thread, vote_forum_post, accept_forum_answer, moderate_forum_thread (guía) |
Todas aceptan proyecto y servicio como se ven en pantalla: id, slug o nombre. Un nombre ambiguo es un error, no una suposición; uno que no existe responde con el más parecido y la lista de los que sí, para corregirlo en la siguiente llamada.
Las que tocan un servicio o leen un proyecto aceptan también environment, el nombre o el slug de un entorno; sin él trabajan en el entorno por defecto. Un entorno que no existe responde igual que un servicio: con el más parecido y los que hay.
Las de diagnóstico devuelven, en cada hallazgo, next: la herramienta que lee más y sus argumentos ya rellenos. Un agente sigue el puntero en lugar de adivinar.
Antes de usarlas
- Crear un servicio lo despliega. Encadenar
create_servicecondeploy_servicelanza un segundo despliegue encima del primero.deploy: falsees para el servicio que no puede arrancar hasta que alguien escriba una variable. - **
deploy_serviceespera** y devuelve el pipeline terminado y, si falló, las últimas líneas del paso que falló. No hace falta preguntar en bucle. - Ninguna herramienta enseña un secreto, y no hay opción para que lo haga. Para que un servicio alcance a otro está
connect_services, que escribe una referencia. - **Las que destruyen algo piden
confirm** con el nombre de lo que se va. En un entorno protegido, las que despliegan, reinician o cambian variables pidenconfirmcon el nombre del entorno. - **En un entorno congelado, desplegar responde
deploy_frozen.**force: truelo hace igualmente y queda en el historial; lo automático espera solo a que termine. - No se sube código por MCP:
create_serviceconupload: truecrea el servicio, y el código se manda confundaia up.
Cuando algo falla
Un fallo vuelve como error de herramienta, no de protocolo, así que el modelo lo lee y puede corregir la llamada. Lleva el mismo código que la API y que fundaia --json: not_found, conflict, validation_failed, forbidden, deploy_frozen…
Para lo que un agente tiene que saber antes de actuar, ver Para agentes.