alora-mcp 0.8.0 → 0.10.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 +17 -9
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alora-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.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.10.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) => ({
|
|
@@ -50,7 +50,11 @@ server.registerTool('account_create_and_connect', {
|
|
|
50
50
|
email: z.string().describe('El email que el usuario te dio en el chat'),
|
|
51
51
|
agent_name: z.string().optional().describe('Cómo se llama este agente, ej: "Claude de Ana"'),
|
|
52
52
|
},
|
|
53
|
-
}, wrap(({ email, agent_name }) =>
|
|
53
|
+
}, wrap(({ email, agent_name }) => {
|
|
54
|
+
let old;
|
|
55
|
+
try { old = JSON.parse(readFileSync(CONFIG_FILE, 'utf8')).token; } catch {}
|
|
56
|
+
return client().signupStart(email, agent_name || 'agente MCP', old);
|
|
57
|
+
}));
|
|
54
58
|
|
|
55
59
|
server.registerTool('account_connect_poll', {
|
|
56
60
|
description: 'Después de account_create_and_connect: llamá esto cada ~5s con el device_code. Cuando el usuario toque el email devuelve approved y GUARDA el token automáticamente — desde ahí todas las demás tools funcionan. expired = el link venció sin click: pedile al usuario que revise el inbox y volvé a empezar.',
|
|
@@ -68,9 +72,9 @@ server.registerTool('account_connect_poll', {
|
|
|
68
72
|
}));
|
|
69
73
|
|
|
70
74
|
server.registerTool('list_projects', {
|
|
71
|
-
description: 'Lista los proyectos del workspace con URL, versión activa y estado.',
|
|
72
|
-
inputSchema: {},
|
|
73
|
-
}, 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 })));
|
|
74
78
|
|
|
75
79
|
server.registerTool('create_project', {
|
|
76
80
|
description: 'Crea un proyecto nuevo (una app con su URL propia). El nombre: minúsculas, números y guiones.',
|
|
@@ -85,8 +89,9 @@ server.registerTool('deploy', {
|
|
|
85
89
|
message: z.string().optional().describe('Mensaje corto describiendo el cambio'),
|
|
86
90
|
build: z.string().optional().describe('Comando a correr antes (en el directorio del proyecto), ej: "npm run build"'),
|
|
87
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.'),
|
|
88
93
|
},
|
|
89
|
-
}, wrap(async ({ project, dir, message, build, base_version }) => {
|
|
94
|
+
}, wrap(async ({ project, dir, message, build, base_version, runtime }) => {
|
|
90
95
|
if (build) {
|
|
91
96
|
const { execSync } = await import('node:child_process');
|
|
92
97
|
execSync(build, { cwd: dir, stdio: 'ignore' });
|
|
@@ -101,7 +106,7 @@ server.registerTool('deploy', {
|
|
|
101
106
|
);
|
|
102
107
|
const buffer = readFileSync(tmpFile);
|
|
103
108
|
rmSync(tmpFile, { force: true });
|
|
104
|
-
return client().deploy(project, buffer, { message, base_version });
|
|
109
|
+
return client().deploy(project, buffer, { message, base_version, runtime });
|
|
105
110
|
}));
|
|
106
111
|
|
|
107
112
|
server.registerTool('preview', {
|
|
@@ -263,8 +268,11 @@ server.registerTool('ai_status', {
|
|
|
263
268
|
|
|
264
269
|
server.registerTool('ai_enable', {
|
|
265
270
|
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 corre `claude setup-token` + `alora ai connect` una vez). 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.',
|
|
266
|
-
inputSchema: {
|
|
267
|
-
|
|
271
|
+
inputSchema: {
|
|
272
|
+
project: z.string(),
|
|
273
|
+
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.'),
|
|
274
|
+
},
|
|
275
|
+
}, wrap(({ project, model }) => client().aiSetProject(project, true, model)));
|
|
268
276
|
|
|
269
277
|
server.registerTool('ai_disable', {
|
|
270
278
|
description: 'Deshabilita la IA en un proyecto: la app se reinicia sin la credencial de Claude.',
|