@adcp/client 3.8.1 → 3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/bin/adcp.js +527 -11
  2. package/dist/lib/agents/index.generated.d.ts +9 -1
  3. package/dist/lib/agents/index.generated.d.ts.map +1 -1
  4. package/dist/lib/agents/index.generated.js +12 -0
  5. package/dist/lib/agents/index.generated.js.map +1 -1
  6. package/dist/lib/auth/index.d.ts +1 -0
  7. package/dist/lib/auth/index.d.ts.map +1 -1
  8. package/dist/lib/auth/index.js +16 -0
  9. package/dist/lib/auth/index.js.map +1 -1
  10. package/dist/lib/auth/oauth/CLIFlowHandler.d.ts +61 -0
  11. package/dist/lib/auth/oauth/CLIFlowHandler.d.ts.map +1 -0
  12. package/dist/lib/auth/oauth/CLIFlowHandler.js +287 -0
  13. package/dist/lib/auth/oauth/CLIFlowHandler.js.map +1 -0
  14. package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts +126 -0
  15. package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts.map +1 -0
  16. package/dist/lib/auth/oauth/MCPOAuthProvider.js +236 -0
  17. package/dist/lib/auth/oauth/MCPOAuthProvider.js.map +1 -0
  18. package/dist/lib/auth/oauth/discovery.d.ts +96 -0
  19. package/dist/lib/auth/oauth/discovery.d.ts.map +1 -0
  20. package/dist/lib/auth/oauth/discovery.js +104 -0
  21. package/dist/lib/auth/oauth/discovery.js.map +1 -0
  22. package/dist/lib/auth/oauth/index.d.ts +105 -0
  23. package/dist/lib/auth/oauth/index.d.ts.map +1 -0
  24. package/dist/lib/auth/oauth/index.js +173 -0
  25. package/dist/lib/auth/oauth/index.js.map +1 -0
  26. package/dist/lib/auth/oauth/types.d.ts +114 -0
  27. package/dist/lib/auth/oauth/types.d.ts.map +1 -0
  28. package/dist/lib/auth/oauth/types.js +104 -0
  29. package/dist/lib/auth/oauth/types.js.map +1 -0
  30. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  31. package/dist/lib/core/TaskExecutor.js +21 -9
  32. package/dist/lib/core/TaskExecutor.js.map +1 -1
  33. package/dist/lib/index.d.ts +2 -1
  34. package/dist/lib/index.d.ts.map +1 -1
  35. package/dist/lib/index.js +11 -3
  36. package/dist/lib/index.js.map +1 -1
  37. package/dist/lib/protocols/index.d.ts +2 -1
  38. package/dist/lib/protocols/index.d.ts.map +1 -1
  39. package/dist/lib/protocols/index.js +4 -1
  40. package/dist/lib/protocols/index.js.map +1 -1
  41. package/dist/lib/protocols/mcp.d.ts +80 -0
  42. package/dist/lib/protocols/mcp.d.ts.map +1 -1
  43. package/dist/lib/protocols/mcp.js +158 -0
  44. package/dist/lib/protocols/mcp.js.map +1 -1
  45. package/dist/lib/testing/agent-tester.d.ts +1 -1
  46. package/dist/lib/testing/agent-tester.d.ts.map +1 -1
  47. package/dist/lib/testing/agent-tester.js +39 -1
  48. package/dist/lib/testing/agent-tester.js.map +1 -1
  49. package/dist/lib/testing/index.d.ts +1 -1
  50. package/dist/lib/testing/index.d.ts.map +1 -1
  51. package/dist/lib/testing/index.js +11 -1
  52. package/dist/lib/testing/index.js.map +1 -1
  53. package/dist/lib/testing/scenarios/capabilities.d.ts +27 -0
  54. package/dist/lib/testing/scenarios/capabilities.d.ts.map +1 -0
  55. package/dist/lib/testing/scenarios/capabilities.js +250 -0
  56. package/dist/lib/testing/scenarios/capabilities.js.map +1 -0
  57. package/dist/lib/testing/scenarios/governance.d.ts +35 -0
  58. package/dist/lib/testing/scenarios/governance.d.ts.map +1 -0
  59. package/dist/lib/testing/scenarios/governance.js +428 -0
  60. package/dist/lib/testing/scenarios/governance.js.map +1 -0
  61. package/dist/lib/testing/scenarios/index.d.ts +3 -0
  62. package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
  63. package/dist/lib/testing/scenarios/index.js +15 -1
  64. package/dist/lib/testing/scenarios/index.js.map +1 -1
  65. package/dist/lib/testing/scenarios/sponsored-intelligence.d.ts +34 -0
  66. package/dist/lib/testing/scenarios/sponsored-intelligence.d.ts.map +1 -0
  67. package/dist/lib/testing/scenarios/sponsored-intelligence.js +318 -0
  68. package/dist/lib/testing/scenarios/sponsored-intelligence.js.map +1 -0
  69. package/dist/lib/testing/types.d.ts +9 -1
  70. package/dist/lib/testing/types.d.ts.map +1 -1
  71. package/dist/lib/types/adcp.d.ts +47 -1
  72. package/dist/lib/types/adcp.d.ts.map +1 -1
  73. package/dist/lib/types/core.generated.d.ts +393 -164
  74. package/dist/lib/types/core.generated.d.ts.map +1 -1
  75. package/dist/lib/types/core.generated.js +2 -2
  76. package/dist/lib/types/core.generated.js.map +1 -1
  77. package/dist/lib/types/schemas.generated.d.ts +1275 -845
  78. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  79. package/dist/lib/types/schemas.generated.js +300 -198
  80. package/dist/lib/types/schemas.generated.js.map +1 -1
  81. package/dist/lib/types/tools.generated.d.ts +461 -167
  82. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  83. package/dist/lib/types/tools.generated.js +1 -1
  84. package/dist/lib/types/tools.generated.js.map +1 -1
  85. package/dist/lib/version.d.ts +5 -5
  86. package/dist/lib/version.d.ts.map +1 -1
  87. package/dist/lib/version.js +5 -5
  88. package/dist/lib/version.js.map +1 -1
  89. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCPOAuthProvider.d.ts","sourceRoot":"","sources":["../../../../src/lib/auth/oauth/MCPOAuthProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACZ,MAAM,SAAS,CAAC;AAIjB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,gBAAiB,YAAW,mBAAmB;IAC1D,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;gBAE1C,MAAM,EAAE,mBAAmB;IAOvC;;OAEG;IACH,MAAM,CAAC,MAAM,CACX,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,gBAAgB,EAC7B,OAAO,CAAC,EAAE,kBAAkB,EAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACrD,gBAAgB;IAoBnB,IAAI,WAAW,IAAI,MAAM,GAAG,GAAG,CAE9B;IAED,IAAI,cAAc,IAAI,mBAAmB,CAExC;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC;IAOtE;;OAEG;IACG,qBAAqB,CAAC,UAAU,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlF;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAOhD;;;OAGG;IACG,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD;;OAEG;IACG,uBAAuB,CAAC,gBAAgB,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE;;OAEG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAUrC;;OAEG;IACG,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB3F;;OAEG;YACW,YAAY;IAM1B;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAIxC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;;OAGG;IACH,cAAc,IAAI,OAAO;IAgBzB;;;OAGG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC;;;OAGG;IACH,QAAQ,IAAI,WAAW;IAIvB;;;OAGG;IACH,UAAU,IAAI,MAAM;CAGrB"}
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ /**
3
+ * MCP OAuth Provider
4
+ *
5
+ * Implements the MCP SDK's OAuthClientProvider interface
6
+ * using AgentConfig for token storage.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MCPOAuthProvider = void 0;
10
+ const types_1 = require("./types");
11
+ const crypto_1 = require("crypto");
12
+ /**
13
+ * MCP OAuth Client Provider
14
+ *
15
+ * This provider stores OAuth tokens directly in the AgentConfig,
16
+ * using the same structure as static auth tokens.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const agent: AgentConfig = {
21
+ * id: 'my-agent',
22
+ * name: 'My Agent',
23
+ * agent_uri: 'https://agent.example.com/mcp',
24
+ * protocol: 'mcp',
25
+ * // OAuth tokens stored here after auth flow
26
+ * oauth_tokens: { access_token: '...', refresh_token: '...' }
27
+ * };
28
+ *
29
+ * const provider = new MCPOAuthProvider({
30
+ * agent,
31
+ * flowHandler: new CLIFlowHandler(),
32
+ * storage: myConfigStorage // Optional: persists tokens
33
+ * });
34
+ *
35
+ * const transport = new StreamableHTTPClientTransport(url, {
36
+ * authProvider: provider
37
+ * });
38
+ * ```
39
+ */
40
+ class MCPOAuthProvider {
41
+ agent;
42
+ storage;
43
+ flowHandler;
44
+ _clientMetadata;
45
+ constructor(config) {
46
+ this.agent = config.agent;
47
+ this.storage = config.storage;
48
+ this.flowHandler = config.flowHandler;
49
+ this._clientMetadata = config.clientMetadata;
50
+ }
51
+ /**
52
+ * Create a provider for CLI usage
53
+ */
54
+ static forCLI(agent, flowHandler, storage, clientMetadataOverrides) {
55
+ // Build complete client metadata with required fields
56
+ const clientMetadata = {
57
+ ...types_1.DEFAULT_CLIENT_METADATA,
58
+ redirect_uris: [flowHandler.getRedirectUrl().toString()],
59
+ ...clientMetadataOverrides,
60
+ };
61
+ return new MCPOAuthProvider({
62
+ agent,
63
+ flowHandler,
64
+ storage,
65
+ clientMetadata,
66
+ });
67
+ }
68
+ // ========================================
69
+ // OAuthClientProvider interface
70
+ // ========================================
71
+ get redirectUrl() {
72
+ return this.flowHandler.getRedirectUrl();
73
+ }
74
+ get clientMetadata() {
75
+ return this._clientMetadata;
76
+ }
77
+ /**
78
+ * Generate OAuth state parameter
79
+ */
80
+ async state() {
81
+ return (0, crypto_1.randomBytes)(32).toString('base64url');
82
+ }
83
+ /**
84
+ * Load client information from agent config
85
+ */
86
+ async clientInformation() {
87
+ if (this.agent.oauth_client) {
88
+ return (0, types_1.toMCPClientInfo)(this.agent.oauth_client);
89
+ }
90
+ return undefined;
91
+ }
92
+ /**
93
+ * Save client information after dynamic registration
94
+ */
95
+ async saveClientInformation(clientInfo) {
96
+ this.agent.oauth_client = (0, types_1.fromMCPClientInfo)(clientInfo);
97
+ await this.persistAgent();
98
+ }
99
+ /**
100
+ * Load existing tokens from agent config
101
+ */
102
+ async tokens() {
103
+ if (this.agent.oauth_tokens) {
104
+ return (0, types_1.toMCPTokens)(this.agent.oauth_tokens);
105
+ }
106
+ return undefined;
107
+ }
108
+ /**
109
+ * Save tokens after authorization
110
+ * Also cleans up the temporary code verifier
111
+ */
112
+ async saveTokens(tokens) {
113
+ this.agent.oauth_tokens = (0, types_1.fromMCPTokens)(tokens);
114
+ // Clean up temporary code verifier after successful token exchange
115
+ delete this.agent.oauth_code_verifier;
116
+ await this.persistAgent();
117
+ }
118
+ /**
119
+ * Redirect user to authorization URL
120
+ */
121
+ async redirectToAuthorization(authorizationUrl) {
122
+ await this.flowHandler.redirectToAuthorization(authorizationUrl);
123
+ }
124
+ /**
125
+ * Save PKCE code verifier
126
+ */
127
+ async saveCodeVerifier(codeVerifier) {
128
+ this.agent.oauth_code_verifier = codeVerifier;
129
+ await this.persistAgent();
130
+ }
131
+ /**
132
+ * Load PKCE code verifier
133
+ * The MCP SDK calls saveCodeVerifier() before authorization and
134
+ * retrieves it here during token exchange.
135
+ */
136
+ async codeVerifier() {
137
+ if (!this.agent.oauth_code_verifier) {
138
+ throw new Error('No PKCE code verifier found. The OAuth flow may have been interrupted or ' +
139
+ 'the agent config was modified. Please try authenticating again.');
140
+ }
141
+ return this.agent.oauth_code_verifier;
142
+ }
143
+ /**
144
+ * Invalidate credentials when server indicates they're invalid
145
+ */
146
+ async invalidateCredentials(scope) {
147
+ switch (scope) {
148
+ case 'all':
149
+ delete this.agent.oauth_tokens;
150
+ delete this.agent.oauth_client;
151
+ delete this.agent.oauth_code_verifier;
152
+ break;
153
+ case 'tokens':
154
+ delete this.agent.oauth_tokens;
155
+ break;
156
+ case 'client':
157
+ delete this.agent.oauth_client;
158
+ break;
159
+ case 'verifier':
160
+ delete this.agent.oauth_code_verifier;
161
+ break;
162
+ }
163
+ await this.persistAgent();
164
+ }
165
+ // ========================================
166
+ // Additional methods
167
+ // ========================================
168
+ /**
169
+ * Persist agent config to storage if configured
170
+ */
171
+ async persistAgent() {
172
+ if (this.storage) {
173
+ await this.storage.saveAgent(this.agent);
174
+ }
175
+ }
176
+ /**
177
+ * Wait for the OAuth callback
178
+ * Call this after UnauthorizedError is thrown
179
+ */
180
+ async waitForCallback() {
181
+ return this.flowHandler.waitForCallback();
182
+ }
183
+ /**
184
+ * Clean up resources
185
+ */
186
+ async cleanup() {
187
+ await this.flowHandler.cleanup();
188
+ }
189
+ /**
190
+ * Check if we have valid, non-expired OAuth tokens
191
+ * @returns true if access_token exists and hasn't expired (with 5 minute buffer)
192
+ */
193
+ hasValidTokens() {
194
+ const tokens = this.agent.oauth_tokens;
195
+ if (!tokens?.access_token)
196
+ return false;
197
+ // Check expiration if available
198
+ if (tokens.expires_at) {
199
+ const expiresAt = new Date(tokens.expires_at);
200
+ // Consider expired if within 5 minutes of expiration
201
+ if (expiresAt.getTime() - Date.now() < 5 * 60 * 1000) {
202
+ return false;
203
+ }
204
+ }
205
+ return true;
206
+ }
207
+ /**
208
+ * Check if we have a refresh token available for token refresh
209
+ * @returns true if refresh_token is present
210
+ */
211
+ hasRefreshToken() {
212
+ return !!this.agent.oauth_tokens?.refresh_token;
213
+ }
214
+ /**
215
+ * Clear all OAuth data for this agent
216
+ */
217
+ async clearAuth() {
218
+ await this.invalidateCredentials('all');
219
+ }
220
+ /**
221
+ * Get the agent config this provider manages
222
+ * @returns The AgentConfig with OAuth tokens populated after successful auth
223
+ */
224
+ getAgent() {
225
+ return this.agent;
226
+ }
227
+ /**
228
+ * Get the agent identifier
229
+ * @returns The agent's unique ID
230
+ */
231
+ getAgentId() {
232
+ return this.agent.id;
233
+ }
234
+ }
235
+ exports.MCPOAuthProvider = MCPOAuthProvider;
236
+ //# sourceMappingURL=MCPOAuthProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCPOAuthProvider.js","sourceRoot":"","sources":["../../../../src/lib/auth/oauth/MCPOAuthProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * OAuth Discovery utilities
3
+ *
4
+ * Functions to discover OAuth capabilities of MCP servers.
5
+ * MCP servers expose OAuth metadata at /.well-known/oauth-authorization-server
6
+ */
7
+ /**
8
+ * OAuth Authorization Server Metadata
9
+ * @see https://datatracker.ietf.org/doc/html/rfc8414
10
+ */
11
+ export interface OAuthMetadata {
12
+ /** URL of the authorization endpoint */
13
+ authorization_endpoint: string;
14
+ /** URL of the token endpoint */
15
+ token_endpoint: string;
16
+ /** URL of the dynamic client registration endpoint (optional) */
17
+ registration_endpoint?: string;
18
+ /** Issuer identifier */
19
+ issuer?: string;
20
+ /** PKCE code challenge methods supported */
21
+ code_challenge_methods_supported?: string[];
22
+ /** Response types supported */
23
+ response_types_supported?: string[];
24
+ /** Grant types supported */
25
+ grant_types_supported?: string[];
26
+ /** Token endpoint auth methods supported */
27
+ token_endpoint_auth_methods_supported?: string[];
28
+ /** Scopes supported */
29
+ scopes_supported?: string[];
30
+ }
31
+ /**
32
+ * Options for OAuth discovery
33
+ */
34
+ export interface DiscoveryOptions {
35
+ /** Timeout in milliseconds (default: 5000) */
36
+ timeout?: number;
37
+ /** Custom fetch function (for testing or custom HTTP handling) */
38
+ fetch?: typeof fetch;
39
+ }
40
+ /**
41
+ * Discover OAuth metadata from an MCP server
42
+ *
43
+ * Fetches the OAuth Authorization Server Metadata from the well-known endpoint.
44
+ * Returns null if the server doesn't support OAuth or the metadata isn't available.
45
+ *
46
+ * @param agentUrl - The MCP server URL
47
+ * @param options - Discovery options
48
+ * @returns OAuth metadata or null if not available
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * const metadata = await discoverOAuthMetadata('https://agent.example.com/mcp');
53
+ * if (metadata) {
54
+ * console.log('Authorization URL:', metadata.authorization_endpoint);
55
+ * console.log('Supports dynamic registration:', !!metadata.registration_endpoint);
56
+ * }
57
+ * ```
58
+ */
59
+ export declare function discoverOAuthMetadata(agentUrl: string, options?: DiscoveryOptions): Promise<OAuthMetadata | null>;
60
+ /**
61
+ * Check if an MCP server supports OAuth authentication
62
+ *
63
+ * This is a simple boolean check - use discoverOAuthMetadata() if you need
64
+ * the actual endpoints.
65
+ *
66
+ * @param agentUrl - The MCP server URL
67
+ * @param options - Discovery options
68
+ * @returns true if the server supports OAuth
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * if (await supportsOAuth('https://agent.example.com/mcp')) {
73
+ * console.log('Agent requires OAuth authentication');
74
+ * }
75
+ * ```
76
+ */
77
+ export declare function supportsOAuth(agentUrl: string, options?: DiscoveryOptions): Promise<boolean>;
78
+ /**
79
+ * Check if an MCP server supports dynamic client registration
80
+ *
81
+ * Servers that support dynamic registration allow clients to register
82
+ * automatically without pre-configured credentials.
83
+ *
84
+ * @param agentUrl - The MCP server URL
85
+ * @param options - Discovery options
86
+ * @returns true if the server supports dynamic client registration
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * if (await supportsDynamicRegistration('https://agent.example.com/mcp')) {
91
+ * console.log('Agent supports automatic client registration');
92
+ * }
93
+ * ```
94
+ */
95
+ export declare function supportsDynamicRegistration(agentUrl: string, options?: DiscoveryOptions): Promise<boolean>;
96
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../../src/lib/auth/oauth/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gCAAgC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,gCAAgC,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5C,+BAA+B;IAC/B,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,4BAA4B;IAC5B,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,4CAA4C;IAC5C,qCAAqC,CAAC,EAAE,MAAM,EAAE,CAAC;IACjD,uBAAuB;IACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAmC/B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CAGtG;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CAGpH"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * OAuth Discovery utilities
4
+ *
5
+ * Functions to discover OAuth capabilities of MCP servers.
6
+ * MCP servers expose OAuth metadata at /.well-known/oauth-authorization-server
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.discoverOAuthMetadata = discoverOAuthMetadata;
10
+ exports.supportsOAuth = supportsOAuth;
11
+ exports.supportsDynamicRegistration = supportsDynamicRegistration;
12
+ /**
13
+ * Discover OAuth metadata from an MCP server
14
+ *
15
+ * Fetches the OAuth Authorization Server Metadata from the well-known endpoint.
16
+ * Returns null if the server doesn't support OAuth or the metadata isn't available.
17
+ *
18
+ * @param agentUrl - The MCP server URL
19
+ * @param options - Discovery options
20
+ * @returns OAuth metadata or null if not available
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const metadata = await discoverOAuthMetadata('https://agent.example.com/mcp');
25
+ * if (metadata) {
26
+ * console.log('Authorization URL:', metadata.authorization_endpoint);
27
+ * console.log('Supports dynamic registration:', !!metadata.registration_endpoint);
28
+ * }
29
+ * ```
30
+ */
31
+ async function discoverOAuthMetadata(agentUrl, options = {}) {
32
+ const { timeout = 5000, fetch: customFetch = fetch } = options;
33
+ try {
34
+ const baseUrl = new URL(agentUrl);
35
+ const metadataUrl = new URL('/.well-known/oauth-authorization-server', baseUrl.origin);
36
+ const controller = new AbortController();
37
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
38
+ try {
39
+ const response = await customFetch(metadataUrl.toString(), {
40
+ headers: { Accept: 'application/json' },
41
+ signal: controller.signal,
42
+ });
43
+ if (!response.ok) {
44
+ return null;
45
+ }
46
+ const metadata = (await response.json());
47
+ // Validate required fields
48
+ if (!metadata.authorization_endpoint || !metadata.token_endpoint) {
49
+ return null;
50
+ }
51
+ return metadata;
52
+ }
53
+ finally {
54
+ clearTimeout(timeoutId);
55
+ }
56
+ }
57
+ catch {
58
+ // Network error, timeout, or invalid URL - agent doesn't support OAuth
59
+ return null;
60
+ }
61
+ }
62
+ /**
63
+ * Check if an MCP server supports OAuth authentication
64
+ *
65
+ * This is a simple boolean check - use discoverOAuthMetadata() if you need
66
+ * the actual endpoints.
67
+ *
68
+ * @param agentUrl - The MCP server URL
69
+ * @param options - Discovery options
70
+ * @returns true if the server supports OAuth
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * if (await supportsOAuth('https://agent.example.com/mcp')) {
75
+ * console.log('Agent requires OAuth authentication');
76
+ * }
77
+ * ```
78
+ */
79
+ async function supportsOAuth(agentUrl, options = {}) {
80
+ const metadata = await discoverOAuthMetadata(agentUrl, options);
81
+ return metadata !== null;
82
+ }
83
+ /**
84
+ * Check if an MCP server supports dynamic client registration
85
+ *
86
+ * Servers that support dynamic registration allow clients to register
87
+ * automatically without pre-configured credentials.
88
+ *
89
+ * @param agentUrl - The MCP server URL
90
+ * @param options - Discovery options
91
+ * @returns true if the server supports dynamic client registration
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * if (await supportsDynamicRegistration('https://agent.example.com/mcp')) {
96
+ * console.log('Agent supports automatic client registration');
97
+ * }
98
+ * ```
99
+ */
100
+ async function supportsDynamicRegistration(agentUrl, options = {}) {
101
+ const metadata = await discoverOAuthMetadata(agentUrl, options);
102
+ return metadata?.registration_endpoint !== undefined;
103
+ }
104
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../../src/lib/auth/oauth/discovery.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAwDH,sDAsCC;AAmBD,sCAGC;AAmBD,kEAGC;AArGD;;;;;;;;;;;;;;;;;;GAkBG;AACI,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,UAA4B,EAAE;IAE9B,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,yCAAyC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAEvF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE;gBACzD,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;gBACvC,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAC;YAE1D,2BAA2B;YAC3B,IAAI,CAAC,QAAQ,CAAC,sBAAsB,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;gBACjE,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACI,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,UAA4B,EAAE;IAClF,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,QAAQ,KAAK,IAAI,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACI,KAAK,UAAU,2BAA2B,CAAC,QAAgB,EAAE,UAA4B,EAAE;IAChG,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,QAAQ,EAAE,qBAAqB,KAAK,SAAS,CAAC;AACvD,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * OAuth module for MCP authentication
3
+ *
4
+ * OAuth tokens are stored directly in AgentConfig, same as static auth tokens.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { MCPOAuthProvider, CLIFlowHandler } from '@adcp/client';
9
+ *
10
+ * // Agent config - tokens will be stored here
11
+ * const agent: AgentConfig = {
12
+ * id: 'my-agent',
13
+ * name: 'My Agent',
14
+ * agent_uri: 'https://agent.example.com/mcp',
15
+ * protocol: 'mcp',
16
+ * // After OAuth flow completes:
17
+ * // oauth_tokens: { access_token: '...', refresh_token: '...' }
18
+ * };
19
+ *
20
+ * // Create provider with CLI flow handler
21
+ * const provider = new MCPOAuthProvider({
22
+ * agent,
23
+ * flowHandler: new CLIFlowHandler(),
24
+ * storage: myConfigStorage // Optional: persists tokens to file/db
25
+ * });
26
+ *
27
+ * // Use with MCP transport
28
+ * const transport = new StreamableHTTPClientTransport(url, {
29
+ * authProvider: provider
30
+ * });
31
+ * ```
32
+ */
33
+ export type { OAuthFlowHandler, OAuthProviderConfig, OAuthConfigStorage, OAuthClientInformation, OAuthClientInformationFull, OAuthClientMetadata, OAuthTokens, AgentConfig, AgentOAuthTokens, AgentOAuthClient, } from './types';
34
+ export { DEFAULT_CLIENT_METADATA, OAuthError, OAuthCancelledError, OAuthTimeoutError, toMCPTokens, fromMCPTokens, toMCPClientInfo, fromMCPClientInfo, } from './types';
35
+ export { CLIFlowHandler, type CLIFlowHandlerConfig } from './CLIFlowHandler';
36
+ export { MCPOAuthProvider } from './MCPOAuthProvider';
37
+ import { MCPOAuthProvider } from './MCPOAuthProvider';
38
+ import type { OAuthClientMetadata, OAuthConfigStorage, AgentConfig } from './types';
39
+ /**
40
+ * Create an OAuth provider for CLI usage
41
+ *
42
+ * @param agent Agent configuration (tokens stored here)
43
+ * @param options Optional configuration
44
+ * @returns Configured OAuth provider
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const agent: AgentConfig = {
49
+ * id: 'my-agent',
50
+ * name: 'My Agent',
51
+ * agent_uri: 'https://agent.example.com/mcp',
52
+ * protocol: 'mcp'
53
+ * };
54
+ *
55
+ * const provider = createCLIOAuthProvider(agent);
56
+ *
57
+ * const transport = new StreamableHTTPClientTransport(url, {
58
+ * authProvider: provider
59
+ * });
60
+ *
61
+ * try {
62
+ * await client.connect(transport);
63
+ * } catch (error) {
64
+ * if (error instanceof UnauthorizedError) {
65
+ * const code = await provider.waitForCallback();
66
+ * await transport.finishAuth(code);
67
+ * await client.connect(transport);
68
+ * }
69
+ * }
70
+ *
71
+ * // After successful auth, agent.oauth_tokens is populated
72
+ * console.log(agent.oauth_tokens);
73
+ * ```
74
+ */
75
+ export declare function createCLIOAuthProvider(agent: AgentConfig, options?: {
76
+ /** Callback port (default: 8766) */
77
+ callbackPort?: number;
78
+ /** Auth timeout in ms (default: 300000 = 5 min) */
79
+ timeout?: number;
80
+ /** Custom client metadata overrides */
81
+ clientMetadata?: Partial<OAuthClientMetadata>;
82
+ /** Suppress console output */
83
+ quiet?: boolean;
84
+ /** Storage for persisting agent config */
85
+ storage?: OAuthConfigStorage;
86
+ }): MCPOAuthProvider;
87
+ /**
88
+ * Check if an error indicates OAuth is required
89
+ */
90
+ export declare function isOAuthRequired(error: unknown): boolean;
91
+ /**
92
+ * Check if an agent has valid OAuth tokens
93
+ */
94
+ export declare function hasValidOAuthTokens(agent: AgentConfig): boolean;
95
+ /**
96
+ * Clear OAuth tokens from an agent config
97
+ */
98
+ export declare function clearOAuthTokens(agent: AgentConfig): void;
99
+ /**
100
+ * Get the effective auth token for an agent
101
+ * Returns OAuth access_token if available, otherwise static auth_token
102
+ */
103
+ export declare function getEffectiveAuthToken(agent: AgentConfig): string | undefined;
104
+ export { discoverOAuthMetadata, supportsOAuth, supportsDynamicRegistration, type OAuthMetadata, type DiscoveryOptions, } from './discovery';
105
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/auth/oauth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B,EAC1B,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,eAAe,EACf,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAG7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAMtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE;IACR,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC9C,8BAA8B;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B,GACA,gBAAgB,CAqBlB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASvD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAa/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAIzD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAO5E;AAGD,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,2BAA2B,EAC3B,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC"}