@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.
Files changed (3) hide show
  1. package/README.md +25 -2
  2. package/dist/index.js +22 -8
  3. 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
- Optional: `"GROUNDFLOOR_API_URL"` only if you are not using the cell from `gf login`. Do not put a JWT in mcp.json.
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, run, … |
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 a Coderunner workload).",
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groundfloorcloud/mcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Groundfloor MCP — inspect workspace state and docs; take actions with the gf CLI.",
5
5
  "type": "module",
6
6
  "bin": {