Cómo se integran con AITM los clientes de IA externos (clientes MCP, scripts, otras herramientas) a través de sus servidores MCP y de la API REST/GraphQL.
AITM MCP & API
Servidores MCP
AITM expone dos servidores MCP:
- aitm-core (35 herramientas) — proyectos (
onboarding,list_projects,get_project_status), CRUD de Tasks (create_task,list_tasks,get_task,update_task,delete_task,search_tasks), ciclo de vida (run_task,stop_task,stop_project_tasks,stop_all_tasks,resume_task,skip_step,requeue_task— destructiva,archive_task,restore_task,reorder_task), datos de Tasks (get_task_result,get_task_console,get_task_logs,get_pipeline_status), optimización de prompts (optimize_prompt,apply_optimization), búsqueda en el archivo (search_archive), ajustes (get_settings,update_settings), licencia (license_status,license_activate,license_deactivate,license_upload_offline_token,license_remove_offline_token) yserver_restart/server_stop. - aitm-extended (43 herramientas) — entorno de pruebas (
test_env_status,test_app_build,test_app_start,test_app_stop,test_project_pull,get_test_history), capturas de pantalla (get_screenshot_manifest,get_screenshot,get_screenshot_history), Contracts (search_contracts,get_contract_detail,get_module_summary,find_precedent_tasks,get_danger_zones,investigate_variable,blast_radius,context_for,contracts_health,contracts_resync), documentación y variables (search_docs,get_docs_for_variable,get_behavior_chain,search_variables,get_variable_tree,get_dom_page,search_dom), autocomprobación (run_selfcheck) y copia de seguridad (create_backup), conversaciones (list_conversations,get_conversation,delete_conversation), mensajería de Chat/Brainstorm (send_chat_message,send_brainstorm_message), Skills (list_skills,skill_create,skill_list,skill_search,skill_get,skill_update,skill_delete), Merge queue (get_merge_queue),resolve_conflicty estado de los servicios (get_service_health).
Transportes: stdio (local, predeterminado para ambos servidores) y Streamable HTTP en el puerto 3335 (predeterminado, sustituible con --mcp-port) con un bearer token obligatorio (AITM_MCP_TOKEN o config.mcp.httpAuthToken, fail-closed — el servidor se niega a arrancar en modo HTTP sin él) y TLS opcional (--tls-cert/--tls-key). Solo aitm-core está registrado en el .mcp.json predeterminado de este repositorio (stdio); aitm-extended se lanza por separado (opcionalmente con --http).
Ejemplo: conectar un cliente MCP (stdio)
{
"mcpServers": {
"aitm-core": {
"command": "npx",
"args": ["tsx", "src/mcp/AitmCoreMcpServer.ts", "--rest-url", "http://localhost:3333"]
}
}
}
Ejemplo: cliente MCP remoto (HTTP)
{
"mcpServers": {
"aitm-core-remote": {
"url": "https://your-host:3335",
"headers": { "Authorization": "Bearer <AITM_MCP_TOKEN>" }
}
}
}
API REST
Base http://localhost:3333, JSON. Puertos: 3333 REST/GraphQL/UI, 3334 HTTPS, 3335 MCP Streamable HTTP.
| Endpoint | Finalidad |
|---|---|
GET /api/onboarding | Autoinicialización del Agent |
GET /api/tasks | Listar Tasks (projectId?, limit?) |
GET /api/tasks/all | Lista de Tasks paginada/filtrable |
POST /api/tasks | Crear un Task |
POST /api/tasks/chain | Crear una cadena de Tasks dependientes |
GET /api/tasks/:id | Detalle del Task |
PATCH /api/tasks/:id | Actualizar parcialmente un Task |
DELETE /api/tasks/:id | Eliminar un Task de forma permanente |
POST /api/tasks/:id/run | Iniciar un Task pendiente |
POST /api/tasks/:id/stop | Detener un único Task |
POST /api/tasks/stop-all | Parada global (filtro opcional tabId/projectId) |
POST /api/projects/:projectId/tasks/stop-all | Detener todos los Tasks de un proyecto |
POST /api/tasks/:id/resume | Reanudar un Task fallido/detenido/en conflicto |
POST /api/tasks/:id/skip | Omitir un paso concreto del Pipeline |
POST /api/tasks/:id/archive | Archivar un Task terminado |
POST /api/tasks/:id/restore | Restaurar un Task archivado (rechazado si la rama ya está fusionada/eliminada) |
POST /api/tasks/:id/requeue, /reorder | Volver a encolar / cambiar el orden de la cola |
GET /api/tasks/:id/result|console|logs|pipeline | Resultado del Task, salida de consola, registros y estado del Pipeline |
GET /api/archive | Buscar Tasks archivados |
GET /api/status | Estado de pestañas/proyectos (caché stale-while-revalidate) |
GET /api/projects | Listar pestañas/proyectos |
GET/PUT/PATCH /api/settings | Leer y actualizar ajustes |
POST /api/backup/create | Crear una copia de seguridad |
GET /api/merge/queue | Estado de la Merge queue |
GET /api/service-health | Estado de los servicios monitorizados |
GET /api/version | Versión del servidor (semver, fecha de compilación, modo de release) |
GET /api/license/status | Estado de la licencia |
POST /api/license/activate | Activar una licencia (licenseKey, instanceLabel, email) |
POST /api/server/restart|stop | Reiniciar o detener el servidor |
POST /graphql | Endpoint de conocimiento — Contracts, variables, documentación |
Es un conjunto seleccionado de los endpoints más usados, no la lista completa — la API REST tiene más de 100 endpoints repartidos entre src/rest/RestApi.ts y routers dedicados (Skills, Contracts, etiquetas DOM, i18n, capturas de pantalla, infraestructura de pruebas, releases y más).
Referencia de parámetros — operaciones más usadas
| Operación | Parámetros |
|---|---|
POST /api/tasks | tabId, projectId, title (≤ 60 caracteres), prompt (≤ 50 KB), opcionales priority (low|medium|high, por defecto medium), useWorktree/usePipeline/autoMergeDev (por defecto true), skipSteps, dependsOn, overridePreFlight |
POST /api/tasks/chain | un array de objetos con la misma forma que POST /api/tasks — cada elemento posterior recibe automáticamente dependsOn:[previous id] |
POST /api/tasks/:id/stop | reason? |
POST /api/tasks/:id/resume | fromStepIndex?, instructions?, skipSteps? — sin fromStepIndex, se detecta automáticamente el primer paso fallido/detenido |
POST /api/tasks/:id/skip | stepIndex o stepName (se requiere uno) — el paso debe estar pending, o failed/stopped en un Task que no se esté ejecutando |
POST /api/tasks/:id/archive | force?, reason? — solo desde los estados finished/stopped/failed/conflict |
POST /api/tasks/:id/restore | sin cuerpo — solo Tasks archivados; 409 si la rama ya está merged o branch-missing |
| Herramienta MCP | Parámetros |
|---|---|
create_task | title, prompt, tabId, projectId (obligatorios), opcionales priority, useWorktree, usePipeline, autoMergeDev, skipSteps[], dependsOn[] |
list_tasks | status?, tabId?, projectId? |
get_task | id |
run_task | id |
resume_task | id, opcionales fromStepIndex, instructions, skipSteps |
Ejemplo: crear un Task
curl -X POST http://localhost:3333/api/tasks \
-H 'Content-Type: application/json' \
-d '{"title":"Fix auth bug","prompt":"READ CLAUDE.md first...","tabId":"ctm","projectId":"ctm-dashboard","priority":"high","useWorktree":true,"usePipeline":true,"autoMergeDev":true}'
Nota: title máx. 60 caracteres, prompt máx. 50 KB; los valores por defecto de useWorktree/usePipeline/autoMergeDev son true, la priority por defecto es medium.
Ejemplo: una cadena de Tasks dependientes
curl -X POST http://localhost:3333/api/tasks/chain \
-H 'Content-Type: application/json' \
-d '[
{"title":"Add DB column","prompt":"...","tabId":"ctm","projectId":"ctm-dashboard"},
{"title":"Use column in API","prompt":"...","tabId":"ctm","projectId":"ctm-dashboard"}
]'
El segundo Task espera a que el primero se fusione en dev, ya que cada elemento posterior recibe automáticamente dependsOn:[previous id].
Ejemplo: detener y reanudar un Task
curl -X POST http://localhost:3333/api/tasks/42/stop \
-H 'Content-Type: application/json' -d '{"reason":"manual stop"}'
curl -X POST http://localhost:3333/api/tasks/42/resume \
-H 'Content-Type: application/json' -d '{}'
Consejos
- Para la integración local (misma máquina), conviene usar el transporte stdio — es más sencillo y no requiere token.
- Para el acceso remoto, conviene establecer siempre
AITM_MCP_TOKEN— el servidor es fail-closed sin él y se niega a arrancar en modo HTTP. - Es preferible usar las herramientas de
aitm-extendeden lugar de llamar a/graphqla mano para descubrir Contracts y variables. GET /api/statusresponde al instante desde la caché y se actualiza en segundo plano — no debe asumirse que siempre refleja el estado más reciente.