alora-mcp 0.9.0 → 0.11.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.
- package/package.json +2 -2
- package/src/index.js +19 -10
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alora-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "MCP server for Alora, the cloud where your agent works — deploy, preview, share and run the apps your agent writes. Claude Code, Codex, Cursor and any MCP client.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"alora-mcp": "src/index.js"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"alora-sdk": "^0.
|
|
10
|
+
"alora-sdk": "^0.11.0",
|
|
11
11
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
12
12
|
"tar": "^7.4.3",
|
|
13
13
|
"zod": "^3.24.0"
|
package/src/index.js
CHANGED
|
@@ -18,7 +18,7 @@ function client() {
|
|
|
18
18
|
return new AloraClient({ api: cfg.api || 'https://api.alora.build', token: cfg.token });
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
const server = new McpServer({ name: 'alora', version: '0.
|
|
21
|
+
const server = new McpServer({ name: 'alora', version: '0.10.0' });
|
|
22
22
|
|
|
23
23
|
const ok = (data) => ({ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] });
|
|
24
24
|
const asError = (e) => ({
|
|
@@ -72,9 +72,9 @@ server.registerTool('account_connect_poll', {
|
|
|
72
72
|
}));
|
|
73
73
|
|
|
74
74
|
server.registerTool('list_projects', {
|
|
75
|
-
description: 'Lista los proyectos del workspace con URL, versión activa y estado.',
|
|
76
|
-
inputSchema: {},
|
|
77
|
-
}, wrap(() => client().listProjects()));
|
|
75
|
+
description: 'Lista los proyectos del workspace con URL, versión activa y estado. all=true incluye los de la papelera con su fecha de purga (si un proyecto "desapareció", mirá ahí).',
|
|
76
|
+
inputSchema: { all: z.boolean().optional() },
|
|
77
|
+
}, wrap(({ all }) => client().listProjects({ all })));
|
|
78
78
|
|
|
79
79
|
server.registerTool('create_project', {
|
|
80
80
|
description: 'Crea un proyecto nuevo (una app con su URL propia). El nombre: minúsculas, números y guiones.',
|
|
@@ -89,8 +89,9 @@ server.registerTool('deploy', {
|
|
|
89
89
|
message: z.string().optional().describe('Mensaje corto describiendo el cambio'),
|
|
90
90
|
build: z.string().optional().describe('Comando a correr antes (en el directorio del proyecto), ej: "npm run build"'),
|
|
91
91
|
base_version: z.number().optional().describe('Versión de la que partiste: si otro agente desplegó mientras tanto, falla con version_conflict en vez de pisar su trabajo'),
|
|
92
|
+
runtime: z.enum(['node', 'python', 'static']).optional().describe('Forzar el runtime cuando la detección no alcanza (sin package.json/requirements.txt). La respuesta trae detection/files/warning: LEELOS — un "static" sin index.html es un 404 seguro.'),
|
|
92
93
|
},
|
|
93
|
-
}, wrap(async ({ project, dir, message, build, base_version }) => {
|
|
94
|
+
}, wrap(async ({ project, dir, message, build, base_version, runtime }) => {
|
|
94
95
|
if (build) {
|
|
95
96
|
const { execSync } = await import('node:child_process');
|
|
96
97
|
execSync(build, { cwd: dir, stdio: 'ignore' });
|
|
@@ -105,7 +106,7 @@ server.registerTool('deploy', {
|
|
|
105
106
|
);
|
|
106
107
|
const buffer = readFileSync(tmpFile);
|
|
107
108
|
rmSync(tmpFile, { force: true });
|
|
108
|
-
return client().deploy(project, buffer, { message, base_version });
|
|
109
|
+
return client().deploy(project, buffer, { message, base_version, runtime });
|
|
109
110
|
}));
|
|
110
111
|
|
|
111
112
|
server.registerTool('preview', {
|
|
@@ -261,14 +262,22 @@ server.registerTool('secrets_list', {
|
|
|
261
262
|
}, wrap(({ project }) => client().secretsList(project)));
|
|
262
263
|
|
|
263
264
|
server.registerTool('ai_status', {
|
|
264
|
-
description: 'Estado del BYO Claude del workspace: si hay una cuenta de Claude conectada (suscripción o API key)
|
|
265
|
+
description: 'Estado del BYO Claude del workspace: si hay una cuenta de Claude conectada (suscripción o API key), qué proyectos tienen IA habilitada y, por proyecto, la ÚLTIMA FALLA de claude vista en sus logs (last_failures: usage_limit / invalid_credential / billing / not_installed, con fix). Las apps con IA pueden ejecutar `claude -p "prompt"` con la cuenta del dueño — pensado para proyectos personales o de poco uso. Si la app dice que "claude falla" o "la cuenta se desconectó", mirá esto ANTES de pedirle nada al humano: casi siempre es la cuota de uso agotada (usage_limit), no la credencial.',
|
|
265
266
|
inputSchema: {},
|
|
266
267
|
}, wrap(() => client().aiStatus()));
|
|
267
268
|
|
|
268
|
-
server.registerTool('
|
|
269
|
-
description: '
|
|
269
|
+
server.registerTool('ai_check', {
|
|
270
|
+
description: 'Veredicto EN VIVO de la IA de un proyecto: corre `claude -p` dentro de la VM con la cuenta conectada y devuelve ok, o kind = usage_limit (la cuota de la suscripción se agotó: esperar, cambiar de modelo con ai_enable model, o API key — reconectar NO arregla esto) / invalid_credential (solo el dueño puede renovarla en SU terminal: `npx alora-cli ai connect --setup`, es interactivo con navegador, vos no podés completarlo) / billing (API key sin saldo) / not_installed / timeout, siempre con message + fix + output (la evidencia). Usalo antes de decirle al humano que "se desconectó la cuenta". Cuesta una llamada mínima a claude.',
|
|
270
271
|
inputSchema: { project: z.string() },
|
|
271
|
-
}, wrap(({ project }) => client().
|
|
272
|
+
}, wrap(({ project }) => client().aiCheck(project)));
|
|
273
|
+
|
|
274
|
+
server.registerTool('ai_enable', {
|
|
275
|
+
description: 'Habilita IA en un proyecto (Node o Python): la microVM recibe la credencial de Claude del dueño y el CLI `claude` queda en el PATH — la app puede ejecutar `claude -p "..." --output-format json` (usá child_process/subprocess). Requiere cuenta conectada (el humano, en su terminal, corre `npx alora-cli ai connect --setup` una vez: es interactivo — abre el navegador — y solo él puede hacerlo). Si después claude falla en la app, ai_check dice por qué (cuota agotada ≠ desconectado). El primer arranque instala el CLI (~1 min); después es instantáneo. Con suscripción: solo para uso personal/bajo — el rate limit se comparte con el uso interactivo del dueño; para tráfico real conviene API key.',
|
|
276
|
+
inputSchema: {
|
|
277
|
+
project: z.string(),
|
|
278
|
+
model: z.string().optional().describe('Modelo para claude dentro de la app (alias o id que acepte el CLI, ej "opus"). Sin esto, el default del CLI. Queda como ANTHROPIC_MODEL en el env.'),
|
|
279
|
+
},
|
|
280
|
+
}, wrap(({ project, model }) => client().aiSetProject(project, true, model)));
|
|
272
281
|
|
|
273
282
|
server.registerTool('ai_disable', {
|
|
274
283
|
description: 'Deshabilita la IA en un proyecto: la app se reinicia sin la credencial de Claude.',
|