@mediamonks/canopy-cli 0.7.29 → 0.7.31

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 (43) hide show
  1. package/dist/ai-DHLnyqfq.mjs +55 -0
  2. package/dist/{ui-CeupNHNa.mjs → api-C4rMhE7i.mjs} +1 -122
  3. package/dist/{db-KTLn8J1u.mjs → db-BB6O6085.mjs} +3 -2
  4. package/dist/{deploy-CBf44bvG.mjs → deploy-B-znPE-v.mjs} +4 -2
  5. package/dist/{dev-JlzMZJow.mjs → dev-CkhBnSlv.mjs} +13 -6
  6. package/dist/dev-MoHHjQh1.mjs +2 -0
  7. package/dist/dev-server-file-Dk9pk4AR.mjs +54 -0
  8. package/dist/{dev-worker-DjJGSUGj.mjs → dev-worker-CaCsGBkn.mjs} +34 -2
  9. package/dist/docs/agent-tools.md +213 -0
  10. package/dist/docs/cli-ai.md +43 -0
  11. package/dist/docs/cli-mcp.md +88 -0
  12. package/dist/docs/cli.md +2 -0
  13. package/dist/docs/developers-agents-and-ai.md +8 -0
  14. package/dist/docs/index.json +15 -0
  15. package/dist/docs/platform-ai-usage.md +6 -4
  16. package/dist/docs/sdk-ai.md +41 -10
  17. package/dist/{docs-ZQnhFSKT.mjs → docs-YD4z70gq.mjs} +2 -2
  18. package/dist/{egress-Cn9zDfDT.mjs → egress-If_Gsx_M.mjs} +2 -1
  19. package/dist/{feedback-CNfUjjNw.mjs → feedback-Cd7Rvg9a.mjs} +3 -2
  20. package/dist/index.mjs +33 -28
  21. package/dist/{local-BA_TPWpN.mjs → local-DAYCNUyz.mjs} +3 -3
  22. package/dist/{login-MX0xq8UE.mjs → login-B-m-i8uu.mjs} +1 -1
  23. package/dist/{logs-D5RWqsWl.mjs → logs-DQQOawOG.mjs} +2 -1
  24. package/dist/mcp-GKwctfHN.mjs +457 -0
  25. package/dist/{migrations-C8yRPJIX.mjs → migrations-Czlcddyz.mjs} +1 -1
  26. package/dist/{open-BJgd0R61.mjs → open-DcaQKi1v.mjs} +1 -1
  27. package/dist/{package-DzU_2IJi.mjs → package-CiKTWo0_.mjs} +1 -1
  28. package/dist/{projects-BG7Injpb.mjs → projects-CN2YhCZn.mjs} +2 -1
  29. package/dist/{schedule-CLuksxSM.mjs → schedule-C5lMf3ny.mjs} +2 -1
  30. package/dist/{secrets-Bl3uOx4l.mjs → secrets-BSEjZnxg.mjs} +2 -1
  31. package/dist/skill/canopy/SKILL.md +10 -0
  32. package/dist/{skill-CQ4a__Ga.mjs → skill-BWmXiJAz.mjs} +2 -2
  33. package/dist/{src-C7zPhbxi.mjs → src-BkACMkol.mjs} +15 -1
  34. package/dist/{staging-D06zobnf.mjs → staging-BZVty57b.mjs} +2 -1
  35. package/dist/templates/spa/package.json +1 -1
  36. package/dist/templates/worker/package.json +1 -1
  37. package/dist/templates/worker/worker/index.ts +17 -0
  38. package/dist/{token-C_PFNqcv.mjs → token-HHlUR0CF.mjs} +2 -1
  39. package/dist/ui-C_jSc1Kz.mjs +123 -0
  40. package/dist/{upgrade-BzmIrnjs.mjs → upgrade-Cexs9KYX.mjs} +2 -2
  41. package/dist/{usage-CV7TjTO8.mjs → usage-CUYrWxv0.mjs} +2 -1
  42. package/package.json +4 -2
  43. package/dist/dev-DGCu9MjB.mjs +0 -2
@@ -0,0 +1,88 @@
1
+ ---
2
+ title: canopy mcp
3
+ description: Let AI agents use a project's backend as MCP tools — check access, print client config, and run the stdio server.
4
+ ---
5
+
6
+ `canopy mcp` connects AI agents (Claude Code, Claude Desktop, Cursor, any MCP
7
+ client) to a project's tools. The agent always acts as you. See
8
+ [Agent tools](https://docs.canopy.website/guides/agent-tools) for how a project offers tools.
9
+
10
+ ## Usage
11
+
12
+ ```bash
13
+ canopy mcp add [slug] [--channel staging]
14
+ canopy mcp serve [slug] [--channel staging] [--local]
15
+ ```
16
+
17
+ ## canopy mcp add
18
+
19
+ Checks that you're signed in and may open the project, reports how many tools
20
+ it serves, and prints configuration for your client: a `claude mcp add` line
21
+ for Claude Code, and an `mcpServers` JSON block for Claude Desktop, Cursor and
22
+ others. It writes nothing; copy what you need.
23
+
24
+ The printed command names the site (`--profile`) and, for staging, the
25
+ channel, so it keeps working whatever your default site is. It contains no
26
+ credentials.
27
+
28
+ ## canopy mcp serve
29
+
30
+ The MCP server your client starts. It talks MCP on stdin/stdout and writes
31
+ nothing else there, so everything it has to say goes to stderr, where clients
32
+ show it as the server's log.
33
+
34
+ It uses your `canopy login`: it exchanges it for short-lived credentials for
35
+ this one project, keeps them in memory, and renews them as needed. If you're
36
+ not signed in, it exits with a message telling you to run `canopy login`.
37
+
38
+ Only the project's tools reach the agent, and the tool list stays current: a
39
+ redeploy with new tools reaches a running session without restarting
40
+ anything.
41
+
42
+ ## Arguments & flags
43
+
44
+ - `slug` — the project. Defaults to the `canopy.json` in the current directory.
45
+ - `--channel <live|staging>` — which channel's backend to use. Default `live`.
46
+ - `--local` (serve only) — use the tools of the `canopy dev` running in the
47
+ current directory instead of the deployed project.
48
+ - `--profile <id>` — which Canopy site, as for every command.
49
+
50
+ ## Examples
51
+
52
+ ```bash
53
+ canopy mcp add notes
54
+ ```
55
+
56
+ Check you can use `notes` and print its client configuration.
57
+
58
+ ```bash
59
+ claude mcp add canopy-notes -- canopy mcp serve notes --profile main
60
+ ```
61
+
62
+ Add `notes` to Claude Code (the line `canopy mcp add` printed).
63
+
64
+ ```bash
65
+ claude mcp add notes-staging -- canopy mcp serve notes --channel staging --profile main
66
+ ```
67
+
68
+ Try the staging channel's tools before promoting them.
69
+
70
+ ```bash
71
+ claude mcp add notes-local -- canopy mcp serve --local
72
+ ```
73
+
74
+ While developing: the tools from your working tree, served by `canopy dev`.
75
+
76
+ ## When it can't connect
77
+
78
+ `canopy mcp add` and `canopy mcp serve` say what's wrong in plain words. The
79
+ usual cases:
80
+
81
+ - **Not signed in** — run `canopy login`.
82
+ - **Limited to its collaborators** — ask the owner to add you.
83
+ - **No backend, or serves no tools** — the project has no `worker/`, or it
84
+ doesn't mount any tools yet.
85
+ - **Redeploy required** — the backend was deployed before tools existed. Run
86
+ `canopy deploy`.
87
+ - **Invalid tool definitions** — two tools share a name, or a schema is wrong.
88
+ The message names the tool.
package/dist/docs/cli.md CHANGED
@@ -60,6 +60,8 @@ has a full page per command.
60
60
  `--snapshot <key>`. `--yes` skips the confirmation. **Destructive.**
61
61
  - `canopy usage` — AI spend and storage for the project (same data as the
62
62
  dashboard Usage tab). `--project <slug>` / `--json` for agents.
63
+ - `canopy ai models` — the AI models and `auto/*` aliases this site offers,
64
+ with prices. Works from any directory; `--json` for agents.
63
65
 
64
66
  ## CI / deploy tokens
65
67
 
@@ -64,6 +64,14 @@ already knows the rules:
64
64
  use `canopy dev --local` for an offline sandbox where writes never reach
65
65
  the platform.
66
66
 
67
+ ## Give agents your project's tools
68
+
69
+ The other way round: your project can offer its backend to agents as MCP
70
+ tools, so a colleague's Claude Code or Cursor can call it (as them) without
71
+ opening the app. Wrap the routes you already have with `mountMcpTools`, deploy,
72
+ and people connect with `canopy mcp add <slug>`. See
73
+ [Agent tools](https://docs.canopy.website/guides/agent-tools).
74
+
67
75
  ## Prompts that work
68
76
 
69
77
  With the skill installed, these are safe, copy-pasteable asks — each maps to
@@ -67,6 +67,11 @@
67
67
  "title": "CI and deploy tokens",
68
68
  "summary": "Push-to-main deploys using a project-scoped deploy token."
69
69
  },
70
+ {
71
+ "slug": "agent-tools",
72
+ "title": "Agent tools (MCP)",
73
+ "summary": "Let AI agents like Claude Code and Cursor use your project's backend as tools — as the person running them."
74
+ },
70
75
  {
71
76
  "slug": "porting-nextjs",
72
77
  "title": "Porting a Next.js app",
@@ -276,11 +281,21 @@
276
281
  "title": "canopy usage",
277
282
  "summary": "Show a project's AI spend, storage footprint, and deploy count from the terminal."
278
283
  },
284
+ {
285
+ "slug": "cli-ai",
286
+ "title": "canopy ai models",
287
+ "summary": "List the AI models and auto/* aliases your site offers, with prices."
288
+ },
279
289
  {
280
290
  "slug": "cli-feedback",
281
291
  "title": "canopy feedback",
282
292
  "summary": "Read and triage a project's feedback inbox, or file a bug/feedback report — against a project or against Canopy itself."
283
293
  },
294
+ {
295
+ "slug": "cli-mcp",
296
+ "title": "canopy mcp",
297
+ "summary": "Let AI agents use a project's backend as MCP tools — check access, print client config, and run the stdio server."
298
+ },
284
299
  {
285
300
  "slug": "cli-open",
286
301
  "title": "canopy open",
@@ -21,10 +21,12 @@ const reply = await canopy.ai.chat({
21
21
 
22
22
  - **No keys in your code.** Requests authenticate as the project; the
23
23
  platform holds the provider credentials.
24
- - **A curated model list.** Each site enables a set of models
25
- (`provider/model`, e.g. `anthropic/claude-haiku-4-5`) with a sensible
26
- default — ask for a model outside the list and the API tells you what _is_
27
- available.
24
+ - **Pick a tier, not a model.** Name `auto/low` (the default), `auto/mid`, or
25
+ `auto/high` and the platform answers with the best current model for it.
26
+ You can also name a specific model from the site's list. `canopy ai models`
27
+ and the Models section on your project's Usage tab show it, with prices.
28
+ Names that aren't on the list are refused, and retired models keep working,
29
+ answered by their replacement, until you switch.
28
30
  - **Streaming** via `canopy.ai.chatStream()` for chat-style UIs.
29
31
  - **Documents and images.** Messages can attach files — reference something
30
32
  in the project's [blob storage](https://docs.canopy.website/sdk/blob) by key, or inline base64 — see
@@ -8,6 +8,29 @@ Every request authenticates as the project and is metered against hard
8
8
  per-project budgets — spend, limits, and how prompts are handled by the
9
9
  model providers are covered in [AI access & usage](https://docs.canopy.website/platform/ai-usage).
10
10
 
11
+ ## Picking a model
12
+
13
+ Name a quality tier instead of a model id, and the platform answers with the
14
+ best current model for it:
15
+
16
+ - `auto/low` — fast and cheap. The **default** when you leave `model` out.
17
+ - `auto/mid` — a good balance for most product features.
18
+ - `auto/high` — the most capable model, for hard reasoning and long documents.
19
+
20
+ Each alias moves to newer models as they arrive, without a code change. You
21
+ can also name a specific model from the site's list. Run
22
+ `canopy ai models` to see the aliases, what each answers with right now, and
23
+ every model with its price:
24
+
25
+ ```bash
26
+ canopy ai models
27
+ ```
28
+
29
+ Only names on that list work: anything else is refused with a `400` that lists
30
+ what is available. When a model is retired, calls naming it keep working,
31
+ answered by its replacement: `res.model` names the model that answered, and
32
+ the response carries a `deprecation` notice (below) until you switch.
33
+
11
34
  ## ai.chat(options)
12
35
 
13
36
  One-shot chat completion. Takes a `ChatOptions` object, resolves to a
@@ -19,7 +42,7 @@ const res = await canopy.ai.chat({
19
42
  { role: "system", content: "You are terse." },
20
43
  { role: "user", content: "Say hi in five words." },
21
44
  ],
22
- model: "anthropic/claude-haiku-4-5", // optional
45
+ model: "auto/mid", // optional — defaults to auto/low
23
46
  temperature: 0.7, // optional, 0–2
24
47
  maxTokens: 256, // optional
25
48
  });
@@ -34,10 +57,10 @@ res.usage; // { inputTokens: number, outputTokens: number }
34
57
  - `messages` — required, non-empty array of `{ role, content }`. `role` is
35
58
  `"system" | "user" | "assistant"`; `content` is a non-empty string, or an
36
59
  array of content parts to attach documents and images (below).
37
- - `model` — optional `"{provider}/{model}"` id. Omit it and the platform's
38
- default model answers. Ask for a model whose provider isn't enabled and the
39
- call fails with a message listing what _is_ available; `ai.endpoint()`
40
- returns the full curated list.
60
+ - `model` — optional: an alias (`auto/low`, `auto/mid`, `auto/high`) or a
61
+ `"{provider}/{model}"` id from the site's list (`canopy ai models`). Omit it
62
+ and `auto/low` answers. A name that isn't on the list fails with a message
63
+ listing what _is_ available.
41
64
  - `temperature` — optional number between 0 and 2. Reasoning models (the
42
65
  GPT-5 family) only accept their default temperature, so the platform drops
43
66
  this setting for them rather than failing the call — it has effect on
@@ -52,7 +75,11 @@ res.usage; // { inputTokens: number, outputTokens: number }
52
75
 
53
76
  **`ChatResponse`:** `{ message, model, usage: { inputTokens, outputTokens } }`.
54
77
  `message.role` is `"assistant"` and `message.content` is always a plain
55
- string, whatever went in.
78
+ string, whatever went in. `model` is the model that actually answered. When
79
+ you named a retired model, the response also has
80
+ `deprecation: { requested, replacement }`. Switch to the replacement or an
81
+ alias. Streams and the endpoints below say the same with a `Deprecation:
82
+ true` response header.
56
83
 
57
84
  ## Attaching documents and images
58
85
 
@@ -143,8 +170,10 @@ The compat endpoint speaks OpenAI's chat-completions dialect to every model —
143
170
  portable, but the lowest common denominator. When you want a provider's own
144
171
  protocol — Anthropic prompt caching, PDFs with citations, or OpenAI's
145
172
  Responses API — use the native base URLs from `endpoint()`. Requests pass
146
- through to the provider unchanged; auth, the model allowlist, the daily
147
- budget, and metering all still apply.
173
+ through to the provider unchanged; auth, the model list, the daily budget,
174
+ and metering all still apply. Aliases work here too: on the Anthropic endpoint
175
+ `auto/mid` picks the best Claude model for that tier, on the OpenAI endpoint
176
+ the best OpenAI one.
148
177
 
149
178
  ```ts
150
179
  import Anthropic from "@anthropic-ai/sdk";
@@ -152,7 +181,7 @@ import Anthropic from "@anthropic-ai/sdk";
152
181
  const { native } = await canopy.ai.endpoint();
153
182
  const anthropic = new Anthropic({ baseURL: native.anthropic, apiKey: "unused" });
154
183
  const msg = await anthropic.messages.create({
155
- model: "claude-haiku-4-5", // bare or "anthropic/…" — must be on the curated list
184
+ model: "auto/mid", // an alias, or a model id from `canopy ai models` (bare or "anthropic/…")
156
185
  max_tokens: 1024,
157
186
  messages: [{ role: "user", content: "Hello" }],
158
187
  });
@@ -188,7 +217,9 @@ as the `message`. Two worth handling:
188
217
  or after a maintainer raises it). Everything else in your app keeps
189
218
  working.
190
219
  - **Invalid request** — status `400`, body contains `"invalid_chat"` and a
191
- detail explaining which option was rejected.
220
+ detail explaining which option was rejected. A model that isn't on the
221
+ site's list lands here too, with the available aliases and models in the
222
+ detail.
192
223
 
193
224
  > **Note:** Budgets are enforced before every call, so a runaway loop becomes a capped bill — see [AI access
194
225
  > &amp; usage](https://docs.canopy.website/platform/ai-usage) for how spend is tracked and displayed.
@@ -1,7 +1,7 @@
1
- import { t as version } from "./package-DzU_2IJi.mjs";
1
+ import { t as version } from "./package-CiKTWo0_.mjs";
2
2
  import { n as siteConfig } from "./site-DM2J10CB.mjs";
3
3
  import { i as latestKnownVersion, r as compareSemver } from "./version-check-CcsA1QjI.mjs";
4
- import { r as reportErrors } from "./ui-CeupNHNa.mjs";
4
+ import { r as reportErrors } from "./ui-C_jSc1Kz.mjs";
5
5
  import { defineCommand } from "citty";
6
6
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
7
7
  import { homedir } from "node:os";
@@ -1,5 +1,6 @@
1
1
  import { a as projectDirArgs, c as resolveProject } from "./site-DM2J10CB.mjs";
2
- import { a as unwrap, d as withContext, i as requireTty, l as apiRequest, r as reportErrors, t as formatDateTime } from "./ui-CeupNHNa.mjs";
2
+ import { i as apiRequest, o as withContext } from "./api-C4rMhE7i.mjs";
3
+ import { a as unwrap, i as requireTty, r as reportErrors, t as formatDateTime } from "./ui-C_jSc1Kz.mjs";
3
4
  import { defineCommand } from "citty";
4
5
  import * as p from "@clack/prompts";
5
6
  //#region src/egress.ts
@@ -1,6 +1,7 @@
1
- import { t as version } from "./package-DzU_2IJi.mjs";
1
+ import { t as version } from "./package-CiKTWo0_.mjs";
2
2
  import { a as projectDirArgs, c as resolveProject, d as tryResolveProject, n as siteConfig, u as tryReadCanopyJson } from "./site-DM2J10CB.mjs";
3
- import { c as apiDownload, l as apiRequest, r as reportErrors, t as formatDateTime, u as apiUpload } from "./ui-CeupNHNa.mjs";
3
+ import { a as apiUpload, i as apiRequest, r as apiDownload } from "./api-C4rMhE7i.mjs";
4
+ import { r as reportErrors, t as formatDateTime } from "./ui-C_jSc1Kz.mjs";
4
5
  import { defineCommand } from "citty";
5
6
  import { basename, extname, join } from "node:path";
6
7
  import { readFile, writeFile } from "node:fs/promises";
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as version } from "./package-DzU_2IJi.mjs";
2
+ import { t as version } from "./package-CiKTWo0_.mjs";
3
3
  import { r as siteHeaderLine, t as setInvocationProfile } from "./site-DM2J10CB.mjs";
4
4
  import { a as notifyOfUpdate, o as runRefresh } from "./version-check-CcsA1QjI.mjs";
5
5
  import { defineCommand, runMain } from "citty";
@@ -17,6 +17,8 @@ import { defineCommand, runMain } from "citty";
17
17
  * db pull|snapshot|restore [phase 2]
18
18
  * logs [--follow] read the project's worker logs [phase 2]
19
19
  * usage AI spend + storage for a project [phase 1]
20
+ * ai models the site's AI models and auto/* aliases
21
+ * mcp add|serve a project's tools for AI agents (docs/49)
20
22
  * open open the deployed project / dashboard [phase 1]
21
23
  */
22
24
  if (process.env["CANOPY_UPDATE_REFRESH"] === "1") {
@@ -60,35 +62,38 @@ const main = defineCommand({
60
62
  description: "canopy — create and deploy vibecoded projects"
61
63
  },
62
64
  subCommands: {
63
- login: () => import("./login-MX0xq8UE.mjs").then((m) => m.loginCommand),
64
- whoami: () => import("./login-MX0xq8UE.mjs").then((m) => m.whoamiCommand),
65
- logout: () => import("./login-MX0xq8UE.mjs").then((m) => m.logoutCommand),
66
- create: () => import("./projects-BG7Injpb.mjs").then((m) => m.createCommand),
67
- init: () => import("./projects-BG7Injpb.mjs").then((m) => m.initCommand),
68
- projects: () => import("./projects-BG7Injpb.mjs").then((m) => m.projectsCommand),
69
- delete: () => import("./projects-BG7Injpb.mjs").then((m) => m.deleteCommand),
70
- dev: () => import("./dev-DGCu9MjB.mjs").then((m) => m.devCommand),
71
- deploy: () => import("./deploy-CBf44bvG.mjs").then((m) => m.deployCommand),
72
- promote: () => import("./deploy-CBf44bvG.mjs").then((m) => m.promoteCommand),
73
- staging: () => import("./staging-D06zobnf.mjs").then((m) => m.stagingCommand),
74
- rollback: () => import("./deploy-CBf44bvG.mjs").then((m) => m.rollbackCommand),
75
- download: () => import("./deploy-CBf44bvG.mjs").then((m) => m.downloadCommand),
76
- token: () => import("./token-C_PFNqcv.mjs").then((m) => m.tokenCommand),
77
- egress: () => import("./egress-Cn9zDfDT.mjs").then((m) => m.egressCommand),
78
- secrets: () => import("./secrets-Bl3uOx4l.mjs").then((m) => m.secretsCommand),
79
- schedule: () => import("./schedule-CLuksxSM.mjs").then((m) => m.scheduleCommand),
80
- feedback: () => import("./feedback-CNfUjjNw.mjs").then((m) => m.feedbackCommand),
81
- db: () => import("./db-KTLn8J1u.mjs").then((m) => m.dbCommand),
82
- usage: () => import("./usage-CV7TjTO8.mjs").then((m) => m.usageCommand),
83
- open: () => import("./open-BJgd0R61.mjs").then((m) => m.openCommand),
84
- docs: () => import("./docs-ZQnhFSKT.mjs").then((m) => m.docsCommand),
85
- skill: () => import("./skill-CQ4a__Ga.mjs").then((m) => m.skillCommand),
86
- upgrade: () => import("./upgrade-BzmIrnjs.mjs").then((m) => m.upgradeCommand),
87
- logs: () => import("./logs-D5RWqsWl.mjs").then((m) => m.logsCommand)
65
+ login: () => import("./login-B-m-i8uu.mjs").then((m) => m.loginCommand),
66
+ whoami: () => import("./login-B-m-i8uu.mjs").then((m) => m.whoamiCommand),
67
+ logout: () => import("./login-B-m-i8uu.mjs").then((m) => m.logoutCommand),
68
+ create: () => import("./projects-CN2YhCZn.mjs").then((m) => m.createCommand),
69
+ init: () => import("./projects-CN2YhCZn.mjs").then((m) => m.initCommand),
70
+ projects: () => import("./projects-CN2YhCZn.mjs").then((m) => m.projectsCommand),
71
+ delete: () => import("./projects-CN2YhCZn.mjs").then((m) => m.deleteCommand),
72
+ dev: () => import("./dev-MoHHjQh1.mjs").then((m) => m.devCommand),
73
+ deploy: () => import("./deploy-B-znPE-v.mjs").then((m) => m.deployCommand),
74
+ promote: () => import("./deploy-B-znPE-v.mjs").then((m) => m.promoteCommand),
75
+ staging: () => import("./staging-BZVty57b.mjs").then((m) => m.stagingCommand),
76
+ rollback: () => import("./deploy-B-znPE-v.mjs").then((m) => m.rollbackCommand),
77
+ download: () => import("./deploy-B-znPE-v.mjs").then((m) => m.downloadCommand),
78
+ token: () => import("./token-HHlUR0CF.mjs").then((m) => m.tokenCommand),
79
+ egress: () => import("./egress-If_Gsx_M.mjs").then((m) => m.egressCommand),
80
+ secrets: () => import("./secrets-BSEjZnxg.mjs").then((m) => m.secretsCommand),
81
+ schedule: () => import("./schedule-C5lMf3ny.mjs").then((m) => m.scheduleCommand),
82
+ feedback: () => import("./feedback-Cd7Rvg9a.mjs").then((m) => m.feedbackCommand),
83
+ db: () => import("./db-BB6O6085.mjs").then((m) => m.dbCommand),
84
+ usage: () => import("./usage-CUYrWxv0.mjs").then((m) => m.usageCommand),
85
+ ai: () => import("./ai-DHLnyqfq.mjs").then((m) => m.aiCommand),
86
+ open: () => import("./open-DcaQKi1v.mjs").then((m) => m.openCommand),
87
+ docs: () => import("./docs-YD4z70gq.mjs").then((m) => m.docsCommand),
88
+ skill: () => import("./skill-BWmXiJAz.mjs").then((m) => m.skillCommand),
89
+ upgrade: () => import("./upgrade-Cexs9KYX.mjs").then((m) => m.upgradeCommand),
90
+ logs: () => import("./logs-DQQOawOG.mjs").then((m) => m.logsCommand),
91
+ mcp: () => import("./mcp-GKwctfHN.mjs").then((m) => m.mcpCommand)
88
92
  }
89
93
  });
90
- if (process.argv[2] !== "upgrade") notifyOfUpdate(version);
91
- if (process.argv[2] && process.argv[2] !== "--help" && process.argv[2] !== "-h") console.error(siteHeaderLine(version));
94
+ const quiet = process.argv[2] === "mcp" && process.argv[3] === "serve";
95
+ if (process.argv[2] !== "upgrade" && !quiet) notifyOfUpdate(version);
96
+ if (!quiet && process.argv[2] && process.argv[2] !== "--help" && process.argv[2] !== "-h") console.error(siteHeaderLine(version));
92
97
  await runMain(main);
93
98
  //#endregion
94
99
  export {};
@@ -1,6 +1,6 @@
1
- import { s as apiDataRequest } from "./ui-CeupNHNa.mjs";
2
- import { a as META_COLUMNS, i as dbRouter, o as blobRouter, r as realtimeRouter } from "./src-C7zPhbxi.mjs";
3
- import { i as rewriteApiPath } from "./dev-JlzMZJow.mjs";
1
+ import { n as apiDataRequest } from "./api-C4rMhE7i.mjs";
2
+ import { a as dbRouter, i as realtimeRouter, o as META_COLUMNS, s as blobRouter } from "./src-BkACMkol.mjs";
3
+ import { i as rewriteApiPath } from "./dev-CkhBnSlv.mjs";
4
4
  import { createRequire } from "node:module";
5
5
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
6
6
  import { dirname, join, relative, sep } from "node:path";
@@ -1,5 +1,5 @@
1
1
  import { _ as writeConfigFile, f as clearAllProfileTokens, g as upsertProfileAuth, h as setActiveProfile, m as readConfigFile, n as siteConfig, p as listBakedProfiles, v as getBakedProfile, y as isProfileId } from "./site-DM2J10CB.mjs";
2
- import { n as openBrowser, r as reportErrors } from "./ui-CeupNHNa.mjs";
2
+ import { n as openBrowser, r as reportErrors } from "./ui-C_jSc1Kz.mjs";
3
3
  import { defineCommand } from "citty";
4
4
  import { hostname } from "node:os";
5
5
  import * as p from "@clack/prompts";
@@ -1,5 +1,6 @@
1
1
  import { c as resolveProject, o as projectFlagArgs } from "./site-DM2J10CB.mjs";
2
- import { d as withContext, l as apiRequest, r as reportErrors } from "./ui-CeupNHNa.mjs";
2
+ import { i as apiRequest, o as withContext } from "./api-C4rMhE7i.mjs";
3
+ import { r as reportErrors } from "./ui-C_jSc1Kz.mjs";
3
4
  import { defineCommand } from "citty";
4
5
  //#region src/logs.ts
5
6
  /**