orquestra-mcp 1.46.0 → 1.46.1

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.
package/README.md CHANGED
@@ -12,25 +12,34 @@ configurar/sincronizar un proyecto completo sin crear duplicados.
12
12
  Ver `CLAUDE.md` para contexto de desarrollo. Ver la memoria del proyecto
13
13
  `orquestra-mcp-api-plan` para las 8 fases del plan MCP/API completo.
14
14
 
15
- ## Setup rápido (recomendado)
15
+ ## Empezar (macOS, Linux y Windows)
16
+
17
+ Necesitas una cuenta en [app.orquestra.me](https://app.orquestra.me) y Node 18+.
18
+
19
+ **1. Conecta tu cuenta y tu proyecto** — desde la carpeta de tu proyecto:
16
20
 
17
21
  ```bash
18
- npm install
19
- node bin/orquestra-mcp.mjs setup
22
+ npx orquestra-mcp@latest setup
20
23
  ```
21
24
 
22
- Esto abre tu navegador en `https://app.orquestra.me/cli-auth` para
23
- confirmar tu sesión (Google o email/password, lo que ya uses) y:
25
+ Abre el navegador para confirmar tu sesión (Google o email/password) y luego:
26
+
27
+ - Si **no tienes workspace**, te pide su nombre y después el de tu primer proyecto.
28
+ - Si **perteneces a varios workspaces**, te deja elegir en cuál trabajar (elegir aquí
29
+ no cambia el que tienes abierto en la web).
30
+ - Eliges un proyecto de ese workspace o creas uno nuevo.
31
+
32
+ La conexión se guarda **por carpeta** en `~/.orquestra/mcp-config.json`: puedes tener
33
+ distintos proyectos (o cuentas) en distintas carpetas. Para conectar otra carpeta o
34
+ cambiar de proyecto, vuelve a correr el setup ahí.
24
35
 
25
- - Si **no tienes** workspace/proyecto todavía: te crea uno default
26
- ("Mi primer proyecto", con los 6 estatus base) — puedes renombrarlo o
27
- cambiarlo cuando quieras desde `orquestra-web`.
28
- - Si **ya tienes** uno o varios: te deja elegir cuál usar por default
29
- desde la misma terminal.
36
+ **2. Regístralo en tu agente** (ver abajo: Claude Code, Claude Desktop, Cursor, Codex,
37
+ Gemini CLI). Usa `orquestra-mcp@latest` para que `npx` no se quede con una versión vieja
38
+ de su caché.
30
39
 
31
- Guarda todo (`apiToken`, `workspaceId`, `defaultProjectId`) en
32
- `~/.orquestra/mcp-config.json` — después de esto, `node bin/orquestra-mcp.mjs`
33
- (sin más flags ni env vars) ya funciona.
40
+ **Ver la versión / actualizar:** `npm view orquestra-mcp version` muestra la última
41
+ publicada. Con `@latest` cada arranque la usa; el servidor que ya está corriendo conserva
42
+ la suya hasta que reconectas (en Claude Code: `/mcp` → reconectar).
34
43
 
35
44
  Variable opcional `ORQUESTRA_WEB_URL` para apuntar el login a otro lugar
36
45
  (ej. `http://localhost:5173` mientras desarrollas `orquestra-web` local en
@@ -71,35 +80,57 @@ Variables de entorno (todas opcionales si ya corriste `setup` — se leen de
71
80
 
72
81
  ### Claude Code
73
82
 
74
- Si ya corriste `setup`, alcanza con:
83
+ macOS / Linux:
75
84
 
76
85
  ```bash
77
- claude mcp add orquestra -- node /ruta/absoluta/a/orquestra-mcp/bin/orquestra-mcp.mjs
86
+ claude mcp add orquestra -- npx -y orquestra-mcp@latest
78
87
  ```
79
88
 
80
- O manual, sin `setup`:
89
+ Windows (PowerShell) — `npx` necesita `cmd /c` delante:
81
90
 
82
- ```bash
83
- claude mcp add orquestra \
84
- -e ORQUESTRA_API_TOKEN=orq_... \
85
- -e ORQUESTRA_WORKSPACE_ID=... \
86
- -- node /ruta/absoluta/a/orquestra-mcp/bin/orquestra-mcp.mjs
91
+ ```powershell
92
+ claude mcp add orquestra -- cmd /c npx -y orquestra-mcp@latest
87
93
  ```
88
94
 
95
+ Agrega `--scope user` después de `add` para tenerlo en todos tus proyectos. Si PowerShell
96
+ dice que `claude` no se reconoce, falta instalar Claude Code:
97
+ `npm install -g @anthropic-ai/claude-code` (y vuelve a abrir la terminal). Si ya lo habías
98
+ agregado sin `@latest`, primero `claude mcp remove orquestra`.
99
+
89
100
  ### Claude Desktop (`claude_desktop_config.json`)
90
101
 
102
+ - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
103
+ - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
104
+
91
105
  ```json
92
106
  {
93
107
  "mcpServers": {
94
108
  "orquestra": {
95
- "command": "node",
96
- "args": ["/ruta/absoluta/a/orquestra-mcp/bin/orquestra-mcp.mjs"]
109
+ "command": "npx",
110
+ "args": ["-y", "orquestra-mcp@latest"]
97
111
  }
98
112
  }
99
113
  }
100
114
  ```
101
115
 
102
- (sin `env` si ya corriste `setup`; si no, agrega `ORQUESTRA_API_TOKEN`/`ORQUESTRA_WORKSPACE_ID` igual que en Claude Code.)
116
+ Cierra la app por completo (en Windows también desde el ícono junto al reloj) y vuelve a
117
+ abrirla.
118
+
119
+ ### Cursor, Codex CLI, Gemini CLI
120
+
121
+ Mismo comando (`npx -y orquestra-mcp@latest`), cambia el archivo — ver
122
+ [orquestra.me/mcp#instalacion](https://www.orquestra.me/mcp#instalacion). En Windows, si
123
+ el agente no encuentra `npx`, usa `"command": "cmd"` con
124
+ `"args": ["/c", "npx", "-y", "orquestra-mcp@latest"]`.
125
+
126
+ ### Sin `setup` (variables de entorno)
127
+
128
+ ```bash
129
+ claude mcp add orquestra \
130
+ -e ORQUESTRA_API_TOKEN=orq_... \
131
+ -e ORQUESTRA_WORKSPACE_ID=... \
132
+ -- npx -y orquestra-mcp@latest
133
+ ```
103
134
 
104
135
  ## Tools
105
136
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
3
- import { createServer } from '../src/server.mjs'
3
+ import { createServer, createSetupNeededServer } from '../src/server.mjs'
4
4
  import { runSetup } from '../src/setup.mjs'
5
5
  import { runVaultSync } from '../src/vaultSync.mjs'
6
6
 
@@ -9,7 +9,7 @@ const HELP_TEXT = `orquestra-mcp -- Servidor MCP de Orquestra (132 tools)
9
9
  Uso:
10
10
  npx orquestra-mcp Inicia el servidor MCP por stdio -- lo usa tu cliente
11
11
  MCP (Claude Code, Claude Desktop, etc.), no se corre a mano
12
- npx orquestra-mcp setup Login por navegador + configura tu proyecto default
12
+ npx orquestra-mcp setup Login por navegador + conecta esta carpeta a un proyecto
13
13
  npx orquestra-mcp vault sync <carpeta> [--apply]
14
14
  Sincroniza la base de conocimiento del workspace con una
15
15
  carpeta de tu vault de Obsidian (la 1ra vez solo muestra el plan)
@@ -50,7 +50,7 @@ async function main() {
50
50
  server = createServer()
51
51
  } catch (err) {
52
52
  console.error(`[orquestra-mcp] ${err.message}`)
53
- process.exit(1)
53
+ server = createSetupNeededServer(err.message)
54
54
  }
55
55
 
56
56
  const transport = new StdioServerTransport()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orquestra-mcp",
3
- "version": "1.46.0",
3
+ "version": "1.46.1",
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/api.mjs CHANGED
@@ -27,12 +27,15 @@ export function loadConfig() {
27
27
  if (!apiToken) missing.push('ORQUESTRA_API_TOKEN')
28
28
  if (!workspaceId) missing.push('ORQUESTRA_WORKSPACE_ID')
29
29
  if (missing.length) {
30
+ const folders = Object.keys(fileConfig?.projects || {})
30
31
  throw new Error(
31
- `Faltan variables de entorno requeridas: ${missing.join(', ')} (y no hay config en ${CONFIG_PATH}). ` +
32
- `Corre "npx orquestra-mcp setup" para conectarlo con tu cuenta -- crea un workspace/proyecto ` +
33
- `default si no tienes uno, o te deja elegir uno existente. Alternativa manual: 1) cuenta+workspace ` +
34
- `ya creados en orquestra-web, 2) generar un token con POST ${apiBase}/v1/tokens con tu ID token ` +
35
- `de Firebase, y 3) pasar ese token + el workspaceId acá.`
32
+ `Esta carpeta (${process.cwd()}) no está conectada a Orquestra. ` +
33
+ (folders.length
34
+ ? `Carpetas conectadas en ${CONFIG_PATH}: ${folders.join(' | ')}. `
35
+ : `No hay ninguna carpeta conectada (${CONFIG_PATH} no existe o está vacío). `) +
36
+ `Solución: abre una terminal en esta carpeta y corre "npx orquestra-mcp@latest setup" ` +
37
+ `(o ábrela desde una carpeta que ya esté conectada), y después reconecta el MCP. ` +
38
+ `Alternativa sin setup: variables de entorno ${missing.join(' y ')}.`
36
39
  )
37
40
  }
38
41
 
@@ -1,6 +1,6 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'
2
2
  import { homedir } from 'os'
3
- import { join, dirname, sep } from 'path'
3
+ import { join, dirname, win32, posix } from 'path'
4
4
 
5
5
  export const CONFIG_PATH = join(homedir(), '.orquestra', 'mcp-config.json')
6
6
 
@@ -63,13 +63,27 @@ export function upsertProjectMapping({ apiBase, apiToken, workspaceId, folderPat
63
63
  // gana, así que un repo individual con su propio mapeo (y su propia cuenta)
64
64
  // puede sobreescribir el de la carpeta contenedora que lo engloba. Devuelve
65
65
  // el objeto {apiBase, apiToken, workspaceId, projectId} de esa carpeta.
66
- export function resolveProjectForCwd(projects, cwd) {
66
+ // En Windows las rutas no distinguen mayúsculas, y VS Code arranca el
67
+ // servidor con la unidad en minúscula ("c:\Users\...") aunque setup haya
68
+ // guardado "C:\Users\..." (o con "/" en vez de "\"). Comparar exacto hacía
69
+ // que no encontrara la carpeta y el servidor se cerrara al arrancar
70
+ // ("Connection closed" en Claude Code, 21 oct 2026). `platform` es para tests.
71
+ export function folderKey(folderPath, platform = process.platform) {
72
+ const isWin = platform === 'win32'
73
+ const resolved = (isWin ? win32 : posix).resolve(folderPath)
74
+ const trimmed = resolved.length > 1 && !/^[a-z]:\\$/i.test(resolved) ? resolved.replace(/[\\/]+$/, '') : resolved
75
+ return isWin ? trimmed.toLowerCase() : trimmed
76
+ }
77
+
78
+ export function resolveProjectForCwd(projects, cwd, platform = process.platform) {
67
79
  if (!projects) return undefined
80
+ const sep = platform === 'win32' ? '\\' : '/'
81
+ const target = folderKey(cwd, platform)
68
82
  let best = null
69
83
  for (const folderPath of Object.keys(projects)) {
70
- const normalized = folderPath.endsWith(sep) ? folderPath.slice(0, -1) : folderPath
71
- if (cwd !== normalized && !cwd.startsWith(normalized + sep)) continue
72
- if (!best || normalized.length > best.length) best = normalized
84
+ const key = folderKey(folderPath, platform)
85
+ if (target !== key && !target.startsWith(key.endsWith(sep) ? key : key + sep)) continue
86
+ if (!best || key.length > best.key.length) best = { key, folderPath }
73
87
  }
74
- return best ? projects[best] : undefined
88
+ return best ? projects[best.folderPath] : undefined
75
89
  }
package/src/server.mjs CHANGED
@@ -161,6 +161,22 @@ const SCOPE_EVIDENCE = {
161
161
  notApplicableReason: z.string().optional().describe('Motivo de "no aplica" (obligatorio si notApplicable es true)'),
162
162
  }
163
163
 
164
+ // Sin conexión para la carpeta (loadConfig falló): antes el proceso se cerraba
165
+ // y el cliente solo mostraba "Connection closed", sin el motivo. Ahora arranca
166
+ // con una sola tool que explica qué pasa y cómo arreglarlo, para que el agente
167
+ // se lo diga al usuario.
168
+ export function createSetupNeededServer(reason) {
169
+ const server = new McpServer(
170
+ { name: 'orquestra-mcp', version: PKG_VERSION },
171
+ { instructions: `Orquestra no está conectado en esta carpeta, así que sus herramientas no están disponibles. Si el usuario pide algo de Orquestra, llama a diagnostico_conexion y explícale cómo arreglarlo. Motivo: ${reason}` },
172
+ )
173
+ server.registerTool('diagnostico_conexion', {
174
+ description: 'Explica por qué Orquestra no está conectado en esta carpeta y cómo arreglarlo.',
175
+ inputSchema: {},
176
+ }, async () => ({ content: [{ type: 'text', text: `orquestra-mcp ${PKG_VERSION}: ${reason}` }] }))
177
+ return server
178
+ }
179
+
164
180
  export function createServer() {
165
181
  const config = loadConfig()
166
182
  const server = new McpServer({ name: 'orquestra-mcp', version: PKG_VERSION }, { instructions: SERVER_INSTRUCTIONS })
package/src/setup.mjs CHANGED
@@ -175,11 +175,17 @@ export async function runSetup() {
175
175
 
176
176
  upsertProjectMapping({ apiBase, apiToken: token, workspaceId, folderPath, projectId: defaultProjectId })
177
177
  console.log(`\nListo. "${folderPath}" (y sus subcarpetas) ya apunta a este proyecto -- guardado en ${CONFIG_PATH}.`)
178
+ // En Windows Claude Code necesita `cmd /c` para lanzar npx, y el config de
179
+ // Claude Desktop vive en %APPDATA%. `@latest` evita que npx reuse una
180
+ // versión vieja de su caché.
181
+ const isWindows = process.platform === 'win32'
178
182
  console.log('\nSiguiente paso -- conéctalo a tu agente de IA:\n')
179
183
  console.log(' Claude Code:')
180
- console.log(' claude mcp add orquestra -- npx orquestra-mcp\n')
181
- console.log(' Claude Desktop -- agrega esto a tu claude_desktop_config.json:')
182
- console.log(' { "mcpServers": { "orquestra": { "command": "npx", "args": ["orquestra-mcp"] } } }\n')
184
+ console.log(` claude mcp add orquestra -- ${isWindows ? 'cmd /c ' : ''}npx -y orquestra-mcp@latest`)
185
+ if (isWindows) console.log(' (si "claude" no se reconoce: npm install -g @anthropic-ai/claude-code y abre otra terminal)')
186
+ console.log(' Después reinicia Claude Code o reconéctalo con /mcp.\n')
187
+ console.log(` Claude Desktop -- agrega esto a ${isWindows ? '%APPDATA%\\Claude\\' : '~/Library/Application Support/Claude/'}claude_desktop_config.json:`)
188
+ console.log(' { "mcpServers": { "orquestra": { "command": "npx", "args": ["-y", "orquestra-mcp@latest"] } } }\n')
183
189
  console.log(' ¿Usas Cursor, ChatGPT/Codex o Gemini CLI? La config de cada uno está en:')
184
190
  console.log(' https://www.orquestra.me/mcp#instalacion\n')
185
191
  console.log('Docs completas y todas las tools disponibles: https://www.orquestra.me/mcp')