alora-mcp 0.7.0 → 0.8.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/README.md +8 -5
- package/package.json +2 -2
- package/src/index.js +15 -6
package/README.md
CHANGED
|
@@ -26,13 +26,15 @@ Or in any MCP client's JSON config:
|
|
|
26
26
|
}
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
## Connect (
|
|
29
|
+
## Connect (one email, one click)
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
2. Run `npx alora-cli connect` in your terminal — it prints a code.
|
|
33
|
-
3. Paste the code at [alora.build/activate](https://alora.build/activate).
|
|
31
|
+
Just ask your agent to set you up. It asks for your email and calls the `account_create_and_connect` tool — you get **a single email, and one click** creates your account ($0.50 of free credit included, no card), verifies it, and authorizes the agent. No password to invent; you log into the panel later with a magic link.
|
|
34
32
|
|
|
35
|
-
The
|
|
33
|
+
Already have an account? The same flow sends you an authorize link instead — one click never creates or touches an existing account without you signing in.
|
|
34
|
+
|
|
35
|
+
Prefer the classic way? Create an account at [alora.build/register](https://alora.build/register), run `npx alora-cli connect`, and paste the code at [alora.build/activate](https://alora.build/activate).
|
|
36
|
+
|
|
37
|
+
Either way the token lands in `~/.alora/config.json`, and from then on your agent takes it from here. Full playbook for agents: [alora.build/llms.txt](https://alora.build/llms.txt).
|
|
36
38
|
|
|
37
39
|
## What your agent can do (45 tools)
|
|
38
40
|
|
|
@@ -45,6 +47,7 @@ The token lands in `~/.alora/config.json`, and from then on your agent takes it
|
|
|
45
47
|
| **Configure** | `secrets_set` (encrypted, injected as env) · `domain_connect` · `egress_ip_allocate` (static egress IP) |
|
|
46
48
|
| **Use AI inside the app** | `ai_enable` — the deployed app runs `claude -p` with the owner's own Claude account |
|
|
47
49
|
| **Buy domains** | `domain_search` · `domain_buy` — always gated on the owner's approval by email |
|
|
50
|
+
| **Be an MCP server** | your deployed app can expose its own `/mcp` endpoint, with per-customer tokens (`token_create`) and identity headers — an [MCP-first SaaS in one deploy](https://alora.build/blog/host-mcp-server) |
|
|
48
51
|
| **Know what's happening** | `analytics_summary` · `analytics_users` · `wallet_balance` · `changelog` |
|
|
49
52
|
|
|
50
53
|
## How it behaves
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alora-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.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.8.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.8.0' });
|
|
22
22
|
|
|
23
23
|
const ok = (data) => ({ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] });
|
|
24
24
|
const asError = (e) => ({
|
|
@@ -151,9 +151,14 @@ server.registerTool('logs', {
|
|
|
151
151
|
}, wrap(({ project, lines, since }) => client().logs(project, { lines, since })));
|
|
152
152
|
|
|
153
153
|
server.registerTool('exec', {
|
|
154
|
-
description: 'Ejecuta
|
|
155
|
-
inputSchema: {
|
|
156
|
-
|
|
154
|
+
description: 'Ejecuta dentro de la MISMA microVM donde corre la app (cwd /app; despierta la máquina si duerme). Devuelve stdout/stderr/exit_code. Dos modos: command (string, pasa por sh) o argv (array LITERAL sin shell — usalo para comandos con quoting complejo o multilínea; nada se re-parsea). stdin_b64 se pipea al proceso (ideal para escribir archivos: argv ["tee","/data/x.py"] + stdin_b64 del contenido). Claves: solo $DATA_DIR sobrevive reinicios (/app se reconstruye del bundle en cada boot); tu app escucha en 127.0.0.1:8081; el guard en 8080 exige el header x-alora-proxy-auth con $ALORA_PROXY_SECRET (está en el env de la VM) — para pegarle a un endpoint propio: curl -H "x-alora-proxy-auth: $ALORA_PROXY_SECRET" http://127.0.0.1:8080/ruta.',
|
|
155
|
+
inputSchema: {
|
|
156
|
+
project: z.string(),
|
|
157
|
+
command: z.string().optional().describe('Comando via sh (modo simple)'),
|
|
158
|
+
argv: z.array(z.string()).optional().describe('Comando como array literal, sin shell (modo seguro para quoting)'),
|
|
159
|
+
stdin_b64: z.string().optional().describe('Contenido en base64 para pipear al stdin del proceso'),
|
|
160
|
+
},
|
|
161
|
+
}, wrap(({ project, command, argv, stdin_b64 }) => client().exec(project, { command, argv, stdin_b64 })));
|
|
157
162
|
|
|
158
163
|
server.registerTool('restart', {
|
|
159
164
|
description: 'Reinicia la app sin redesplegar (útil para aplicar un cambio de estado o salir de un cuelgue).',
|
|
@@ -182,8 +187,12 @@ server.registerTool('egress_ip_release', {
|
|
|
182
187
|
|
|
183
188
|
server.registerTool('token_create', {
|
|
184
189
|
description: 'Crea un token de acceso por proyecto que BYPASSEA el login: un script/webhook/backup externo puede pegarle a la URL de la app con Authorization: Bearer <token> sin SSO. Scoped a este proyecto y revocable. La app lo ve con x-alora-user-role: service. El token se muestra una sola vez.',
|
|
185
|
-
inputSchema: {
|
|
186
|
-
|
|
190
|
+
inputSchema: {
|
|
191
|
+
project: z.string(),
|
|
192
|
+
name: z.string().optional(),
|
|
193
|
+
paths: z.array(z.string()).optional().describe('Scoping: prefijos de ruta que el token puede tocar, ej ["/export","/api/hook"]. Sin paths vale para toda la app.'),
|
|
194
|
+
},
|
|
195
|
+
}, wrap(({ project, name, paths }) => client().tokenCreate(project, name, paths)));
|
|
187
196
|
|
|
188
197
|
server.registerTool('list_versions', {
|
|
189
198
|
description: 'Historial de versiones del proyecto, con autor y mensaje.',
|