@groundfloorcloud/mcp 0.1.0 → 0.1.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 +25 -2
- package/dist/index.js +22 -8
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -22,6 +22,8 @@ Switch workspace: `gf workspaces use <uuid>` (then MCP sees it). Expired session
|
|
|
22
22
|
|
|
23
23
|
`gf` must be on `PATH` and you must have run `gf login` (and usually `gf workspaces use`).
|
|
24
24
|
|
|
25
|
+
Clients that spawn a real Node (Claude Code, some IDEs) can use:
|
|
26
|
+
|
|
25
27
|
```json
|
|
26
28
|
{
|
|
27
29
|
"mcpServers": {
|
|
@@ -33,7 +35,28 @@ Switch workspace: `gf workspaces use <uuid>` (then MCP sees it). Expired session
|
|
|
33
35
|
}
|
|
34
36
|
```
|
|
35
37
|
|
|
36
|
-
|
|
38
|
+
**Cursor on macOS:** do not use bare `npx`. Cursor runs npm with its bundled Node, which then looks for `Cursor.app/.../resources/lib` and fails with `ENOENT`. Install the package with *your* Node, then point MCP at that binary:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm i -g @groundfloorcloud/mcp
|
|
42
|
+
which node
|
|
43
|
+
# → /Users/you/.nvm/versions/node/v20.x.x/bin/node
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"mcpServers": {
|
|
49
|
+
"groundfloor": {
|
|
50
|
+
"command": "/FULL/PATH/TO/node",
|
|
51
|
+
"args": [
|
|
52
|
+
"/FULL/PATH/TO/lib/node_modules/@groundfloorcloud/mcp/dist/index.js"
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The `command` must be your Node (from `which node`), not `npx` and not Cursor’s helper Node. Do not put a JWT in mcp.json.
|
|
37
60
|
|
|
38
61
|
## Tools
|
|
39
62
|
|
|
@@ -45,7 +68,7 @@ Optional: `"GROUNDFLOOR_API_URL"` only if you are not using the cell from `gf lo
|
|
|
45
68
|
| `apps_list` / `apps_get` | Inspect product Apps |
|
|
46
69
|
| `secrets_list` / `files_list` / `domains_list` / `dataplane_status` | Inspect (no secrets values) |
|
|
47
70
|
| `docs_list` / `docs_get` | Product docs |
|
|
48
|
-
| `suggest_cli` | Command to run: login, deploy,
|
|
71
|
+
| `suggest_cli` | Command to run: login, deploy, init_app, publish_app, … |
|
|
49
72
|
|
|
50
73
|
Never create `app_kind=coderunner`. Deploy with `gf deploy`.
|
|
51
74
|
|
package/dist/index.js
CHANGED
|
@@ -296,17 +296,20 @@ var CELLS = {
|
|
|
296
296
|
production: {
|
|
297
297
|
apiUrl: "https://platform.groundfloor.cloud",
|
|
298
298
|
issuer: "https://auth.groundfloor.cloud/realms/groundfloor",
|
|
299
|
-
clientId: "groundfloor-cli"
|
|
299
|
+
clientId: "groundfloor-cli",
|
|
300
|
+
consoleUrl: "https://console.groundfloor.cloud"
|
|
300
301
|
},
|
|
301
302
|
stage: {
|
|
302
303
|
apiUrl: "https://platform.stage.groundfloor.cloud",
|
|
303
304
|
issuer: "https://auth.stage.groundfloor.cloud/realms/groundfloor_pico_stage-realm",
|
|
304
|
-
clientId: "groundfloor-cli"
|
|
305
|
+
clientId: "groundfloor-cli",
|
|
306
|
+
consoleUrl: "https://console.stage.groundfloor.cloud"
|
|
305
307
|
},
|
|
306
308
|
dev: {
|
|
307
309
|
apiUrl: "https://platform.dev.groundfloor.cloud",
|
|
308
310
|
issuer: "https://auth.dev.groundfloor.cloud/realms/groundfloor_dev",
|
|
309
|
-
clientId: "groundfloor-cli"
|
|
311
|
+
clientId: "groundfloor-cli",
|
|
312
|
+
consoleUrl: "https://console.dev.groundfloor.cloud"
|
|
310
313
|
}
|
|
311
314
|
};
|
|
312
315
|
function inferCell(apiUrl, issuer) {
|
|
@@ -384,7 +387,7 @@ var DOC_CATALOG = [
|
|
|
384
387
|
id: "agents",
|
|
385
388
|
title: "Deploy with agents",
|
|
386
389
|
path: "/docs/customer-portal/agents",
|
|
387
|
-
summary: "How agents should deploy Coderunner workloads with gf / MCP."
|
|
390
|
+
summary: "How agents should deploy Coderunner workloads and init/publish Shell apps with gf / MCP."
|
|
388
391
|
},
|
|
389
392
|
{
|
|
390
393
|
id: "developers",
|
|
@@ -479,10 +482,18 @@ function suggestCli(intent, args) {
|
|
|
479
482
|
why: "Inspect build/deploy state.",
|
|
480
483
|
docs: "https://docs.groundfloor.cloud/docs/customer-portal/coderunner"
|
|
481
484
|
};
|
|
485
|
+
case "init_app": {
|
|
486
|
+
const slug = args?.slug?.trim();
|
|
487
|
+
return {
|
|
488
|
+
command: slug ? `gf apps init --slug ${slug}` : "gf apps init --slug <portal-slug>",
|
|
489
|
+
why: "Download the official Shell starter-kit and stamp APP_ID. Never scaffold a federated App.tsx from memory \u2014 BrowserRouter in App.tsx crashes the Shell.",
|
|
490
|
+
docs: "https://docs.groundfloor.cloud/docs/integrations/shell"
|
|
491
|
+
};
|
|
492
|
+
}
|
|
482
493
|
case "publish_app":
|
|
483
494
|
return {
|
|
484
|
-
command: "gf apps publish --path release.zip",
|
|
485
|
-
why: "Ship a Shell federated product App (not
|
|
495
|
+
command: args?.slug ? `gf apps init --slug ${args.slug} && cd ${args.slug} && npm install && npm run release && gf apps publish --path release.zip` : "gf apps init --slug <portal-slug> && cd <slug> && npm install && npm run release && gf apps publish --path release.zip",
|
|
496
|
+
why: "Ship a Shell federated product App. Init the starter-kit first; run npm run release (do not zip Vite dist/). Do not gf deploy and do not invent App.tsx.",
|
|
486
497
|
docs: "https://docs.groundfloor.cloud/docs/integrations/shell"
|
|
487
498
|
};
|
|
488
499
|
case "secrets":
|
|
@@ -500,7 +511,7 @@ function suggestCli(intent, args) {
|
|
|
500
511
|
default:
|
|
501
512
|
return {
|
|
502
513
|
command: "gf --help",
|
|
503
|
-
why: `Unknown intent "${intent}". Use login | switch_workspace | deploy | run | status | publish_app | secrets | dataplane.`,
|
|
514
|
+
why: `Unknown intent "${intent}". Use login | switch_workspace | deploy | run | status | init_app | publish_app | secrets | dataplane.`,
|
|
504
515
|
docs: "https://docs.groundfloor.cloud/docs/customer-portal/developers"
|
|
505
516
|
};
|
|
506
517
|
}
|
|
@@ -838,12 +849,14 @@ server.tool(
|
|
|
838
849
|
"deploy",
|
|
839
850
|
"run",
|
|
840
851
|
"status",
|
|
852
|
+
"init_app",
|
|
841
853
|
"publish_app",
|
|
842
854
|
"secrets",
|
|
843
855
|
"dataplane"
|
|
844
856
|
]),
|
|
845
857
|
workspace: z.string().optional(),
|
|
846
858
|
name: z.string().optional().describe("Coderunner name/id for deploy/run/status"),
|
|
859
|
+
slug: z.string().optional().describe("Portal app slug for init_app / publish_app"),
|
|
847
860
|
cell: z.enum(["production", "stage", "dev"]).optional()
|
|
848
861
|
},
|
|
849
862
|
async (args) => {
|
|
@@ -852,7 +865,8 @@ server.tool(
|
|
|
852
865
|
workspace: args.workspace ?? "",
|
|
853
866
|
name: args.name ?? "",
|
|
854
867
|
coderunner: args.name ?? "",
|
|
855
|
-
cell: args.cell ?? ""
|
|
868
|
+
cell: args.cell ?? "",
|
|
869
|
+
slug: args.slug ?? ""
|
|
856
870
|
})
|
|
857
871
|
);
|
|
858
872
|
}
|