ops
Conectar al MCP ops (worklist remoto)
El MCP ops corre remoto, en el
Container App ya desplegado. No necesitás clonar el repo, ni
npm install, ni credenciales de Postgres en tu
máquina — solo un token bearer y Claude Code
instalado.
Este manual es para Claude Code. ¿Vas a conectar
ops desde Claude Desktop o
Claude Mobile en cambio? Los pasos son distintos
(Desktop necesita un puente mcp-remote; Mobile no lo
soporta de forma confiable todavía) — ver
Conectar desde Claude.
0. Qué necesitás antes de empezar
- Un token — te lo emite Daniel (o un global-admin real, ver más abajo). Hay 3 tipos, por prefijo:
| Prefijo | Scope | Puede hacer |
|---|---|---|
opsmcp_r_ |
read |
Solo consultar: ops_list,
ops_sprints, ops_render.
|
opsmcp_w_ |
write |
Todo lo de read + crear/editar/asignar/borrar
ítems y activar sprints. En un ítem raíz
(sin parent_id) el status tope es
to_be_human_reviewed — done
requiere admin. En una subtask
(con parent_id), done sí está
permitido con write.
|
opsmcp_a_ |
admin | Todo lo anterior, sin techo de status. Solo Daniel lo porta. |
El prefijo es cosmético — el scope real es contra qué lista matchea el servidor. Si no tenés un token, pedíselo a Daniel; no hay forma de generarlo vos mismo salvo que seas global-admin real (ver la sección "Emitir un token nuevo" más abajo).
- Claude Code instalado (comando
claudeen el PATH).
1. Conectar — QA (para validar primero)
Copiá este comando literal, reemplazando
<TU_TOKEN> por el token que te dieron (empieza
con opsmcp_r_, opsmcp_w_ u
opsmcp_a_):
claude mcp add --transport http ops-qa https://ops-qa.dynamotech.co/mcp \
--header "Authorization: Bearer <TU_TOKEN>"
2. Conectar — producción (uso normal)
claude mcp add --transport http ops https://ops.dynamotech.co/mcp \
--header "Authorization: Bearer <TU_TOKEN>"
No hace falta correr los dos — usá el que te haya indicado
Daniel. Según la documentación operativa vigente del MCP
(skill mcp_ops del repo ops-dynamo),
https://ops-qa.dynamotech.co/mcp está
activo; https://ops.dynamotech.co/mcp
puede responder 503 hasta que se corra el runbook de
activación de producción. Si tu conexión a ops
(prod) devuelve 503, es esto — no un bug de tu lado
(ver Troubleshooting).
3. Verificar que conectó
Abrí (o reiniciá) una sesión de Claude Code y corré:
/mcp
Deberías ver ops (o ops-qa) listado con
estado connected. Si dice failed o no
aparece, andá a Troubleshooting.
4. Probar una tool real
En la misma sesión, pedile al agente:
Corré ops_list y mostrame los primeros ítems
Si tu token es válido vas a ver ítems reales del board (proyecto AI
Factory por default). Si tu token es write o
admin, probá también crear un ítem de prueba con
ops_add y confirmá que aparece con ops_list.
5. Qué puede hacer cada tool
| Tool | read | write | admin |
|---|---|---|---|
ops_list | ✅ | ✅ | ✅ |
ops_sprints | ✅ | ✅ | ✅ |
ops_render |
✅ (markdown como texto, no archivo) | ✅ | ✅ |
ops_add | ❌ | ✅ (tope to_be_human_reviewed en raíz) | ✅ |
ops_update | ❌ | ✅ (mismo tope) | ✅ |
ops_assign | ❌ | ✅ | ✅ |
ops_delete | ❌ | ✅ | ✅ |
ops_sprint_activate | ❌ | ✅ | ✅ |
ops_token_mint / ops_token_list / ops_token_revoke |
❌ | ❌ | ❌* |
* Ninguna columna de esta tabla alcanza para las 3 tools de
administración de tokens — gatean solo contra
authz.isGlobalAdmin===true (identidad real), nunca
contra el scope del token/JWT que estés usando. Un token
admin de las listas de env, o un JWT humano común, las
ve rechazadas igual que un token read.
6. Emitir un token nuevo — solo global-admin real
Emitir/listar/revocar tokens de tabla (ops.mcp_tokens,
con identidad real detrás — no un secreto ciego compartido) exige
ser global-admin real. Si no lo sos, esta sección
no aplica — pedile el token a Daniel como en el paso 0.
Opción A — desde una sesión ya conectada como admin
Pedile al agente:
Corré ops_token_mint con user_id: "<uuid del usuario>", scope: "write", label: "para Fulano"
La respuesta incluye el token en claro —
copialo en ese momento, no se vuelve a mostrar (ni
ops_token_list ni ninguna otra consulta lo recupera
después; solo su hash queda en la DB).
Opción B — vía curl al endpoint REST
curl -s -X POST https://ops-qa.dynamotech.co/mcp/tokens \
-H "Authorization: Bearer <TU_TOKEN_O_JWT_GLOBAL_ADMIN>" \
-H "Content-Type: application/json" \
-d '{"user_id": "<uuid del usuario>", "scope": "write", "label": "para Fulano"}'
Reemplazá ops-qa por ops para producción.
Listar tokens vigentes (sin exponer el claro ni el hash)
curl -s https://ops-qa.dynamotech.co/mcp/tokens \
-H "Authorization: Bearer <TU_TOKEN_O_JWT_GLOBAL_ADMIN>"
Revocar un token
curl -s -X POST https://ops-qa.dynamotech.co/mcp/tokens/<id>/revoke \
-H "Authorization: Bearer <TU_TOKEN_O_JWT_GLOBAL_ADMIN>"
200 con revoked_at seteado la primera vez;
404 si ya estaba revocado o el id no existe. A partir de
acá el token revocado devuelve 401 en /mcp
— no hace falta un redeploy.
7. Rotación de tokens
Si tu token dejó de funcionar de un día para otro, probablemente fue
rotado: Daniel agrega el token nuevo a la lista del GitHub Secret
del ambiente (OPS_MCP_READ_TOKENS_QA/_PROD,
o el equivalente WRITE/ADMIN), se
redeploya el ambiente, y el token viejo se retira de la lista en un
paso posterior. Pedile a Daniel el token nuevo y repetí el paso 1/2.
8. Diferencia con el MCP local (stdio)
| Local (stdio) | Remoto (HTTP, este manual) | |
|---|---|---|
| Requiere clone del repo | Sí | No |
Requiere npm install | Sí | No |
| Requiere credenciales de Postgres en tu máquina | Sí | No |
| Autorización | WORKLIST_FULLACCESS=1 (honor system) |
Bearer token con scope enforced en el servidor |
| Quién lo usa hoy | Factory/dispatcher, agentes locales de Daniel | Cualquier persona/agente con un token válido |
Errores esperados (401/403/503/405) y qué hacer con cada uno: ver Troubleshooting.