@agent-native/core 0.98.17 → 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 (545) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +15 -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 +42 -9
  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/routes.d.ts +2 -2
  315. package/dist/collab/struct-routes.d.ts +1 -1
  316. package/dist/embedding/agent.d.ts.map +1 -1
  317. package/dist/embedding/agent.js +6 -7
  318. package/dist/embedding/agent.js.map +1 -1
  319. package/dist/file-upload/actions/upload-image.d.ts +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 +3 -3
  363. package/dist/observability/routes.d.ts +5 -5
  364. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  365. package/dist/resources/handlers.d.ts +2 -2
  366. package/dist/secrets/routes.d.ts +9 -9
  367. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  368. package/dist/server/agent-chat-plugin.js +43 -11
  369. package/dist/server/agent-chat-plugin.js.map +1 -1
  370. package/dist/server/agent-engine-api-key-route.d.ts +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/shared/cache-control.d.ts +7 -6
  400. package/dist/shared/cache-control.d.ts.map +1 -1
  401. package/dist/shared/cache-control.js +4 -3
  402. package/dist/shared/cache-control.js.map +1 -1
  403. package/dist/templates/default/.agents/skills/security/SKILL.md +10 -0
  404. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  405. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  406. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  407. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
  408. package/docs/content/actions.mdx +1 -1
  409. package/docs/content/authentication.mdx +1 -1
  410. package/docs/content/dispatch.mdx +3 -3
  411. package/docs/content/external-agents.mdx +30 -19
  412. package/docs/content/locales/ar-SA/actions.mdx +1 -1
  413. package/docs/content/locales/ar-SA/authentication.mdx +1 -1
  414. package/docs/content/locales/ar-SA/dispatch.mdx +3 -3
  415. package/docs/content/locales/ar-SA/external-agents.mdx +23 -19
  416. package/docs/content/locales/ar-SA/mcp-clients.mdx +31 -3
  417. package/docs/content/locales/ar-SA/mcp-protocol.mdx +29 -15
  418. package/docs/content/locales/ar-SA/plan-plugin.mdx +3 -3
  419. package/docs/content/locales/ar-SA/server.mdx +2 -2
  420. package/docs/content/locales/ar-SA/skills-guide.mdx +1 -1
  421. package/docs/content/locales/ar-SA/template-assets.mdx +1 -1
  422. package/docs/content/locales/ar-SA/template-dispatch.mdx +2 -2
  423. package/docs/content/locales/ar-SA/template-plan.mdx +3 -3
  424. package/docs/content/locales/de-DE/actions.mdx +1 -1
  425. package/docs/content/locales/de-DE/authentication.mdx +1 -1
  426. package/docs/content/locales/de-DE/dispatch.mdx +3 -3
  427. package/docs/content/locales/de-DE/external-agents.mdx +23 -19
  428. package/docs/content/locales/de-DE/mcp-clients.mdx +37 -3
  429. package/docs/content/locales/de-DE/mcp-protocol.mdx +29 -15
  430. package/docs/content/locales/de-DE/plan-plugin.mdx +3 -3
  431. package/docs/content/locales/de-DE/server.mdx +2 -2
  432. package/docs/content/locales/de-DE/skills-guide.mdx +1 -1
  433. package/docs/content/locales/de-DE/template-assets.mdx +1 -1
  434. package/docs/content/locales/de-DE/template-dispatch.mdx +2 -2
  435. package/docs/content/locales/de-DE/template-plan.mdx +3 -3
  436. package/docs/content/locales/es-ES/actions.mdx +1 -1
  437. package/docs/content/locales/es-ES/authentication.mdx +1 -1
  438. package/docs/content/locales/es-ES/dispatch.mdx +3 -3
  439. package/docs/content/locales/es-ES/external-agents.mdx +32 -19
  440. package/docs/content/locales/es-ES/mcp-clients.mdx +17 -3
  441. package/docs/content/locales/es-ES/mcp-protocol.mdx +38 -15
  442. package/docs/content/locales/es-ES/plan-plugin.mdx +3 -3
  443. package/docs/content/locales/es-ES/server.mdx +2 -2
  444. package/docs/content/locales/es-ES/skills-guide.mdx +1 -1
  445. package/docs/content/locales/es-ES/template-assets.mdx +1 -1
  446. package/docs/content/locales/es-ES/template-dispatch.mdx +2 -2
  447. package/docs/content/locales/es-ES/template-plan.mdx +3 -3
  448. package/docs/content/locales/fr-FR/actions.mdx +1 -1
  449. package/docs/content/locales/fr-FR/authentication.mdx +1 -1
  450. package/docs/content/locales/fr-FR/dispatch.mdx +3 -3
  451. package/docs/content/locales/fr-FR/external-agents.mdx +23 -19
  452. package/docs/content/locales/fr-FR/mcp-clients.mdx +17 -3
  453. package/docs/content/locales/fr-FR/mcp-protocol.mdx +29 -15
  454. package/docs/content/locales/fr-FR/plan-plugin.mdx +3 -3
  455. package/docs/content/locales/fr-FR/server.mdx +2 -2
  456. package/docs/content/locales/fr-FR/skills-guide.mdx +1 -1
  457. package/docs/content/locales/fr-FR/template-assets.mdx +1 -1
  458. package/docs/content/locales/fr-FR/template-dispatch.mdx +2 -2
  459. package/docs/content/locales/fr-FR/template-plan.mdx +3 -3
  460. package/docs/content/locales/hi-IN/actions.mdx +1 -1
  461. package/docs/content/locales/hi-IN/authentication.mdx +1 -1
  462. package/docs/content/locales/hi-IN/dispatch.mdx +3 -3
  463. package/docs/content/locales/hi-IN/external-agents.mdx +31 -19
  464. package/docs/content/locales/hi-IN/mcp-clients.mdx +17 -3
  465. package/docs/content/locales/hi-IN/mcp-protocol.mdx +36 -15
  466. package/docs/content/locales/hi-IN/plan-plugin.mdx +3 -3
  467. package/docs/content/locales/hi-IN/server.mdx +2 -2
  468. package/docs/content/locales/hi-IN/skills-guide.mdx +1 -1
  469. package/docs/content/locales/hi-IN/template-assets.mdx +1 -1
  470. package/docs/content/locales/hi-IN/template-dispatch.mdx +2 -2
  471. package/docs/content/locales/hi-IN/template-plan.mdx +3 -3
  472. package/docs/content/locales/ja-JP/actions.mdx +1 -1
  473. package/docs/content/locales/ja-JP/authentication.mdx +1 -1
  474. package/docs/content/locales/ja-JP/dispatch.mdx +3 -3
  475. package/docs/content/locales/ja-JP/external-agents.mdx +23 -19
  476. package/docs/content/locales/ja-JP/mcp-clients.mdx +34 -3
  477. package/docs/content/locales/ja-JP/mcp-protocol.mdx +29 -15
  478. package/docs/content/locales/ja-JP/plan-plugin.mdx +3 -3
  479. package/docs/content/locales/ja-JP/server.mdx +2 -2
  480. package/docs/content/locales/ja-JP/skills-guide.mdx +1 -1
  481. package/docs/content/locales/ja-JP/template-assets.mdx +1 -1
  482. package/docs/content/locales/ja-JP/template-dispatch.mdx +2 -2
  483. package/docs/content/locales/ja-JP/template-plan.mdx +3 -3
  484. package/docs/content/locales/ko-KR/actions.mdx +1 -1
  485. package/docs/content/locales/ko-KR/authentication.mdx +1 -1
  486. package/docs/content/locales/ko-KR/dispatch.mdx +3 -3
  487. package/docs/content/locales/ko-KR/external-agents.mdx +30 -19
  488. package/docs/content/locales/ko-KR/mcp-clients.mdx +33 -3
  489. package/docs/content/locales/ko-KR/mcp-protocol.mdx +36 -15
  490. package/docs/content/locales/ko-KR/plan-plugin.mdx +3 -3
  491. package/docs/content/locales/ko-KR/server.mdx +2 -2
  492. package/docs/content/locales/ko-KR/skills-guide.mdx +1 -1
  493. package/docs/content/locales/ko-KR/template-assets.mdx +1 -1
  494. package/docs/content/locales/ko-KR/template-dispatch.mdx +2 -2
  495. package/docs/content/locales/ko-KR/template-plan.mdx +3 -3
  496. package/docs/content/locales/pt-BR/actions.mdx +1 -1
  497. package/docs/content/locales/pt-BR/authentication.mdx +1 -1
  498. package/docs/content/locales/pt-BR/dispatch.mdx +3 -3
  499. package/docs/content/locales/pt-BR/external-agents.mdx +32 -19
  500. package/docs/content/locales/pt-BR/mcp-clients.mdx +34 -3
  501. package/docs/content/locales/pt-BR/mcp-protocol.mdx +32 -15
  502. package/docs/content/locales/pt-BR/plan-plugin.mdx +3 -3
  503. package/docs/content/locales/pt-BR/server.mdx +2 -2
  504. package/docs/content/locales/pt-BR/skills-guide.mdx +1 -1
  505. package/docs/content/locales/pt-BR/template-assets.mdx +1 -1
  506. package/docs/content/locales/pt-BR/template-dispatch.mdx +2 -2
  507. package/docs/content/locales/pt-BR/template-plan.mdx +3 -3
  508. package/docs/content/locales/zh-CN/actions.mdx +1 -1
  509. package/docs/content/locales/zh-CN/authentication.mdx +1 -1
  510. package/docs/content/locales/zh-CN/dispatch.mdx +3 -3
  511. package/docs/content/locales/zh-CN/external-agents.mdx +23 -19
  512. package/docs/content/locales/zh-CN/mcp-clients.mdx +28 -3
  513. package/docs/content/locales/zh-CN/mcp-protocol.mdx +29 -15
  514. package/docs/content/locales/zh-CN/plan-plugin.mdx +3 -3
  515. package/docs/content/locales/zh-CN/server.mdx +2 -2
  516. package/docs/content/locales/zh-CN/skills-guide.mdx +1 -1
  517. package/docs/content/locales/zh-CN/template-assets.mdx +1 -1
  518. package/docs/content/locales/zh-CN/template-dispatch.mdx +2 -2
  519. package/docs/content/locales/zh-CN/template-plan.mdx +3 -3
  520. package/docs/content/locales/zh-TW/actions.mdx +1 -1
  521. package/docs/content/locales/zh-TW/authentication.mdx +1 -1
  522. package/docs/content/locales/zh-TW/dispatch.mdx +3 -3
  523. package/docs/content/locales/zh-TW/external-agents.mdx +23 -19
  524. package/docs/content/locales/zh-TW/mcp-clients.mdx +28 -3
  525. package/docs/content/locales/zh-TW/mcp-protocol.mdx +30 -15
  526. package/docs/content/locales/zh-TW/plan-plugin.mdx +3 -3
  527. package/docs/content/locales/zh-TW/server.mdx +2 -2
  528. package/docs/content/locales/zh-TW/skills-guide.mdx +1 -1
  529. package/docs/content/locales/zh-TW/template-assets.mdx +1 -1
  530. package/docs/content/locales/zh-TW/template-dispatch.mdx +2 -2
  531. package/docs/content/locales/zh-TW/template-plan.mdx +3 -3
  532. package/docs/content/mcp-clients.mdx +31 -4
  533. package/docs/content/mcp-protocol.mdx +35 -15
  534. package/docs/content/plan-plugin.mdx +3 -3
  535. package/docs/content/server.mdx +2 -2
  536. package/docs/content/skills-guide.mdx +1 -1
  537. package/docs/content/template-assets.mdx +1 -1
  538. package/docs/content/template-dispatch.mdx +2 -2
  539. package/docs/content/template-plan.mdx +3 -3
  540. package/package.json +1 -1
  541. package/src/templates/default/.agents/skills/security/SKILL.md +10 -0
  542. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  543. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  544. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  545. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
@@ -540,6 +540,8 @@ export async function callAgent(
540
540
  userEmail?: string;
541
541
  orgDomain?: string;
542
542
  orgSecret?: string;
543
+ /** Origin used to build links back to the receiving app. */
544
+ requestOrigin?: string;
543
545
  /**
544
546
  * Use async/poll instead of a single blocking POST. Recommended for
545
547
  * cross-app calls that may exceed a synchronous serverless request budget.
@@ -571,6 +573,7 @@ export async function callAgent(
571
573
  const metadata: Record<string, unknown> = {};
572
574
  if (opts?.userEmail) metadata.userEmail = opts.userEmail;
573
575
  if (opts?.orgDomain) metadata.orgDomain = opts.orgDomain;
576
+ if (opts?.requestOrigin) metadata.requestOrigin = opts.requestOrigin;
574
577
 
575
578
  // Default to async + poll. The receiving A2A server's `_process-task` route
576
579
  // runs the handler in a fresh function execution (cross-platform queue
@@ -8,6 +8,7 @@ import {
8
8
  resolveAgentChatProcessRunDispatchPath,
9
9
  } from "../agent/durable-background.js";
10
10
  import { withConfiguredAppBasePath } from "../server/app-base-path.js";
11
+ import { getOrigin, isConfiguredAppOrigin } from "../server/google-oauth.js";
11
12
  import { fireInternalDispatch } from "../server/self-dispatch.js";
12
13
  import { agentChat } from "../shared/agent-chat.js";
13
14
  import {
@@ -46,6 +47,70 @@ const A2A_QUEUED_DISPATCH_STUCK_AFTER_MS = 10_000;
46
47
  const A2A_PROCESSING_STUCK_AFTER_MS = 5 * 60 * 1000;
47
48
  const A2A_PROCESSING_HEARTBEAT_MS = 30_000;
48
49
 
50
+ /**
51
+ * Request origin is routing/link context, not an identity signal. Accept only
52
+ * an absolute HTTP(S) origin from caller metadata so queued runs can preserve
53
+ * custom-domain/workspace links without allowing arbitrary values to leak
54
+ * into browser or artifact URLs.
55
+ */
56
+ function requestOriginFromMetadata(
57
+ metadata: Record<string, unknown> | undefined,
58
+ ): string | undefined {
59
+ const raw = metadata?.requestOrigin;
60
+ if (typeof raw !== "string" || !raw.trim()) return undefined;
61
+ try {
62
+ const url = new URL(raw);
63
+ if (url.protocol !== "http:" && url.protocol !== "https:") return undefined;
64
+ return url.origin;
65
+ } catch {
66
+ return undefined;
67
+ }
68
+ }
69
+
70
+ function requestOriginFromEvent(event: any | undefined): string | undefined {
71
+ if (!event) return undefined;
72
+ try {
73
+ return requestOriginFromMetadata({
74
+ requestOrigin: getOrigin(event as any),
75
+ });
76
+ } catch {
77
+ return undefined;
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Prefer the origin resolved from the receiving request. A distinct public
83
+ * browser origin is allowed only when the receiver configured it explicitly;
84
+ * arbitrary caller metadata must not steer links or service-token URLs.
85
+ */
86
+ function requestOriginForContext(
87
+ metadata: Record<string, unknown> | undefined,
88
+ event: any | undefined,
89
+ ): string | undefined {
90
+ if (!event) return undefined;
91
+ const receiverOrigin = requestOriginFromEvent(event);
92
+ const metadataOrigin = requestOriginFromMetadata(metadata);
93
+ if (
94
+ metadataOrigin &&
95
+ (metadataOrigin === receiverOrigin || isConfiguredAppOrigin(metadataOrigin))
96
+ ) {
97
+ return metadataOrigin;
98
+ }
99
+ return receiverOrigin;
100
+ }
101
+
102
+ function trustedA2AMetadata(
103
+ metadata: Record<string, unknown> | undefined,
104
+ event: any | undefined,
105
+ ): Record<string, unknown> | undefined {
106
+ if (!metadata) return undefined;
107
+ const trusted = { ...metadata };
108
+ const requestOrigin = requestOriginForContext(metadata, event);
109
+ if (requestOrigin) trusted.requestOrigin = requestOrigin;
110
+ else delete trusted.requestOrigin;
111
+ return trusted;
112
+ }
113
+
49
114
  /**
50
115
  * Hard cap on how long a task may sit in submitted/working (never reaching
51
116
  * `processing`) before the dispatch-retry loop in
@@ -172,6 +237,12 @@ export async function processA2ATaskFromQueue(
172
237
  const processorMeta = (meta.__a2a_processor ?? {}) as Record<string, unknown>;
173
238
  const verifiedEmail = processorMeta.verifiedEmail as string | undefined;
174
239
  const orgDomainHint = processorMeta.orgDomainHint as string | undefined;
240
+ // The processor metadata was created by the authenticated inbound handler
241
+ // from that request's resolved origin. Prefer it over the processor event,
242
+ // whose host may be an internal worker/dispatch origin. Legacy tasks that
243
+ // predate this metadata fall back to the processor event.
244
+ const requestOrigin =
245
+ requestOriginFromMetadata(processorMeta) ?? requestOriginFromEvent(event);
175
246
  const contextId =
176
247
  (processorMeta.contextId as string | null | undefined) ?? undefined;
177
248
  const callerMetadata =
@@ -197,7 +268,11 @@ export async function processA2ATaskFromQueue(
197
268
  ).unref?.();
198
269
  try {
199
270
  await runWithRequestContext(
200
- { userEmail: verifiedEmail, orgId: resolvedOrgId },
271
+ {
272
+ userEmail: verifiedEmail,
273
+ orgId: resolvedOrgId,
274
+ ...(requestOrigin ? { requestOrigin } : {}),
275
+ },
201
276
  () =>
202
277
  runHandlerAndPersist(
203
278
  taskId,
@@ -349,7 +424,7 @@ function makeHandlerContext(
349
424
  * inside `runWithRequestContext` so downstream actions see the org.
350
425
  */
351
426
  async function withA2ARequestContext<T>(
352
- _metadata: Record<string, unknown> | undefined,
427
+ metadata: Record<string, unknown> | undefined,
353
428
  event: any | undefined,
354
429
  fn: () => Promise<T>,
355
430
  ): Promise<T> {
@@ -366,9 +441,14 @@ async function withA2ARequestContext<T>(
366
441
  (event?.context?.__a2aOrgDomain as string | undefined) ?? undefined;
367
442
 
368
443
  const resolvedOrgId = await resolveVerifiedA2AOrgId(verifiedEmail, orgDomain);
444
+ const requestOrigin = requestOriginForContext(metadata, event);
369
445
 
370
446
  return runWithRequestContext(
371
- { userEmail: verifiedEmail, orgId: resolvedOrgId },
447
+ {
448
+ userEmail: verifiedEmail,
449
+ orgId: resolvedOrgId,
450
+ ...(requestOrigin ? { requestOrigin } : {}),
451
+ },
372
452
  fn,
373
453
  ) as Promise<T>;
374
454
  }
@@ -528,14 +608,17 @@ async function handleSend(
528
608
  // to metadata.orgDomain which is caller-supplied and unverified.
529
609
  const orgDomainHint =
530
610
  (event?.context?.__a2aOrgDomain as string | undefined) ?? undefined;
611
+ const requestOrigin = requestOriginForContext(metadata, event);
612
+ const safeMetadata = trustedA2AMetadata(metadata, event);
531
613
 
532
614
  const taskMetadata: Record<string, unknown> = {
533
- ...(metadata ?? {}),
615
+ ...(safeMetadata ?? {}),
534
616
  __a2a_processor: {
535
617
  verifiedEmail,
536
618
  orgDomainHint,
619
+ ...(requestOrigin ? { requestOrigin } : {}),
537
620
  contextId: contextId ?? null,
538
- callerMetadata: metadata ?? null,
621
+ callerMetadata: safeMetadata ?? null,
539
622
  },
540
623
  };
541
624
  const task = await createTask(
@@ -571,7 +654,12 @@ async function handleSend(
571
654
  );
572
655
  await updateTask(task.id, { state: "working" });
573
656
 
574
- const ctx = makeHandlerContext(task.id, contextId, metadata, event);
657
+ const ctx = makeHandlerContext(
658
+ task.id,
659
+ contextId,
660
+ trustedA2AMetadata(metadata, event),
661
+ event,
662
+ );
575
663
 
576
664
  try {
577
665
  const result = getHandler(config)(message, ctx.context);
@@ -653,7 +741,7 @@ async function handleStream(
653
741
  const { context, artifacts } = makeHandlerContext(
654
742
  task.id,
655
743
  contextId,
656
- metadata,
744
+ trustedA2AMetadata(metadata, event),
657
745
  event,
658
746
  );
659
747
 
@@ -15,11 +15,11 @@
15
15
  * agent-native connect --all [--client ...] (separate first-party app MCP resources)
16
16
  *
17
17
  * Server contract (implemented by another agent on `<url>`):
18
- * POST <url>/_agent-native/mcp/connect/device/start (no auth)
18
+ * POST <url>/mcp/connect/device/start (no auth)
19
19
  * body { client?, app? }
20
20
  * → { device_code, user_code, verification_uri,
21
21
  * verification_uri_complete, interval, expires_in }
22
- * POST <url>/_agent-native/mcp/connect/device/poll (no auth)
22
+ * POST <url>/mcp/connect/device/poll (no auth)
23
23
  * body { device_code }
24
24
  * → { status: "pending" }
25
25
  * | { status: "approved", token, mcpUrl, serverName, mcpServerEntry }
@@ -35,6 +35,10 @@ import fs from "node:fs";
35
35
  import os from "node:os";
36
36
  import path from "node:path";
37
37
 
38
+ import {
39
+ MCP_LEGACY_ROUTE_PREFIX,
40
+ MCP_PUBLIC_ROUTE_PREFIX,
41
+ } from "../mcp/route-paths.js";
38
42
  import { findWorkspaceRoot } from "../mcp/workspace-resolve.js";
39
43
  import {
40
44
  CLIENTS,
@@ -52,9 +56,10 @@ import {
52
56
  } from "./plan-publish-store.js";
53
57
  import { TEMPLATES, visibleTemplates } from "./templates-meta.js";
54
58
 
55
- const DEVICE_START_PATH = "/_agent-native/mcp/connect/device/start";
56
- const DEVICE_POLL_PATH = "/_agent-native/mcp/connect/device/poll";
57
- const MCP_PATH = "/_agent-native/mcp";
59
+ const DEVICE_START_PATH = `${MCP_PUBLIC_ROUTE_PREFIX}/connect/device/start`;
60
+ const DEVICE_POLL_PATH = `${MCP_PUBLIC_ROUTE_PREFIX}/connect/device/poll`;
61
+ const MCP_PATH = MCP_PUBLIC_ROUTE_PREFIX;
62
+ const LEGACY_MCP_PATH = MCP_LEGACY_ROUTE_PREFIX;
58
63
  const SERVER_NAME_PREFIX = "agent-native";
59
64
  const CONNECT_PREFERENCES_VERSION = 1;
60
65
 
@@ -64,16 +69,15 @@ const CONNECT_PREFERENCES_VERSION = 1;
64
69
  * cannot import from there — it imports connect.ts, which would be circular).
65
70
  */
66
71
  const CANONICAL_SERVER_NAME_BY_MCP_URL: Readonly<Record<string, string>> = {
67
- "https://plan.agent-native.com/_agent-native/mcp": "plan",
68
- "https://assets.agent-native.com/_agent-native/mcp": "agent-native-assets",
69
- "https://design.agent-native.com/_agent-native/mcp": "agent-native-design",
70
- "https://context-xray.agent-native.com/_agent-native/mcp":
71
- "agent-native-context-xray",
72
+ "https://plan.agent-native.com/mcp": "plan",
73
+ "https://assets.agent-native.com/mcp": "agent-native-assets",
74
+ "https://design.agent-native.com/mcp": "agent-native-design",
75
+ "https://context-xray.agent-native.com/mcp": "agent-native-context-xray",
72
76
  };
73
77
  const LEGACY_SERVER_NAMES_BY_MCP_URL: Readonly<
74
78
  Record<string, readonly string[]>
75
79
  > = {
76
- "https://plan.agent-native.com/_agent-native/mcp": [
80
+ "https://plan.agent-native.com/mcp": [
77
81
  "agent-native-plan",
78
82
  "agent-native-plans",
79
83
  "agent-native-visual-plans",
@@ -759,8 +763,9 @@ function responseMessage(json: any, fallback: string): string {
759
763
  function stripMcpPath(baseUrl: string): string {
760
764
  const parsed = new URL(baseUrl);
761
765
  const pathname = parsed.pathname.replace(/\/+$/, "");
762
- if (pathname === MCP_PATH || pathname.endsWith(MCP_PATH)) {
763
- parsed.pathname = pathname.slice(0, -MCP_PATH.length) || "/";
766
+ const suffix = mcpPathSuffix(pathname);
767
+ if (suffix) {
768
+ parsed.pathname = pathname.slice(0, -suffix.length) || "/";
764
769
  parsed.search = "";
765
770
  parsed.hash = "";
766
771
  return `${parsed.origin}${parsed.pathname}`.replace(/\/+$/, "");
@@ -771,8 +776,9 @@ function stripMcpPath(baseUrl: string): string {
771
776
  function mcpUrlForBaseUrl(baseUrl: string): string {
772
777
  const parsed = new URL(baseUrl);
773
778
  const pathname = parsed.pathname.replace(/\/+$/, "");
774
- if (pathname === MCP_PATH || pathname.endsWith(MCP_PATH)) {
775
- parsed.pathname = pathname;
779
+ const suffix = mcpPathSuffix(pathname);
780
+ if (suffix) {
781
+ parsed.pathname = `${pathname.slice(0, -suffix.length)}${MCP_PATH}`;
776
782
  parsed.search = "";
777
783
  parsed.hash = "";
778
784
  return `${parsed.origin}${parsed.pathname}`;
@@ -805,7 +811,10 @@ async function validateOAuthMcpServer(
805
811
  const metadata = (await response.json().catch(() => null)) as {
806
812
  resource?: unknown;
807
813
  } | null;
808
- if (metadata?.resource !== mcpUrl) {
814
+ if (
815
+ canonicalMcpUrl(String(metadata?.resource ?? "")) !==
816
+ canonicalMcpUrl(mcpUrl)
817
+ ) {
809
818
  logErr(
810
819
  ` ${metadataUrl} did not advertise the expected MCP resource ` +
811
820
  `${mcpUrl}.`,
@@ -980,7 +989,7 @@ export async function runDeviceFlow(
980
989
  if (poll.status === "approved") {
981
990
  if (isTTY) process.stdout.write("\r\x1b[K");
982
991
  const token = poll.token ?? "";
983
- const mcpUrl = poll.mcpUrl ?? `${baseUrl}/_agent-native/mcp`;
992
+ const mcpUrl = mcpUrlForBaseUrl(poll.mcpUrl ?? baseUrl);
984
993
  const serverName = poll.serverName ?? `${SERVER_NAME_PREFIX}-${appSlug}`;
985
994
  const headers =
986
995
  poll.mcpServerEntry &&
@@ -990,7 +999,12 @@ export async function runDeviceFlow(
990
999
  ? (poll.mcpServerEntry.headers as Record<string, string>)
991
1000
  : undefined;
992
1001
  logOut(" Approved.");
993
- return { token: token || undefined, mcpUrl, serverName, headers };
1002
+ return {
1003
+ token: token || undefined,
1004
+ mcpUrl,
1005
+ serverName,
1006
+ ...(headers ? { headers } : {}),
1007
+ };
994
1008
  }
995
1009
  if (poll.status === "expired") {
996
1010
  if (isTTY) process.stdout.write("\r\x1b[K");
@@ -1383,12 +1397,25 @@ function canonicalMcpUrl(value: string | undefined): string | undefined {
1383
1397
  try {
1384
1398
  const url = new URL(value);
1385
1399
  url.hash = "";
1400
+ const pathname = url.pathname.replace(/\/+$/, "");
1401
+ if (pathname === LEGACY_MCP_PATH || pathname.endsWith(LEGACY_MCP_PATH)) {
1402
+ url.pathname = `${pathname.slice(0, -LEGACY_MCP_PATH.length)}${MCP_PATH}`;
1403
+ }
1386
1404
  return url.toString().replace(/\/+$/, "");
1387
1405
  } catch {
1388
1406
  return undefined;
1389
1407
  }
1390
1408
  }
1391
1409
 
1410
+ function mcpPathSuffix(pathname: string): string | undefined {
1411
+ const normalized = pathname.replace(/\/+$/, "");
1412
+ if (normalized === LEGACY_MCP_PATH || normalized.endsWith(LEGACY_MCP_PATH)) {
1413
+ return LEGACY_MCP_PATH;
1414
+ }
1415
+ if (normalized === MCP_PATH || normalized.endsWith(MCP_PATH)) return MCP_PATH;
1416
+ return undefined;
1417
+ }
1418
+
1392
1419
  function sameMcpUrl(a: string | undefined, b: string | undefined): boolean {
1393
1420
  const left = canonicalMcpUrl(a);
1394
1421
  const right = canonicalMcpUrl(b);
@@ -1663,7 +1690,7 @@ function devMcpUrl(
1663
1690
  gatewayUrls: Map<string, string>,
1664
1691
  ): string {
1665
1692
  const base = gatewayUrls.get(app.name) ?? `${gatewayUrl}/${app.name}`;
1666
- return `${base.replace(/\/+$/, "")}/_agent-native/mcp`;
1693
+ return `${base.replace(/\/+$/, "")}${MCP_PATH}`;
1667
1694
  }
1668
1695
 
1669
1696
  function serverNameForApp(app: ConnectableApp): string {
@@ -1856,14 +1883,13 @@ function preferredReconnectEntry(
1856
1883
 
1857
1884
  /**
1858
1885
  * Return true when `url` is an agent-native MCP endpoint.
1859
- * Matches any URL whose path ends with `/_agent-native/mcp` (after stripping
1860
- * trailing slashes), regardless of the MCP server's name in the config.
1886
+ * Matches either the public `/mcp` path or the legacy `/_agent-native/mcp`
1887
+ * path, regardless of the MCP server's name in the config.
1861
1888
  */
1862
1889
  function isAgentNativeMcpUrl(url: string | undefined): boolean {
1863
1890
  if (!url) return false;
1864
1891
  try {
1865
- const pathname = new URL(url).pathname.replace(/\/+$/, "");
1866
- return pathname === MCP_PATH || pathname.endsWith(MCP_PATH);
1892
+ return Boolean(mcpPathSuffix(new URL(url).pathname));
1867
1893
  } catch {
1868
1894
  return false;
1869
1895
  }
@@ -2036,7 +2062,7 @@ async function resolveReconnectTarget(
2036
2062
  logErr(" Re-run with a URL or --name <serverName>. For example:");
2037
2063
  for (const u of urlList) {
2038
2064
  // Strip the MCP path suffix for a cleaner reconnect URL suggestion.
2039
- const baseUrl = u.replace(/\/_agent-native\/mcp$/, "");
2065
+ const baseUrl = stripMcpPath(u);
2040
2066
  logErr(` npx -y @agent-native/core@latest reconnect ${baseUrl}`);
2041
2067
  }
2042
2068
  return null;
@@ -27,6 +27,9 @@ import fs from "node:fs";
27
27
  import os from "node:os";
28
28
  import path from "node:path";
29
29
 
30
+ const MCP_LEGACY_ROUTE_PREFIX = "/_agent-native/mcp";
31
+ const MCP_PUBLIC_ROUTE_PREFIX = "/mcp";
32
+
30
33
  export type ClientId =
31
34
  | "claude-code"
32
35
  | "claude-code-cli"
@@ -671,6 +674,13 @@ export function canonicalUrl(value: string | undefined): string | undefined {
671
674
  const u = new URL(value);
672
675
  u.hash = "";
673
676
  u.search = "";
677
+ const pathname = u.pathname.replace(/\/+$/, "");
678
+ if (
679
+ pathname === MCP_LEGACY_ROUTE_PREFIX ||
680
+ pathname.endsWith(MCP_LEGACY_ROUTE_PREFIX)
681
+ ) {
682
+ u.pathname = `${pathname.slice(0, -MCP_LEGACY_ROUTE_PREFIX.length)}${MCP_PUBLIC_ROUTE_PREFIX}`;
683
+ }
674
684
  return u.toString().replace(/\/+$/, "");
675
685
  } catch {
676
686
  return undefined;
@@ -17,6 +17,7 @@ import crypto from "node:crypto";
17
17
  import fs from "node:fs";
18
18
  import path from "node:path";
19
19
 
20
+ import { MCP_PUBLIC_ROUTE_PREFIX } from "../mcp/route-paths.js";
20
21
  import { runScreenMemoryMCPStdio } from "../mcp/screen-memory-stdio.js";
21
22
  import { runMCPStdio } from "../mcp/stdio.js";
22
23
  import {
@@ -178,7 +179,7 @@ function ensureLocalToken(
178
179
  /**
179
180
  * Detect a hosted deployment URL. When the workspace .env points at a hosted
180
181
  * origin (APP_URL / BETTER_AUTH_URL with a non-localhost host) we write an
181
- * `http` client entry pointing at `<origin>/_agent-native/mcp` with a JWT
182
+ * `http` client entry pointing at `<origin>/mcp` with a JWT
182
183
  * bearer instead of a stdio entry.
183
184
  */
184
185
  function detectHostedUrl(cwd: string): string | undefined {
@@ -193,7 +194,8 @@ function detectHostedUrl(cwd: string): string | undefined {
193
194
  try {
194
195
  const u = new URL(v);
195
196
  if (!/^(localhost|127\.0\.0\.1|\[::1\])$/.test(u.hostname)) {
196
- return `${u.origin}/_agent-native/mcp`;
197
+ const appPath = u.pathname.replace(/\/+$/, "");
198
+ return `${u.origin}${appPath === "/" ? "" : appPath}${MCP_PUBLIC_ROUTE_PREFIX}`;
197
199
  }
198
200
  } catch {
199
201
  // not a URL — skip
@@ -501,9 +503,7 @@ async function cmdStatus(): Promise<void> {
501
503
  logOut(
502
504
  hostedUrl
503
505
  ? ` MCP URL: ${hostedUrl} (hosted)`
504
- : ` MCP URL: ${origin}/_agent-native/mcp${
505
- port ? ` (port ${port})` : ""
506
- }`,
506
+ : ` MCP URL: ${origin}/mcp${port ? ` (port ${port})` : ""}`,
507
507
  );
508
508
  logOut(` ACCESS_TOKEN: ${hasToken ? "set" : "not set"} (.env)`);
509
509
  logOut(` A2A_SECRET: ${hasA2A ? "set" : "not set"}`);
@@ -55,7 +55,7 @@ of using a generic image generator.
55
55
 
56
56
  ## Cross-App Use
57
57
 
58
- - Hosted default: connect \`https://assets.agent-native.com/_agent-native/mcp\`.
58
+ - Hosted default: connect \`https://assets.agent-native.com/mcp\`.
59
59
  Do not put shared secrets in skill files.
60
60
  - For CLI/code-editor clients, keep any \`npx @agent-native/core@latest connect\` command
61
61
  running until browser authorization finishes. Stopping it early can leave the
@@ -92,7 +92,7 @@ separate those jobs; use it, and hold this bar:
92
92
 
93
93
  ## Cross-App Use
94
94
 
95
- - Hosted default: connect \`https://design.agent-native.com/_agent-native/mcp\`.
95
+ - Hosted default: connect \`https://design.agent-native.com/mcp\`.
96
96
  Do not put shared secrets in skill files.
97
97
  - For CLI/code-editor clients, keep any \`npx @agent-native/core@latest connect\` command
98
98
  running until browser authorization finishes. Stopping it early can leave the
@@ -48,7 +48,7 @@ register MCP where possible without authenticating (leave auth to the host or ru
48
48
  "npx @agent-native/core@latest connect" later). Pass --mcp-url to register that connector against
49
49
  a custom origin (an ngrok tunnel, a local dev server, or a self-hosted
50
50
  deployment) instead of the built-in hosted default — a bare origin gets the
51
- standard /_agent-native/mcp path appended. Use app-skill pack for marketplace
51
+ standard /mcp path appended. Use app-skill pack for marketplace
52
52
  bundles and custom adapter output.
53
53
 
54
54
  When installing visual-plan, visual-recap, or visualize-repo interactively, the
@@ -76,5 +76,5 @@ client. Reconnect re-authenticates WITHOUT reinstalling and finds the entry by
76
76
  URL regardless of connector name. Never reinstall from scratch just to fix auth.
77
77
  Continue once the connector is available.
78
78
 
79
- Hosted default: connect \`https://plan.agent-native.com/_agent-native/mcp\`. Do
79
+ Hosted default: connect \`https://plan.agent-native.com/mcp\`. Do
80
80
  not put shared secrets in skill files.`;
@@ -465,6 +465,6 @@ If a Plans tool returns \`needs auth\`, \`Unauthorized\`, or \`Session terminate
465
465
  not keep retrying it — stop and give the user the per-client reconnect step from
466
466
  \`references/connection.md\`, then continue once the connector is available.
467
467
 
468
- Hosted default: connect \`https://plan.agent-native.com/_agent-native/mcp\`. Do
468
+ Hosted default: connect \`https://plan.agent-native.com/mcp\`. Do
469
469
  not put shared secrets in skill files.
470
470
  `;
@@ -270,7 +270,7 @@ Resolve the URL in this order:
270
270
  the plan.
271
271
  2. Use a \`localhost\`/dev origin ONLY when the recap was created through a Plan
272
272
  MCP bound to that same origin — i.e. that MCP's url is
273
- \`http://localhost:<port>/_agent-native/mcp\`. Creating through the hosted MCP
273
+ \`http://localhost:<port>/mcp\`. Creating through the hosted MCP
274
274
  and linking to localhost is the exact mismatch that 404s.
275
275
  3. If only a plan id is available, build the MCP origin's absolute URL
276
276
  (hosted: \`https://plan.agent-native.com/plans/<id>\`) and say it was inferred.
@@ -278,7 +278,7 @@ Resolve the URL in this order:
278
278
  If the user wants to review on localhost but the recap was created through the
279
279
  hosted MCP, say so plainly: the local dev server cannot see it. To view a recap
280
280
  on localhost (e.g. to exercise un-deployed local renderer changes), they must
281
- connect a LOCAL Plan MCP (\`http://localhost:<port>/_agent-native/mcp\`) and
281
+ connect a LOCAL Plan MCP (\`http://localhost:<port>/mcp\`) and
282
282
  re-create the recap through it so it lands in the local database; offer to do
283
283
  that rather than handing over a localhost URL that will not resolve.
284
284
 
@@ -11,6 +11,10 @@ import os from "node:os";
11
11
  import path from "node:path";
12
12
  import { fileURLToPath } from "node:url";
13
13
 
14
+ import {
15
+ MCP_LEGACY_ROUTE_PREFIX,
16
+ MCP_PUBLIC_ROUTE_PREFIX,
17
+ } from "../mcp/route-paths.js";
14
18
  import {
15
19
  buildAppSkillPack,
16
20
  ensureAppSkill,
@@ -72,7 +76,7 @@ export const BUILT_IN_APP_SKILLS = {
72
76
  "Create, search, select, and export brand image and video assets from the Assets app.",
73
77
  hosted: {
74
78
  url: "https://assets.agent-native.com",
75
- mcpUrl: "https://assets.agent-native.com/_agent-native/mcp",
79
+ mcpUrl: "https://assets.agent-native.com/mcp",
76
80
  },
77
81
  mcp: { serverName: "agent-native-assets" },
78
82
  auth: {
@@ -118,7 +122,7 @@ export const BUILT_IN_APP_SKILLS = {
118
122
  "Edit docs, blogs, resources, and MDX content through the Content app, including repo-backed Local File Mode.",
119
123
  hosted: {
120
124
  url: "https://content.agent-native.com",
121
- mcpUrl: "https://content.agent-native.com/_agent-native/mcp",
125
+ mcpUrl: "https://content.agent-native.com/mcp",
122
126
  },
123
127
  mcp: { serverName: "agent-native-content" },
124
128
  auth: {
@@ -170,7 +174,7 @@ export const BUILT_IN_APP_SKILLS = {
170
174
  "Explore, compare, iterate, and export interactive UI design prototypes from the Design app.",
171
175
  hosted: {
172
176
  url: "https://design.agent-native.com",
173
- mcpUrl: "https://design.agent-native.com/_agent-native/mcp",
177
+ mcpUrl: "https://design.agent-native.com/mcp",
174
178
  },
175
179
  mcp: { serverName: "agent-native-design" },
176
180
  auth: {
@@ -247,7 +251,7 @@ export const BUILT_IN_APP_SKILLS = {
247
251
  "Create rich interactive visual plans, recaps, and repo-native visual docs with diagrams, file maps, annotated code and diffs, API/schema summaries, feedback, and HTML export.",
248
252
  hosted: {
249
253
  url: "https://plan.agent-native.com",
250
- mcpUrl: "https://plan.agent-native.com/_agent-native/mcp",
254
+ mcpUrl: "https://plan.agent-native.com/mcp",
251
255
  },
252
256
  mcp: { serverName: "plan", aliases: ["agent-native-plans"] },
253
257
  auth: {
@@ -317,7 +321,7 @@ export const BUILT_IN_APP_SKILLS = {
317
321
  "Visualize local Codex and Claude Code context usage with warnings and optimization tips.",
318
322
  hosted: {
319
323
  url: "https://context-xray.agent-native.com",
320
- mcpUrl: "https://context-xray.agent-native.com/_agent-native/mcp",
324
+ mcpUrl: "https://context-xray.agent-native.com/mcp",
321
325
  },
322
326
  mcp: { serverName: "agent-native-context-xray" },
323
327
  auth: { mode: "none" },
@@ -2771,8 +2775,11 @@ function preserveMcpUrlAppPathOverride(
2771
2775
  return target;
2772
2776
  }
2773
2777
  const trimmedPath = parsed.pathname.replace(/\/+$/, "");
2774
- const appPath = trimmedPath.endsWith("/_agent-native/mcp")
2775
- ? trimmedPath.slice(0, -"/_agent-native/mcp".length).replace(/\/+$/, "")
2778
+ const mcpSuffix = [MCP_LEGACY_ROUTE_PREFIX, MCP_PUBLIC_ROUTE_PREFIX].find(
2779
+ (suffix) => trimmedPath === suffix || trimmedPath.endsWith(suffix),
2780
+ );
2781
+ const appPath = mcpSuffix
2782
+ ? trimmedPath.slice(0, -mcpSuffix.length).replace(/\/+$/, "")
2776
2783
  : trimmedPath;
2777
2784
  if (!appPath) return target;
2778
2785
  const url = `${parsed.origin}${appPath}`;
@@ -2782,7 +2789,7 @@ function preserveMcpUrlAppPathOverride(
2782
2789
  ...target.loaded,
2783
2790
  manifest: {
2784
2791
  ...target.loaded.manifest,
2785
- hosted: { url, mcpUrl: `${url}/_agent-native/mcp` },
2792
+ hosted: { url, mcpUrl: `${url}${MCP_PUBLIC_ROUTE_PREFIX}` },
2786
2793
  },
2787
2794
  },
2788
2795
  };
@@ -2870,7 +2877,8 @@ async function runCommand(
2870
2877
  /**
2871
2878
  * Resolve a `--mcp-url` override into the `{ url, mcpUrl }` pair the manifest
2872
2879
  * expects. Accepts a bare origin (`https://x.ngrok-free.dev`) — appending the
2873
- * standard `/_agent-native/mcp` path — or a full MCP URL already ending in it.
2880
+ * standard `/mcp` path — or a full MCP URL already ending in `/mcp` or the
2881
+ * legacy `/_agent-native/mcp` path.
2874
2882
  */
2875
2883
  function resolveMcpUrlOverride(input: string): { url: string; mcpUrl: string } {
2876
2884
  let parsed: URL;
@@ -2884,9 +2892,12 @@ function resolveMcpUrlOverride(input: string): { url: string; mcpUrl: string } {
2884
2892
  }
2885
2893
  const origin = parsed.origin;
2886
2894
  const trimmedPath = parsed.pathname.replace(/\/+$/, "");
2887
- const mcpUrl = trimmedPath.endsWith("/_agent-native/mcp")
2888
- ? `${origin}${trimmedPath}`
2889
- : `${origin}/_agent-native/mcp`;
2895
+ const mcpSuffix = [MCP_LEGACY_ROUTE_PREFIX, MCP_PUBLIC_ROUTE_PREFIX].find(
2896
+ (suffix) => trimmedPath === suffix || trimmedPath.endsWith(suffix),
2897
+ );
2898
+ const mcpUrl = mcpSuffix
2899
+ ? `${origin}${trimmedPath.slice(0, -mcpSuffix.length)}${MCP_PUBLIC_ROUTE_PREFIX}`
2900
+ : `${origin}${MCP_PUBLIC_ROUTE_PREFIX}`;
2890
2901
  return { url: origin, mcpUrl };
2891
2902
  }
2892
2903
 
@@ -447,6 +447,11 @@ export function McpIntegrationDialog({
447
447
  <div className="min-h-0 flex-1 overflow-y-auto px-7 py-5">
448
448
  <div className="space-y-3">
449
449
  {renderScopeSelector()}
450
+ {selected?.setupNoteKey && (
451
+ <div className="rounded-md border border-amber-500/20 bg-amber-500/5 px-3 py-2 text-[11px] leading-relaxed text-amber-700 dark:text-amber-300">
452
+ {t(selected.setupNoteKey)}
453
+ </div>
454
+ )}
450
455
  {selected?.authMode === "oauth" && (
451
456
  <div className="rounded-md border border-blue-500/20 bg-blue-500/5 px-3 py-2 text-[11px] leading-relaxed text-blue-700 dark:text-blue-300">
452
457
  {t("mcpIntegrations.oauthNotice")}
@@ -21,6 +21,7 @@ export interface DefaultMcpIntegration {
21
21
  url: string;
22
22
  authMode: McpIntegrationAuthMode;
23
23
  docsUrl?: string;
24
+ setupNoteKey?: string;
24
25
  headerPlaceholder?: string;
25
26
  keywords: string[];
26
27
  }
@@ -99,6 +100,22 @@ export const DEFAULT_MCP_INTEGRATIONS: DefaultMcpIntegration[] = [
99
100
  docsUrl: "https://www.builder.io/c/docs/fusion-connect-to-linear",
100
101
  keywords: ["issues", "tickets", "planning", "project management"],
101
102
  },
103
+ {
104
+ id: "atlassian",
105
+ name: "Atlassian",
106
+ provider: "atlassian",
107
+ description: "Read and write Jira issues and Confluence content.",
108
+ descriptionKey: "mcpIntegrations.catalog.atlassian.description",
109
+ useCase:
110
+ "project management, issue tracking, documentation, team collaboration",
111
+ useCaseKey: "mcpIntegrations.catalog.atlassian.useCase",
112
+ url: "https://mcp.atlassian.com/v1/mcp/authv2",
113
+ authMode: "oauth",
114
+ docsUrl:
115
+ "https://developer.atlassian.com/cloud/rovo-mcp/guides/getting-started/",
116
+ setupNoteKey: "mcpIntegrations.catalog.atlassian.setupNote",
117
+ keywords: ["atlassian", "jira", "confluence", "issues", "tickets"],
118
+ },
102
119
  {
103
120
  id: "supabase",
104
121
  name: "Supabase",