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 +55 -24
- package/bin/orquestra-mcp.mjs +3 -3
- package/package.json +1 -1
- package/src/api.mjs +8 -5
- package/src/configFile.mjs +20 -6
- package/src/server.mjs +16 -0
- package/src/setup.mjs +9 -3
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
|
-
##
|
|
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
|
-
|
|
19
|
-
node bin/orquestra-mcp.mjs setup
|
|
22
|
+
npx orquestra-mcp@latest setup
|
|
20
23
|
```
|
|
21
24
|
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
(
|
|
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
|
-
|
|
83
|
+
macOS / Linux:
|
|
75
84
|
|
|
76
85
|
```bash
|
|
77
|
-
claude mcp add orquestra --
|
|
86
|
+
claude mcp add orquestra -- npx -y orquestra-mcp@latest
|
|
78
87
|
```
|
|
79
88
|
|
|
80
|
-
|
|
89
|
+
Windows (PowerShell) — `npx` necesita `cmd /c` delante:
|
|
81
90
|
|
|
82
|
-
```
|
|
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": "
|
|
96
|
-
"args": ["
|
|
109
|
+
"command": "npx",
|
|
110
|
+
"args": ["-y", "orquestra-mcp@latest"]
|
|
97
111
|
}
|
|
98
112
|
}
|
|
99
113
|
}
|
|
100
114
|
```
|
|
101
115
|
|
|
102
|
-
|
|
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
|
|
package/bin/orquestra-mcp.mjs
CHANGED
|
@@ -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 +
|
|
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
|
-
|
|
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.
|
|
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
|
-
`
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
`
|
|
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
|
|
package/src/configFile.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'
|
|
2
2
|
import { homedir } from 'os'
|
|
3
|
-
import { join, dirname,
|
|
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
|
-
|
|
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
|
|
71
|
-
if (
|
|
72
|
-
if (!best ||
|
|
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(
|
|
181
|
-
console.log('
|
|
182
|
-
console.log('
|
|
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')
|