@homespunapps/mcp 1.6.12 → 1.6.13

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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  A thin **stdio [Model Context Protocol](https://modelcontextprotocol.io) server** for [Homespun](https://homespun.dev). It lets any MCP client (Claude Desktop, Cursor, Windsurf, Cline, your own host) deploy a real multi-user web app in one call and keep operating its data afterwards: hosting on its own URL, magic-link identity, a shared realtime database with per-role permissions, email notifications and file attachments, all included.
4
4
 
5
- It is a wrapper, not a reimplementation: all relay I/O goes through [`@homespunapps/core`](https://www.npmjs.com/package/@homespunapps/core), and config is shared with the [`homespun` CLI](https://www.npmjs.com/package/@homespunapps/cli) (`~/.config/homespun/config.json`) so the CLI and this server use the **same agent identity**.
5
+ It is a wrapper, not a reimplementation: all relay I/O goes through [`@homespunapps/core`](https://www.npmjs.com/package/@homespunapps/core), and config is shared with the [`homespun` CLI](https://www.npmjs.com/package/@homespunapps/cli) (`~/.config/homespun/config.json`), so the CLI and this server use the **same agent identity**.
6
6
 
7
7
  ## Runtime requirement: Node.js >= 20
8
8
 
@@ -10,7 +10,7 @@ The binary is `homespun-mcp`. It speaks MCP over stdio and is meant to be launch
10
10
 
11
11
  ## Quickstart
12
12
 
13
- No global install needed point your MCP client at `npx @homespunapps/mcp`. On first use, if no API key is configured, the server auto-registers a fresh agent against the hosted relay and saves the key to the shared CLI store; nothing else to set up.
13
+ No global install needed: point your MCP client at `npx @homespunapps/mcp`. On first use, if no API key is configured, the server auto-registers a fresh agent against the hosted relay and saves the key to the shared CLI store; nothing else to set up.
14
14
 
15
15
  ### Claude Desktop
16
16
 
@@ -80,23 +80,23 @@ If you'd rather install it globally (`npm i -g @homespunapps/mcp`), use `"comman
80
80
 
81
81
  ## Configuration
82
82
 
83
- All environment variables are optional the defaults target the hosted relay and auto-register on first use.
83
+ All environment variables are optional; the defaults target the hosted relay and auto-register on first use.
84
84
 
85
85
  | Variable | Default | Purpose |
86
86
  | --- | --- | --- |
87
87
  | `HOMESPUN_URL` | `https://homespun.dev` | Relay base URL. Set to point at a different relay. |
88
88
  | `HOMESPUN_API_KEY` | _(auto-registered)_ | Agent API key. If unset, the server registers an agent on first use and saves the key to `~/.config/homespun/config.json` (shared with the CLI). |
89
- | `HOMESPUN_TOKEN` | | Alias for `HOMESPUN_API_KEY` (for hosts that name secrets `*_TOKEN`). `HOMESPUN_API_KEY` wins if both are set. |
89
+ | `HOMESPUN_TOKEN` | _(none)_ | Alias for `HOMESPUN_API_KEY` (for hosts that name secrets `*_TOKEN`). `HOMESPUN_API_KEY` wins if both are set. |
90
90
  | `HOMESPUN_AGENT_NAME` | `homespun-mcp` | Display name for the auto-registered agent. |
91
- | `HOMESPUN_REGISTER_SECRET` | | Registration secret, only for relays running `REGISTRATION_MODE=secret`. |
91
+ | `HOMESPUN_REGISTER_SECRET` | _(none)_ | Registration secret, only for relays running `REGISTRATION_MODE=secret`. |
92
92
 
93
93
  Config precedence mirrors the CLI: env vars win over the saved profile, which falls back to the default relay URL.
94
94
 
95
95
  ## Tools
96
96
 
97
- This server has **full parity with the [`homespun` CLI](https://www.npmjs.com/package/@homespunapps/cli)** every capability the CLI exposes is reachable here.
97
+ This server has **full parity with the [`homespun` CLI](https://www.npmjs.com/package/@homespunapps/cli)**: every capability the CLI exposes is reachable here.
98
98
 
99
- MCP tools are request/response there is no long-lived "watch". To receive a human's response you **poll** `get_events` with the cursor from the previous call (optionally with `wait_seconds` to long-poll); to watch a record collection, re-call `list_records` with the prior `since`. Each tool description spells out the pattern for the model.
99
+ MCP tools are request/response, so there is no long-lived "watch". To see what changed you **poll** `get_feed_events` with the cursor from the previous call (pass `wait` to long-poll, 0 to 30 seconds); to watch one collection, re-call `list_rows` with the prior `next_cursor` as `since`. Each tool description spells out the pattern for the model.
100
100
 
101
101
  To keep the tool list compact (a flat 50+ tools would bloat client context and degrade selection), **hot-path nouns stay discrete tools** while **multi-verb management nouns collapse into one tool each with a required `action` enum**.
102
102
 
@@ -104,59 +104,53 @@ To keep the tool list compact (a flat 50+ tools would bloat client context and d
104
104
 
105
105
  | Tool | What it does |
106
106
  | --- | --- |
107
- | `create_app` | Create an app inline HTML (`name`+`html`) **or** reuse a saved template (`template_id`). Optional event/input/record schema, participants, tags, icon, callback, `context_key`. Returns `{ app_id, url, urls, title, expires_at }`. **Give `url` to the human.** |
108
- | `get_app_state` | Fetch an app's metadata (status, title, expiry) without its event log. |
109
- | `get_events` | Poll the app's append-only event log for what the human did. Pass `since` (cursor) and optional `wait_seconds` (long-poll). |
110
- | `send_to_app` | Push an event into an open app to update the live UI. |
111
- | `update_app` | Edit a live app in place (ttl/title/preamble/input_data/metadata/tags/icon). |
112
- | `upgrade_app` | Re-pin a live app to another version of its template (swap HTML+schemas, same URL). |
113
- | `list_apps` | Enumerate your apps (filter by status/template_id; paginated). |
114
- | `delete_app` | Close/delete an app. |
115
- | `list_records` | List rows in an app's mutable record collection (also the records poll/watch). |
116
- | `get_record` | Fetch one record row by key. |
117
- | `upsert_record` | Create/return a record row (dedups on `record_key`). |
118
- | `update_record` | Update a record row (optional `if_match` optimistic lock). |
119
- | `delete_record` | Soft-delete a record row (the page sees it live). |
120
- | `delete_record_collection` | Drop a whole record collection (all rows + the collection row). Destructive, owner-only, requires `confirm: true`. |
107
+ | `deploy_app` | Deploy a v2 app: an HTML document plus a capability manifest, hosted at its own URL. Omit `app_id` to create, pass it to redeploy in place (same URL, same data, same members). Takes `html` or `html_path`, optional `assets`, `visibility`, `slug`, `dry_run`, `force`. |
108
+ | `list_rows` | List rows in a collection. Doubles as the poll for a collection's current state: pass the prior `next_cursor` as `since`. |
109
+ | `get_row` | Fetch one row by `key` (a dedicated relay route, not a client-side scan). |
110
+ | `upsert_row` | Create a row, or return the existing one if `key` is already present (`deduped: true`). The only create-shaped verb. |
111
+ | `update_row` | Replace an existing row's `data`. Optional `if_match` optimistic lock. |
112
+ | `delete_row` | Soft-delete a row. Optional `if_match`. |
113
+ | `get_feed_events` | Poll the app's change feed for row creates/updates/deletes from any writer, human or agent. Optional `wait` (0-30s) long-poll. |
121
114
 
122
115
  ### Consolidated tools (one tool, required `action`)
123
116
 
124
117
  | Tool | Actions |
125
118
  | --- | --- |
126
- | `template` | `create` · `version` · `update` · `search` · `list` · `show` · `get_version` · `delete` · `publish` · `unpublish` · `search_public` · `set_icon` |
127
- | `template_records` | `list` · `get` · `upsert` · `update` · `delete` · `delete_collection` |
128
- | `participant` | `list` · `new` · `revoke` |
129
- | `share` | `list` · `invite` · `set_access` · `revoke` |
130
- | `attachments` | `upload` · `download` · `show` · `list` · `delete` · `mint_token` · `revoke_token` · `list_tokens` |
119
+ | `apps` | `list` · `show` · `update` · `share_link_rotate` · `delete` · `wake` · `domain_set` · `domain_status` · `domain_remove` |
120
+ | `members` | `add` · `list` · `set_role` · `remove` · `roles` |
121
+ | `grants` | `mint` · `list` · `revoke` |
122
+ | `ingest` | `list` · `rotate` · `set_signing_secret` · `clear_signing_secret` |
123
+ | `attachments` | `upload` · `fetch` · `presign` · `finalize` · `download` · `show` · `list` · `delete` · `mint_token` · `revoke_token` · `list_tokens` |
131
124
  | `taste` | `get` · `set` · `clear` |
132
- | `key` | `list` · `revoke` |
133
- | `trash` | `list` · `restore` · `restore_template` · `purge` · `purge_template` |
125
+ | `key` | `list` · `mint` · `revoke` |
134
126
  | `feedback` | `create` · `list` |
135
127
  | `agent` | `whoami` · `claim` · `logout` |
128
+ | `community` | `publish` · `get_config_contract` · `install` · `list_pending` · `get_submission` · `approve` · `reject` · `set_trust_level` |
129
+ | `publisher` | `claim` · `get` · `update` |
130
+ | `review` | `create` · `respond` · `report` · `remove` · `unhold` |
136
131
 
137
132
  ### Single-purpose tools
138
133
 
139
134
  | Tool | What it does |
140
135
  | --- | --- |
141
- | `run_query` | Read-only SQL over your scoped apps/records/events (`format`: json/csv/tsv/table). |
142
- | `get_skill` | Fetch the relay's auto-updating `SKILL.md` (unauthenticated) to self-teach the workflow. |
136
+ | `get_skill` | Fetch the relay's auto-updating guide (unauthenticated) to self-teach the workflow. |
143
137
 
144
- **Attachments** take/return file paths: `upload` reads an absolute `file_path`; `download` writes to an absolute `out_path` (or returns base64 when omitted).
138
+ **Attachments** take and return file paths: `upload` reads an absolute `file_path`; `download` writes to an absolute `out_path` (or returns base64 when omitted). For real media, `presign` then PUT then `finalize` avoids moving bytes through the tool call.
145
139
 
146
- **Events vs records.** Events are an append-only journal forms, approvals, surveys, pickers. Records are a mutable collection where the current state matters more than the edit history todo lists, kanban boards, comment threads. Reach for records when the page shows several mutable items.
140
+ **One data primitive.** Everything an app stores is a **collection**: a named, mutable, queryable set of rows, each with a `key`, a `data` payload, an optimistic-lock `version` and an `author`. Every write also lands on the app's ordered **change feed**. Declare a collection `appendOnly: true` in the manifest when you want a journal (an audit trail, a submission log) rather than mutable state.
147
141
 
148
142
  ### Not exposed (and why)
149
143
 
150
- - The CLI's `config show` is replaced by `agent`→`whoami` (resolved relay URL + active profile + whether a key is set; no secrets).
151
- - `agent register` isn't a tool the server auto-registers on first use and shares the CLI's key store; `agent`→`claim` binds it to a human afterward.
152
- - `demo` (the interactive 60-second terminal tour) and the CLI self-updater are terminal/CLI concerns with no agent use; omitted.
144
+ - The CLI's `config show` is replaced by `agent` → `whoami` (resolved relay URL, active profile, and whether a key is set; no secrets).
145
+ - `agent register` is not a tool. The server auto-registers on first use and shares the CLI's key store; `agent` → `claim` binds it to a human afterwards.
146
+ - `demo` (the interactive terminal tour) and the CLI self-updater are terminal concerns with no agent use; omitted.
153
147
 
154
148
  ## Typical flow
155
149
 
156
- 1. `create_app` with your HTML + an `event_schema` declaring the events the page emits returns a `url`.
157
- 2. Paste the `url` into the conversation and ask the human to open it.
158
- 3. `get_events` with `wait_seconds: 25` in a loop, passing the prior `next_cursor` as `since`, until the awaited event appears.
159
- 4. Optionally `send_to_app` to update the live UI, or use the record tools for mutable collections.
150
+ 1. `deploy_app` with your HTML plus an `x-homespun-manifest` declaring the app's collections and which roles may read, write and delete each. Returns `{ app_id, url, ... }`.
151
+ 2. Give the `url` to the owner, and invite anyone else with `members` (`action: add`).
152
+ 3. `get_feed_events` with `wait: 25` in a loop, passing the prior `cursor` as `since`, to see what people do.
153
+ 4. Read and write the same data with `list_rows` / `upsert_row` / `update_row`, and ship changes with `deploy_app` again, passing `app_id`.
160
154
 
161
155
  ## MCP registry
162
156
 
@@ -164,4 +158,4 @@ To keep the tool list compact (a flat 50+ tools would bloat client context and d
164
158
 
165
159
  ## License
166
160
 
167
- MIT see [LICENSE](./LICENSE).
161
+ MIT, see [LICENSE](./LICENSE).
@@ -1,18 +1,18 @@
1
- // Register app's MCP prompt + resource on an McpServer.
1
+ // Register Homespun's MCP prompt + resource on an McpServer.
2
2
  //
3
3
  // Both the stdio server (packages/mcp/src/server.ts) and the relay's HTTP MCP
4
4
  // server call this so an MCP-native client can discover the conceptual guide
5
5
  // without a tool call:
6
6
  //
7
- // - prompt `homespun_guide` surfaces the guide as a prompt the client can
8
- // insert into context ("teach me app").
9
- // - resource `homespun://guide` the same guide as a readable resource.
7
+ // - prompt `homespun_guide` surfaces the guide as a prompt the client can
8
+ // insert into context ("teach me Homespun").
9
+ // - resource `homespun://guide` is the same guide as a readable resource.
10
10
  //
11
11
  // The guide text is supplied by the host: the relay composes it in-process
12
12
  // (MCP-INVOCATION.md + the core extracted from SKILL.md); the stdio server
13
13
  // fetches it from the relay over HTTP and falls back to a short pointer when
14
14
  // the relay is unreachable at registration time (registration must not block on
15
- // the network the get_skill tool is the always-fresh path).
15
+ // the network; the get_skill tool is the always-fresh path).
16
16
  export const GUIDE_RESOURCE_URI = "homespun://guide";
17
17
  export const GUIDE_PROMPT_NAME = "homespun_guide";
18
18
  /**
@@ -23,7 +23,7 @@ export const GUIDE_PROMPT_NAME = "homespun_guide";
23
23
  export function registerGuideCapabilities(server, getGuide) {
24
24
  server.registerResource(GUIDE_PROMPT_NAME, GUIDE_RESOURCE_URI, {
25
25
  title: "Homespun usage guide",
26
- description: "The app conceptual guide for MCP clients: when to use app, events vs records, schema design, the house style, and the round-trip mental model — with MCP tool-call invocation grammar.",
26
+ description: "The Homespun conceptual guide for MCP clients: when to deploy an app, the collection and change-feed data model, schema design, permissions and the house style, plus the MCP tool-call invocation grammar.",
27
27
  mimeType: "text/markdown",
28
28
  }, async () => {
29
29
  const text = await getGuide();
@@ -35,7 +35,7 @@ export function registerGuideCapabilities(server, getGuide) {
35
35
  });
36
36
  server.registerPrompt(GUIDE_PROMPT_NAME, {
37
37
  title: "Homespun usage guide",
38
- description: "Insert the app usage guide (MCP invocation + conceptual core) into the conversation so the model knows how to drive app's tools.",
38
+ description: "Insert the Homespun usage guide (MCP invocation grammar + conceptual core) into the conversation so the model knows how to drive Homespun's tools.",
39
39
  }, async () => {
40
40
  const text = await getGuide();
41
41
  return {
package/dist/guide.js CHANGED
@@ -1,11 +1,12 @@
1
- // Compose the MCP-flavoured app guide from the shared conceptual core + the
2
- // MCP invocation layer.
1
+ // Compose the MCP-flavoured Homespun guide from the shared conceptual core +
2
+ // the MCP invocation layer.
3
3
  //
4
4
  // Single source of truth: the conceptual core lives in skills/homespun/SKILL.md
5
5
  // between `<!-- homespun:core:start -->` / `<!-- homespun:core:end -->` markers (the
6
6
  // CLI invocation grammar lives OUTSIDE those markers, so the CLI document and
7
- // the MCP guide share the exact same prose for "when to use app / events vs
8
- // records / schema design / house style / the round-trip mental model"). The
7
+ // the MCP guide share the exact same prose for "when to deploy an app / the
8
+ // collection and change-feed data model / schema design / permissions / house
9
+ // style"). The
9
10
  // MCP invocation layer (tool-call grammar) lives in skills/homespun/MCP-INVOCATION.md.
10
11
  //
11
12
  // The MCP guide = MCP-INVOCATION.md (with its trailing "the rest is the core"
package/dist/server.js CHANGED
@@ -56,7 +56,7 @@ export function buildServer(opts = {}) {
56
56
  }
57
57
  catch (e) {
58
58
  const message = e instanceof Error ? e.message : String(e);
59
- return ("# app\n\nThe app guide could not be fetched from the relay " +
59
+ return ("# homespun\n\nThe Homespun guide could not be fetched from the relay " +
60
60
  `(${message}).\n\nCall the \`get_skill\` tool to retrieve it once the ` +
61
61
  "relay is reachable.\n");
62
62
  }
package/dist/tools.js CHANGED
@@ -172,7 +172,7 @@ const deployAppShape = {
172
172
  .optional()
173
173
  .describe("Validate only: run the full manifest + asset-shape validation, the compat gate (for a redeploy), and the schedule-timezone advisory, then return { ok, warnings, compat?, breaks? } WITHOUT creating a version or mutating anything. An invalid manifest returns the SAME error a real deploy would; a narrowing redeploy reports the compat break instead of applying it. `check` is an accepted alias."),
174
174
  check: z.boolean().optional().describe("Alias for `dry_run`."),
175
- manifest: jsonObjectSchema.describe("The x-homespun-manifest capability document (a JSON object). Eight extension keys: app metadata; collections (+ per-collection write/read/delete role lists); externalHosts (fetch allowlist); cdn (allow CDN scripts/styles); capabilities (Permissions-Policy opt-ins); embeds (iframe frame-src allowlist); notify (email-on-row rules); webhooks (signed HTTP POST on-row rules). Call get_skill for the full grammar before authoring one from scratch."),
175
+ manifest: jsonObjectSchema.describe("The x-homespun-manifest capability document (a JSON object). Eight extension keys: app metadata; collections (+ per-collection write/update/read/delete role lists, where write gates creates and also updates unless the optional update list is declared); externalHosts (fetch allowlist); cdn (allow CDN scripts/styles); capabilities (Permissions-Policy opt-ins); embeds (iframe frame-src allowlist); notify (email-on-row rules); webhooks (signed HTTP POST on-row rules). Call get_skill for the full grammar before authoring one from scratch."),
176
176
  visibility: z
177
177
  .enum(["private", "link", "public"])
178
178
  .optional()
@@ -765,7 +765,7 @@ export const TOOLS = [
765
765
  // ----- v2 app lifecycle + data (discrete, hot-path) -----------------------
766
766
  {
767
767
  name: "deploy_app",
768
- description: "Deploy a v2 app: an HTML document + a capability manifest, hosted at its own URL. The manifest has eight extension keys: app metadata; collections (+ per-collection write/read/delete role lists); externalHosts (fetch allowlist); cdn (allow CDN scripts/styles); capabilities (Permissions-Policy opt-ins); embeds (iframe frame-src allowlist); notify (email-on-row rules); webhooks (signed HTTP POST on-row rules). Pass EITHER no `app_id` (create, mints a slug + URL) OR `app_id` (redeploy an existing app with new content). Supply the HTML as INLINE `html` OR as `html_path` (an absolute path read on the MCP-SERVER host, which is the relay for a hosted connector or your CLI host for a locally-run one, NOT the remote agent's machine; use it to avoid retransmitting a large HTML file every deploy, but only a locally-run connector can read it, and if both are given inline `html` wins). Pass `dry_run:true` (alias `check`) to VALIDATE ONLY: it runs the full manifest + asset-shape validation, the redeploy compat gate, and the schedule-timezone advisory, then returns { ok, warnings, compat?, breaks? } WITHOUT creating a version or mutating anything. A redeploy that NARROWS the manifest (drops a collection, tightens a schema, revokes a role) is refused with manifest_incompatible_redeploy unless force:true; a narrowed collection is then detached, never deleted. Ship images/fonts/audio/video/data FILES with the app in the SAME call via `assets[]`: each is validated + stored app-scoped and served at its `path` on the app's own origin, so the HTML references it by a stable same-origin path (`<img src=\"frames/000.jpg\">`, `<video src=\"media/clip.mp4\">`), media and font paths support HTTP Range for seeking. A redeploy's assets replace the previous version's set. BEFORE authoring: call get_skill for the manifest grammar. Returns { app_id, slug, url, version, visibility, created } (create) or { app_id, version, compat, breaks? } (redeploy).",
768
+ description: 'Deploy a v2 app: an HTML document + a capability manifest, hosted at its own URL. The manifest has eight extension keys: app metadata; collections (+ per-collection write/update/read/delete role lists, where write gates creates and also updates unless the optional update list is declared; declare update:["creator"] on any collection whose rows belong to one person, or every caller admitted by write can overwrite every row); externalHosts (fetch allowlist); cdn (allow CDN scripts/styles); capabilities (Permissions-Policy opt-ins); embeds (iframe frame-src allowlist); notify (email-on-row rules); webhooks (signed HTTP POST on-row rules). Pass EITHER no `app_id` (create, mints a slug + URL) OR `app_id` (redeploy an existing app with new content). Supply the HTML as INLINE `html` OR as `html_path` (an absolute path read on the MCP-SERVER host, which is the relay for a hosted connector or your CLI host for a locally-run one, NOT the remote agent\'s machine; use it to avoid retransmitting a large HTML file every deploy, but only a locally-run connector can read it, and if both are given inline `html` wins). Pass `dry_run:true` (alias `check`) to VALIDATE ONLY: it runs the full manifest + asset-shape validation, the redeploy compat gate, and the schedule-timezone advisory, then returns { ok, warnings, compat?, breaks? } WITHOUT creating a version or mutating anything. A redeploy that NARROWS the manifest (drops a collection, tightens a schema, revokes a role) is refused with manifest_incompatible_redeploy unless force:true; a narrowed collection is then detached, never deleted. Ship images/fonts/audio/video/data FILES with the app in the SAME call via `assets[]`: each is validated + stored app-scoped and served at its `path` on the app\'s own origin, so the HTML references it by a stable same-origin path (`<img src="frames/000.jpg">`, `<video src="media/clip.mp4">`), media and font paths support HTTP Range for seeking. A redeploy\'s assets replace the previous version\'s set. BEFORE authoring: call get_skill for the manifest grammar. Returns { app_id, slug, url, version, visibility, created } (create) or { app_id, version, compat, breaks? } (redeploy).',
769
769
  inputSchema: deployAppShape,
770
770
  annotations: {
771
771
  title: "Deploy App",
@@ -895,7 +895,7 @@ export const TOOLS = [
895
895
  },
896
896
  {
897
897
  name: "upsert_row",
898
- description: "Create a row in a v2 app's collection, or return the existing row if `key` is already present (deduped:true) the ONLY create-shaped verb for app rows (no separate strict create). Omit `key` to add a new row (server-generates one); pass `key` to ensure a row exists at that key. The collection must be declared in the app's manifest with 'agent' allowed to write. Returns { row, deduped? }.",
898
+ description: "Create a row in a v2 app's collection, or return the existing row if `key` is already present (deduped:true). This is the ONLY create-shaped verb for app rows (no separate strict create). Omit `key` to add a new row (server-generates one); pass `key` to ensure a row exists at that key. The collection must be declared in the app's manifest with 'agent' in its `write` list, the list that gates creates. Returns { row, deduped? }.",
899
899
  inputSchema: upsertRowShape,
900
900
  annotations: {
901
901
  title: "Upsert Row",
@@ -921,7 +921,7 @@ export const TOOLS = [
921
921
  },
922
922
  {
923
923
  name: "update_row",
924
- description: "Update an existing row in a v2 app's collection (replaces its data). Pass if_match with the row's current version for an optimistic-locked update on a version mismatch the relay returns the current row so you can retry. Returns { row }.",
924
+ description: "Update an existing row in a v2 app's collection (replaces its data). Gated by the collection's `update` role list when it declares one, and by its `write` list otherwise, so a collection that scopes updates to the row's `creator` refuses your edit on someone else's row. Pass if_match with the row's current version for an optimistic-locked update: on a version mismatch the relay returns the current row so you can retry. Returns { row }.",
925
925
  inputSchema: updateRowShape,
926
926
  annotations: {
927
927
  title: "Update Row",
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "1.6.12";
1
+ export declare const VERSION = "1.6.13";
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Single source of the package version, reported in the MCP server's
2
2
  // serverInfo. Kept in sync with package.json by the release tooling.
3
- export const VERSION = "1.6.12";
3
+ export const VERSION = "1.6.13";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@homespunapps/mcp",
3
3
  "mcpName": "dev.homespun/homespun",
4
- "version": "1.6.12",
4
+ "version": "1.6.13",
5
5
  "description": "Model Context Protocol (stdio) server for Homespun: lets any MCP client (Claude Desktop, Cursor, …) deploy a multi-user web app with hosting, auth, a shared database and permissions included.",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -46,7 +46,7 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@modelcontextprotocol/sdk": "^1.20.0",
49
- "@homespunapps/core": "^1.6.12",
49
+ "@homespunapps/core": "^1.6.13",
50
50
  "zod": "^4.4.3"
51
51
  },
52
52
  "devDependencies": {
package/server.json CHANGED
@@ -3,14 +3,14 @@
3
3
  "name": "dev.homespun/homespun",
4
4
  "title": "Homespun",
5
5
  "description": "Deploy a multi-user web app from your agent: hosting, auth, database, and permissions.",
6
- "version": "1.6.12",
6
+ "version": "1.6.13",
7
7
  "websiteUrl": "https://docs.homespun.dev",
8
8
  "packages": [
9
9
  {
10
10
  "registryType": "npm",
11
11
  "registryBaseUrl": "https://registry.npmjs.org",
12
12
  "identifier": "@homespunapps/mcp",
13
- "version": "1.6.12",
13
+ "version": "1.6.13",
14
14
  "transport": {
15
15
  "type": "stdio"
16
16
  },