@noodleseed/agent-kit 0.53.0 → 0.55.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.
Files changed (50) hide show
  1. package/manifest.json +261 -261
  2. package/package.json +1 -1
  3. package/skills/claude-code/SKILL.md +2 -2
  4. package/skills/claude-code/authoring-mcp-servers/SKILL.md +1 -1
  5. package/skills/claude-code/building-mcp-apps/SKILL.md +1 -1
  6. package/skills/claude-code/connecting-apis-to-mcp/SKILL.md +1 -1
  7. package/skills/claude-code/debugging-mcp-delivery/SKILL.md +1 -1
  8. package/skills/claude-code/deploying-mcp-services/SKILL.md +1 -1
  9. package/skills/claude-code/designing-mcp-products/SKILL.md +1 -1
  10. package/skills/claude-code/embedding-mcp-assistants/SKILL.md +1 -1
  11. package/skills/claude-code/examples/customer-auth/README.md +145 -155
  12. package/skills/claude-code/examples/customer-auth/src/server.ts +27 -20
  13. package/skills/claude-code/examples/customer-auth/test/server.test.ts +38 -9
  14. package/skills/claude-code/examples/food-ordering/README.md +5 -4
  15. package/skills/claude-code/examples/google-bigquery/README.md +6 -0
  16. package/skills/claude-code/executing-noodle-plans/SKILL.md +1 -1
  17. package/skills/claude-code/publishing-mcp-integrations/SKILL.md +1 -1
  18. package/skills/claude-code/references/authoring-workflow.md +73 -4
  19. package/skills/claude-code/references/compile-errors.md +8 -0
  20. package/skills/claude-code/references/connect-an-api.md +1 -1
  21. package/skills/claude-code/references/deploy-and-ops.md +1 -1
  22. package/skills/claude-code/references/embedded-assistant.md +3 -6
  23. package/skills/claude-code/references/sdk-surface.md +1 -0
  24. package/skills/claude-code/references/troubleshooting.md +1 -1
  25. package/skills/claude-code/reporting-noodle-feedback/SKILL.md +1 -1
  26. package/skills/claude-code/verifying-mcp-delivery/SKILL.md +1 -1
  27. package/skills/codex/SKILL.md +2 -2
  28. package/skills/codex/authoring-mcp-servers/SKILL.md +1 -1
  29. package/skills/codex/building-mcp-apps/SKILL.md +1 -1
  30. package/skills/codex/connecting-apis-to-mcp/SKILL.md +1 -1
  31. package/skills/codex/debugging-mcp-delivery/SKILL.md +1 -1
  32. package/skills/codex/deploying-mcp-services/SKILL.md +1 -1
  33. package/skills/codex/designing-mcp-products/SKILL.md +1 -1
  34. package/skills/codex/embedding-mcp-assistants/SKILL.md +1 -1
  35. package/skills/codex/examples/customer-auth/README.md +145 -155
  36. package/skills/codex/examples/customer-auth/src/server.ts +27 -20
  37. package/skills/codex/examples/customer-auth/test/server.test.ts +38 -9
  38. package/skills/codex/examples/food-ordering/README.md +5 -4
  39. package/skills/codex/examples/google-bigquery/README.md +6 -0
  40. package/skills/codex/executing-noodle-plans/SKILL.md +1 -1
  41. package/skills/codex/publishing-mcp-integrations/SKILL.md +1 -1
  42. package/skills/codex/references/authoring-workflow.md +73 -4
  43. package/skills/codex/references/compile-errors.md +8 -0
  44. package/skills/codex/references/connect-an-api.md +1 -1
  45. package/skills/codex/references/deploy-and-ops.md +1 -1
  46. package/skills/codex/references/embedded-assistant.md +3 -6
  47. package/skills/codex/references/sdk-surface.md +1 -0
  48. package/skills/codex/references/troubleshooting.md +1 -1
  49. package/skills/codex/reporting-noodle-feedback/SKILL.md +1 -1
  50. package/skills/codex/verifying-mcp-delivery/SKILL.md +1 -1
@@ -23,17 +23,46 @@ describe('customer-auth example', () => {
23
23
  name: 'Noodle Seed Assistant',
24
24
  colorScheme: 'auto',
25
25
  });
26
- expect(manifest.server.auth).toMatchObject({
27
- kind: 'bridge',
28
- provider: 'firebase',
29
- projectId: '${env.FIREBASE_PROJECT_ID}',
30
- apiKey: '${env.FIREBASE_WEB_API_KEY}',
31
- authDomain: '${env.FIREBASE_AUTH_DOMAIN}',
32
- user: {
33
- roles: 'claims.roles',
34
- scopes: 'claims.scopes',
26
+ expect(manifest.server.auth).toEqual({
27
+ kind: 'oidc',
28
+ issuer: 'https://id.noodleseed.dev',
29
+ audience: 'https://org.cloud.noodleseed.dev/app/mcp',
30
+ claims: {
31
+ id: 'sub',
32
+ email: 'email',
33
+ name: 'name',
34
+ orgs: 'permissions.orgs',
35
+ roles: 'permissions.roles',
36
+ scopes: 'permissions.scopes',
37
+ },
38
+ routing: {
39
+ endpoints: {
40
+ customer_api: { claim: 'tenant.api_base_url' },
41
+ },
42
+ },
43
+ });
44
+ const catalog = app.toConnectorCatalog();
45
+ expect(catalog?.connectors).toHaveLength(1);
46
+ expect(catalog?.connectors[0]?.http).toMatchObject({
47
+ baseUrl: {
48
+ kind: 'customerEndpoint',
49
+ name: 'customer_api',
50
+ policy: { allowedHttpsHostSuffixes: ['api.noodleseed.dev'] },
51
+ },
52
+ auth: {
53
+ kind: 'delegatedTokenExchange',
54
+ tokenUrl: 'https://id.noodleseed.dev/oauth/token',
55
+ clientId: '${env.CUSTOMER_API_CLIENT_ID}',
56
+ clientSecret: 'CUSTOMER_API_CLIENT_SECRET',
35
57
  },
36
58
  });
59
+ expect(
60
+ Object.values(catalog?.connectors[0]?.http?.operations ?? {}).every(
61
+ (operation) => operation.type === 'read',
62
+ ),
63
+ ).toBe(true);
64
+ expect(catalog?.connectors[0]?.http).not.toHaveProperty('allowedOrigins');
65
+ expect(JSON.stringify({ manifest, catalog })).not.toContain('tenant-a.api.noodleseed.dev');
37
66
  expect(manifest.tools.find((tool) => tool.name === 'list_org_apps')?.authorization).toEqual({
38
67
  requiredScopes: ['org_apps:read'],
39
68
  allowedRoles: ['org_admin', 'org_member'],
@@ -84,13 +84,14 @@ noodle connect inspector
84
84
  ## Deploy
85
85
 
86
86
  ```sh
87
- noodle link --org demo --app food-ordering
88
- noodle deploy --access owner-only
87
+ noodle deploy --org demo --app food-ordering --env prod --access owner-only
89
88
  noodle open
90
89
  ```
91
90
 
92
- Use `--access org-members` for an org-wide internal demo. This example has no connector secrets and does not
93
- include tokens, caller-key mechanisms, or `.env.noodle` values.
91
+ That one deploy command preflights the complete target, creates a missing app/environment, and verifies
92
+ hosted readiness. If it is interrupted, rerun the same command to resume the unfinished operation without a
93
+ duplicate deployment. Use `--access org-members` for an org-wide internal demo. This example has no
94
+ connector secrets and does not include tokens, caller-key mechanisms, or `.env.noodle` values.
94
95
 
95
96
  ## Demo Assets
96
97
 
@@ -99,3 +99,9 @@ Compilation and tests need no Google credentials:
99
99
  noodle validate
100
100
  noodle test
101
101
  ```
102
+
103
+ For a local run that needs the declared provider values, the exact project-root `.env` can contain
104
+ `GOOGLE_WIF_PROVIDER` and `GOOGLE_SERVICE_ACCOUNT`; `noodle dev` uses matching declarations only as a
105
+ read-only fallback, and scoped `.env.noodle` values override it. Never commit or ask an agent to read either
106
+ file. Interactive deploy can offer a default-No import of matching missing names to the visible target;
107
+ non-interactive and plugin deploys keep the value-free `noodle variables set ... --from-env` recovery path.
@@ -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.53.0 hash:6a9f132ddb79352e -->
6
+ <!-- noodle-skill version:0.55.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.53.0 hash:efffbf82007f935d -->
6
+ <!-- noodle-skill version:0.55.0 hash:efffbf82007f935d -->
7
7
 
8
8
  # publishing-mcp-integrations
9
9
 
@@ -8,6 +8,7 @@
8
8
  - Connectors
9
9
  - HTTP connector example (full server)
10
10
  - Customer OAuth for remote MCP clients
11
+ - Auth-derived customer API endpoints
11
12
  - Per-tool authorization
12
13
  - Delegated downstream auth (call your API as the signed-in user)
13
14
  - Invocation context
@@ -109,6 +110,74 @@ For `customerAuth.oidc(...)` and `.federatedOidc(...)`, the application develope
109
110
 
110
111
  That metadata must expose HTTPS `authorization_endpoint`, `token_endpoint`, `jwks_uri`, and RFC 7591 `registration_endpoint`; advertise authorization-code and refresh-token grants, Dynamic Client Registration, PKCE with `code_challenge_methods_supported: ["S256"]`, and public clients with `token_endpoint_auth_methods_supported: ["none"]`. Implement RFC 8707 `resource`, mint access-token `aud` for the exact MCP resource URL, and publish only public signing keys in JWKS. Run `noodle auth doctor src/server.ts`; its issuer-readiness probes perform bounded read-only GET checks and never register a client. A successful `noodle deploy --access customers` reports the same readiness without turning a diagnostic failure into a failed deployment.
111
112
 
113
+ ## Auth-derived customer API endpoints
114
+
115
+ Use a customer endpoint when the verified IdP selects a different API base URL for each SaaS customer. The claim contains the complete base URL; tool input and `${user}` do not select it. Declare one named policy, use that reference as the connector `baseUrl`, and map its claim path in direct OIDC or on every federated issuer:
116
+
117
+ ```ts
118
+ import { connector, customerAuth, customerEndpoint, secret, server, tool, variable, z } from '@noodleseed/one';
119
+
120
+ const customerApi = customerEndpoint('customer_api', {
121
+ allowedHttpsHostSuffixes: ['api.noodleseed.dev'],
122
+ });
123
+
124
+ const api = connector('customer_api_connector').version('1.0.0').http({
125
+ baseUrl: customerApi,
126
+ auth: {
127
+ kind: 'delegatedTokenExchange',
128
+ tokenUrl: 'https://id.noodleseed.dev/oauth/token',
129
+ clientId: variable('CUSTOMER_API_CLIENT_ID'),
130
+ clientSecret: secret('CUSTOMER_API_CLIENT_SECRET'),
131
+ },
132
+ operations: {
133
+ list_records: {
134
+ type: 'read',
135
+ method: 'GET',
136
+ path: '/records',
137
+ input: z.object({}),
138
+ output: z.object({ records: z.array(z.unknown()).max(100) }),
139
+ },
140
+ },
141
+ });
142
+
143
+ export default server(
144
+ 'customer_records',
145
+ {
146
+ title: 'Customer records',
147
+ version: '1.0.0',
148
+ use: { api },
149
+ auth: customerAuth.oidc({
150
+ issuer: 'https://id.noodleseed.dev',
151
+ audience: 'https://org.cloud.noodleseed.dev/app/mcp',
152
+ routing: {
153
+ endpoints: {
154
+ customer_api: { claim: 'tenant.api_base_url' },
155
+ },
156
+ },
157
+ }),
158
+ },
159
+ [
160
+ tool('list_records', {
161
+ description: 'List records for the signed-in customer.',
162
+ input: z.object({}),
163
+ output: z.object({ records: z.array(z.unknown()).max(100) }),
164
+ fulfil: ({ connectors }) => {
165
+ const result = connectors.api.listRecords();
166
+ return { records: result.records };
167
+ },
168
+ }),
169
+ ],
170
+ );
171
+ ```
172
+
173
+ `customerEndpoint` accepts exactly one non-empty policy arm: exact HTTPS origins, or HTTPS hostname suffixes. Exact policies may authorize an explicit non-default port; suffix policies allow port 443 and match only the exact host or dot-boundary subdomains. Do not add connector `allowedOrigins` to a customer-routed connector. Its fixed credential/token endpoints are validated independently and cannot come from caller claims.
174
+
175
+ Every federated issuer must repeat every endpoint key used by the app, although each issuer may choose a different claim path. Endpoint names use lowercase letters, numbers, and underscores. Resolved claims must be exact absolute HTTPS URLs of at most 2,048 UTF-8 bytes with no userinfo, query, fragment, IP literal, special-use host, or unsafe whitespace/control characters. The runtime preserves a canonical optional base path.
176
+
177
+ Resolved customer URLs are private routing authority: they never enter the manifest/artifact, `${user}`, logs, model output, widgets, confirmation review, cache keys, or delegated-token-exchange assertions. Routed read operations may be used by tools, including their declared nested connector calls. Customer-routed action operations fail compilation with `customer_endpoint_action_unsupported`; routed resources, prompts, and ambient context fail with `customer_endpoint_surface_unsupported` in this release.
178
+
179
+ At runtime, a missing, malformed, or disallowed claim returns the same safe `connector_route_unavailable` tool error before credential lookup or connector egress. `tools/list` remains based only on roles and scopes, so route availability neither reveals tenant topology nor changes the existing authorization filter.
180
+
112
181
  ## Per-tool authorization
113
182
 
114
183
  Keep endpoint authentication in `customerAuth.*(...)`, then narrow individual tools with the optional typed `authorization` rule. Every `requiredScopes` value is required; any one `allowedRoles` value is sufficient; when both lists are present, both conditions apply. Omit `authorization` for an unrestricted tool. Do not invent a policy expression language or infer authorization from tool arguments, page context, connector output, email domains, or other unverified data.
@@ -135,7 +204,7 @@ Role values are trusted only from the explicitly configured claim path (or the p
135
204
 
136
205
  Use delegated connector auth when the downstream API must enforce its own per-user authorization — a shared service credential plus a forwarded user id would bypass it. Three shapes exist; pick by who owns the downstream:
137
206
 
138
- - **`delegatedTokenExchange`** — your own API. The platform signs a short-lived, verifiable assertion of the signed-in user and exchanges it at a token endpoint you implement (RFC 8693). Works with verified customer OIDC identities, the built-in Firebase/Microsoft adapters, and embedded-assistant sessions; no per-user OAuth enrollment.
207
+ - **`delegatedTokenExchange`** — your own API. The platform signs a short-lived, verifiable assertion of the signed-in user and exchanges it at a token endpoint you implement (RFC 8693). It works with verified customer OIDC identities and the built-in Firebase/Microsoft adapters; no per-user OAuth enrollment. Embedded-assistant sessions support this exchange for static connectors. Customer-routed connectors require a direct or federated MCP OIDC request and fail closed in embedded-assistant sessions because those sessions carry no IdP endpoint claim.
139
208
  - **`delegatedOAuth` with `provider: "firebase" | "microsoft"`** — Noodle-managed bridge providers using stored per-user refresh tokens. Requires the matching `customerAuth` bridge; any other provider string is the compile error `unsupported_delegated_provider`.
140
209
  - **`delegatedSessionCookie`** — Firebase-managed session-cookie apps only; not a generic mechanism.
141
210
 
@@ -144,7 +213,7 @@ Use delegated connector auth when the downstream API must enforce its own per-us
144
213
  ```ts
145
214
  auth: {
146
215
  kind: 'delegatedTokenExchange',
147
- tokenUrl: 'https://app.example.com/api/assistant/oauth/token', // origin must be in allowedOrigins
216
+ tokenUrl: 'https://app.example.com/api/assistant/oauth/token', // fixed HTTPS; static connectors also allowlist its origin
148
217
  clientId: variable('EXAMPLE_DELEG_CLIENT_ID'),
149
218
  clientSecret: secret('EXAMPLE_DELEG_CLIENT_SECRET'),
150
219
  scopes: ['time_off'], // optional
@@ -167,7 +236,7 @@ scope=time_off (space-joined, when configured)
167
236
  audience=example-api (when configured)
168
237
  ```
169
238
 
170
- The `subject_token` claims: `iss` (platform issuer; JWKS at `{iss}/.well-known/jwks.json`), `sub` (verified user id), `aud` (your configured audience or the tokenUrl), `email`, `name`, `claims` (declared session claims), `tenant` (`org/app/env`), `deployment`, `iat`, `exp` (about 120 s), `jti`. Respond with `{ "access_token": "...", "token_type": "Bearer", "expires_in": 900 }`; the broker caches per user + connector + scopes until `expires_in` minus 300 s and presents the token downstream as `Authorization: Bearer`.
239
+ The `subject_token` claims: `iss` (platform issuer; JWKS at `{iss}/.well-known/jwks.json`), `sub` (verified user id), `aud` (your configured audience or the tokenUrl), `email`, `name`, `claims` (declared session claims), `tenant` (`org/app/env`), `deployment`, `iat`, `exp` (about 120 s), `jti`. A routed exchange adds `route: { key, fingerprint }`, never the customer URL; credential cache and single-flight keys include that route binding. Respond with `{ "access_token": "...", "token_type": "Bearer", "expires_in": 900 }`; the broker caches per user + connector + scopes + route until `expires_in` minus 300 s and presents the token downstream as `Authorization: Bearer`.
171
240
 
172
241
  ### The downstream token endpoint (your backend)
173
242
 
@@ -292,4 +361,4 @@ To place the same server tools inside a SaaS web app, declare `assistant: embedd
292
361
 
293
362
  ## Boundaries
294
363
 
295
- 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.noodle`, or `~/.noodle/config.json`. Hosted access is identity-based — do not add static data-plane credential paths.
364
+ 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.
@@ -63,5 +63,13 @@ Run `noodle validate` (add `--json` for the machine-readable envelope, `--fix-pr
63
63
  | `unsupported_credential_profile` | Select a credential profile declared by the connector and accepted by the operation; use the reported suggestions instead of inventing a profile name. |
64
64
  | `credential_scope_mismatch` | Declare a connection source whose scopes include every operation-required scope, or select an external exchange provider that can mint them. |
65
65
  | `credential_audience_mismatch` | Set the connection source audience to the operation-required audience exactly, or use an external exchange provider that can mint it. |
66
+ | `customer_endpoint_auth_required` | Protect the app with direct or federated `customerAuth` OIDC and map every reachable `customerEndpoint` key under auth routing. |
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
+ | `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
+ | `customer_endpoint_bridge_unsupported` | Replace the Firebase/Microsoft bridge with direct or federated OIDC before using auth-derived customer connector endpoints. |
70
+ | `customer_endpoint_action_unsupported` | Use a read operation for this customer-routed call until route-bound action confirmation support is available. |
71
+ | `customer_endpoint_surface_unsupported` | Move the customer-routed call into a tool fulfilment; routed resources, prompts, and ambient providers are unsupported. |
72
+ | `customer_endpoint_credential_source_unsupported` | Remove the manifest connection binding; a customer-routed connector uses its declared delegated token exchange auth or no auth. |
73
+ | `customer_endpoint_policy_conflict` | Give every reachable declaration of this endpoint key one identical policy, or rename keys whose allowed origins differ. |
66
74
  | `unused_connector_alias` | A declared connector alias is never called; remove the unused `use` entry or wire it into a tool. |
67
75
  | `arg_mismatch` | A connector call is missing or adds arguments; match the operation signature under `expected`/`got`. |
@@ -163,7 +163,7 @@ noodle secrets set SOME_API_KEY --runtime cloud --scope env --org <org> --app <a
163
163
 
164
164
  `--runtime` is required whenever `--org`, `--app`, and `--env` together name a complete hosted target: a command that looks remote must never fall back to writing `.env.noodle`. Omitting it fails with `runtime_required` before anything is written.
165
165
 
166
- Local secrets live in `./.env.noodle` (never commit it). A required `secret(...)` or `variable(...)` that cannot resolve fails boot closed. `noodle tools call` / `noodle test` / `noodle dev` / `noodle devtools` stop before exposing an empty endpoint and print the exact effective target plus recovery command.
166
+ Scoped local values live in `./.env.noodle`; the exact project-root `.env` is a read-only fallback for matching `secret("NAME")` / `variable("NAME")` declarations during local authoring. Never commit or print either file. Local authoring may read them only through this managed resolution path, and an interactive human `noodle deploy` may copy only missing declared `.env` names through its default-No import consent flow; agents and non-interactive runs use the value-free recovery commands instead. A required value that cannot resolve makes local commands stop before exposing an empty endpoint.
167
167
 
168
168
  ### Prove real output
169
169
 
@@ -16,7 +16,7 @@ Do not broaden a request to prepare, inspect, diagnose, or validate into permiss
16
16
 
17
17
  ## Command and service contract
18
18
 
19
- Use `references/cli-commands.md` as the generated command, flag, and exit-code contract. Consult the live command catalog before acting, and treat the service response as the authority for resulting hosted state. This reference intentionally does not duplicate operational command sequences, defaults, or status semantics.
19
+ Use `references/cli-commands.md` as the generated command, flag, and exit-code contract. Consult the live command catalog before acting, and treat the service response as the authority for resulting hosted state. For an authorized deployment, use the one canonical public flow and follow its structured configuration actions and resume command; do not replace it with an internal script or a hand-built sequence. This reference intentionally does not duplicate operational command sequences, defaults, or status semantics.
20
20
 
21
21
  ## Evidence and stop conditions
22
22
 
@@ -97,16 +97,13 @@ Give every business action a portable `tool(..., { title: "Complete task", descr
97
97
 
98
98
  ## Configure and deploy
99
99
 
100
- Local MCP authoring and tests need no account, but an external browser embed needs an active assistant-enabled deployment before a backend client can be created. Set the model values on the target org/app/env, then deploy:
100
+ Local MCP authoring and tests need no account, but an external browser embed needs an active assistant-enabled deployment before a backend client can be created. Start with the canonical deploy:
101
101
 
102
102
  ```sh
103
- noodle variables set ASSISTANT_MODEL_BASE_URL --scope env --runtime cloud --org <org> --app <app> --env <env> --value <https-model-base-url>
104
- noodle variables set ASSISTANT_MODEL --scope env --runtime cloud --org <org> --app <app> --env <env> --value <model>
105
- noodle secrets set ASSISTANT_MODEL_API_KEY --scope env --runtime cloud --org <org> --app <app> --env <env> --from-env ASSISTANT_MODEL_API_KEY
106
103
  noodle deploy --org <org> --app <app> --env <env>
107
104
  ```
108
105
 
109
- Do not put these 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.
106
+ Deploy preflights the complete target before upload. In an interactive terminal it collects all missing model variables and secrets, then continues. In a non-interactive run it reports every missing name and safe `noodle variables set ... --from-env` / `noodle secrets set ... --from-env` action; perform every action and repeat the same deploy command. Values never appear in the preflight report or resume state. Do not put these 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.
110
107
 
111
108
  ## Access modes and customer auth
112
109
 
@@ -499,7 +496,7 @@ The check reports only required and missing environment names, never their value
499
496
 
500
497
  Inspect the host repository for generated environment bindings after adding names. Run its existing generator, review the diff, commit generated types only when that repository requires them, then run the production-equivalent host build. Do not invent a framework command or add a second generator.
501
498
 
502
- Promotion checklist: provision each environment in the backend secret manager; map names through the CI environment and any secret allowlist or secrets file; run the presence-only preflight before asset upload; promote configuration before code; run the post-deploy probes from the JSON contract; rotate the assistant client and delegated credential independently, then rerun the same checks.
499
+ Promotion checklist: provision each environment in the backend secret manager; map names through the CI environment and any secret allowlist or secrets file; run the presence-only host preflight; run the canonical deploy so its configuration preflight completes before asset upload; run the post-deploy probes from the JSON contract; rotate the assistant client and delegated credential independently, then rerun the same checks.
503
500
 
504
501
  Devtools privacy gate: default model and connector exercises to synthetic or mock data. Before Devtools Chat sends real connector data to an external model, disclose the data flow and obtain the user's approval. A local validation pass is not that approval.
505
502
 
@@ -54,6 +54,7 @@ Platform helper connectors are explicit subpath imports from `@noodleseed/one/pl
54
54
  ### Other
55
55
 
56
56
  - `clientCredentials`
57
+ - `customerEndpoint`
57
58
  - `embeddedAssistant`
58
59
  - `externalExchange`
59
60
  - `gmailConnector`
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## First moves
10
10
 
11
- Re-run the local gates before debugging in-host: `noodle validate`, `noodle check` (add `--target chatgpt` for ChatGPT-specific requirements), and `noodle doctor`. Confirm the CLI is current with `noodle update --check` and that the project-local skill is intact with `noodle agents doctor --json` — host metadata requirements evolve and fixes ship in the CLI/agent-kit. Never paste tokens, secrets, or `.env.noodle` values into prompts or logs while debugging.
11
+ Re-run the local gates before debugging in-host: `noodle validate`, `noodle check` (add `--target chatgpt` for ChatGPT-specific requirements), and `noodle doctor`. Confirm the CLI is current with `noodle update --check` and that the project-local skill is intact with `noodle agents doctor --json` — host metadata requirements evolve and fixes ship in the CLI/agent-kit. Never paste tokens, secrets, or `.env` / `.env.noodle` values into prompts or logs while debugging.
12
12
 
13
13
  For protocol/conformance checks, the headless harness is `@mcpjam/cli`, not a `noodle` subcommand. Use it against a local `noodle dev` URL without an access token, or against hosted URLs through the host/OAuth flow printed by `noodle connect`.
14
14
 
@@ -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.53.0 hash:0f404109f4845683 -->
6
+ <!-- noodle-skill version:0.55.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.53.0 hash:6ef6ef551e26b78e -->
6
+ <!-- noodle-skill version:0.55.0 hash:6ef6ef551e26b78e -->
7
7
 
8
8
  # verifying-mcp-delivery
9
9
 
@@ -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.53.0 hash:18e16a8fa4c68b86 -->
6
+ <!-- noodle-skill version:0.55.0 hash:ec5bfcd0d8165205 -->
7
7
 
8
8
  # Noodle Seed
9
9
 
@@ -82,7 +82,7 @@ When you discover a bug, missing capability, misleading doc, or improvement idea
82
82
 
83
83
  ## Safety
84
84
 
85
- - Keep secrets, bearer tokens, refresh tokens, static access keys, `.env.noodle` values, and `~/.noodle/config.json` out of prompts, logs, docs, tests, and generated files.
85
+ - Keep secrets, bearer tokens, refresh tokens, static access keys, `.env` / `.env.noodle` values, and `~/.noodle/config.json` out of prompts, logs, docs, tests, and generated files.
86
86
  - Never expose an internal launcher or private installation path, ask the user to paste a command the plugin can execute, or use an ad hoc shell/file-parsing pipeline to move a secret. Use the typed secret-from-environment tool or `noodle secrets set ... --from-env NAME`.
87
87
  - Do not hand-author manifest JSON/YAML, runtime artifacts, connector IR, or hosted asset metadata.
88
88
  - Do not add static data-plane credential paths; hosted access is identity-based.
@@ -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.53.0 hash:0b2fd8c7e43fc69f -->
6
+ <!-- noodle-skill version:0.55.0 hash:0b2fd8c7e43fc69f -->
7
7
 
8
8
  # authoring-mcp-servers
9
9
 
@@ -3,7 +3,7 @@ name: building-mcp-apps
3
3
  description: "Use when a Noodle Seed MCP App, widget, interactive card, visual interaction, or host-visible UI is the primary requested outcome."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.53.0 hash:f7fa54992c8d7692 -->
6
+ <!-- noodle-skill version:0.55.0 hash:f7fa54992c8d7692 -->
7
7
 
8
8
  # building-mcp-apps
9
9
 
@@ -3,7 +3,7 @@ name: connecting-apis-to-mcp
3
3
  description: "Use when credentials, an API URL, an OpenAPI document, or an observed response must become real Noodle Seed MCP behavior."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.53.0 hash:1e86b8704f407bd3 -->
6
+ <!-- noodle-skill version:0.55.0 hash:1e86b8704f407bd3 -->
7
7
 
8
8
  # connecting-apis-to-mcp
9
9
 
@@ -3,7 +3,7 @@ name: debugging-mcp-delivery
3
3
  description: "Use when an existing Noodle Seed MCP project has a concrete validation, runtime, connector, App, host, deployment, or production failure."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.53.0 hash:aa715bae12041d7c -->
6
+ <!-- noodle-skill version:0.55.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.53.0 hash:93e735b7ffb45df1 -->
6
+ <!-- noodle-skill version:0.55.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.53.0 hash:76cce86729cffbee -->
6
+ <!-- noodle-skill version:0.55.0 hash:76cce86729cffbee -->
7
7
 
8
8
  # designing-mcp-products
9
9
 
@@ -3,7 +3,7 @@ name: embedding-mcp-assistants
3
3
  description: "Use when embedding a Noodle assistant into an existing SaaS or web application with browser, identity, session, and credential boundaries."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.53.0 hash:cc54a67f21c0ecdb -->
6
+ <!-- noodle-skill version:0.55.0 hash:cc54a67f21c0ecdb -->
7
7
 
8
8
  # embedding-mcp-assistants
9
9