@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 +34 -40
- package/dist/capabilities.js +7 -7
- package/dist/guide.js +5 -4
- package/dist/server.js +1 -1
- package/dist/tools.js +4 -4
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/server.json +2 -2
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`)
|
|
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
|
|
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
|
|
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` |
|
|
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` |
|
|
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)
|
|
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
|
|
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
|
-
| `
|
|
108
|
-
| `
|
|
109
|
-
| `
|
|
110
|
-
| `
|
|
111
|
-
| `
|
|
112
|
-
| `
|
|
113
|
-
| `
|
|
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
|
-
| `
|
|
127
|
-
| `
|
|
128
|
-
| `
|
|
129
|
-
| `
|
|
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
|
-
| `
|
|
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
|
|
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
|
-
**
|
|
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
|
|
151
|
-
- `agent register`
|
|
152
|
-
- `demo` (the interactive
|
|
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. `
|
|
157
|
-
2.
|
|
158
|
-
3. `
|
|
159
|
-
4.
|
|
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
|
|
161
|
+
MIT, see [LICENSE](./LICENSE).
|
package/dist/capabilities.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
// Register
|
|
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`
|
|
8
|
-
//
|
|
9
|
-
// - resource `homespun://guide`
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
8
|
-
//
|
|
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 ("#
|
|
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:
|
|
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)
|
|
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
|
|
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.
|
|
1
|
+
export declare const VERSION = "1.6.13";
|
package/dist/version.js
CHANGED
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.
|
|
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.
|
|
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.
|
|
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.
|
|
13
|
+
"version": "1.6.13",
|
|
14
14
|
"transport": {
|
|
15
15
|
"type": "stdio"
|
|
16
16
|
},
|