@homespunapps/mcp 1.4.2 → 1.4.3
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/dist/tools.js +35 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/server.json +10 -5
package/dist/tools.js
CHANGED
|
@@ -534,13 +534,23 @@ const communityShape = {
|
|
|
534
534
|
action: z
|
|
535
535
|
.enum([
|
|
536
536
|
"publish",
|
|
537
|
+
"get_config_contract",
|
|
538
|
+
"install",
|
|
537
539
|
"list_pending",
|
|
538
540
|
"get_submission",
|
|
539
541
|
"approve",
|
|
540
542
|
"reject",
|
|
541
543
|
"set_trust_level",
|
|
542
544
|
])
|
|
543
|
-
.describe("publish: publish one of YOUR apps as a community template (app_id; optional title/description/category/tags). PRIVACY: publishing makes the template content AND the captured seed rows (the LIVE rows of every seedOnInstall collection, captured at publish time) PUBLIC to every platform user once approved. Do NOT publish an app whose seedOnInstall collections hold real personal data (names, emails, addresses, messages, anything private): seed data must be example-only. Pass attest_example_only:true to attest you have checked this. The capture (html + manifest + seed rows) lands PENDING review, installable by its returned direct link but not listed until approved; an ESTABLISHED publisher is fast-tracked (the response's expedited/auto_approved tell you which). list_pending / get_submission / approve / reject / set_trust_level are RELAY-OPERATOR-only review actions: list_pending (the review queue, expedited submissions first), get_submission (a submission's full html+manifest+seedRows, by snapshot_id), approve (snapshot_id, lists it in the gallery + supersedes the app's prior approved version), reject (snapshot_id + a required note that lands in the publisher's app feed), set_trust_level (promote/demote a publisher by handle: handle + trust_level 'new'|'established')."),
|
|
545
|
+
.describe("publish: publish one of YOUR apps as a community template (app_id; optional title/description/category/tags). PRIVACY: publishing makes the template content AND the captured seed rows (the LIVE rows of every seedOnInstall collection, captured at publish time) PUBLIC to every platform user once approved. Do NOT publish an app whose seedOnInstall collections hold real personal data (names, emails, addresses, messages, anything private): seed data must be example-only. Pass attest_example_only:true to attest you have checked this. The capture (html + manifest + seed rows) lands PENDING review, installable by its returned direct link but not listed until approved; an ESTABLISHED publisher is fast-tracked (the response's expedited/auto_approved tell you which). get_config_contract: read a template's install-time config contract by `ref` (a namespaced '<handle>/<slug>' or a snapshot id): its settings_collection, ordered config_steps (each with key/kind/required/secret/choices/default), and connect_steps (inbound hooks the app receives on). An 'upload' step wants a file; pre-upload it with the attachments tool (scope agent) and pass its attachment id. After installing a template with connect_steps, run the `ingest` tool's list action on the new app_id to read its freshly provisioned hook URLs, and wire each into the external service. install: install a template by `ref` for YOU (your owning human becomes the owner). Pass `config` as { stepKey: value } from the contract: a 'config' step's value is a string, an 'upload' step's value is a pre-uploaded attachment id. A required step you omit is rejected. Returns the new app's id, slug, and url; installs always create a fresh private copy. list_pending / get_submission / approve / reject / set_trust_level are RELAY-OPERATOR-only review actions: list_pending (the review queue, expedited submissions first), get_submission (a submission's full html+manifest+seedRows plus external_destinations, the hosts it can send data to or pull data from, by snapshot_id), approve (snapshot_id, lists it in the gallery + supersedes the app's prior approved version), reject (snapshot_id + a required note that lands in the publisher's app feed), set_trust_level (promote/demote a publisher by handle: handle + trust_level 'new'|'established')."),
|
|
546
|
+
ref: z
|
|
547
|
+
.string()
|
|
548
|
+
.optional()
|
|
549
|
+
.describe("get_config_contract/install only. The template to read or install: a namespaced '<handle>/<slug>' or a community snapshot id."),
|
|
550
|
+
config: z
|
|
551
|
+
.record(z.string(), z.unknown())
|
|
552
|
+
.optional()
|
|
553
|
+
.describe("install only. The install-time answers as { stepKey: value } from the config contract: a 'config' step's value is a string, an 'upload' step's value is a pre-uploaded attachment id. Omit for a template with no config steps."),
|
|
544
554
|
app_id: z
|
|
545
555
|
.string()
|
|
546
556
|
.optional()
|
|
@@ -611,9 +621,13 @@ const communityShape = {
|
|
|
611
621
|
.string()
|
|
612
622
|
.optional()
|
|
613
623
|
.describe("Optional format hint (<= 120 chars)."),
|
|
624
|
+
ingestRule: z
|
|
625
|
+
.string()
|
|
626
|
+
.optional()
|
|
627
|
+
.describe("The manifest `ingest` rule this step wires up. Allowed ONLY on a 'connect' step, optional there; publish rejects a name x-homespun-manifest.ingest does not declare. Each install mints that rule its OWN hook URL, which the installer pastes into the external service."),
|
|
614
628
|
}))
|
|
615
629
|
.optional()
|
|
616
|
-
.describe("publish only. Ordered typed setup steps an installing agent follows after install (up to 20). A 'config'/'upload' step may carry a `key` naming a field of the manifest's settingsCollection that its install-time answer is written into. Read back via get_submission and rendered on the template detail page."),
|
|
630
|
+
.describe("publish only. Ordered typed setup steps an installing agent follows after install (up to 20). A 'config'/'upload' step may carry a `key` naming a field of the manifest's settingsCollection that its install-time answer is written into; a 'connect' step may carry an `ingestRule` naming a manifest ingest rule it wires up. Read back via get_submission and rendered on the template detail page."),
|
|
617
631
|
derived_from_snapshot_id: z
|
|
618
632
|
.string()
|
|
619
633
|
.optional()
|
|
@@ -1580,7 +1594,7 @@ export const TOOLS = [
|
|
|
1580
1594
|
},
|
|
1581
1595
|
{
|
|
1582
1596
|
name: "community",
|
|
1583
|
-
description: "Publish an app you own as a COMMUNITY TEMPLATE, and (relay operators only) review submissions. ONE tool with an `action` enum: publish | list_pending | get_submission | approve | reject. publish captures your live app (html + manifest + the seed rows of its seedOnInstall collections + listing metadata) into a PENDING template - installable by the returned direct link but NOT listed in the public gallery until an operator approves it; you must have a verified email and at most a few pending submissions at once. PRIVACY: an approved template's content AND its captured seed rows become PUBLIC to every platform user, so never publish an app whose seedOnInstall collections hold real personal data - seed data must be example-only. Pass attest_example_only:true to attest you checked this. Optionally give the template a per-publisher `slug` (namespaced id <your-handle>/<slug>) and a semver `version` (default 1.0.0): a republish under the same slug must bump the version. The review actions are limited to the relay's configured community reviewers: list_pending (the queue), get_submission (a submission's full content by snapshot_id), approve (list it in the gallery; a re-publish supersedes your app's prior approved version), reject (with a required note that lands in the publisher's app feed).",
|
|
1597
|
+
description: "Publish an app you own as a COMMUNITY TEMPLATE, install a template into your own account, and (relay operators only) review submissions. ONE tool with an `action` enum: publish | get_config_contract | install | list_pending | get_submission | approve | reject | set_trust_level. publish captures your live app (html + manifest + the seed rows of its seedOnInstall collections + listing metadata) into a PENDING template - installable by the returned direct link but NOT listed in the public gallery until an operator approves it; you must have a verified email and at most a few pending submissions at once. PRIVACY: an approved template's content AND its captured seed rows become PUBLIC to every platform user, so never publish an app whose seedOnInstall collections hold real personal data - seed data must be example-only. Pass attest_example_only:true to attest you checked this. Optionally give the template a per-publisher `slug` (namespaced id <your-handle>/<slug>) and a semver `version` (default 1.0.0): a republish under the same slug must bump the version. get_config_contract reads what a template needs at install (its settings collection + ordered config/upload steps) by `ref`; install creates a fresh PRIVATE copy of a template for YOUR owning human, passing the answers as `config` (a 'config' value is a string, an 'upload' value is a pre-uploaded attachment id from the attachments tool). The review actions are limited to the relay's configured community reviewers: list_pending (the queue), get_submission (a submission's full content by snapshot_id), approve (list it in the gallery; a re-publish supersedes your app's prior approved version), reject (with a required note that lands in the publisher's app feed).",
|
|
1584
1598
|
inputSchema: communityShape,
|
|
1585
1599
|
// Consolidated tool: read actions (list_pending/get_submission) + mutating
|
|
1586
1600
|
// ones (publish/approve/reject). Hint reflects the most-privileged action.
|
|
@@ -1618,6 +1632,24 @@ export const TOOLS = [
|
|
|
1618
1632
|
attestExampleOnly: bool(args, "attest_example_only"),
|
|
1619
1633
|
}));
|
|
1620
1634
|
}
|
|
1635
|
+
case "get_config_contract": {
|
|
1636
|
+
const ref = str(args, "ref");
|
|
1637
|
+
if (ref === undefined) {
|
|
1638
|
+
return invalidArgs("get_config_contract requires `ref`");
|
|
1639
|
+
}
|
|
1640
|
+
return jsonResult(await client.getCommunityConfigContract(ref));
|
|
1641
|
+
}
|
|
1642
|
+
case "install": {
|
|
1643
|
+
const ref = str(args, "ref");
|
|
1644
|
+
if (ref === undefined) {
|
|
1645
|
+
return invalidArgs("install requires `ref`");
|
|
1646
|
+
}
|
|
1647
|
+
const cfg = args["config"];
|
|
1648
|
+
const config = cfg !== null && typeof cfg === "object" && !Array.isArray(cfg)
|
|
1649
|
+
? cfg
|
|
1650
|
+
: undefined;
|
|
1651
|
+
return jsonResult(await client.installCommunityTemplate(ref, config));
|
|
1652
|
+
}
|
|
1621
1653
|
case "list_pending": {
|
|
1622
1654
|
const opts = {};
|
|
1623
1655
|
if (args["limit"] !== undefined)
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "1.4.
|
|
1
|
+
export declare const VERSION = "1.4.3";
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@homespunapps/mcp",
|
|
3
|
-
"mcpName": "
|
|
4
|
-
"version": "1.4.
|
|
3
|
+
"mcpName": "dev.homespun/homespun",
|
|
4
|
+
"version": "1.4.3",
|
|
5
5
|
"description": "Model Context Protocol (stdio) server for Homespun: lets any MCP client (Claude Desktop, Cursor, …) hand a human a rich interactive UI by URL and get structured data back.",
|
|
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.4.
|
|
49
|
+
"@homespunapps/core": "^1.4.3",
|
|
50
50
|
"zod": "^4.4.3"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
package/server.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
-
"name": "
|
|
3
|
+
"name": "dev.homespun/homespun",
|
|
4
4
|
"title": "Homespun",
|
|
5
5
|
"description": "Hand a human a rich interactive UI by URL and get structured data back, from any MCP client.",
|
|
6
|
-
"version": "1.4.
|
|
7
|
-
"websiteUrl": "https://homespun.dev",
|
|
6
|
+
"version": "1.4.3",
|
|
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.4.
|
|
13
|
+
"version": "1.4.3",
|
|
14
14
|
"transport": {
|
|
15
15
|
"type": "stdio"
|
|
16
16
|
},
|
|
@@ -41,5 +41,10 @@
|
|
|
41
41
|
}
|
|
42
42
|
]
|
|
43
43
|
}
|
|
44
|
-
]
|
|
44
|
+
],
|
|
45
|
+
"repository": {
|
|
46
|
+
"url": "https://github.com/homespunapps/homespun",
|
|
47
|
+
"source": "github",
|
|
48
|
+
"subfolder": "packages/mcp"
|
|
49
|
+
}
|
|
45
50
|
}
|