@agent-native/core 0.98.16 → 0.99.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 (546) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +21 -0
  3. package/corpus/core/docs/content/actions.mdx +1 -1
  4. package/corpus/core/docs/content/authentication.mdx +1 -1
  5. package/corpus/core/docs/content/dispatch.mdx +3 -3
  6. package/corpus/core/docs/content/external-agents.mdx +30 -19
  7. package/corpus/core/docs/content/locales/ar-SA/actions.mdx +1 -1
  8. package/corpus/core/docs/content/locales/ar-SA/authentication.mdx +1 -1
  9. package/corpus/core/docs/content/locales/ar-SA/dispatch.mdx +3 -3
  10. package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +23 -19
  11. package/corpus/core/docs/content/locales/ar-SA/mcp-clients.mdx +31 -3
  12. package/corpus/core/docs/content/locales/ar-SA/mcp-protocol.mdx +29 -15
  13. package/corpus/core/docs/content/locales/ar-SA/plan-plugin.mdx +3 -3
  14. package/corpus/core/docs/content/locales/ar-SA/server.mdx +2 -2
  15. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +1 -1
  16. package/corpus/core/docs/content/locales/ar-SA/template-assets.mdx +1 -1
  17. package/corpus/core/docs/content/locales/ar-SA/template-dispatch.mdx +2 -2
  18. package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +3 -3
  19. package/corpus/core/docs/content/locales/de-DE/actions.mdx +1 -1
  20. package/corpus/core/docs/content/locales/de-DE/authentication.mdx +1 -1
  21. package/corpus/core/docs/content/locales/de-DE/dispatch.mdx +3 -3
  22. package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +23 -19
  23. package/corpus/core/docs/content/locales/de-DE/mcp-clients.mdx +37 -3
  24. package/corpus/core/docs/content/locales/de-DE/mcp-protocol.mdx +29 -15
  25. package/corpus/core/docs/content/locales/de-DE/plan-plugin.mdx +3 -3
  26. package/corpus/core/docs/content/locales/de-DE/server.mdx +2 -2
  27. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +1 -1
  28. package/corpus/core/docs/content/locales/de-DE/template-assets.mdx +1 -1
  29. package/corpus/core/docs/content/locales/de-DE/template-dispatch.mdx +2 -2
  30. package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +3 -3
  31. package/corpus/core/docs/content/locales/es-ES/actions.mdx +1 -1
  32. package/corpus/core/docs/content/locales/es-ES/authentication.mdx +1 -1
  33. package/corpus/core/docs/content/locales/es-ES/dispatch.mdx +3 -3
  34. package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +32 -19
  35. package/corpus/core/docs/content/locales/es-ES/mcp-clients.mdx +17 -3
  36. package/corpus/core/docs/content/locales/es-ES/mcp-protocol.mdx +38 -15
  37. package/corpus/core/docs/content/locales/es-ES/plan-plugin.mdx +3 -3
  38. package/corpus/core/docs/content/locales/es-ES/server.mdx +2 -2
  39. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +1 -1
  40. package/corpus/core/docs/content/locales/es-ES/template-assets.mdx +1 -1
  41. package/corpus/core/docs/content/locales/es-ES/template-dispatch.mdx +2 -2
  42. package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +3 -3
  43. package/corpus/core/docs/content/locales/fr-FR/actions.mdx +1 -1
  44. package/corpus/core/docs/content/locales/fr-FR/authentication.mdx +1 -1
  45. package/corpus/core/docs/content/locales/fr-FR/dispatch.mdx +3 -3
  46. package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +23 -19
  47. package/corpus/core/docs/content/locales/fr-FR/mcp-clients.mdx +17 -3
  48. package/corpus/core/docs/content/locales/fr-FR/mcp-protocol.mdx +29 -15
  49. package/corpus/core/docs/content/locales/fr-FR/plan-plugin.mdx +3 -3
  50. package/corpus/core/docs/content/locales/fr-FR/server.mdx +2 -2
  51. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +1 -1
  52. package/corpus/core/docs/content/locales/fr-FR/template-assets.mdx +1 -1
  53. package/corpus/core/docs/content/locales/fr-FR/template-dispatch.mdx +2 -2
  54. package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +3 -3
  55. package/corpus/core/docs/content/locales/hi-IN/actions.mdx +1 -1
  56. package/corpus/core/docs/content/locales/hi-IN/authentication.mdx +1 -1
  57. package/corpus/core/docs/content/locales/hi-IN/dispatch.mdx +3 -3
  58. package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +31 -19
  59. package/corpus/core/docs/content/locales/hi-IN/mcp-clients.mdx +17 -3
  60. package/corpus/core/docs/content/locales/hi-IN/mcp-protocol.mdx +36 -15
  61. package/corpus/core/docs/content/locales/hi-IN/plan-plugin.mdx +3 -3
  62. package/corpus/core/docs/content/locales/hi-IN/server.mdx +2 -2
  63. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +1 -1
  64. package/corpus/core/docs/content/locales/hi-IN/template-assets.mdx +1 -1
  65. package/corpus/core/docs/content/locales/hi-IN/template-dispatch.mdx +2 -2
  66. package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +3 -3
  67. package/corpus/core/docs/content/locales/ja-JP/actions.mdx +1 -1
  68. package/corpus/core/docs/content/locales/ja-JP/authentication.mdx +1 -1
  69. package/corpus/core/docs/content/locales/ja-JP/dispatch.mdx +3 -3
  70. package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +23 -19
  71. package/corpus/core/docs/content/locales/ja-JP/mcp-clients.mdx +34 -3
  72. package/corpus/core/docs/content/locales/ja-JP/mcp-protocol.mdx +29 -15
  73. package/corpus/core/docs/content/locales/ja-JP/plan-plugin.mdx +3 -3
  74. package/corpus/core/docs/content/locales/ja-JP/server.mdx +2 -2
  75. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +1 -1
  76. package/corpus/core/docs/content/locales/ja-JP/template-assets.mdx +1 -1
  77. package/corpus/core/docs/content/locales/ja-JP/template-dispatch.mdx +2 -2
  78. package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +3 -3
  79. package/corpus/core/docs/content/locales/ko-KR/actions.mdx +1 -1
  80. package/corpus/core/docs/content/locales/ko-KR/authentication.mdx +1 -1
  81. package/corpus/core/docs/content/locales/ko-KR/dispatch.mdx +3 -3
  82. package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +30 -19
  83. package/corpus/core/docs/content/locales/ko-KR/mcp-clients.mdx +33 -3
  84. package/corpus/core/docs/content/locales/ko-KR/mcp-protocol.mdx +36 -15
  85. package/corpus/core/docs/content/locales/ko-KR/plan-plugin.mdx +3 -3
  86. package/corpus/core/docs/content/locales/ko-KR/server.mdx +2 -2
  87. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +1 -1
  88. package/corpus/core/docs/content/locales/ko-KR/template-assets.mdx +1 -1
  89. package/corpus/core/docs/content/locales/ko-KR/template-dispatch.mdx +2 -2
  90. package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +3 -3
  91. package/corpus/core/docs/content/locales/pt-BR/actions.mdx +1 -1
  92. package/corpus/core/docs/content/locales/pt-BR/authentication.mdx +1 -1
  93. package/corpus/core/docs/content/locales/pt-BR/dispatch.mdx +3 -3
  94. package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +32 -19
  95. package/corpus/core/docs/content/locales/pt-BR/mcp-clients.mdx +34 -3
  96. package/corpus/core/docs/content/locales/pt-BR/mcp-protocol.mdx +32 -15
  97. package/corpus/core/docs/content/locales/pt-BR/plan-plugin.mdx +3 -3
  98. package/corpus/core/docs/content/locales/pt-BR/server.mdx +2 -2
  99. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +1 -1
  100. package/corpus/core/docs/content/locales/pt-BR/template-assets.mdx +1 -1
  101. package/corpus/core/docs/content/locales/pt-BR/template-dispatch.mdx +2 -2
  102. package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +3 -3
  103. package/corpus/core/docs/content/locales/zh-CN/actions.mdx +1 -1
  104. package/corpus/core/docs/content/locales/zh-CN/authentication.mdx +1 -1
  105. package/corpus/core/docs/content/locales/zh-CN/dispatch.mdx +3 -3
  106. package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +23 -19
  107. package/corpus/core/docs/content/locales/zh-CN/mcp-clients.mdx +28 -3
  108. package/corpus/core/docs/content/locales/zh-CN/mcp-protocol.mdx +29 -15
  109. package/corpus/core/docs/content/locales/zh-CN/plan-plugin.mdx +3 -3
  110. package/corpus/core/docs/content/locales/zh-CN/server.mdx +2 -2
  111. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +1 -1
  112. package/corpus/core/docs/content/locales/zh-CN/template-assets.mdx +1 -1
  113. package/corpus/core/docs/content/locales/zh-CN/template-dispatch.mdx +2 -2
  114. package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +3 -3
  115. package/corpus/core/docs/content/locales/zh-TW/actions.mdx +1 -1
  116. package/corpus/core/docs/content/locales/zh-TW/authentication.mdx +1 -1
  117. package/corpus/core/docs/content/locales/zh-TW/dispatch.mdx +3 -3
  118. package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +23 -19
  119. package/corpus/core/docs/content/locales/zh-TW/mcp-clients.mdx +28 -3
  120. package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.mdx +30 -15
  121. package/corpus/core/docs/content/locales/zh-TW/plan-plugin.mdx +3 -3
  122. package/corpus/core/docs/content/locales/zh-TW/server.mdx +2 -2
  123. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +1 -1
  124. package/corpus/core/docs/content/locales/zh-TW/template-assets.mdx +1 -1
  125. package/corpus/core/docs/content/locales/zh-TW/template-dispatch.mdx +2 -2
  126. package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +3 -3
  127. package/corpus/core/docs/content/mcp-clients.mdx +31 -4
  128. package/corpus/core/docs/content/mcp-protocol.mdx +35 -15
  129. package/corpus/core/docs/content/plan-plugin.mdx +3 -3
  130. package/corpus/core/docs/content/server.mdx +2 -2
  131. package/corpus/core/docs/content/skills-guide.mdx +1 -1
  132. package/corpus/core/docs/content/template-assets.mdx +1 -1
  133. package/corpus/core/docs/content/template-dispatch.mdx +2 -2
  134. package/corpus/core/docs/content/template-plan.mdx +3 -3
  135. package/corpus/core/package.json +1 -1
  136. package/corpus/core/src/a2a/client.ts +3 -0
  137. package/corpus/core/src/a2a/handlers.ts +95 -7
  138. package/corpus/core/src/cli/connect.ts +50 -24
  139. package/corpus/core/src/cli/mcp-config-writers.ts +10 -0
  140. package/corpus/core/src/cli/mcp.ts +5 -5
  141. package/corpus/core/src/cli/skills-content/assets-skill.ts +1 -1
  142. package/corpus/core/src/cli/skills-content/design-exploration-skill.ts +1 -1
  143. package/corpus/core/src/cli/skills-content/help.ts +1 -1
  144. package/corpus/core/src/cli/skills-content/plan-setup-auth.ts +1 -1
  145. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +1 -1
  146. package/corpus/core/src/cli/skills-content/visual-recap-skill.ts +2 -2
  147. package/corpus/core/src/cli/skills.ts +23 -12
  148. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +5 -0
  149. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +17 -0
  150. package/corpus/core/src/embedding/agent.ts +8 -6
  151. package/corpus/core/src/localization/default-messages.ts +7 -0
  152. package/corpus/core/src/mcp/ask-app-inline-tasks.ts +125 -0
  153. package/corpus/core/src/mcp/build-server.ts +65 -3
  154. package/corpus/core/src/mcp/builtin-tools.ts +186 -22
  155. package/corpus/core/src/mcp/connect-route.ts +17 -14
  156. package/corpus/core/src/mcp/oauth-route.ts +38 -13
  157. package/corpus/core/src/mcp/route-paths.ts +34 -0
  158. package/corpus/core/src/mcp/server.ts +21 -10
  159. package/corpus/core/src/mcp/stdio.ts +34 -16
  160. package/corpus/core/src/mcp/workspace-resolve.ts +2 -1
  161. package/corpus/core/src/mcp-client/manager.ts +5 -3
  162. package/corpus/core/src/mcp-client/remote-store.ts +10 -10
  163. package/corpus/core/src/server/agent-chat-plugin.ts +59 -8
  164. package/corpus/core/src/server/auth.ts +22 -6
  165. package/corpus/core/src/server/core-routes-plugin.ts +30 -24
  166. package/corpus/core/src/server/csrf.ts +17 -0
  167. package/corpus/core/src/server/framework-request-handler.ts +8 -2
  168. package/corpus/core/src/server/google-oauth.ts +6 -0
  169. package/corpus/core/src/server/http-response-telemetry.ts +6 -1
  170. package/corpus/core/src/server/recap-image-route.ts +3 -3
  171. package/corpus/core/src/server/security-headers.ts +7 -1
  172. package/corpus/core/src/server/ssr-handler.ts +2 -0
  173. package/corpus/core/src/shared/cache-control.ts +6 -4
  174. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +10 -0
  175. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  176. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  177. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  178. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
  179. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +10 -0
  180. package/corpus/templates/analytics/app/global.css +63 -4
  181. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +8 -5
  182. package/corpus/templates/analytics/changelog/2026-07-13-daily-dashboard-emails-recover-more-reliably-from-serverless.md +6 -0
  183. package/corpus/templates/analytics/changelog/2026-07-13-session-replays-keep-a-visible-mac-style-cursor-over-the-vis.md +6 -0
  184. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +21 -2
  185. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +57 -1
  186. package/corpus/templates/analytics/server/lib/dashboard-report.ts +266 -28
  187. package/corpus/templates/analytics/server/routes/[...page].get.ts +0 -2
  188. package/corpus/templates/assets/.agents/skills/security/SKILL.md +10 -0
  189. package/corpus/templates/assets/agent-native.app-skill.json +1 -1
  190. package/corpus/templates/brain/.agents/skills/security/SKILL.md +10 -0
  191. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +10 -0
  192. package/corpus/templates/calendar/AGENTS.md +2 -1
  193. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +0 -19
  194. package/corpus/templates/calendar/app/lib/attendee-local-time.ts +14 -5
  195. package/corpus/templates/calendar/changelog/2026-07-13-your-local-time-now-follows-your-browser-timezone-and-event-.md +6 -0
  196. package/corpus/templates/chat/.agents/skills/security/SKILL.md +10 -0
  197. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +7 -2
  198. package/corpus/templates/clips/.agents/skills/security/SKILL.md +10 -0
  199. package/corpus/templates/clips/AGENTS.md +7 -0
  200. package/corpus/templates/clips/actions/list-meetings.ts +19 -4
  201. package/corpus/templates/clips/actions/start-meeting-recording.ts +7 -1
  202. package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +75 -78
  203. package/corpus/templates/clips/app/components/recorder/confetti-canvas.tsx +18 -1
  204. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +6 -12
  205. package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +19 -2
  206. package/corpus/templates/clips/app/lib/camera-composite.ts +70 -10
  207. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +1 -1
  208. package/corpus/templates/clips/app/routes/record.tsx +5 -25
  209. package/corpus/templates/clips/changelog/2026-07-13-clips-desktop-now-requires-macos-13-for-native-capture.md +6 -0
  210. package/corpus/templates/clips/changelog/2026-07-13-clips-hide-solo-meeting-reminders.md +6 -0
  211. package/corpus/templates/clips/changelog/2026-07-13-clips-now-removes-duplicate-mic-and-system-transcript-turns-.md +6 -0
  212. package/corpus/templates/clips/changelog/2026-07-13-desktop-recordings-run-cooler-and-quieter-live-transcription.md +6 -0
  213. package/corpus/templates/clips/changelog/2026-07-13-meeting-recordings-now-stop-after-a-calendar-meeting-ends-an.md +6 -0
  214. package/corpus/templates/clips/changelog/2026-07-13-meeting-transcripts-now-use-a-clean-agent-chat-style-reading.md +6 -0
  215. package/corpus/templates/clips/changelog/2026-07-13-screen-recordings-use-less-processing-power-during-longer-ca.md +6 -0
  216. package/corpus/templates/clips/chrome-extension/src/background.ts +5 -3
  217. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +17 -14
  218. package/corpus/templates/clips/chrome-extension/src/overlay.ts +8 -2
  219. package/corpus/templates/clips/desktop/README.md +3 -0
  220. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +9 -0
  221. package/corpus/templates/clips/desktop/src/lib/recorder.ts +8 -2
  222. package/corpus/templates/clips/desktop/src/lib/silence-events.ts +1 -0
  223. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +5 -0
  224. package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +134 -5
  225. package/corpus/templates/clips/desktop/src/lib/upload-video-stream.ts +28 -0
  226. package/corpus/templates/clips/desktop/src/overlays/flow-bar.tsx +10 -3
  227. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +42 -9
  228. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +10 -2
  229. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +6 -1
  230. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +77 -1
  231. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +104 -25
  232. package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +4 -0
  233. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +287 -32
  234. package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
  235. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +28 -0
  236. package/corpus/templates/clips/server/routes/[...page].get.ts +1 -59
  237. package/corpus/templates/clips/shared/recording-capture.ts +37 -0
  238. package/corpus/templates/content/.agents/skills/security/SKILL.md +10 -0
  239. package/corpus/templates/content/agent-native.app-skill.json +1 -1
  240. package/corpus/templates/content/server/routes/[...page].get.ts +1 -15
  241. package/corpus/templates/design/.agents/skills/security/SKILL.md +10 -0
  242. package/corpus/templates/design/actions/connect-assets-mcp.ts +1 -1
  243. package/corpus/templates/design/agent-native.app-skill.json +1 -1
  244. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +88 -12
  245. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1 -0
  246. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +4 -1
  247. package/corpus/templates/design/changelog/2026-07-13-adding-shapes-preserves-canvas-background.md +6 -0
  248. package/corpus/templates/design/changelog/2026-07-13-clicking-quickly-between-overlapping-elements-no-longer-bounc.md +6 -0
  249. package/corpus/templates/design/server/plugins/assets-mcp.ts +1 -1
  250. package/corpus/templates/design/server/routes/[...page].get.ts +0 -2
  251. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +10 -0
  252. package/corpus/templates/forms/.agents/skills/security/SKILL.md +10 -0
  253. package/corpus/templates/macros/.agents/skills/security/SKILL.md +10 -0
  254. package/corpus/templates/mail/.agents/skills/security/SKILL.md +10 -0
  255. package/corpus/templates/plan/.agents/skills/security/SKILL.md +10 -0
  256. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +1 -1
  257. package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +2 -2
  258. package/corpus/templates/plan/agent-native.app-skill.json +1 -1
  259. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +6 -1
  260. package/corpus/templates/plan/app/pages/PlansPage.tsx +15 -6
  261. package/corpus/templates/plan/changelog/2026-07-13-fixed-local-plan-previews-continuously-flickering-while-revi.md +6 -0
  262. package/corpus/templates/plan/server/routes/[...page].get.ts +0 -2
  263. package/corpus/templates/slides/.agents/skills/security/SKILL.md +10 -0
  264. package/dist/a2a/client.d.ts +2 -0
  265. package/dist/a2a/client.d.ts.map +1 -1
  266. package/dist/a2a/client.js +2 -0
  267. package/dist/a2a/client.js.map +1 -1
  268. package/dist/a2a/handlers.d.ts.map +1 -1
  269. package/dist/a2a/handlers.js +84 -7
  270. package/dist/a2a/handlers.js.map +1 -1
  271. package/dist/cli/connect.d.ts +2 -2
  272. package/dist/cli/connect.d.ts.map +1 -1
  273. package/dist/cli/connect.js +45 -23
  274. package/dist/cli/connect.js.map +1 -1
  275. package/dist/cli/mcp-config-writers.d.ts.map +1 -1
  276. package/dist/cli/mcp-config-writers.js +7 -0
  277. package/dist/cli/mcp-config-writers.js.map +1 -1
  278. package/dist/cli/mcp.js +5 -3
  279. package/dist/cli/mcp.js.map +1 -1
  280. package/dist/cli/skills-content/assets-skill.d.ts +1 -1
  281. package/dist/cli/skills-content/assets-skill.d.ts.map +1 -1
  282. package/dist/cli/skills-content/assets-skill.js +1 -1
  283. package/dist/cli/skills-content/assets-skill.js.map +1 -1
  284. package/dist/cli/skills-content/design-exploration-skill.d.ts +1 -1
  285. package/dist/cli/skills-content/design-exploration-skill.d.ts.map +1 -1
  286. package/dist/cli/skills-content/design-exploration-skill.js +1 -1
  287. package/dist/cli/skills-content/design-exploration-skill.js.map +1 -1
  288. package/dist/cli/skills-content/help.d.ts +1 -1
  289. package/dist/cli/skills-content/help.d.ts.map +1 -1
  290. package/dist/cli/skills-content/help.js +1 -1
  291. package/dist/cli/skills-content/help.js.map +1 -1
  292. package/dist/cli/skills-content/plan-setup-auth.d.ts +1 -1
  293. package/dist/cli/skills-content/plan-setup-auth.d.ts.map +1 -1
  294. package/dist/cli/skills-content/plan-setup-auth.js +1 -1
  295. package/dist/cli/skills-content/plan-setup-auth.js.map +1 -1
  296. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  297. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  298. package/dist/cli/skills-content/visual-plan-skill.js +1 -1
  299. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  300. package/dist/cli/skills-content/visual-recap-skill.d.ts +1 -1
  301. package/dist/cli/skills-content/visual-recap-skill.d.ts.map +1 -1
  302. package/dist/cli/skills-content/visual-recap-skill.js +2 -2
  303. package/dist/cli/skills-content/visual-recap-skill.js.map +1 -1
  304. package/dist/cli/skills.d.ts.map +1 -1
  305. package/dist/cli/skills.js +16 -12
  306. package/dist/cli/skills.js.map +1 -1
  307. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  308. package/dist/client/resources/McpIntegrationDialog.js +1 -1
  309. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  310. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  311. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  312. package/dist/client/resources/mcp-integration-catalog.js +14 -0
  313. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  314. package/dist/collab/awareness.d.ts +2 -2
  315. package/dist/collab/awareness.d.ts.map +1 -1
  316. package/dist/collab/struct-routes.d.ts +1 -1
  317. package/dist/embedding/agent.d.ts.map +1 -1
  318. package/dist/embedding/agent.js +6 -7
  319. package/dist/embedding/agent.js.map +1 -1
  320. package/dist/localization/default-messages.d.ts +5 -0
  321. package/dist/localization/default-messages.d.ts.map +1 -1
  322. package/dist/localization/default-messages.js +5 -0
  323. package/dist/localization/default-messages.js.map +1 -1
  324. package/dist/mcp/ask-app-inline-tasks.d.ts +47 -0
  325. package/dist/mcp/ask-app-inline-tasks.d.ts.map +1 -0
  326. package/dist/mcp/ask-app-inline-tasks.js +87 -0
  327. package/dist/mcp/ask-app-inline-tasks.js.map +1 -0
  328. package/dist/mcp/build-server.d.ts.map +1 -1
  329. package/dist/mcp/build-server.js +56 -3
  330. package/dist/mcp/build-server.js.map +1 -1
  331. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  332. package/dist/mcp/builtin-tools.js +141 -21
  333. package/dist/mcp/builtin-tools.js.map +1 -1
  334. package/dist/mcp/connect-route.d.ts +12 -10
  335. package/dist/mcp/connect-route.d.ts.map +1 -1
  336. package/dist/mcp/connect-route.js +17 -14
  337. package/dist/mcp/connect-route.js.map +1 -1
  338. package/dist/mcp/oauth-route.d.ts +1 -1
  339. package/dist/mcp/oauth-route.d.ts.map +1 -1
  340. package/dist/mcp/oauth-route.js +30 -13
  341. package/dist/mcp/oauth-route.js.map +1 -1
  342. package/dist/mcp/route-paths.d.ts +13 -0
  343. package/dist/mcp/route-paths.d.ts.map +1 -0
  344. package/dist/mcp/route-paths.js +27 -0
  345. package/dist/mcp/route-paths.js.map +1 -0
  346. package/dist/mcp/server.d.ts +2 -1
  347. package/dist/mcp/server.d.ts.map +1 -1
  348. package/dist/mcp/server.js +14 -6
  349. package/dist/mcp/server.js.map +1 -1
  350. package/dist/mcp/stdio.d.ts +7 -6
  351. package/dist/mcp/stdio.d.ts.map +1 -1
  352. package/dist/mcp/stdio.js +27 -15
  353. package/dist/mcp/stdio.js.map +1 -1
  354. package/dist/mcp/workspace-resolve.d.ts +2 -1
  355. package/dist/mcp/workspace-resolve.d.ts.map +1 -1
  356. package/dist/mcp/workspace-resolve.js +2 -1
  357. package/dist/mcp/workspace-resolve.js.map +1 -1
  358. package/dist/mcp-client/manager.js +6 -3
  359. package/dist/mcp-client/manager.js.map +1 -1
  360. package/dist/mcp-client/remote-store.js +5 -7
  361. package/dist/mcp-client/remote-store.js.map +1 -1
  362. package/dist/notifications/routes.d.ts +2 -2
  363. package/dist/observability/routes.d.ts +3 -3
  364. package/dist/progress/routes.d.ts +1 -1
  365. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  366. package/dist/resources/handlers.d.ts +3 -3
  367. package/dist/secrets/routes.d.ts +6 -6
  368. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  369. package/dist/server/agent-chat-plugin.js +60 -9
  370. package/dist/server/agent-chat-plugin.js.map +1 -1
  371. package/dist/server/auth.d.ts.map +1 -1
  372. package/dist/server/auth.js +16 -6
  373. package/dist/server/auth.js.map +1 -1
  374. package/dist/server/core-routes-plugin.d.ts +4 -3
  375. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  376. package/dist/server/core-routes-plugin.js +20 -15
  377. package/dist/server/core-routes-plugin.js.map +1 -1
  378. package/dist/server/csrf.d.ts.map +1 -1
  379. package/dist/server/csrf.js +11 -0
  380. package/dist/server/csrf.js.map +1 -1
  381. package/dist/server/framework-request-handler.d.ts.map +1 -1
  382. package/dist/server/framework-request-handler.js +8 -2
  383. package/dist/server/framework-request-handler.js.map +1 -1
  384. package/dist/server/google-oauth.d.ts +2 -0
  385. package/dist/server/google-oauth.d.ts.map +1 -1
  386. package/dist/server/google-oauth.js +5 -0
  387. package/dist/server/google-oauth.js.map +1 -1
  388. package/dist/server/http-response-telemetry.d.ts.map +1 -1
  389. package/dist/server/http-response-telemetry.js +4 -1
  390. package/dist/server/http-response-telemetry.js.map +1 -1
  391. package/dist/server/recap-image-route.js +3 -3
  392. package/dist/server/recap-image-route.js.map +1 -1
  393. package/dist/server/security-headers.d.ts.map +1 -1
  394. package/dist/server/security-headers.js +4 -1
  395. package/dist/server/security-headers.js.map +1 -1
  396. package/dist/server/ssr-handler.d.ts.map +1 -1
  397. package/dist/server/ssr-handler.js +3 -1
  398. package/dist/server/ssr-handler.js.map +1 -1
  399. package/dist/server/transcribe-voice.d.ts +1 -1
  400. package/dist/shared/cache-control.d.ts +7 -6
  401. package/dist/shared/cache-control.d.ts.map +1 -1
  402. package/dist/shared/cache-control.js +4 -3
  403. package/dist/shared/cache-control.js.map +1 -1
  404. package/dist/templates/default/.agents/skills/security/SKILL.md +10 -0
  405. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  406. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  407. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  408. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
  409. package/docs/content/actions.mdx +1 -1
  410. package/docs/content/authentication.mdx +1 -1
  411. package/docs/content/dispatch.mdx +3 -3
  412. package/docs/content/external-agents.mdx +30 -19
  413. package/docs/content/locales/ar-SA/actions.mdx +1 -1
  414. package/docs/content/locales/ar-SA/authentication.mdx +1 -1
  415. package/docs/content/locales/ar-SA/dispatch.mdx +3 -3
  416. package/docs/content/locales/ar-SA/external-agents.mdx +23 -19
  417. package/docs/content/locales/ar-SA/mcp-clients.mdx +31 -3
  418. package/docs/content/locales/ar-SA/mcp-protocol.mdx +29 -15
  419. package/docs/content/locales/ar-SA/plan-plugin.mdx +3 -3
  420. package/docs/content/locales/ar-SA/server.mdx +2 -2
  421. package/docs/content/locales/ar-SA/skills-guide.mdx +1 -1
  422. package/docs/content/locales/ar-SA/template-assets.mdx +1 -1
  423. package/docs/content/locales/ar-SA/template-dispatch.mdx +2 -2
  424. package/docs/content/locales/ar-SA/template-plan.mdx +3 -3
  425. package/docs/content/locales/de-DE/actions.mdx +1 -1
  426. package/docs/content/locales/de-DE/authentication.mdx +1 -1
  427. package/docs/content/locales/de-DE/dispatch.mdx +3 -3
  428. package/docs/content/locales/de-DE/external-agents.mdx +23 -19
  429. package/docs/content/locales/de-DE/mcp-clients.mdx +37 -3
  430. package/docs/content/locales/de-DE/mcp-protocol.mdx +29 -15
  431. package/docs/content/locales/de-DE/plan-plugin.mdx +3 -3
  432. package/docs/content/locales/de-DE/server.mdx +2 -2
  433. package/docs/content/locales/de-DE/skills-guide.mdx +1 -1
  434. package/docs/content/locales/de-DE/template-assets.mdx +1 -1
  435. package/docs/content/locales/de-DE/template-dispatch.mdx +2 -2
  436. package/docs/content/locales/de-DE/template-plan.mdx +3 -3
  437. package/docs/content/locales/es-ES/actions.mdx +1 -1
  438. package/docs/content/locales/es-ES/authentication.mdx +1 -1
  439. package/docs/content/locales/es-ES/dispatch.mdx +3 -3
  440. package/docs/content/locales/es-ES/external-agents.mdx +32 -19
  441. package/docs/content/locales/es-ES/mcp-clients.mdx +17 -3
  442. package/docs/content/locales/es-ES/mcp-protocol.mdx +38 -15
  443. package/docs/content/locales/es-ES/plan-plugin.mdx +3 -3
  444. package/docs/content/locales/es-ES/server.mdx +2 -2
  445. package/docs/content/locales/es-ES/skills-guide.mdx +1 -1
  446. package/docs/content/locales/es-ES/template-assets.mdx +1 -1
  447. package/docs/content/locales/es-ES/template-dispatch.mdx +2 -2
  448. package/docs/content/locales/es-ES/template-plan.mdx +3 -3
  449. package/docs/content/locales/fr-FR/actions.mdx +1 -1
  450. package/docs/content/locales/fr-FR/authentication.mdx +1 -1
  451. package/docs/content/locales/fr-FR/dispatch.mdx +3 -3
  452. package/docs/content/locales/fr-FR/external-agents.mdx +23 -19
  453. package/docs/content/locales/fr-FR/mcp-clients.mdx +17 -3
  454. package/docs/content/locales/fr-FR/mcp-protocol.mdx +29 -15
  455. package/docs/content/locales/fr-FR/plan-plugin.mdx +3 -3
  456. package/docs/content/locales/fr-FR/server.mdx +2 -2
  457. package/docs/content/locales/fr-FR/skills-guide.mdx +1 -1
  458. package/docs/content/locales/fr-FR/template-assets.mdx +1 -1
  459. package/docs/content/locales/fr-FR/template-dispatch.mdx +2 -2
  460. package/docs/content/locales/fr-FR/template-plan.mdx +3 -3
  461. package/docs/content/locales/hi-IN/actions.mdx +1 -1
  462. package/docs/content/locales/hi-IN/authentication.mdx +1 -1
  463. package/docs/content/locales/hi-IN/dispatch.mdx +3 -3
  464. package/docs/content/locales/hi-IN/external-agents.mdx +31 -19
  465. package/docs/content/locales/hi-IN/mcp-clients.mdx +17 -3
  466. package/docs/content/locales/hi-IN/mcp-protocol.mdx +36 -15
  467. package/docs/content/locales/hi-IN/plan-plugin.mdx +3 -3
  468. package/docs/content/locales/hi-IN/server.mdx +2 -2
  469. package/docs/content/locales/hi-IN/skills-guide.mdx +1 -1
  470. package/docs/content/locales/hi-IN/template-assets.mdx +1 -1
  471. package/docs/content/locales/hi-IN/template-dispatch.mdx +2 -2
  472. package/docs/content/locales/hi-IN/template-plan.mdx +3 -3
  473. package/docs/content/locales/ja-JP/actions.mdx +1 -1
  474. package/docs/content/locales/ja-JP/authentication.mdx +1 -1
  475. package/docs/content/locales/ja-JP/dispatch.mdx +3 -3
  476. package/docs/content/locales/ja-JP/external-agents.mdx +23 -19
  477. package/docs/content/locales/ja-JP/mcp-clients.mdx +34 -3
  478. package/docs/content/locales/ja-JP/mcp-protocol.mdx +29 -15
  479. package/docs/content/locales/ja-JP/plan-plugin.mdx +3 -3
  480. package/docs/content/locales/ja-JP/server.mdx +2 -2
  481. package/docs/content/locales/ja-JP/skills-guide.mdx +1 -1
  482. package/docs/content/locales/ja-JP/template-assets.mdx +1 -1
  483. package/docs/content/locales/ja-JP/template-dispatch.mdx +2 -2
  484. package/docs/content/locales/ja-JP/template-plan.mdx +3 -3
  485. package/docs/content/locales/ko-KR/actions.mdx +1 -1
  486. package/docs/content/locales/ko-KR/authentication.mdx +1 -1
  487. package/docs/content/locales/ko-KR/dispatch.mdx +3 -3
  488. package/docs/content/locales/ko-KR/external-agents.mdx +30 -19
  489. package/docs/content/locales/ko-KR/mcp-clients.mdx +33 -3
  490. package/docs/content/locales/ko-KR/mcp-protocol.mdx +36 -15
  491. package/docs/content/locales/ko-KR/plan-plugin.mdx +3 -3
  492. package/docs/content/locales/ko-KR/server.mdx +2 -2
  493. package/docs/content/locales/ko-KR/skills-guide.mdx +1 -1
  494. package/docs/content/locales/ko-KR/template-assets.mdx +1 -1
  495. package/docs/content/locales/ko-KR/template-dispatch.mdx +2 -2
  496. package/docs/content/locales/ko-KR/template-plan.mdx +3 -3
  497. package/docs/content/locales/pt-BR/actions.mdx +1 -1
  498. package/docs/content/locales/pt-BR/authentication.mdx +1 -1
  499. package/docs/content/locales/pt-BR/dispatch.mdx +3 -3
  500. package/docs/content/locales/pt-BR/external-agents.mdx +32 -19
  501. package/docs/content/locales/pt-BR/mcp-clients.mdx +34 -3
  502. package/docs/content/locales/pt-BR/mcp-protocol.mdx +32 -15
  503. package/docs/content/locales/pt-BR/plan-plugin.mdx +3 -3
  504. package/docs/content/locales/pt-BR/server.mdx +2 -2
  505. package/docs/content/locales/pt-BR/skills-guide.mdx +1 -1
  506. package/docs/content/locales/pt-BR/template-assets.mdx +1 -1
  507. package/docs/content/locales/pt-BR/template-dispatch.mdx +2 -2
  508. package/docs/content/locales/pt-BR/template-plan.mdx +3 -3
  509. package/docs/content/locales/zh-CN/actions.mdx +1 -1
  510. package/docs/content/locales/zh-CN/authentication.mdx +1 -1
  511. package/docs/content/locales/zh-CN/dispatch.mdx +3 -3
  512. package/docs/content/locales/zh-CN/external-agents.mdx +23 -19
  513. package/docs/content/locales/zh-CN/mcp-clients.mdx +28 -3
  514. package/docs/content/locales/zh-CN/mcp-protocol.mdx +29 -15
  515. package/docs/content/locales/zh-CN/plan-plugin.mdx +3 -3
  516. package/docs/content/locales/zh-CN/server.mdx +2 -2
  517. package/docs/content/locales/zh-CN/skills-guide.mdx +1 -1
  518. package/docs/content/locales/zh-CN/template-assets.mdx +1 -1
  519. package/docs/content/locales/zh-CN/template-dispatch.mdx +2 -2
  520. package/docs/content/locales/zh-CN/template-plan.mdx +3 -3
  521. package/docs/content/locales/zh-TW/actions.mdx +1 -1
  522. package/docs/content/locales/zh-TW/authentication.mdx +1 -1
  523. package/docs/content/locales/zh-TW/dispatch.mdx +3 -3
  524. package/docs/content/locales/zh-TW/external-agents.mdx +23 -19
  525. package/docs/content/locales/zh-TW/mcp-clients.mdx +28 -3
  526. package/docs/content/locales/zh-TW/mcp-protocol.mdx +30 -15
  527. package/docs/content/locales/zh-TW/plan-plugin.mdx +3 -3
  528. package/docs/content/locales/zh-TW/server.mdx +2 -2
  529. package/docs/content/locales/zh-TW/skills-guide.mdx +1 -1
  530. package/docs/content/locales/zh-TW/template-assets.mdx +1 -1
  531. package/docs/content/locales/zh-TW/template-dispatch.mdx +2 -2
  532. package/docs/content/locales/zh-TW/template-plan.mdx +3 -3
  533. package/docs/content/mcp-clients.mdx +31 -4
  534. package/docs/content/mcp-protocol.mdx +35 -15
  535. package/docs/content/plan-plugin.mdx +3 -3
  536. package/docs/content/server.mdx +2 -2
  537. package/docs/content/skills-guide.mdx +1 -1
  538. package/docs/content/template-assets.mdx +1 -1
  539. package/docs/content/template-dispatch.mdx +2 -2
  540. package/docs/content/template-plan.mdx +3 -3
  541. package/package.json +1 -1
  542. package/src/templates/default/.agents/skills/security/SKILL.md +10 -0
  543. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  544. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  545. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  546. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
@@ -1,20 +1,21 @@
1
1
  /**
2
- * `/_agent-native/mcp/connect` — frictionless external-agent connection.
2
+ * `/mcp/connect` — frictionless external-agent connection. The legacy
3
+ * `/_agent-native/mcp/connect` alias is mounted by the core route plugin.
3
4
  *
4
5
  * A logged-in user on a deployed agent-native app (e.g. mail.agent-native.com)
5
6
  * mints a per-user, scoped, revocable MCP bearer token WITHOUT ever copying a
6
7
  * shared deployment secret. Two surfaces:
7
8
  *
8
- * 1. Browser — `GET /connect` renders a minimal in-app page (same inline
9
+ * 1. Browser — `GET /mcp/connect` renders a minimal in-app page (same inline
9
10
  * HTML approach as the auth pages). The Authorize button POSTs to
10
11
  * `/connect/token`, then shows the ready-to-paste `.mcp.json` entry, the
11
12
  * `agent-native connect <origin>` one-liner, and the user's existing
12
13
  * tokens with Revoke buttons.
13
14
  * 2. CLI — an OAuth-2.0-device-authorization-style flow:
14
- * POST /connect/device/start (unauth) → device_code + user_code
15
- * GET /connect?user_code=… (browser) → user signs in & approves
16
- * POST /connect/device/authorize (session) → binds user to the code
17
- * POST /connect/device/poll (unauth) → mints + returns the token
15
+ * POST /mcp/connect/device/start (unauth) → device_code + user_code
16
+ * GET /mcp/connect?user_code=… (browser) → user signs in & approves
17
+ * POST /mcp/connect/device/authorize (session) → binds user to the code
18
+ * POST /mcp/connect/device/poll (unauth) → mints + returns the token
18
19
  *
19
20
  * When A2A_SECRET exists, the minted token reuses the existing A2A signer
20
21
  * (`signA2AToken`) and adds a random `jti` + `scope: "mcp-connect"` claim so
@@ -64,6 +65,7 @@ import {
64
65
  MCP_OAUTH_DEFAULT_SCOPE,
65
66
  signMcpOAuthAccessToken,
66
67
  } from "./oauth-token.js";
68
+ import { MCP_PUBLIC_ROUTE_PREFIX } from "./route-paths.js";
67
69
 
68
70
  /** Device-flow poll interval hint (seconds). */
69
71
  const DEVICE_POLL_INTERVAL_S = 3;
@@ -383,7 +385,7 @@ function mcpResultPayload(
383
385
  }
384
386
 
385
387
  function mcpResourceUrl(appUrl: string): string {
386
- return `${appUrl}/_agent-native/mcp`;
388
+ return `${appUrl}${MCP_PUBLIC_ROUTE_PREFIX}`;
387
389
  }
388
390
 
389
391
  // ---------------------------------------------------------------------------
@@ -415,7 +417,7 @@ function renderConnectPage(params: {
415
417
  params;
416
418
  const safeEmail = escapeHtml(email);
417
419
  const safeApp = escapeHtml(appName);
418
- const mcpUrl = `${appUrl}/_agent-native/mcp`;
420
+ const mcpUrl = `${appUrl}${MCP_PUBLIC_ROUTE_PREFIX}`;
419
421
  const safeMcpUrl = escapeHtml(mcpUrl);
420
422
  const safeServerId = escapeHtml(serverId);
421
423
  const safeClaudeCodeCmd = escapeHtml(
@@ -948,7 +950,7 @@ function renderConnectPage(params: {
948
950
  </div>
949
951
  <script>
950
952
  (function () {
951
- var BASE = ${JSON.stringify(joinAppPath(connectBasePath, "/_agent-native/mcp/connect"))};
953
+ var BASE = ${JSON.stringify(joinAppPath(connectBasePath, MCP_PUBLIC_ROUTE_PREFIX + "/connect"))};
952
954
  var USER_CODE = ${JSON.stringify(safeUserCode || null)};
953
955
  var msgEl = document.getElementById("msg");
954
956
  var connectionsEl = document.getElementById("connections");
@@ -1182,10 +1184,11 @@ function renderConnectPage(params: {
1182
1184
  // ---------------------------------------------------------------------------
1183
1185
 
1184
1186
  /**
1185
- * Handle a `/_agent-native/mcp/connect[...]` request. `subpath` is the part
1186
- * after `/connect` (empty string = the page itself, otherwise e.g.
1187
- * `/token`, `/device/start`). The core-routes-plugin computes it from the
1188
- * stripped event path so this module stays mount-agnostic.
1187
+ * Handle a `/mcp/connect[...]` request. The legacy
1188
+ * `/_agent-native/mcp/connect` alias is mounted too. `subpath` is the part
1189
+ * after `/connect` (empty string = the page itself, otherwise e.g. `/token`,
1190
+ * `/device/start`). The core-routes-plugin computes it from the stripped event
1191
+ * path so this module stays mount-agnostic.
1189
1192
  */
1190
1193
  export async function handleMcpConnect(
1191
1194
  event: H3Event,
@@ -1291,7 +1294,7 @@ export async function handleMcpConnect(
1291
1294
  if (method !== "POST") return json({ error: "Method not allowed" }, 405);
1292
1295
  try {
1293
1296
  const row = await createDeviceCode();
1294
- const verificationUri = `${appUrl}/_agent-native/mcp/connect`;
1297
+ const verificationUri = `${appUrl}${MCP_PUBLIC_ROUTE_PREFIX}/connect`;
1295
1298
  return json({
1296
1299
  device_code: row.deviceCode,
1297
1300
  user_code: row.userCode,
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * These routes let MCP hosts such as Claude Code and ChatGPT authenticate
5
5
  * through their native remote-MCP OAuth flow instead of pasting bearer tokens.
6
- * The issued access tokens are audience-bound to `/_agent-native/mcp`, carry
6
+ * The issued access tokens are audience-bound to `/mcp`, carry
7
7
  * the same user/org identity as the existing connect flow, and are mediated by
8
8
  * `verifyAuth` before any MCP tool/resource request runs.
9
9
  */
@@ -35,6 +35,7 @@ import {
35
35
  normalizeOAuthScope,
36
36
  signMcpOAuthAccessToken,
37
37
  } from "./oauth-token.js";
38
+ import { MCP_PUBLIC_ROUTE_PREFIX, MCP_ROUTE_PREFIXES } from "./route-paths.js";
38
39
 
39
40
  export interface McpOAuthRouteOptions {
40
41
  appId?: string;
@@ -172,7 +173,16 @@ export function getMcpOAuthIssuer(event: H3Event): string | undefined {
172
173
  export function getMcpOAuthResource(event: H3Event): string | undefined {
173
174
  const issuer = getMcpOAuthIssuer(event);
174
175
  if (!issuer) return undefined;
175
- return `${issuer}/_agent-native/mcp`;
176
+ return `${issuer}${MCP_PUBLIC_ROUTE_PREFIX}`;
177
+ }
178
+
179
+ function mcpResourcesForIssuer(issuer: string): string[] {
180
+ return [
181
+ MCP_PUBLIC_ROUTE_PREFIX,
182
+ ...MCP_ROUTE_PREFIXES.filter(
183
+ (prefix) => prefix !== MCP_PUBLIC_ROUTE_PREFIX,
184
+ ),
185
+ ].map((prefix) => `${issuer}${prefix}`);
176
186
  }
177
187
 
178
188
  /**
@@ -185,18 +195,21 @@ export function getMcpOAuthResource(event: H3Event): string | undefined {
185
195
  * accepts either without issuing a 401.
186
196
  */
187
197
  export function getMcpOAuthAudiences(event: H3Event): string[] {
188
- const derived = getMcpOAuthResource(event);
189
- const configured = (() => {
198
+ const configuredIssuer = (() => {
190
199
  const base = configuredPublicBaseUrl();
191
200
  if (!base) return undefined;
192
201
  // Re-apply base path if present so the configured resource is also
193
202
  // base-path-aware, consistent with how getMcpOAuthResource computes it.
194
- const withPath = appendConfiguredBasePath(base);
195
- return `${withPath}/_agent-native/mcp`;
203
+ return appendConfiguredBasePath(base);
196
204
  })();
197
205
  const seen = new Set<string>();
198
206
  const out: string[] = [];
199
- for (const r of [derived, configured]) {
207
+ for (const r of [
208
+ ...(getMcpOAuthIssuer(event)
209
+ ? mcpResourcesForIssuer(getMcpOAuthIssuer(event) as string)
210
+ : []),
211
+ ...(configuredIssuer ? mcpResourcesForIssuer(configuredIssuer) : []),
212
+ ]) {
200
213
  const n = r?.replace(/\/+$/, "");
201
214
  if (n && !seen.has(n)) {
202
215
  seen.add(n);
@@ -224,17 +237,21 @@ export function buildMcpOAuthChallenge(event: H3Event): string {
224
237
 
225
238
  function authorizationEndpoint(event: H3Event): string | undefined {
226
239
  const issuer = getMcpOAuthIssuer(event);
227
- return issuer ? `${issuer}/_agent-native/mcp/oauth/authorize` : undefined;
240
+ return issuer
241
+ ? `${issuer}${MCP_PUBLIC_ROUTE_PREFIX}/oauth/authorize`
242
+ : undefined;
228
243
  }
229
244
 
230
245
  function tokenEndpoint(event: H3Event): string | undefined {
231
246
  const issuer = getMcpOAuthIssuer(event);
232
- return issuer ? `${issuer}/_agent-native/mcp/oauth/token` : undefined;
247
+ return issuer ? `${issuer}${MCP_PUBLIC_ROUTE_PREFIX}/oauth/token` : undefined;
233
248
  }
234
249
 
235
250
  function registrationEndpoint(event: H3Event): string | undefined {
236
251
  const issuer = getMcpOAuthIssuer(event);
237
- return issuer ? `${issuer}/_agent-native/mcp/oauth/register` : undefined;
252
+ return issuer
253
+ ? `${issuer}${MCP_PUBLIC_ROUTE_PREFIX}/oauth/register`
254
+ : undefined;
238
255
  }
239
256
 
240
257
  export function handleMcpOAuthProtectedResourceMetadata(
@@ -707,8 +724,11 @@ async function handleAuthorize(
707
724
  const state = params.state;
708
725
  const clientId = params.client_id;
709
726
  const redirectUri = params.redirect_uri;
710
- const resource = params.resource || getMcpOAuthResource(event);
711
- const expectedResource = getMcpOAuthResource(event);
727
+ const resource = (params.resource || getMcpOAuthResource(event))?.replace(
728
+ /\/+$/,
729
+ "",
730
+ );
731
+ const expectedResources = getMcpOAuthAudiences(event);
712
732
 
713
733
  if (params.response_type !== "code") {
714
734
  return oauthError(
@@ -716,7 +736,12 @@ async function handleAuthorize(
716
736
  "response_type must be code",
717
737
  );
718
738
  }
719
- if (!clientId || !redirectUri || !resource || resource !== expectedResource) {
739
+ if (
740
+ !clientId ||
741
+ !redirectUri ||
742
+ !resource ||
743
+ !expectedResources.includes(resource)
744
+ ) {
720
745
  return oauthError("invalid_request", "Invalid OAuth authorization request");
721
746
  }
722
747
  if (params.code_challenge_method !== "S256" || !params.code_challenge) {
@@ -0,0 +1,34 @@
1
+ /**
2
+ * MCP's public protocol path and the framework path kept for compatibility.
3
+ *
4
+ * Only the protocol and its OAuth/connect companions use the public alias.
5
+ * Other framework-owned MCP management routes remain under `/_agent-native`.
6
+ */
7
+ export const MCP_PUBLIC_ROUTE_PREFIX = "/mcp";
8
+ export const MCP_LEGACY_ROUTE_PREFIX = "/_agent-native/mcp";
9
+
10
+ export const MCP_ROUTE_PREFIXES = [
11
+ MCP_LEGACY_ROUTE_PREFIX,
12
+ MCP_PUBLIC_ROUTE_PREFIX,
13
+ ] as const;
14
+
15
+ export function joinMcpRoute(prefix: string, suffix: string): string {
16
+ const normalizedSuffix = suffix.startsWith("/") ? suffix : `/${suffix}`;
17
+ return `${prefix}${normalizedSuffix}` || normalizedSuffix;
18
+ }
19
+
20
+ export function isMcpPublicPath(pathname: string): boolean {
21
+ return (
22
+ pathname === MCP_PUBLIC_ROUTE_PREFIX ||
23
+ pathname.startsWith(`${MCP_PUBLIC_ROUTE_PREFIX}/`)
24
+ );
25
+ }
26
+
27
+ export function isMcpProtocolPath(pathname: string): boolean {
28
+ return (
29
+ pathname === MCP_PUBLIC_ROUTE_PREFIX ||
30
+ pathname === MCP_LEGACY_ROUTE_PREFIX ||
31
+ pathname === `${MCP_PUBLIC_ROUTE_PREFIX}/` ||
32
+ pathname === `${MCP_LEGACY_ROUTE_PREFIX}/`
33
+ );
34
+ }
@@ -28,6 +28,11 @@ import {
28
28
  getMcpOAuthProtectedResourceMetadataUrl,
29
29
  getMcpOAuthResource,
30
30
  } from "./oauth-route.js";
31
+ import {
32
+ MCP_PUBLIC_ROUTE_PREFIX,
33
+ MCP_ROUTE_PREFIXES,
34
+ joinMcpRoute,
35
+ } from "./route-paths.js";
31
36
 
32
37
  // Re-export the shared MCP server builder + types so the stdio transport and
33
38
  // any (future) external importer of `@agent-native/core/mcp` keep resolving
@@ -183,7 +188,7 @@ function buildWebRequest(event: H3Event, method: string): Request {
183
188
  forwardedProto?.split(",")[0]?.trim() ||
184
189
  (/^(localhost|127\.0\.0\.1)(:|$)/.test(host) ? "http" : "https");
185
190
  const basePath = getConfiguredAppBasePath();
186
- const url = `${proto}://${host}${basePath}/_agent-native/mcp`;
191
+ const url = `${proto}://${host}${basePath}${MCP_PUBLIC_ROUTE_PREFIX}`;
187
192
 
188
193
  // No body here on purpose: the JSON-RPC payload is forwarded via the
189
194
  // transport's `parsedBody` option (the same mechanism the Node transport
@@ -220,7 +225,7 @@ function buildUnauthorizedBody(event: H3Event): {
220
225
  ? `npx @agent-native/core@latest connect ${issuer}`
221
226
  : undefined;
222
227
  const authorizeUrl = issuer
223
- ? `${issuer}/_agent-native/mcp/oauth/authorize`
228
+ ? `${issuer}${MCP_PUBLIC_ROUTE_PREFIX}/oauth/authorize`
224
229
  : undefined;
225
230
  const message = command
226
231
  ? `Authentication required. Run \`${command}\` to re-authenticate this ` +
@@ -454,7 +459,8 @@ export async function handleMcpRequest(
454
459
  /**
455
460
  * Mount an MCP remote server on an H3/Nitro app.
456
461
  *
457
- * Endpoint: `{routePrefix}/mcp` (default `/_agent-native/mcp`)
462
+ * Endpoints: `/mcp` (public) and `/_agent-native/mcp` (compatibility).
463
+ * A custom route prefix only mounts that custom endpoint.
458
464
  *
459
465
  * Uses stateless Streamable HTTP transport — no in-memory sessions, JSON
460
466
  * request/response (no SSE), and no standalone GET stream, so it survives
@@ -473,15 +479,20 @@ export function mountMCP(
473
479
  config: MCPConfig,
474
480
  routePrefix = "/_agent-native",
475
481
  ): void {
476
- getH3App(nitroApp).use(
477
- `${routePrefix}/mcp`,
478
- defineEventHandler(async (event) => {
479
- return handleMcpRequest(event as H3Event, config);
480
- }),
481
- );
482
+ const routePaths =
483
+ routePrefix === "/_agent-native"
484
+ ? [...MCP_ROUTE_PREFIXES]
485
+ : [joinMcpRoute(routePrefix, "/mcp")];
486
+ const handler = defineEventHandler(async (event) => {
487
+ return handleMcpRequest(event as H3Event, config);
488
+ });
489
+
490
+ for (const routePath of routePaths) {
491
+ getH3App(nitroApp).use(routePath, handler);
492
+ }
482
493
 
483
494
  if (process.env.DEBUG)
484
495
  console.log(
485
- `[mcp] Mounted MCP server at ${routePrefix}/mcp (${Object.keys(config.actions).length} tools${config.askAgent ? " + ask-agent" : ""})`,
496
+ `[mcp] Mounted MCP server at ${routePaths.join(" and ")} (${Object.keys(config.actions).length} tools${config.askAgent ? " + ask-agent" : ""})`,
486
497
  );
487
498
  }
@@ -7,12 +7,13 @@
7
7
  *
8
8
  * - **proxy (default)** — connect an MCP `Client` over
9
9
  * `StreamableHTTPClientTransport` to the *already-running* local app's
10
- * `http://127.0.0.1:<port>/_agent-native/mcp`, and run a stdio `Server`
11
- * that forwards tools and optional MCP App resources to it. The live app
12
- * is the single source of truth: HMR'd actions, the real registry, correct
13
- * per-request deep links, and tenant scoping all come for free. If the
14
- * app isn't running, we wait briefly for it (the workspace gateway boots
15
- * it lazily on first request).
10
+ * `http://127.0.0.1:<port>/mcp` (falling back to the legacy
11
+ * `/_agent-native/mcp` path), and run a stdio `Server` that forwards tools
12
+ * and optional MCP App resources to it. The live app is the single source
13
+ * of truth: HMR'd actions, the real registry, correct per-request deep
14
+ * links, and tenant scoping all come for free. If the app isn't running,
15
+ * we wait briefly for it (the workspace gateway boots it lazily on first
16
+ * request).
16
17
  *
17
18
  * - **standalone (`--standalone`)** — no running server, no HMR. Build the
18
19
  * MCP server in-process from `autoDiscoverActions(cwd)` +
@@ -25,6 +26,10 @@
25
26
 
26
27
  import type { ServerCapabilities } from "@modelcontextprotocol/sdk/types.js";
27
28
 
29
+ import {
30
+ MCP_LEGACY_ROUTE_PREFIX,
31
+ MCP_PUBLIC_ROUTE_PREFIX,
32
+ } from "./route-paths.js";
28
33
  import { resolveLocalAppOrigin } from "./workspace-resolve.js";
29
34
 
30
35
  export interface RunMCPStdioOptions {
@@ -42,7 +47,10 @@ export interface RunMCPStdioOptions {
42
47
  waitForAppMs?: number;
43
48
  }
44
49
 
45
- const MCP_SUBPATH = "/_agent-native/mcp";
50
+ const MCP_SUBPATHS = [
51
+ MCP_PUBLIC_ROUTE_PREFIX,
52
+ MCP_LEGACY_ROUTE_PREFIX,
53
+ ] as const;
46
54
 
47
55
  function log(msg: string): void {
48
56
  // stderr only — stdout is the MCP protocol channel and must stay clean.
@@ -74,9 +82,13 @@ function authHeaders(env: NodeJS.ProcessEnv): Record<string, string> {
74
82
  return headers;
75
83
  }
76
84
 
77
- async function probeOrigin(origin: string, timeoutMs = 800): Promise<boolean> {
85
+ async function probeOrigin(
86
+ origin: string,
87
+ subpath: string,
88
+ timeoutMs = 800,
89
+ ): Promise<boolean> {
78
90
  try {
79
- const res = await fetch(`${origin}${MCP_SUBPATH}`, {
91
+ const res = await fetch(`${origin}${subpath}`, {
80
92
  method: "GET",
81
93
  signal: AbortSignal.timeout(timeoutMs),
82
94
  });
@@ -87,6 +99,13 @@ async function probeOrigin(origin: string, timeoutMs = 800): Promise<boolean> {
87
99
  }
88
100
  }
89
101
 
102
+ async function resolveMcpSubpath(origin: string): Promise<string | null> {
103
+ for (const subpath of MCP_SUBPATHS) {
104
+ if (await probeOrigin(origin, subpath)) return subpath;
105
+ }
106
+ return null;
107
+ }
108
+
90
109
  /**
91
110
  * Proxy mode: stdio Server ⇄ HTTP Client to the running app.
92
111
  *
@@ -103,27 +122,26 @@ async function runProxy(opts: RunMCPStdioOptions): Promise<void> {
103
122
  port: opts.port,
104
123
  });
105
124
  const env = opts.env ?? process.env;
106
- const target = `${origin}${MCP_SUBPATH}`;
107
-
108
125
  // Wait for the app to come up. The workspace gateway lazily boots an app's
109
126
  // dev server on first request, so a fresh `mcp serve` may briefly race the
110
127
  // boot. Hit the gateway path too so the lazy start is triggered.
111
128
  const deadline = Date.now() + (opts.waitForAppMs ?? 60_000);
112
- let up = await probeOrigin(origin);
113
- if (!up) {
129
+ let mcpSubpath = await resolveMcpSubpath(origin);
130
+ if (!mcpSubpath) {
114
131
  log(`Waiting for ${appId} at ${origin} …`);
115
- while (!up && Date.now() < deadline) {
132
+ while (!mcpSubpath && Date.now() < deadline) {
116
133
  await new Promise((r) => setTimeout(r, 750));
117
- up = await probeOrigin(origin);
134
+ mcpSubpath = await resolveMcpSubpath(origin);
118
135
  }
119
136
  }
120
- if (!up) {
137
+ if (!mcpSubpath) {
121
138
  throw new Error(
122
139
  `Timed out waiting for the local app at ${origin}. Start it with ` +
123
140
  `\`agent-native dev\` (or \`agent-native workspace-dev\`), or run ` +
124
141
  `\`agent-native mcp serve --standalone\` to build the server from disk.`,
125
142
  );
126
143
  }
144
+ const target = `${origin}${mcpSubpath}`;
127
145
 
128
146
  const { Client } = await import("@modelcontextprotocol/sdk/client/index.js");
129
147
  const { StreamableHTTPClientTransport } =
@@ -213,7 +213,8 @@ export async function resolveWorkspace(
213
213
  /**
214
214
  * Resolve the local app the stdio proxy should connect its MCP HTTP client
215
215
  * to. Honours an explicit `--app` / appId and `--port` / explicit port.
216
- * Returns the chosen app's origin (where `/_agent-native/mcp` is mounted).
216
+ * Returns the chosen app's origin (where `/mcp` is mounted; the legacy
217
+ * `/_agent-native/mcp` alias is supported too).
217
218
  *
218
219
  * Order of precedence:
219
220
  * 1. explicit `port` → http://127.0.0.1:<port>
@@ -954,9 +954,11 @@ function firstPartyMcpAudienceForUrl(rawUrl: string): string | undefined {
954
954
  try {
955
955
  const url = new URL(rawUrl);
956
956
  const pathname = url.pathname.replace(/\/+$/, "");
957
- url.pathname = pathname.endsWith("/_agent-native/mcp")
958
- ? pathname
959
- : `${pathname}/_agent-native/mcp`;
957
+ if (pathname.endsWith("/_agent-native/mcp")) {
958
+ url.pathname = `${pathname.slice(0, -"/_agent-native/mcp".length)}/mcp`;
959
+ } else {
960
+ url.pathname = pathname.endsWith("/mcp") ? pathname : `${pathname}/mcp`;
961
+ }
960
962
  url.search = "";
961
963
  url.hash = "";
962
964
  return url.toString().replace(/\/+$/, "");
@@ -438,22 +438,22 @@ function normalizeEndpointPath(pathname: string): string {
438
438
  return pathname.replace(/\/+$/, "") || "/";
439
439
  }
440
440
 
441
- function expectedFirstPartyMcpUrl(appUrl: string): URL | null {
441
+ function expectedFirstPartyMcpUrls(appUrl: string): URL[] {
442
442
  try {
443
- return new URL(`${appUrl.replace(/\/+$/, "")}/_agent-native/mcp`);
443
+ const base = appUrl.replace(/\/+$/, "");
444
+ return [new URL(`${base}/mcp`), new URL(`${base}/_agent-native/mcp`)];
444
445
  } catch {
445
- return null;
446
+ return [];
446
447
  }
447
448
  }
448
449
 
449
450
  function sameFirstPartyMcpEndpoint(endpointUrl: URL, appUrl: string): boolean {
450
- const expected = expectedFirstPartyMcpUrl(appUrl);
451
- if (!expected) return false;
452
- return (
453
- endpointUrl.origin === expected.origin &&
454
- normalizeEndpointPath(endpointUrl.pathname) ===
455
- normalizeEndpointPath(expected.pathname) &&
456
- endpointUrl.search === expected.search
451
+ return expectedFirstPartyMcpUrls(appUrl).some(
452
+ (expected) =>
453
+ endpointUrl.origin === expected.origin &&
454
+ normalizeEndpointPath(endpointUrl.pathname) ===
455
+ normalizeEndpointPath(expected.pathname) &&
456
+ endpointUrl.search === expected.search,
457
457
  );
458
458
  }
459
459
 
@@ -168,6 +168,7 @@ import {
168
168
  import { mountRealtimeVoiceRoutes } from "./realtime-voice.js";
169
169
  import {
170
170
  runWithRequestContext,
171
+ getRequestContext,
171
172
  getRequestOrgId,
172
173
  getRequestUserEmail,
173
174
  getRequestRunContext,
@@ -1255,6 +1256,35 @@ export function createAgentChatPlugin(
1255
1256
  const { getOwnerActiveApiKey } =
1256
1257
  await import("../agent/production-agent.js");
1257
1258
  const ownerApiKey = await getOwnerActiveApiKey(userEmail);
1259
+ // A2A runs are reconstructed in a fresh processor request, so they
1260
+ // do not pass through the interactive handler's prepareRun hook.
1261
+ // Seed the same mutable run context before resolving the engine and
1262
+ // building tools. Provider credentials, team/fetch helpers, and
1263
+ // other action closures read this context rather than the engine
1264
+ // argument alone; without it delegated runs can silently fall back
1265
+ // to an unscoped/unconfigured provider path even though interactive
1266
+ // chat works for the same owner.
1267
+ const a2aRunContext = ensureRequestRunContext();
1268
+ if (a2aRunContext) {
1269
+ a2aRunContext.owner = userEmail;
1270
+ a2aRunContext.userApiKey = ownerApiKey;
1271
+ // The async processor restores the original request origin from
1272
+ // task metadata. Only derive a fallback for synchronous A2A calls
1273
+ // where the inbound event is still the caller request.
1274
+ if (!a2aRunContext.requestOrigin) {
1275
+ const restoredOrigin = getRequestContext()?.requestOrigin;
1276
+ if (restoredOrigin) {
1277
+ a2aRunContext.requestOrigin = restoredOrigin;
1278
+ }
1279
+ }
1280
+ if (!a2aRunContext.requestOrigin) {
1281
+ try {
1282
+ a2aRunContext.requestOrigin = getOrigin(context.event as any);
1283
+ } catch {
1284
+ // Keep the owner context even when no browser origin exists.
1285
+ }
1286
+ }
1287
+ }
1258
1288
  const a2aEngine = await resolveEngine({
1259
1289
  engineOption: options?.engine,
1260
1290
  apiKey: ownerApiKey ?? options?.apiKey,
@@ -1274,14 +1304,6 @@ export function createAgentChatPlugin(
1274
1304
  ? ""
1275
1305
  : await buildSchemaBlock(owner, databaseToolsMode);
1276
1306
  const extra = await resolveExtraContext(context.event, owner);
1277
- // Stable content first, most-volatile-per-day last: the
1278
- // runtime-context block is appended after resources/schema/extra so
1279
- // a day rollover (or the resources/extra content changing) only
1280
- // invalidates the cached prompt prefix as late as possible.
1281
- const runtimeContext = runtimeContextForEvent(context.event);
1282
- const systemPrompt = devActive
1283
- ? devPrompt + resources + schemaBlock + extra + runtimeContext
1284
- : basePrompt + resources + schemaBlock + extra + runtimeContext;
1285
1307
 
1286
1308
  const a2aModelCandidate =
1287
1309
  options?.model ??
@@ -1290,6 +1312,34 @@ export function createAgentChatPlugin(
1290
1312
  })) ??
1291
1313
  a2aEngine.defaultModel;
1292
1314
  const model = normalizeModelForEngine(a2aEngine, a2aModelCandidate);
1315
+ if (a2aRunContext) {
1316
+ a2aRunContext.engine = a2aEngine;
1317
+ a2aRunContext.model = model;
1318
+ }
1319
+
1320
+ // Keep delegated runs aligned with the interactive production
1321
+ // prompt's model-specific behavior without importing interactive
1322
+ // onboarding into a background/cross-app task.
1323
+ const modelOverlay = getModelFamilyOverlay(model);
1324
+ // Stable content first, most-volatile-per-day last: the
1325
+ // runtime-context block is appended after resources/schema/extra so
1326
+ // a day rollover (or the resources/extra content changing) only
1327
+ // invalidates the cached prompt prefix as late as possible.
1328
+ const runtimeContext = runtimeContextForEvent(context.event);
1329
+ const systemPrompt = devActive
1330
+ ? devPrompt +
1331
+ resources +
1332
+ schemaBlock +
1333
+ extra +
1334
+ modelOverlay +
1335
+ runtimeContext
1336
+ : basePrompt +
1337
+ resources +
1338
+ schemaBlock +
1339
+ extra +
1340
+ modelOverlay +
1341
+ runtimeContext;
1342
+ if (a2aRunContext) a2aRunContext.systemPrompt = systemPrompt;
1293
1343
 
1294
1344
  // Build tools — same as interactive handler but WITHOUT call-agent
1295
1345
  // to prevent infinite recursive A2A loops (agent calling itself).
@@ -5343,6 +5393,7 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
5343
5393
  "/_agent-native/actions",
5344
5394
  "/_agent-native/agent-model-defaults",
5345
5395
  "/_agent-native/mcp",
5396
+ "/mcp",
5346
5397
  ],
5347
5398
  });
5348
5399
  };
@@ -74,6 +74,11 @@ import {
74
74
  } from "../db/client.js";
75
75
  import { ensureColumnExists, ensureTableExists } from "../db/ddl-guard.js";
76
76
  import { widenIntColumnsToBigInt } from "../db/widen-columns.js";
77
+ import {
78
+ MCP_LEGACY_ROUTE_PREFIX,
79
+ MCP_PUBLIC_ROUTE_PREFIX,
80
+ isMcpProtocolPath,
81
+ } from "../mcp/route-paths.js";
77
82
  import { readBody } from "../server/h3-helpers.js";
78
83
  import { putSetting } from "../settings/store.js";
79
84
  import { DEFAULT_SSR_CACHE_HEADERS } from "../shared/cache-control.js";
@@ -718,8 +723,9 @@ async function getBearerLegacySession(
718
723
  * `agent-native connect` mints this token for the local Plans publish flow and
719
724
  * POSTs it to the HOSTED action route
720
725
  * `/_agent-native/actions/import-visual-plan-source`. That token is audience-
721
- * bound to the app's MCP resource (`{appUrl}/_agent-native/mcp`), not to the
722
- * legacy `sessions` table so the legacy bearer lookup above never matches it.
726
+ * bound to the app's canonical MCP resource (`{appUrl}/mcp`; the legacy
727
+ * `/_agent-native/mcp` resource is also accepted), not to the legacy `sessions`
728
+ * table — so the legacy bearer lookup above never matches it.
723
729
  * Reuse the MCP surface's canonical `verifyAuth` here so the HTTP action surface
724
730
  * honors EXACTLY the tokens the MCP endpoint honors: same signature check, same
725
731
  * audience binding to THIS app's resource, same connect-token revocation gate.
@@ -740,13 +746,13 @@ async function getMcpOAuthBearerSession(
740
746
  if (!bearerToken) return null;
741
747
 
742
748
  try {
743
- const [{ getMcpOAuthResource }, { verifyAuth, resolveOrgIdFromDomain }] =
749
+ const [{ getMcpOAuthAudiences }, { verifyAuth, resolveOrgIdFromDomain }] =
744
750
  await Promise.all([
745
751
  import("../mcp/oauth-route.js"),
746
752
  import("../mcp/build-server.js"),
747
753
  ]);
748
754
  const result = await verifyAuth(authHeader, undefined, {
749
- resourceUrl: getMcpOAuthResource(event),
755
+ resourceUrl: getMcpOAuthAudiences(event),
750
756
  allowDevOpen: false,
751
757
  });
752
758
  const identity = result.authed ? result.identity : undefined;
@@ -1775,7 +1781,11 @@ function createAuthGuardFn(): (
1775
1781
  // the stdio proxy or HTTP can never reach it. Exact protocol endpoint only:
1776
1782
  // tolerate the common trailing slash, but keep
1777
1783
  // `/_agent-native/mcp/*` management subroutes on normal session auth.
1778
- if (p === "/_agent-native/mcp" || p === "/_agent-native/mcp/") {
1784
+ if (
1785
+ isMcpProtocolPath(p) ||
1786
+ p === `${MCP_PUBLIC_ROUTE_PREFIX}/` ||
1787
+ p === `${MCP_LEGACY_ROUTE_PREFIX}/`
1788
+ ) {
1779
1789
  return;
1780
1790
  }
1781
1791
 
@@ -1806,7 +1816,13 @@ function createAuthGuardFn(): (
1806
1816
  p === "/_agent-native/mcp/connect/device/poll" ||
1807
1817
  p === "/_agent-native/mcp/oauth/authorize" ||
1808
1818
  p === "/_agent-native/mcp/oauth/token" ||
1809
- p === "/_agent-native/mcp/oauth/register"
1819
+ p === "/_agent-native/mcp/oauth/register" ||
1820
+ p === `${MCP_PUBLIC_ROUTE_PREFIX}/connect` ||
1821
+ p === `${MCP_PUBLIC_ROUTE_PREFIX}/connect/device/start` ||
1822
+ p === `${MCP_PUBLIC_ROUTE_PREFIX}/connect/device/poll` ||
1823
+ p === `${MCP_PUBLIC_ROUTE_PREFIX}/oauth/authorize` ||
1824
+ p === `${MCP_PUBLIC_ROUTE_PREFIX}/oauth/token` ||
1825
+ p === `${MCP_PUBLIC_ROUTE_PREFIX}/oauth/register`
1810
1826
  ) {
1811
1827
  return;
1812
1828
  }