@adcp/sdk 13.0.4 → 13.1.1

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 (235) hide show
  1. package/bin/adcp-grade.js +4 -3
  2. package/bin/adcp.js +18 -0
  3. package/dist/lib/conformance/invariants/uniformError.d.ts.map +1 -1
  4. package/dist/lib/conformance/invariants/uniformError.js +21 -0
  5. package/dist/lib/conformance/invariants/uniformError.js.map +1 -1
  6. package/dist/lib/conformance/invariants/uniformError.mjs +22 -1
  7. package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
  8. package/dist/lib/core/AgentClient.d.mts +1 -1
  9. package/dist/lib/core/AgentClient.d.ts +1 -1
  10. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  11. package/dist/lib/core/AgentClient.js +1 -1
  12. package/dist/lib/core/AgentClient.js.map +1 -1
  13. package/dist/lib/core/AgentClient.mjs +1 -1
  14. package/dist/lib/core/AgentClient.mjs.map +1 -1
  15. package/dist/lib/core/SingleAgentClient.d.mts +1 -1
  16. package/dist/lib/core/SingleAgentClient.d.ts +1 -1
  17. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  18. package/dist/lib/core/SingleAgentClient.js +88 -48
  19. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  20. package/dist/lib/core/SingleAgentClient.mjs +88 -48
  21. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  22. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  23. package/dist/lib/core/TaskExecutor.js +8 -4
  24. package/dist/lib/core/TaskExecutor.js.map +1 -1
  25. package/dist/lib/core/TaskExecutor.mjs +8 -4
  26. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  27. package/dist/lib/index.d.mts +1 -1
  28. package/dist/lib/index.d.ts +1 -1
  29. package/dist/lib/index.d.ts.map +1 -1
  30. package/dist/lib/index.js.map +1 -1
  31. package/dist/lib/index.mjs.map +1 -1
  32. package/dist/lib/net/agent-transport-fetch.d.mts +15 -0
  33. package/dist/lib/net/agent-transport-fetch.d.ts +15 -0
  34. package/dist/lib/net/agent-transport-fetch.d.ts.map +1 -1
  35. package/dist/lib/net/agent-transport-fetch.js +37 -2
  36. package/dist/lib/net/agent-transport-fetch.js.map +1 -1
  37. package/dist/lib/net/agent-transport-fetch.mjs +37 -2
  38. package/dist/lib/net/agent-transport-fetch.mjs.map +1 -1
  39. package/dist/lib/net/credential-headers.d.mts +1 -0
  40. package/dist/lib/net/credential-headers.d.ts +2 -0
  41. package/dist/lib/net/credential-headers.d.ts.map +1 -0
  42. package/dist/lib/net/credential-headers.js +34 -0
  43. package/dist/lib/net/credential-headers.js.map +1 -0
  44. package/dist/lib/net/credential-headers.mjs +10 -0
  45. package/dist/lib/net/credential-headers.mjs.map +1 -0
  46. package/dist/lib/protocols/a2a-native-v1.d.mts +18 -0
  47. package/dist/lib/protocols/a2a-native-v1.d.ts +19 -0
  48. package/dist/lib/protocols/a2a-native-v1.d.ts.map +1 -0
  49. package/dist/lib/protocols/a2a-native-v1.js +183 -0
  50. package/dist/lib/protocols/a2a-native-v1.js.map +1 -0
  51. package/dist/lib/protocols/a2a-native-v1.mjs +167 -0
  52. package/dist/lib/protocols/a2a-native-v1.mjs.map +1 -0
  53. package/dist/lib/protocols/a2a-push-notification.d.mts +13 -0
  54. package/dist/lib/protocols/a2a-push-notification.d.ts +14 -0
  55. package/dist/lib/protocols/a2a-push-notification.d.ts.map +1 -0
  56. package/dist/lib/protocols/a2a-push-notification.js +42 -0
  57. package/dist/lib/protocols/a2a-push-notification.js.map +1 -0
  58. package/dist/lib/protocols/a2a-push-notification.mjs +23 -0
  59. package/dist/lib/protocols/a2a-push-notification.mjs.map +1 -0
  60. package/dist/lib/protocols/a2a.d.mts +15 -5
  61. package/dist/lib/protocols/a2a.d.ts +15 -5
  62. package/dist/lib/protocols/a2a.d.ts.map +1 -1
  63. package/dist/lib/protocols/a2a.js +102 -13
  64. package/dist/lib/protocols/a2a.js.map +1 -1
  65. package/dist/lib/protocols/a2a.mjs +90 -12
  66. package/dist/lib/protocols/a2a.mjs.map +1 -1
  67. package/dist/lib/protocols/index.d.mts +3 -0
  68. package/dist/lib/protocols/index.d.ts +3 -0
  69. package/dist/lib/protocols/index.d.ts.map +1 -1
  70. package/dist/lib/protocols/index.js +18 -6
  71. package/dist/lib/protocols/index.js.map +1 -1
  72. package/dist/lib/protocols/index.mjs +18 -6
  73. package/dist/lib/protocols/index.mjs.map +1 -1
  74. package/dist/lib/protocols/mcp-modern.d.ts.map +1 -1
  75. package/dist/lib/protocols/mcp-modern.js +3 -1
  76. package/dist/lib/protocols/mcp-modern.js.map +1 -1
  77. package/dist/lib/protocols/mcp-modern.mjs +3 -1
  78. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  79. package/dist/lib/protocols/mcp-tasks.d.ts.map +1 -1
  80. package/dist/lib/protocols/mcp-tasks.js +2 -1
  81. package/dist/lib/protocols/mcp-tasks.js.map +1 -1
  82. package/dist/lib/protocols/mcp-tasks.mjs +2 -1
  83. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  84. package/dist/lib/protocols/mcp.d.mts +8 -5
  85. package/dist/lib/protocols/mcp.d.ts +8 -5
  86. package/dist/lib/protocols/mcp.d.ts.map +1 -1
  87. package/dist/lib/protocols/mcp.js +12 -4
  88. package/dist/lib/protocols/mcp.js.map +1 -1
  89. package/dist/lib/protocols/mcp.mjs +12 -4
  90. package/dist/lib/protocols/mcp.mjs.map +1 -1
  91. package/dist/lib/protocols/rawResponseCapture.d.mts +9 -1
  92. package/dist/lib/protocols/rawResponseCapture.d.ts +9 -1
  93. package/dist/lib/protocols/rawResponseCapture.d.ts.map +1 -1
  94. package/dist/lib/protocols/rawResponseCapture.js +153 -10
  95. package/dist/lib/protocols/rawResponseCapture.js.map +1 -1
  96. package/dist/lib/protocols/rawResponseCapture.mjs +153 -10
  97. package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
  98. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  99. package/dist/lib/signing/agent-fetch.d.mts +3 -1
  100. package/dist/lib/signing/agent-fetch.d.ts +3 -1
  101. package/dist/lib/signing/agent-fetch.d.ts.map +1 -1
  102. package/dist/lib/signing/agent-fetch.js +4 -2
  103. package/dist/lib/signing/agent-fetch.js.map +1 -1
  104. package/dist/lib/signing/agent-fetch.mjs +4 -2
  105. package/dist/lib/signing/agent-fetch.mjs.map +1 -1
  106. package/dist/lib/signing/protocol-methods.d.mts +24 -0
  107. package/dist/lib/signing/protocol-methods.d.ts +25 -0
  108. package/dist/lib/signing/protocol-methods.d.ts.map +1 -0
  109. package/dist/lib/signing/protocol-methods.js +51 -0
  110. package/dist/lib/signing/protocol-methods.js.map +1 -0
  111. package/dist/lib/signing/protocol-methods.mjs +25 -0
  112. package/dist/lib/signing/protocol-methods.mjs.map +1 -0
  113. package/dist/lib/signing/types.d.mts +2 -0
  114. package/dist/lib/signing/types.d.ts +2 -0
  115. package/dist/lib/signing/types.d.ts.map +1 -1
  116. package/dist/lib/signing/types.js.map +1 -1
  117. package/dist/lib/signing/types.mjs.map +1 -1
  118. package/dist/lib/signing/verifier.d.ts.map +1 -1
  119. package/dist/lib/signing/verifier.js +6 -2
  120. package/dist/lib/signing/verifier.js.map +1 -1
  121. package/dist/lib/signing/verifier.mjs +6 -2
  122. package/dist/lib/signing/verifier.mjs.map +1 -1
  123. package/dist/lib/testing/client.d.ts.map +1 -1
  124. package/dist/lib/testing/client.js +4 -1
  125. package/dist/lib/testing/client.js.map +1 -1
  126. package/dist/lib/testing/client.mjs +4 -1
  127. package/dist/lib/testing/client.mjs.map +1 -1
  128. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  129. package/dist/lib/testing/compliance/comply.js +3 -0
  130. package/dist/lib/testing/compliance/comply.js.map +1 -1
  131. package/dist/lib/testing/compliance/comply.mjs +3 -0
  132. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  133. package/dist/lib/testing/storyboard/agent-routing.d.mts +3 -1
  134. package/dist/lib/testing/storyboard/agent-routing.d.ts +3 -1
  135. package/dist/lib/testing/storyboard/agent-routing.d.ts.map +1 -1
  136. package/dist/lib/testing/storyboard/agent-routing.js +5 -2
  137. package/dist/lib/testing/storyboard/agent-routing.js.map +1 -1
  138. package/dist/lib/testing/storyboard/agent-routing.mjs +4 -2
  139. package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
  140. package/dist/lib/testing/storyboard/compliance.d.mts +1 -1
  141. package/dist/lib/testing/storyboard/compliance.d.ts +1 -1
  142. package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
  143. package/dist/lib/testing/storyboard/compliance.js +4 -1
  144. package/dist/lib/testing/storyboard/compliance.js.map +1 -1
  145. package/dist/lib/testing/storyboard/compliance.mjs +4 -1
  146. package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
  147. package/dist/lib/testing/storyboard/native-a2a-compliance.d.mts +7 -0
  148. package/dist/lib/testing/storyboard/native-a2a-compliance.d.ts +8 -0
  149. package/dist/lib/testing/storyboard/native-a2a-compliance.d.ts.map +1 -0
  150. package/dist/lib/testing/storyboard/native-a2a-compliance.js +45 -0
  151. package/dist/lib/testing/storyboard/native-a2a-compliance.js.map +1 -0
  152. package/dist/lib/testing/storyboard/native-a2a-compliance.mjs +21 -0
  153. package/dist/lib/testing/storyboard/native-a2a-compliance.mjs.map +1 -0
  154. package/dist/lib/testing/storyboard/probes.d.mts +2 -0
  155. package/dist/lib/testing/storyboard/probes.d.ts +2 -0
  156. package/dist/lib/testing/storyboard/probes.d.ts.map +1 -1
  157. package/dist/lib/testing/storyboard/probes.js +3 -2
  158. package/dist/lib/testing/storyboard/probes.js.map +1 -1
  159. package/dist/lib/testing/storyboard/probes.mjs +3 -2
  160. package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
  161. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.d.mts +31 -0
  162. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.d.ts +32 -0
  163. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.d.ts.map +1 -0
  164. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.js +279 -0
  165. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.js.map +1 -0
  166. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.mjs +244 -0
  167. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.mjs.map +1 -0
  168. package/dist/lib/testing/storyboard/request-signing/builder.d.mts +4 -1
  169. package/dist/lib/testing/storyboard/request-signing/builder.d.ts +4 -1
  170. package/dist/lib/testing/storyboard/request-signing/builder.d.ts.map +1 -1
  171. package/dist/lib/testing/storyboard/request-signing/builder.js +19 -0
  172. package/dist/lib/testing/storyboard/request-signing/builder.js.map +1 -1
  173. package/dist/lib/testing/storyboard/request-signing/builder.mjs +19 -0
  174. package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
  175. package/dist/lib/testing/storyboard/request-signing/grader.d.mts +5 -6
  176. package/dist/lib/testing/storyboard/request-signing/grader.d.ts +5 -6
  177. package/dist/lib/testing/storyboard/request-signing/grader.d.ts.map +1 -1
  178. package/dist/lib/testing/storyboard/request-signing/grader.js +82 -13
  179. package/dist/lib/testing/storyboard/request-signing/grader.js.map +1 -1
  180. package/dist/lib/testing/storyboard/request-signing/grader.mjs +86 -13
  181. package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
  182. package/dist/lib/testing/storyboard/request-signing/index.d.mts +1 -0
  183. package/dist/lib/testing/storyboard/request-signing/index.d.ts +1 -0
  184. package/dist/lib/testing/storyboard/request-signing/index.d.ts.map +1 -1
  185. package/dist/lib/testing/storyboard/request-signing/index.js +7 -0
  186. package/dist/lib/testing/storyboard/request-signing/index.js.map +1 -1
  187. package/dist/lib/testing/storyboard/request-signing/index.mjs +8 -0
  188. package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
  189. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.mts +2 -2
  190. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.ts +2 -2
  191. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.ts.map +1 -1
  192. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.js +6 -5
  193. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.js.map +1 -1
  194. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +6 -5
  195. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
  196. package/dist/lib/testing/storyboard/request-signing/types.d.mts +1 -0
  197. package/dist/lib/testing/storyboard/request-signing/types.d.ts +1 -0
  198. package/dist/lib/testing/storyboard/request-signing/types.d.ts.map +1 -1
  199. package/dist/lib/testing/storyboard/request-signing/types.js.map +1 -1
  200. package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
  201. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts.map +1 -1
  202. package/dist/lib/testing/storyboard/request-signing/vector-loader.js +1 -0
  203. package/dist/lib/testing/storyboard/request-signing/vector-loader.js.map +1 -1
  204. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +1 -0
  205. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
  206. package/dist/lib/testing/storyboard/runner.d.mts +28 -1
  207. package/dist/lib/testing/storyboard/runner.d.ts +28 -1
  208. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  209. package/dist/lib/testing/storyboard/runner.js +251 -55
  210. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  211. package/dist/lib/testing/storyboard/runner.mjs +255 -60
  212. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  213. package/dist/lib/testing/storyboard/types.d.mts +4 -2
  214. package/dist/lib/testing/storyboard/types.d.ts +4 -2
  215. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  216. package/dist/lib/testing/storyboard/types.js +1 -0
  217. package/dist/lib/testing/storyboard/types.js.map +1 -1
  218. package/dist/lib/testing/storyboard/types.mjs +1 -0
  219. package/dist/lib/testing/storyboard/types.mjs.map +1 -1
  220. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  221. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  222. package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
  223. package/dist/lib/testing/storyboard/validations.js +97 -22
  224. package/dist/lib/testing/storyboard/validations.js.map +1 -1
  225. package/dist/lib/testing/storyboard/validations.mjs +98 -22
  226. package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
  227. package/dist/lib/version.d.mts +3 -3
  228. package/dist/lib/version.d.ts +3 -3
  229. package/dist/lib/version.js +3 -3
  230. package/dist/lib/version.js.map +1 -1
  231. package/dist/lib/version.mjs +3 -3
  232. package/dist/lib/version.mjs.map +1 -1
  233. package/docs/guides/BUILD-AN-AGENT.md +1 -1
  234. package/docs/llms.txt +5 -3
  235. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/protocols/mcp-modern.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n/**\n * MCP 2026-07-28 client path.\n *\n * The v2 SDK removed the experimental 2025 Tasks interception API. During the\n * migration window we therefore negotiate with the v2 client first and use it\n * only when the peer selects the modern protocol era. Legacy peers fall back\n * to mcp-tasks.ts, which keeps the existing v1 Tasks behavior intact.\n */\n\nimport {\n Client,\n SdkError,\n SdkErrorCode,\n StreamableHTTPClientTransport,\n type DiscoverResult,\n type OAuthClientProvider as ModernOAuthClientProvider,\n type PriorDiscovery,\n type Tool,\n} from '@modelcontextprotocol/client';\nimport { createHmac } from 'node:crypto';\nimport { createMCPRequestHeaders } from '../auth';\nimport { is401Error } from '../errors';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport {\n currentMCPConnectionScopeKey,\n isMCPConnectionScopeCacheKeyActive,\n registerMCPConnectionScopeCleanup,\n registerMCPConnectionScopePending,\n} from './mcp-scope';\nimport { terminateSessionBestEffort } from './session-termination';\nimport { buildAgentSigningFetch, signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport type { DebugLogEntry } from '../types/adcp';\nimport {\n isAbortOrTimeoutError,\n resolveClientRequestTimeoutMs,\n resolveRequestTimeoutMs,\n withAbortSignal,\n} from './abort';\nimport { wrapFetchWithCapture } from './rawResponseCapture';\nimport { wrapFetchWithSizeLimit } from './responseSizeLimit';\nimport { wrapFetchWithTransportDiagnostics } from './transportDiagnostics';\nimport { createAgentTransportFetch } from '../net/agent-transport-fetch';\n\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\nexport type ModernMCPAttempt = { handled: false } | { handled: true; response: CallToolResponse };\nexport type ModernMCPListAttempt = { handled: false } | { handled: true; tools: Tool[] };\n\nexport interface ModernMCPConnectionOptions {\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n /** Use the v2 SDK's negotiated legacy client instead of handing off to v1. */\n handleLegacy?: boolean;\n}\n\ninterface ModernConnectionOptions {\n agentUrl: string;\n authToken?: string;\n customHeaders?: Record<string, string>;\n debugLogs: DebugLogEntry[];\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n handleLegacy?: boolean;\n}\n\nconst modernConnections = new Map<string, Client>();\nconst legacyConnectionExpiresAt = new Map<string, number>();\nconst pendingModernConnections = new Map<string, Promise<Client>>();\nconst modernTransports = new WeakMap<Client, StreamableHTTPClientTransport>();\nconst knownLegacyConnections = new Map<string, number>();\nconst modernDiscoveries = new Map<string, { discover: DiscoverResult; expiresAt: number }>();\nconst clientsUsingCachedDiscovery = new WeakSet<Client>();\nconst MAX_CACHED_CONNECTIONS = 20;\nconst LEGACY_CLASSIFICATION_TTL_MS = 5 * 60 * 1000;\nconst MODERN_DISCOVERY_TTL_MS = 5 * 60 * 1000;\nconst modernOAuthProviderIds = new WeakMap<object, string>();\nconst modernFetchFnIds = new WeakMap<typeof fetch, string>();\nconst modernSignalIds = new WeakMap<AbortSignal, string>();\nlet nextModernOAuthProviderId = 0;\nlet nextModernFetchFnId = 0;\nlet nextModernSignalId = 0;\nlet connectionGeneration = 0;\n\nasync function closeModernClient(client: Client, terminateSession = true): Promise<void> {\n const transport = modernTransports.get(client);\n modernTransports.delete(client);\n if (terminateSession && transport?.sessionId) {\n await terminateSessionBestEffort(transport);\n }\n await client.close();\n}\n\nfunction cacheDisambiguator(value: string): string {\n return createHmac('sha256', '').update(value).digest('hex');\n}\n\nfunction buildAuthHeaders(\n authToken: string | undefined,\n customHeaders: Record<string, string> | undefined,\n authProvider?: object\n): Record<string, string> {\n const filteredHeaders =\n authProvider || authToken\n ? Object.fromEntries(\n Object.entries(customHeaders ?? {}).filter(keyValue => {\n const key = keyValue[0].toLowerCase();\n return key !== 'authorization' && key !== 'x-adcp-auth';\n })\n )\n : customHeaders;\n return createMCPRequestHeaders(filteredHeaders, authProvider ? undefined : authToken);\n}\n\nfunction oauthProviderCacheKey(provider: object | undefined): string | undefined {\n if (!provider) return undefined;\n let key = modernOAuthProviderIds.get(provider);\n if (!key) {\n key = `oauth-provider:${++nextModernOAuthProviderId}`;\n modernOAuthProviderIds.set(provider, key);\n }\n return key;\n}\n\nfunction fetchFnCacheKey(fetchFn: typeof fetch | undefined): string | undefined {\n if (!fetchFn) return undefined;\n let key = modernFetchFnIds.get(fetchFn);\n if (!key) {\n key = `fetch:${++nextModernFetchFnId}`;\n modernFetchFnIds.set(fetchFn, key);\n }\n return key;\n}\n\nfunction signalCacheKey(signal: AbortSignal | undefined): string | undefined {\n if (!signal) return undefined;\n let key = modernSignalIds.get(signal);\n if (!key) {\n key = `signal:${++nextModernSignalId}`;\n modernSignalIds.set(signal, key);\n }\n return key;\n}\n\nfunction connectionCacheKey(\n agentUrl: string,\n headers: Record<string, string>,\n signingCacheKey?: string,\n authProvider?: object,\n fetchFn?: typeof fetch,\n signal?: AbortSignal,\n requestTimeoutMs?: number,\n handleLegacy?: boolean,\n allowPrivateIp?: boolean\n): string {\n const normalizedHeaders = Object.entries(headers)\n .map(([key, value]) => [key.toLowerCase(), value] as const)\n .sort(([left], [right]) => left.localeCompare(right));\n const parts = [agentUrl, `headers:${cacheDisambiguator(JSON.stringify(normalizedHeaders))}`];\n if (signingCacheKey) parts.push(signingCacheKey);\n const providerKey = oauthProviderCacheKey(authProvider);\n if (providerKey) parts.push(providerKey);\n const fetchKey = fetchFnCacheKey(fetchFn);\n if (fetchKey) parts.push(fetchKey);\n const signalKey = signalCacheKey(signal);\n if (signalKey) parts.push(signalKey);\n if (requestTimeoutMs !== undefined) parts.push(`timeout:${requestTimeoutMs}`);\n if (handleLegacy !== undefined) parts.push(`handle-legacy:${handleLegacy}`);\n if (allowPrivateIp !== undefined) parts.push(`allow-private-ip:${allowPrivateIp}`);\n const scopeKey = currentMCPConnectionScopeKey();\n if (scopeKey) parts.push(scopeKey);\n return parts.join('::');\n}\n\nfunction isKnownLegacy(cacheKey: string): boolean {\n const classifiedAt = knownLegacyConnections.get(cacheKey);\n if (classifiedAt === undefined) return false;\n if (Date.now() - classifiedAt > LEGACY_CLASSIFICATION_TTL_MS) {\n knownLegacyConnections.delete(cacheKey);\n return false;\n }\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, classifiedAt);\n return true;\n}\n\nfunction markKnownLegacy(cacheKey: string): void {\n modernDiscoveries.delete(cacheKey);\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, Date.now());\n while (knownLegacyConnections.size > MAX_CACHED_CONNECTIONS) {\n const oldest = knownLegacyConnections.keys().next().value;\n if (!oldest) break;\n knownLegacyConnections.delete(oldest);\n }\n}\n\nfunction getCachedModernDiscovery(cacheKey: string): PriorDiscovery | undefined {\n const cached = modernDiscoveries.get(cacheKey);\n if (!cached) return undefined;\n if (cached.expiresAt <= Date.now()) {\n modernDiscoveries.delete(cacheKey);\n return undefined;\n }\n modernDiscoveries.delete(cacheKey);\n modernDiscoveries.set(cacheKey, cached);\n return { kind: 'modern', discover: cached.discover };\n}\n\nfunction cacheModernDiscovery(cacheKey: string, discover: DiscoverResult): void {\n modernDiscoveries.delete(cacheKey);\n modernDiscoveries.set(cacheKey, {\n discover,\n expiresAt: Date.now() + MODERN_DISCOVERY_TTL_MS,\n });\n while (modernDiscoveries.size > MAX_CACHED_CONNECTIONS) {\n const oldest = modernDiscoveries.keys().next().value;\n if (!oldest) break;\n modernDiscoveries.delete(oldest);\n }\n}\n\nfunction httpStatusOf(error: unknown, depth = 0): number | undefined {\n if (!error || typeof error !== 'object' || depth > 4) return undefined;\n const candidate = error as { status?: unknown; code?: unknown; cause?: unknown; response?: { status?: unknown } };\n if (typeof candidate.status === 'number') return candidate.status;\n if (typeof candidate.response?.status === 'number') return candidate.response.status;\n if (typeof candidate.code === 'number' && candidate.code >= 100 && candidate.code <= 599) return candidate.code;\n return httpStatusOf(candidate.cause, depth + 1);\n}\n\nfunction isLegacyEraNegotiationFailure(error: unknown, status = httpStatusOf(error)): boolean {\n // Stable MCP SDK v2 uses EraNegotiationFailed for HTTP 5xx responses so\n // callers preserve infrastructure failures instead of treating them as\n // evidence of a legacy endpoint. Only status-less negotiation failures\n // (for example a malformed legacy response) retain the v1 fallback.\n return status === undefined && SdkError.isInstance(error) && error.code === SdkErrorCode.EraNegotiationFailed;\n}\n\nfunction withPerRequestTraceHeaders(fetchImpl: typeof fetch): typeof fetch {\n return (input, init) => {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n new Headers(init?.headers).forEach((value, key) => headers.set(key, value));\n for (const [key, value] of Object.entries(injectTraceHeaders())) headers.set(key, value);\n return fetchImpl(input, { ...init, headers });\n };\n}\n\nfunction getCachedConnection(cacheKey: string): Client | undefined {\n const client = modernConnections.get(cacheKey);\n if (client) {\n const legacyExpiry = legacyConnectionExpiresAt.get(cacheKey);\n if (legacyExpiry !== undefined && legacyExpiry <= Date.now()) {\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n void closeModernClient(client).catch(() => {});\n return undefined;\n }\n modernConnections.delete(cacheKey);\n modernConnections.set(cacheKey, client);\n }\n return client;\n}\n\nfunction evictLeastRecentlyUsed(): void {\n if (modernConnections.size <= MAX_CACHED_CONNECTIONS) return;\n const oldestKey = [...modernConnections.keys()].find(key => !isMCPConnectionScopeCacheKeyActive(key));\n if (!oldestKey) return;\n const client = modernConnections.get(oldestKey);\n modernConnections.delete(oldestKey);\n legacyConnectionExpiresAt.delete(oldestKey);\n if (client) void closeModernClient(client).catch(() => {});\n}\n\n/**\n * Did this connect fail because the era-negotiation probe was answered with\n * `401`/`403`? That is the one probe outcome the MCP client classifies as\n * terminal instead of falling back to the legacy era.\n */\nfunction isNegotiationAuthFailure(error: unknown): boolean {\n return is401Error(error) || httpStatusOf(error) === 403;\n}\n\n/**\n * Were we already presenting a static credential on the probe?\n *\n * This is the line between \"the server is challenging us to authenticate\" and\n * \"the server refused this method\". With no credential, a `401` is a real\n * challenge and the caller wants it: `discoverMCPEndpoint` walks the\n * `WWW-Authenticate` / RFC 9728 chain and reports how to authenticate. With an\n * OAuth provider, a `401` is the provider's cue to refresh, so it must reach\n * the OAuth machinery untouched. Only a static token/header credential that the\n * server rejected *on the probe alone* tells us nothing about the credential,\n * and that is the case worth retrying on the legacy transport.\n */\nfunction presentedStaticCredential(authHeaders: Record<string, string>, authProvider?: object): boolean {\n if (authProvider) return false;\n return Object.keys(authHeaders).some(key => {\n const lower = key.toLowerCase();\n return lower === 'authorization' || lower === 'x-adcp-auth';\n });\n}\n\nasync function createNegotiatedClient(\n cacheKey: string,\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>,\n useCachedDiscovery = true,\n /**\n * Skip the `server/discover` probe and `initialize` straight into the legacy\n * era. Set only on the retry after a negotiation-time 401/403 — see the catch\n * block below.\n */\n skipProbe = false\n): Promise<Client> {\n const generation = connectionGeneration;\n const requestTimeoutMs = resolveRequestTimeoutMs(options.requestTimeoutMs);\n const clientRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const rawNetworkFetch = createAgentTransportFetch(options.agentUrl, {\n trustedFetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n });\n const networkFetch: typeof fetch = (input, init) =>\n withAbortSignal<Response>([init?.signal], requestTimeoutMs, signal => rawNetworkFetch(input, { ...init, signal }));\n const diagnosticFetch = wrapFetchWithTransportDiagnostics(wrapFetchWithSizeLimit(networkFetch));\n const signedFetch: typeof fetch = options.signingContext\n ? (buildAgentSigningFetch({\n upstream: diagnosticFetch,\n signing: options.signingContext.signing,\n getCapability: options.signingContext.getCapability,\n }) as typeof fetch)\n : diagnosticFetch;\n const transport = new StreamableHTTPClientTransport(new URL(options.agentUrl), {\n requestInit: { headers: authHeaders, redirect: 'manual' },\n fetch: wrapFetchWithCapture(withPerRequestTraceHeaders(signedFetch)),\n ...(options.authProvider && {\n authProvider: options.authProvider as ModernOAuthClientProvider,\n }),\n });\n const client = new Client(\n { name: 'AdCP-Client', version: '1.0.0' },\n {\n versionNegotiation: {\n mode: 'auto',\n ...(clientRequestTimeoutMs !== undefined && { probe: { timeoutMs: clientRequestTimeoutMs } }),\n },\n }\n );\n\n const prior = skipProbe\n ? ({ kind: 'legacy' } as const)\n : useCachedDiscovery\n ? getCachedModernDiscovery(cacheKey)\n : undefined;\n try {\n await client.connect(transport, {\n ...(options.signal && { signal: options.signal }),\n ...(clientRequestTimeoutMs !== undefined && { timeout: clientRequestTimeoutMs }),\n ...(prior && { prior }),\n });\n modernTransports.set(client, transport);\n if (prior && !skipProbe) clientsUsingCachedDiscovery.add(client);\n if (!prior) {\n const discover = client.getDiscoverResult();\n if (generation === connectionGeneration) {\n if (client.getProtocolEra() === 'modern' && discover) cacheModernDiscovery(cacheKey, discover);\n else modernDiscoveries.delete(cacheKey);\n }\n }\n return client;\n } catch (error) {\n if (prior && !skipProbe) modernDiscoveries.delete(cacheKey);\n try {\n await closeModernClient(client, false);\n } catch {\n /* ignore close errors */\n }\n // `!skipProbe` keeps the explicit-legacy retry terminal. Re-probing here is\n // only meaningful when `prior` was a *cached modern* discovery that has gone\n // stale — dropping the cache and negotiating afresh can then succeed. On the\n // `skipProbe` retry `prior` is the synthetic `{ kind: 'legacy' }`: there is\n // no stale cache to discard, and recursing would reset `skipProbe` to its\n // default and re-enter the probe→legacy retry below a second time.\n //\n // Reachability: server-driven failures on this path surface as\n // `SdkHttpError` (measured: a 5xx legacy `initialize` gives\n // `CLIENT_HTTP_NOT_IMPLEMENTED`, a malformed body\n // `CLIENT_HTTP_UNEXPECTED_CONTENT`), so no server can drive the cycle today.\n // But `EraNegotiationFailed` is not unreachable under `prior`: the client\n // raises it from `_legacyHandshake` when `supportedProtocolVersions` offers\n // no pre-2026-07-28 version, and for an unrecognized `prior` shape. Those\n // depend on client construction and the library's error taxonomy — both of\n // which moved under us in the 2.0.0-beta.4 -> 2.0.0 bump. The guard makes\n // the bound independent of them.\n if (prior && !skipProbe && SdkError.isInstance(error) && error.code === SdkErrorCode.EraNegotiationFailed) {\n return createNegotiatedClient(cacheKey, options, authHeaders, false);\n }\n // Era negotiation is meant to be automatic: `mode: 'auto'` documents that\n // \"definitive legacy signals (and anything unrecognized) fall back to the\n // plain legacy `initialize` handshake\". 401/403 are the sole exception in\n // the MCP client's classifier (`classifyHttpError`), which is right when we\n // hold no credential — then a 401 IS the server's challenge and the caller\n // needs it — and wrong when we already presented one the server accepts on\n // other methods. In that case the refusal is a verdict on\n // `server/discover`, not on the credential, and the automatic fallback\n // should have run. Do it here: skip the probe and `initialize` directly,\n // the escape hatch the SDK documents for a server known to be legacy. If\n // the credential really is bad, that connect fails on its own and surfaces\n // the server's 401.\n if (isNegotiationAuthFailure(error) && !skipProbe && presentedStaticCredential(authHeaders, options.authProvider)) {\n return createNegotiatedClient(cacheKey, options, authHeaders, useCachedDiscovery, true);\n }\n throw error;\n }\n}\n\nasync function getOrCreateModernConnection(\n cacheKey: string,\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>\n): Promise<Client> {\n const cached = getCachedConnection(cacheKey);\n if (cached) return cached;\n\n const pending = pendingModernConnections.get(cacheKey);\n if (pending) return pending;\n\n const generation = connectionGeneration;\n const promise = createNegotiatedClient(cacheKey, options, authHeaders)\n .then(async client => {\n if (\n (client.getProtocolEra() === 'modern' || options.handleLegacy === true) &&\n generation === connectionGeneration\n ) {\n modernConnections.set(cacheKey, client);\n registerMCPConnectionScopeCleanup('modern', cacheKey, async () => {\n if (modernConnections.get(cacheKey) !== client) return;\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n modernDiscoveries.delete(cacheKey);\n await closeModernClient(client);\n });\n if (client.getProtocolEra() === 'legacy') {\n legacyConnectionExpiresAt.set(cacheKey, Date.now() + LEGACY_CLASSIFICATION_TTL_MS);\n } else {\n legacyConnectionExpiresAt.delete(cacheKey);\n }\n evictLeastRecentlyUsed();\n } else if (generation !== connectionGeneration) {\n await closeModernClient(client).catch(() => {});\n throw new Error('MCP connection completed after connection teardown');\n }\n return client;\n })\n .finally(() => {\n if (pendingModernConnections.get(cacheKey) === promise) pendingModernConnections.delete(cacheKey);\n });\n pendingModernConnections.set(cacheKey, promise);\n registerMCPConnectionScopePending(promise);\n return promise;\n}\n\nasync function callOnModernClient(\n client: Client,\n toolName: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<CallToolResponse> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n return (await client.callTool(\n { name: toolName, arguments: args },\n {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n }\n )) as CallToolResponse;\n}\n\nasync function attemptModernCall(\n options: ModernConnectionOptions,\n toolName: string,\n args: Record<string, unknown>\n): Promise<ModernMCPAttempt> {\n const authHeaders = buildAuthHeaders(options.authToken, options.customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n options.agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n if (isKnownLegacy(cacheKey)) return { handled: false };\n\n const guardedConnection =\n options.signal !== undefined || options.requestTimeoutMs !== undefined || options.fetchFn !== undefined;\n const oneShot = guardedConnection && currentMCPConnectionScopeKey() === undefined;\n let client: Client;\n let callSucceeded = false;\n try {\n client = oneShot\n ? await createNegotiatedClient(cacheKey, options, authHeaders)\n : await getOrCreateModernConnection(cacheKey, options, authHeaders);\n } catch (error) {\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) {\n markKnownLegacy(cacheKey);\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Modern Streamable HTTP is unavailable (HTTP ${status}); preserving the v1 transport path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n if (isLegacyEraNegotiationFailure(error, status)) {\n markKnownLegacy(cacheKey);\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Era negotiation failed for ${toolName}; preserving the v1 transport path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n throw error;\n }\n\n if (client.getProtocolEra() !== 'modern') {\n if (options.handleLegacy === true) {\n options.debugLogs.push({\n type: 'info',\n message: `MCP: v2 client selected the legacy protocol era for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n } else {\n markKnownLegacy(cacheKey);\n try {\n await closeModernClient(client);\n } catch {\n /* ignore close errors */\n }\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Server selected the legacy protocol era for ${toolName}; preserving the v1 Tasks path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n }\n\n options.debugLogs.push({\n type: 'success',\n message: `MCP: Negotiated protocol ${client.getNegotiatedProtocolVersion()} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n try {\n const response = await callOnModernClient(client, toolName, args, options.signal, options.requestTimeoutMs);\n callSucceeded = true;\n return { handled: true, response };\n } catch (error) {\n // A tool request may have reached the server even when its response was\n // lost. Never replay automatically: mutating AdCP tools depend on the\n // caller's explicit idempotency policy, not transport guesswork.\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n modernDiscoveries.delete(cacheKey);\n try {\n await closeModernClient(client, !isAbortOrTimeoutError(error));\n } catch {\n /* ignore close errors */\n }\n throw error;\n } finally {\n if (oneShot && client && callSucceeded) await closeModernClient(client).catch(() => {});\n }\n}\n\n/**\n * Try a tool call using the MCP 2026-07-28 protocol era.\n *\n * `handled: false` means the caller must use the existing v1 client. This is\n * deliberately a result rather than an exception because legacy negotiation\n * is normal during the transition window.\n */\nexport async function tryCallModernMCPTool(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPAttempt> {\n return withSpan('adcp.mcp.negotiate', { 'adcp.tool': toolName, 'http.url': agentUrl }, () =>\n signingContextStorage.run(options.signingContext, () =>\n attemptModernCall(\n {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs,\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n handleLegacy: options.handleLegacy,\n },\n toolName,\n args\n )\n )\n );\n}\n\n/**\n * Probe an endpoint with the official v2 client's auto negotiation.\n * `connected: false` lets endpoint discovery retain its v1 SSE fallback.\n */\nexport async function probeModernMCPConnection(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<{ connected: boolean; era?: 'legacy' | 'modern' }> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n handleLegacy: options.handleLegacy,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n let client: Client | undefined;\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders, false);\n return { connected: true, era: client.getProtocolEra() };\n } catch (error) {\n modernDiscoveries.delete(cacheKey);\n if (is401Error(error) || isAbortOrTimeoutError(error)) throw error;\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) return { connected: false };\n if (isLegacyEraNegotiationFailure(error, status)) return { connected: false };\n throw error;\n } finally {\n if (client) await closeModernClient(client).catch(() => {});\n }\n}\n\n/** List tools when the endpoint selected the modern era; otherwise let the v1 caller continue. */\nexport async function tryListModernMCPTools(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPListAttempt> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n let client: Client | undefined;\n const listTools = async (connectedClient: Client): Promise<ModernMCPListAttempt> => {\n if (connectedClient.getProtocolEra() !== 'modern') return { handled: false };\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const result = await connectedClient.listTools(undefined, {\n ...(options.signal && { signal: options.signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n });\n return { handled: true, tools: result.tools };\n };\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders);\n return await listTools(client);\n } catch (error) {\n let failure = error;\n modernDiscoveries.delete(cacheKey);\n if (!is401Error(failure) && !isAbortOrTimeoutError(failure) && client && clientsUsingCachedDiscovery.has(client)) {\n await closeModernClient(client, false).catch(() => {});\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders, false);\n return await listTools(client);\n } catch (retryError) {\n failure = retryError;\n modernDiscoveries.delete(cacheKey);\n }\n }\n if (is401Error(failure) || isAbortOrTimeoutError(failure)) throw failure;\n const status = httpStatusOf(failure);\n if (status === 404 || status === 405) return { handled: false };\n if (isLegacyEraNegotiationFailure(failure, status)) return { handled: false };\n throw failure;\n } finally {\n if (client) await closeModernClient(client).catch(() => {});\n }\n}\n\nexport async function closeModernMCPConnections(): Promise<void> {\n connectionGeneration++;\n const pending = [...pendingModernConnections.values()];\n pendingModernConnections.clear();\n const settled = await Promise.allSettled(pending);\n const clients = new Set(modernConnections.values());\n for (const result of settled) {\n if (result.status === 'fulfilled') clients.add(result.value);\n }\n modernConnections.clear();\n legacyConnectionExpiresAt.clear();\n knownLegacyConnections.clear();\n modernDiscoveries.clear();\n for (const client of clients) {\n try {\n await closeModernClient(client);\n } catch {\n /* ignore close errors */\n }\n }\n}\n"],"mappings":"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","names":["require"]}
1
+ {"version":3,"sources":["../../../src/lib/protocols/mcp-modern.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n/**\n * MCP 2026-07-28 client path.\n *\n * The v2 SDK removed the experimental 2025 Tasks interception API. During the\n * migration window we therefore negotiate with the v2 client first and use it\n * only when the peer selects the modern protocol era. Legacy peers fall back\n * to mcp-tasks.ts, which keeps the existing v1 Tasks behavior intact.\n */\n\nimport {\n Client,\n SdkError,\n SdkErrorCode,\n StreamableHTTPClientTransport,\n type DiscoverResult,\n type OAuthClientProvider as ModernOAuthClientProvider,\n type PriorDiscovery,\n type Tool,\n} from '@modelcontextprotocol/client';\nimport { createHmac } from 'node:crypto';\nimport { createMCPRequestHeaders } from '../auth';\nimport { is401Error } from '../errors';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport {\n currentMCPConnectionScopeKey,\n isMCPConnectionScopeCacheKeyActive,\n registerMCPConnectionScopeCleanup,\n registerMCPConnectionScopePending,\n} from './mcp-scope';\nimport { terminateSessionBestEffort } from './session-termination';\nimport { buildAgentSigningFetch, signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport type { DebugLogEntry } from '../types/adcp';\nimport {\n isAbortOrTimeoutError,\n resolveClientRequestTimeoutMs,\n resolveRequestTimeoutMs,\n withAbortSignal,\n} from './abort';\nimport { wrapFetchWithCapture } from './rawResponseCapture';\nimport { wrapFetchWithSizeLimit } from './responseSizeLimit';\nimport { wrapFetchWithTransportDiagnostics } from './transportDiagnostics';\nimport { createAgentTransportFetch } from '../net/agent-transport-fetch';\n\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\nexport type ModernMCPAttempt = { handled: false } | { handled: true; response: CallToolResponse };\nexport type ModernMCPListAttempt = { handled: false } | { handled: true; tools: Tool[] };\n\nexport interface ModernMCPConnectionOptions {\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n /** Use the v2 SDK's negotiated legacy client instead of handing off to v1. */\n handleLegacy?: boolean;\n}\n\ninterface ModernConnectionOptions {\n agentUrl: string;\n authToken?: string;\n customHeaders?: Record<string, string>;\n debugLogs: DebugLogEntry[];\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n handleLegacy?: boolean;\n}\n\nconst modernConnections = new Map<string, Client>();\nconst legacyConnectionExpiresAt = new Map<string, number>();\nconst pendingModernConnections = new Map<string, Promise<Client>>();\nconst modernTransports = new WeakMap<Client, StreamableHTTPClientTransport>();\nconst knownLegacyConnections = new Map<string, number>();\nconst modernDiscoveries = new Map<string, { discover: DiscoverResult; expiresAt: number }>();\nconst clientsUsingCachedDiscovery = new WeakSet<Client>();\nconst MAX_CACHED_CONNECTIONS = 20;\nconst LEGACY_CLASSIFICATION_TTL_MS = 5 * 60 * 1000;\nconst MODERN_DISCOVERY_TTL_MS = 5 * 60 * 1000;\nconst modernOAuthProviderIds = new WeakMap<object, string>();\nconst modernFetchFnIds = new WeakMap<typeof fetch, string>();\nconst modernSignalIds = new WeakMap<AbortSignal, string>();\nlet nextModernOAuthProviderId = 0;\nlet nextModernFetchFnId = 0;\nlet nextModernSignalId = 0;\nlet connectionGeneration = 0;\n\nasync function closeModernClient(client: Client, terminateSession = true): Promise<void> {\n const transport = modernTransports.get(client);\n modernTransports.delete(client);\n if (terminateSession && transport?.sessionId) {\n await terminateSessionBestEffort(transport);\n }\n await client.close();\n}\n\nfunction cacheDisambiguator(value: string): string {\n return createHmac('sha256', '').update(value).digest('hex');\n}\n\nfunction buildAuthHeaders(\n authToken: string | undefined,\n customHeaders: Record<string, string> | undefined,\n authProvider?: object\n): Record<string, string> {\n const filteredHeaders =\n authProvider || authToken\n ? Object.fromEntries(\n Object.entries(customHeaders ?? {}).filter(keyValue => {\n const key = keyValue[0].toLowerCase();\n return key !== 'authorization' && key !== 'x-adcp-auth';\n })\n )\n : customHeaders;\n return createMCPRequestHeaders(filteredHeaders, authProvider ? undefined : authToken);\n}\n\nfunction oauthProviderCacheKey(provider: object | undefined): string | undefined {\n if (!provider) return undefined;\n let key = modernOAuthProviderIds.get(provider);\n if (!key) {\n key = `oauth-provider:${++nextModernOAuthProviderId}`;\n modernOAuthProviderIds.set(provider, key);\n }\n return key;\n}\n\nfunction fetchFnCacheKey(fetchFn: typeof fetch | undefined): string | undefined {\n if (!fetchFn) return undefined;\n let key = modernFetchFnIds.get(fetchFn);\n if (!key) {\n key = `fetch:${++nextModernFetchFnId}`;\n modernFetchFnIds.set(fetchFn, key);\n }\n return key;\n}\n\nfunction signalCacheKey(signal: AbortSignal | undefined): string | undefined {\n if (!signal) return undefined;\n let key = modernSignalIds.get(signal);\n if (!key) {\n key = `signal:${++nextModernSignalId}`;\n modernSignalIds.set(signal, key);\n }\n return key;\n}\n\nfunction connectionCacheKey(\n agentUrl: string,\n headers: Record<string, string>,\n signingCacheKey?: string,\n authProvider?: object,\n fetchFn?: typeof fetch,\n signal?: AbortSignal,\n requestTimeoutMs?: number,\n handleLegacy?: boolean,\n allowPrivateIp?: boolean\n): string {\n const normalizedHeaders = Object.entries(headers)\n .map(([key, value]) => [key.toLowerCase(), value] as const)\n .sort(([left], [right]) => left.localeCompare(right));\n const parts = [agentUrl, `headers:${cacheDisambiguator(JSON.stringify(normalizedHeaders))}`];\n if (signingCacheKey) parts.push(signingCacheKey);\n const providerKey = oauthProviderCacheKey(authProvider);\n if (providerKey) parts.push(providerKey);\n const fetchKey = fetchFnCacheKey(fetchFn);\n if (fetchKey) parts.push(fetchKey);\n const signalKey = signalCacheKey(signal);\n if (signalKey) parts.push(signalKey);\n if (requestTimeoutMs !== undefined) parts.push(`timeout:${requestTimeoutMs}`);\n if (handleLegacy !== undefined) parts.push(`handle-legacy:${handleLegacy}`);\n if (allowPrivateIp !== undefined) parts.push(`allow-private-ip:${allowPrivateIp}`);\n const scopeKey = currentMCPConnectionScopeKey();\n if (scopeKey) parts.push(scopeKey);\n return parts.join('::');\n}\n\nfunction isKnownLegacy(cacheKey: string): boolean {\n const classifiedAt = knownLegacyConnections.get(cacheKey);\n if (classifiedAt === undefined) return false;\n if (Date.now() - classifiedAt > LEGACY_CLASSIFICATION_TTL_MS) {\n knownLegacyConnections.delete(cacheKey);\n return false;\n }\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, classifiedAt);\n return true;\n}\n\nfunction markKnownLegacy(cacheKey: string): void {\n modernDiscoveries.delete(cacheKey);\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, Date.now());\n while (knownLegacyConnections.size > MAX_CACHED_CONNECTIONS) {\n const oldest = knownLegacyConnections.keys().next().value;\n if (!oldest) break;\n knownLegacyConnections.delete(oldest);\n }\n}\n\nfunction getCachedModernDiscovery(cacheKey: string): PriorDiscovery | undefined {\n const cached = modernDiscoveries.get(cacheKey);\n if (!cached) return undefined;\n if (cached.expiresAt <= Date.now()) {\n modernDiscoveries.delete(cacheKey);\n return undefined;\n }\n modernDiscoveries.delete(cacheKey);\n modernDiscoveries.set(cacheKey, cached);\n return { kind: 'modern', discover: cached.discover };\n}\n\nfunction cacheModernDiscovery(cacheKey: string, discover: DiscoverResult): void {\n modernDiscoveries.delete(cacheKey);\n modernDiscoveries.set(cacheKey, {\n discover,\n expiresAt: Date.now() + MODERN_DISCOVERY_TTL_MS,\n });\n while (modernDiscoveries.size > MAX_CACHED_CONNECTIONS) {\n const oldest = modernDiscoveries.keys().next().value;\n if (!oldest) break;\n modernDiscoveries.delete(oldest);\n }\n}\n\nfunction httpStatusOf(error: unknown, depth = 0): number | undefined {\n if (!error || typeof error !== 'object' || depth > 4) return undefined;\n const candidate = error as { status?: unknown; code?: unknown; cause?: unknown; response?: { status?: unknown } };\n if (typeof candidate.status === 'number') return candidate.status;\n if (typeof candidate.response?.status === 'number') return candidate.response.status;\n if (typeof candidate.code === 'number' && candidate.code >= 100 && candidate.code <= 599) return candidate.code;\n return httpStatusOf(candidate.cause, depth + 1);\n}\n\nfunction isLegacyEraNegotiationFailure(error: unknown, status = httpStatusOf(error)): boolean {\n // Stable MCP SDK v2 uses EraNegotiationFailed for HTTP 5xx responses so\n // callers preserve infrastructure failures instead of treating them as\n // evidence of a legacy endpoint. Only status-less negotiation failures\n // (for example a malformed legacy response) retain the v1 fallback.\n return status === undefined && SdkError.isInstance(error) && error.code === SdkErrorCode.EraNegotiationFailed;\n}\n\nfunction withPerRequestTraceHeaders(fetchImpl: typeof fetch): typeof fetch {\n return (input, init) => {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n new Headers(init?.headers).forEach((value, key) => headers.set(key, value));\n for (const [key, value] of Object.entries(injectTraceHeaders())) headers.set(key, value);\n return fetchImpl(input, { ...init, headers });\n };\n}\n\nfunction getCachedConnection(cacheKey: string): Client | undefined {\n const client = modernConnections.get(cacheKey);\n if (client) {\n const legacyExpiry = legacyConnectionExpiresAt.get(cacheKey);\n if (legacyExpiry !== undefined && legacyExpiry <= Date.now()) {\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n void closeModernClient(client).catch(() => {});\n return undefined;\n }\n modernConnections.delete(cacheKey);\n modernConnections.set(cacheKey, client);\n }\n return client;\n}\n\nfunction evictLeastRecentlyUsed(): void {\n if (modernConnections.size <= MAX_CACHED_CONNECTIONS) return;\n const oldestKey = [...modernConnections.keys()].find(key => !isMCPConnectionScopeCacheKeyActive(key));\n if (!oldestKey) return;\n const client = modernConnections.get(oldestKey);\n modernConnections.delete(oldestKey);\n legacyConnectionExpiresAt.delete(oldestKey);\n if (client) void closeModernClient(client).catch(() => {});\n}\n\n/**\n * Did this connect fail because the era-negotiation probe was answered with\n * `401`/`403`? That is the one probe outcome the MCP client classifies as\n * terminal instead of falling back to the legacy era.\n */\nfunction isNegotiationAuthFailure(error: unknown): boolean {\n return is401Error(error) || httpStatusOf(error) === 403;\n}\n\n/**\n * Were we already presenting a static credential on the probe?\n *\n * This is the line between \"the server is challenging us to authenticate\" and\n * \"the server refused this method\". With no credential, a `401` is a real\n * challenge and the caller wants it: `discoverMCPEndpoint` walks the\n * `WWW-Authenticate` / RFC 9728 chain and reports how to authenticate. With an\n * OAuth provider, a `401` is the provider's cue to refresh, so it must reach\n * the OAuth machinery untouched. Only a static token/header credential that the\n * server rejected *on the probe alone* tells us nothing about the credential,\n * and that is the case worth retrying on the legacy transport.\n */\nfunction presentedStaticCredential(authHeaders: Record<string, string>, authProvider?: object): boolean {\n if (authProvider) return false;\n return Object.keys(authHeaders).some(key => {\n const lower = key.toLowerCase();\n return lower === 'authorization' || lower === 'x-adcp-auth';\n });\n}\n\nasync function createNegotiatedClient(\n cacheKey: string,\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>,\n useCachedDiscovery = true,\n /**\n * Skip the `server/discover` probe and `initialize` straight into the legacy\n * era. Set only on the retry after a negotiation-time 401/403 — see the catch\n * block below.\n */\n skipProbe = false\n): Promise<Client> {\n const generation = connectionGeneration;\n const requestTimeoutMs = resolveRequestTimeoutMs(options.requestTimeoutMs);\n const clientRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const rawNetworkFetch = createAgentTransportFetch(options.agentUrl, {\n trustedFetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n originBoundHeaders: Object.keys(options.customHeaders ?? {}),\n crossOriginCredentialPolicy: 'strip',\n });\n const networkFetch: typeof fetch = (input, init) =>\n withAbortSignal<Response>([init?.signal], requestTimeoutMs, signal => rawNetworkFetch(input, { ...init, signal }));\n const diagnosticFetch = wrapFetchWithTransportDiagnostics(wrapFetchWithSizeLimit(networkFetch));\n const signedFetch: typeof fetch = options.signingContext\n ? (buildAgentSigningFetch({\n upstream: diagnosticFetch,\n signing: options.signingContext.signing,\n getCapability: options.signingContext.getCapability,\n }) as typeof fetch)\n : diagnosticFetch;\n const transport = new StreamableHTTPClientTransport(new URL(options.agentUrl), {\n requestInit: { headers: authHeaders, redirect: 'manual' },\n fetch: wrapFetchWithCapture(withPerRequestTraceHeaders(signedFetch)),\n ...(options.authProvider && {\n authProvider: options.authProvider as ModernOAuthClientProvider,\n }),\n });\n const client = new Client(\n { name: 'AdCP-Client', version: '1.0.0' },\n {\n versionNegotiation: {\n mode: 'auto',\n ...(clientRequestTimeoutMs !== undefined && { probe: { timeoutMs: clientRequestTimeoutMs } }),\n },\n }\n );\n\n const prior = skipProbe\n ? ({ kind: 'legacy' } as const)\n : useCachedDiscovery\n ? getCachedModernDiscovery(cacheKey)\n : undefined;\n try {\n await client.connect(transport, {\n ...(options.signal && { signal: options.signal }),\n ...(clientRequestTimeoutMs !== undefined && { timeout: clientRequestTimeoutMs }),\n ...(prior && { prior }),\n });\n modernTransports.set(client, transport);\n if (prior && !skipProbe) clientsUsingCachedDiscovery.add(client);\n if (!prior) {\n const discover = client.getDiscoverResult();\n if (generation === connectionGeneration) {\n if (client.getProtocolEra() === 'modern' && discover) cacheModernDiscovery(cacheKey, discover);\n else modernDiscoveries.delete(cacheKey);\n }\n }\n return client;\n } catch (error) {\n if (prior && !skipProbe) modernDiscoveries.delete(cacheKey);\n try {\n await closeModernClient(client, false);\n } catch {\n /* ignore close errors */\n }\n // `!skipProbe` keeps the explicit-legacy retry terminal. Re-probing here is\n // only meaningful when `prior` was a *cached modern* discovery that has gone\n // stale — dropping the cache and negotiating afresh can then succeed. On the\n // `skipProbe` retry `prior` is the synthetic `{ kind: 'legacy' }`: there is\n // no stale cache to discard, and recursing would reset `skipProbe` to its\n // default and re-enter the probe→legacy retry below a second time.\n //\n // Reachability: server-driven failures on this path surface as\n // `SdkHttpError` (measured: a 5xx legacy `initialize` gives\n // `CLIENT_HTTP_NOT_IMPLEMENTED`, a malformed body\n // `CLIENT_HTTP_UNEXPECTED_CONTENT`), so no server can drive the cycle today.\n // But `EraNegotiationFailed` is not unreachable under `prior`: the client\n // raises it from `_legacyHandshake` when `supportedProtocolVersions` offers\n // no pre-2026-07-28 version, and for an unrecognized `prior` shape. Those\n // depend on client construction and the library's error taxonomy — both of\n // which moved under us in the 2.0.0-beta.4 -> 2.0.0 bump. The guard makes\n // the bound independent of them.\n if (prior && !skipProbe && SdkError.isInstance(error) && error.code === SdkErrorCode.EraNegotiationFailed) {\n return createNegotiatedClient(cacheKey, options, authHeaders, false);\n }\n // Era negotiation is meant to be automatic: `mode: 'auto'` documents that\n // \"definitive legacy signals (and anything unrecognized) fall back to the\n // plain legacy `initialize` handshake\". 401/403 are the sole exception in\n // the MCP client's classifier (`classifyHttpError`), which is right when we\n // hold no credential — then a 401 IS the server's challenge and the caller\n // needs it — and wrong when we already presented one the server accepts on\n // other methods. In that case the refusal is a verdict on\n // `server/discover`, not on the credential, and the automatic fallback\n // should have run. Do it here: skip the probe and `initialize` directly,\n // the escape hatch the SDK documents for a server known to be legacy. If\n // the credential really is bad, that connect fails on its own and surfaces\n // the server's 401.\n if (isNegotiationAuthFailure(error) && !skipProbe && presentedStaticCredential(authHeaders, options.authProvider)) {\n return createNegotiatedClient(cacheKey, options, authHeaders, useCachedDiscovery, true);\n }\n throw error;\n }\n}\n\nasync function getOrCreateModernConnection(\n cacheKey: string,\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>\n): Promise<Client> {\n const cached = getCachedConnection(cacheKey);\n if (cached) return cached;\n\n const pending = pendingModernConnections.get(cacheKey);\n if (pending) return pending;\n\n const generation = connectionGeneration;\n const promise = createNegotiatedClient(cacheKey, options, authHeaders)\n .then(async client => {\n if (\n (client.getProtocolEra() === 'modern' || options.handleLegacy === true) &&\n generation === connectionGeneration\n ) {\n modernConnections.set(cacheKey, client);\n registerMCPConnectionScopeCleanup('modern', cacheKey, async () => {\n if (modernConnections.get(cacheKey) !== client) return;\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n modernDiscoveries.delete(cacheKey);\n await closeModernClient(client);\n });\n if (client.getProtocolEra() === 'legacy') {\n legacyConnectionExpiresAt.set(cacheKey, Date.now() + LEGACY_CLASSIFICATION_TTL_MS);\n } else {\n legacyConnectionExpiresAt.delete(cacheKey);\n }\n evictLeastRecentlyUsed();\n } else if (generation !== connectionGeneration) {\n await closeModernClient(client).catch(() => {});\n throw new Error('MCP connection completed after connection teardown');\n }\n return client;\n })\n .finally(() => {\n if (pendingModernConnections.get(cacheKey) === promise) pendingModernConnections.delete(cacheKey);\n });\n pendingModernConnections.set(cacheKey, promise);\n registerMCPConnectionScopePending(promise);\n return promise;\n}\n\nasync function callOnModernClient(\n client: Client,\n toolName: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<CallToolResponse> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n return (await client.callTool(\n { name: toolName, arguments: args },\n {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n }\n )) as CallToolResponse;\n}\n\nasync function attemptModernCall(\n options: ModernConnectionOptions,\n toolName: string,\n args: Record<string, unknown>\n): Promise<ModernMCPAttempt> {\n const authHeaders = buildAuthHeaders(options.authToken, options.customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n options.agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n if (isKnownLegacy(cacheKey)) return { handled: false };\n\n const guardedConnection =\n options.signal !== undefined || options.requestTimeoutMs !== undefined || options.fetchFn !== undefined;\n const oneShot = guardedConnection && currentMCPConnectionScopeKey() === undefined;\n let client: Client;\n let callSucceeded = false;\n try {\n client = oneShot\n ? await createNegotiatedClient(cacheKey, options, authHeaders)\n : await getOrCreateModernConnection(cacheKey, options, authHeaders);\n } catch (error) {\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) {\n markKnownLegacy(cacheKey);\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Modern Streamable HTTP is unavailable (HTTP ${status}); preserving the v1 transport path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n if (isLegacyEraNegotiationFailure(error, status)) {\n markKnownLegacy(cacheKey);\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Era negotiation failed for ${toolName}; preserving the v1 transport path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n throw error;\n }\n\n if (client.getProtocolEra() !== 'modern') {\n if (options.handleLegacy === true) {\n options.debugLogs.push({\n type: 'info',\n message: `MCP: v2 client selected the legacy protocol era for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n } else {\n markKnownLegacy(cacheKey);\n try {\n await closeModernClient(client);\n } catch {\n /* ignore close errors */\n }\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Server selected the legacy protocol era for ${toolName}; preserving the v1 Tasks path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n }\n\n options.debugLogs.push({\n type: 'success',\n message: `MCP: Negotiated protocol ${client.getNegotiatedProtocolVersion()} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n try {\n const response = await callOnModernClient(client, toolName, args, options.signal, options.requestTimeoutMs);\n callSucceeded = true;\n return { handled: true, response };\n } catch (error) {\n // A tool request may have reached the server even when its response was\n // lost. Never replay automatically: mutating AdCP tools depend on the\n // caller's explicit idempotency policy, not transport guesswork.\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n modernDiscoveries.delete(cacheKey);\n try {\n await closeModernClient(client, !isAbortOrTimeoutError(error));\n } catch {\n /* ignore close errors */\n }\n throw error;\n } finally {\n if (oneShot && client && callSucceeded) await closeModernClient(client).catch(() => {});\n }\n}\n\n/**\n * Try a tool call using the MCP 2026-07-28 protocol era.\n *\n * `handled: false` means the caller must use the existing v1 client. This is\n * deliberately a result rather than an exception because legacy negotiation\n * is normal during the transition window.\n */\nexport async function tryCallModernMCPTool(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPAttempt> {\n return withSpan('adcp.mcp.negotiate', { 'adcp.tool': toolName, 'http.url': agentUrl }, () =>\n signingContextStorage.run(options.signingContext, () =>\n attemptModernCall(\n {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs,\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n handleLegacy: options.handleLegacy,\n },\n toolName,\n args\n )\n )\n );\n}\n\n/**\n * Probe an endpoint with the official v2 client's auto negotiation.\n * `connected: false` lets endpoint discovery retain its v1 SSE fallback.\n */\nexport async function probeModernMCPConnection(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<{ connected: boolean; era?: 'legacy' | 'modern' }> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n handleLegacy: options.handleLegacy,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n let client: Client | undefined;\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders, false);\n return { connected: true, era: client.getProtocolEra() };\n } catch (error) {\n modernDiscoveries.delete(cacheKey);\n if (is401Error(error) || isAbortOrTimeoutError(error)) throw error;\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) return { connected: false };\n if (isLegacyEraNegotiationFailure(error, status)) return { connected: false };\n throw error;\n } finally {\n if (client) await closeModernClient(client).catch(() => {});\n }\n}\n\n/** List tools when the endpoint selected the modern era; otherwise let the v1 caller continue. */\nexport async function tryListModernMCPTools(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPListAttempt> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n let client: Client | undefined;\n const listTools = async (connectedClient: Client): Promise<ModernMCPListAttempt> => {\n if (connectedClient.getProtocolEra() !== 'modern') return { handled: false };\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const result = await connectedClient.listTools(undefined, {\n ...(options.signal && { signal: options.signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n });\n return { handled: true, tools: result.tools };\n };\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders);\n return await listTools(client);\n } catch (error) {\n let failure = error;\n modernDiscoveries.delete(cacheKey);\n if (!is401Error(failure) && !isAbortOrTimeoutError(failure) && client && clientsUsingCachedDiscovery.has(client)) {\n await closeModernClient(client, false).catch(() => {});\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders, false);\n return await listTools(client);\n } catch (retryError) {\n failure = retryError;\n modernDiscoveries.delete(cacheKey);\n }\n }\n if (is401Error(failure) || isAbortOrTimeoutError(failure)) throw failure;\n const status = httpStatusOf(failure);\n if (status === 404 || status === 405) return { handled: false };\n if (isLegacyEraNegotiationFailure(failure, status)) return { handled: false };\n throw failure;\n } finally {\n if (client) await closeModernClient(client).catch(() => {});\n }\n}\n\nexport async function closeModernMCPConnections(): Promise<void> {\n connectionGeneration++;\n const pending = [...pendingModernConnections.values()];\n pendingModernConnections.clear();\n const settled = await Promise.allSettled(pending);\n const clients = new Set(modernConnections.values());\n for (const result of settled) {\n if (result.status === 'fulfilled') clients.add(result.value);\n }\n modernConnections.clear();\n legacyConnectionExpiresAt.clear();\n knownLegacyConnections.clear();\n modernDiscoveries.clear();\n for (const client of clients) {\n try {\n await closeModernClient(client);\n } catch {\n /* ignore close errors */\n }\n }\n}\n"],"mappings":"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","names":["require"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tasks.d.ts","sourceRoot":"","sources":["../../../src/lib/protocols/mcp-tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-tasks.d.ts","sourceRoot":"","sources":["../../../src/lib/protocols/mcp-tasks.ts"],"names":[],"mappings":"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"}
@@ -154,7 +154,8 @@ async function callMCPToolWithTasks(agentUrl, toolName, args, authToken, debugLo
154
154
  {
155
155
  signal: options?.signal,
156
156
  requestTimeoutMs: options?.requestTimeoutMs,
157
- allowPrivateIp: options?.allowPrivateIp
157
+ allowPrivateIp: options?.allowPrivateIp,
158
+ originBoundHeaders: Object.keys(customHeaders ?? {})
158
159
  }
159
160
  );
160
161
  })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/protocols/mcp-tasks.ts"],"sourcesContent":["/**\n * MCP Tasks protocol integration for async tool calls.\n *\n * When an MCP server declares `capabilities.tasks.requests.tools.call`, this module\n * uses the SDK's experimental tasks API instead of custom AdCP tool calls for async\n * lifecycle management. This removes the LLM from the polling path.\n *\n * Detection: check `client.getServerCapabilities()?.tasks?.requests?.tools?.call`\n * after connection. The SDK's `isToolTask()` auto-detects per-tool `taskSupport`.\n */\n\nimport type { Client as MCPClient } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { DebugLogEntry } from '../types/adcp';\nimport type { TaskInfo } from '../core/ConversationTypes';\nimport { withCachedConnection } from './mcp';\nimport { createMCPRequestHeaders } from '../auth';\nimport { withSpan } from '../observability/tracing';\nimport { signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport { redactArgsForLog as sharedRedactArgsForLog } from '../utils/redact-args';\nimport { withResponseSizeLimit } from './responseSizeLimit';\nimport { withTransportDiagnostics, type TransportActivityHandler } from './transportDiagnostics';\nimport { isAbortOrTimeoutError, resolveClientRequestTimeoutMs } from './abort';\nimport { tryCallModernMCPTool } from './mcp-modern';\n\n/** Response shape returned by MCPClient.callTool(). */\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\ninterface MCPTaskProtocolOptions {\n transport?: {\n maxResponseBytes?: number;\n trustedFetchFn?: typeof fetch;\n requestTimeoutMs?: number;\n allowPrivateIp?: boolean;\n };\n onTransportActivity?: TransportActivityHandler;\n transportActivityContext?: {\n agentId: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n };\n}\n\n/**\n * Track which MCP clients have had listTools() called.\n * The SDK's isToolTask() needs tool metadata from listTools() to determine\n * per-tool taskSupport. Without this, callToolStream silently degrades to\n * a synchronous tools/call (no task creation).\n */\nconst toolsListedClients = new WeakSet<MCPClient>();\n\n/**\n * Ensure tool metadata is cached in the SDK so isToolTask() works.\n * Called once per client connection when tasks are supported.\n */\nasync function ensureToolsListed(client: MCPClient, signal?: AbortSignal, requestTimeoutMs?: number): Promise<void> {\n if (toolsListedClients.has(client)) return;\n await client.listTools(undefined, {\n ...(signal && { signal }),\n ...(requestTimeoutMs !== undefined && { timeout: requestTimeoutMs }),\n });\n toolsListedClients.add(client);\n}\n\n/**\n * Check if an MCP server supports the Tasks protocol for tool calls.\n */\nexport function serverSupportsTasks(client: MCPClient): boolean {\n const caps = client.getServerCapabilities();\n return !!(caps as Record<string, any>)?.tasks?.requests?.tools?.call;\n}\n\n/**\n * Map MCP Tasks status to AdCP status.\n *\n * MCP Tasks uses underscores and British spelling; AdCP uses hyphens and American spelling.\n */\nexport function mapMCPTaskStatus(mcpStatus: string): string {\n switch (mcpStatus) {\n case 'working':\n return 'working';\n case 'input_required':\n return 'input-required';\n case 'completed':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'cancelled':\n return 'canceled';\n default:\n return mcpStatus;\n }\n}\n\n/**\n * Map an MCP Task object to an AdCP TaskInfo.\n */\nfunction mapMCPTaskToTaskInfo(\n task: {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName?: string\n): TaskInfo {\n // Project `statusMessage → TaskInfo.error` against the\n // POST-MAPPING AdCP status (not the raw MCP-side status). MCP\n // Tasks emits `'cancelled'` (British) and never `'rejected'` as a\n // standard status; checking against the AdCP set after mapping\n // catches all terminal failures uniformly. Sellers that extend\n // MCP with custom statuses (e.g. emit `'rejected'` via spec\n // extension) flow through unchanged via the `default` arm of\n // {@link mapMCPTaskStatus}.\n const adcpStatus = mapMCPTaskStatus(task.status);\n const isTerminalFailure = adcpStatus === 'failed' || adcpStatus === 'rejected' || adcpStatus === 'canceled';\n return {\n taskId: task.taskId,\n status: adcpStatus,\n taskType: toolName ?? 'unknown',\n createdAt: new Date(task.createdAt).getTime(),\n updatedAt: new Date(task.lastUpdatedAt).getTime(),\n error: isTerminalFailure ? task.statusMessage : undefined,\n };\n}\n\n/**\n * Build auth headers for MCP connections.\n */\nfunction buildAuthHeaders(authToken?: string, customHeaders?: Record<string, string>): Record<string, string> {\n return createMCPRequestHeaders(customHeaders, authToken);\n}\n\n/**\n * Redact sensitive fields from tool args before logging.\n *\n * Redacts:\n * - `push_notification_config.authentication` — webhook signing secret\n * - `idempotency_key` — retry-pattern oracle within the seller's TTL; opt-in\n * full logging via `ADCP_LOG_IDEMPOTENCY_KEYS=1`\n */\nfunction redactArgsForLog(args: Record<string, unknown>): Record<string, unknown> {\n return sharedRedactArgsForLog(args);\n}\n\n/**\n * Validate taskId before passing to protocol methods.\n */\nfunction validateTaskId(taskId: string): void {\n if (!taskId || typeof taskId !== 'string' || taskId.length > 256) {\n throw new Error(`Invalid taskId: expected non-empty string (max 256 chars)`);\n }\n}\n\n/**\n * Call an MCP tool with Tasks protocol support.\n *\n * If the server supports MCP Tasks and the tool has `taskSupport: 'optional' | 'required'`,\n * uses `callToolStream()` which handles task creation, polling, and result retrieval.\n *\n * If the server doesn't support tasks, falls back to regular `client.callTool()`.\n *\n * The stream is consumed with a timeout. If the task doesn't complete within the timeout,\n * returns a working-status response with the MCP task_id for follow-up polling.\n */\nexport async function callMCPToolWithTasks(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options?: {\n workingTimeout?: number;\n signingContext?: AgentSigningContext;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n }\n): Promise<unknown> {\n // Keep the public debug-log contract identical across modern and legacy\n // protocol eras. Era negotiation happens after these common entries; the\n // selected transport appends its own connection diagnostics.\n debugLogs.push({\n type: 'info',\n message: `MCP: Auth configuration`,\n timestamp: new Date().toISOString(),\n hasAuth: !!authToken,\n headers: authToken ? { 'x-adcp-auth': '***' } : {},\n customHeaderKeys: customHeaders ? Object.keys(customHeaders) : [],\n });\n\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n\n if (authToken) {\n debugLogs.push({\n type: 'info',\n message: `MCP: Transport configured with x-adcp-auth header for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n }\n\n const modernAttempt = await tryCallModernMCPTool(agentUrl, toolName, args, authToken, debugLogs, customHeaders, {\n ...(options?.signingContext && { signingContext: options.signingContext }),\n ...(options?.signal && { signal: options.signal }),\n ...(options?.requestTimeoutMs !== undefined && { requestTimeoutMs: options.requestTimeoutMs }),\n ...(options?.fetchFn && { fetchFn: options.fetchFn }),\n ...(options?.allowPrivateIp !== undefined && { allowPrivateIp: options.allowPrivateIp }),\n });\n if (modernAttempt.handled) {\n debugLogs.push({\n type: modernAttempt.response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${modernAttempt.response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: modernAttempt.response,\n });\n return modernAttempt.response;\n }\n\n return withSpan(\n 'adcp.mcp.call_tool',\n {\n 'adcp.tool': toolName,\n 'http.url': agentUrl,\n },\n async () =>\n signingContextStorage.run(options?.signingContext, async () => {\n const authHeaders = buildAuthHeaders(authToken, customHeaders);\n const workingTimeout = options?.workingTimeout ?? 120_000;\n\n return withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n toolName,\n client =>\n callToolOnClient(\n client,\n toolName,\n args,\n debugLogs,\n workingTimeout,\n options?.signal,\n options?.requestTimeoutMs\n ),\n options?.fetchFn,\n {\n signal: options?.signal,\n requestTimeoutMs: options?.requestTimeoutMs,\n allowPrivateIp: options?.allowPrivateIp,\n }\n );\n })\n );\n}\n\n/**\n * Call a tool on a pre-connected MCP `Client` without HTTP transport or connection caching.\n *\n * This is the in-process companion to `callMCPToolWithTasks`. It skips URL validation,\n * connection setup, OAuth refresh, and the reconnect-retry path — the caller owns the\n * client lifecycle. All other semantics (tasks protocol detection, stream handling,\n * timeout surfacing) are identical to the URL-based path.\n *\n * Use via `AgentClient.fromMCPClient()`. Not intended for direct import outside the\n * protocols directory.\n */\nexport async function callMCPToolWithClient(\n mcpClient: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[] = [],\n options?: { workingTimeout?: number; signal?: AbortSignal; requestTimeoutMs?: number }\n): Promise<unknown> {\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} (in-process) with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n return callToolOnClient(\n mcpClient,\n toolName,\n args,\n debugLogs,\n options?.workingTimeout ?? 120_000,\n options?.signal,\n options?.requestTimeoutMs\n );\n}\n\n/**\n * Inner dispatch logic shared by `callMCPToolWithTasks` (URL path) and\n * `callMCPToolWithClient` (in-process path). Both paths converge here once\n * a connected `MCPClient` is in hand.\n */\nasync function callToolOnClient(\n client: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[],\n workingTimeout: number,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<unknown> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n const requestOptions = {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n };\n if (!serverSupportsTasks(client)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server does not support tasks, using standard callTool for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n const response = (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n\n debugLogs.push({\n type: response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: response,\n });\n\n return response;\n }\n\n // Ensure tool metadata is cached so the SDK's isToolTask() works correctly.\n // Without this, callToolStream silently skips task creation for tools that\n // declare taskSupport: 'optional' | 'required'.\n await ensureToolsListed(client, signal, resolvedRequestTimeoutMs);\n\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server supports tasks, using callToolStream for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n // Use callToolStream which handles the full task lifecycle\n const stream = client.experimental.tasks.callToolStream({ name: toolName, arguments: args }, undefined, {\n timeout: resolvedRequestTimeoutMs ?? workingTimeout,\n resetTimeoutOnProgress: true,\n ...(signal && { signal }),\n });\n\n let capturedTaskId: string | undefined;\n let capturedTask: { taskId: string; status: string; pollInterval?: number } | undefined;\n\n try {\n for await (const message of stream) {\n switch (message.type) {\n case 'taskCreated':\n capturedTaskId = message.task.taskId;\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Task created ${capturedTaskId} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'taskStatus':\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Status update for ${capturedTaskId}: ${message.task.status}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'result': {\n debugLogs.push({\n type: 'success',\n message: `MCP: Tool ${toolName} response received (success)`,\n timestamp: new Date().toISOString(),\n response: message.result,\n });\n return message.result as CallToolResponse;\n }\n\n case 'error': {\n debugLogs.push({\n type: 'error',\n message: `MCP Tasks: Error for ${toolName}: ${message.error.message}`,\n timestamp: new Date().toISOString(),\n });\n // The MCP Tasks SDK error event may strip structured content.\n // If we have a taskId, fetch the full result to recover adcp_error data\n // and return it as a proper isError response for downstream unwrapping.\n if (capturedTaskId) {\n try {\n const taskResult = await client.experimental.tasks.getTaskResult(\n capturedTaskId,\n undefined,\n requestOptions\n );\n const content = taskResult?.content as Array<{ type: string; text?: string }> | undefined;\n if (content) {\n return {\n isError: true,\n content,\n structuredContent: taskResult?.structuredContent,\n } as unknown as CallToolResponse;\n }\n } catch {\n // Failed to fetch task result — fall through to throw\n }\n }\n throw message.error;\n }\n }\n }\n } catch (error) {\n if (signal?.aborted && isAbortOrTimeoutError(error)) {\n throw error;\n }\n // If we timed out but have a taskId, return a working status\n // so the caller can poll via getMCPTaskStatus/getMCPTaskResult\n if (capturedTaskId && error instanceof Error && /timeout|timed out/i.test(error.message)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Timeout for ${toolName}, returning working status with taskId ${capturedTaskId}`,\n timestamp: new Date().toISOString(),\n });\n\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n if (isAbortOrTimeoutError(error)) {\n throw error;\n }\n // Servers may return a synchronous tool error (e.g. VERSION_UNSUPPORTED)\n // rather than creating a task. The Tasks SDK rejects these with a Zod\n // validation error about a missing `task` field. When no task was\n // captured, fall back to standard callTool so the error response\n // reaches the caller intact.\n const msg = error instanceof Error ? error.message : String(error);\n if (!capturedTaskId && /Invalid task creation result/i.test(msg)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server returned synchronous response for ${toolName}, falling back to callTool`,\n timestamp: new Date().toISOString(),\n });\n return (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n }\n throw error;\n }\n\n // Stream ended without result — shouldn't happen with well-behaved servers\n if (capturedTaskId) {\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n\n throw new Error(`MCP Tasks: callToolStream for ${toolName} ended without result or task`);\n}\n\n/**\n * Get task status via MCP Tasks protocol method (not tool call).\n *\n * Task lifecycle methods (`tasks/get`, `tasks/result`, `tasks/list`,\n * `tasks/cancel`) are MCP protocol methods, not AdCP operations.\n * `extractAdcpOperation` returns `undefined` for them, so the signing fetch\n * passes them through unsigned regardless of whether an `AgentSigningContext`\n * is present in ALS. That matches the RFC 9421 signing profile, which only\n * covers AdCP tool calls (`tools/call` / `message/send`).\n *\n * Re-throws auth errors (401) — only catches protocol capability errors.\n */\nexport async function getMCPTaskStatus(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n toolName?: string\n): Promise<TaskInfo> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/get:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: getTask ${taskId} → ${result.status}`,\n timestamp: new Date().toISOString(),\n });\n return mapMCPTaskToTaskInfo(\n result as {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName\n );\n });\n}\n\n/**\n * Get task result via MCP Tasks protocol method (blocks until terminal).\n */\nexport async function getMCPTaskResult(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<unknown> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/result:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTaskResult(taskId);\n debugLogs.push({\n type: 'success',\n message: `MCP Tasks: getTaskResult ${taskId} received`,\n timestamp: new Date().toISOString(),\n });\n return result;\n });\n}\n\n/**\n * List tasks via MCP Tasks protocol method.\n */\nexport async function listMCPTasks(\n agentUrl: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n options: MCPTaskProtocolOptions = {}\n): Promise<TaskInfo[]> {\n const authHeaders = buildAuthHeaders(authToken);\n\n return withResponseSizeLimit(options.transport?.maxResponseBytes, () =>\n withTransportDiagnostics(\n {\n agentId: options.transportActivityContext?.agentId ?? 'unknown-agent',\n protocol: 'mcp',\n tool: 'tasks/list',\n taskType: 'tasks/list',\n ...options.transportActivityContext,\n onTransportActivity: options.onTransportActivity,\n },\n () =>\n withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n 'tasks/list',\n async client => {\n const result = await client.experimental.tasks.listTasks();\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,\n timestamp: new Date().toISOString(),\n });\n return result.tasks.map((task: any) => mapMCPTaskToTaskInfo(task));\n },\n options.transport?.trustedFetchFn,\n {\n requestTimeoutMs: options.transport?.requestTimeoutMs,\n allowPrivateIp: options.transport?.allowPrivateIp,\n }\n )\n )\n );\n}\n\n/**\n * Cancel a task via MCP Tasks protocol method.\n */\nexport async function cancelMCPTask(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<void> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n await withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/cancel:${taskId}`, async client => {\n await client.experimental.tasks.cancelTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: cancelTask ${taskId} succeeded`,\n timestamp: new Date().toISOString(),\n });\n });\n}\n"],"mappings":"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","names":["sharedRedactArgsForLog"]}
1
+ {"version":3,"sources":["../../../src/lib/protocols/mcp-tasks.ts"],"sourcesContent":["/**\n * MCP Tasks protocol integration for async tool calls.\n *\n * When an MCP server declares `capabilities.tasks.requests.tools.call`, this module\n * uses the SDK's experimental tasks API instead of custom AdCP tool calls for async\n * lifecycle management. This removes the LLM from the polling path.\n *\n * Detection: check `client.getServerCapabilities()?.tasks?.requests?.tools?.call`\n * after connection. The SDK's `isToolTask()` auto-detects per-tool `taskSupport`.\n */\n\nimport type { Client as MCPClient } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { DebugLogEntry } from '../types/adcp';\nimport type { TaskInfo } from '../core/ConversationTypes';\nimport { withCachedConnection } from './mcp';\nimport { createMCPRequestHeaders } from '../auth';\nimport { withSpan } from '../observability/tracing';\nimport { signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport { redactArgsForLog as sharedRedactArgsForLog } from '../utils/redact-args';\nimport { withResponseSizeLimit } from './responseSizeLimit';\nimport { withTransportDiagnostics, type TransportActivityHandler } from './transportDiagnostics';\nimport { isAbortOrTimeoutError, resolveClientRequestTimeoutMs } from './abort';\nimport { tryCallModernMCPTool } from './mcp-modern';\n\n/** Response shape returned by MCPClient.callTool(). */\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\ninterface MCPTaskProtocolOptions {\n transport?: {\n maxResponseBytes?: number;\n trustedFetchFn?: typeof fetch;\n requestTimeoutMs?: number;\n allowPrivateIp?: boolean;\n };\n onTransportActivity?: TransportActivityHandler;\n transportActivityContext?: {\n agentId: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n };\n}\n\n/**\n * Track which MCP clients have had listTools() called.\n * The SDK's isToolTask() needs tool metadata from listTools() to determine\n * per-tool taskSupport. Without this, callToolStream silently degrades to\n * a synchronous tools/call (no task creation).\n */\nconst toolsListedClients = new WeakSet<MCPClient>();\n\n/**\n * Ensure tool metadata is cached in the SDK so isToolTask() works.\n * Called once per client connection when tasks are supported.\n */\nasync function ensureToolsListed(client: MCPClient, signal?: AbortSignal, requestTimeoutMs?: number): Promise<void> {\n if (toolsListedClients.has(client)) return;\n await client.listTools(undefined, {\n ...(signal && { signal }),\n ...(requestTimeoutMs !== undefined && { timeout: requestTimeoutMs }),\n });\n toolsListedClients.add(client);\n}\n\n/**\n * Check if an MCP server supports the Tasks protocol for tool calls.\n */\nexport function serverSupportsTasks(client: MCPClient): boolean {\n const caps = client.getServerCapabilities();\n return !!(caps as Record<string, any>)?.tasks?.requests?.tools?.call;\n}\n\n/**\n * Map MCP Tasks status to AdCP status.\n *\n * MCP Tasks uses underscores and British spelling; AdCP uses hyphens and American spelling.\n */\nexport function mapMCPTaskStatus(mcpStatus: string): string {\n switch (mcpStatus) {\n case 'working':\n return 'working';\n case 'input_required':\n return 'input-required';\n case 'completed':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'cancelled':\n return 'canceled';\n default:\n return mcpStatus;\n }\n}\n\n/**\n * Map an MCP Task object to an AdCP TaskInfo.\n */\nfunction mapMCPTaskToTaskInfo(\n task: {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName?: string\n): TaskInfo {\n // Project `statusMessage → TaskInfo.error` against the\n // POST-MAPPING AdCP status (not the raw MCP-side status). MCP\n // Tasks emits `'cancelled'` (British) and never `'rejected'` as a\n // standard status; checking against the AdCP set after mapping\n // catches all terminal failures uniformly. Sellers that extend\n // MCP with custom statuses (e.g. emit `'rejected'` via spec\n // extension) flow through unchanged via the `default` arm of\n // {@link mapMCPTaskStatus}.\n const adcpStatus = mapMCPTaskStatus(task.status);\n const isTerminalFailure = adcpStatus === 'failed' || adcpStatus === 'rejected' || adcpStatus === 'canceled';\n return {\n taskId: task.taskId,\n status: adcpStatus,\n taskType: toolName ?? 'unknown',\n createdAt: new Date(task.createdAt).getTime(),\n updatedAt: new Date(task.lastUpdatedAt).getTime(),\n error: isTerminalFailure ? task.statusMessage : undefined,\n };\n}\n\n/**\n * Build auth headers for MCP connections.\n */\nfunction buildAuthHeaders(authToken?: string, customHeaders?: Record<string, string>): Record<string, string> {\n return createMCPRequestHeaders(customHeaders, authToken);\n}\n\n/**\n * Redact sensitive fields from tool args before logging.\n *\n * Redacts:\n * - `push_notification_config.authentication` — webhook signing secret\n * - `idempotency_key` — retry-pattern oracle within the seller's TTL; opt-in\n * full logging via `ADCP_LOG_IDEMPOTENCY_KEYS=1`\n */\nfunction redactArgsForLog(args: Record<string, unknown>): Record<string, unknown> {\n return sharedRedactArgsForLog(args);\n}\n\n/**\n * Validate taskId before passing to protocol methods.\n */\nfunction validateTaskId(taskId: string): void {\n if (!taskId || typeof taskId !== 'string' || taskId.length > 256) {\n throw new Error(`Invalid taskId: expected non-empty string (max 256 chars)`);\n }\n}\n\n/**\n * Call an MCP tool with Tasks protocol support.\n *\n * If the server supports MCP Tasks and the tool has `taskSupport: 'optional' | 'required'`,\n * uses `callToolStream()` which handles task creation, polling, and result retrieval.\n *\n * If the server doesn't support tasks, falls back to regular `client.callTool()`.\n *\n * The stream is consumed with a timeout. If the task doesn't complete within the timeout,\n * returns a working-status response with the MCP task_id for follow-up polling.\n */\nexport async function callMCPToolWithTasks(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options?: {\n workingTimeout?: number;\n signingContext?: AgentSigningContext;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n }\n): Promise<unknown> {\n // Keep the public debug-log contract identical across modern and legacy\n // protocol eras. Era negotiation happens after these common entries; the\n // selected transport appends its own connection diagnostics.\n debugLogs.push({\n type: 'info',\n message: `MCP: Auth configuration`,\n timestamp: new Date().toISOString(),\n hasAuth: !!authToken,\n headers: authToken ? { 'x-adcp-auth': '***' } : {},\n customHeaderKeys: customHeaders ? Object.keys(customHeaders) : [],\n });\n\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n\n if (authToken) {\n debugLogs.push({\n type: 'info',\n message: `MCP: Transport configured with x-adcp-auth header for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n }\n\n const modernAttempt = await tryCallModernMCPTool(agentUrl, toolName, args, authToken, debugLogs, customHeaders, {\n ...(options?.signingContext && { signingContext: options.signingContext }),\n ...(options?.signal && { signal: options.signal }),\n ...(options?.requestTimeoutMs !== undefined && { requestTimeoutMs: options.requestTimeoutMs }),\n ...(options?.fetchFn && { fetchFn: options.fetchFn }),\n ...(options?.allowPrivateIp !== undefined && { allowPrivateIp: options.allowPrivateIp }),\n });\n if (modernAttempt.handled) {\n debugLogs.push({\n type: modernAttempt.response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${modernAttempt.response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: modernAttempt.response,\n });\n return modernAttempt.response;\n }\n\n return withSpan(\n 'adcp.mcp.call_tool',\n {\n 'adcp.tool': toolName,\n 'http.url': agentUrl,\n },\n async () =>\n signingContextStorage.run(options?.signingContext, async () => {\n const authHeaders = buildAuthHeaders(authToken, customHeaders);\n const workingTimeout = options?.workingTimeout ?? 120_000;\n\n return withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n toolName,\n client =>\n callToolOnClient(\n client,\n toolName,\n args,\n debugLogs,\n workingTimeout,\n options?.signal,\n options?.requestTimeoutMs\n ),\n options?.fetchFn,\n {\n signal: options?.signal,\n requestTimeoutMs: options?.requestTimeoutMs,\n allowPrivateIp: options?.allowPrivateIp,\n originBoundHeaders: Object.keys(customHeaders ?? {}),\n }\n );\n })\n );\n}\n\n/**\n * Call a tool on a pre-connected MCP `Client` without HTTP transport or connection caching.\n *\n * This is the in-process companion to `callMCPToolWithTasks`. It skips URL validation,\n * connection setup, OAuth refresh, and the reconnect-retry path — the caller owns the\n * client lifecycle. All other semantics (tasks protocol detection, stream handling,\n * timeout surfacing) are identical to the URL-based path.\n *\n * Use via `AgentClient.fromMCPClient()`. Not intended for direct import outside the\n * protocols directory.\n */\nexport async function callMCPToolWithClient(\n mcpClient: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[] = [],\n options?: { workingTimeout?: number; signal?: AbortSignal; requestTimeoutMs?: number }\n): Promise<unknown> {\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} (in-process) with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n return callToolOnClient(\n mcpClient,\n toolName,\n args,\n debugLogs,\n options?.workingTimeout ?? 120_000,\n options?.signal,\n options?.requestTimeoutMs\n );\n}\n\n/**\n * Inner dispatch logic shared by `callMCPToolWithTasks` (URL path) and\n * `callMCPToolWithClient` (in-process path). Both paths converge here once\n * a connected `MCPClient` is in hand.\n */\nasync function callToolOnClient(\n client: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[],\n workingTimeout: number,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<unknown> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n const requestOptions = {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n };\n if (!serverSupportsTasks(client)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server does not support tasks, using standard callTool for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n const response = (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n\n debugLogs.push({\n type: response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: response,\n });\n\n return response;\n }\n\n // Ensure tool metadata is cached so the SDK's isToolTask() works correctly.\n // Without this, callToolStream silently skips task creation for tools that\n // declare taskSupport: 'optional' | 'required'.\n await ensureToolsListed(client, signal, resolvedRequestTimeoutMs);\n\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server supports tasks, using callToolStream for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n // Use callToolStream which handles the full task lifecycle\n const stream = client.experimental.tasks.callToolStream({ name: toolName, arguments: args }, undefined, {\n timeout: resolvedRequestTimeoutMs ?? workingTimeout,\n resetTimeoutOnProgress: true,\n ...(signal && { signal }),\n });\n\n let capturedTaskId: string | undefined;\n let capturedTask: { taskId: string; status: string; pollInterval?: number } | undefined;\n\n try {\n for await (const message of stream) {\n switch (message.type) {\n case 'taskCreated':\n capturedTaskId = message.task.taskId;\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Task created ${capturedTaskId} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'taskStatus':\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Status update for ${capturedTaskId}: ${message.task.status}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'result': {\n debugLogs.push({\n type: 'success',\n message: `MCP: Tool ${toolName} response received (success)`,\n timestamp: new Date().toISOString(),\n response: message.result,\n });\n return message.result as CallToolResponse;\n }\n\n case 'error': {\n debugLogs.push({\n type: 'error',\n message: `MCP Tasks: Error for ${toolName}: ${message.error.message}`,\n timestamp: new Date().toISOString(),\n });\n // The MCP Tasks SDK error event may strip structured content.\n // If we have a taskId, fetch the full result to recover adcp_error data\n // and return it as a proper isError response for downstream unwrapping.\n if (capturedTaskId) {\n try {\n const taskResult = await client.experimental.tasks.getTaskResult(\n capturedTaskId,\n undefined,\n requestOptions\n );\n const content = taskResult?.content as Array<{ type: string; text?: string }> | undefined;\n if (content) {\n return {\n isError: true,\n content,\n structuredContent: taskResult?.structuredContent,\n } as unknown as CallToolResponse;\n }\n } catch {\n // Failed to fetch task result — fall through to throw\n }\n }\n throw message.error;\n }\n }\n }\n } catch (error) {\n if (signal?.aborted && isAbortOrTimeoutError(error)) {\n throw error;\n }\n // If we timed out but have a taskId, return a working status\n // so the caller can poll via getMCPTaskStatus/getMCPTaskResult\n if (capturedTaskId && error instanceof Error && /timeout|timed out/i.test(error.message)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Timeout for ${toolName}, returning working status with taskId ${capturedTaskId}`,\n timestamp: new Date().toISOString(),\n });\n\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n if (isAbortOrTimeoutError(error)) {\n throw error;\n }\n // Servers may return a synchronous tool error (e.g. VERSION_UNSUPPORTED)\n // rather than creating a task. The Tasks SDK rejects these with a Zod\n // validation error about a missing `task` field. When no task was\n // captured, fall back to standard callTool so the error response\n // reaches the caller intact.\n const msg = error instanceof Error ? error.message : String(error);\n if (!capturedTaskId && /Invalid task creation result/i.test(msg)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server returned synchronous response for ${toolName}, falling back to callTool`,\n timestamp: new Date().toISOString(),\n });\n return (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n }\n throw error;\n }\n\n // Stream ended without result — shouldn't happen with well-behaved servers\n if (capturedTaskId) {\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n\n throw new Error(`MCP Tasks: callToolStream for ${toolName} ended without result or task`);\n}\n\n/**\n * Get task status via MCP Tasks protocol method (not tool call).\n *\n * Task lifecycle methods (`tasks/get`, `tasks/result`, `tasks/list`,\n * `tasks/cancel`) are MCP protocol methods, not AdCP operations.\n * `extractAdcpOperation` returns `undefined` for them, so the signing fetch\n * passes them through unsigned regardless of whether an `AgentSigningContext`\n * is present in ALS. That matches the RFC 9421 signing profile, which only\n * covers AdCP tool calls (`tools/call` / `message/send`).\n *\n * Re-throws auth errors (401) — only catches protocol capability errors.\n */\nexport async function getMCPTaskStatus(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n toolName?: string\n): Promise<TaskInfo> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/get:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: getTask ${taskId} → ${result.status}`,\n timestamp: new Date().toISOString(),\n });\n return mapMCPTaskToTaskInfo(\n result as {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName\n );\n });\n}\n\n/**\n * Get task result via MCP Tasks protocol method (blocks until terminal).\n */\nexport async function getMCPTaskResult(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<unknown> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/result:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTaskResult(taskId);\n debugLogs.push({\n type: 'success',\n message: `MCP Tasks: getTaskResult ${taskId} received`,\n timestamp: new Date().toISOString(),\n });\n return result;\n });\n}\n\n/**\n * List tasks via MCP Tasks protocol method.\n */\nexport async function listMCPTasks(\n agentUrl: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n options: MCPTaskProtocolOptions = {}\n): Promise<TaskInfo[]> {\n const authHeaders = buildAuthHeaders(authToken);\n\n return withResponseSizeLimit(options.transport?.maxResponseBytes, () =>\n withTransportDiagnostics(\n {\n agentId: options.transportActivityContext?.agentId ?? 'unknown-agent',\n protocol: 'mcp',\n tool: 'tasks/list',\n taskType: 'tasks/list',\n ...options.transportActivityContext,\n onTransportActivity: options.onTransportActivity,\n },\n () =>\n withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n 'tasks/list',\n async client => {\n const result = await client.experimental.tasks.listTasks();\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,\n timestamp: new Date().toISOString(),\n });\n return result.tasks.map((task: any) => mapMCPTaskToTaskInfo(task));\n },\n options.transport?.trustedFetchFn,\n {\n requestTimeoutMs: options.transport?.requestTimeoutMs,\n allowPrivateIp: options.transport?.allowPrivateIp,\n }\n )\n )\n );\n}\n\n/**\n * Cancel a task via MCP Tasks protocol method.\n */\nexport async function cancelMCPTask(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<void> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n await withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/cancel:${taskId}`, async client => {\n await client.experimental.tasks.cancelTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: cancelTask ${taskId} succeeded`,\n timestamp: new Date().toISOString(),\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA,iBAAqC;AACrC,kBAAwC;AACxC,qBAAyB;AACzB,oBAAgE;AAChE,yBAA2D;AAC3D,+BAAsC;AACtC,kCAAwE;AACxE,mBAAqE;AACrE,wBAAqC;AAgCrC,MAAM,qBAAqB,oBAAI,QAAmB;AAMlD,eAAe,kBAAkB,QAAmB,QAAsB,kBAA0C;AAClH,MAAI,mBAAmB,IAAI,MAAM,EAAG;AACpC,QAAM,OAAO,UAAU,QAAW;AAAA,IAChC,GAAI,UAAU,EAAE,OAAO;AAAA,IACvB,GAAI,qBAAqB,UAAa,EAAE,SAAS,iBAAiB;AAAA,EACpE,CAAC;AACD,qBAAmB,IAAI,MAAM;AAC/B;AAKO,SAAS,oBAAoB,QAA4B;AAC9D,QAAM,OAAO,OAAO,sBAAsB;AAC1C,SAAO,CAAC,CAAE,MAA8B,OAAO,UAAU,OAAO;AAClE;AAOO,SAAS,iBAAiB,WAA2B;AAC1D,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAKA,SAAS,qBACP,MAQA,UACU;AASV,QAAM,aAAa,iBAAiB,KAAK,MAAM;AAC/C,QAAM,oBAAoB,eAAe,YAAY,eAAe,cAAc,eAAe;AACjG,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,QAAQ;AAAA,IACR,UAAU,YAAY;AAAA,IACtB,WAAW,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ;AAAA,IAC5C,WAAW,IAAI,KAAK,KAAK,aAAa,EAAE,QAAQ;AAAA,IAChD,OAAO,oBAAoB,KAAK,gBAAgB;AAAA,EAClD;AACF;AAKA,SAAS,iBAAiB,WAAoB,eAAgE;AAC5G,aAAO,qCAAwB,eAAe,SAAS;AACzD;AAUA,SAAS,iBAAiB,MAAwD;AAChF,aAAO,mBAAAA,kBAAuB,IAAI;AACpC;AAKA,SAAS,eAAe,QAAsB;AAC5C,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,OAAO,SAAS,KAAK;AAChE,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACF;AAaA,eAAsB,qBACpB,UACA,UACA,MACA,WACA,YAA6B,CAAC,GAC9B,eACA,SAQkB;AAIlB,YAAU,KAAK;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,SAAS,CAAC,CAAC;AAAA,IACX,SAAS,YAAY,EAAE,eAAe,MAAM,IAAI,CAAC;AAAA,IACjD,kBAAkB,gBAAgB,OAAO,KAAK,aAAa,IAAI,CAAC;AAAA,EAClE,CAAC;AAED,YAAU,KAAK;AAAA,IACb,MAAM;AAAA,IACN,SAAS,qBAAqB,QAAQ,eAAe,KAAK,UAAU,iBAAiB,IAAI,CAAC,CAAC;AAAA,IAC3F,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC,CAAC;AAED,MAAI,WAAW;AACb,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS,yDAAyD,QAAQ;AAAA,MAC1E,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,UAAM,wCAAqB,UAAU,UAAU,MAAM,WAAW,WAAW,eAAe;AAAA,IAC9G,GAAI,SAAS,kBAAkB,EAAE,gBAAgB,QAAQ,eAAe;AAAA,IACxE,GAAI,SAAS,UAAU,EAAE,QAAQ,QAAQ,OAAO;AAAA,IAChD,GAAI,SAAS,qBAAqB,UAAa,EAAE,kBAAkB,QAAQ,iBAAiB;AAAA,IAC5F,GAAI,SAAS,WAAW,EAAE,SAAS,QAAQ,QAAQ;AAAA,IACnD,GAAI,SAAS,mBAAmB,UAAa,EAAE,gBAAgB,QAAQ,eAAe;AAAA,EACxF,CAAC;AACD,MAAI,cAAc,SAAS;AACzB,cAAU,KAAK;AAAA,MACb,MAAM,cAAc,UAAU,UAAU,UAAU;AAAA,MAClD,SAAS,aAAa,QAAQ,uBAAuB,cAAc,UAAU,UAAU,UAAU,SAAS;AAAA,MAC1G,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,UAAU,cAAc;AAAA,IAC1B,CAAC;AACD,WAAO,cAAc;AAAA,EACvB;AAEA,aAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,YAAY;AAAA,IACd;AAAA,IACA,YACE,oCAAsB,IAAI,SAAS,gBAAgB,YAAY;AAC7D,YAAM,cAAc,iBAAiB,WAAW,aAAa;AAC7D,YAAM,iBAAiB,SAAS,kBAAkB;AAElD,iBAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YACE;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,QACF,SAAS;AAAA,QACT;AAAA,UACE,QAAQ,SAAS;AAAA,UACjB,kBAAkB,SAAS;AAAA,UAC3B,gBAAgB,SAAS;AAAA,UACzB,oBAAoB,OAAO,KAAK,iBAAiB,CAAC,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACL;AACF;AAaA,eAAsB,sBACpB,WACA,UACA,MACA,YAA6B,CAAC,GAC9B,SACkB;AAClB,YAAU,KAAK;AAAA,IACb,MAAM;AAAA,IACN,SAAS,qBAAqB,QAAQ,4BAA4B,KAAK,UAAU,iBAAiB,IAAI,CAAC,CAAC;AAAA,IACxG,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,kBAAkB;AAAA,IAC3B,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF;AAOA,eAAe,iBACb,QACA,UACA,MACA,WACA,gBACA,QACA,kBACkB;AAClB,QAAM,+BAA2B,4CAA8B,gBAAgB;AAC/E,QAAM,iBAAiB;AAAA,IACrB,GAAI,UAAU,EAAE,OAAO;AAAA,IACvB,GAAI,6BAA6B,UAAa,EAAE,SAAS,yBAAyB;AAAA,EACpF;AACA,MAAI,CAAC,oBAAoB,MAAM,GAAG;AAChC,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS,yEAAyE,QAAQ;AAAA,MAC1F,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AACD,UAAM,WAAY,MAAM,OAAO;AAAA,MAC7B,EAAE,MAAM,UAAU,WAAW,KAAK;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAEA,cAAU,KAAK;AAAA,MACb,MAAM,UAAU,UAAU,UAAU;AAAA,MACpC,SAAS,aAAa,QAAQ,uBAAuB,UAAU,UAAU,UAAU,SAAS;AAAA,MAC5F,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAKA,QAAM,kBAAkB,QAAQ,QAAQ,wBAAwB;AAEhE,YAAU,KAAK;AAAA,IACb,MAAM;AAAA,IACN,SAAS,8DAA8D,QAAQ;AAAA,IAC/E,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC,CAAC;AAGD,QAAM,SAAS,OAAO,aAAa,MAAM,eAAe,EAAE,MAAM,UAAU,WAAW,KAAK,GAAG,QAAW;AAAA,IACtG,SAAS,4BAA4B;AAAA,IACrC,wBAAwB;AAAA,IACxB,GAAI,UAAU,EAAE,OAAO;AAAA,EACzB,CAAC;AAED,MAAI;AACJ,MAAI;AAEJ,MAAI;AACF,qBAAiB,WAAW,QAAQ;AAClC,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK;AACH,2BAAiB,QAAQ,KAAK;AAC9B,yBAAe,QAAQ;AACvB,oBAAU,KAAK;AAAA,YACb,MAAM;AAAA,YACN,SAAS,2BAA2B,cAAc,QAAQ,QAAQ;AAAA,YAClE,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,CAAC;AACD;AAAA,QAEF,KAAK;AACH,yBAAe,QAAQ;AACvB,oBAAU,KAAK;AAAA,YACb,MAAM;AAAA,YACN,SAAS,gCAAgC,cAAc,KAAK,QAAQ,KAAK,MAAM;AAAA,YAC/E,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,CAAC;AACD;AAAA,QAEF,KAAK,UAAU;AACb,oBAAU,KAAK;AAAA,YACb,MAAM;AAAA,YACN,SAAS,aAAa,QAAQ;AAAA,YAC9B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,YAClC,UAAU,QAAQ;AAAA,UACpB,CAAC;AACD,iBAAO,QAAQ;AAAA,QACjB;AAAA,QAEA,KAAK,SAAS;AACZ,oBAAU,KAAK;AAAA,YACb,MAAM;AAAA,YACN,SAAS,wBAAwB,QAAQ,KAAK,QAAQ,MAAM,OAAO;AAAA,YACnE,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,CAAC;AAID,cAAI,gBAAgB;AAClB,gBAAI;AACF,oBAAM,aAAa,MAAM,OAAO,aAAa,MAAM;AAAA,gBACjD;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AACA,oBAAM,UAAU,YAAY;AAC5B,kBAAI,SAAS;AACX,uBAAO;AAAA,kBACL,SAAS;AAAA,kBACT;AAAA,kBACA,mBAAmB,YAAY;AAAA,gBACjC;AAAA,cACF;AAAA,YACF,QAAQ;AAAA,YAER;AAAA,UACF;AACA,gBAAM,QAAQ;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,QAAQ,eAAW,oCAAsB,KAAK,GAAG;AACnD,YAAM;AAAA,IACR;AAGA,QAAI,kBAAkB,iBAAiB,SAAS,qBAAqB,KAAK,MAAM,OAAO,GAAG;AACxF,gBAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,SAAS,0BAA0B,QAAQ,0CAA0C,cAAc;AAAA,QACnG,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AAED,aAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,eAAe,cAAc;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AACA,YAAI,oCAAsB,KAAK,GAAG;AAChC,YAAM;AAAA,IACR;AAMA,UAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,QAAI,CAAC,kBAAkB,gCAAgC,KAAK,GAAG,GAAG;AAChE,gBAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,SAAS,uDAAuD,QAAQ;AAAA,QACxE,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAQ,MAAM,OAAO;AAAA,QACnB,EAAE,MAAM,UAAU,WAAW,KAAK;AAAA,QAClC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAGA,MAAI,gBAAgB;AAClB,WAAO;AAAA,MACL,mBAAmB;AAAA,QACjB,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe,cAAc;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,iCAAiC,QAAQ,+BAA+B;AAC1F;AAcA,eAAsB,iBACpB,UACA,QACA,WACA,YAA6B,CAAC,GAC9B,UACmB;AACnB,iBAAe,MAAM;AACrB,QAAM,cAAc,iBAAiB,SAAS;AAE9C,aAAO,iCAAqB,UAAU,WAAW,aAAa,WAAW,aAAa,MAAM,IAAI,OAAM,WAAU;AAC9G,UAAM,SAAS,MAAM,OAAO,aAAa,MAAM,QAAQ,MAAM;AAC7D,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS,sBAAsB,MAAM,WAAM,OAAO,MAAM;AAAA,MACxD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MAQA;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAKA,eAAsB,iBACpB,UACA,QACA,WACA,YAA6B,CAAC,GACZ;AAClB,iBAAe,MAAM;AACrB,QAAM,cAAc,iBAAiB,SAAS;AAE9C,aAAO,iCAAqB,UAAU,WAAW,aAAa,WAAW,gBAAgB,MAAM,IAAI,OAAM,WAAU;AACjH,UAAM,SAAS,MAAM,OAAO,aAAa,MAAM,cAAc,MAAM;AACnE,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS,4BAA4B,MAAM;AAAA,MAC3C,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AACH;AAKA,eAAsB,aACpB,UACA,WACA,YAA6B,CAAC,GAC9B,UAAkC,CAAC,GACd;AACrB,QAAM,cAAc,iBAAiB,SAAS;AAE9C,aAAO;AAAA,IAAsB,QAAQ,WAAW;AAAA,IAAkB,UAChE;AAAA,MACE;AAAA,QACE,SAAS,QAAQ,0BAA0B,WAAW;AAAA,QACtD,UAAU;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,GAAG,QAAQ;AAAA,QACX,qBAAqB,QAAQ;AAAA,MAC/B;AAAA,MACA,UACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAM,WAAU;AACd,gBAAM,SAAS,MAAM,OAAO,aAAa,MAAM,UAAU;AACzD,oBAAU,KAAK;AAAA,YACb,MAAM;AAAA,YACN,SAAS,iCAAiC,OAAO,MAAM,MAAM;AAAA,YAC7D,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,CAAC;AACD,iBAAO,OAAO,MAAM,IAAI,CAAC,SAAc,qBAAqB,IAAI,CAAC;AAAA,QACnE;AAAA,QACA,QAAQ,WAAW;AAAA,QACnB;AAAA,UACE,kBAAkB,QAAQ,WAAW;AAAA,UACrC,gBAAgB,QAAQ,WAAW;AAAA,QACrC;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AACF;AAKA,eAAsB,cACpB,UACA,QACA,WACA,YAA6B,CAAC,GACf;AACf,iBAAe,MAAM;AACrB,QAAM,cAAc,iBAAiB,SAAS;AAE9C,YAAM,iCAAqB,UAAU,WAAW,aAAa,WAAW,gBAAgB,MAAM,IAAI,OAAM,WAAU;AAChH,UAAM,OAAO,aAAa,MAAM,WAAW,MAAM;AACjD,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS,yBAAyB,MAAM;AAAA,MACxC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAAA,EACH,CAAC;AACH;","names":["sharedRedactArgsForLog"]}
@@ -129,7 +129,8 @@ async function callMCPToolWithTasks(agentUrl, toolName, args, authToken, debugLo
129
129
  {
130
130
  signal: options?.signal,
131
131
  requestTimeoutMs: options?.requestTimeoutMs,
132
- allowPrivateIp: options?.allowPrivateIp
132
+ allowPrivateIp: options?.allowPrivateIp,
133
+ originBoundHeaders: Object.keys(customHeaders ?? {})
133
134
  }
134
135
  );
135
136
  })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/protocols/mcp-tasks.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n/**\n * MCP Tasks protocol integration for async tool calls.\n *\n * When an MCP server declares `capabilities.tasks.requests.tools.call`, this module\n * uses the SDK's experimental tasks API instead of custom AdCP tool calls for async\n * lifecycle management. This removes the LLM from the polling path.\n *\n * Detection: check `client.getServerCapabilities()?.tasks?.requests?.tools?.call`\n * after connection. The SDK's `isToolTask()` auto-detects per-tool `taskSupport`.\n */\n\nimport type { Client as MCPClient } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { DebugLogEntry } from '../types/adcp';\nimport type { TaskInfo } from '../core/ConversationTypes';\nimport { withCachedConnection } from './mcp';\nimport { createMCPRequestHeaders } from '../auth';\nimport { withSpan } from '../observability/tracing';\nimport { signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport { redactArgsForLog as sharedRedactArgsForLog } from '../utils/redact-args';\nimport { withResponseSizeLimit } from './responseSizeLimit';\nimport { withTransportDiagnostics, type TransportActivityHandler } from './transportDiagnostics';\nimport { isAbortOrTimeoutError, resolveClientRequestTimeoutMs } from './abort';\nimport { tryCallModernMCPTool } from './mcp-modern';\n\n/** Response shape returned by MCPClient.callTool(). */\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\ninterface MCPTaskProtocolOptions {\n transport?: {\n maxResponseBytes?: number;\n trustedFetchFn?: typeof fetch;\n requestTimeoutMs?: number;\n allowPrivateIp?: boolean;\n };\n onTransportActivity?: TransportActivityHandler;\n transportActivityContext?: {\n agentId: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n };\n}\n\n/**\n * Track which MCP clients have had listTools() called.\n * The SDK's isToolTask() needs tool metadata from listTools() to determine\n * per-tool taskSupport. Without this, callToolStream silently degrades to\n * a synchronous tools/call (no task creation).\n */\nconst toolsListedClients = new WeakSet<MCPClient>();\n\n/**\n * Ensure tool metadata is cached in the SDK so isToolTask() works.\n * Called once per client connection when tasks are supported.\n */\nasync function ensureToolsListed(client: MCPClient, signal?: AbortSignal, requestTimeoutMs?: number): Promise<void> {\n if (toolsListedClients.has(client)) return;\n await client.listTools(undefined, {\n ...(signal && { signal }),\n ...(requestTimeoutMs !== undefined && { timeout: requestTimeoutMs }),\n });\n toolsListedClients.add(client);\n}\n\n/**\n * Check if an MCP server supports the Tasks protocol for tool calls.\n */\nexport function serverSupportsTasks(client: MCPClient): boolean {\n const caps = client.getServerCapabilities();\n return !!(caps as Record<string, any>)?.tasks?.requests?.tools?.call;\n}\n\n/**\n * Map MCP Tasks status to AdCP status.\n *\n * MCP Tasks uses underscores and British spelling; AdCP uses hyphens and American spelling.\n */\nexport function mapMCPTaskStatus(mcpStatus: string): string {\n switch (mcpStatus) {\n case 'working':\n return 'working';\n case 'input_required':\n return 'input-required';\n case 'completed':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'cancelled':\n return 'canceled';\n default:\n return mcpStatus;\n }\n}\n\n/**\n * Map an MCP Task object to an AdCP TaskInfo.\n */\nfunction mapMCPTaskToTaskInfo(\n task: {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName?: string\n): TaskInfo {\n // Project `statusMessage → TaskInfo.error` against the\n // POST-MAPPING AdCP status (not the raw MCP-side status). MCP\n // Tasks emits `'cancelled'` (British) and never `'rejected'` as a\n // standard status; checking against the AdCP set after mapping\n // catches all terminal failures uniformly. Sellers that extend\n // MCP with custom statuses (e.g. emit `'rejected'` via spec\n // extension) flow through unchanged via the `default` arm of\n // {@link mapMCPTaskStatus}.\n const adcpStatus = mapMCPTaskStatus(task.status);\n const isTerminalFailure = adcpStatus === 'failed' || adcpStatus === 'rejected' || adcpStatus === 'canceled';\n return {\n taskId: task.taskId,\n status: adcpStatus,\n taskType: toolName ?? 'unknown',\n createdAt: new Date(task.createdAt).getTime(),\n updatedAt: new Date(task.lastUpdatedAt).getTime(),\n error: isTerminalFailure ? task.statusMessage : undefined,\n };\n}\n\n/**\n * Build auth headers for MCP connections.\n */\nfunction buildAuthHeaders(authToken?: string, customHeaders?: Record<string, string>): Record<string, string> {\n return createMCPRequestHeaders(customHeaders, authToken);\n}\n\n/**\n * Redact sensitive fields from tool args before logging.\n *\n * Redacts:\n * - `push_notification_config.authentication` — webhook signing secret\n * - `idempotency_key` — retry-pattern oracle within the seller's TTL; opt-in\n * full logging via `ADCP_LOG_IDEMPOTENCY_KEYS=1`\n */\nfunction redactArgsForLog(args: Record<string, unknown>): Record<string, unknown> {\n return sharedRedactArgsForLog(args);\n}\n\n/**\n * Validate taskId before passing to protocol methods.\n */\nfunction validateTaskId(taskId: string): void {\n if (!taskId || typeof taskId !== 'string' || taskId.length > 256) {\n throw new Error(`Invalid taskId: expected non-empty string (max 256 chars)`);\n }\n}\n\n/**\n * Call an MCP tool with Tasks protocol support.\n *\n * If the server supports MCP Tasks and the tool has `taskSupport: 'optional' | 'required'`,\n * uses `callToolStream()` which handles task creation, polling, and result retrieval.\n *\n * If the server doesn't support tasks, falls back to regular `client.callTool()`.\n *\n * The stream is consumed with a timeout. If the task doesn't complete within the timeout,\n * returns a working-status response with the MCP task_id for follow-up polling.\n */\nexport async function callMCPToolWithTasks(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options?: {\n workingTimeout?: number;\n signingContext?: AgentSigningContext;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n }\n): Promise<unknown> {\n // Keep the public debug-log contract identical across modern and legacy\n // protocol eras. Era negotiation happens after these common entries; the\n // selected transport appends its own connection diagnostics.\n debugLogs.push({\n type: 'info',\n message: `MCP: Auth configuration`,\n timestamp: new Date().toISOString(),\n hasAuth: !!authToken,\n headers: authToken ? { 'x-adcp-auth': '***' } : {},\n customHeaderKeys: customHeaders ? Object.keys(customHeaders) : [],\n });\n\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n\n if (authToken) {\n debugLogs.push({\n type: 'info',\n message: `MCP: Transport configured with x-adcp-auth header for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n }\n\n const modernAttempt = await tryCallModernMCPTool(agentUrl, toolName, args, authToken, debugLogs, customHeaders, {\n ...(options?.signingContext && { signingContext: options.signingContext }),\n ...(options?.signal && { signal: options.signal }),\n ...(options?.requestTimeoutMs !== undefined && { requestTimeoutMs: options.requestTimeoutMs }),\n ...(options?.fetchFn && { fetchFn: options.fetchFn }),\n ...(options?.allowPrivateIp !== undefined && { allowPrivateIp: options.allowPrivateIp }),\n });\n if (modernAttempt.handled) {\n debugLogs.push({\n type: modernAttempt.response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${modernAttempt.response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: modernAttempt.response,\n });\n return modernAttempt.response;\n }\n\n return withSpan(\n 'adcp.mcp.call_tool',\n {\n 'adcp.tool': toolName,\n 'http.url': agentUrl,\n },\n async () =>\n signingContextStorage.run(options?.signingContext, async () => {\n const authHeaders = buildAuthHeaders(authToken, customHeaders);\n const workingTimeout = options?.workingTimeout ?? 120_000;\n\n return withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n toolName,\n client =>\n callToolOnClient(\n client,\n toolName,\n args,\n debugLogs,\n workingTimeout,\n options?.signal,\n options?.requestTimeoutMs\n ),\n options?.fetchFn,\n {\n signal: options?.signal,\n requestTimeoutMs: options?.requestTimeoutMs,\n allowPrivateIp: options?.allowPrivateIp,\n }\n );\n })\n );\n}\n\n/**\n * Call a tool on a pre-connected MCP `Client` without HTTP transport or connection caching.\n *\n * This is the in-process companion to `callMCPToolWithTasks`. It skips URL validation,\n * connection setup, OAuth refresh, and the reconnect-retry path — the caller owns the\n * client lifecycle. All other semantics (tasks protocol detection, stream handling,\n * timeout surfacing) are identical to the URL-based path.\n *\n * Use via `AgentClient.fromMCPClient()`. Not intended for direct import outside the\n * protocols directory.\n */\nexport async function callMCPToolWithClient(\n mcpClient: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[] = [],\n options?: { workingTimeout?: number; signal?: AbortSignal; requestTimeoutMs?: number }\n): Promise<unknown> {\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} (in-process) with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n return callToolOnClient(\n mcpClient,\n toolName,\n args,\n debugLogs,\n options?.workingTimeout ?? 120_000,\n options?.signal,\n options?.requestTimeoutMs\n );\n}\n\n/**\n * Inner dispatch logic shared by `callMCPToolWithTasks` (URL path) and\n * `callMCPToolWithClient` (in-process path). Both paths converge here once\n * a connected `MCPClient` is in hand.\n */\nasync function callToolOnClient(\n client: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[],\n workingTimeout: number,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<unknown> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n const requestOptions = {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n };\n if (!serverSupportsTasks(client)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server does not support tasks, using standard callTool for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n const response = (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n\n debugLogs.push({\n type: response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: response,\n });\n\n return response;\n }\n\n // Ensure tool metadata is cached so the SDK's isToolTask() works correctly.\n // Without this, callToolStream silently skips task creation for tools that\n // declare taskSupport: 'optional' | 'required'.\n await ensureToolsListed(client, signal, resolvedRequestTimeoutMs);\n\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server supports tasks, using callToolStream for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n // Use callToolStream which handles the full task lifecycle\n const stream = client.experimental.tasks.callToolStream({ name: toolName, arguments: args }, undefined, {\n timeout: resolvedRequestTimeoutMs ?? workingTimeout,\n resetTimeoutOnProgress: true,\n ...(signal && { signal }),\n });\n\n let capturedTaskId: string | undefined;\n let capturedTask: { taskId: string; status: string; pollInterval?: number } | undefined;\n\n try {\n for await (const message of stream) {\n switch (message.type) {\n case 'taskCreated':\n capturedTaskId = message.task.taskId;\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Task created ${capturedTaskId} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'taskStatus':\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Status update for ${capturedTaskId}: ${message.task.status}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'result': {\n debugLogs.push({\n type: 'success',\n message: `MCP: Tool ${toolName} response received (success)`,\n timestamp: new Date().toISOString(),\n response: message.result,\n });\n return message.result as CallToolResponse;\n }\n\n case 'error': {\n debugLogs.push({\n type: 'error',\n message: `MCP Tasks: Error for ${toolName}: ${message.error.message}`,\n timestamp: new Date().toISOString(),\n });\n // The MCP Tasks SDK error event may strip structured content.\n // If we have a taskId, fetch the full result to recover adcp_error data\n // and return it as a proper isError response for downstream unwrapping.\n if (capturedTaskId) {\n try {\n const taskResult = await client.experimental.tasks.getTaskResult(\n capturedTaskId,\n undefined,\n requestOptions\n );\n const content = taskResult?.content as Array<{ type: string; text?: string }> | undefined;\n if (content) {\n return {\n isError: true,\n content,\n structuredContent: taskResult?.structuredContent,\n } as unknown as CallToolResponse;\n }\n } catch {\n // Failed to fetch task result — fall through to throw\n }\n }\n throw message.error;\n }\n }\n }\n } catch (error) {\n if (signal?.aborted && isAbortOrTimeoutError(error)) {\n throw error;\n }\n // If we timed out but have a taskId, return a working status\n // so the caller can poll via getMCPTaskStatus/getMCPTaskResult\n if (capturedTaskId && error instanceof Error && /timeout|timed out/i.test(error.message)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Timeout for ${toolName}, returning working status with taskId ${capturedTaskId}`,\n timestamp: new Date().toISOString(),\n });\n\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n if (isAbortOrTimeoutError(error)) {\n throw error;\n }\n // Servers may return a synchronous tool error (e.g. VERSION_UNSUPPORTED)\n // rather than creating a task. The Tasks SDK rejects these with a Zod\n // validation error about a missing `task` field. When no task was\n // captured, fall back to standard callTool so the error response\n // reaches the caller intact.\n const msg = error instanceof Error ? error.message : String(error);\n if (!capturedTaskId && /Invalid task creation result/i.test(msg)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server returned synchronous response for ${toolName}, falling back to callTool`,\n timestamp: new Date().toISOString(),\n });\n return (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n }\n throw error;\n }\n\n // Stream ended without result — shouldn't happen with well-behaved servers\n if (capturedTaskId) {\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n\n throw new Error(`MCP Tasks: callToolStream for ${toolName} ended without result or task`);\n}\n\n/**\n * Get task status via MCP Tasks protocol method (not tool call).\n *\n * Task lifecycle methods (`tasks/get`, `tasks/result`, `tasks/list`,\n * `tasks/cancel`) are MCP protocol methods, not AdCP operations.\n * `extractAdcpOperation` returns `undefined` for them, so the signing fetch\n * passes them through unsigned regardless of whether an `AgentSigningContext`\n * is present in ALS. That matches the RFC 9421 signing profile, which only\n * covers AdCP tool calls (`tools/call` / `message/send`).\n *\n * Re-throws auth errors (401) — only catches protocol capability errors.\n */\nexport async function getMCPTaskStatus(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n toolName?: string\n): Promise<TaskInfo> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/get:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: getTask ${taskId} → ${result.status}`,\n timestamp: new Date().toISOString(),\n });\n return mapMCPTaskToTaskInfo(\n result as {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName\n );\n });\n}\n\n/**\n * Get task result via MCP Tasks protocol method (blocks until terminal).\n */\nexport async function getMCPTaskResult(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<unknown> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/result:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTaskResult(taskId);\n debugLogs.push({\n type: 'success',\n message: `MCP Tasks: getTaskResult ${taskId} received`,\n timestamp: new Date().toISOString(),\n });\n return result;\n });\n}\n\n/**\n * List tasks via MCP Tasks protocol method.\n */\nexport async function listMCPTasks(\n agentUrl: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n options: MCPTaskProtocolOptions = {}\n): Promise<TaskInfo[]> {\n const authHeaders = buildAuthHeaders(authToken);\n\n return withResponseSizeLimit(options.transport?.maxResponseBytes, () =>\n withTransportDiagnostics(\n {\n agentId: options.transportActivityContext?.agentId ?? 'unknown-agent',\n protocol: 'mcp',\n tool: 'tasks/list',\n taskType: 'tasks/list',\n ...options.transportActivityContext,\n onTransportActivity: options.onTransportActivity,\n },\n () =>\n withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n 'tasks/list',\n async client => {\n const result = await client.experimental.tasks.listTasks();\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,\n timestamp: new Date().toISOString(),\n });\n return result.tasks.map((task: any) => mapMCPTaskToTaskInfo(task));\n },\n options.transport?.trustedFetchFn,\n {\n requestTimeoutMs: options.transport?.requestTimeoutMs,\n allowPrivateIp: options.transport?.allowPrivateIp,\n }\n )\n )\n );\n}\n\n/**\n * Cancel a task via MCP Tasks protocol method.\n */\nexport async function cancelMCPTask(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<void> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n await withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/cancel:${taskId}`, async client => {\n await client.experimental.tasks.cancelTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: cancelTask ${taskId} succeeded`,\n timestamp: new Date().toISOString(),\n });\n });\n}\n"],"mappings":"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","names":["require"]}
1
+ {"version":3,"sources":["../../../src/lib/protocols/mcp-tasks.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n/**\n * MCP Tasks protocol integration for async tool calls.\n *\n * When an MCP server declares `capabilities.tasks.requests.tools.call`, this module\n * uses the SDK's experimental tasks API instead of custom AdCP tool calls for async\n * lifecycle management. This removes the LLM from the polling path.\n *\n * Detection: check `client.getServerCapabilities()?.tasks?.requests?.tools?.call`\n * after connection. The SDK's `isToolTask()` auto-detects per-tool `taskSupport`.\n */\n\nimport type { Client as MCPClient } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { DebugLogEntry } from '../types/adcp';\nimport type { TaskInfo } from '../core/ConversationTypes';\nimport { withCachedConnection } from './mcp';\nimport { createMCPRequestHeaders } from '../auth';\nimport { withSpan } from '../observability/tracing';\nimport { signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport { redactArgsForLog as sharedRedactArgsForLog } from '../utils/redact-args';\nimport { withResponseSizeLimit } from './responseSizeLimit';\nimport { withTransportDiagnostics, type TransportActivityHandler } from './transportDiagnostics';\nimport { isAbortOrTimeoutError, resolveClientRequestTimeoutMs } from './abort';\nimport { tryCallModernMCPTool } from './mcp-modern';\n\n/** Response shape returned by MCPClient.callTool(). */\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\ninterface MCPTaskProtocolOptions {\n transport?: {\n maxResponseBytes?: number;\n trustedFetchFn?: typeof fetch;\n requestTimeoutMs?: number;\n allowPrivateIp?: boolean;\n };\n onTransportActivity?: TransportActivityHandler;\n transportActivityContext?: {\n agentId: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n };\n}\n\n/**\n * Track which MCP clients have had listTools() called.\n * The SDK's isToolTask() needs tool metadata from listTools() to determine\n * per-tool taskSupport. Without this, callToolStream silently degrades to\n * a synchronous tools/call (no task creation).\n */\nconst toolsListedClients = new WeakSet<MCPClient>();\n\n/**\n * Ensure tool metadata is cached in the SDK so isToolTask() works.\n * Called once per client connection when tasks are supported.\n */\nasync function ensureToolsListed(client: MCPClient, signal?: AbortSignal, requestTimeoutMs?: number): Promise<void> {\n if (toolsListedClients.has(client)) return;\n await client.listTools(undefined, {\n ...(signal && { signal }),\n ...(requestTimeoutMs !== undefined && { timeout: requestTimeoutMs }),\n });\n toolsListedClients.add(client);\n}\n\n/**\n * Check if an MCP server supports the Tasks protocol for tool calls.\n */\nexport function serverSupportsTasks(client: MCPClient): boolean {\n const caps = client.getServerCapabilities();\n return !!(caps as Record<string, any>)?.tasks?.requests?.tools?.call;\n}\n\n/**\n * Map MCP Tasks status to AdCP status.\n *\n * MCP Tasks uses underscores and British spelling; AdCP uses hyphens and American spelling.\n */\nexport function mapMCPTaskStatus(mcpStatus: string): string {\n switch (mcpStatus) {\n case 'working':\n return 'working';\n case 'input_required':\n return 'input-required';\n case 'completed':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'cancelled':\n return 'canceled';\n default:\n return mcpStatus;\n }\n}\n\n/**\n * Map an MCP Task object to an AdCP TaskInfo.\n */\nfunction mapMCPTaskToTaskInfo(\n task: {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName?: string\n): TaskInfo {\n // Project `statusMessage → TaskInfo.error` against the\n // POST-MAPPING AdCP status (not the raw MCP-side status). MCP\n // Tasks emits `'cancelled'` (British) and never `'rejected'` as a\n // standard status; checking against the AdCP set after mapping\n // catches all terminal failures uniformly. Sellers that extend\n // MCP with custom statuses (e.g. emit `'rejected'` via spec\n // extension) flow through unchanged via the `default` arm of\n // {@link mapMCPTaskStatus}.\n const adcpStatus = mapMCPTaskStatus(task.status);\n const isTerminalFailure = adcpStatus === 'failed' || adcpStatus === 'rejected' || adcpStatus === 'canceled';\n return {\n taskId: task.taskId,\n status: adcpStatus,\n taskType: toolName ?? 'unknown',\n createdAt: new Date(task.createdAt).getTime(),\n updatedAt: new Date(task.lastUpdatedAt).getTime(),\n error: isTerminalFailure ? task.statusMessage : undefined,\n };\n}\n\n/**\n * Build auth headers for MCP connections.\n */\nfunction buildAuthHeaders(authToken?: string, customHeaders?: Record<string, string>): Record<string, string> {\n return createMCPRequestHeaders(customHeaders, authToken);\n}\n\n/**\n * Redact sensitive fields from tool args before logging.\n *\n * Redacts:\n * - `push_notification_config.authentication` — webhook signing secret\n * - `idempotency_key` — retry-pattern oracle within the seller's TTL; opt-in\n * full logging via `ADCP_LOG_IDEMPOTENCY_KEYS=1`\n */\nfunction redactArgsForLog(args: Record<string, unknown>): Record<string, unknown> {\n return sharedRedactArgsForLog(args);\n}\n\n/**\n * Validate taskId before passing to protocol methods.\n */\nfunction validateTaskId(taskId: string): void {\n if (!taskId || typeof taskId !== 'string' || taskId.length > 256) {\n throw new Error(`Invalid taskId: expected non-empty string (max 256 chars)`);\n }\n}\n\n/**\n * Call an MCP tool with Tasks protocol support.\n *\n * If the server supports MCP Tasks and the tool has `taskSupport: 'optional' | 'required'`,\n * uses `callToolStream()` which handles task creation, polling, and result retrieval.\n *\n * If the server doesn't support tasks, falls back to regular `client.callTool()`.\n *\n * The stream is consumed with a timeout. If the task doesn't complete within the timeout,\n * returns a working-status response with the MCP task_id for follow-up polling.\n */\nexport async function callMCPToolWithTasks(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options?: {\n workingTimeout?: number;\n signingContext?: AgentSigningContext;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n }\n): Promise<unknown> {\n // Keep the public debug-log contract identical across modern and legacy\n // protocol eras. Era negotiation happens after these common entries; the\n // selected transport appends its own connection diagnostics.\n debugLogs.push({\n type: 'info',\n message: `MCP: Auth configuration`,\n timestamp: new Date().toISOString(),\n hasAuth: !!authToken,\n headers: authToken ? { 'x-adcp-auth': '***' } : {},\n customHeaderKeys: customHeaders ? Object.keys(customHeaders) : [],\n });\n\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n\n if (authToken) {\n debugLogs.push({\n type: 'info',\n message: `MCP: Transport configured with x-adcp-auth header for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n }\n\n const modernAttempt = await tryCallModernMCPTool(agentUrl, toolName, args, authToken, debugLogs, customHeaders, {\n ...(options?.signingContext && { signingContext: options.signingContext }),\n ...(options?.signal && { signal: options.signal }),\n ...(options?.requestTimeoutMs !== undefined && { requestTimeoutMs: options.requestTimeoutMs }),\n ...(options?.fetchFn && { fetchFn: options.fetchFn }),\n ...(options?.allowPrivateIp !== undefined && { allowPrivateIp: options.allowPrivateIp }),\n });\n if (modernAttempt.handled) {\n debugLogs.push({\n type: modernAttempt.response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${modernAttempt.response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: modernAttempt.response,\n });\n return modernAttempt.response;\n }\n\n return withSpan(\n 'adcp.mcp.call_tool',\n {\n 'adcp.tool': toolName,\n 'http.url': agentUrl,\n },\n async () =>\n signingContextStorage.run(options?.signingContext, async () => {\n const authHeaders = buildAuthHeaders(authToken, customHeaders);\n const workingTimeout = options?.workingTimeout ?? 120_000;\n\n return withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n toolName,\n client =>\n callToolOnClient(\n client,\n toolName,\n args,\n debugLogs,\n workingTimeout,\n options?.signal,\n options?.requestTimeoutMs\n ),\n options?.fetchFn,\n {\n signal: options?.signal,\n requestTimeoutMs: options?.requestTimeoutMs,\n allowPrivateIp: options?.allowPrivateIp,\n originBoundHeaders: Object.keys(customHeaders ?? {}),\n }\n );\n })\n );\n}\n\n/**\n * Call a tool on a pre-connected MCP `Client` without HTTP transport or connection caching.\n *\n * This is the in-process companion to `callMCPToolWithTasks`. It skips URL validation,\n * connection setup, OAuth refresh, and the reconnect-retry path — the caller owns the\n * client lifecycle. All other semantics (tasks protocol detection, stream handling,\n * timeout surfacing) are identical to the URL-based path.\n *\n * Use via `AgentClient.fromMCPClient()`. Not intended for direct import outside the\n * protocols directory.\n */\nexport async function callMCPToolWithClient(\n mcpClient: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[] = [],\n options?: { workingTimeout?: number; signal?: AbortSignal; requestTimeoutMs?: number }\n): Promise<unknown> {\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} (in-process) with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n return callToolOnClient(\n mcpClient,\n toolName,\n args,\n debugLogs,\n options?.workingTimeout ?? 120_000,\n options?.signal,\n options?.requestTimeoutMs\n );\n}\n\n/**\n * Inner dispatch logic shared by `callMCPToolWithTasks` (URL path) and\n * `callMCPToolWithClient` (in-process path). Both paths converge here once\n * a connected `MCPClient` is in hand.\n */\nasync function callToolOnClient(\n client: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[],\n workingTimeout: number,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<unknown> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n const requestOptions = {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n };\n if (!serverSupportsTasks(client)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server does not support tasks, using standard callTool for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n const response = (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n\n debugLogs.push({\n type: response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: response,\n });\n\n return response;\n }\n\n // Ensure tool metadata is cached so the SDK's isToolTask() works correctly.\n // Without this, callToolStream silently skips task creation for tools that\n // declare taskSupport: 'optional' | 'required'.\n await ensureToolsListed(client, signal, resolvedRequestTimeoutMs);\n\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server supports tasks, using callToolStream for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n // Use callToolStream which handles the full task lifecycle\n const stream = client.experimental.tasks.callToolStream({ name: toolName, arguments: args }, undefined, {\n timeout: resolvedRequestTimeoutMs ?? workingTimeout,\n resetTimeoutOnProgress: true,\n ...(signal && { signal }),\n });\n\n let capturedTaskId: string | undefined;\n let capturedTask: { taskId: string; status: string; pollInterval?: number } | undefined;\n\n try {\n for await (const message of stream) {\n switch (message.type) {\n case 'taskCreated':\n capturedTaskId = message.task.taskId;\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Task created ${capturedTaskId} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'taskStatus':\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Status update for ${capturedTaskId}: ${message.task.status}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'result': {\n debugLogs.push({\n type: 'success',\n message: `MCP: Tool ${toolName} response received (success)`,\n timestamp: new Date().toISOString(),\n response: message.result,\n });\n return message.result as CallToolResponse;\n }\n\n case 'error': {\n debugLogs.push({\n type: 'error',\n message: `MCP Tasks: Error for ${toolName}: ${message.error.message}`,\n timestamp: new Date().toISOString(),\n });\n // The MCP Tasks SDK error event may strip structured content.\n // If we have a taskId, fetch the full result to recover adcp_error data\n // and return it as a proper isError response for downstream unwrapping.\n if (capturedTaskId) {\n try {\n const taskResult = await client.experimental.tasks.getTaskResult(\n capturedTaskId,\n undefined,\n requestOptions\n );\n const content = taskResult?.content as Array<{ type: string; text?: string }> | undefined;\n if (content) {\n return {\n isError: true,\n content,\n structuredContent: taskResult?.structuredContent,\n } as unknown as CallToolResponse;\n }\n } catch {\n // Failed to fetch task result — fall through to throw\n }\n }\n throw message.error;\n }\n }\n }\n } catch (error) {\n if (signal?.aborted && isAbortOrTimeoutError(error)) {\n throw error;\n }\n // If we timed out but have a taskId, return a working status\n // so the caller can poll via getMCPTaskStatus/getMCPTaskResult\n if (capturedTaskId && error instanceof Error && /timeout|timed out/i.test(error.message)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Timeout for ${toolName}, returning working status with taskId ${capturedTaskId}`,\n timestamp: new Date().toISOString(),\n });\n\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n if (isAbortOrTimeoutError(error)) {\n throw error;\n }\n // Servers may return a synchronous tool error (e.g. VERSION_UNSUPPORTED)\n // rather than creating a task. The Tasks SDK rejects these with a Zod\n // validation error about a missing `task` field. When no task was\n // captured, fall back to standard callTool so the error response\n // reaches the caller intact.\n const msg = error instanceof Error ? error.message : String(error);\n if (!capturedTaskId && /Invalid task creation result/i.test(msg)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server returned synchronous response for ${toolName}, falling back to callTool`,\n timestamp: new Date().toISOString(),\n });\n return (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n }\n throw error;\n }\n\n // Stream ended without result — shouldn't happen with well-behaved servers\n if (capturedTaskId) {\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n\n throw new Error(`MCP Tasks: callToolStream for ${toolName} ended without result or task`);\n}\n\n/**\n * Get task status via MCP Tasks protocol method (not tool call).\n *\n * Task lifecycle methods (`tasks/get`, `tasks/result`, `tasks/list`,\n * `tasks/cancel`) are MCP protocol methods, not AdCP operations.\n * `extractAdcpOperation` returns `undefined` for them, so the signing fetch\n * passes them through unsigned regardless of whether an `AgentSigningContext`\n * is present in ALS. That matches the RFC 9421 signing profile, which only\n * covers AdCP tool calls (`tools/call` / `message/send`).\n *\n * Re-throws auth errors (401) — only catches protocol capability errors.\n */\nexport async function getMCPTaskStatus(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n toolName?: string\n): Promise<TaskInfo> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/get:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: getTask ${taskId} → ${result.status}`,\n timestamp: new Date().toISOString(),\n });\n return mapMCPTaskToTaskInfo(\n result as {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName\n );\n });\n}\n\n/**\n * Get task result via MCP Tasks protocol method (blocks until terminal).\n */\nexport async function getMCPTaskResult(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<unknown> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/result:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTaskResult(taskId);\n debugLogs.push({\n type: 'success',\n message: `MCP Tasks: getTaskResult ${taskId} received`,\n timestamp: new Date().toISOString(),\n });\n return result;\n });\n}\n\n/**\n * List tasks via MCP Tasks protocol method.\n */\nexport async function listMCPTasks(\n agentUrl: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n options: MCPTaskProtocolOptions = {}\n): Promise<TaskInfo[]> {\n const authHeaders = buildAuthHeaders(authToken);\n\n return withResponseSizeLimit(options.transport?.maxResponseBytes, () =>\n withTransportDiagnostics(\n {\n agentId: options.transportActivityContext?.agentId ?? 'unknown-agent',\n protocol: 'mcp',\n tool: 'tasks/list',\n taskType: 'tasks/list',\n ...options.transportActivityContext,\n onTransportActivity: options.onTransportActivity,\n },\n () =>\n withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n 'tasks/list',\n async client => {\n const result = await client.experimental.tasks.listTasks();\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,\n timestamp: new Date().toISOString(),\n });\n return result.tasks.map((task: any) => mapMCPTaskToTaskInfo(task));\n },\n options.transport?.trustedFetchFn,\n {\n requestTimeoutMs: options.transport?.requestTimeoutMs,\n allowPrivateIp: options.transport?.allowPrivateIp,\n }\n )\n )\n );\n}\n\n/**\n * Cancel a task via MCP Tasks protocol method.\n */\nexport async function cancelMCPTask(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<void> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n await withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/cancel:${taskId}`, async client => {\n await client.experimental.tasks.cancelTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: cancelTask ${taskId} succeeded`,\n timestamp: new Date().toISOString(),\n });\n });\n}\n"],"mappings":"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","names":["require"]}
@@ -57,6 +57,13 @@ export interface MCPConnectionResult {
57
57
  client: MCPClient;
58
58
  transport: StreamableHTTPClientTransport;
59
59
  }
60
+ interface MCPTransportRequestOptions {
61
+ signal?: AbortSignal;
62
+ requestTimeoutMs?: number;
63
+ allowPrivateIp?: boolean;
64
+ /** Names of caller-configured headers that must remain at the configured agent origin. */
65
+ originBoundHeaders?: readonly string[];
66
+ }
60
67
  /**
61
68
  * Connect an MCPClient to the given URL with automatic transport fallback.
62
69
  *
@@ -71,11 +78,7 @@ export interface MCPConnectionResult {
71
78
  * The returned client is connected and ready for use. Callers are responsible for
72
79
  * calling client.close() when done.
73
80
  */
74
- export declare function connectMCPWithFallback(url: URL, authHeaders: Record<string, string>, debugLogs?: DebugLogEntry[], label?: string, transportFetch?: typeof fetch, requestOptions?: {
75
- signal?: AbortSignal;
76
- requestTimeoutMs?: number;
77
- allowPrivateIp?: boolean;
78
- }): Promise<MCPClient>;
81
+ export declare function connectMCPWithFallback(url: URL, authHeaders: Record<string, string>, debugLogs?: DebugLogEntry[], label?: string, transportFetch?: typeof fetch, requestOptions?: MCPTransportRequestOptions): Promise<MCPClient>;
79
82
  export declare function callMCPTool(agentUrl: string, toolName: string, args: Record<string, unknown>, authToken?: string, debugLogs?: DebugLogEntry[], customHeaders?: Record<string, string>, signingContext?: AgentSigningContext, transportFetch?: typeof fetch, requestOptions?: {
80
83
  signal?: AbortSignal;
81
84
  requestTimeoutMs?: number;