@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 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.2";
1
+ export declare const VERSION = "1.4.3";
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.4.2";
3
+ export const VERSION = "1.4.3";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@homespunapps/mcp",
3
- "mcpName": "io.github.aerolalit/homespun",
4
- "version": "1.4.2",
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.2",
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": "io.github.aerolalit/homespun",
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.2",
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.2",
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
  }