@noodleseed/agent-kit 0.68.0 → 0.70.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 +325 -277
- 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 +1 -1
- package/skills/claude-code/examples/acme-discovery/src/knowledge/faq.txt +10 -0
- package/skills/claude-code/examples/acme-discovery/src/knowledge/product.md +7 -0
- package/skills/claude-code/examples/acme-discovery/src/server.ts +28 -2
- package/skills/claude-code/examples/acme-discovery/test/server.test.ts +10 -0
- package/skills/claude-code/examples/food-ordering/README.md +79 -10
- package/skills/claude-code/examples/food-ordering/src/agent-guide.ts +48 -0
- package/skills/claude-code/examples/food-ordering/src/server.ts +112 -0
- package/skills/claude-code/examples/food-ordering/test/server.test.ts +48 -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 +20 -0
- package/skills/claude-code/references/cli-commands.md +1 -1
- package/skills/claude-code/references/compile-errors.md +2 -0
- package/skills/claude-code/references/embedded-assistant.md +13 -3
- package/skills/claude-code/references/product-agent-guides.md +2 -2
- package/skills/claude-code/references/publishing.md +18 -1
- package/skills/claude-code/references/sdk-surface.md +4 -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 +1 -1
- package/skills/codex/examples/acme-discovery/src/knowledge/faq.txt +10 -0
- package/skills/codex/examples/acme-discovery/src/knowledge/product.md +7 -0
- package/skills/codex/examples/acme-discovery/src/server.ts +28 -2
- package/skills/codex/examples/acme-discovery/test/server.test.ts +10 -0
- package/skills/codex/examples/food-ordering/README.md +79 -10
- package/skills/codex/examples/food-ordering/src/agent-guide.ts +48 -0
- package/skills/codex/examples/food-ordering/src/server.ts +112 -0
- package/skills/codex/examples/food-ordering/test/server.test.ts +48 -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 +20 -0
- package/skills/codex/references/cli-commands.md +1 -1
- package/skills/codex/references/compile-errors.md +2 -0
- package/skills/codex/references/embedded-assistant.md +13 -3
- package/skills/codex/references/product-agent-guides.md +2 -2
- package/skills/codex/references/publishing.md +18 -1
- package/skills/codex/references/sdk-surface.md +4 -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
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { annotations, asset, connector, resource, server, tool, z } from '@noodleseed/one';
|
|
2
|
+
import { FOOD_ORDERING_AGENT_GUIDE } from './agent-guide.js';
|
|
2
3
|
|
|
3
4
|
const heroImage = asset('assets/noodle-bowl.jpg');
|
|
5
|
+
const storesScreenshot = asset('assets/food-ordering-stores.png');
|
|
6
|
+
const menuScreenshot = asset('assets/food-ordering-menu.png');
|
|
7
|
+
const handoffScreenshot = asset('assets/food-ordering-handoff.png');
|
|
4
8
|
|
|
5
9
|
const state = connector('noodle_state')
|
|
6
10
|
.version('1.0.0')
|
|
@@ -202,6 +206,108 @@ export default server(
|
|
|
202
206
|
{
|
|
203
207
|
title: 'Food Ordering',
|
|
204
208
|
version: '1.0.0',
|
|
209
|
+
agentGuide: FOOD_ORDERING_AGENT_GUIDE,
|
|
210
|
+
distribution: {
|
|
211
|
+
listing: {
|
|
212
|
+
summary: 'Build a pickup noodle order.',
|
|
213
|
+
description:
|
|
214
|
+
'Food Ordering is a synthetic MCP App that demonstrates store discovery, menu browsing, a caller-scoped cart, fulfilment planning, and explicit checkout handoff.',
|
|
215
|
+
keywords: ['food', 'ordering', 'delivery'],
|
|
216
|
+
},
|
|
217
|
+
publisher: {
|
|
218
|
+
name: 'Noodle Seed Examples',
|
|
219
|
+
websiteUrl: 'https://noodleseed.com',
|
|
220
|
+
},
|
|
221
|
+
support: {
|
|
222
|
+
documentationUrl: 'https://docs.noodleseed.com/examples/food-ordering',
|
|
223
|
+
supportUrl: 'https://noodleseed.com/support',
|
|
224
|
+
},
|
|
225
|
+
legal: {
|
|
226
|
+
privacyPolicyUrl: 'https://noodleseed.com/privacy',
|
|
227
|
+
termsOfServiceUrl: 'https://noodleseed.com/terms',
|
|
228
|
+
},
|
|
229
|
+
assets: {
|
|
230
|
+
icon: { source: heroImage, alt: 'Food Ordering noodle bowl' },
|
|
231
|
+
screenshots: [
|
|
232
|
+
{
|
|
233
|
+
source: storesScreenshot,
|
|
234
|
+
alt: 'Food Ordering MCP App showing nearby stores',
|
|
235
|
+
prompt: 'Help me build a noodle order for pickup.',
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
source: menuScreenshot,
|
|
239
|
+
alt: 'Food Ordering MCP App showing the Harbor Noodles menu',
|
|
240
|
+
prompt: 'Show me the Harbor Noodles menu.',
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
source: handoffScreenshot,
|
|
244
|
+
alt: 'Food Ordering MCP App reviewing a checkout handoff',
|
|
245
|
+
prompt: 'Review my spicy miso bowl order before checkout.',
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
},
|
|
249
|
+
review: {
|
|
250
|
+
instructions:
|
|
251
|
+
'Use the synthetic menu and guest cart. No account or reviewer credential is required.',
|
|
252
|
+
scenarios: [
|
|
253
|
+
{
|
|
254
|
+
id: 'build_order',
|
|
255
|
+
prompt: 'Help me build a noodle order for pickup.',
|
|
256
|
+
expected:
|
|
257
|
+
'The ordering app opens with stores and menu items; checkout remains a handoff.',
|
|
258
|
+
shouldInvoke: true,
|
|
259
|
+
tools: ['open_ordering'],
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
id: 'browse_menu',
|
|
263
|
+
prompt: 'Show me vegetarian menu options nearby.',
|
|
264
|
+
expected: 'The app shows matching stores and bounded menu choices.',
|
|
265
|
+
shouldInvoke: true,
|
|
266
|
+
tools: ['search_stores', 'load_menu'],
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
id: 'compare_options',
|
|
270
|
+
prompt: 'Compare the quickest open food options for me.',
|
|
271
|
+
expected: 'The app grounds its comparison in the synthetic store data.',
|
|
272
|
+
shouldInvoke: true,
|
|
273
|
+
tools: ['search_stores', 'summarize_ordering_options'],
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
id: 'plan_pickup',
|
|
277
|
+
prompt: 'Plan a pickup order for Friday.',
|
|
278
|
+
expected: 'The app collects the missing fulfilment details before planning the order.',
|
|
279
|
+
shouldInvoke: true,
|
|
280
|
+
tools: ['plan_order'],
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
id: 'review_checkout',
|
|
284
|
+
prompt: 'Review my cart before I continue to checkout.',
|
|
285
|
+
expected: 'The app shows the cart and keeps payment on the explicit external handoff.',
|
|
286
|
+
shouldInvoke: true,
|
|
287
|
+
tools: ['read_cart', 'prepare_checkout'],
|
|
288
|
+
},
|
|
289
|
+
// Negative scenarios are non-invocation cases, so they never declare expected tools.
|
|
290
|
+
{
|
|
291
|
+
id: 'unrelated_weather',
|
|
292
|
+
prompt: 'Will it rain tomorrow?',
|
|
293
|
+
expected: 'Food Ordering is not invoked.',
|
|
294
|
+
shouldInvoke: false,
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
id: 'unrelated_email',
|
|
298
|
+
prompt: 'Draft an email to my manager.',
|
|
299
|
+
expected: 'Food Ordering is not invoked.',
|
|
300
|
+
shouldInvoke: false,
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
id: 'unrelated_travel',
|
|
304
|
+
prompt: 'Book me a flight to Lisbon.',
|
|
305
|
+
expected: 'Food Ordering is not invoked.',
|
|
306
|
+
shouldInvoke: false,
|
|
307
|
+
},
|
|
308
|
+
],
|
|
309
|
+
},
|
|
310
|
+
},
|
|
205
311
|
use: { state },
|
|
206
312
|
context: {
|
|
207
313
|
defaults: { locale: 'en-US', timeZone: 'America/New_York' },
|
|
@@ -287,6 +393,7 @@ export default server(
|
|
|
287
393
|
permissions: { clipboardWrite: {} },
|
|
288
394
|
}),
|
|
289
395
|
tool('search_stores', {
|
|
396
|
+
title: 'Search stores',
|
|
290
397
|
visibility: ['app'],
|
|
291
398
|
description: 'Filter synthetic restaurants for the ordering widget.',
|
|
292
399
|
annotations: readOnly,
|
|
@@ -298,6 +405,7 @@ export default server(
|
|
|
298
405
|
fulfil: () => ({ stores }),
|
|
299
406
|
}),
|
|
300
407
|
tool('load_menu', {
|
|
408
|
+
title: 'Load store menu',
|
|
301
409
|
visibility: ['app'],
|
|
302
410
|
description: 'Load synthetic menu categories and items for one store.',
|
|
303
411
|
annotations: readOnly,
|
|
@@ -310,6 +418,7 @@ export default server(
|
|
|
310
418
|
fulfil: ({ input }) => ({ storeId: input.storeId, stores, items: menu }),
|
|
311
419
|
}),
|
|
312
420
|
tool('load_item', {
|
|
421
|
+
title: 'Load menu item',
|
|
313
422
|
visibility: ['app'],
|
|
314
423
|
description: 'Load item details and modifier options for the ordering widget.',
|
|
315
424
|
annotations: readOnly,
|
|
@@ -318,6 +427,7 @@ export default server(
|
|
|
318
427
|
fulfil: ({ input }) => ({ itemId: input.itemId, items: menu }),
|
|
319
428
|
}),
|
|
320
429
|
tool('read_cart', {
|
|
430
|
+
title: 'Read ordering cart',
|
|
321
431
|
visibility: ['app'],
|
|
322
432
|
description: 'Read the caller-scoped ordering cart state.',
|
|
323
433
|
annotations: readOnly,
|
|
@@ -333,6 +443,7 @@ export default server(
|
|
|
333
443
|
},
|
|
334
444
|
}),
|
|
335
445
|
tool('sync_cart', {
|
|
446
|
+
title: 'Update ordering cart',
|
|
336
447
|
visibility: ['app'],
|
|
337
448
|
description: 'Patch the caller-scoped ordering cart with the widget cart mirror.',
|
|
338
449
|
annotations: action,
|
|
@@ -353,6 +464,7 @@ export default server(
|
|
|
353
464
|
},
|
|
354
465
|
}),
|
|
355
466
|
tool('prepare_checkout', {
|
|
467
|
+
title: 'Prepare checkout handoff',
|
|
356
468
|
visibility: ['app'],
|
|
357
469
|
description: 'Prepare the caller-scoped cart for checkout handoff.',
|
|
358
470
|
annotations: action,
|
|
@@ -10,6 +10,7 @@ describe('food-ordering example', () => {
|
|
|
10
10
|
const manifest = (await app.toManifest()) as {
|
|
11
11
|
server: {
|
|
12
12
|
name: string;
|
|
13
|
+
agentGuide?: unknown;
|
|
13
14
|
context?: {
|
|
14
15
|
defaults?: { locale?: string; timeZone?: string };
|
|
15
16
|
ambient?: {
|
|
@@ -23,6 +24,7 @@ describe('food-ordering example', () => {
|
|
|
23
24
|
connectors?: Record<string, { id: string; version: string }>;
|
|
24
25
|
tools: Array<{
|
|
25
26
|
name: string;
|
|
27
|
+
title?: string;
|
|
26
28
|
visibility?: string[];
|
|
27
29
|
annotations?: Record<string, unknown>;
|
|
28
30
|
output?: unknown;
|
|
@@ -36,6 +38,8 @@ describe('food-ordering example', () => {
|
|
|
36
38
|
};
|
|
37
39
|
|
|
38
40
|
expect(manifest.server.name).toBe('food_ordering');
|
|
41
|
+
expect(manifest.server.agentGuide).toBeDefined();
|
|
42
|
+
expect(manifest.server).not.toHaveProperty('distribution');
|
|
39
43
|
expect(manifest.server.context).toMatchObject({
|
|
40
44
|
defaults: { locale: 'en-US', timeZone: 'America/New_York' },
|
|
41
45
|
ambient: {
|
|
@@ -100,5 +104,49 @@ describe('food-ordering example', () => {
|
|
|
100
104
|
},
|
|
101
105
|
});
|
|
102
106
|
expect(manifest.widgets?.map((widget) => widget.name)).toContain('capabilities_card');
|
|
107
|
+
expect(manifest.tools.every((tool) => typeof tool.title === 'string')).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('projects host distribution metadata separately from the runtime manifest', () => {
|
|
111
|
+
const distribution = app.toDistributionMetadata();
|
|
112
|
+
expect(distribution).toMatchObject({
|
|
113
|
+
schemaVersion: 1,
|
|
114
|
+
listing: { summary: expect.stringContaining('Browse local food') },
|
|
115
|
+
assets: {
|
|
116
|
+
icon: { alt: 'Food Ordering noodle bowl' },
|
|
117
|
+
screenshots: [
|
|
118
|
+
expect.objectContaining({
|
|
119
|
+
alt: 'Food Ordering MCP App showing nearby stores',
|
|
120
|
+
prompt: 'Help me build a noodle order for pickup.',
|
|
121
|
+
}),
|
|
122
|
+
expect.objectContaining({
|
|
123
|
+
alt: 'Food Ordering MCP App showing the Harbor Noodles menu',
|
|
124
|
+
prompt: 'Show me the Harbor Noodles menu.',
|
|
125
|
+
}),
|
|
126
|
+
expect.objectContaining({
|
|
127
|
+
alt: 'Food Ordering MCP App reviewing a checkout handoff',
|
|
128
|
+
prompt: 'Review my spicy miso bowl order before checkout.',
|
|
129
|
+
}),
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
const scenarios = distribution?.review.scenarios ?? [];
|
|
134
|
+
expect(scenarios.filter(({ shouldInvoke }) => shouldInvoke).map(({ id }) => id)).toEqual([
|
|
135
|
+
'build_order',
|
|
136
|
+
'browse_menu',
|
|
137
|
+
'compare_options',
|
|
138
|
+
'plan_pickup',
|
|
139
|
+
'review_checkout',
|
|
140
|
+
]);
|
|
141
|
+
expect(scenarios.filter(({ shouldInvoke }) => !shouldInvoke).map(({ id }) => id)).toEqual([
|
|
142
|
+
'unrelated_weather',
|
|
143
|
+
'unrelated_email',
|
|
144
|
+
'unrelated_travel',
|
|
145
|
+
]);
|
|
146
|
+
expect(
|
|
147
|
+
scenarios
|
|
148
|
+
.filter(({ shouldInvoke }) => !shouldInvoke)
|
|
149
|
+
.every((scenario) => !('tools' in scenario)),
|
|
150
|
+
).toBe(true);
|
|
103
151
|
});
|
|
104
152
|
});
|
|
@@ -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.70.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.70.0 hash:efffbf82007f935d -->
|
|
7
7
|
|
|
8
8
|
# publishing-mcp-integrations
|
|
9
9
|
|
|
@@ -405,6 +405,26 @@ Author managed config as `secret("NAME")` / `variable("NAME")` and operate it wi
|
|
|
405
405
|
|
|
406
406
|
To place the same server tools inside a SaaS web app, declare `assistant: embeddedAssistant(...)` alongside the one server-level brand kit. Read `embedded-assistant.md` before integrating: it owns the HTTPS-origin rule, managed model configuration, required deploy-before-client sequence, customer-backend exchange, browser mount, and verification checklist.
|
|
407
407
|
|
|
408
|
+
## Knowledge components
|
|
409
|
+
|
|
410
|
+
Ground an assistant in controlled documents and the customer's live public site with one declaration — never a handwritten `search`/`fetch` tool pair, a provider name, a sync job, or an index manifest. Declare `knowledge(...)` with `file(...)` documents (UTF-8 `.md`/`.txt`, project-root relative, ≤100 files, ≤1 MiB each, ≤25 MiB per component) and `site(...)` live scopes (exact HTTPS origin plus positive path globs), pass the declaration in the server's `knowledge` array, and include it in a public website surface's `capabilities` to project the generated `search_<name>` capability:
|
|
411
|
+
|
|
412
|
+
```ts
|
|
413
|
+
const product = knowledge('product', {
|
|
414
|
+
title: 'Product knowledge',
|
|
415
|
+
description: 'Public product, pricing, and support information.',
|
|
416
|
+
documents: [
|
|
417
|
+
file('./knowledge/product.md', { title: 'Product guide' }),
|
|
418
|
+
file('./knowledge/faq.txt', { title: 'FAQ' }),
|
|
419
|
+
],
|
|
420
|
+
sites: [
|
|
421
|
+
site({ origin: 'https://www.acme.example', include: ['/docs/**', '/pricing'] }),
|
|
422
|
+
],
|
|
423
|
+
});
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
The compiler validates and hashes every document at build time (bad extensions, root escapes, symlinks, oversize, and non-UTF-8 fail `noodle validate` with the exact path); deployment publishes versioned files transactionally with the app and the provider keeps live-site content current. Component names are lowercase snake-case; each component implies exactly one generated bounded search capability with cited results.
|
|
427
|
+
|
|
408
428
|
## Boundaries
|
|
409
429
|
|
|
410
430
|
Do not hand-author manifest JSON/YAML, runtime artifacts, connector IR, or hosted asset metadata. Do not read or copy secrets, bearer tokens, refresh tokens, static access keys, `.env`, `.env.noodle`, or `~/.noodle/config.json`. Hosted access is identity-based — do not add static data-plane credential paths.
|
|
@@ -25,7 +25,7 @@ Developer-facing `noodle` commands, grouped by area. Local authoring commands (`
|
|
|
25
25
|
| `noodle docs` | Export docs in an LLM-readable format. |
|
|
26
26
|
| `noodle connect` | Print connection setup for an agent host (Claude Code, Codex, Cursor, etc.). |
|
|
27
27
|
| `noodle import` | Import an OpenAPI spec into a starter `server.ts`. |
|
|
28
|
-
| `noodle export` | Compile locally and write
|
|
28
|
+
| `noodle export` | Compile locally and write a portable manifest or target host-plugin archive (no service). |
|
|
29
29
|
| `noodle validate` | Author-time compile/schema/connector check; no service (`--json`, `--fix-prompt`). |
|
|
30
30
|
| `noodle check` | Check tool design (`tool_design_*`) and MCP Apps/widget readiness; no service. `--min-severity warn` shows only what needs fixing. |
|
|
31
31
|
| `noodle test` | Local compile plus a loopback MCP smoke. |
|
|
@@ -56,6 +56,8 @@ Run `noodle validate` (add `--json` for the machine-readable envelope, `--fix-pr
|
|
|
56
56
|
| `invalid_asset` | Fix the `asset("./path")` reference; the file must exist and be a supported asset type. |
|
|
57
57
|
| `invalid_capability_requirement` | Correct the declared capability/permission requirement to a supported value. |
|
|
58
58
|
| `state_secret_field` | Remove the secret-shaped field from widget/handle state; secrets must never be stored in state or sent to widgets. |
|
|
59
|
+
| `invalid_knowledge` | Fix the `knowledge()` declaration: documents must be existing UTF-8 `.md`/`.txt` files inside the project root (no symlinks), within the 100-file / 1 MiB / 25 MiB bounds, and sites need an exact HTTPS origin plus at least one include glob. |
|
|
60
|
+
| `knowledge_unhashed` | Compile from the project root (`noodle validate`/`noodle dev`) so declared knowledge documents can be read and hashed. |
|
|
59
61
|
| `unknown_connector_alias` | The tool calls a connector alias not declared in `use`/`provides`; add it or fix the alias (see `suggestions`). |
|
|
60
62
|
| `connector_not_in_catalog` | The referenced connector is not in the resolved catalog; add it to the project connectors or correct the reference. |
|
|
61
63
|
| `unknown_operation` | The connector has no such operation; use an operation declared on that connector (see `didYouMean`/`suggestions`). |
|
|
@@ -84,11 +84,21 @@ At most one public surface (`public` or `mixed`) and at most one authenticated s
|
|
|
84
84
|
|
|
85
85
|
A public surface **must** declare `capabilities`: the exact positive allowlist it may reach. It is required by the type, and it is the whole externally reachable surface — a reviewer should read it in one screenful. Anything absent stays private, and a capability added to the server later is excluded until someone lists it. `authenticatedWebsite` may also take `capabilities` to narrow the in-app surface; omitted, it projects the whole server.
|
|
86
86
|
|
|
87
|
-
### Mixed surfaces:
|
|
87
|
+
### Mixed surfaces: let a visitor sign in mid-conversation
|
|
88
88
|
|
|
89
|
-
`
|
|
89
|
+
Add `signIn: true` to a public surface when some capabilities need a signed-in visitor. The surface becomes `mixed`: anonymous visitors start immediately, an identity-dependent capability stays **visible** so the assistant can offer it, and reaching for it raises a sign-in prompt instead of executing.
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
```ts
|
|
92
|
+
access: publicWebsite({
|
|
93
|
+
origins: ["https://www.example.com"],
|
|
94
|
+
capabilities: [answerProductQuestion, requestDemo, myOrders],
|
|
95
|
+
signIn: true, // `myOrders` reads ${user}; visitors sign in to reach it
|
|
96
|
+
}),
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Elevation runs through the **host application own login**, never a Noodle-operated one. The widget raises `assistant-sign-in-requested` with a single-use `continuation`; the page signs the visitor in as it already does, then its backend POSTs that continuation to the session exchange **with its own client credentials**. Possession of the continuation alone elevates nothing, and the service checks the client tenant owns that conversation.
|
|
100
|
+
|
|
101
|
+
The conversation is kept: same history, new token, the anonymous one dead. Do not build a second identity provider for this.
|
|
92
102
|
|
|
93
103
|
A connector-backed side effect needs **two** independent declarations to be reachable from a public or mixed surface: inclusion in `capabilities` **and** `{ confirm: true }` on the operation. Signing in proves who the visitor is; it does not pre-authorize an effect, so confirmation still applies on a mixed surface. Confirmation is never authentication or business authorization — the customer backend still owns payload validation, abuse controls, and idempotency. Local or session-only widget state needs no confirmation.
|
|
94
104
|
|
|
@@ -8,7 +8,7 @@ Do not wait for the user to name `agentGuide`. During every MCP server or App bu
|
|
|
8
8
|
|
|
9
9
|
Author a guide when any of these conditions applies:
|
|
10
10
|
|
|
11
|
-
- A request for an App Package or app product skill requires one. A marketplace plugin or customer-agent distribution
|
|
11
|
+
- A request for an App Package or app product skill requires one. A marketplace plugin or customer-agent distribution also needs this product source in addition to separate listing metadata.
|
|
12
12
|
- Multiple capabilities participate in one user workflow, especially when order or purpose matters.
|
|
13
13
|
- Safe or useful operation depends on product-specific ordering, grounding, clarification, boundaries, or representative examples that capability descriptions cannot express.
|
|
14
14
|
|
|
@@ -20,7 +20,7 @@ Make the judgment from the user’s stated outcome and grounded product evidence
|
|
|
20
20
|
|
|
21
21
|
Noodle workflow skills teach a coding agent how to build and operate Noodle projects. The generated app product skill is team-local guidance for using one product. A marketplace plugin is a separate host distribution bundle.
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
A host-neutral distribution metadata and archive framework now exists, but per-app marketplace plugin generation is not available until a target adapter lands, and customer-agent distribution is not available. If the user asks for either, explain the boundary and stop at the proven local App Package, product-skill, and metadata work. Do not claim a target bundle, submission, hosted distribution, or customer-agent projection.
|
|
24
24
|
|
|
25
25
|
## Creation workflow
|
|
26
26
|
|
|
@@ -7,6 +7,7 @@ Directory requirements evolve. Identify the requested directory first and verify
|
|
|
7
7
|
## Contents
|
|
8
8
|
|
|
9
9
|
- Shared readiness gate
|
|
10
|
+
- Distribution metadata source
|
|
10
11
|
- Directory-specific evidence
|
|
11
12
|
- Submission boundary
|
|
12
13
|
|
|
@@ -18,6 +19,22 @@ Use `references/app-directory-compliance.md` as this route’s canonical shared
|
|
|
18
19
|
|
|
19
20
|
Prepare evidence for a reachable production MCP endpoint, accurate capability descriptions and schemas, useful fallback behavior, realistic positive and negative tests, data minimization, privacy disclosures, support ownership, and any interactive surface the directory will review.
|
|
20
21
|
|
|
22
|
+
## Distribution metadata source
|
|
23
|
+
|
|
24
|
+
When the user explicitly prepares host packaging, author the host-neutral `distribution` option in the same `server.ts`; do not add it during an ordinary build that has no distribution goal. It contains listing, publisher, support, legal, assets, and review facts that cannot be derived safely from MCP capability descriptions.
|
|
25
|
+
|
|
26
|
+
Reference real packaged images with `asset(...)`, write useful alt text, and include realistic positive and negative review scenarios. Name the exact expected MCP tools in each positive scenario’s `tools` array. A negative scenario is a non-invocation case: set `shouldInvoke: false` and do not define `tools`. For each MCP App screenshot, add the separate user `prompt` that produces that exact state. Capture only the rendered MCP App response—never the enclosing website, Devtools shell, host conversation, or an unrelated product photo—and meet the selected directory’s current format, dimension, and count limits. Keep reviewer credentials, tokens, secrets, personal data, and test-account passwords out of metadata and source control; supply any authorized reviewer credential out of band.
|
|
27
|
+
|
|
28
|
+
`distribution` is projected separately. It leaves the canonical App Package and Runtime Artifact unchanged, so editing listing copy cannot change deployment execution or product-skill identity. A product package still needs the separately judged `agentGuide`; do not duplicate capability schemas or workflow truth in listing metadata.
|
|
29
|
+
|
|
30
|
+
The shared framework can validate metadata and resolved image bytes, run an available target adapter, and create a reproducible archive. Target-specific availability and exact flags live in `references/cli-commands.md` and the live command catalog (`noodle commands --json`); never invent an unlisted target, bundle, filename, or acceptance claim.
|
|
31
|
+
|
|
32
|
+
When a directory has separate installable-plugin and remote-connector submission projections, generate each with its own exact live-catalog command. Never combine their archives or describe an operator dossier as directly portal-uploadable.
|
|
33
|
+
|
|
34
|
+
Local or repository testing and public-directory submission are distinct packaging states with distinct required inputs. An export command only compiles local source and writes the requested archive. It does not deploy, register, upload, submit, review, or publish the package.
|
|
35
|
+
|
|
36
|
+
When an export reports `uploadArtifacts`, treat its output archive as an outer review kit. Extract it, follow the generated instructions, and upload only the named inner artifacts to their matching fields. Never substitute the outer kit for a nested single-purpose upload.
|
|
37
|
+
|
|
21
38
|
## Directory-specific evidence
|
|
22
39
|
|
|
23
40
|
Read the selected directory’s current official submission documentation at review time. Record each additional requirement separately from the shared checklist, including listing fields, identity verification, test credentials, screenshots, policy declarations, review limits, and appeal or resubmission steps. Never project one directory’s requirements onto another.
|
|
@@ -26,4 +43,4 @@ When a requirement cannot be verified from the selected directory’s current do
|
|
|
26
43
|
|
|
27
44
|
## Submission boundary
|
|
28
45
|
|
|
29
|
-
Preparation is read-only. Deployment, access changes, directory registration,
|
|
46
|
+
Preparation is read-only. Reverify current official requirements immediately before public submission. Deployment, access changes, directory registration, credential entry, final submission, and publication each remain separate human-operated mutations that require explicit authorization for the exact target. Report remaining evidence gaps and stop when that authority or required directory access is absent.
|
|
@@ -58,14 +58,17 @@ Platform helper connectors are explicit subpath imports from `@noodleseed/one/pl
|
|
|
58
58
|
- `customerEndpoint`
|
|
59
59
|
- `embeddedAssistant`
|
|
60
60
|
- `externalExchange`
|
|
61
|
+
- `file`
|
|
61
62
|
- `gmailConnector`
|
|
63
|
+
- `knowledge`
|
|
62
64
|
- `managedSecret`
|
|
63
65
|
- `openAICompatible`
|
|
64
66
|
- `publicWebsite`
|
|
67
|
+
- `site`
|
|
65
68
|
|
|
66
69
|
## Authoring signatures
|
|
67
70
|
|
|
68
|
-
- `server(name, options, definitions)` — `options` commonly includes `title`, `version`, `instructions`, `branding`, `auth`, `use`, `provides`, `state`, and `handoff`; `definitions` is the array of tools/resources/prompts.
|
|
71
|
+
- `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.
|
|
69
72
|
- `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.
|
|
70
73
|
- `resource(name, { uri, description?, mimeType?, fulfil })` and `prompt(name, { description?, arguments?, fulfil })` expose MCP resources/prompts.
|
|
71
74
|
- View metadata (`viewTitle`, `viewDescription`, `csp`, `domain`, `permissions`) belongs on the tool that renders it; `asset("./path")` packages local files.
|
|
@@ -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.70.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.70.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.70.0 hash:eccc3c158dcafba8 -->
|
|
7
7
|
|
|
8
8
|
# wrapping-existing-applications
|
|
9
9
|
|