@noodleseed/agent-kit 0.82.0 → 0.84.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 +279 -279
- 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/creating-product-agent-guides/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 +1 -1
- package/skills/claude-code/examples/acme-discovery/README.md +6 -2
- package/skills/claude-code/examples/acme-discovery/src/server.ts +2 -8
- package/skills/claude-code/examples/acme-discovery/test/server.test.ts +1 -0
- package/skills/claude-code/examples/food-ordering/README.md +1 -0
- package/skills/claude-code/examples/food-ordering/src/server.ts +12 -0
- package/skills/claude-code/examples/food-ordering/test/server.test.ts +7 -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/authoring-workflow.md +10 -1
- package/skills/claude-code/references/connect-an-api.md +31 -1
- package/skills/claude-code/references/embedded-assistant.md +6 -7
- package/skills/claude-code/references/sdk-surface.md +4 -2
- package/skills/claude-code/references/widgets-and-apps.md +1 -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/claude-code/wrapping-existing-applications/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/creating-product-agent-guides/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 +1 -1
- package/skills/codex/examples/acme-discovery/README.md +6 -2
- package/skills/codex/examples/acme-discovery/src/server.ts +2 -8
- package/skills/codex/examples/acme-discovery/test/server.test.ts +1 -0
- package/skills/codex/examples/food-ordering/README.md +1 -0
- package/skills/codex/examples/food-ordering/src/server.ts +12 -0
- package/skills/codex/examples/food-ordering/test/server.test.ts +7 -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/authoring-workflow.md +10 -1
- package/skills/codex/references/connect-an-api.md +31 -1
- package/skills/codex/references/embedded-assistant.md +6 -7
- package/skills/codex/references/sdk-surface.md +4 -2
- package/skills/codex/references/widgets-and-apps.md +1 -1
- 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
|
@@ -80,6 +80,13 @@ describe('food-ordering example', () => {
|
|
|
80
80
|
expect(JSON.stringify(tools.get('open_ordering'))).toContain('${context.ambient.serviceArea}');
|
|
81
81
|
expect(JSON.stringify(tools.get('open_ordering'))).toContain('${context.location.latitude}');
|
|
82
82
|
expect(JSON.stringify(tools.get('open_ordering'))).toContain('${context.location.longitude}');
|
|
83
|
+
expect(tools.get('open_ordering')?.annotations).toMatchObject({
|
|
84
|
+
'x-noodleseed-model-latest-message-includes-any': expect.arrayContaining([
|
|
85
|
+
'order',
|
|
86
|
+
'menu',
|
|
87
|
+
'checkout',
|
|
88
|
+
]),
|
|
89
|
+
});
|
|
83
90
|
expect(JSON.stringify(tools.get('sync_cart'))).toContain('revision');
|
|
84
91
|
expect(tools.get('sync_cart')?.annotations?.confirm).toBe(false);
|
|
85
92
|
expect(tools.get('prepare_checkout')?.annotations?.confirm).toBe(false);
|
|
@@ -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.84.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.84.0 hash:efffbf82007f935d -->
|
|
7
7
|
|
|
8
8
|
# publishing-mcp-integrations
|
|
9
9
|
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
|
|
24
24
|
1. **Website scrape** — if the user gives a URL, scrape it for surface hints (products, services, hours, contact, pricing). Stop there: the URL does not reveal CRM, booking systems, custom APIs, auth model, eligibility rules, quoting logic, or approval flows. Those live in the business systems and the owner’s head — ask.
|
|
25
25
|
2. **OpenAPI import** — `noodle import openapi <file>` emits a starter `server.ts` from a spec. Use it when the user provides an OpenAPI document.
|
|
26
|
-
3. **
|
|
26
|
+
3. **Upstream MCP import** — `noodle import mcp <url> --name <slug> --output <dir>` discovers `tools/list` once, validates and freezes tool schemas into TypeScript, and writes a secret-free drift snapshot. Upstream annotations are untrusted, so generated tools remain destructive confirmed actions until an author verifies and narrows them. Use `--header-env <header>=<ENV_NAME>` for import-only auth and `--check` for classified, non-mutating drift detection. Runtime never performs discovery.
|
|
27
|
+
4. **User interview** — Noodle does not interview; you do. Cover custom APIs/integrations, eligibility rules, quoting/approval logic, and private schemas (SQL DDL or JSON samples for custom `connector` declarations). Ask for concrete examples and sample payloads; do not guess a schema from a URL or invent endpoints.
|
|
27
28
|
|
|
28
29
|
## Fit check
|
|
29
30
|
|
|
@@ -42,10 +43,18 @@ Author in `server.ts`, then `noodle validate` → fix cited errors (see `compile
|
|
|
42
43
|
Declare connectors as data, not imperative code:
|
|
43
44
|
|
|
44
45
|
- **HTTP**: `connector("id").version("1.0.0").http({ baseUrl, allowedOrigins, auth, operations })` with per-operation `request`/`response` mapping using `${args...}` / `${response...}` expressions.
|
|
46
|
+
- **MCP**: `connector("id").version("1.0.0").mcp({ endpoint, allowedOrigins, auth?, operations })` where each operation freezes the separate upstream `tool` wire name plus input/output schema. Import with `noodle import mcp`; do not hand-copy a live surface or call `tools/list` at runtime.
|
|
45
47
|
- **Compute**: `connector("id").version("1.0.0").compute(name, { input, output, calls?, run })` — a self-contained, sandboxed function (no imports/closure capture) that may call allowlisted operations via `callOperation`.
|
|
46
48
|
|
|
47
49
|
Tools record connector calls into a flow; recording is not execution. Do not branch on runtime outputs with native `if` — use declarative `when(...)` conditions.
|
|
48
50
|
|
|
51
|
+
MCP connectors are curated backing operations, never transparent proxies. Publish ordinary Noodle tools
|
|
52
|
+
with stable intent-shaped names, descriptions, annotations, authored schemas, confirmation, visibility,
|
|
53
|
+
and optional React `view`. Normalize a text-only upstream result through compute before rendering when the
|
|
54
|
+
view needs a richer stable output. Upstream resources, prompts, `_meta`, annotations, widgets, and CSP are
|
|
55
|
+
not imported or forwarded. The runtime opens one guarded session for one operation, uses only a broker-minted
|
|
56
|
+
credential, and closes it; it does not act as an agent for upstream sampling, roots, or elicitation.
|
|
57
|
+
|
|
49
58
|
HTTP connector auth variants: `bearer` (`{ kind: "bearer", secret: secret("API_TOKEN") }`), `apiKey` (`{ kind: "apiKey", header: "X-API-Key", secret: secret("API_KEY") }`), `clientCredentials`, `delegatedOAuth`, `delegatedSessionCookie`, and `delegatedTokenExchange` (per-user calls to your own API — see "Delegated downstream auth" below). Use managed `secret(...)` / `variable(...)` refs for all values that differ by org/app/env.
|
|
50
59
|
|
|
51
60
|
When one connector needs independently selectable accounts, declare catalog `credentialProfiles` plus each operation’s accepted `credentials.profiles`, then bind each `server.use` alias with `bind(connector, { profile, connection: connection("logical_id", managedSecret(secret("NAME"), { scopes, audience })) })`. The alias is the stable account boundary; never put provider account ids, labels, or credential values in it. `gmailConnector()` is the curated Gmail catalog helper; reuse it under independent aliases and accept canonical `accounts` arrays in tools (one account for writes, or an explicitly ordered supported combination for reads). See the bundled `gmail-multi-account` flagship. Bound managed secrets are supported by hosted execution. For deployed-server access to Google APIs, use `googleWorkloadIdentity({ provider: variable("GOOGLE_WIF_PROVIDER"), access: { kind: "direct" } })`, or add `serviceAccountImpersonation` with a managed service-account email. This is keyless Google Workload Identity Federation: exact Google scopes/audience come from the catalog operation, while `noodle auth google prepare|status|doctor|revoke` owns operator lifecycle. See the bundled `google-bigquery` flagship. `externalExchange()` is runnable only when the deployment operator injects an exact HTTPS provider endpoint/origin/audience and durable shared subject-pin store through service ports; Noodle sends a short-lived platform-signed deployment workload assertion and accepts only a bounded bearer response. Provider implementations must consume assertion replay ids through durable shared atomic storage across instances and restarts. There is intentionally no hosted enrollment or provider CRUD surface yet. The provider wire contract is public, but its conformance kit is workspace/source-only and is not an installable npm package. Bound `clientCredentials(...)` remains fail-closed until its provider slice lands.
|
|
@@ -11,6 +11,7 @@ Connect a real API to a focused MCP product using managed credentials, mappings
|
|
|
11
11
|
- Secure the key first
|
|
12
12
|
- Probe the live API
|
|
13
13
|
- Model the connector from the observed shape
|
|
14
|
+
- Import and curate an upstream MCP server
|
|
14
15
|
- Return a list
|
|
15
16
|
- Create, update, delete
|
|
16
17
|
- Design intent tools
|
|
@@ -22,7 +23,7 @@ Connect a real API to a focused MCP product using managed credentials, mappings
|
|
|
22
23
|
|
|
23
24
|
## Use when
|
|
24
25
|
|
|
25
|
-
- The user provides credentials, a reachable API,
|
|
26
|
+
- The user provides credentials, a reachable API, an OpenAPI document, or an upstream MCP endpoint and wants real MCP behavior backed by it.
|
|
26
27
|
- Existing connector behavior compiles but still needs proof against the actual service and data shape.
|
|
27
28
|
|
|
28
29
|
## Do not use when
|
|
@@ -80,6 +81,35 @@ Encode the API as an HTTP connector, mapping only the fields you actually saw in
|
|
|
80
81
|
The full connector shape, every `auth.kind`, and compute connectors are in
|
|
81
82
|
`references/authoring-workflow.md`.
|
|
82
83
|
|
|
84
|
+
### Import and curate an upstream MCP server
|
|
85
|
+
|
|
86
|
+
Use an explicit import to discover the upstream tool surface once and generate TypeScript:
|
|
87
|
+
|
|
88
|
+
```sh
|
|
89
|
+
noodle import mcp https://store.example/api/mcp --name store --output store-app
|
|
90
|
+
# When import discovery needs a credential, read it only from the environment:
|
|
91
|
+
noodle import mcp https://store.example/api/mcp --name store \
|
|
92
|
+
--header-env Authorization=STORE_MCP_TOKEN
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The importer freezes upstream tool names and normalized schemas into `.mcp({ operations })`; it never
|
|
96
|
+
persists the import credential. Runtime calls only those declared operations and never runs `tools/list`.
|
|
97
|
+
MCP annotations are untrusted hints, so every generated tool starts as a destructive confirmed action.
|
|
98
|
+
Verify real behavior and deliberately narrow proven reads before accepting the generated source. Use
|
|
99
|
+
`noodle import mcp <url> --output <dir> --check` in CI to detect upstream additions, removals, or schema
|
|
100
|
+
changes without mutating source; its review labels drift additive, breaking, or metadata-only.
|
|
101
|
+
|
|
102
|
+
Treat the imported connector operation as a backing-system contract, not the public tool design. Publish
|
|
103
|
+
ordinary intent-shaped `tool(...)` capabilities with stable names and narrower schemas, normalize text or
|
|
104
|
+
large upstream output through compute, and attach a normal Noodle React `view` when UI helps. Upstream
|
|
105
|
+
`_meta`, resources, prompts, annotations, widgets, and CSP are never forwarded. A Noodle-owned widget may
|
|
106
|
+
therefore enrich a headless upstream tool without trusting upstream executable UI.
|
|
107
|
+
|
|
108
|
+
Managed endpoints require an exact managed origin allowlist. Configure each deployment with
|
|
109
|
+
`variable(...)` and `secret(...)`; inbound MCP/OAuth bearer tokens are never reusable upstream credentials.
|
|
110
|
+
The first release supports no auth, bearer, API key, and client credentials through the broker. Do not
|
|
111
|
+
invent a delegated-user OAuth shortcut for an upstream MCP server.
|
|
112
|
+
|
|
83
113
|
### Return a list
|
|
84
114
|
|
|
85
115
|
Most real tools return a variable-length list (search results, a user’s tasks). Bind the **whole array** — a single `${response.path}` returns the referenced value verbatim, arrays included:
|
|
@@ -29,7 +29,8 @@ Keep every credential and identity layer separate:
|
|
|
29
29
|
| Owner | Values | Destination |
|
|
30
30
|
| --- | --- | --- |
|
|
31
31
|
| Noodle operator | Login, selected org/app/env | Plugin-managed CLI profile and explicit target; never the SaaS runtime |
|
|
32
|
-
| Noodle
|
|
32
|
+
| Noodle-managed model | No authored provider, model id, URL, or key | Hosted operator state; available only when Noodle has enrolled the exact org/app/env |
|
|
33
|
+
| Operator-provided model | `ASSISTANT_MODEL_BASE_URL`, `ASSISTANT_MODEL`, `ASSISTANT_MODEL_API_KEY` | `noodle variables set` / `noodle secrets set`; never the SaaS environment |
|
|
33
34
|
| Connector/delegated exchange | Connector credentials and any customer-owned token-exchange client | Noodle managed configuration plus the matching customer backend secret manager |
|
|
34
35
|
| 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 |
|
|
35
36
|
| Browser | Short-lived assistant session only | In memory; never a client secret, model key, connector credential, or raw application session |
|
|
@@ -48,11 +49,7 @@ Use the same server tools in the embed; do not create a second tool set. Declare
|
|
|
48
49
|
branding: { name: "Acme", accent: "#3157D5" },
|
|
49
50
|
context: { defaults: { locale: "en-GB", timeZone: "Europe/London" } },
|
|
50
51
|
assistant: embeddedAssistant({
|
|
51
|
-
model:
|
|
52
|
-
baseUrl: variable("ASSISTANT_MODEL_BASE_URL"),
|
|
53
|
-
model: variable("ASSISTANT_MODEL"),
|
|
54
|
-
apiKey: secret("ASSISTANT_MODEL_API_KEY"),
|
|
55
|
-
}),
|
|
52
|
+
model: noodleManaged(),
|
|
56
53
|
access: authenticatedWebsite({
|
|
57
54
|
origins: ["http://localhost:3000", "https://app.example.com"],
|
|
58
55
|
}),
|
|
@@ -60,6 +57,8 @@ assistant: embeddedAssistant({
|
|
|
60
57
|
}),
|
|
61
58
|
```
|
|
62
59
|
|
|
60
|
+
`noodleManaged()` is the zero-configuration Cloud path: the public artifact contains only `{ kind: "noodle-managed" }`. It never exposes a provider or model identifier, and it fails closed unless Noodle has enrolled that exact deployment target. For a customer- or self-hosted model, replace it with `openAICompatible({ baseUrl: variable("ASSISTANT_MODEL_BASE_URL"), model: variable("ASSISTANT_MODEL"), apiKey: secret("ASSISTANT_MODEL_API_KEY") })`; that remains the portable BYO path.
|
|
61
|
+
|
|
63
62
|
Origins are exact: scheme, host, and optional port, with no path, trailing slash, or wildcard. Production origins must be HTTPS; plain HTTP is accepted only for loopback development origins (`http://localhost:<port>`, `http://127.0.0.1:<port>`). `noodle dev` serves the MCP project, not the embedding SaaS. For a public surface it also prints a process-local Embed ID and script; mount that script on the separately running loopback website to test anonymous mint, chat, widgets, and confirmation. The local ID is ephemeral, while a hosted deploy provisions the stable ID behind durable admission counters.
|
|
64
63
|
|
|
65
64
|
## Product workflow guidance
|
|
@@ -166,7 +165,7 @@ Local MCP authoring and tests need no account, but an external browser embed nee
|
|
|
166
165
|
noodle deploy --org <org> --app <app> --env <env>
|
|
167
166
|
```
|
|
168
167
|
|
|
169
|
-
Deploy preflights the complete target before upload.
|
|
168
|
+
Deploy preflights the complete target before upload. `noodleManaged()` has no customer model variables or secrets; enrollment is hosted operator state and an unenrolled target fails closed at serving time. `openAICompatible()` preflight collects or reports every missing model variable and secret with safe `noodle variables set ... --from-env` / `noodle secrets set ... --from-env` actions. Values never appear in the preflight report or resume state. Do not put BYO model values in the embedding SaaS environment. A production deployment may omit a local origin; include a loopback origin only when local browser integration is required.
|
|
170
169
|
|
|
171
170
|
## Access modes and customer auth
|
|
172
171
|
|
|
@@ -65,6 +65,7 @@ Platform helper connectors are explicit subpath imports from `@noodleseed/one/pl
|
|
|
65
65
|
- `knowledge`
|
|
66
66
|
- `managedSecret`
|
|
67
67
|
- `meilisearch`
|
|
68
|
+
- `noodleManaged`
|
|
68
69
|
- `openAICompatible`
|
|
69
70
|
- `publicWebsite`
|
|
70
71
|
- `site`
|
|
@@ -73,7 +74,7 @@ Platform helper connectors are explicit subpath imports from `@noodleseed/one/pl
|
|
|
73
74
|
## Authoring signatures
|
|
74
75
|
|
|
75
76
|
- `server(name, options, definitions)` — `options` commonly includes `title`, `version`, `instructions`, `agentGuide`, `distribution`, `branding`, `auth`, `use`, `provides`, `state`, and `handoff`; `definitions` is the array of tools/resources/prompts.
|
|
76
|
-
- `tool(name, { description, input, output, annotations?, visibility?, view?, fulfil })` — `input`/`output` are Zod schemas; `fulfil({ input, connectors, user })` returns data matching `output`. Add `view: { component, entry }` for a React widget; use `visibility: ["app"]` for an app-only helper.
|
|
77
|
+
- `tool(name, { description, input, output, annotations?, visibility?, modelVisibility?, view?, fulfil })` — `input`/`output` are Zod schemas; `fulfil({ input, connectors, user })` returns data matching `output`. Add `view: { component, entry }` for a React widget; use `visibility: ["app"]` for an app-only helper. Use `modelVisibility.latestMessageIncludesAny` only for normalized literal explicit-intent discovery; it does not authorize execution.
|
|
77
78
|
- Keep tool input names application-owned and meaningful; `__noodleIntent` is reserved for an optional serve-time operator analytics adapter and never reaches `fulfil`.
|
|
78
79
|
- `resource(name, { uri, description?, mimeType?, fulfil })` and `prompt(name, { description?, arguments?, fulfil })` expose MCP resources/prompts.
|
|
79
80
|
- View metadata (`viewTitle`, `viewDescription`, `csp`, `domain`, `permissions`) belongs on the tool that renders it; `asset("./path")` packages local files.
|
|
@@ -145,7 +146,7 @@ prompt('summarize_ticket', {
|
|
|
145
146
|
|
|
146
147
|
### Non-trivial tool: ctx connectors, annotations, visibility, async
|
|
147
148
|
|
|
148
|
-
`ctx` is `{ input, user, connectors }`. Bind connectors with `use` on the server, then call one inside `fulfil` to record a step. `annotations.readOnly()` declares a closed-world safe read. TypeScript action helpers enforce confirmation only with `{ confirm: true }`; omitted or `false` executes directly, and action/destructive/open-world hints alone never enable the gate. For stateless hosts that cannot present Noodle confirmation, set `interactions: { confirmationFallback: 'host' }` in the `server` options to explicitly trust native host write approval; omission remains fail-closed and the fallback never supplies missing `ctx.elicit` input. `visibility` defaults to `['model', 'app']` — set `['app']` to hide a helper from the model. `fulfil` may be `async` (the compiler awaits it while recording).
|
|
149
|
+
`ctx` is `{ input, user, connectors }`. Bind connectors with `use` on the server, then call one inside `fulfil` to record a step. `annotations.readOnly()` declares a closed-world safe read. TypeScript action helpers enforce confirmation only with `{ confirm: true }`; omitted or `false` executes directly, and action/destructive/open-world hints alone never enable the gate. For stateless hosts that cannot present Noodle confirmation, set `interactions: { confirmationFallback: 'host' }` in the `server` options to explicitly trust native host write approval; omission remains fail-closed and the fallback never supplies missing `ctx.elicit` input. `visibility` defaults to `['model', 'app']` — set `['app']` to hide a helper from the model. For a narrow explicit-intent tool, `modelVisibility: { latestMessageIncludesAny: [...] }` deterministically limits model discovery to a latest user message containing one of the normalized literal phrases; it is not authorization. `fulfil` may be `async` (the compiler awaits it while recording).
|
|
149
150
|
|
|
150
151
|
```ts
|
|
151
152
|
import { annotations, connector, server, tool, z } from '@noodleseed/one';
|
|
@@ -176,6 +177,7 @@ export default server('support', { title: 'Support', version: '1.0.0', use: { cr
|
|
|
176
177
|
output: z.object({ subject: z.string(), status: z.string() }),
|
|
177
178
|
annotations: annotations.readOnly(), // read-only hint for hosts
|
|
178
179
|
visibility: ['model', 'app'], // default; use ['app'] to hide the tool from the model
|
|
180
|
+
modelVisibility: { latestMessageIncludesAny: ['show ticket', 'open ticket'] },
|
|
179
181
|
// ctx is { input, user, connectors }. A connector call records one flow step (a Ref) —
|
|
180
182
|
// recording is not execution, so never branch on the result with native if (use when).
|
|
181
183
|
fulfil: ({ input, connectors }) => {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
## Tools and views
|
|
14
14
|
|
|
15
|
-
Use `tool(name, { description, input, output, fulfil, view })` for a model-visible tool that renders a widget, and the same `tool(name, { ..., visibility: ["app"] })` for an app-only helper hidden from the model. A `view` is `{ component: "name", entry: "./views/name.tsx" }` — a React component the compiler bundles at validate/deploy time.
|
|
15
|
+
Use `tool(name, { description, input, output, fulfil, view })` for a model-visible tool that renders a widget, and the same `tool(name, { ..., visibility: ["app"] })` for an app-only helper hidden from the model. When a view is valid only for narrow explicit intent, add `modelVisibility: { latestMessageIncludesAny: ["open the form", ...] }`; Noodle normalizes and matches those literal phrases against the latest user message before model discovery and fails closed on malformed data. This is relevance filtering, never authorization. A `view` is `{ component: "name", entry: "./views/name.tsx" }` — a React component the compiler bundles at validate/deploy time.
|
|
16
16
|
|
|
17
17
|
## Noodle Design default
|
|
18
18
|
|
|
@@ -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.84.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.84.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.84.0 hash:eccc3c158dcafba8 -->
|
|
7
7
|
|
|
8
8
|
# wrapping-existing-applications
|
|
9
9
|
|