@agent-native/core 0.98.5 → 0.98.7

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 (135) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +18 -0
  3. package/corpus/core/docs/content/external-agents.mdx +66 -7
  4. package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +40 -7
  5. package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +41 -7
  6. package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +41 -7
  7. package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +41 -7
  8. package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +40 -7
  9. package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +40 -7
  10. package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +40 -7
  11. package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +41 -7
  12. package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +39 -7
  13. package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +39 -7
  14. package/corpus/core/package.json +1 -1
  15. package/corpus/core/src/a2a/handlers.ts +101 -26
  16. package/corpus/core/src/a2a/task-store.ts +128 -3
  17. package/corpus/core/src/client/session-replay.ts +67 -5
  18. package/corpus/core/src/integrations/adapters/slack.ts +207 -17
  19. package/corpus/core/src/integrations/identity-links-store.ts +210 -0
  20. package/corpus/core/src/integrations/identity.ts +196 -0
  21. package/corpus/core/src/integrations/index.ts +6 -0
  22. package/corpus/core/src/integrations/plugin.ts +130 -1
  23. package/corpus/core/src/integrations/types.ts +37 -0
  24. package/corpus/core/src/integrations/webhook-handler.ts +1 -0
  25. package/corpus/core/src/mcp/build-server.ts +127 -22
  26. package/corpus/core/src/mcp/builtin-tools.ts +5 -2
  27. package/corpus/core/src/mcp/external-agent-policy.ts +18 -0
  28. package/corpus/core/src/mcp/index.ts +1 -0
  29. package/corpus/core/src/server/agent-chat/plugin-options.ts +12 -1
  30. package/corpus/core/src/server/agent-chat/script-entries.ts +20 -3
  31. package/corpus/core/src/server/agent-chat-plugin.ts +3 -0
  32. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
  33. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +4 -1
  34. package/corpus/templates/analytics/AGENTS.md +20 -5
  35. package/corpus/templates/analytics/actions/create-session-replay-agent-link.ts +0 -1
  36. package/corpus/templates/analytics/actions/get-session-replay-events.ts +0 -1
  37. package/corpus/templates/analytics/actions/get-session-replay-timeline.ts +40 -0
  38. package/corpus/templates/analytics/actions/list-error-issues.ts +12 -0
  39. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +4 -1
  40. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +48 -17
  41. package/corpus/templates/analytics/changelog/2026-07-12-analytics-uses-the-full-in-app-agent-for-multi-step-incident.md +6 -0
  42. package/corpus/templates/analytics/changelog/2026-07-12-connected-external-agents-can-now-look-up-sessions-error-iss.md +6 -0
  43. package/corpus/templates/analytics/changelog/2026-07-12-session-identities-stay-visible-when-demo-mode-is-off.md +6 -0
  44. package/corpus/templates/analytics/server/handlers/session-replay.ts +15 -9
  45. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +2 -2
  46. package/corpus/templates/analytics/server/lib/error-capture.ts +47 -5
  47. package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +72 -22
  48. package/corpus/templates/analytics/server/lib/session-replay.ts +41 -11
  49. package/corpus/templates/analytics/server/plugins/agent-chat.ts +7 -0
  50. package/corpus/templates/analytics/server/plugins/db.ts +15 -0
  51. package/corpus/templates/analytics/server/routes/api/session-replay/agent-diagnostics.json.get.ts +8 -5
  52. package/corpus/templates/analytics/server/routes/api/session-replay/agent-events.json.get.ts +8 -3
  53. package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +12 -2
  54. package/corpus/templates/forms/app/global.css +54 -8
  55. package/corpus/templates/forms/app/pages/AskPage.tsx +35 -13
  56. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +11 -17
  57. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +8 -5
  58. package/corpus/templates/forms/changelog/2026-07-12-ask-forms-suggestions-now-sit-beneath-the-composer-for-a-tig.md +6 -0
  59. package/corpus/templates/forms/changelog/2026-07-12-builder-response-tables-now-fill-the-view-without-a-redundan.md +6 -0
  60. package/corpus/templates/forms/changelog/2026-07-12-response-tables-now-fill-the-available-pane-with-a-flexible-.md +6 -0
  61. package/corpus/templates/mail/AGENTS.md +3 -1
  62. package/corpus/templates/mail/server/lib/mail-integrations.ts +3 -0
  63. package/dist/a2a/handlers.d.ts.map +1 -1
  64. package/dist/a2a/handlers.js +89 -20
  65. package/dist/a2a/handlers.js.map +1 -1
  66. package/dist/a2a/task-store.d.ts +32 -1
  67. package/dist/a2a/task-store.d.ts.map +1 -1
  68. package/dist/a2a/task-store.js +111 -4
  69. package/dist/a2a/task-store.js.map +1 -1
  70. package/dist/client/session-replay.d.ts.map +1 -1
  71. package/dist/client/session-replay.js +53 -8
  72. package/dist/client/session-replay.js.map +1 -1
  73. package/dist/collab/routes.d.ts +1 -1
  74. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  75. package/dist/integrations/adapters/slack.js +176 -17
  76. package/dist/integrations/adapters/slack.js.map +1 -1
  77. package/dist/integrations/identity-links-store.d.ts +23 -0
  78. package/dist/integrations/identity-links-store.d.ts.map +1 -0
  79. package/dist/integrations/identity-links-store.js +158 -0
  80. package/dist/integrations/identity-links-store.js.map +1 -0
  81. package/dist/integrations/identity.d.ts +28 -0
  82. package/dist/integrations/identity.d.ts.map +1 -0
  83. package/dist/integrations/identity.js +142 -0
  84. package/dist/integrations/identity.js.map +1 -0
  85. package/dist/integrations/index.d.ts +2 -0
  86. package/dist/integrations/index.d.ts.map +1 -1
  87. package/dist/integrations/index.js +2 -0
  88. package/dist/integrations/index.js.map +1 -1
  89. package/dist/integrations/plugin.d.ts.map +1 -1
  90. package/dist/integrations/plugin.js +93 -1
  91. package/dist/integrations/plugin.js.map +1 -1
  92. package/dist/integrations/types.d.ts +31 -0
  93. package/dist/integrations/types.d.ts.map +1 -1
  94. package/dist/integrations/types.js.map +1 -1
  95. package/dist/integrations/webhook-handler.js +1 -0
  96. package/dist/integrations/webhook-handler.js.map +1 -1
  97. package/dist/mcp/build-server.d.ts +9 -2
  98. package/dist/mcp/build-server.d.ts.map +1 -1
  99. package/dist/mcp/build-server.js +97 -20
  100. package/dist/mcp/build-server.js.map +1 -1
  101. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  102. package/dist/mcp/builtin-tools.js +5 -2
  103. package/dist/mcp/builtin-tools.js.map +1 -1
  104. package/dist/mcp/external-agent-policy.d.ts +19 -0
  105. package/dist/mcp/external-agent-policy.d.ts.map +1 -0
  106. package/dist/mcp/external-agent-policy.js +2 -0
  107. package/dist/mcp/external-agent-policy.js.map +1 -0
  108. package/dist/mcp/index.d.ts +1 -0
  109. package/dist/mcp/index.d.ts.map +1 -1
  110. package/dist/mcp/index.js.map +1 -1
  111. package/dist/notifications/routes.d.ts +1 -1
  112. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  113. package/dist/server/agent-chat/plugin-options.d.ts +11 -1
  114. package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
  115. package/dist/server/agent-chat/plugin-options.js.map +1 -1
  116. package/dist/server/agent-chat/script-entries.d.ts.map +1 -1
  117. package/dist/server/agent-chat/script-entries.js +16 -2
  118. package/dist/server/agent-chat/script-entries.js.map +1 -1
  119. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  120. package/dist/server/agent-chat-plugin.js +3 -0
  121. package/dist/server/agent-chat-plugin.js.map +1 -1
  122. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
  123. package/docs/content/external-agents.mdx +66 -7
  124. package/docs/content/locales/ar-SA/external-agents.mdx +40 -7
  125. package/docs/content/locales/de-DE/external-agents.mdx +41 -7
  126. package/docs/content/locales/es-ES/external-agents.mdx +41 -7
  127. package/docs/content/locales/fr-FR/external-agents.mdx +41 -7
  128. package/docs/content/locales/hi-IN/external-agents.mdx +40 -7
  129. package/docs/content/locales/ja-JP/external-agents.mdx +40 -7
  130. package/docs/content/locales/ko-KR/external-agents.mdx +40 -7
  131. package/docs/content/locales/pt-BR/external-agents.mdx +41 -7
  132. package/docs/content/locales/zh-CN/external-agents.mdx +39 -7
  133. package/docs/content/locales/zh-TW/external-agents.mdx +39 -7
  134. package/package.json +1 -1
  135. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
package/corpus/README.md CHANGED
@@ -27,5 +27,5 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
27
27
 
28
28
  ## Generated Counts
29
29
 
30
- - core files: 2236
31
- - template files: 5501
30
+ - core files: 2239
31
+ - template files: 5508
@@ -1,5 +1,23 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.98.7
4
+
5
+ ### Patch Changes
6
+
7
+ - b94940e: Keep replay recording recoverable across transient upload failures and tab races, preserve object resources, and prevent late A2A workers from overwriting terminal task states.
8
+
9
+ ## 0.98.6
10
+
11
+ ### Patch Changes
12
+
13
+ - c4bb9ee: Add an opt-in authenticated-read MCP policy that automatically exposes explicitly safe GET actions while keeping external writes behind `ask_app`. Generic SQL stays out of that automatic surface.
14
+
15
+ The `authenticatedReads: "auto"` derivation now also applies a hard, name-based exclusion for generic database (`db-query`/`db-schema`/`db-exec`/`db-patch`), template `seed-*`, extension-management, browser-session, and Context X-Ray actions, so they can never be auto-exposed even if one is mis-annotated with the full authenticated-read flag set — only an explicit `connectorCatalog` entry can expose them.
16
+
17
+ - c4bb9ee: Bound queued and processing A2A task lifetimes, preserve asynchronous dispatch semantics, and fail unrecoverable handoffs deterministically.
18
+ - c4bb9ee: Slack identity lookups no longer cache a failed users.info result for the full 10-minute TTL. Transient Slack API failures now use a short 30-second negative cache, so a brief blip cannot fail-close a sender's identity (and their DMs) for 10 minutes.
19
+ - c4bb9ee: Run verified Slack direct messages with the linked Agent Native user's organization-scoped identity while keeping shared-channel messages service-scoped and rejecting unverified, guest, external, or cross-organization identities.
20
+
3
21
  ## 0.98.5
4
22
 
5
23
  ### Patch Changes
@@ -325,8 +325,9 @@ The MCP server serves a **compact catalog by default to every caller** — hoste
325
325
  </div>
326
326
  </div>
327
327
  <p class="diagram-muted note">
328
- <code>tool-search</code> reaches any full-tier tool on demand &mdash; so the
329
- compact default keeps context small without hiding capability.
328
+ <code>tool-search</code> discovers full-tier tools on demand; the connector
329
+ catalog or authenticated-read policy must still permit execution unless the
330
+ caller explicitly opts into the full tier.
330
331
  </p>
331
332
  ```
332
333
 
@@ -364,15 +365,73 @@ The MCP server serves a **compact catalog by default to every caller** — hoste
364
365
 
365
366
  ### Compact / connector tier (default) {#connector-tier}
366
367
 
367
- By default every connected agent sees a small, curated catalog (~20–30 tools vs. ~105 in the full surface):
368
+ By default every connected agent sees a small, curated catalog (~20–30 tools vs. ~105 in the full surface). Apps can either maintain an explicit `connectorCatalog`, or opt into the authenticated-read policy:
368
369
 
369
370
  - **Template-declared app actions** — the safe app-level allow-list. For Plan that is `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search`, and similar.
370
371
  - **Builtin cross-app tools** — `list_apps`, `open_app`, `ask_app`, `create_embed_session`.
371
- - **`tool-search`** is always present, so anything outside the list stays reachable on demand (see below).
372
+ - **`tool-search`** is always present for discovery. A discovered action still needs to be in the connector catalog, included by the authenticated-read policy, or reached through the explicit full-catalog opt-in before `tools/call` can execute it.
372
373
 
373
- Tools outside the list — for example `db-exec`, `seed-*`, the extension suite, browser-session tools, and context-xray tools — are not advertised, and calls to them are rejected with "Unknown tool" unless the caller has opted into the full catalog. This keeps each connected agent's context window small and removes footguns that are only safe for single-tenant local development. The connector tier is active **whenever a template declares a `connectorCatalog`** — it is not gated behind an environment variable.
374
+ Tools outside the list — for example `db-exec`, `seed-*`, the extension suite, browser-session tools, and context-xray tools — are not advertised, and calls to them are rejected with "Unknown tool" unless the caller has opted into the full catalog. This keeps each connected agent's context window small and removes footguns that are only safe for single-tenant local development.
374
375
 
375
- `tool-search` works two ways: call it with **no query** for the full menu of tool names plus one-line descriptions (cheap, no schemas), or with a query for ranked matches with parameter summaries. That is how a compacted client discovers and loads any full-surface tool when it needs one.
376
+ `tool-search` works two ways: call it with **no query** for the full menu of tool names plus one-line descriptions (cheap, no schemas), or with a query for ranked matches with parameter summaries. It helps a compacted client discover capabilities; use `ask_app` for anything that requires the app agent's broader reasoning or a write.
377
+
378
+ #### Authenticated reads by default
379
+
380
+ Apps that want direct tools to "just work" without maintaining a long allow-list can opt into automatic authenticated reads:
381
+
382
+ ```ts
383
+ export default createAgentChatPlugin({
384
+ appId: "analytics",
385
+ externalAgents: {
386
+ authenticatedReads: "auto",
387
+ writes: "ask_app_only",
388
+ // Optional defense-in-depth veto for especially sensitive reads.
389
+ denyActions: ["get-sensitive-export"],
390
+ },
391
+ });
392
+ ```
393
+
394
+ `authenticatedReads: "auto"` adds only actions that explicitly declare all of the following:
395
+
396
+ - `http: { method: "GET" }`
397
+ - `readOnly: true`
398
+ - `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
399
+
400
+ The policy combines those actions with any explicit `connectorCatalog` entries, then applies `denyActions`. With `writes: "ask_app_only"` (the default when automatic reads are enabled), mutating tools are not directly callable; route multi-step work and mutations through `ask_app`. `writes: "allowlisted"` exists only for apps that intentionally maintain an explicit write allow-list.
401
+
402
+ The policy is authenticated, not anonymous. MCP OAuth/connect identity is still carried through `runWithRequestContext`, so action-level access checks, owner/org scoping, and OAuth read scopes remain in force. Public/unauthenticated actions are not included by automatic reads.
403
+
404
+ Generic core `db-schema` and `db-query` are intentionally **not** automatic external reads. They remain available to the in-app agent through the normal scoped SQL path, but broad schema/SQL access is too powerful to infer from read-only metadata alone. If an app needs direct external querying, expose an app-owned GET action with its own access checks and bounded query contract, or add an explicit app-level table/column allow-list with row, byte, timeout, and audit limits. `db-exec` and `db-patch` remain outside the automatic surface.
405
+
406
+ This is a hard, name-based exclusion, not just a metadata omission: generic database/seed/browser-session/extension/Context X-Ray tools are never auto-exposed even if a future change accidentally annotates one with the full authenticated-read flag set — they always require an explicit `connectorCatalog` entry.
407
+
408
+ #### Identity and authorization
409
+
410
+ Authentication and authorization are separate gates. A verified MCP OAuth or
411
+ connect token identifies the caller and organization; `publicAgent` only opts
412
+ an action into the external protocol surface. It does not grant access to a
413
+ record. Actions must still use the normal `accessFilter`, `resolveAccess`, or
414
+ `assertAccess` helpers, so private documents and dashboards remain private,
415
+ shared resources follow their share/org rules, and cross-organization reads are
416
+ rejected.
417
+
418
+ The default Slack integration follows the same rule. A verified Slack DM is
419
+ matched to an existing Agent Native organization member and persisted as a
420
+ workspace/user identity link before the agent runs, and the resulting user/org
421
+ context loads that user's resources, instructions, and skills. Hydrated
422
+ workspace members whose email is missing or not yet an organization member run
423
+ as an anonymous org-scoped service principal instead — the same
424
+ org-wide-visibility tier shared channels get — with an agent-visible note and
425
+ a one-time Slack heads-up explaining how to gain personal access. Hydration
426
+ failures, guests and external (Slack Connect) members, and workspaces not
427
+ connected to an organization receive a polite decline reply instead of a
428
+ silent drop. Shared Slack channels use a service principal instead of
429
+ borrowing one participant's private permissions. Managed Slack OAuth requests
430
+ the `users:read.email` bot scope, and the generated Slack app manifest
431
+ requests it too. Existing Slack installs must be reconnected/reinstalled to
432
+ grant a newly added scope; legacy bot-token installs must add the scope in
433
+ Slack manually. Without it, DMs run in the anonymous org-scoped tier rather
434
+ than with personal access.
376
435
 
377
436
  ### Full tier (explicit opt-in only) {#full-tier}
378
437
 
@@ -469,7 +528,7 @@ On top of the per-action tools the MCP server exposes a stable verb set, so an e
469
528
 
470
529
  `create_workspace_app` rejects any non-allow-listed template — the public template allow-list in `packages/shared-app-config/templates.ts` is authoritative and CI-guarded; an external agent cannot widen it. A same-named template action overrides a builtin (template-over-core precedence). Disable the whole set with `MCPConfig.builtinCrossAppTools: false`.
471
530
 
472
- The tool and resource catalogs for app hosts are compact by default — see [Catalog tiers](#catalog-tiers). `publicAgent.expose` remains the opt-in for safe read/ingest tools outside that compact catalog; set `mcpApp.compactCatalog: true` only as a rare exception for actions that must appear in chat-host discovery.
531
+ The tool and resource catalogs for app hosts are compact by default — see [Catalog tiers](#catalog-tiers). `publicAgent.expose` remains the action-level opt-in for safe read/ingest tools outside that compact catalog; apps may set `externalAgents.authenticatedReads: "auto"` to advertise those authenticated reads without a hand-written catalog. Set `mcpApp.compactCatalog: true` only as a rare exception for actions that must appear in chat-host discovery.
473
532
 
474
533
  For fast ChatGPT/Claude handoffs, the ideal path is direct: call the action that creates or opens the artifact, then let the MCP App launch the route. A Mail request should call `manage_draft` and render the real compose route. A dashboard request should call `open_app({ path, embed: true })` or a dashboard action with `mcpApp` and render the full Analytics route. Calendar, Forms, Content, Slides, Design, and Clips should follow the same pattern with their draft/create/search actions. `list_apps` is useful when the model must choose among granted apps; broad `resources/list`, full-catalog discovery, or `ask_app` delegation should not be the normal route for an obvious UI handoff.
475
534
 
@@ -324,8 +324,9 @@ https://dispatch.agent-native.com/_agent-native/mcp
324
324
  </div>
325
325
  </div>
326
326
  <p class="diagram-muted note">
327
- <code>tool-search</code> reaches any full-tier tool on demand &mdash; so the
328
- compact default keeps context small without hiding capability.
327
+ يكتشف <code>tool-search</code> أدوات الطبقة الكاملة عند الطلب؛ ويجب أن يسمح
328
+ كتالوج الموصل أو سياسة القراءة المصادق عليها بالتنفيذ، ما لم يشترك المتصل
329
+ صراحةً في الطبقة الكاملة.
329
330
  </p>
330
331
  ```
331
332
 
@@ -363,15 +364,47 @@ https://dispatch.agent-native.com/_agent-native/mcp
363
364
 
364
365
  ### الطبقة المدمجة / الموصل (افتراضي) {#connector-tier}
365
366
 
366
- افتراضيًا، يرى كل وكيل متصل كتالوجًا صغيرًا ومنظمًا (~20–30 أداة مقابل ~105 أدوات في السطح الكامل):
367
+ افتراضيًا، يرى كل وكيل متصل كتالوجًا صغيرًا ومنظمًا (~20–30 أداة مقابل ~105 أدوات في السطح الكامل). يمكن للتطبيقات إما إدارة `connectorCatalog` صريح، أو الاشتراك في سياسة القراءة المصادق عليها:
367
368
 
368
369
  - **التطبيق المُعلن عن القالب actions** — القائمة المسموح بها الآمنة على مستوى التطبيق. بالنسبة للخطة `create-visual-plan`، و`get-visual-plan`، و`share-resource`، و`navigate`، و`tool-search`، وما شابه ذلك.
369
370
  - **إنشاء أدوات مشتركة بين التطبيقات** — `list_apps`، `open_app`، `ask_app`، `create_embed_session`.
370
- - **`tool-search`** موجود دائمًا، لذلك يظل أي شيء خارج القائمة قابلاً للوصول عند الطلب (انظر أدناه).
371
+ - **`tool-search`** موجود دائمًا للاكتشاف. لا يزال الإجراء المكتشف بحاجة إلى أن يكون في كتالوج الموصل، أو مشمولًا بسياسة القراءة المصادق عليها، أو متاحًا عبر الاشتراك الصريح في الكتالوج الكامل قبل أن يتمكن `tools/call` من تنفيذه.
371
372
 
372
- لا يتم الإعلان عن الأدوات الموجودة خارج القائمة — على سبيل المثال `db-exec`، و`seed-*`، ومجموعة الامتدادات، وأدوات جلسة المتصفح، وأدوات سياق الأشعة السينية —، ويتم رفض الاستدعاءات إليها باستخدام "أداة غير معروفة" ما لم يشترك المتصل في الكتالوج الكامل. يؤدي هذا إلى إبقاء نافذة سياق كل وكيل متصل صغيرة وإزالة الأدوات الآمنة فقط للتطوير المحلي للمستأجر الواحد. تكون طبقة الموصل نشطة **عندما يعلن القالب عن `connectorCatalog`** — فهو ليس محاطًا بمتغير بيئة.
373
+ لا يتم الإعلان عن الأدوات الموجودة خارج القائمة — على سبيل المثال `db-exec`، و`seed-*`، ومجموعة الامتدادات، وأدوات جلسة المتصفح، وأدوات سياق الأشعة السينية —، ويتم رفض الاستدعاءات إليها باستخدام "أداة غير معروفة" ما لم يشترك المتصل في الكتالوج الكامل. يؤدي هذا إلى إبقاء نافذة سياق كل وكيل متصل صغيرة وإزالة الأدوات الآمنة فقط للتطوير المحلي للمستأجر الواحد.
373
374
 
374
- يعمل `tool-search` بطريقتين: يمكنك استدعاؤه باستخدام **بدون استعلام** للقائمة الكاملة لأسماء الأدوات بالإضافة إلى أوصاف من سطر واحد (رخيص، بدون مخططات)، أو باستخدام استعلام للمطابقات المرتبة مع ملخصات المعلمات. هذه هي الطريقة التي يكتشف بها العميل المضغوط أي أداة ذات سطح كامل ويحملها عندما يحتاج إليها.
375
+ يعمل `tool-search` بطريقتين: يمكنك استدعاؤه باستخدام **بدون استعلام** للقائمة الكاملة لأسماء الأدوات بالإضافة إلى أوصاف من سطر واحد (رخيص، بدون مخططات)، أو باستخدام استعلام للمطابقات المرتبة مع ملخصات المعلمات. يساعد العميل المضغوط على اكتشاف الإمكانات؛ استخدم `ask_app` لأي شيء يتطلب استدلال وكيل التطبيق الأوسع أو عملية كتابة.
376
+
377
+ #### عمليات القراءة المصادق عليها افتراضيًا
378
+
379
+ يمكن للتطبيقات التي تريد أن تعمل أدوات القراءة المباشرة دون إدارة قائمة سماح طويلة الاشتراك في عمليات القراءة المصادق عليها تلقائيًا:
380
+
381
+ ```ts
382
+ export default createAgentChatPlugin({
383
+ appId: "analytics",
384
+ externalAgents: {
385
+ authenticatedReads: "auto",
386
+ writes: "ask_app_only",
387
+ // حظر اختياري للدفاع المتعمق عن عمليات القراءة شديدة الحساسية.
388
+ denyActions: ["get-sensitive-export"],
389
+ },
390
+ });
391
+ ```
392
+
393
+ يضيف `authenticatedReads: "auto"` فقط الإجراءات التي تعلن صراحةً كل ما يلي:
394
+
395
+ - `http: { method: "GET" }`
396
+ - `readOnly: true`
397
+ - `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
398
+
399
+ تجمع السياسة هذه الإجراءات مع أي إدخالات صريحة في `connectorCatalog`، ثم تطبق `denyActions`. مع `writes: "ask_app_only"` (الإعداد الافتراضي عند تمكين القراءة التلقائية)، لا يمكن استدعاء أدوات التغيير مباشرةً؛ وجّه العمل متعدد الخطوات وعمليات التغيير عبر `ask_app`. لا تستخدم `writes: "allowlisted"` إلا للتطبيقات التي تدير عمدًا قائمة سماح صريحة للكتابة.
400
+
401
+ هذه السياسة مصادق عليها وليست مجهولة. تستمر هوية MCP OAuth/connect عبر `runWithRequestContext`، لذلك تظل فحوصات الوصول على مستوى الإجراء ونطاق المالك/المؤسسة ونطاقات قراءة OAuth سارية. لا تتضمن القراءة التلقائية الإجراءات العامة أو غير المصادق عليها.
402
+
403
+ لا يتم تضمين `db-schema` و`db-query` الأساسيين تلقائيًا في القراءات الخارجية. يظلان متاحين لوكيل التطبيق داخل التطبيق عبر مسار SQL المقيّد المعتاد، لكن الوصول العام إلى المخطط وSQL واسع جدًا لاستنتاجه من بيانات القراءة فقط. إذا احتاج التطبيق إلى استعلام خارجي مباشر، فعليه إضافة action مملوك للتطبيق بحدود وصول واضحة أو قائمة سماح صريحة للجداول والأعمدة مع حدود للصفوف والبايت والمهلة والتدقيق. يبقى `db-exec` و`db-patch` خارج السطح التلقائي.
404
+
405
+ هذا استبعاد صارم يعتمد على الاسم، وليس مجرد إغفال في البيانات الوصفية: أدوات قاعدة البيانات وseed وجلسة المتصفح والامتدادات وسياق الأشعة السينية العامة لا يُكشف عنها تلقائيًا أبدًا، حتى لو وسم تغيير مستقبلي إحداها عن طريق الخطأ بمجموعة أعلام القراءة المصادق عليها الكاملة — فهي تتطلب دائمًا إدخالًا صريحًا في `connectorCatalog`.
406
+
407
+ تطابق رسائل Slack الخاصة التي تم التحقق منها عضوًا موجودًا في مؤسسة Agent Native، وتحفظ رابط هوية مساحة العمل/المستخدم قبل تشغيل الوكيل؛ ثم يحمّل سياق المستخدم/المؤسسة الناتج موارد ذلك المستخدم وتعليماته ومهاراته. أما أعضاء مساحة العمل الذين نجحت عملية جلب بياناتهم لكن بريدهم الإلكتروني مفقود أو لم ينضموا بعد إلى المؤسسة، فيعملون بهوية خدمة مجهولة ضمن نطاق المؤسسة — وهي طبقة الرؤية نفسها على مستوى المؤسسة التي تستخدمها القنوات المشتركة — مع ملاحظة يراها الوكيل وتنبيه لمرة واحدة في Slack يشرح كيفية الحصول على وصول شخصي. تتلقى حالات فشل جلب البيانات والضيوف والأعضاء الخارجيون (Slack Connect) ومساحات العمل غير المرتبطة بمؤسسة ردًا مهذبًا بالرفض بدل إسقاط الرسالة بصمت. تستخدم قنوات Slack المشتركة هوية خدمة ولا تستعير الأذونات الخاصة لأي مشارك. يطلب OAuth المُدار والنموذج المُنشأ لتطبيق Slack نطاق البوت `users:read.email`. يجب إعادة ربط/تثبيت عمليات التثبيت الحالية لمنح نطاق أُضيف حديثًا، بينما يجب أن تضيف عمليات التثبيت القديمة التي تستخدم رمز بوت النطاق يدويًا في Slack. من دونه، تعمل الرسائل الخاصة ضمن الطبقة المجهولة ذات نطاق المؤسسة بدل الوصول الشخصي.
375
408
 
376
409
  ### الطبقة الكاملة (الاشتراك الصريح فقط) {#full-tier}
377
410
 
@@ -473,7 +506,7 @@ Claude Code calls: manage-draft(to: "john@example.com", subject: "Q3 Report", bo
473
506
 
474
507
  يرفض `create_workspace_app` أي قالب غير مدرج في القائمة المسموح بها - القائمة المسموح بها للقالب العام في `packages/shared-app-config/templates.ts` موثوقة ومحمية بواسطة CI؛ ولا يمكن لعامل خارجي توسيعه. يتجاوز إجراء القالب الذي يحمل نفس الاسم الإجراء المدمج (أسبقية القالب على المركز الأساسي). قم بتعطيل المجموعة بأكملها باستخدام `MCPConfig.builtinCrossAppTools: false`.
475
508
 
476
- يتم ضغط كتالوجات الأدوات والموارد لمضيفي التطبيقات بشكل افتراضي - راجع [Catalog tiers](#catalog-tiers). يظل `publicAgent.expose` خيار الاشتراك في أدوات القراءة/التناول الآمن خارج هذا الكتالوج المدمج؛ قم بتعيين `mcpApp.compactCatalog: true` فقط كاستثناء نادر لـ actions والذي يجب أن يظهر في اكتشاف مضيف الدردشة.
509
+ يتم ضغط كتالوجات الأدوات والموارد لمضيفي التطبيقات بشكل افتراضي - راجع [Catalog tiers](#catalog-tiers). يظل `publicAgent.expose` خيار الاشتراك على مستوى الإجراء لأدوات القراءة/التناول الآمن خارج هذا الكتالوج المدمج؛ ويمكن للتطبيقات تعيين `externalAgents.authenticatedReads: "auto"` للإعلان عن عمليات القراءة المصادق عليها دون كتالوج مكتوب يدويًا. قم بتعيين `mcpApp.compactCatalog: true` فقط كاستثناء نادر لـ actions التي يجب أن تظهر في اكتشاف مضيف الدردشة.
477
510
 
478
511
  بالنسبة لعمليات التسليم السريعة لـ ChatGPT/Claude، يكون المسار المثالي مباشرًا: اتصل بالإجراء الذي ينشئ القطعة الأثرية أو يفتحها، ثم اسمح لتطبيق MCP بتشغيل المسار. يجب أن يستدعي طلب البريد `manage_draft` ويقدم مسار الإنشاء الحقيقي. يجب أن يستدعي طلب لوحة المعلومات `open_app({ path, embed: true })` أو إجراء لوحة المعلومات باستخدام `mcpApp` ويقدم مسار Analytics الكامل. يجب أن يتبع التقويم والنماذج والمحتوى والشرائح والتصميم والمقاطع نفس النمط مع المسودة/الإنشاء/البحث في actions. يكون `list_apps` مفيدًا عندما يتعين على النموذج الاختيار من بين التطبيقات الممنوحة؛ لا ينبغي أن يكون `resources/list` واسع النطاق، أو اكتشاف الكتالوج الكامل، أو تفويض `ask_app` هو المسار الطبيعي لعملية تسليم UI الواضحة.
479
512
 
@@ -325,8 +325,10 @@ Der MCP-Server stellt jedem Aufrufer standardmäßig einen kompakten Katalog ber
325
325
  </div>
326
326
  </div>
327
327
  <p class="diagram-muted note">
328
- <code>tool-search</code> reaches any full-tier tool on demand &mdash; so the
329
- compact default keeps context small without hiding capability.
328
+ <code>tool-search</code> entdeckt Tools der vollständigen Stufe bei Bedarf;
329
+ der Connector-Katalog oder die Richtlinie für authentifizierte Lesezugriffe
330
+ muss die Ausführung weiterhin erlauben, sofern der Aufrufer nicht ausdrücklich
331
+ die vollständige Stufe gewählt hat.
330
332
  </p>
331
333
  ```
332
334
 
@@ -364,15 +366,47 @@ Der MCP-Server stellt jedem Aufrufer standardmäßig einen kompakten Katalog ber
364
366
 
365
367
  ### Kompakt-/Connector-Stufe (Standard) {#connector-tier}
366
368
 
367
- Standardmäßig sieht jeder verbundene Agent einen kleinen, kuratierten Katalog (ca. 20–30 Tools gegenüber ca. 105 in der gesamten Oberfläche):
369
+ Standardmäßig sieht jeder verbundene Agent einen kleinen, kuratierten Katalog (ca. 20–30 Tools gegenüber ca. 105 in der gesamten Oberfläche). Apps können entweder einen expliziten `connectorCatalog` pflegen oder die Richtlinie für authentifizierte Lesezugriffe aktivieren:
368
370
 
369
371
  - **Von der Vorlage deklarierte App actions** – die sichere Zulassungsliste auf App-Ebene. Für den Plan sind das `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search` und ähnliche.
370
372
  - **Integrierte App-übergreifende Tools** – `list_apps`, `open_app`, `ask_app`, `create_embed_session`.
371
- - **`tool-search`** ist immer vorhanden, sodass alles außerhalb der Liste bei Bedarf erreichbar bleibt (siehe unten).
373
+ - **`tool-search`** ist für die Erkennung immer vorhanden. Eine gefundene Action muss weiterhin im Connector-Katalog stehen, von der Richtlinie für authentifizierte Lesezugriffe erfasst oder über das explizite Opt-in für den vollständigen Katalog aktiviert sein, bevor `tools/call` sie ausführen kann.
372
374
 
373
- Tools außerhalb der Liste – zum Beispiel `db-exec`, `seed-*`, die Erweiterungssuite, Browser-Sitzungstools und Kontext-Röntgentools – werden nicht angekündigt und Aufrufe an sie werden mit „Unbekanntes Tool“ abgelehnt, es sei denn, der Aufrufer hat sich für den vollständigen Katalog entschieden. Dies hält das Kontextfenster jedes verbundenen Agenten klein und entfernt Fußfeuerwaffen, die nur für die lokale Entwicklung mit einem Mandanten sicher sind. Die Connector-Ebene ist aktiv, **immer wenn eine Vorlage ein `connectorCatalog` deklariert** – sie ist nicht hinter einer Umgebungsvariablen geschützt.
375
+ Tools außerhalb der Liste – zum Beispiel `db-exec`, `seed-*`, die Erweiterungssuite, Browser-Sitzungstools und Kontext-Röntgentools – werden nicht angekündigt und Aufrufe an sie werden mit „Unbekanntes Tool“ abgelehnt, es sei denn, der Aufrufer hat sich für den vollständigen Katalog entschieden. Dies hält das Kontextfenster jedes verbundenen Agenten klein und entfernt Fußfeuerwaffen, die nur für die lokale Entwicklung mit einem Mandanten sicher sind.
374
376
 
375
- `tool-search` funktioniert auf zwei Arten: Aufruf mit **keine Abfrage** für das vollständige Menü der Werkzeugnamen plus einzeilige Beschreibungen (günstig, keine Schemata) oder mit einer Abfrage für Rangfolgeübereinstimmungen mit Parameterzusammenfassungen. Auf diese Weise erkennt und lädt ein kompakter Client jedes vollflächige Werkzeug, wenn er eines benötigt.
377
+ `tool-search` funktioniert auf zwei Arten: Aufruf mit **keiner Abfrage** für das vollständige Menü der Tool-Namen plus einzeilige Beschreibungen (günstig, keine Schemata) oder mit einer Abfrage für sortierte Treffer mit Parameterzusammenfassungen. Es hilft kompakten Clients, Funktionen zu entdecken; verwenden Sie `ask_app` für Aufgaben, die das umfassendere Schlussfolgern des App-Agenten oder einen Schreibvorgang benötigen.
378
+
379
+ #### Authentifizierte Lesezugriffe als Standard
380
+
381
+ Apps, deren direkte Lesetools ohne lange Zulassungsliste funktionieren sollen, können automatische authentifizierte Lesezugriffe aktivieren:
382
+
383
+ ```ts
384
+ export default createAgentChatPlugin({
385
+ appId: "analytics",
386
+ externalAgents: {
387
+ authenticatedReads: "auto",
388
+ writes: "ask_app_only",
389
+ // Optionale zusätzliche Sperre für besonders sensible Lesezugriffe.
390
+ denyActions: ["get-sensitive-export"],
391
+ },
392
+ });
393
+ ```
394
+
395
+ `authenticatedReads: "auto"` fügt nur Actions hinzu, die ausdrücklich alle folgenden Merkmale deklarieren:
396
+
397
+ - `http: { method: "GET" }`
398
+ - `readOnly: true`
399
+ - `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
400
+
401
+ Die Richtlinie kombiniert diese Actions mit expliziten `connectorCatalog`-Einträgen und wendet anschließend `denyActions` an. Mit `writes: "ask_app_only"` (dem Standard bei aktivierten automatischen Lesezugriffen) sind mutierende Tools nicht direkt aufrufbar; leiten Sie mehrstufige Arbeit und Mutationen über `ask_app`. `writes: "allowlisted"` ist nur für Apps vorgesehen, die bewusst eine explizite Schreib-Zulassungsliste pflegen.
402
+
403
+ Die Richtlinie ist authentifiziert, nicht anonym. Die MCP-OAuth-/Connect-Identität wird über `runWithRequestContext` weitergegeben, sodass Action-Zugriffsprüfungen, Eigentümer-/Organisationsbereiche und OAuth-Leseberechtigungen wirksam bleiben. Öffentliche oder nicht authentifizierte Actions werden nicht automatisch aufgenommen.
404
+
405
+ Core-`db-schema` und `db-query` werden nicht automatisch als externe Lesezugriffe veröffentlicht. Sie bleiben für den internen App-Agenten über den normalen, abgegrenzten SQL-Pfad verfügbar, aber ein breiter Schema-/SQL-Zugriff ist zu mächtig, um ihn allein aus Read-only-Metadaten abzuleiten. Benötigt eine App direkte externe Abfragen, muss sie eine eigene GET-Action mit Zugriffsprüfungen und festen Grenzen oder eine explizite Tabellen-/Spalten-Allowlist mit Zeilen-, Byte-, Zeit- und Audit-Limits bereitstellen. `db-exec` und `db-patch` bleiben außerhalb der automatischen Oberfläche.
406
+
407
+ Dies ist ein harter, namensbasierter Ausschluss und keine bloße Auslassung in den Metadaten: generische Datenbank-, Seed-, Browser-Sitzungs-, Erweiterungs- und Kontext-Röntgen-Tools werden niemals automatisch freigegeben, selbst wenn eine zukünftige Änderung eines davon versehentlich mit dem vollständigen Satz an Flags für authentifizierte Lesezugriffe versieht — sie benötigen immer einen expliziten `connectorCatalog`-Eintrag.
408
+
409
+ Eine verifizierte Slack-DM wird vor dem Start des Agenten einem bestehenden Mitglied der Agent-Native-Organisation zugeordnet und als Identitätsverknüpfung zwischen Workspace und Benutzer gespeichert. Der daraus entstehende Benutzer-/Organisationskontext lädt die Ressourcen, Anweisungen und Skills dieses Benutzers. Erfolgreich geladene Workspace-Mitglieder, deren E-Mail-Adresse fehlt oder die noch kein Organisationsmitglied sind, werden stattdessen als anonymer, auf die Organisation begrenzter Service-Principal ausgeführt — mit derselben organisationsweiten Sichtbarkeit wie gemeinsame Kanäle. Der Agent erhält dazu einen sichtbaren Hinweis, und Slack erklärt einmalig, wie persönlicher Zugriff erlangt werden kann. Bei fehlgeschlagener Profilladung, Gästen und externen Mitgliedern (Slack Connect) sowie Workspaces ohne Organisationsverknüpfung wird höflich abgelehnt, statt die Nachricht stillschweigend zu verwerfen. Gemeinsame Slack-Kanäle verwenden einen Service-Principal und übernehmen keine privaten Berechtigungen eines Teilnehmers. Managed OAuth und das generierte Slack-App-Manifest fordern den Bot-Scope `users:read.email`. Bestehende Installationen müssen erneut verbunden/installiert werden, um einen neu hinzugefügten Scope zu gewähren; ältere Bot-Token-Installationen müssen ihn in Slack manuell hinzufügen. Ohne diesen Scope werden DMs in der anonymen, organisationsbegrenzten Stufe statt mit persönlichem Zugriff ausgeführt.
376
410
 
377
411
  ### Vollständige Stufe (nur explizites Opt-in) {#full-tier}
378
412
 
@@ -474,7 +508,7 @@ Zusätzlich zu den Tools pro Aktion stellt der MCP-Server einen stabilen Verbsat
474
508
 
475
509
  `create_workspace_app` lehnt alle nicht auf der Zulassungsliste aufgeführten Vorlagen ab – die öffentliche Zulassungsliste für Vorlagen in `packages/shared-app-config/templates.ts` ist maßgeblich und CI-geschützt; ein externer Agent kann es nicht erweitern. Eine gleichnamige Vorlagenaktion überschreibt eine integrierte Aktion (Vorrang der Vorlage vor dem Kern). Deaktivieren Sie das gesamte Set mit `MCPConfig.builtinCrossAppTools: false`.
476
510
 
477
- Die Tool- und Ressourcenkataloge für App-Hosts sind standardmäßig kompakt – siehe [Catalog tiers](#catalog-tiers). `publicAgent.expose` bleibt die Option für sichere Lese-/Ingest-Tools außerhalb dieses kompakten Katalogs; Legen Sie `mcpApp.compactCatalog: true` nur als seltene Ausnahme für actions fest, das in der Chat-Host-Erkennung erscheinen muss.
511
+ Die Tool- und Ressourcenkataloge für App-Hosts sind standardmäßig kompakt – siehe [Catalog tiers](#catalog-tiers). `publicAgent.expose` bleibt das Opt-in auf Action-Ebene für sichere Lese-/Ingest-Tools außerhalb dieses kompakten Katalogs; Apps können mit `externalAgents.authenticatedReads: "auto"` solche authentifizierten Lesezugriffe ohne handgeschriebenen Katalog veröffentlichen. Legen Sie `mcpApp.compactCatalog: true` nur als seltene Ausnahme für Actions fest, die in der Chat-Host-Erkennung erscheinen müssen.
478
512
 
479
513
  Für schnelle ChatGPT/Claude-Übergaben ist der ideale Pfad direkt: Rufen Sie die Aktion auf, die das Artefakt erstellt oder öffnet, und lassen Sie dann die MCP-App die Route starten. Eine Mail-Anfrage sollte `manage_draft` aufrufen und die tatsächliche Verfassen-Route rendern. Eine Dashboard-Anfrage sollte `open_app({ path, embed: true })` oder eine Dashboard-Aktion mit `mcpApp` aufrufen und die vollständige Analytics-Route rendern. Kalender, Formulare, Inhalte, Folien, Design und Clips sollten beim Entwerfen/Erstellen/Suchen dem gleichen Muster folgen actions. `list_apps` ist nützlich, wenn das Modell zwischen verfügbaren Apps wählen muss; Breites `resources/list`, vollständige Katalogerkennung oder `ask_app`-Delegierung sollten nicht der normale Weg für eine offensichtliche UI-Übergabe sein.
480
514
 
@@ -325,8 +325,10 @@ El servidor MCP ofrece un **catálogo compacto de forma predeterminada para cada
325
325
  </div>
326
326
  </div>
327
327
  <p class="diagram-muted note">
328
- <code>tool-search</code> reaches any full-tier tool on demand &mdash; so the
329
- compact default keeps context small without hiding capability.
328
+ <code>tool-search</code> descubre herramientas del nivel completo bajo
329
+ demanda; el catálogo del conector o la política de lecturas autenticadas
330
+ todavía debe permitir la ejecución, salvo que el cliente opte explícitamente
331
+ por el nivel completo.
330
332
  </p>
331
333
  ```
332
334
 
@@ -364,15 +366,47 @@ El servidor MCP ofrece un **catálogo compacto de forma predeterminada para cada
364
366
 
365
367
  ### Nivel compacto/conector (predeterminado) {#connector-tier}
366
368
 
367
- De forma predeterminada, cada agente conectado ve un catálogo pequeño y seleccionado (entre 20 y 30 herramientas frente a 105 en la superficie completa):
369
+ De forma predeterminada, cada agente conectado ve un catálogo pequeño y seleccionado (entre 20 y 30 herramientas frente a 105 en la superficie completa). Las aplicaciones pueden mantener un `connectorCatalog` explícito u optar por la política de lecturas autenticadas:
368
370
 
369
371
  - **Aplicación declarada por plantilla actions**: la lista de aplicaciones seguras permitidas a nivel. Para Plan que es `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search` y similares.
370
372
  - **Herramientas integradas entre aplicaciones**: `list_apps`, `open_app`, `ask_app`, `create_embed_session`.
371
- - **`tool-search`** siempre está presente, por lo que todo lo que esté fuera de la lista permanece accesible bajo demanda (ver más abajo).
373
+ - **`tool-search`** siempre está presente para el descubrimiento. Una action descubierta aún debe estar en el catálogo del conector, incluida por la política de lecturas autenticadas o habilitada mediante la opción explícita de catálogo completo antes de que `tools/call` pueda ejecutarla.
372
374
 
373
- Las herramientas fuera de la lista (por ejemplo, `db-exec`, `seed-*`, el conjunto de extensiones, las herramientas de sesión del navegador y las herramientas de rayos X de contexto) no se anuncian y las llamadas a ellas se rechazan con "Herramienta desconocida" a menos que la persona que llama haya optado por el catálogo completo. Esto mantiene pequeña la ventana de contexto de cada agente conectado y elimina las barreras que solo son seguras para el desarrollo local de un solo inquilino. El nivel del conector está activo **siempre que una plantilla declara un `connectorCatalog`**; no está cerrado detrás de una variable de entorno.
375
+ Las herramientas fuera de la lista (por ejemplo, `db-exec`, `seed-*`, el conjunto de extensiones, las herramientas de sesión del navegador y las herramientas de rayos X de contexto) no se anuncian y las llamadas a ellas se rechazan con "Herramienta desconocida" a menos que la persona que llama haya optado por el catálogo completo. Esto mantiene pequeña la ventana de contexto de cada agente conectado y elimina las barreras que solo son seguras para el desarrollo local de un solo inquilino.
374
376
 
375
- `tool-search` funciona de dos maneras: llámelo con **sin consulta** para ver el menú completo de nombres de herramientas más descripciones de una línea (barato, sin esquemas), o con una consulta para coincidencias clasificadas con resúmenes de parámetros. Así es como un cliente compactado descubre y carga cualquier herramienta de superficie completa cuando la necesita.
377
+ `tool-search` funciona de dos maneras: llámelo **sin consulta** para ver el menú completo de nombres de herramientas más descripciones de una línea (barato, sin esquemas), o con una consulta para obtener coincidencias clasificadas con resúmenes de parámetros. Ayuda a un cliente compacto a descubrir capacidades; use `ask_app` para cualquier tarea que requiera el razonamiento más amplio del agente de la aplicación o una escritura.
378
+
379
+ #### Lecturas autenticadas de forma predeterminada
380
+
381
+ Las aplicaciones que quieran que las herramientas de lectura directas funcionen sin mantener una lista larga pueden optar por lecturas autenticadas automáticas:
382
+
383
+ ```ts
384
+ export default createAgentChatPlugin({
385
+ appId: "analytics",
386
+ externalAgents: {
387
+ authenticatedReads: "auto",
388
+ writes: "ask_app_only",
389
+ // Veto opcional de defensa en profundidad para lecturas especialmente sensibles.
390
+ denyActions: ["get-sensitive-export"],
391
+ },
392
+ });
393
+ ```
394
+
395
+ `authenticatedReads: "auto"` añade solo las actions que declaran explícitamente todo lo siguiente:
396
+
397
+ - `http: { method: "GET" }`
398
+ - `readOnly: true`
399
+ - `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
400
+
401
+ La política combina esas actions con las entradas explícitas de `connectorCatalog` y luego aplica `denyActions`. Con `writes: "ask_app_only"` (el valor predeterminado al habilitar lecturas automáticas), las herramientas que mutan datos no pueden invocarse directamente; dirija el trabajo de varios pasos y las mutaciones mediante `ask_app`. `writes: "allowlisted"` existe solo para aplicaciones que mantienen intencionadamente una lista explícita de escrituras.
402
+
403
+ La política es autenticada, no anónima. La identidad de MCP OAuth/connect se conserva mediante `runWithRequestContext`, por lo que siguen vigentes las comprobaciones de acceso de cada action, el ámbito de propietario/organización y los ámbitos de lectura de OAuth. Las actions públicas o no autenticadas no se incluyen automáticamente.
404
+
405
+ `db-schema` y `db-query` de Core no se exponen automáticamente como lecturas externas. Siguen disponibles para el agente interno de la aplicación mediante el flujo SQL con ámbito habitual, pero el acceso amplio al esquema/SQL es demasiado potente para inferirlo solo de metadatos de lectura. Si una aplicación necesita consultas externas directas, debe exponer una action GET propia con controles y límites de acceso, o una lista explícita de tablas/columnas con límites de filas, bytes, tiempo y auditoría. `db-exec` y `db-patch` quedan fuera de la superficie automática.
406
+
407
+ Se trata de una exclusión estricta basada en el nombre, no solo de una omisión de metadatos: las herramientas genéricas de base de datos, seed, sesión del navegador, extensiones y rayos X de contexto nunca se exponen automáticamente, aunque un cambio futuro anote alguna de ellas por error con el conjunto completo de indicadores de lectura autenticada — siempre requieren una entrada explícita en `connectorCatalog`.
408
+
409
+ Antes de ejecutar el agente, un mensaje directo verificado de Slack se asocia a un miembro existente de la organización de Agent Native y se guarda el vínculo de identidad entre el espacio de trabajo y el usuario. El contexto resultante del usuario y la organización carga los recursos, las instrucciones y las habilidades de ese usuario. Los miembros del espacio de trabajo cuyo perfil se ha obtenido correctamente, pero que no tienen correo electrónico o aún no pertenecen a la organización, se ejecutan como un principal de servicio anónimo limitado a la organización: el mismo nivel de visibilidad para toda la organización que usan los canales compartidos. El agente recibe una nota visible y Slack muestra una sola vez cómo obtener acceso personal. Si falla la obtención del perfil, si se trata de invitados o miembros externos (Slack Connect), o si el espacio de trabajo no está conectado a una organización, se envía una respuesta cortés de rechazo en vez de descartar el mensaje en silencio. Los canales compartidos de Slack usan un principal de servicio y no heredan los permisos privados de ningún participante. OAuth administrado y el manifiesto generado de la aplicación de Slack solicitan el ámbito de bot `users:read.email`. Las instalaciones existentes deben volver a conectarse o instalarse para conceder un ámbito recién añadido; las instalaciones antiguas con token de bot deben añadirlo manualmente en Slack. Sin él, los mensajes directos se ejecutan en el nivel anónimo limitado a la organización, no con acceso personal.
376
410
 
377
411
  ### Nivel completo (solo suscripción explícita) {#full-tier}
378
412
 
@@ -474,7 +508,7 @@ Además de las herramientas por acción, el servidor MCP expone un conjunto de v
474
508
 
475
509
  `create_workspace_app` rechaza cualquier plantilla no incluida en la lista de permitidos: la lista de plantillas públicas permitidas en `packages/shared-app-config/templates.ts` tiene autoridad y está protegida por CI; un agente externo no puede ampliarlo. Una acción de plantilla con el mismo nombre anula una acción incorporada (precedencia de plantilla sobre núcleo). Desactive todo el conjunto con `MCPConfig.builtinCrossAppTools: false`.
476
510
 
477
- Los catálogos de herramientas y recursos para hosts de aplicaciones son compactos de forma predeterminada; consulte [Catalog tiers](#catalog-tiers). `publicAgent.expose` sigue siendo la opción para herramientas de lectura/ingesta seguras fuera de ese catálogo compacto; configure `mcpApp.compactCatalog: true` solo como una rara excepción para actions que debe aparecer en el descubrimiento de host de chat.
511
+ Los catálogos de herramientas y recursos para hosts de aplicaciones son compactos de forma predeterminada; consulte [Catalog tiers](#catalog-tiers). `publicAgent.expose` sigue siendo la opción a nivel de action para herramientas de lectura/ingesta seguras fuera de ese catálogo compacto; las aplicaciones pueden configurar `externalAgents.authenticatedReads: "auto"` para anunciar esas lecturas autenticadas sin un catálogo escrito a mano. Configure `mcpApp.compactCatalog: true` solo como una rara excepción para actions que deban aparecer en el descubrimiento del host de chat.
478
512
 
479
513
  Para transferencias rápidas de ChatGPT/Claude, la ruta ideal es directa: llame a la acción que crea o abre el artefacto, luego deje que la aplicación MCP inicie la ruta. Una solicitud de correo debe llamar a `manage_draft` y representar la ruta de redacción real. Una solicitud de panel debe llamar a `open_app({ path, embed: true })` o una acción de panel con `mcpApp` y representar la ruta de análisis completa. Calendario, formularios, contenido, diapositivas, diseño y clips deben seguir el mismo patrón con su borrador/creación/búsqueda actions. `list_apps` es útil cuando el modelo debe elegir entre las aplicaciones otorgadas; `resources/list` amplio, descubrimiento de catálogo completo o delegación de `ask_app` no deberían ser la ruta normal para una transferencia obvia de UI.
480
514
 
@@ -325,8 +325,10 @@ Le serveur MCP propose par défaut un **catalogue compact à chaque appelant** 
325
325
  </div>
326
326
  </div>
327
327
  <p class="diagram-muted note">
328
- <code>tool-search</code> reaches any full-tier tool on demand &mdash; so the
329
- compact default keeps context small without hiding capability.
328
+ <code>tool-search</code> découvre les outils du niveau complet à la demande ;
329
+ le catalogue du connecteur ou la politique de lectures authentifiées doit
330
+ encore autoriser l'exécution, sauf si l'appelant choisit explicitement le
331
+ niveau complet.
330
332
  </p>
331
333
  ```
332
334
 
@@ -364,15 +366,47 @@ Le serveur MCP propose par défaut un **catalogue compact à chaque appelant** 
364
366
 
365
367
  ### Niveau Compact/Connecteur (par défaut) {#connector-tier}
366
368
 
367
- Par défaut, chaque agent connecté voit un petit catalogue organisé (environ 20 à 30 outils contre environ 105 dans la surface complète) :
369
+ Par défaut, chaque agent connecté voit un petit catalogue organisé (environ 20 à 30 outils contre environ 105 dans la surface complète). Les applications peuvent maintenir un `connectorCatalog` explicite ou choisir la politique de lectures authentifiées :
368
370
 
369
371
  - **Application déclarée par modèle actions** — la liste verte sécurisée au niveau de l'application. Pour les plans `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search` et similaires.
370
372
  - **Outils multi-applications intégrés** : `list_apps`, `open_app`, `ask_app`, `create_embed_session`.
371
- - **`tool-search`** est toujours présent, donc tout ce qui se trouve en dehors de la liste reste accessible à la demande (voir ci-dessous).
373
+ - **`tool-search`** est toujours présent pour la découverte. Une action découverte doit encore figurer dans le catalogue du connecteur, être incluse par la politique de lectures authentifiées ou être activée par l'option explicite de catalogue complet avant que `tools/call` puisse l'exécuter.
372
374
 
373
- Les outils en dehors de la liste (par exemple `db-exec`, `seed-*`, la suite d'extensions, les outils de session de navigateur et les outils de radiographie contextuelle) ne sont pas annoncés et les appels vers ces outils sont rejetés avec « Outil inconnu », sauf si l'appelant a choisi d'accéder au catalogue complet. Cela permet de garder la fenêtre contextuelle de chaque agent connecté petite et de supprimer les armes à pied qui ne sont sûres que pour le développement local à locataire unique. Le niveau de connecteur est actif **chaque fois qu'un modèle déclare un `connectorCatalog`** — il n'est pas protégé par une variable d'environnement.
375
+ Les outils en dehors de la liste (par exemple `db-exec`, `seed-*`, la suite d'extensions, les outils de session de navigateur et les outils de radiographie contextuelle) ne sont pas annoncés et les appels vers ces outils sont rejetés avec « Outil inconnu », sauf si l'appelant a choisi d'accéder au catalogue complet. Cela permet de garder la fenêtre contextuelle de chaque agent connecté petite et de supprimer les armes à pied qui ne sont sûres que pour le développement local à locataire unique.
374
376
 
375
- `tool-search` fonctionne de deux manières : appelez-le avec **aucune requête** pour le menu complet des noms d'outils ainsi que des descriptions sur une ligne (bon marché, sans schémas), ou avec une requête pour les correspondances classées avec des résumés de paramètres. C'est ainsi qu'un client compact découvre et charge n'importe quel outil pleine surface lorsqu'il en a besoin.
377
+ `tool-search` fonctionne de deux manières : appelez-le **sans requête** pour obtenir le menu complet des noms d'outils et des descriptions sur une ligne (peu coûteux, sans schémas), ou avec une requête pour obtenir des correspondances classées et des résumés de paramètres. Il aide un client compact à découvrir les capacités ; utilisez `ask_app` pour tout ce qui nécessite le raisonnement plus large de l'agent de l'application ou une écriture.
378
+
379
+ #### Lectures authentifiées par défaut
380
+
381
+ Les applications qui souhaitent que les outils de lecture directe fonctionnent sans maintenir une longue liste d'autorisation peuvent activer les lectures authentifiées automatiques :
382
+
383
+ ```ts
384
+ export default createAgentChatPlugin({
385
+ appId: "analytics",
386
+ externalAgents: {
387
+ authenticatedReads: "auto",
388
+ writes: "ask_app_only",
389
+ // Veto facultatif de défense en profondeur pour les lectures particulièrement sensibles.
390
+ denyActions: ["get-sensitive-export"],
391
+ },
392
+ });
393
+ ```
394
+
395
+ `authenticatedReads: "auto"` ajoute uniquement les actions qui déclarent explicitement tous les éléments suivants :
396
+
397
+ - `http: { method: "GET" }`
398
+ - `readOnly: true`
399
+ - `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
400
+
401
+ La politique combine ces actions avec les entrées explicites de `connectorCatalog`, puis applique `denyActions`. Avec `writes: "ask_app_only"` (la valeur par défaut quand les lectures automatiques sont activées), les outils qui modifient des données ne sont pas directement appelables ; acheminez le travail en plusieurs étapes et les mutations via `ask_app`. `writes: "allowlisted"` est réservé aux applications qui maintiennent volontairement une liste explicite d'écritures autorisées.
402
+
403
+ La politique est authentifiée, et non anonyme. L'identité MCP OAuth/connect est transmise via `runWithRequestContext`, de sorte que les contrôles d'accès des actions, les périmètres propriétaire/organisation et les portées de lecture OAuth restent appliqués. Les actions publiques ou non authentifiées ne sont pas incluses automatiquement.
404
+
405
+ Les outils Core `db-schema` et `db-query` ne sont pas automatiquement exposés comme lectures externes. Ils restent disponibles pour l'agent interne de l'application via le chemin SQL habituellement délimité, mais un accès large au schéma/SQL est trop puissant pour être déduit de simples métadonnées de lecture. Si une application a besoin de requêtes externes directes, elle doit exposer une action GET propre avec des contrôles d'accès et des limites, ou une liste explicite de tables/colonnes avec des limites de lignes, d'octets, de durée et d'audit. `db-exec` et `db-patch` restent hors de la surface automatique.
406
+
407
+ Il s'agit d'une exclusion stricte basée sur le nom, et non d'une simple omission de métadonnées : les outils génériques de base de données, de seed, de session de navigateur, d'extensions et de radiographie contextuelle ne sont jamais exposés automatiquement, même si une modification future annote accidentellement l'un d'eux avec l'ensemble complet des indicateurs de lecture authentifiée — ils nécessitent toujours une entrée explicite dans `connectorCatalog`.
408
+
409
+ Avant l'exécution de l'agent, un message direct Slack vérifié est associé à un membre existant de l'organisation Agent Native et le lien d'identité entre l'espace de travail et l'utilisateur est enregistré. Le contexte utilisateur/organisation qui en résulte charge les ressources, les instructions et les compétences de cet utilisateur. Les membres de l'espace de travail dont le profil a bien été chargé, mais dont l'adresse e-mail est absente ou qui ne sont pas encore membres de l'organisation, sont exécutés comme principal de service anonyme limité à l'organisation : le même niveau de visibilité à l'échelle de l'organisation que celui des canaux partagés. L'agent reçoit une note visible et Slack explique une fois comment obtenir un accès personnel. En cas d'échec du chargement du profil, pour les invités et membres externes (Slack Connect), ou pour les espaces de travail non connectés à une organisation, une réponse de refus polie est envoyée au lieu d'ignorer silencieusement le message. Les canaux Slack partagés utilisent un principal de service et n'empruntent pas les autorisations privées d'un participant. OAuth géré et le manifeste d'application Slack généré demandent la portée de bot `users:read.email`. Les installations existantes doivent être reconnectées ou réinstallées pour accorder une portée nouvellement ajoutée ; les anciennes installations par jeton de bot doivent l'ajouter manuellement dans Slack. Sans cette portée, les messages directs s'exécutent dans le niveau anonyme limité à l'organisation plutôt qu'avec un accès personnel.
376
410
 
377
411
  ### Niveau complet (adhésion explicite uniquement) {#full-tier}
378
412
 
@@ -474,7 +508,7 @@ En plus des outils par action, le serveur MCP expose un ensemble de verbes stabl
474
508
 
475
509
  `create_workspace_app` rejette tout modèle non autorisé : la liste verte de modèles publics dans `packages/shared-app-config/templates.ts` fait autorité et est protégée par CI ; un agent extérieur ne peut pas l’élargir. Une action de modèle du même nom remplace une action intégrée (précédence du modèle sur le noyau). Désactivez l'ensemble avec `MCPConfig.builtinCrossAppTools: false`.
476
510
 
477
- Les catalogues d'outils et de ressources pour les hôtes d'applications sont compacts par défaut – voir [Catalog tiers](#catalog-tiers). `publicAgent.expose` reste l'option d'adhésion pour les outils de lecture/ingestion sécurisés en dehors de ce catalogue compact ; définissez `mcpApp.compactCatalog: true` uniquement comme une exception rare pour actions qui doit apparaître dans la découverte de l'hôte de discussion.
511
+ Les catalogues d'outils et de ressources pour les hôtes d'applications sont compacts par défaut – voir [Catalog tiers](#catalog-tiers). `publicAgent.expose` reste l'option au niveau de l'action pour les outils de lecture/ingestion sécurisés en dehors de ce catalogue compact ; les applications peuvent définir `externalAgents.authenticatedReads: "auto"` pour annoncer ces lectures authentifiées sans catalogue rédigé à la main. Définissez `mcpApp.compactCatalog: true` uniquement comme une exception rare pour les actions qui doivent apparaître dans la découverte de l'hôte de discussion.
478
512
 
479
513
  Pour des transferts rapides ChatGPT/Claude, le chemin idéal est direct : appelez l'action qui crée ou ouvre l'artefact, puis laissez l'application MCP lancer l'itinéraire. Une requête Mail doit appeler `manage_draft` et afficher la véritable route de composition. Une demande de tableau de bord doit appeler `open_app({ path, embed: true })` ou une action de tableau de bord avec `mcpApp` et afficher l'itinéraire Analytics complet. Le calendrier, les formulaires, le contenu, les diapositives, la conception et les clips doivent suivre le même modèle avec leur brouillon/création/recherche actions. `list_apps` est utile lorsque le modèle doit choisir parmi les applications accordées ; Une large `resources/list`, une découverte de catalogue complet ou une délégation `ask_app` ne devraient pas être la voie normale pour un transfert évident de UI.
480
514
 
@@ -324,8 +324,9 @@ MCP सर्वर प्रत्येक कॉलर को डिफ़ॉ
324
324
  </div>
325
325
  </div>
326
326
  <p class="diagram-muted note">
327
- <code>tool-search</code> reaches any full-tier tool on demand &mdash; so the
328
- compact default keeps context small without hiding capability.
327
+ <code>tool-search</code> मांग पर पूर्ण-स्तरीय टूल खोजता है; निष्पादन के लिए
328
+ कनेक्टर कैटलॉग या प्रमाणित-पठन नीति की अनुमति अब भी आवश्यक है, जब तक कॉलर
329
+ स्पष्ट रूप से पूर्ण स्तर नहीं चुनता।
329
330
  </p>
330
331
  ```
331
332
 
@@ -363,15 +364,47 @@ MCP सर्वर प्रत्येक कॉलर को डिफ़ॉ
363
364
 
364
365
  ### कॉम्पैक्ट / कनेक्टर टियर (डिफ़ॉल्ट) {#connector-tier}
365
366
 
366
- डिफ़ॉल्ट रूप से प्रत्येक कनेक्टेड एजेंट एक छोटा, क्यूरेटेड कैटलॉग देखता है (~20-30 टूल बनाम पूर्ण सतह में ~105):
367
+ डिफ़ॉल्ट रूप से प्रत्येक कनेक्टेड एजेंट एक छोटा, क्यूरेटेड कैटलॉग देखता है (~20-30 टूल बनाम पूर्ण सतह में ~105)। ऐप या तो स्पष्ट `connectorCatalog` बनाए रख सकते हैं, या प्रमाणित-पठन नीति चुन सकते हैं:
367
368
 
368
369
  - **टेम्पलेट-घोषित ऐप actions** — सुरक्षित ऐप-स्तरीय अनुमति-सूची। योजना के लिए जो `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search`, और समान है।
369
370
  - **अंतर्निहित क्रॉस-ऐप टूल** - `list_apps`, `open_app`, `ask_app`, `create_embed_session`।
370
- - **`tool-search`** हमेशा मौजूद रहता है, इसलिए सूची के बाहर की कोई भी चीज़ मांग पर उपलब्ध रहती है (नीचे देखें)।
371
+ - **`tool-search`** खोज के लिए हमेशा मौजूद रहता है। खोजे गए action को `tools/call` से चलाने से पहले कनेक्टर कैटलॉग में होना, प्रमाणित-पठन नीति में शामिल होना, या स्पष्ट पूर्ण-कैटलॉग ऑप्ट-इन से सक्षम होना आवश्यक है।
371
372
 
372
- सूची से बाहर के उपकरण - उदाहरण के लिए `db-exec`, `seed-*`, एक्सटेंशन सूट, ब्राउज़र-सत्र उपकरण और संदर्भ-एक्सरे उपकरण - विज्ञापित नहीं किए जाते हैं, और जब तक कॉल करने वाले ने पूरी सूची में शामिल नहीं किया है, तब तक उन पर कॉल को "अज्ञात टूल" के साथ अस्वीकार कर दिया जाता है। यह प्रत्येक कनेक्टेड एजेंट की संदर्भ विंडो को छोटा रखता है और फ़ुटगन को हटा देता है जो केवल एकल-किरायेदार स्थानीय विकास के लिए सुरक्षित हैं। कनेक्टर टियर सक्रिय है **जब भी कोई टेम्प्लेट `connectorCatalog` घोषित करता है** - यह किसी पर्यावरण चर के पीछे गेट नहीं किया जाता है।
373
+ सूची से बाहर के उपकरण - उदाहरण के लिए `db-exec`, `seed-*`, एक्सटेंशन सूट, ब्राउज़र-सत्र उपकरण और संदर्भ-एक्सरे उपकरण - विज्ञापित नहीं किए जाते हैं, और जब तक कॉल करने वाले ने पूरी सूची में शामिल नहीं किया है, तब तक उन पर कॉल को "अज्ञात टूल" के साथ अस्वीकार कर दिया जाता है। यह प्रत्येक कनेक्टेड एजेंट की संदर्भ विंडो को छोटा रखता है और फ़ुटगन को हटा देता है जो केवल एकल-किरायेदार स्थानीय विकास के लिए सुरक्षित हैं।
373
374
 
374
- `tool-search` दो तरीकों से काम करता है: इसे टूल नामों के पूर्ण मेनू और एक-पंक्ति विवरण (सस्ता, कोई स्कीमा नहीं) के लिए **कोई क्वेरी नहीं** के साथ कॉल करें, या पैरामीटर सारांश के साथ रैंक किए गए मिलान के लिए एक क्वेरी के साथ। इस प्रकार एक कॉम्पैक्ट क्लाइंट किसी भी पूर्ण-सतह टूल को खोजता है और लोड करता है जब उसे इसकी आवश्यकता होती है।
375
+ `tool-search` दो तरीकों से काम करता है: इसे टूल नामों के पूर्ण मेनू और एक-पंक्ति विवरण (सस्ता, कोई स्कीमा नहीं) के लिए **कोई क्वेरी नहीं** के साथ कॉल करें, या पैरामीटर सारांश के साथ रैंक किए गए मिलान के लिए एक क्वेरी के साथ। यह कॉम्पैक्ट क्लाइंट को क्षमताएँ खोजने में मदद करता है; ऐप एजेंट के व्यापक तर्क या किसी लिखने की क्रिया के लिए `ask_app` का उपयोग करें।
376
+
377
+ #### डिफ़ॉल्ट रूप से प्रमाणित पठन
378
+
379
+ जो ऐप लंबी अनुमति-सूची बनाए बिना सीधे पठन टूल चलाना चाहते हैं, वे स्वचालित प्रमाणित पठन चुन सकते हैं:
380
+
381
+ ```ts
382
+ export default createAgentChatPlugin({
383
+ appId: "analytics",
384
+ externalAgents: {
385
+ authenticatedReads: "auto",
386
+ writes: "ask_app_only",
387
+ // विशेष रूप से संवेदनशील पठन के लिए वैकल्पिक रक्षा-गहन निषेध।
388
+ denyActions: ["get-sensitive-export"],
389
+ },
390
+ });
391
+ ```
392
+
393
+ `authenticatedReads: "auto"` केवल उन actions को जोड़ता है जो स्पष्ट रूप से ये सभी घोषित करते हैं:
394
+
395
+ - `http: { method: "GET" }`
396
+ - `readOnly: true`
397
+ - `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
398
+
399
+ नीति इन actions को स्पष्ट `connectorCatalog` प्रविष्टियों के साथ जोड़ती है, फिर `denyActions` लागू करती है। `writes: "ask_app_only"` (स्वचालित पठन चालू होने पर डिफ़ॉल्ट) के साथ बदलने वाले टूल सीधे कॉल नहीं किए जा सकते; बहु-चरणीय काम और बदलाव `ask_app` के माध्यम से भेजें। `writes: "allowlisted"` केवल उन ऐप के लिए है जो जानबूझकर स्पष्ट लिखने की अनुमति-सूची रखते हैं।
400
+
401
+ यह नीति प्रमाणित है, अनाम नहीं। MCP OAuth/connect पहचान `runWithRequestContext` से आगे जाती है, इसलिए action-स्तरीय पहुँच जाँच, मालिक/संगठन स्कोप और OAuth पठन स्कोप लागू रहते हैं। सार्वजनिक या अप्रमाणित actions स्वचालित पठन में शामिल नहीं होते।
402
+
403
+ Core के `db-schema` और `db-query` को स्वचालित बाहरी रीड के रूप में प्रकाशित नहीं किया जाता। वे सामान्य स्कोप किए गए SQL पथ के माध्यम से ऐप एजेंट के लिए उपलब्ध रहते हैं, लेकिन व्यापक स्कीमा/SQL पहुँच केवल read-only मेटाडेटा से अनुमान लगाने के लिए बहुत शक्तिशाली है। सीधे बाहरी क्वेरी की आवश्यकता होने पर ऐप को अपने access checks और सीमाओं वाला GET action, या rows, bytes, timeout और audit limits वाली स्पष्ट table/column allow-list देनी चाहिए। `db-exec` और `db-patch` स्वचालित सतह से बाहर रहते हैं।
404
+
405
+ यह नाम-आधारित सख्त बहिष्करण है, केवल मेटाडेटा की चूक नहीं: सामान्य डेटाबेस/seed/ब्राउज़र-सत्र/एक्सटेंशन/संदर्भ-एक्सरे टूल कभी भी स्वचालित रूप से उजागर नहीं होते, भले ही भविष्य का कोई बदलाव गलती से इनमें से किसी एक को पूर्ण authenticated-read फ़्लैग सेट के साथ चिह्नित कर दे — उन्हें हमेशा एक स्पष्ट `connectorCatalog` प्रविष्टि की आवश्यकता होती है।
406
+
407
+ एजेंट चलने से पहले सत्यापित Slack DM को Agent Native संगठन के किसी मौजूदा सदस्य से मिलाया जाता है और workspace/user पहचान लिंक सहेजा जाता है। इससे बने user/org संदर्भ में उस उपयोगकर्ता के संसाधन, निर्देश और skills लोड होते हैं। जिन workspace सदस्यों का प्रोफ़ाइल सफलतापूर्वक मिला है लेकिन ईमेल उपलब्ध नहीं है या वे अभी संगठन के सदस्य नहीं हैं, वे इसके बजाय संगठन-स्कोप वाले अनाम service principal के रूप में चलते हैं — साझा चैनलों वाली संगठन-व्यापी दृश्यता के उसी स्तर पर — साथ में एजेंट को दिखाई देने वाला नोट और व्यक्तिगत पहुँच पाने का तरीका बताने वाली एक बार की Slack सूचना। प्रोफ़ाइल लोड न होने, मेहमान या बाहरी (Slack Connect) सदस्य होने, या workspace के किसी संगठन से न जुड़े होने पर संदेश को चुपचाप छोड़ने के बजाय विनम्र अस्वीकृति भेजी जाती है। साझा Slack चैनल service principal का उपयोग करते हैं और किसी प्रतिभागी की निजी permissions नहीं लेते। Managed OAuth और generated Slack app manifest दोनों bot scope `users:read.email` मांगते हैं। नया scope देने के लिए मौजूदा installations को reconnect/reinstall करना होगा; पुराने bot-token installations को इसे Slack में manually जोड़ना होगा। इसके बिना DM व्यक्तिगत पहुँच के बजाय संगठन-स्कोप वाले अनाम स्तर में चलते हैं।
375
408
 
376
409
  ### पूर्ण स्तरीय (केवल स्पष्ट ऑप्ट-इन) {#full-tier}
377
410
 
@@ -473,7 +506,7 @@ ChatGPT/Claude-शैली OAuth ऐप होस्ट के लिए, ख
473
506
 
474
507
  `create_workspace_app` किसी भी गैर-अनुमति-सूचीबद्ध टेम्पलेट को अस्वीकार करता है - `packages/shared-app-config/templates.ts` में सार्वजनिक टेम्पलेट अनुमति-सूची आधिकारिक और सीआई-संरक्षित है; कोई बाहरी एजेंट इसे चौड़ा नहीं कर सकता. एक समान-नामित टेम्पलेट क्रिया एक बिल्टिन (टेम्पलेट-ओवर-कोर प्राथमिकता) को ओवरराइड करती है। `MCPConfig.builtinCrossAppTools: false` के साथ पूरे सेट को अक्षम करें।
475
508
 
476
- ऐप होस्ट के लिए टूल और संसाधन कैटलॉग डिफ़ॉल्ट रूप से कॉम्पैक्ट होते हैं - [Catalog tiers](#catalog-tiers) देखें। `publicAgent.expose` उस कॉम्पैक्ट कैटलॉग के बाहर सुरक्षित पढ़ने/निगलने वाले टूल के लिए ऑप्ट-इन बना हुआ है; `mcpApp.compactCatalog: true` को केवल actions के लिए एक दुर्लभ अपवाद के रूप में सेट करें जिसे चैट-होस्ट डिस्कवरी में प्रदर्शित होना चाहिए।
509
+ ऐप होस्ट के लिए टूल और संसाधन कैटलॉग डिफ़ॉल्ट रूप से कॉम्पैक्ट होते हैं - [Catalog tiers](#catalog-tiers) देखें। `publicAgent.expose` उस कॉम्पैक्ट कैटलॉग के बाहर सुरक्षित पढ़ने/निगलने वाले टूल के लिए action-स्तरीय ऑप्ट-इन बना रहता है; ऐप हाथ से लिखे कैटलॉग के बिना प्रमाणित पठन विज्ञापित करने के लिए `externalAgents.authenticatedReads: "auto"` सेट कर सकते हैं। `mcpApp.compactCatalog: true` को केवल actions के लिए दुर्लभ अपवाद के रूप में सेट करें जिन्हें चैट-होस्ट डिस्कवरी में प्रदर्शित होना चाहिए।
477
510
 
478
511
  तेज़ ChatGPT/Claude हैंडऑफ़ के लिए, आदर्श पथ सीधा है: उस क्रिया को कॉल करें जो आर्टिफैक्ट बनाता है या खोलता है, फिर MCP ऐप को रूट लॉन्च करने दें। एक मेल अनुरोध को `manage_draft` पर कॉल करना चाहिए और वास्तविक कंपोज़ रूट प्रस्तुत करना चाहिए। डैशबोर्ड अनुरोध को `open_app({ path, embed: true })` या `mcpApp` के साथ डैशबोर्ड कार्रवाई को कॉल करना चाहिए और संपूर्ण एनालिटिक्स रूट प्रस्तुत करना चाहिए। कैलेंडर, फॉर्म, सामग्री, स्लाइड, डिज़ाइन और क्लिप्स को अपने ड्राफ्ट/निर्माण/खोज actions के साथ समान पैटर्न का पालन करना चाहिए। `list_apps` तब उपयोगी होता है जब मॉडल को स्वीकृत ऐप्स में से चयन करना होता है; व्यापक `resources/list`, पूर्ण-कैटलॉग खोज, या `ask_app` प्रतिनिधिमंडल स्पष्ट UI हैंडऑफ़ के लिए सामान्य मार्ग नहीं होना चाहिए।
479
512