@noodleseed/agent-kit 0.64.0 → 0.66.0
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/manifest.json +283 -267
- package/package.json +1 -1
- package/skills/claude-code/SKILL.md +4 -3
- package/skills/claude-code/authoring-mcp-servers/SKILL.md +1 -1
- package/skills/claude-code/building-mcp-apps/SKILL.md +1 -1
- package/skills/claude-code/connecting-apis-to-mcp/SKILL.md +1 -1
- package/skills/claude-code/creating-product-agent-guides/SKILL.md +46 -0
- package/skills/claude-code/debugging-mcp-delivery/SKILL.md +1 -1
- package/skills/claude-code/deploying-mcp-services/SKILL.md +1 -1
- package/skills/claude-code/designing-mcp-products/SKILL.md +1 -1
- package/skills/claude-code/embedding-mcp-assistants/SKILL.md +1 -1
- package/skills/claude-code/examples/acme-discovery/README.md +22 -3
- package/skills/claude-code/examples/acme-discovery/src/server.ts +118 -89
- package/skills/claude-code/examples/acme-tasks/README.md +3 -2
- package/skills/claude-code/examples/customer-auth/src/server.ts +8 -5
- package/skills/claude-code/examples/weather/README.md +2 -1
- package/skills/claude-code/executing-noodle-plans/SKILL.md +1 -1
- package/skills/claude-code/publishing-mcp-integrations/SKILL.md +1 -1
- package/skills/claude-code/references/compile-errors.md +3 -0
- package/skills/claude-code/references/connect-an-api.md +2 -2
- package/skills/claude-code/references/embedded-assistant.md +67 -3
- package/skills/claude-code/references/product-agent-guides.md +14 -2
- package/skills/claude-code/references/sdk-surface.md +2 -0
- package/skills/claude-code/reporting-noodle-feedback/SKILL.md +1 -1
- package/skills/claude-code/verifying-mcp-delivery/SKILL.md +1 -1
- package/skills/claude-code/wrapping-existing-applications/SKILL.md +1 -1
- package/skills/codex/SKILL.md +4 -3
- package/skills/codex/authoring-mcp-servers/SKILL.md +1 -1
- package/skills/codex/building-mcp-apps/SKILL.md +1 -1
- package/skills/codex/connecting-apis-to-mcp/SKILL.md +1 -1
- package/skills/codex/creating-product-agent-guides/SKILL.md +46 -0
- package/skills/codex/debugging-mcp-delivery/SKILL.md +1 -1
- package/skills/codex/deploying-mcp-services/SKILL.md +1 -1
- package/skills/codex/designing-mcp-products/SKILL.md +1 -1
- package/skills/codex/embedding-mcp-assistants/SKILL.md +1 -1
- package/skills/codex/examples/acme-discovery/README.md +22 -3
- package/skills/codex/examples/acme-discovery/src/server.ts +118 -89
- package/skills/codex/examples/acme-tasks/README.md +3 -2
- package/skills/codex/examples/customer-auth/src/server.ts +8 -5
- package/skills/codex/examples/weather/README.md +2 -1
- package/skills/codex/executing-noodle-plans/SKILL.md +1 -1
- package/skills/codex/publishing-mcp-integrations/SKILL.md +1 -1
- package/skills/codex/references/compile-errors.md +3 -0
- package/skills/codex/references/connect-an-api.md +2 -2
- package/skills/codex/references/embedded-assistant.md +67 -3
- package/skills/codex/references/product-agent-guides.md +14 -2
- package/skills/codex/references/sdk-surface.md +2 -0
- package/skills/codex/reporting-noodle-feedback/SKILL.md +1 -1
- package/skills/codex/verifying-mcp-delivery/SKILL.md +1 -1
- package/skills/codex/wrapping-existing-applications/SKILL.md +1 -1
|
@@ -16,6 +16,16 @@ A product with a single self-explanatory capability may omit the guide when its
|
|
|
16
16
|
|
|
17
17
|
Make the judgment from the user’s stated outcome and grounded product evidence. If a guide is warranted but a decision-changing workflow or boundary is unknown, ask only for that missing product input; never fabricate it. The user should not need to know this feature name to receive the benefit.
|
|
18
18
|
|
|
19
|
+
## Creation workflow
|
|
20
|
+
|
|
21
|
+
1. **Inspect grounded capability evidence.** Read the configured TypeScript entrypoint (`server.ts` or `src/server.ts`) and identify its exact declared tools, resources, prompts, descriptions, visibility, annotations, authorization, and widget relationships. Treat schemas and compiled annotations as facts. Never invent or guess a tool, resource, prompt, capability kind, workflow, or weaker write boundary.
|
|
22
|
+
2. **Decide guided or unguided.** Apply the criteria above and state the decision with its evidence. If the existing capabilities are self-explanatory and no product judgment is missing, recommend an intentionally unguided server and stop this workflow.
|
|
23
|
+
3. **Interview only for product judgment.** Ask the builder for the decision-changing triggers, workflow ordering, grounding or clarification rules, boundaries, and representative prompts that source cannot prove. Do not ask them to restate capability names or schemas already present in TypeScript.
|
|
24
|
+
4. **Propose TypeScript.** Present the complete proposed `agentGuide` block, map every step to one exact declared capability and kind, and call out how write, destructive, open-world, confirmation, authorization, and widget boundaries remain unchanged. Request explicit approval before editing the configured TypeScript entrypoint.
|
|
25
|
+
5. **Apply and prove after approval.** Add or revise only the approved TypeScript guide. Run `noodle validate --json`, repair each structured guide error at its exact path without free-form invention, then run `noodle test --json`.
|
|
26
|
+
6. **Preview the App Package plan.** Run `noodle agents setup --json` and report its exact target, file, ownership-migration, removal, and replacement actions. A preview never writes files. For an existing installed app skill, pass `--regenerate-app-skill` to state the intended operation explicitly; add `--replace-modified-app-skill` only when the builder is considering replacement of previously Noodle-owned bytes.
|
|
27
|
+
7. **Ask separately before installation.** Request explicit approval before writing or replacing the app product skill. On approval, run `noodle agents setup --write` for a first installation, or `noodle agents setup --write --regenerate-app-skill` for a changed, migrated, renamed, or removed installation. Add `--replace-modified-app-skill` only when the preview identified modified previously owned bytes and the builder approved losing those exact local modifications.
|
|
28
|
+
|
|
19
29
|
## Authoring shape
|
|
20
30
|
|
|
21
31
|
The guide contains `description`, `useWhen`, named `workflows`, optional `boundaries`, and optional example prompt-to-workflow mappings. Each workflow step references a declared `tool`, `resource`, or `prompt` by symbolic `{ kind, name }`; do not duplicate schemas, connector bindings, URLs, credentials, or raw runtime data.
|
|
@@ -26,8 +36,10 @@ Use `server.instructions` for a concise live MCP-session primer. Noodle-owned wo
|
|
|
26
36
|
|
|
27
37
|
## Local lifecycle
|
|
28
38
|
|
|
29
|
-
`noodle agents setup` previews the local product-skill files compiled from `server.ts`; add `--write`
|
|
39
|
+
`noodle agents setup` previews the local product-skill files compiled from `server.ts`; add `--write` for the first installation under `.agents/skills/<app-skill>/` and `.claude/skills/<app-skill>/`. No account or hosted deployment is required. The app files have an ownership record separate from the Noodle workflow skills.
|
|
40
|
+
|
|
41
|
+
A normal `noodle agents setup --write` refreshes Noodle-owned workflow skills but leaves an already installed app product skill unchanged. Regeneration, ownership-schema migration, rename, and removal require `--regenerate-app-skill` and are previewed even when `--write` is present without that flag. `--force` applies only to Noodle-owned project context and never overwrites a modified app-skill file. `--replace-modified-app-skill` is the narrower, separately approved recovery for previously owned app-skill bytes; it never claims unowned collisions or bypasses malformed state.
|
|
30
42
|
|
|
31
|
-
|
|
43
|
+
Run `noodle agents doctor --json`: `agent_skill_modified` means preserve and review local bytes; `agent_skill_stale` means source, surface, renderer, installed files, or ownership schema changed, so preview explicit regeneration; `agent_skill_invalid_state` means the ownership record is malformed or unsafe, so preserve the files and review the record before retrying.
|
|
32
44
|
|
|
33
45
|
Recover `agent_guide_*` errors by correcting the guide shape, workflow IDs, and capability kind/name. Remove any credential-shaped value: managed config is referenced by name only.
|
|
@@ -53,6 +53,7 @@ Platform helper connectors are explicit subpath imports from `@noodleseed/one/pl
|
|
|
53
53
|
|
|
54
54
|
### Other
|
|
55
55
|
|
|
56
|
+
- `authenticatedWebsite`
|
|
56
57
|
- `clientCredentials`
|
|
57
58
|
- `customerEndpoint`
|
|
58
59
|
- `embeddedAssistant`
|
|
@@ -60,6 +61,7 @@ Platform helper connectors are explicit subpath imports from `@noodleseed/one/pl
|
|
|
60
61
|
- `gmailConnector`
|
|
61
62
|
- `managedSecret`
|
|
62
63
|
- `openAICompatible`
|
|
64
|
+
- `publicWebsite`
|
|
63
65
|
|
|
64
66
|
## Authoring signatures
|
|
65
67
|
|
|
@@ -3,7 +3,7 @@ name: reporting-noodle-feedback
|
|
|
3
3
|
description: "Use when a Noodle Seed bug, misleading instruction, missing capability, or concrete product improvement should be proposed to the user."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:0f404109f4845683 -->
|
|
7
7
|
|
|
8
8
|
# reporting-noodle-feedback
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: verifying-mcp-delivery
|
|
|
3
3
|
description: "Use when proving a Noodle Seed MCP project works at a named compile, local, connector, App, host, deployment, or production evidence level."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:6ef6ef551e26b78e -->
|
|
7
7
|
|
|
8
8
|
# verifying-mcp-delivery
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: wrapping-existing-applications
|
|
|
3
3
|
description: "Use when an existing application has no stable usable API and needs a read-only, identity-first Noodle Seed integration plan before implementation."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:eccc3c158dcafba8 -->
|
|
7
7
|
|
|
8
8
|
# wrapping-existing-applications
|
|
9
9
|
|
package/skills/codex/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: noodle-seed
|
|
|
3
3
|
description: "Use when building, validating, testing, deploying, or operating a local or hosted Noodle Seed MCP server or app authored in TypeScript with the noodle CLI."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:13ddce01769caae4 -->
|
|
7
7
|
|
|
8
8
|
# Noodle Seed
|
|
9
9
|
|
|
@@ -19,13 +19,14 @@ If the request is unrelated to the Noodle MCP surface, stop here: follow the pro
|
|
|
19
19
|
|
|
20
20
|
Choose exactly one primary route from the user outcome below, then load the selected sibling skill and hand off the request. Read that primary reference in full; read supporting references only when the sibling or observed evidence requires them. Do not reread the corpus or restart discovery after the handoff.
|
|
21
21
|
|
|
22
|
-
Apply this precedence when wording overlaps: concrete failure evidence takes the debugging route; an MCP App/UI outcome takes the App route; an existing application with no stable, usable API or specification takes `wrapping-existing-applications`; only when all four API-evidence inputs exist—an API base URL, authentication scheme, representative safe read, and observed response—use `connecting-apis-to-mcp`; missing, stale, inaccessible, undocumented-only, or otherwise unusable evidence remains in `wrapping-existing-applications`; both integration routes take precedence over generic server building; hosted inspection is debugging read-only; hosted mutation requires the explicitly requested deployment route.
|
|
22
|
+
Apply this precedence when wording overlaps: concrete failure evidence takes the debugging route; an explicit request to create, revise, regenerate, or recover an app product skill takes `creating-product-agent-guides`; an MCP App/UI outcome takes the App route; an existing application with no stable, usable API or specification takes `wrapping-existing-applications`; only when all four API-evidence inputs exist—an API base URL, authentication scheme, representative safe read, and observed response—use `connecting-apis-to-mcp`; missing, stale, inaccessible, undocumented-only, or otherwise unusable evidence remains in `wrapping-existing-applications`; both integration routes take precedence over generic server building; hosted inspection is debugging read-only; hosted mutation requires the explicitly requested deployment route.
|
|
23
23
|
|
|
24
24
|
Negative routing examples: “Inspect hosted logs/status” → `inspect-hosted` (read-only). “Prepare for deployment” → the applicable build or verification route and stop with a handoff; preparation does not authorize `link`, hosted config, deployment, rollback, host writes, or submission. “Keep this local” → a build or verification route, never a hosted route.
|
|
25
25
|
|
|
26
26
|
| User outcome | Load sibling skill | Canonical playbook | Done when |
|
|
27
27
|
| :--- | :--- | :--- | :--- |
|
|
28
28
|
| Turn a vague MCP product idea into a bounded design before implementation | `designing-mcp-products` | `references/experience-design.md` (`references/authoring-workflow.md`) | The product contract identifies the user benefit, model boundary, evidence, and next implementation skill. |
|
|
29
|
+
| Create, revise, regenerate, or recover the product skill for this MCP server | `creating-product-agent-guides` | `references/product-agent-guides.md` (None) | The grounded TypeScript guide and generated-file plan are proven, with each approved write applied explicitly or left pending. |
|
|
29
30
|
| Plan how to wrap an existing application that has no stable usable public API | `wrapping-existing-applications` | `references/wrap-existing-app.md` (`references/authoring-workflow.md`, `references/tool-design.md`) | A sanitized identity-first capability map and repository-scoped implementation plan are presented for approval before mutation. |
|
|
30
31
|
| Create or extend a headless MCP server whose external API contract is already modeled | `authoring-mcp-servers` | `references/build-an-mcp-server.md` (`references/authoring-workflow.md`, `references/sdk-surface.md`) | The requested server behavior is locally validated and tested; connector reads have real-output evidence. |
|
|
31
32
|
| Connect a real API only when all four API-evidence inputs exist: API base URL, authentication scheme, representative safe read, and observed response | `connecting-apis-to-mcp` | `references/connect-an-api.md` (`references/authoring-workflow.md`) | A representative live read returns populated, intentionally mapped fields without exposing credentials. |
|
|
@@ -56,7 +57,7 @@ Inside the installed plugin, perform mapped steps with `noodle-readiness` tools
|
|
|
56
57
|
This is a lookup catalog, not a discovery checklist. Return here only when the selected primary route names a missing technical detail:
|
|
57
58
|
|
|
58
59
|
- `references/agent-contract.md` — the `--json` envelope, exit codes, and the three output modes.
|
|
59
|
-
- `references/product-agent-guides.md` — decide
|
|
60
|
+
- `references/product-agent-guides.md` — decide, interview, propose, prove, preview, and explicitly install one host-neutral product guide.
|
|
60
61
|
- `references/sdk-surface.md` — what to import from `@noodleseed/one` and which builder to use.
|
|
61
62
|
- `references/cli-commands.md` — every `noodle` command, grouped by area.
|
|
62
63
|
- `references/compile-errors.md` — fix `noodle validate` errors by code.
|
|
@@ -3,7 +3,7 @@ name: authoring-mcp-servers
|
|
|
3
3
|
description: "Use when creating or extending a headless Noodle Seed MCP server, tool, resource, prompt, or typed model-facing capability."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:11523cb33b9473c0 -->
|
|
7
7
|
|
|
8
8
|
# authoring-mcp-servers
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: building-mcp-apps
|
|
|
3
3
|
description: "Use when a Noodle Seed MCP App, widget, interactive card, visual interaction, or host-visible UI is the primary requested outcome."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:9fd67d4d24328e15 -->
|
|
7
7
|
|
|
8
8
|
# building-mcp-apps
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: connecting-apis-to-mcp
|
|
|
3
3
|
description: "Use when all four API-evidence inputs exist—and only then: API base URL, authentication scheme, representative safe read, and observed response."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:21bbd3ec441ffd30 -->
|
|
7
7
|
|
|
8
8
|
# connecting-apis-to-mcp
|
|
9
9
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: creating-product-agent-guides
|
|
3
|
+
description: "Use when a Noodle Seed MCP server needs a new or revised product agent guide, App Package skill, or explicit product-skill regeneration."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:0fa48a82fe836cf0 -->
|
|
7
|
+
|
|
8
|
+
# creating-product-agent-guides
|
|
9
|
+
|
|
10
|
+
Create or revise one grounded TypeScript product guide, prove it locally, and preview every generated-file change before explicit installation.
|
|
11
|
+
|
|
12
|
+
## Use when
|
|
13
|
+
|
|
14
|
+
- Teach agents how to use this MCP product across multiple capabilities.
|
|
15
|
+
- Create, revise, regenerate, or recover an app product skill.
|
|
16
|
+
|
|
17
|
+
## Do not use when
|
|
18
|
+
|
|
19
|
+
- Do not use merely to add or change an MCP capability; use the owning server or App build skill.
|
|
20
|
+
- Do not invent product workflows, capability names, or weaker safety boundaries from source shape alone.
|
|
21
|
+
|
|
22
|
+
## Required inputs
|
|
23
|
+
|
|
24
|
+
- Configured TypeScript entrypoint and its declared MCP capabilities.
|
|
25
|
+
- Builder-confirmed product triggers, workflow judgment, and boundaries that source cannot prove.
|
|
26
|
+
- Separate approval for source editing and generated app-skill installation or replacement.
|
|
27
|
+
|
|
28
|
+
## Workflow
|
|
29
|
+
|
|
30
|
+
Read and follow the canonical playbook `references/product-agent-guides.md` at `../noodle-seed/references/product-agent-guides.md`. It owns the workflow; do not recreate it here or load the command catalog speculatively.
|
|
31
|
+
|
|
32
|
+
## Verification evidence
|
|
33
|
+
|
|
34
|
+
The approved TypeScript guide references only declared capabilities, validation and local smoke pass, and the explicit package plan is either approved and applied or left as a preview.
|
|
35
|
+
|
|
36
|
+
## Recovery paths
|
|
37
|
+
|
|
38
|
+
Repair structured guide errors by exact path; preserve modified or unowned local files and use only the previewed app-skill recovery action the builder approves.
|
|
39
|
+
|
|
40
|
+
## Stop conditions
|
|
41
|
+
|
|
42
|
+
Stop before editing source or materializing generated app-skill files at each separate approval boundary.
|
|
43
|
+
|
|
44
|
+
## Handoff contract
|
|
45
|
+
|
|
46
|
+
Pass the selected outcome, explicit target, changed files, commands run, passing evidence, first unproven evidence layer, sanitized failure, remaining authority, and exact next action. The receiving skill continues from that layer; do not restart discovery or discard prior proof.
|
|
@@ -3,7 +3,7 @@ name: debugging-mcp-delivery
|
|
|
3
3
|
description: "Use when an existing Noodle Seed MCP project has a concrete validation, runtime, connector, App, host, deployment, or production failure."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:aa715bae12041d7c -->
|
|
7
7
|
|
|
8
8
|
# debugging-mcp-delivery
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: deploying-mcp-services
|
|
|
3
3
|
description: "Use when the user explicitly requests a Noodle Seed hosted link, configuration write, deployment, access change, rollback, or connection write."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:93e735b7ffb45df1 -->
|
|
7
7
|
|
|
8
8
|
# deploying-mcp-services
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: designing-mcp-products
|
|
|
3
3
|
description: "Use when a Noodle Seed MCP product idea needs conversational fit, user benefit, scope, interaction, or evidence design before implementation."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:78a6f181b61f92f1 -->
|
|
7
7
|
|
|
8
8
|
# designing-mcp-products
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: embedding-mcp-assistants
|
|
|
3
3
|
description: "Use when embedding a Noodle assistant into an existing SaaS or web application with browser, identity, session, and credential boundaries."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:cc54a67f21c0ecdb -->
|
|
7
7
|
|
|
8
8
|
# embedding-mcp-assistants
|
|
9
9
|
|
|
@@ -7,9 +7,28 @@ deep link. It pairs a `tool` discovery carousel with a model-visible `create_han
|
|
|
7
7
|
server-level `handoff.allowedDomains`.
|
|
8
8
|
|
|
9
9
|
Capability slots: top-of-funnel funnel discipline, discovery carousel widget, `create_handoff` deep-link
|
|
10
|
-
handoff with attribution, `handoff.allowedDomains`,
|
|
11
|
-
wireframe below). It shows the "design the experience, then build
|
|
12
|
-
`references/experience-design.md` teaches.
|
|
10
|
+
handoff with attribution, `handoff.allowedDomains`, the **public website assistant surface**, and a worked
|
|
11
|
+
**design-first** artifact (the UX spec + wireframe below). It shows the "design the experience, then build
|
|
12
|
+
it" flow the `noodle-seed` skill's `references/experience-design.md` teaches.
|
|
13
|
+
|
|
14
|
+
## The same tools on Acme's own website
|
|
15
|
+
|
|
16
|
+
The funnel does not only start in ChatGPT. The `assistant` block projects these same three tools onto
|
|
17
|
+
Acme's marketing site for a visitor with **no account and no session backend**:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
access: publicWebsite({
|
|
21
|
+
origins: ['https://getaways.acme.example'],
|
|
22
|
+
capabilities: [discoverGetaways, createHandoff, shortlistGetaway],
|
|
23
|
+
}),
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
There is no second tool set and no second app — one `server.ts`, projected onto another front door.
|
|
27
|
+
`capabilities` is the entire externally reachable surface, so it stays short enough to review at a glance
|
|
28
|
+
and closed by default: a tool added to this server later is unreachable from the website until someone
|
|
29
|
+
lists it. A tool that needed a signed-in user could not be listed here at all (the compiler rejects it);
|
|
30
|
+
serving those to visitors means `publicWebsite({ ..., signIn: true })`, which lets a visitor sign in
|
|
31
|
+
mid-conversation through Acme's own login.
|
|
13
32
|
|
|
14
33
|
## Design spec (write this before the code)
|
|
15
34
|
|
|
@@ -1,4 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
annotations,
|
|
3
|
+
embeddedAssistant,
|
|
4
|
+
openAICompatible,
|
|
5
|
+
publicWebsite,
|
|
6
|
+
secret,
|
|
7
|
+
server,
|
|
8
|
+
tool,
|
|
9
|
+
variable,
|
|
10
|
+
z,
|
|
11
|
+
} from '@noodleseed/one';
|
|
2
12
|
|
|
3
13
|
// Acme Getaways is a fictional travel brand. This app is deliberately top-of-funnel: discovery and
|
|
4
14
|
// configuration happen inside ChatGPT; the booking/transaction happens off-app on Acme's own site,
|
|
@@ -95,6 +105,97 @@ const destinationOutput = z.object({
|
|
|
95
105
|
why: z.string(),
|
|
96
106
|
});
|
|
97
107
|
|
|
108
|
+
const discoverGetaways = tool('discover_getaways', {
|
|
109
|
+
title: 'Discover getaways',
|
|
110
|
+
description:
|
|
111
|
+
'Suggest Acme Getaways destinations for a vibe and month and render a discovery carousel.',
|
|
112
|
+
annotations: readOnly,
|
|
113
|
+
input: discoverInput,
|
|
114
|
+
output: z.object({
|
|
115
|
+
status: z.string(),
|
|
116
|
+
vibe: z.string(),
|
|
117
|
+
month: z.string(),
|
|
118
|
+
travelers: z.number(),
|
|
119
|
+
// Bounded list: the curated catalog is fixed and small, and the declared ceiling tells the
|
|
120
|
+
// model and host the payload cannot grow. `noodle check` reports `tool_design_output_bounds`.
|
|
121
|
+
options: z.array(destinationOutput).max(20),
|
|
122
|
+
}),
|
|
123
|
+
// The carousel presents Acme's curated catalog; the model narrates which fit the stated vibe.
|
|
124
|
+
// (A tool cannot filter on an input value — that is connector/flow work — so all are returned.)
|
|
125
|
+
fulfil: ({ input }) => ({
|
|
126
|
+
status: `Acme Getaways for a ${input.vibe} trip in ${input.month}, ${input.travelers} traveler(s).`,
|
|
127
|
+
vibe: input.vibe,
|
|
128
|
+
month: input.month,
|
|
129
|
+
travelers: input.travelers,
|
|
130
|
+
options: catalog,
|
|
131
|
+
}),
|
|
132
|
+
viewTitle: 'Discover getaways',
|
|
133
|
+
// ChatGPT host status copy (openai/toolInvocation/*) — required for widget-opening tools.
|
|
134
|
+
invoking: 'Finding getaways…',
|
|
135
|
+
invoked: 'Getaways ready',
|
|
136
|
+
domain: 'https://getaways.acme.example',
|
|
137
|
+
view: {
|
|
138
|
+
component: 'discovery-carousel',
|
|
139
|
+
entry: './views/discovery-carousel.tsx',
|
|
140
|
+
},
|
|
141
|
+
viewDescription:
|
|
142
|
+
'A top-of-funnel discovery carousel: pick a destination, then hand off to Acme to book.',
|
|
143
|
+
csp: {
|
|
144
|
+
connectDomains: ['https://acme.example'],
|
|
145
|
+
resourceDomains: ['https://acme.example'],
|
|
146
|
+
frameDomains: ['https://acme.example'],
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
const createHandoff = tool('create_handoff', {
|
|
151
|
+
title: 'Create booking handoff',
|
|
152
|
+
description:
|
|
153
|
+
'Create the Acme booking deep link for a chosen destination, carrying the configured trip. ' +
|
|
154
|
+
'Pass the destination id (url-safe slug, e.g. "coral_bay") and its display name.',
|
|
155
|
+
annotations: openLink,
|
|
156
|
+
input: z.object({
|
|
157
|
+
destination: destinationId,
|
|
158
|
+
destinationName: z.string().min(1),
|
|
159
|
+
month: monthEnum,
|
|
160
|
+
travelers: z.number().int().min(1).default(2),
|
|
161
|
+
}),
|
|
162
|
+
output: z.object({
|
|
163
|
+
status: z.string(),
|
|
164
|
+
destination: z.string(),
|
|
165
|
+
summary: z.string(),
|
|
166
|
+
handoffUrl: z.string(),
|
|
167
|
+
}),
|
|
168
|
+
// Inline the inputs directly so they substitute at runtime; every value is already url-safe
|
|
169
|
+
// (id slug, month enum, integer), and `src=chatgpt` is the attribution the partner measures
|
|
170
|
+
// ChatGPT-sourced conversions on.
|
|
171
|
+
fulfil: ({ input }) => ({
|
|
172
|
+
status: `Ready to continue on Acme for ${input.destinationName}.`,
|
|
173
|
+
destination: input.destination,
|
|
174
|
+
summary: `${input.destinationName} · ${input.month} · ${input.travelers} traveler(s)`,
|
|
175
|
+
handoffUrl: `https://book.acme.example/plan?dest=${input.destination}&month=${input.month}&pax=${input.travelers}&src=chatgpt`,
|
|
176
|
+
}),
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
const shortlistGetaway = tool('shortlist_getaway', {
|
|
180
|
+
visibility: ['app'],
|
|
181
|
+
description: 'Record the traveler’s shortlisted destination from the discovery widget.',
|
|
182
|
+
annotations: localWrite,
|
|
183
|
+
input: z.object({
|
|
184
|
+
destination: z.string(),
|
|
185
|
+
note: z.string().default(''),
|
|
186
|
+
}),
|
|
187
|
+
output: z.object({
|
|
188
|
+
status: z.string(),
|
|
189
|
+
destination: z.string(),
|
|
190
|
+
note: z.string(),
|
|
191
|
+
}),
|
|
192
|
+
fulfil: ({ input }) => ({
|
|
193
|
+
status: `Shortlisted ${input.destination}.`,
|
|
194
|
+
destination: input.destination,
|
|
195
|
+
note: input.note,
|
|
196
|
+
}),
|
|
197
|
+
});
|
|
198
|
+
|
|
98
199
|
export default server(
|
|
99
200
|
'acme_discovery',
|
|
100
201
|
{
|
|
@@ -113,95 +214,23 @@ export default server(
|
|
|
113
214
|
handoff: {
|
|
114
215
|
allowedDomains: ['https://book.acme.example', 'https://acme.example'],
|
|
115
216
|
},
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
status: z.string(),
|
|
126
|
-
vibe: z.string(),
|
|
127
|
-
month: z.string(),
|
|
128
|
-
travelers: z.number(),
|
|
129
|
-
// Bounded list: the curated catalog is fixed and small, and the declared ceiling tells the
|
|
130
|
-
// model and host the payload cannot grow. `noodle check` reports `tool_design_output_bounds`.
|
|
131
|
-
options: z.array(destinationOutput).max(20),
|
|
217
|
+
// The same three tools also serve Acme's own marketing site, with no second tool set and no
|
|
218
|
+
// session backend: a visitor with no account gets the discovery carousel and the booking
|
|
219
|
+
// handoff. `capabilities` is the whole externally reachable surface — short enough to review in
|
|
220
|
+
// one glance, and closed by default when a tool is added to the server later.
|
|
221
|
+
assistant: embeddedAssistant({
|
|
222
|
+
model: openAICompatible({
|
|
223
|
+
baseUrl: variable('ASSISTANT_MODEL_BASE_URL'),
|
|
224
|
+
model: variable('ASSISTANT_MODEL'),
|
|
225
|
+
apiKey: secret('ASSISTANT_MODEL_API_KEY'),
|
|
132
226
|
}),
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
status: `Acme Getaways for a ${input.vibe} trip in ${input.month}, ${input.travelers} traveler(s).`,
|
|
137
|
-
vibe: input.vibe,
|
|
138
|
-
month: input.month,
|
|
139
|
-
travelers: input.travelers,
|
|
140
|
-
options: catalog,
|
|
227
|
+
access: publicWebsite({
|
|
228
|
+
origins: ['https://getaways.acme.example'],
|
|
229
|
+
capabilities: [discoverGetaways, createHandoff, shortlistGetaway],
|
|
141
230
|
}),
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
invoking: 'Finding getaways…',
|
|
145
|
-
invoked: 'Getaways ready',
|
|
146
|
-
domain: 'https://getaways.acme.example',
|
|
147
|
-
view: {
|
|
148
|
-
component: 'discovery-carousel',
|
|
149
|
-
entry: './views/discovery-carousel.tsx',
|
|
150
|
-
},
|
|
151
|
-
viewDescription:
|
|
152
|
-
'A top-of-funnel discovery carousel: pick a destination, then hand off to Acme to book.',
|
|
153
|
-
csp: {
|
|
154
|
-
connectDomains: ['https://acme.example'],
|
|
155
|
-
resourceDomains: ['https://acme.example'],
|
|
156
|
-
frameDomains: ['https://acme.example'],
|
|
157
|
-
},
|
|
231
|
+
layout: { mode: 'floating', position: 'bottom-right' },
|
|
232
|
+
labels: { welcomeHeading: 'Where would you like to go?' },
|
|
158
233
|
}),
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
description:
|
|
162
|
-
'Create the Acme booking deep link for a chosen destination, carrying the configured trip. ' +
|
|
163
|
-
'Pass the destination id (url-safe slug, e.g. "coral_bay") and its display name.',
|
|
164
|
-
annotations: openLink,
|
|
165
|
-
input: z.object({
|
|
166
|
-
destination: destinationId,
|
|
167
|
-
destinationName: z.string().min(1),
|
|
168
|
-
month: monthEnum,
|
|
169
|
-
travelers: z.number().int().min(1).default(2),
|
|
170
|
-
}),
|
|
171
|
-
output: z.object({
|
|
172
|
-
status: z.string(),
|
|
173
|
-
destination: z.string(),
|
|
174
|
-
summary: z.string(),
|
|
175
|
-
handoffUrl: z.string(),
|
|
176
|
-
}),
|
|
177
|
-
// Inline the inputs directly so they substitute at runtime; every value is already url-safe
|
|
178
|
-
// (id slug, month enum, integer), and `src=chatgpt` is the attribution the partner measures
|
|
179
|
-
// ChatGPT-sourced conversions on.
|
|
180
|
-
fulfil: ({ input }) => ({
|
|
181
|
-
status: `Ready to continue on Acme for ${input.destinationName}.`,
|
|
182
|
-
destination: input.destination,
|
|
183
|
-
summary: `${input.destinationName} · ${input.month} · ${input.travelers} traveler(s)`,
|
|
184
|
-
handoffUrl: `https://book.acme.example/plan?dest=${input.destination}&month=${input.month}&pax=${input.travelers}&src=chatgpt`,
|
|
185
|
-
}),
|
|
186
|
-
}),
|
|
187
|
-
tool('shortlist_getaway', {
|
|
188
|
-
visibility: ['app'],
|
|
189
|
-
description: 'Record the traveler’s shortlisted destination from the discovery widget.',
|
|
190
|
-
annotations: localWrite,
|
|
191
|
-
input: z.object({
|
|
192
|
-
destination: z.string(),
|
|
193
|
-
note: z.string().default(''),
|
|
194
|
-
}),
|
|
195
|
-
output: z.object({
|
|
196
|
-
status: z.string(),
|
|
197
|
-
destination: z.string(),
|
|
198
|
-
note: z.string(),
|
|
199
|
-
}),
|
|
200
|
-
fulfil: ({ input }) => ({
|
|
201
|
-
status: `Shortlisted ${input.destination}.`,
|
|
202
|
-
destination: input.destination,
|
|
203
|
-
note: input.note,
|
|
204
|
-
}),
|
|
205
|
-
}),
|
|
206
|
-
],
|
|
234
|
+
},
|
|
235
|
+
[discoverGetaways, createHandoff, shortlistGetaway],
|
|
207
236
|
);
|
|
@@ -82,8 +82,9 @@ noodle open
|
|
|
82
82
|
|
|
83
83
|
## Optional in-product assistant
|
|
84
84
|
|
|
85
|
-
The
|
|
86
|
-
server
|
|
85
|
+
The default SaaS and widget scaffolds are credential-free. When the product deliberately includes an
|
|
86
|
+
assistant, use the existing server tools and add an `assistant` option to the same `server.ts` instead of
|
|
87
|
+
creating a second entrypoint or tool set:
|
|
87
88
|
|
|
88
89
|
```ts
|
|
89
90
|
assistant: embeddedAssistant({
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
annotations,
|
|
3
|
+
authenticatedWebsite,
|
|
3
4
|
connector,
|
|
4
5
|
customerAuth,
|
|
5
6
|
customerEndpoint,
|
|
@@ -113,11 +114,13 @@ export default server(
|
|
|
113
114
|
apiKey: secret('ASSISTANT_MODEL_API_KEY'),
|
|
114
115
|
}),
|
|
115
116
|
// Production origins are exact HTTPS; http://localhost:<port> is allowed for local development.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
117
|
+
access: authenticatedWebsite({
|
|
118
|
+
origins: [
|
|
119
|
+
'https://app.noodleseed.com',
|
|
120
|
+
'https://dev.noodleseed.com',
|
|
121
|
+
'http://localhost:3000',
|
|
122
|
+
],
|
|
123
|
+
}),
|
|
121
124
|
layout: { mode: 'floating', position: 'bottom-right', panelWidth: 420 },
|
|
122
125
|
labels: {
|
|
123
126
|
welcomeHeading: 'How can I help with Noodle Seed?',
|
|
@@ -32,7 +32,8 @@ It exercises, in one TypeScript-authored app:
|
|
|
32
32
|
to `[]`.
|
|
33
33
|
- **A per-operation transport bound** — `search_list` sets
|
|
34
34
|
`limits: { maxResponseBytes: 256 * 1024 }`, tightening this known-small endpoint below the 1 MiB default.
|
|
35
|
-
|
|
35
|
+
The authoring ceiling is 6 MiB, but grant only the bytes representative evidence proves this operation
|
|
36
|
+
needs.
|
|
36
37
|
- **Sandboxed compute** (no network/fs/env/clock) turning raw numbers into conditions + advice.
|
|
37
38
|
- **Typed input/output schemas** emitted as JSON Schema 2020-12.
|
|
38
39
|
|
|
@@ -3,7 +3,7 @@ name: executing-noodle-plans
|
|
|
3
3
|
description: "Use when the user asks to execute an approved, decision-complete implementation plan for a Noodle Seed project task by task with test-first changes, review, recovery, and final verification."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:6a9f132ddb79352e -->
|
|
7
7
|
|
|
8
8
|
# Execute a Noodle Seed implementation plan
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: publishing-mcp-integrations
|
|
|
3
3
|
description: "Use when preparing, reviewing, or submitting a Noodle Seed MCP integration to a host or app directory."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.
|
|
6
|
+
<!-- noodle-skill version:0.66.0 hash:efffbf82007f935d -->
|
|
7
7
|
|
|
8
8
|
# publishing-mcp-integrations
|
|
9
9
|
|
|
@@ -67,6 +67,9 @@ Run `noodle validate` (add `--json` for the machine-readable envelope, `--fix-pr
|
|
|
67
67
|
| `customer_endpoint_mapping_required` | Add the endpoint key at the cited auth routing path; every direct/federated issuer must map every customer endpoint used by the app. |
|
|
68
68
|
| `customer_endpoint_unknown_mapping` | Remove the unknown or unused auth routing key, or use that exact declared `customerEndpoint` key from a reachable connector operation. |
|
|
69
69
|
| `customer_endpoint_bridge_unsupported` | Replace the Firebase/Microsoft bridge with direct or federated OIDC before using auth-derived customer connector endpoints. |
|
|
70
|
+
| `assistant_capability_unknown` | Name a tool, resource, or prompt this server declares in `embeddedAssistant({ capabilities })`, or remove the entry; capabilities reference declared components, not arbitrary names. |
|
|
71
|
+
| `assistant_public_user_reference` | Remove the `${user...}` reference from this tool or drop it from the public assistant `capabilities`; a public website visitor is anonymous, so there is no signed-in user to read. |
|
|
72
|
+
| `assistant_public_effect_unconfirmed` | Add `annotations.readOnly()` if this projected tool only reads, or `{ confirm: true }` if it causes an external effect; a public assistant never reaches an unconfirmed side effect. |
|
|
70
73
|
| `customer_endpoint_action_unsupported` | Set exact `annotations.confirm: true` on the enclosing tool, or keep the customer-routed operation read-only; action hints alone do not enable confirmation. |
|
|
71
74
|
| `customer_endpoint_surface_unsupported` | Move the customer-routed call into a tool fulfilment; routed resources, prompts, and ambient providers are unsupported. |
|
|
72
75
|
| `customer_endpoint_credential_source_unsupported` | Remove the manifest connection binding; a customer-routed connector uses its declared delegated token exchange auth or no auth. |
|
|
@@ -116,12 +116,12 @@ response: { tasks: '${response.items}' },
|
|
|
116
116
|
HTTP operations default to a 1 MiB decoded-response limit. Narrow the upstream query, paginate, or
|
|
117
117
|
reduce the requested dataset before raising it; a `response` mapping runs only after the raw body is
|
|
118
118
|
buffered. When representative evidence proves one operation legitimately needs more, grant only that
|
|
119
|
-
operation the required bytes, up to the
|
|
119
|
+
operation the required bytes, up to the 6 MiB authoring maximum:
|
|
120
120
|
|
|
121
121
|
```ts
|
|
122
122
|
search: {
|
|
123
123
|
type: 'read', method: 'GET', path: '/search',
|
|
124
|
-
limits: { maxResponseBytes:
|
|
124
|
+
limits: { maxResponseBytes: 6 * 1024 * 1024 },
|
|
125
125
|
// input / output / response omitted
|
|
126
126
|
},
|
|
127
127
|
```
|