@noodleseed/agent-kit 0.63.1 → 0.65.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 +275 -275
- package/package.json +1 -1
- package/skills/claude-code/SKILL.md +2 -2
- package/skills/claude-code/authoring-mcp-servers/SKILL.md +2 -2
- package/skills/claude-code/building-mcp-apps/SKILL.md +2 -2
- 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 +2 -2
- 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/authoring-workflow.md +5 -0
- package/skills/claude-code/references/build-an-mcp-app.md +6 -5
- package/skills/claude-code/references/build-an-mcp-server.md +8 -7
- 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/experience-design.md +2 -1
- package/skills/claude-code/references/product-agent-guides.md +23 -1
- 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 +2 -2
- package/skills/codex/authoring-mcp-servers/SKILL.md +2 -2
- package/skills/codex/building-mcp-apps/SKILL.md +2 -2
- 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 +2 -2
- 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/authoring-workflow.md +5 -0
- package/skills/codex/references/build-an-mcp-app.md +6 -5
- package/skills/codex/references/build-an-mcp-server.md +8 -7
- 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/experience-design.md +2 -1
- package/skills/codex/references/product-agent-guides.md +23 -1
- 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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noodleseed/agent-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.65.0",
|
|
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.
|
|
6
|
+
<!-- noodle-skill version:0.65.0 hash:7732a64aac011333 -->
|
|
7
7
|
|
|
8
8
|
# Noodle Seed
|
|
9
9
|
|
|
@@ -56,7 +56,7 @@ Inside the installed plugin, perform mapped steps with `noodle-readiness` tools
|
|
|
56
56
|
This is a lookup catalog, not a discovery checklist. Return here only when the selected primary route names a missing technical detail:
|
|
57
57
|
|
|
58
58
|
- `references/agent-contract.md` — the `--json` envelope, exit codes, and the three output modes.
|
|
59
|
-
- `references/product-agent-guides.md` —
|
|
59
|
+
- `references/product-agent-guides.md` — decide whether a product needs one host-neutral guide, then author it when selected.
|
|
60
60
|
- `references/sdk-surface.md` — what to import from `@noodleseed/one` and which builder to use.
|
|
61
61
|
- `references/cli-commands.md` — every `noodle` command, grouped by area.
|
|
62
62
|
- `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.65.0 hash:11523cb33b9473c0 -->
|
|
7
7
|
|
|
8
8
|
# authoring-mcp-servers
|
|
9
9
|
|
|
@@ -33,7 +33,7 @@ Load `references/sdk-surface.md` at `../noodle-seed/references/sdk-surface.md` o
|
|
|
33
33
|
|
|
34
34
|
## Verification evidence
|
|
35
35
|
|
|
36
|
-
The TypeScript behavior
|
|
36
|
+
The TypeScript behavior and explicit product-guide decision validate and pass local smoke; connector reads also have real-output proof.
|
|
37
37
|
|
|
38
38
|
## Recovery paths
|
|
39
39
|
|
|
@@ -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.65.0 hash:9fd67d4d24328e15 -->
|
|
7
7
|
|
|
8
8
|
# building-mcp-apps
|
|
9
9
|
|
|
@@ -33,7 +33,7 @@ Load `references/widgets-and-apps.md` at `../noodle-seed/references/widgets-and-
|
|
|
33
33
|
|
|
34
34
|
## Verification evidence
|
|
35
35
|
|
|
36
|
-
The App passes validation, local smoke, app checks, and the requested preview or host evidence level.
|
|
36
|
+
The App records its product-guide decision and passes validation, local smoke, app checks, and the requested preview or host evidence level.
|
|
37
37
|
|
|
38
38
|
## Recovery paths
|
|
39
39
|
|
|
@@ -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.65.0 hash:21bbd3ec441ffd30 -->
|
|
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.
|
|
6
|
+
<!-- noodle-skill version:0.65.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.65.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.65.0 hash:78a6f181b61f92f1 -->
|
|
7
7
|
|
|
8
8
|
# designing-mcp-products
|
|
9
9
|
|
|
@@ -32,7 +32,7 @@ Load `references/authoring-workflow.md` at `../noodle-seed/references/authoring-
|
|
|
32
32
|
|
|
33
33
|
## Verification evidence
|
|
34
34
|
|
|
35
|
-
A bounded product contract states user benefit, model boundary, interaction, fallback, risks, and next implementation skill.
|
|
35
|
+
A bounded product contract states user benefit, model boundary, interaction, fallback, product-guide decision, risks, and next implementation skill.
|
|
36
36
|
|
|
37
37
|
## Recovery paths
|
|
38
38
|
|
|
@@ -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.65.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.65.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.65.0 hash:efffbf82007f935d -->
|
|
7
7
|
|
|
8
8
|
# publishing-mcp-integrations
|
|
9
9
|
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
- Input paths
|
|
6
6
|
- Fit check
|
|
7
|
+
- Product-guide decision
|
|
7
8
|
- Repair loop
|
|
8
9
|
- Connectors
|
|
9
10
|
- HTTP connector example (full server)
|
|
@@ -28,6 +29,10 @@
|
|
|
28
29
|
|
|
29
30
|
Before building, confirm the idea fits a conversational surface: 1–3 focused actions where saying it beats clicking, plus data or actions the model lacks on its own. Poor fits — long-form or static content, dashboards, deep multi-step navigation, or a full app port. When an idea does not fit, narrow the scope to the actions that do.
|
|
30
31
|
|
|
32
|
+
## Product-guide decision
|
|
33
|
+
|
|
34
|
+
Before authoring, record whether the product is guided or unguided and why. Do not wait for the user to name `agentGuide`; load `references/product-agent-guides.md` for the canonical decision criteria and TypeScript shape whenever product-level workflow guidance may add value.
|
|
35
|
+
|
|
31
36
|
## Repair loop
|
|
32
37
|
|
|
33
38
|
Author in `server.ts`, then `noodle validate` → fix cited errors (see `compile-errors.md`) → re-validate → `noodle test` → `noodle dev`. Keep the loop tight and error-driven.
|
|
@@ -23,14 +23,15 @@ Before implementation, capture a short design spec: target user, conversational
|
|
|
23
23
|
2. **Agree on the design spec.** Describe the smallest complete experience and its states before writing the component. Avoid recreating a full dashboard or website inside the conversation.
|
|
24
24
|
3. **Define the output boundary.** Keep concise facts and action results model-visible. Put presentation-heavy or interactive widget data in the widget-only channel. The model must not depend on opaque UI state to continue the conversation.
|
|
25
25
|
4. **Preserve fallback.** Every tool that launches a widget must still return useful text without the widget, so unsupported hosts and failed rendering remain usable.
|
|
26
|
-
5. **
|
|
27
|
-
6. **
|
|
28
|
-
7. **
|
|
29
|
-
8. **
|
|
26
|
+
5. **Decide product-guide coverage.** Record the required product-guide decision and its reason, then use `references/product-agent-guides.md` as the canonical selection and authoring guidance.
|
|
27
|
+
6. **Author and wire the App contract.** Follow `references/widgets-and-apps.md` for the canonical component guidance, view registration, hooks, state, CSP, tool visibility, and output shaping. Keep tool effects and confirmation semantics correct independently of the UI.
|
|
28
|
+
7. **Validate the local artifact.** Run `noodle validate --json`, `noodle test --json`, and `noodle check --json`. Repair failures at the layer that produced them.
|
|
29
|
+
8. **Inspect the experience.** Run `noodle devtools` and verify loading, empty, error, success, responsive layout, focus/keyboard behavior, and the text fallback.
|
|
30
|
+
9. **Escalate evidence only on request.** Run a host test only when the user requested host verification. Run host-specific compliance only when preparing that host submission; select the exact host-testing or compliance entry from the router lookup catalog only after that evidence level is explicitly requested.
|
|
30
31
|
|
|
31
32
|
## Verification evidence
|
|
32
33
|
|
|
33
|
-
- **Product:** the design spec states the user benefit and
|
|
34
|
+
- **Product:** the design spec states the user benefit, UI fit decision, and product-guide decision with its reason.
|
|
34
35
|
- **Server:** `noodle validate --json` and `noodle test --json` succeeded.
|
|
35
36
|
- **App contract:** `noodle check --json` succeeded.
|
|
36
37
|
- **Local UX:** `noodle devtools` exercised the relevant states and the useful text fallback without the widget.
|
|
@@ -21,19 +21,20 @@ Establish only the inputs needed for the requested stopping point. Follow `refer
|
|
|
21
21
|
|
|
22
22
|
1. **Confirm conversational fit.** Name one to three focused jobs where saying the request is easier than navigating the underlying system, and identify the data or action the model cannot provide by itself.
|
|
23
23
|
2. **Define the product contract.** For each job, write the user phrase, the intent-shaped tool or resource, its minimal typed input, the useful output, read/write effect, and backing operation. Design for user intent, not a 1:1 API endpoint wrapper.
|
|
24
|
-
3. **
|
|
25
|
-
4. **
|
|
24
|
+
3. **Decide product-guide coverage.** Record the required product-guide decision and its reason, then use `references/product-agent-guides.md` as the canonical selection and authoring guidance.
|
|
25
|
+
4. **Choose the smallest implementation.** Use native tools, resources, or prompts for local/static behavior; add a connector only when external data or actions are required. Keep response output small and model-readable.
|
|
26
|
+
5. **Author in TypeScript.** Follow `references/authoring-workflow.md` for connector and flow patterns, `references/tool-design.md` for the model-facing tool surface, and `references/sdk-surface.md` for exact builders. These are this route’s complete canonical support set; use the router lookup catalog only when observed evidence names a different concern.
|
|
26
27
|
MCP protocol versions are platform-owned and negotiated automatically at the serving endpoint. Do not add protocol-version settings to server options, `noodle.json`, app manifests, or deployment configuration.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
6. **Validate and repair.** Run `noodle validate --json`. Parse `error.errors[]`, repair the cited `path`, and rerun validation. Consult the lookup catalog only for the specific reported error code; do not open another reference speculatively.
|
|
29
|
+
7. **Run the local smoke.** After validation succeeds, run `noodle test --json` and repair any failure at that evidence layer.
|
|
30
|
+
8. **Prove external behavior.** For connector-backed reads, set credentials through the effective local target and run a safe representative `noodle tools call`. Confirm populated mapped fields from real output, not merely successful registration.
|
|
31
|
+
9. **Stop at the requested boundary.** Do not add an App, host test, hosted environment, publication work, or deployment unless the user requested that outcome. Deploy only when the selected route or the user explicitly requires it.
|
|
31
32
|
|
|
32
33
|
## Verification evidence
|
|
33
34
|
|
|
34
35
|
Report evidence as a ladder and claim only levels actually exercised:
|
|
35
36
|
|
|
36
|
-
- **Authoring:** the requested TypeScript behavior exists with typed inputs and outputs.
|
|
37
|
+
- **Authoring:** the requested TypeScript behavior exists with typed inputs and outputs, and the product-guide decision and reason are recorded.
|
|
37
38
|
- **Compilation:** `noodle validate --json` returned success.
|
|
38
39
|
- **Local smoke:** `noodle test --json` returned success.
|
|
39
40
|
- **Connector reality:** a representative safe read via `noodle tools call` returned populated mapped fields. This is required for connector-backed work.
|
|
@@ -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
|
```
|