orquestra-mcp 1.48.0 → 1.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +17 -13
  2. package/package.json +1 -1
  3. package/src/server.mjs +31 -1
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # orquestra-mcp
2
2
 
3
- Servidor MCP (Model Context Protocol) para Orquestra. Expone **135 tools**
3
+ Servidor MCP (Model Context Protocol) para Orquestra. Expone **144 tools**
4
+ (conteo al 24 oct 2026, v1.49.0; la lista real está en `src/server.mjs`)
4
5
  que llaman a la API de `orquestra-infra`: lectura de contexto/dashboard/
5
6
  workspace/infra/paridad/listados, escritura de tareas/ideas/changelog/
6
7
  notas/docs/módulos/flujo/categorías/infra/proyectos, y corridas de QA —
@@ -47,7 +48,7 @@ vez de contra producción).
47
48
 
48
49
  ## Setup manual (alternativa, sin el flujo de navegador)
49
50
 
50
- Si preferís generar el token vos mismo en vez de usar `setup`:
51
+ Si prefieres generar el token tú mismo en vez de usar `setup`:
51
52
 
52
53
  1. **Cuenta + workspace en `orquestra-web`**: entra a la app, si no tienes
53
54
  `workspaceId` te manda al wizard de onboarding.
@@ -75,7 +76,7 @@ Variables de entorno (todas opcionales si ya corriste `setup` — se leen de
75
76
  | `ORQUESTRA_API_TOKEN` | sí | — |
76
77
  | `ORQUESTRA_WORKSPACE_ID` | sí | — |
77
78
  | `ORQUESTRA_DEFAULT_PROJECT_ID` | no | — |
78
- | `ORQUESTRA_API_BASE` | no | `ApiBaseUrl` de producción |
79
+ | `ORQUESTRA_API_BASE` | no | `https://api.orquestra.me` |
79
80
  | `ORQUESTRA_WEB_URL` (solo `setup`) | no | `https://app.orquestra.me` |
80
81
 
81
82
  ### Claude Code
@@ -152,23 +153,24 @@ Lectura de contexto:
152
153
  | `get_platform_playbook` | `platform` | Guía de referencia + checklist de publicación en tienda (`ios`\|`android`) — sin red |
153
154
  | `get_skills_catalog` | — | Catálogo de Claude Skills de terceros recomendadas — sin red |
154
155
  | `preview_skill` | `key?` / `sourceRepo?`+`sourcePath?` | Trae el SKILL.md real de una skill de terceros, sin instalar nada |
155
- | `install_skill` | `key?` / `sourceRepo?`+`sourcePath?`, `scope`, `confirmed` | Descarga e instala una skill en `.claude/skills/` — solo después de `preview_skill` + confirmación del usuario; además registra la instalación en Orquestra (best-effort) |
156
+ | `install_skill` | `key?` / `sourceRepo?`+`sourcePath?`, `scope`, `confirmed` | Descarga e instala una skill en `.claude/skills/{key}/` de la carpeta actual (`scope:'project'`) o en `~/.claude/skills/{key}/` (`scope:'global'`) — solo después de `preview_skill` + confirmación del usuario; además registra la instalación en Orquestra (best-effort) |
156
157
  | `list_installed_skills` | `projectId?` | Registros reales de skills instaladas en el proyecto (colección `skills`, no el catálogo) |
157
158
  | `create_skill_install` / `update_skill_install` | ver server.mjs | Self-report manual de una skill instalada a mano, fuera del flujo de `install_skill` |
158
159
  | `get_setup_guide` | — | Orden recomendado (flujo→categorías→infra→módulos→tareas→ideas→notas→changelog→docs) para configurar/sincronizar sin duplicar — sin red |
159
160
  | `list_modules` / `list_statuses` / `list_categories` / `list_services` / `list_environments` / `list_distributions` | `projectId?` | Lista completa de cada entidad — revísalos antes de `create_*` para no duplicar (patrón upsert) |
160
161
 
161
162
  Creación (`create_*`) y edición (`update_*`) — mismo patrón en todos, solo
162
- crear/editar, sin `delete_*`:
163
+ crear/editar (los únicos borrados acotados están en "Estado", abajo). Tabla
164
+ parcial: la lista completa está en `src/server.mjs`:
163
165
 
164
166
  | Entidad | Tools | Notas |
165
167
  |---|---|---|
166
168
  | Tareas | `create_task`, `update_task` | `update_task` incluye `scope` — úsalo para resolver desfases de paridad |
167
169
  | Verificaciones por plataforma | `list_verifications`, `add_verification`, `update_verification`, `delete_verification`, `verify_with_agent` | Confirmaciones (humanas o de agente) de que la tarea quedó bien en web/iOS/Android/API — NO van en el checklist. La tarea no cierra con verificaciones abiertas y se cierra sola al aprobarse la última; `failed` (con `note`) la regresa a su estatus anterior. También: `verifications` en `create_task`, `waiveVerifications` en `update_task` (solo con confirmación del usuario) y `verificationId` en `create_agent_run` |
168
- | Ideas | `create_idea` | |
169
- | Changelog | `create_changelog_entry` | Estilo Keep a Changelog |
170
- | Notas | `create_note` | |
171
- | Docs | `create_doc` | |
170
+ | Ideas | `list_ideas`, `create_idea`, `update_idea` | |
171
+ | Changelog | `list_changelog`, `create_changelog_entry`, `update_changelog_entry` | Estilo Keep a Changelog |
172
+ | Notas | `list_notes`, `create_note`, `update_note` | |
173
+ | Docs | `create_doc`, `get_doc`, `update_doc` | |
172
174
  | Módulos | `create_module`, `update_module` | `scope` también editable |
173
175
  | Flujo (estatus) | `create_status`, `update_status` | `nextIds` define las transiciones válidas |
174
176
  | Categorías | `create_category`, `update_category` | |
@@ -181,7 +183,7 @@ Compuestas:
181
183
  | Tool | Args | Descripción |
182
184
  |---|---|---|
183
185
  | `init_project` | `name`, `description?`, `phase?`, `projectType?`, `distributions?`, `categories?` | Crea un proyecto nuevo en el workspace — categorías+distribuciones+flujo conectado en un paso |
184
- | `apply_stage_playbook` | `stageId`, `moduleName?`, `includeDates?` | Crea el módulo + todas las tareas de la plantilla de una etapa |
186
+ | `apply_stage_playbook` | `stageId`, `moduleName?` | Crea el módulo + todas las tareas de la plantilla de una etapa |
185
187
 
186
188
  Los campos enum (`type`, `priority`, `status`, etc.) están fijos y
187
189
  documentados en el `inputSchema` de cada tool — el modelo los ve sin
@@ -227,7 +229,7 @@ create/update sigue siendo criterio del agente y del humano.
227
229
 
228
230
  ## Estado
229
231
 
230
- 135 tools: lectura (contexto, dashboard, workspace, infra, paridad, standup,
232
+ 144 tools (ver arriba): lectura (contexto, dashboard, workspace, infra, paridad, standup,
231
233
  sync report, setup guide, playbooks de etapa y de plataforma, catálogo de
232
234
  skills, search) + `list_*` de cada colección + creación/edición de tareas
233
235
  (con checklist, verificaciones por plataforma, tiempo, adjuntos, merge), ideas (con comentarios), notas,
@@ -236,6 +238,8 @@ infraestructura, proyecto, contenido (canales, campañas, contenido,
236
238
  Postproxy), agentes, skills, sugerencias y vínculos entre ítems
237
239
  (`link_items`/`unlink_items`/`list_relations`) + compuestas (init_project,
238
240
  apply_stage_playbook, apply_platform_playbook, install_skill). Sin
239
- `delete_*` salvo adjuntos, ítems de checklist, verificaciones y vínculos
240
- (`unlink_items`). Publicado en npm como
241
+ `delete_*` salvo adjuntos, ítems de checklist, verificaciones, vínculos
242
+ (`unlink_items`) y el link del portal del cliente (`revoke_client_portal_link`).
243
+ Comando extra de CLI (no tool): `npx orquestra-mcp vault sync <carpeta> [--apply]`
244
+ (base de conocimiento ↔ vault de Obsidian). Publicado en npm como
241
245
  `orquestra-mcp` (unscoped) -- `npx orquestra-mcp setup`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orquestra-mcp",
3
- "version": "1.48.0",
3
+ "version": "1.49.0",
4
4
  "description": "Servidor MCP de Orquestra -- 135 tools para leer y escribir tareas, ideas, changelog, infraestructura, contenido, QA y más desde un agente de IA",
5
5
  "type": "module",
6
6
  "bin": {
package/src/server.mjs CHANGED
@@ -89,7 +89,7 @@ const SETUP_GUIDE = {
89
89
  { step: 6, section: 'Ideas', check: 'list_ideas', createOrUpdate: 'create_idea / update_idea / convert_idea_to_task', matchBy: 'title' },
90
90
  { step: 7, section: 'Notas', check: 'list_notes', createOrUpdate: 'create_note / update_note', matchBy: 'title' },
91
91
  { step: 8, section: 'Changelog', check: 'list_changelog', createOrUpdate: 'create_changelog_entry / update_changelog_entry', matchBy: 'text' },
92
- { step: 9, section: 'Docs', check: 'search', createOrUpdate: 'create_doc (sin update_doc todavía)', matchBy: 'title' },
92
+ { step: 9, section: 'Docs', check: 'search', createOrUpdate: 'create_doc / update_doc (get_doc para leer el texto completo)', matchBy: 'title' },
93
93
  ],
94
94
  }
95
95
 
@@ -2335,6 +2335,36 @@ export function createServer() {
2335
2335
  }
2336
2336
  )
2337
2337
 
2338
+ // Editar docs (ORQ-409): get_doc trae el texto completo (search solo da fragmentos) para que
2339
+ // update_doc no pise el contenido con una versión recortada.
2340
+ server.registerTool(
2341
+ 'get_doc',
2342
+ {
2343
+ description: 'Lee un documento completo del proyecto (contenido, tipo, carpeta, módulo, visibilidad). Úsala antes de update_doc: content se reemplaza entero, así que parte del texto actual. El id sale de search (types=["doc"]).',
2344
+ inputSchema: { projectId: z.string().optional().describe(PROJECT_ID_DESC), id: z.string() },
2345
+ },
2346
+ async ({ projectId, id }) => {
2347
+ try { return textResult(await apiGet(config, `/v1/docs/${id}`, { projectId: resolveProjectId(projectId) })) } catch (err) { return errorResult(err) }
2348
+ }
2349
+ )
2350
+
2351
+ registerUpdate('update_doc', '/v1/docs',
2352
+ 'Edita un documento existente. Solo se cambian los campos que mandes; content REEMPLAZA el texto entero (lee primero con get_doc y manda el documento completo, no solo el cambio). La versión anterior queda en el historial del doc ("Versiones"). Si cambias el título, los [[Título viejo]] de todo el proyecto se reescriben solos.',
2353
+ {
2354
+ title: z.string().optional(),
2355
+ content: z.string().optional().describe('Markdown completo del doc. [[Título]] enlaza otra nota, doc, tarea o idea.'),
2356
+ type: z.enum(DOC_TYPES).optional(),
2357
+ adrStatus: z.enum(ADR_STATUSES).optional().describe('Solo para type=\'adr\'.'),
2358
+ adrContext: z.string().optional().describe('Solo para type=\'adr\'.'),
2359
+ adrConsequences: z.string().optional().describe('Solo para type=\'adr\'.'),
2360
+ moduleId: z.string().optional(),
2361
+ folder: z.enum(DOC_FOLDERS).optional(),
2362
+ visibility: z.enum(DOC_VISIBILITY).optional().describe('"team" | "workspace" | "public" (expone el doc sin sesión).'),
2363
+ reviewOwnerUid: z.string().optional(),
2364
+ reviewIntervalDays: z.number().optional(),
2365
+ }
2366
+ )
2367
+
2338
2368
  // ═══ ESCRITURA (nivel B -- módulos, flujo, categorías, infra) ═══════════════
2339
2369
 
2340
2370
  const SCOPE_SCHEMA = z.array(z.object({ distId: z.string(), layer: z.string().optional(), done: z.boolean().optional(), ...SCOPE_EVIDENCE })).optional()