@noodleseed/agent-kit 0.48.0 → 0.48.2
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 +245 -245
- package/package.json +1 -1
- package/skills/claude-code/SKILL.md +1 -1
- 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/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 +2 -1
- package/skills/claude-code/examples/customer-auth/README.md +13 -0
- 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/embedded-assistant.md +34 -2
- package/skills/claude-code/references/troubleshooting.md +1 -1
- package/skills/claude-code/references/widgets-and-apps.md +3 -1
- package/skills/claude-code/reporting-noodle-feedback/SKILL.md +1 -1
- package/skills/claude-code/verifying-mcp-delivery/SKILL.md +1 -1
- package/skills/codex/SKILL.md +1 -1
- 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/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 +2 -1
- package/skills/codex/examples/customer-auth/README.md +13 -0
- package/skills/codex/executing-noodle-plans/SKILL.md +1 -1
- package/skills/codex/publishing-mcp-integrations/SKILL.md +1 -1
- package/skills/codex/references/embedded-assistant.md +34 -2
- package/skills/codex/references/troubleshooting.md +1 -1
- package/skills/codex/references/widgets-and-apps.md +3 -1
- package/skills/codex/reporting-noodle-feedback/SKILL.md +1 -1
- package/skills/codex/verifying-mcp-delivery/SKILL.md +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noodleseed/agent-kit",
|
|
3
|
-
"version": "0.48.
|
|
3
|
+
"version": "0.48.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Self-checking, self-updating agent skills for the Noodle Seed CLI. Authored in this repo by @noodle-borg/agent-kit; this is the published, independently-versioned canonical skills artifact the CLI fetches and verifies.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:cd6ca0d915e6acb9 -->
|
|
7
7
|
|
|
8
8
|
# Noodle Seed
|
|
9
9
|
|
|
@@ -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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:0b2fd8c7e43fc69f -->
|
|
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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:f7fa54992c8d7692 -->
|
|
7
7
|
|
|
8
8
|
# building-mcp-apps
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: connecting-apis-to-mcp
|
|
|
3
3
|
description: "Use when credentials, an API URL, an OpenAPI document, or an observed response must become real Noodle Seed MCP behavior."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:1e86b8704f407bd3 -->
|
|
7
7
|
|
|
8
8
|
# connecting-apis-to-mcp
|
|
9
9
|
|
|
@@ -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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:76cce86729cffbee -->
|
|
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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:cc54a67f21c0ecdb -->
|
|
7
7
|
|
|
8
8
|
# embedding-mcp-assistants
|
|
9
9
|
|
|
@@ -22,6 +22,7 @@ Deliver the requested assistant embed with identity and credential separation pr
|
|
|
22
22
|
## Required inputs
|
|
23
23
|
|
|
24
24
|
- Application origin and mounting point.
|
|
25
|
+
- Desired built-in or custom browser experience.
|
|
25
26
|
- Identity/session boundary.
|
|
26
27
|
- Requested local or hosted evidence level.
|
|
27
28
|
|
|
@@ -335,6 +335,19 @@ rerenders keep the iframe and only a different view or unmount tears down the br
|
|
|
335
335
|
Never inject `part.data.html`, assign it to `srcdoc`, fetch a `ui://` URI, or reproduce the bridge directly. Pages with a
|
|
336
336
|
Content-Security-Policy must include the Noodle service origin in both `connect-src` and `frame-src`.
|
|
337
337
|
|
|
338
|
+
Before the production-equivalent host build, run the presence-only handoff check:
|
|
339
|
+
|
|
340
|
+
```sh
|
|
341
|
+
noodle assistant embed --check --json
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Add application-owned delegated-exchange requirements with repeatable `--require-env NAME` flags. The JSON
|
|
345
|
+
reports required and missing names, CSP status, and post-deploy probes without returning environment values
|
|
346
|
+
or writing scaffold files. Map the names through the production secret manager, CI environment, and any
|
|
347
|
+
secret allowlist; regenerate existing framework-owned environment binding types before the build. Default
|
|
348
|
+
Devtools/model exercises to synthetic data, and obtain approval before sending real connector data to an
|
|
349
|
+
external model.
|
|
350
|
+
|
|
338
351
|
After deployment, verify the public delegated exchange without extracting a customer bearer token or invoking
|
|
339
352
|
a business operation:
|
|
340
353
|
|
|
@@ -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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:efffbf82007f935d -->
|
|
7
7
|
|
|
8
8
|
# publishing-mcp-integrations
|
|
9
9
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
## Contents
|
|
4
4
|
|
|
5
5
|
- Architecture
|
|
6
|
+
- Choose the host experience
|
|
6
7
|
- Author and validate
|
|
7
8
|
- Customize the presentation
|
|
8
9
|
- Configure and deploy
|
|
@@ -13,6 +14,7 @@
|
|
|
13
14
|
- Verified session context (identity and claims)
|
|
14
15
|
- The session response
|
|
15
16
|
- Choose a browser renderer
|
|
17
|
+
- Host readiness and promotion
|
|
16
18
|
- Toolchain requirements
|
|
17
19
|
- Verify the boundary
|
|
18
20
|
- Troubleshooting: symptom to diagnosis
|
|
@@ -21,12 +23,19 @@
|
|
|
21
23
|
|
|
22
24
|
The browser never receives a model key, assistant client secret, MCP token, or raw application session. The embedding SaaS authenticates its own user, its backend exchanges that verified identity through `@noodleseed/assistant/server`, and the browser receives only a short-lived assistant session.
|
|
23
25
|
|
|
24
|
-
Keep
|
|
26
|
+
Keep every credential and identity layer separate:
|
|
25
27
|
|
|
26
28
|
| Owner | Values | Destination |
|
|
27
29
|
| --- | --- | --- |
|
|
30
|
+
| Noodle operator | Login, selected org/app/env | Plugin-managed CLI profile and explicit target; never the SaaS runtime |
|
|
28
31
|
| Noodle deployment | `ASSISTANT_MODEL_BASE_URL`, `ASSISTANT_MODEL`, `ASSISTANT_MODEL_API_KEY` | `noodle variables set` / `noodle secrets set`; never the SaaS environment |
|
|
29
|
-
|
|
|
32
|
+
| Connector/delegated exchange | Connector credentials and any customer-owned token-exchange client | Noodle managed configuration plus the matching customer backend secret manager |
|
|
33
|
+
| SaaS backend | `NOODLE_SERVICE_URL`, `NOODLE_ASSISTANT_CLIENT_ID`, `NOODLE_ASSISTANT_CLIENT_SECRET`, `PUBLIC_APP_ORIGIN` | Backend-only environment or secret manager; never browser code or public-prefixed variables |
|
|
34
|
+
| Browser | Short-lived assistant session only | In memory; never a client secret, model key, connector credential, or raw application session |
|
|
35
|
+
|
|
36
|
+
## Choose the host experience
|
|
37
|
+
|
|
38
|
+
Before choosing code, ask the user which experience belongs in the existing product: the built-in floating, inline, or drawer assistant; a custom chat-first renderer; or a headless client feeding application-owned UI. Default to the built-in floating assistant only when the user has no preference. Preserve the host application until the user opens or submits into the assistant; do not copy one flagship layout into every product.
|
|
30
39
|
|
|
31
40
|
## Author and validate
|
|
32
41
|
|
|
@@ -464,6 +473,23 @@ assistant.subscribe((event) => {
|
|
|
464
473
|
|
|
465
474
|
`clientContext` and typed `pageContext` are recomputed for each turn. `updateContext(...)` remains the legacy session-exchange context; `updatePageContext(...)` replaces the fresh per-turn application hint. `updateModelContext({ content, structuredContent })` publishes one cohesive renderer snapshot for later message turns without starting a turn; every call replaces the prior snapshot rather than merging fields. These are untrusted data, not conversation history or authorization input, and the boundaries reject credential-shaped or unbounded updates. A message may re-exchange once after a pre-execution `401`; the client never auto-retries interaction decisions. `tool_proposed.arguments` is a complete schema-aware review projection and, for connector-backed tools, names the sole exact connector version/operation/resolved arguments. Sensitive/write-only fields are redacted; truncating or omitting any non-sensitive action field fails closed. Accept is bound to the server-held action and claims at most one execution attempt—clients cannot replace it. Normal terminal outcomes scrub private arguments and continuations immediately; only an accepted action still executing retains them for the one-hour unknown-outcome recovery window, after which it records `interaction_outcome_unknown` and scrubs. Without downstream idempotency this is not an exactly-once business-effect guarantee. To reconcile a lost response, explicitly repeat the same id and decision: the service returns its durable stored outcome without re-execution.
|
|
466
475
|
|
|
476
|
+
## Host readiness and promotion
|
|
477
|
+
|
|
478
|
+
Run the non-mutating host preflight from the embedding application before its production build:
|
|
479
|
+
|
|
480
|
+
```sh
|
|
481
|
+
noodle assistant embed --check --json
|
|
482
|
+
noodle assistant embed --check --json --require-env EXAMPLE_DELEG_CLIENT_SECRET
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
The check reports only required and missing environment names, never their values. It checks both `connect-src` and `frame-src` when a common static host CSP is determinable, fails on missing directives, and marks a dynamic expression unverified instead of guessing. Additional `--require-env` names are application-owned; use them for the customer side of delegated exchange or other backend-only integration requirements.
|
|
486
|
+
|
|
487
|
+
Inspect the host repository for generated environment bindings after adding names. Run its existing generator, review the diff, commit generated types only when that repository requires them, then run the production-equivalent host build. Do not invent a framework command or add a second generator.
|
|
488
|
+
|
|
489
|
+
Promotion checklist: provision each environment in the backend secret manager; map names through the CI environment and any secret allowlist or secrets file; run the presence-only preflight before asset upload; promote configuration before code; run the post-deploy probes from the JSON contract; rotate the assistant client and delegated credential independently, then rerun the same checks.
|
|
490
|
+
|
|
491
|
+
Devtools privacy gate: default model and connector exercises to synthetic or mock data. Before Devtools Chat sends real connector data to an external model, disclose the data flow and obtain the user's approval. A local validation pass is not that approval.
|
|
492
|
+
|
|
467
493
|
## Toolchain requirements
|
|
468
494
|
|
|
469
495
|
- Node.js 20+ for `@noodleseed/assistant/server`.
|
|
@@ -479,6 +505,8 @@ assistant.subscribe((event) => {
|
|
|
479
505
|
- An expired turn re-exchanges once; interaction decisions never auto-retry. An explicit same-decision repeat returns the stored outcome without executing again.
|
|
480
506
|
- Accept, decline, and cancel are single-use. Only accept executes; the server ignores replacement tool arguments.
|
|
481
507
|
- Wrong-origin and malformed-origin requests fail closed.
|
|
508
|
+
- Run the production-equivalent host build after regenerating environment bindings.
|
|
509
|
+
- In a real browser, submit with the keyboard, inspect console and network failures, complete session exchange and one tool turn, and render one linked App before claiming the host works.
|
|
482
510
|
|
|
483
511
|
## Troubleshooting: symptom to diagnosis
|
|
484
512
|
|
|
@@ -492,6 +520,10 @@ assistant.subscribe((event) => {
|
|
|
492
520
|
| Validate rejects an origin | Non-loopback HTTP origin in `allowedOrigins` | Use the exact HTTPS production origin; HTTP is only for `localhost`/`127.0.0.1` |
|
|
493
521
|
| Session exchange returns 404 | `serviceUrl` points at the deployment MCP endpoint | Use the control-plane service URL printed by `noodle assistant clients create` |
|
|
494
522
|
| Session exchange returns 403 `origin is not allowed` | Request origin differs from `allowedOrigins` character-for-character | Align the exact scheme/host/port on both sides and redeploy |
|
|
523
|
+
| Host session 503 | A required backend environment name is absent or mapped into the wrong deployment environment | Run `noodle assistant embed --check --json`, repair the host CI mapping, then probe the session route again |
|
|
524
|
+
| `HEAD` on a widget or session path looks broken | The route contract is `GET` for the hosted sandbox/widget document or `POST` for session exchange; `HEAD` is not the product flow | Exercise the documented method and inspect its response instead of inferring readiness from `HEAD` |
|
|
525
|
+
| Local server reports `listen EPERM` | The coding sandbox blocked loopback binding before application behavior ran | Rerun the same local/browser test with approved loopback permissions; do not change product code |
|
|
526
|
+
| Tool succeeds but the widget is empty | The linked App delivery layer failed: result shape, resource link, CSP frame, or bridge hydration | Inspect the typed result, `view_available`, resource URI, browser console, and hosted frame separately |
|
|
495
527
|
| Hydration or `HTMLElement is not defined` errors | The component mounted during server rendering | Mount client-only (`"use client"` or `next/dynamic` with `ssr: false`) |
|
|
496
528
|
| A tool runs without the expected confirmation | Its compiled annotations omit `confirm: true` or explicitly set `false` | Pass `{ confirm: true }` to the action helper; action hints alone never gate. `noodle check --target embedded-assistant` lists every confirm-gated tool |
|
|
497
529
|
| `${user.claims.<key>}` is empty | Claim not declared in `sessionClaims` (or key typo) — undeclared claims are dropped at exchange | Declare the key in `embeddedAssistant({ sessionClaims })` and redeploy |
|
|
@@ -22,7 +22,7 @@ For protocol/conformance checks, the headless harness is `@mcpjam/cli`, not a `n
|
|
|
22
22
|
| Tool succeeds but no widget appears | The tool has no view, or the host surface doesn’t support MCP Apps | Use `tool`, run `noodle check`, preview with `noodle devtools`; on non-Apps surfaces only the text/structured result renders |
|
|
23
23
|
| Widget shows stale or missing data | The widget reads `structuredContent`, which must match the `output` schema | Make `fulfil` return exactly the `output` shape (arrays and nested objects are supported); inspect the live result with `noodle devtools` |
|
|
24
24
|
| `useCallTool` fails from the widget | Tool name mismatch, or the helper tool is model-visible | List names with `noodle tools`; widget-only helpers must be declared with `tool` |
|
|
25
|
-
| `noodle validate` passes but React views fail to bundle (“requires Vite”) |
|
|
25
|
+
| `noodle validate` passes but React views fail to bundle (“requires Vite”) | Vite is missing from the app dependencies or its dependencies are not installed — widget bundling uses the app-local Vite | Run `npm install --save-dev vite`, then retry `noodle validate` / `noodle dev` / `noodle deploy` |
|
|
26
26
|
| Hosted endpoint returns 401 to probes | Expected: hosted servers challenge unauthenticated calls with OAuth metadata | Sign in from the host when prompted; widen who may call with `noodle access set` if testers are outside the org |
|
|
27
27
|
| Tools error only after deploy | Runtime/config differences surface hosted (secrets, connector reachability) | Run `noodle smoke`, then `noodle metrics --agent-output` and `noodle events --tool <name> --status tool_error --json`; check `noodle secrets list` scope |
|
|
28
28
|
| A connector tool validates and lists, but returns empty or `undefined` fields | The `response` mapping references a path the API does not return — usually the wrong root (a `.body` segment, when the parsed body is bound directly to `${response}`) or the wrong shape | Run `noodle tools call <name> --args <json>` with the secret set and compare the mapped result to the API’s real JSON; map from `${response.<path>}` (the body is `${response}`, there is no `.body`) and use bracket array indices (`${response.items[0].id}`) |
|
|
@@ -270,4 +270,6 @@ Declare extra host capabilities with `permissions` (e.g. `permissions: { clipboa
|
|
|
270
270
|
|
|
271
271
|
## Readiness and boundaries
|
|
272
272
|
|
|
273
|
-
|
|
273
|
+
React views use the app-local Vite bundler. When adding a view to an existing project that does not declare Vite, run `npm install --save-dev vite` before validation.
|
|
274
|
+
|
|
275
|
+
Run `noodle validate` first, `noodle check` for widget/Apps readiness, and `noodle devtools` to preview metadata and rendering. Brand via the `server` `branding` tokens (the compiler derives the palette); do not inject raw global CSS.
|
|
@@ -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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:6ef6ef551e26b78e -->
|
|
7
7
|
|
|
8
8
|
# verifying-mcp-delivery
|
|
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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:cd6ca0d915e6acb9 -->
|
|
7
7
|
|
|
8
8
|
# Noodle Seed
|
|
9
9
|
|
|
@@ -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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:0b2fd8c7e43fc69f -->
|
|
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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:f7fa54992c8d7692 -->
|
|
7
7
|
|
|
8
8
|
# building-mcp-apps
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: connecting-apis-to-mcp
|
|
|
3
3
|
description: "Use when credentials, an API URL, an OpenAPI document, or an observed response must become real Noodle Seed MCP behavior."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- noodle-skill version:0.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:1e86b8704f407bd3 -->
|
|
7
7
|
|
|
8
8
|
# connecting-apis-to-mcp
|
|
9
9
|
|
|
@@ -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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:76cce86729cffbee -->
|
|
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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:cc54a67f21c0ecdb -->
|
|
7
7
|
|
|
8
8
|
# embedding-mcp-assistants
|
|
9
9
|
|
|
@@ -22,6 +22,7 @@ Deliver the requested assistant embed with identity and credential separation pr
|
|
|
22
22
|
## Required inputs
|
|
23
23
|
|
|
24
24
|
- Application origin and mounting point.
|
|
25
|
+
- Desired built-in or custom browser experience.
|
|
25
26
|
- Identity/session boundary.
|
|
26
27
|
- Requested local or hosted evidence level.
|
|
27
28
|
|
|
@@ -335,6 +335,19 @@ rerenders keep the iframe and only a different view or unmount tears down the br
|
|
|
335
335
|
Never inject `part.data.html`, assign it to `srcdoc`, fetch a `ui://` URI, or reproduce the bridge directly. Pages with a
|
|
336
336
|
Content-Security-Policy must include the Noodle service origin in both `connect-src` and `frame-src`.
|
|
337
337
|
|
|
338
|
+
Before the production-equivalent host build, run the presence-only handoff check:
|
|
339
|
+
|
|
340
|
+
```sh
|
|
341
|
+
noodle assistant embed --check --json
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Add application-owned delegated-exchange requirements with repeatable `--require-env NAME` flags. The JSON
|
|
345
|
+
reports required and missing names, CSP status, and post-deploy probes without returning environment values
|
|
346
|
+
or writing scaffold files. Map the names through the production secret manager, CI environment, and any
|
|
347
|
+
secret allowlist; regenerate existing framework-owned environment binding types before the build. Default
|
|
348
|
+
Devtools/model exercises to synthetic data, and obtain approval before sending real connector data to an
|
|
349
|
+
external model.
|
|
350
|
+
|
|
338
351
|
After deployment, verify the public delegated exchange without extracting a customer bearer token or invoking
|
|
339
352
|
a business operation:
|
|
340
353
|
|
|
@@ -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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:efffbf82007f935d -->
|
|
7
7
|
|
|
8
8
|
# publishing-mcp-integrations
|
|
9
9
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
## Contents
|
|
4
4
|
|
|
5
5
|
- Architecture
|
|
6
|
+
- Choose the host experience
|
|
6
7
|
- Author and validate
|
|
7
8
|
- Customize the presentation
|
|
8
9
|
- Configure and deploy
|
|
@@ -13,6 +14,7 @@
|
|
|
13
14
|
- Verified session context (identity and claims)
|
|
14
15
|
- The session response
|
|
15
16
|
- Choose a browser renderer
|
|
17
|
+
- Host readiness and promotion
|
|
16
18
|
- Toolchain requirements
|
|
17
19
|
- Verify the boundary
|
|
18
20
|
- Troubleshooting: symptom to diagnosis
|
|
@@ -21,12 +23,19 @@
|
|
|
21
23
|
|
|
22
24
|
The browser never receives a model key, assistant client secret, MCP token, or raw application session. The embedding SaaS authenticates its own user, its backend exchanges that verified identity through `@noodleseed/assistant/server`, and the browser receives only a short-lived assistant session.
|
|
23
25
|
|
|
24
|
-
Keep
|
|
26
|
+
Keep every credential and identity layer separate:
|
|
25
27
|
|
|
26
28
|
| Owner | Values | Destination |
|
|
27
29
|
| --- | --- | --- |
|
|
30
|
+
| Noodle operator | Login, selected org/app/env | Plugin-managed CLI profile and explicit target; never the SaaS runtime |
|
|
28
31
|
| Noodle deployment | `ASSISTANT_MODEL_BASE_URL`, `ASSISTANT_MODEL`, `ASSISTANT_MODEL_API_KEY` | `noodle variables set` / `noodle secrets set`; never the SaaS environment |
|
|
29
|
-
|
|
|
32
|
+
| Connector/delegated exchange | Connector credentials and any customer-owned token-exchange client | Noodle managed configuration plus the matching customer backend secret manager |
|
|
33
|
+
| SaaS backend | `NOODLE_SERVICE_URL`, `NOODLE_ASSISTANT_CLIENT_ID`, `NOODLE_ASSISTANT_CLIENT_SECRET`, `PUBLIC_APP_ORIGIN` | Backend-only environment or secret manager; never browser code or public-prefixed variables |
|
|
34
|
+
| Browser | Short-lived assistant session only | In memory; never a client secret, model key, connector credential, or raw application session |
|
|
35
|
+
|
|
36
|
+
## Choose the host experience
|
|
37
|
+
|
|
38
|
+
Before choosing code, ask the user which experience belongs in the existing product: the built-in floating, inline, or drawer assistant; a custom chat-first renderer; or a headless client feeding application-owned UI. Default to the built-in floating assistant only when the user has no preference. Preserve the host application until the user opens or submits into the assistant; do not copy one flagship layout into every product.
|
|
30
39
|
|
|
31
40
|
## Author and validate
|
|
32
41
|
|
|
@@ -464,6 +473,23 @@ assistant.subscribe((event) => {
|
|
|
464
473
|
|
|
465
474
|
`clientContext` and typed `pageContext` are recomputed for each turn. `updateContext(...)` remains the legacy session-exchange context; `updatePageContext(...)` replaces the fresh per-turn application hint. `updateModelContext({ content, structuredContent })` publishes one cohesive renderer snapshot for later message turns without starting a turn; every call replaces the prior snapshot rather than merging fields. These are untrusted data, not conversation history or authorization input, and the boundaries reject credential-shaped or unbounded updates. A message may re-exchange once after a pre-execution `401`; the client never auto-retries interaction decisions. `tool_proposed.arguments` is a complete schema-aware review projection and, for connector-backed tools, names the sole exact connector version/operation/resolved arguments. Sensitive/write-only fields are redacted; truncating or omitting any non-sensitive action field fails closed. Accept is bound to the server-held action and claims at most one execution attempt—clients cannot replace it. Normal terminal outcomes scrub private arguments and continuations immediately; only an accepted action still executing retains them for the one-hour unknown-outcome recovery window, after which it records `interaction_outcome_unknown` and scrubs. Without downstream idempotency this is not an exactly-once business-effect guarantee. To reconcile a lost response, explicitly repeat the same id and decision: the service returns its durable stored outcome without re-execution.
|
|
466
475
|
|
|
476
|
+
## Host readiness and promotion
|
|
477
|
+
|
|
478
|
+
Run the non-mutating host preflight from the embedding application before its production build:
|
|
479
|
+
|
|
480
|
+
```sh
|
|
481
|
+
noodle assistant embed --check --json
|
|
482
|
+
noodle assistant embed --check --json --require-env EXAMPLE_DELEG_CLIENT_SECRET
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
The check reports only required and missing environment names, never their values. It checks both `connect-src` and `frame-src` when a common static host CSP is determinable, fails on missing directives, and marks a dynamic expression unverified instead of guessing. Additional `--require-env` names are application-owned; use them for the customer side of delegated exchange or other backend-only integration requirements.
|
|
486
|
+
|
|
487
|
+
Inspect the host repository for generated environment bindings after adding names. Run its existing generator, review the diff, commit generated types only when that repository requires them, then run the production-equivalent host build. Do not invent a framework command or add a second generator.
|
|
488
|
+
|
|
489
|
+
Promotion checklist: provision each environment in the backend secret manager; map names through the CI environment and any secret allowlist or secrets file; run the presence-only preflight before asset upload; promote configuration before code; run the post-deploy probes from the JSON contract; rotate the assistant client and delegated credential independently, then rerun the same checks.
|
|
490
|
+
|
|
491
|
+
Devtools privacy gate: default model and connector exercises to synthetic or mock data. Before Devtools Chat sends real connector data to an external model, disclose the data flow and obtain the user's approval. A local validation pass is not that approval.
|
|
492
|
+
|
|
467
493
|
## Toolchain requirements
|
|
468
494
|
|
|
469
495
|
- Node.js 20+ for `@noodleseed/assistant/server`.
|
|
@@ -479,6 +505,8 @@ assistant.subscribe((event) => {
|
|
|
479
505
|
- An expired turn re-exchanges once; interaction decisions never auto-retry. An explicit same-decision repeat returns the stored outcome without executing again.
|
|
480
506
|
- Accept, decline, and cancel are single-use. Only accept executes; the server ignores replacement tool arguments.
|
|
481
507
|
- Wrong-origin and malformed-origin requests fail closed.
|
|
508
|
+
- Run the production-equivalent host build after regenerating environment bindings.
|
|
509
|
+
- In a real browser, submit with the keyboard, inspect console and network failures, complete session exchange and one tool turn, and render one linked App before claiming the host works.
|
|
482
510
|
|
|
483
511
|
## Troubleshooting: symptom to diagnosis
|
|
484
512
|
|
|
@@ -492,6 +520,10 @@ assistant.subscribe((event) => {
|
|
|
492
520
|
| Validate rejects an origin | Non-loopback HTTP origin in `allowedOrigins` | Use the exact HTTPS production origin; HTTP is only for `localhost`/`127.0.0.1` |
|
|
493
521
|
| Session exchange returns 404 | `serviceUrl` points at the deployment MCP endpoint | Use the control-plane service URL printed by `noodle assistant clients create` |
|
|
494
522
|
| Session exchange returns 403 `origin is not allowed` | Request origin differs from `allowedOrigins` character-for-character | Align the exact scheme/host/port on both sides and redeploy |
|
|
523
|
+
| Host session 503 | A required backend environment name is absent or mapped into the wrong deployment environment | Run `noodle assistant embed --check --json`, repair the host CI mapping, then probe the session route again |
|
|
524
|
+
| `HEAD` on a widget or session path looks broken | The route contract is `GET` for the hosted sandbox/widget document or `POST` for session exchange; `HEAD` is not the product flow | Exercise the documented method and inspect its response instead of inferring readiness from `HEAD` |
|
|
525
|
+
| Local server reports `listen EPERM` | The coding sandbox blocked loopback binding before application behavior ran | Rerun the same local/browser test with approved loopback permissions; do not change product code |
|
|
526
|
+
| Tool succeeds but the widget is empty | The linked App delivery layer failed: result shape, resource link, CSP frame, or bridge hydration | Inspect the typed result, `view_available`, resource URI, browser console, and hosted frame separately |
|
|
495
527
|
| Hydration or `HTMLElement is not defined` errors | The component mounted during server rendering | Mount client-only (`"use client"` or `next/dynamic` with `ssr: false`) |
|
|
496
528
|
| A tool runs without the expected confirmation | Its compiled annotations omit `confirm: true` or explicitly set `false` | Pass `{ confirm: true }` to the action helper; action hints alone never gate. `noodle check --target embedded-assistant` lists every confirm-gated tool |
|
|
497
529
|
| `${user.claims.<key>}` is empty | Claim not declared in `sessionClaims` (or key typo) — undeclared claims are dropped at exchange | Declare the key in `embeddedAssistant({ sessionClaims })` and redeploy |
|
|
@@ -22,7 +22,7 @@ For protocol/conformance checks, the headless harness is `@mcpjam/cli`, not a `n
|
|
|
22
22
|
| Tool succeeds but no widget appears | The tool has no view, or the host surface doesn’t support MCP Apps | Use `tool`, run `noodle check`, preview with `noodle devtools`; on non-Apps surfaces only the text/structured result renders |
|
|
23
23
|
| Widget shows stale or missing data | The widget reads `structuredContent`, which must match the `output` schema | Make `fulfil` return exactly the `output` shape (arrays and nested objects are supported); inspect the live result with `noodle devtools` |
|
|
24
24
|
| `useCallTool` fails from the widget | Tool name mismatch, or the helper tool is model-visible | List names with `noodle tools`; widget-only helpers must be declared with `tool` |
|
|
25
|
-
| `noodle validate` passes but React views fail to bundle (“requires Vite”) |
|
|
25
|
+
| `noodle validate` passes but React views fail to bundle (“requires Vite”) | Vite is missing from the app dependencies or its dependencies are not installed — widget bundling uses the app-local Vite | Run `npm install --save-dev vite`, then retry `noodle validate` / `noodle dev` / `noodle deploy` |
|
|
26
26
|
| Hosted endpoint returns 401 to probes | Expected: hosted servers challenge unauthenticated calls with OAuth metadata | Sign in from the host when prompted; widen who may call with `noodle access set` if testers are outside the org |
|
|
27
27
|
| Tools error only after deploy | Runtime/config differences surface hosted (secrets, connector reachability) | Run `noodle smoke`, then `noodle metrics --agent-output` and `noodle events --tool <name> --status tool_error --json`; check `noodle secrets list` scope |
|
|
28
28
|
| A connector tool validates and lists, but returns empty or `undefined` fields | The `response` mapping references a path the API does not return — usually the wrong root (a `.body` segment, when the parsed body is bound directly to `${response}`) or the wrong shape | Run `noodle tools call <name> --args <json>` with the secret set and compare the mapped result to the API’s real JSON; map from `${response.<path>}` (the body is `${response}`, there is no `.body`) and use bracket array indices (`${response.items[0].id}`) |
|
|
@@ -270,4 +270,6 @@ Declare extra host capabilities with `permissions` (e.g. `permissions: { clipboa
|
|
|
270
270
|
|
|
271
271
|
## Readiness and boundaries
|
|
272
272
|
|
|
273
|
-
|
|
273
|
+
React views use the app-local Vite bundler. When adding a view to an existing project that does not declare Vite, run `npm install --save-dev vite` before validation.
|
|
274
|
+
|
|
275
|
+
Run `noodle validate` first, `noodle check` for widget/Apps readiness, and `noodle devtools` to preview metadata and rendering. Brand via the `server` `branding` tokens (the compiler derives the palette); do not inject raw global CSS.
|
|
@@ -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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 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.48.
|
|
6
|
+
<!-- noodle-skill version:0.48.2 hash:6ef6ef551e26b78e -->
|
|
7
7
|
|
|
8
8
|
# verifying-mcp-delivery
|
|
9
9
|
|