@modelcontextprotocol/sdk 1.4.1 → 1.6.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 (150) hide show
  1. package/README.md +7 -4
  2. package/dist/cjs/client/auth.d.ts +116 -0
  3. package/dist/cjs/client/auth.d.ts.map +1 -0
  4. package/dist/cjs/client/auth.js +239 -0
  5. package/dist/cjs/client/auth.js.map +1 -0
  6. package/dist/cjs/client/sse.d.ts +43 -4
  7. package/dist/cjs/client/sse.d.ts.map +1 -1
  8. package/dist/cjs/client/sse.js +72 -5
  9. package/dist/cjs/client/sse.js.map +1 -1
  10. package/dist/cjs/client/stdio.d.ts +8 -2
  11. package/dist/cjs/client/stdio.d.ts.map +1 -1
  12. package/dist/cjs/client/stdio.js +1 -0
  13. package/dist/cjs/client/stdio.js.map +1 -1
  14. package/dist/cjs/server/auth/clients.d.ts +19 -0
  15. package/dist/cjs/server/auth/clients.d.ts.map +1 -0
  16. package/dist/cjs/server/auth/clients.js +3 -0
  17. package/dist/cjs/server/auth/clients.js.map +1 -0
  18. package/dist/cjs/server/auth/errors.d.ts +126 -0
  19. package/dist/cjs/server/auth/errors.d.ts.map +1 -0
  20. package/dist/cjs/server/auth/errors.js +189 -0
  21. package/dist/cjs/server/auth/errors.js.map +1 -0
  22. package/dist/cjs/server/auth/handlers/authorize.d.ts +13 -0
  23. package/dist/cjs/server/auth/handlers/authorize.d.ts.map +1 -0
  24. package/dist/cjs/server/auth/handlers/authorize.js +149 -0
  25. package/dist/cjs/server/auth/handlers/authorize.js.map +1 -0
  26. package/dist/cjs/server/auth/handlers/metadata.d.ts +4 -0
  27. package/dist/cjs/server/auth/handlers/metadata.d.ts.map +1 -0
  28. package/dist/cjs/server/auth/handlers/metadata.js +21 -0
  29. package/dist/cjs/server/auth/handlers/metadata.js.map +1 -0
  30. package/dist/cjs/server/auth/handlers/register.d.ts +23 -0
  31. package/dist/cjs/server/auth/handlers/register.d.ts.map +1 -0
  32. package/dist/cjs/server/auth/handlers/register.js +74 -0
  33. package/dist/cjs/server/auth/handlers/register.js.map +1 -0
  34. package/dist/cjs/server/auth/handlers/revoke.d.ts +13 -0
  35. package/dist/cjs/server/auth/handlers/revoke.d.ts.map +1 -0
  36. package/dist/cjs/server/auth/handlers/revoke.js +67 -0
  37. package/dist/cjs/server/auth/handlers/revoke.js.map +1 -0
  38. package/dist/cjs/server/auth/handlers/token.d.ts +13 -0
  39. package/dist/cjs/server/auth/handlers/token.d.ts.map +1 -0
  40. package/dist/cjs/server/auth/handlers/token.js +107 -0
  41. package/dist/cjs/server/auth/handlers/token.js.map +1 -0
  42. package/dist/cjs/server/auth/middleware/allowedMethods.d.ts +9 -0
  43. package/dist/cjs/server/auth/middleware/allowedMethods.d.ts.map +1 -0
  44. package/dist/cjs/server/auth/middleware/allowedMethods.js +23 -0
  45. package/dist/cjs/server/auth/middleware/allowedMethods.js.map +1 -0
  46. package/dist/cjs/server/auth/middleware/bearerAuth.d.ts +28 -0
  47. package/dist/cjs/server/auth/middleware/bearerAuth.d.ts.map +1 -0
  48. package/dist/cjs/server/auth/middleware/bearerAuth.js +55 -0
  49. package/dist/cjs/server/auth/middleware/bearerAuth.js.map +1 -0
  50. package/dist/cjs/server/auth/middleware/clientAuth.d.ts +19 -0
  51. package/dist/cjs/server/auth/middleware/clientAuth.d.ts.map +1 -0
  52. package/dist/cjs/server/auth/middleware/clientAuth.js +53 -0
  53. package/dist/cjs/server/auth/middleware/clientAuth.js.map +1 -0
  54. package/dist/cjs/server/auth/provider.d.ts +50 -0
  55. package/dist/cjs/server/auth/provider.d.ts.map +1 -0
  56. package/dist/cjs/server/auth/provider.js +3 -0
  57. package/dist/cjs/server/auth/provider.js.map +1 -0
  58. package/dist/cjs/server/auth/router.d.ts +36 -0
  59. package/dist/cjs/server/auth/router.d.ts.map +1 -0
  60. package/dist/cjs/server/auth/router.js +68 -0
  61. package/dist/cjs/server/auth/router.js.map +1 -0
  62. package/dist/cjs/server/auth/types.d.ts +22 -0
  63. package/dist/cjs/server/auth/types.d.ts.map +1 -0
  64. package/dist/cjs/server/auth/types.js +3 -0
  65. package/dist/cjs/server/auth/types.js.map +1 -0
  66. package/dist/cjs/server/mcp.d.ts.map +1 -1
  67. package/dist/cjs/server/mcp.js +3 -1
  68. package/dist/cjs/server/mcp.js.map +1 -1
  69. package/dist/cjs/shared/auth.d.ts +271 -0
  70. package/dist/cjs/shared/auth.d.ts.map +1 -0
  71. package/dist/cjs/shared/auth.js +106 -0
  72. package/dist/cjs/shared/auth.js.map +1 -0
  73. package/dist/cjs/types.d.ts.map +1 -1
  74. package/dist/cjs/types.js +1 -0
  75. package/dist/cjs/types.js.map +1 -1
  76. package/dist/esm/client/auth.d.ts +116 -0
  77. package/dist/esm/client/auth.d.ts.map +1 -0
  78. package/dist/esm/client/auth.js +226 -0
  79. package/dist/esm/client/auth.js.map +1 -0
  80. package/dist/esm/client/sse.d.ts +43 -4
  81. package/dist/esm/client/sse.d.ts.map +1 -1
  82. package/dist/esm/client/sse.js +72 -5
  83. package/dist/esm/client/sse.js.map +1 -1
  84. package/dist/esm/client/stdio.d.ts +8 -2
  85. package/dist/esm/client/stdio.d.ts.map +1 -1
  86. package/dist/esm/client/stdio.js +1 -0
  87. package/dist/esm/client/stdio.js.map +1 -1
  88. package/dist/esm/server/auth/clients.d.ts +19 -0
  89. package/dist/esm/server/auth/clients.d.ts.map +1 -0
  90. package/dist/esm/server/auth/clients.js +2 -0
  91. package/dist/esm/server/auth/clients.js.map +1 -0
  92. package/dist/esm/server/auth/errors.d.ts +126 -0
  93. package/dist/esm/server/auth/errors.d.ts.map +1 -0
  94. package/dist/esm/server/auth/errors.js +169 -0
  95. package/dist/esm/server/auth/errors.js.map +1 -0
  96. package/dist/esm/server/auth/handlers/authorize.d.ts +13 -0
  97. package/dist/esm/server/auth/handlers/authorize.d.ts.map +1 -0
  98. package/dist/esm/server/auth/handlers/authorize.js +143 -0
  99. package/dist/esm/server/auth/handlers/authorize.js.map +1 -0
  100. package/dist/esm/server/auth/handlers/metadata.d.ts +4 -0
  101. package/dist/esm/server/auth/handlers/metadata.d.ts.map +1 -0
  102. package/dist/esm/server/auth/handlers/metadata.js +15 -0
  103. package/dist/esm/server/auth/handlers/metadata.js.map +1 -0
  104. package/dist/esm/server/auth/handlers/register.d.ts +23 -0
  105. package/dist/esm/server/auth/handlers/register.d.ts.map +1 -0
  106. package/dist/esm/server/auth/handlers/register.js +68 -0
  107. package/dist/esm/server/auth/handlers/register.js.map +1 -0
  108. package/dist/esm/server/auth/handlers/revoke.d.ts +13 -0
  109. package/dist/esm/server/auth/handlers/revoke.d.ts.map +1 -0
  110. package/dist/esm/server/auth/handlers/revoke.js +61 -0
  111. package/dist/esm/server/auth/handlers/revoke.js.map +1 -0
  112. package/dist/esm/server/auth/handlers/token.d.ts +13 -0
  113. package/dist/esm/server/auth/handlers/token.d.ts.map +1 -0
  114. package/dist/esm/server/auth/handlers/token.js +101 -0
  115. package/dist/esm/server/auth/handlers/token.js.map +1 -0
  116. package/dist/esm/server/auth/middleware/allowedMethods.d.ts +9 -0
  117. package/dist/esm/server/auth/middleware/allowedMethods.d.ts.map +1 -0
  118. package/dist/esm/server/auth/middleware/allowedMethods.js +20 -0
  119. package/dist/esm/server/auth/middleware/allowedMethods.js.map +1 -0
  120. package/dist/esm/server/auth/middleware/bearerAuth.d.ts +28 -0
  121. package/dist/esm/server/auth/middleware/bearerAuth.d.ts.map +1 -0
  122. package/dist/esm/server/auth/middleware/bearerAuth.js +52 -0
  123. package/dist/esm/server/auth/middleware/bearerAuth.js.map +1 -0
  124. package/dist/esm/server/auth/middleware/clientAuth.d.ts +19 -0
  125. package/dist/esm/server/auth/middleware/clientAuth.d.ts.map +1 -0
  126. package/dist/esm/server/auth/middleware/clientAuth.js +50 -0
  127. package/dist/esm/server/auth/middleware/clientAuth.js.map +1 -0
  128. package/dist/esm/server/auth/provider.d.ts +50 -0
  129. package/dist/esm/server/auth/provider.d.ts.map +1 -0
  130. package/dist/esm/server/auth/provider.js +2 -0
  131. package/dist/esm/server/auth/provider.js.map +1 -0
  132. package/dist/esm/server/auth/router.d.ts +36 -0
  133. package/dist/esm/server/auth/router.d.ts.map +1 -0
  134. package/dist/esm/server/auth/router.js +62 -0
  135. package/dist/esm/server/auth/router.js.map +1 -0
  136. package/dist/esm/server/auth/types.d.ts +22 -0
  137. package/dist/esm/server/auth/types.d.ts.map +1 -0
  138. package/dist/esm/server/auth/types.js +2 -0
  139. package/dist/esm/server/auth/types.js.map +1 -0
  140. package/dist/esm/server/mcp.d.ts.map +1 -1
  141. package/dist/esm/server/mcp.js +3 -1
  142. package/dist/esm/server/mcp.js.map +1 -1
  143. package/dist/esm/shared/auth.d.ts +271 -0
  144. package/dist/esm/shared/auth.d.ts.map +1 -0
  145. package/dist/esm/shared/auth.js +103 -0
  146. package/dist/esm/shared/auth.js.map +1 -0
  147. package/dist/esm/types.d.ts.map +1 -1
  148. package/dist/esm/types.js +1 -0
  149. package/dist/esm/types.js.map +1 -1
  150. package/package.json +10 -3
package/README.md CHANGED
@@ -224,7 +224,7 @@ const server = new McpServer({
224
224
 
225
225
  const app = express();
226
226
 
227
- app.get("/mcp", async (req, res) => {
227
+ app.get("/sse", async (req, res) => {
228
228
  const transport = new SSEServerTransport("/messages", res);
229
229
  await server.connect(transport);
230
230
  });
@@ -236,7 +236,7 @@ app.post("/messages", async (req, res) => {
236
236
  await transport.handlePostMessage(req, res);
237
237
  });
238
238
 
239
- app.listen(3000);
239
+ app.listen(3001);
240
240
  ```
241
241
 
242
242
  ### Testing and Debugging
@@ -470,8 +470,11 @@ const resources = await client.listResources();
470
470
  const resource = await client.readResource("file:///example.txt");
471
471
 
472
472
  // Call a tool
473
- const result = await client.callTool("example-tool", {
474
- arg1: "value"
473
+ const result = await client.callTool({
474
+ name: "example-tool",
475
+ arguments: {
476
+ arg1: "value"
477
+ }
475
478
  });
476
479
  ```
477
480
 
@@ -0,0 +1,116 @@
1
+ import type { OAuthClientMetadata, OAuthClientInformation, OAuthTokens, OAuthMetadata, OAuthClientInformationFull } from "../shared/auth.js";
2
+ /**
3
+ * Implements an end-to-end OAuth client to be used with one MCP server.
4
+ *
5
+ * This client relies upon a concept of an authorized "session," the exact
6
+ * meaning of which is application-defined. Tokens, authorization codes, and
7
+ * code verifiers should not cross different sessions.
8
+ */
9
+ export interface OAuthClientProvider {
10
+ /**
11
+ * The URL to redirect the user agent to after authorization.
12
+ */
13
+ get redirectUrl(): string | URL;
14
+ /**
15
+ * Metadata about this OAuth client.
16
+ */
17
+ get clientMetadata(): OAuthClientMetadata;
18
+ /**
19
+ * Loads information about this OAuth client, as registered already with the
20
+ * server, or returns `undefined` if the client is not registered with the
21
+ * server.
22
+ */
23
+ clientInformation(): OAuthClientInformation | undefined | Promise<OAuthClientInformation | undefined>;
24
+ /**
25
+ * If implemented, this permits the OAuth client to dynamically register with
26
+ * the server. Client information saved this way should later be read via
27
+ * `clientInformation()`.
28
+ *
29
+ * This method is not required to be implemented if client information is
30
+ * statically known (e.g., pre-registered).
31
+ */
32
+ saveClientInformation?(clientInformation: OAuthClientInformationFull): void | Promise<void>;
33
+ /**
34
+ * Loads any existing OAuth tokens for the current session, or returns
35
+ * `undefined` if there are no saved tokens.
36
+ */
37
+ tokens(): OAuthTokens | undefined | Promise<OAuthTokens | undefined>;
38
+ /**
39
+ * Stores new OAuth tokens for the current session, after a successful
40
+ * authorization.
41
+ */
42
+ saveTokens(tokens: OAuthTokens): void | Promise<void>;
43
+ /**
44
+ * Invoked to redirect the user agent to the given URL to begin the authorization flow.
45
+ */
46
+ redirectToAuthorization(authorizationUrl: URL): void | Promise<void>;
47
+ /**
48
+ * Saves a PKCE code verifier for the current session, before redirecting to
49
+ * the authorization flow.
50
+ */
51
+ saveCodeVerifier(codeVerifier: string): void | Promise<void>;
52
+ /**
53
+ * Loads the PKCE code verifier for the current session, necessary to validate
54
+ * the authorization result.
55
+ */
56
+ codeVerifier(): string | Promise<string>;
57
+ }
58
+ export type AuthResult = "AUTHORIZED" | "REDIRECT";
59
+ export declare class UnauthorizedError extends Error {
60
+ constructor(message?: string);
61
+ }
62
+ /**
63
+ * Orchestrates the full auth flow with a server.
64
+ *
65
+ * This can be used as a single entry point for all authorization functionality,
66
+ * instead of linking together the other lower-level functions in this module.
67
+ */
68
+ export declare function auth(provider: OAuthClientProvider, { serverUrl, authorizationCode }: {
69
+ serverUrl: string | URL;
70
+ authorizationCode?: string;
71
+ }): Promise<AuthResult>;
72
+ /**
73
+ * Looks up RFC 8414 OAuth 2.0 Authorization Server Metadata.
74
+ *
75
+ * If the server returns a 404 for the well-known endpoint, this function will
76
+ * return `undefined`. Any other errors will be thrown as exceptions.
77
+ */
78
+ export declare function discoverOAuthMetadata(serverUrl: string | URL, opts?: {
79
+ protocolVersion?: string;
80
+ }): Promise<OAuthMetadata | undefined>;
81
+ /**
82
+ * Begins the authorization flow with the given server, by generating a PKCE challenge and constructing the authorization URL.
83
+ */
84
+ export declare function startAuthorization(serverUrl: string | URL, { metadata, clientInformation, redirectUrl, }: {
85
+ metadata?: OAuthMetadata;
86
+ clientInformation: OAuthClientInformation;
87
+ redirectUrl: string | URL;
88
+ }): Promise<{
89
+ authorizationUrl: URL;
90
+ codeVerifier: string;
91
+ }>;
92
+ /**
93
+ * Exchanges an authorization code for an access token with the given server.
94
+ */
95
+ export declare function exchangeAuthorization(serverUrl: string | URL, { metadata, clientInformation, authorizationCode, codeVerifier, }: {
96
+ metadata?: OAuthMetadata;
97
+ clientInformation: OAuthClientInformation;
98
+ authorizationCode: string;
99
+ codeVerifier: string;
100
+ }): Promise<OAuthTokens>;
101
+ /**
102
+ * Exchange a refresh token for an updated access token.
103
+ */
104
+ export declare function refreshAuthorization(serverUrl: string | URL, { metadata, clientInformation, refreshToken, }: {
105
+ metadata?: OAuthMetadata;
106
+ clientInformation: OAuthClientInformation;
107
+ refreshToken: string;
108
+ }): Promise<OAuthTokens>;
109
+ /**
110
+ * Performs OAuth 2.0 Dynamic Client Registration according to RFC 7591.
111
+ */
112
+ export declare function registerClient(serverUrl: string | URL, { metadata, clientMetadata, }: {
113
+ metadata?: OAuthMetadata;
114
+ clientMetadata: OAuthClientMetadata;
115
+ }): Promise<OAuthClientInformationFull>;
116
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/client/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,WAAW,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAG7I;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,GAAG,CAAC;IAEhC;;OAEG;IACH,IAAI,cAAc,IAAI,mBAAmB,CAAC;IAE1C;;;;OAIG;IACH,iBAAiB,IAAI,sBAAsB,GAAG,SAAS,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IAEtG;;;;;;;OAOG;IACH,qBAAqB,CAAC,CAAC,iBAAiB,EAAE,0BAA0B,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F;;;OAGG;IACH,MAAM,IAAI,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAErE;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtD;;OAEG;IACH,uBAAuB,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErE;;;OAGG;IACH,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7D;;;OAGG;IACH,YAAY,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,UAAU,CAAC;AAEnD,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,CAAC,EAAE,MAAM;CAG7B;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CACxB,QAAQ,EAAE,mBAAmB,EAC7B,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAkEhH;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,GAAG,GAAG,EACvB,IAAI,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAmBpC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,GAAG,GAAG,EACvB,EACE,QAAQ,EACR,iBAAiB,EACjB,WAAW,GACZ,EAAE;IACD,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,iBAAiB,EAAE,sBAAsB,CAAC;IAC1C,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC;CAC3B,GACA,OAAO,CAAC;IAAE,gBAAgB,EAAE,GAAG,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAyC1D;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,GAAG,GAAG,EACvB,EACE,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,EAAE;IACD,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,iBAAiB,EAAE,sBAAsB,CAAC;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC,WAAW,CAAC,CA4CtB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,GAAG,GAAG,EACvB,EACE,QAAQ,EACR,iBAAiB,EACjB,YAAY,GACb,EAAE;IACD,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,iBAAiB,EAAE,sBAAsB,CAAC;IAC1C,YAAY,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC,WAAW,CAAC,CA2CtB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,GAAG,GAAG,EACvB,EACE,QAAQ,EACR,cAAc,GACf,EAAE;IACD,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,mBAAmB,CAAC;CACrC,GACA,OAAO,CAAC,0BAA0B,CAAC,CA0BrC"}
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.UnauthorizedError = void 0;
7
+ exports.auth = auth;
8
+ exports.discoverOAuthMetadata = discoverOAuthMetadata;
9
+ exports.startAuthorization = startAuthorization;
10
+ exports.exchangeAuthorization = exchangeAuthorization;
11
+ exports.refreshAuthorization = refreshAuthorization;
12
+ exports.registerClient = registerClient;
13
+ const pkce_challenge_1 = __importDefault(require("pkce-challenge"));
14
+ const types_js_1 = require("../types.js");
15
+ const auth_js_1 = require("../shared/auth.js");
16
+ class UnauthorizedError extends Error {
17
+ constructor(message) {
18
+ super(message !== null && message !== void 0 ? message : "Unauthorized");
19
+ }
20
+ }
21
+ exports.UnauthorizedError = UnauthorizedError;
22
+ /**
23
+ * Orchestrates the full auth flow with a server.
24
+ *
25
+ * This can be used as a single entry point for all authorization functionality,
26
+ * instead of linking together the other lower-level functions in this module.
27
+ */
28
+ async function auth(provider, { serverUrl, authorizationCode }) {
29
+ const metadata = await discoverOAuthMetadata(serverUrl);
30
+ // Handle client registration if needed
31
+ let clientInformation = await Promise.resolve(provider.clientInformation());
32
+ if (!clientInformation) {
33
+ if (authorizationCode !== undefined) {
34
+ throw new Error("Existing OAuth client information is required when exchanging an authorization code");
35
+ }
36
+ if (!provider.saveClientInformation) {
37
+ throw new Error("OAuth client information must be saveable for dynamic registration");
38
+ }
39
+ const fullInformation = await registerClient(serverUrl, {
40
+ metadata,
41
+ clientMetadata: provider.clientMetadata,
42
+ });
43
+ await provider.saveClientInformation(fullInformation);
44
+ clientInformation = fullInformation;
45
+ }
46
+ // Exchange authorization code for tokens
47
+ if (authorizationCode !== undefined) {
48
+ const codeVerifier = await provider.codeVerifier();
49
+ const tokens = await exchangeAuthorization(serverUrl, {
50
+ metadata,
51
+ clientInformation,
52
+ authorizationCode,
53
+ codeVerifier,
54
+ });
55
+ await provider.saveTokens(tokens);
56
+ return "AUTHORIZED";
57
+ }
58
+ const tokens = await provider.tokens();
59
+ // Handle token refresh or new authorization
60
+ if (tokens === null || tokens === void 0 ? void 0 : tokens.refresh_token) {
61
+ try {
62
+ // Attempt to refresh the token
63
+ const newTokens = await refreshAuthorization(serverUrl, {
64
+ metadata,
65
+ clientInformation,
66
+ refreshToken: tokens.refresh_token,
67
+ });
68
+ await provider.saveTokens(newTokens);
69
+ return "AUTHORIZED";
70
+ }
71
+ catch (error) {
72
+ console.error("Could not refresh OAuth tokens:", error);
73
+ }
74
+ }
75
+ // Start new authorization flow
76
+ const { authorizationUrl, codeVerifier } = await startAuthorization(serverUrl, {
77
+ metadata,
78
+ clientInformation,
79
+ redirectUrl: provider.redirectUrl
80
+ });
81
+ await provider.saveCodeVerifier(codeVerifier);
82
+ await provider.redirectToAuthorization(authorizationUrl);
83
+ return "REDIRECT";
84
+ }
85
+ /**
86
+ * Looks up RFC 8414 OAuth 2.0 Authorization Server Metadata.
87
+ *
88
+ * If the server returns a 404 for the well-known endpoint, this function will
89
+ * return `undefined`. Any other errors will be thrown as exceptions.
90
+ */
91
+ async function discoverOAuthMetadata(serverUrl, opts) {
92
+ var _a;
93
+ const url = new URL("/.well-known/oauth-authorization-server", serverUrl);
94
+ const response = await fetch(url, {
95
+ headers: {
96
+ "MCP-Protocol-Version": (_a = opts === null || opts === void 0 ? void 0 : opts.protocolVersion) !== null && _a !== void 0 ? _a : types_js_1.LATEST_PROTOCOL_VERSION
97
+ }
98
+ });
99
+ if (response.status === 404) {
100
+ return undefined;
101
+ }
102
+ if (!response.ok) {
103
+ throw new Error(`HTTP ${response.status} trying to load well-known OAuth metadata`);
104
+ }
105
+ return auth_js_1.OAuthMetadataSchema.parse(await response.json());
106
+ }
107
+ /**
108
+ * Begins the authorization flow with the given server, by generating a PKCE challenge and constructing the authorization URL.
109
+ */
110
+ async function startAuthorization(serverUrl, { metadata, clientInformation, redirectUrl, }) {
111
+ const responseType = "code";
112
+ const codeChallengeMethod = "S256";
113
+ let authorizationUrl;
114
+ if (metadata) {
115
+ authorizationUrl = new URL(metadata.authorization_endpoint);
116
+ if (!metadata.response_types_supported.includes(responseType)) {
117
+ throw new Error(`Incompatible auth server: does not support response type ${responseType}`);
118
+ }
119
+ if (!metadata.code_challenge_methods_supported ||
120
+ !metadata.code_challenge_methods_supported.includes(codeChallengeMethod)) {
121
+ throw new Error(`Incompatible auth server: does not support code challenge method ${codeChallengeMethod}`);
122
+ }
123
+ }
124
+ else {
125
+ authorizationUrl = new URL("/authorize", serverUrl);
126
+ }
127
+ // Generate PKCE challenge
128
+ const challenge = await (0, pkce_challenge_1.default)();
129
+ const codeVerifier = challenge.code_verifier;
130
+ const codeChallenge = challenge.code_challenge;
131
+ authorizationUrl.searchParams.set("response_type", responseType);
132
+ authorizationUrl.searchParams.set("client_id", clientInformation.client_id);
133
+ authorizationUrl.searchParams.set("code_challenge", codeChallenge);
134
+ authorizationUrl.searchParams.set("code_challenge_method", codeChallengeMethod);
135
+ authorizationUrl.searchParams.set("redirect_uri", String(redirectUrl));
136
+ return { authorizationUrl, codeVerifier };
137
+ }
138
+ /**
139
+ * Exchanges an authorization code for an access token with the given server.
140
+ */
141
+ async function exchangeAuthorization(serverUrl, { metadata, clientInformation, authorizationCode, codeVerifier, }) {
142
+ const grantType = "authorization_code";
143
+ let tokenUrl;
144
+ if (metadata) {
145
+ tokenUrl = new URL(metadata.token_endpoint);
146
+ if (metadata.grant_types_supported &&
147
+ !metadata.grant_types_supported.includes(grantType)) {
148
+ throw new Error(`Incompatible auth server: does not support grant type ${grantType}`);
149
+ }
150
+ }
151
+ else {
152
+ tokenUrl = new URL("/token", serverUrl);
153
+ }
154
+ // Exchange code for tokens
155
+ const params = new URLSearchParams({
156
+ grant_type: grantType,
157
+ client_id: clientInformation.client_id,
158
+ code: authorizationCode,
159
+ code_verifier: codeVerifier,
160
+ });
161
+ if (clientInformation.client_secret) {
162
+ params.set("client_secret", clientInformation.client_secret);
163
+ }
164
+ const response = await fetch(tokenUrl, {
165
+ method: "POST",
166
+ headers: {
167
+ "Content-Type": "application/x-www-form-urlencoded",
168
+ },
169
+ body: params,
170
+ });
171
+ if (!response.ok) {
172
+ throw new Error(`Token exchange failed: HTTP ${response.status}`);
173
+ }
174
+ return auth_js_1.OAuthTokensSchema.parse(await response.json());
175
+ }
176
+ /**
177
+ * Exchange a refresh token for an updated access token.
178
+ */
179
+ async function refreshAuthorization(serverUrl, { metadata, clientInformation, refreshToken, }) {
180
+ const grantType = "refresh_token";
181
+ let tokenUrl;
182
+ if (metadata) {
183
+ tokenUrl = new URL(metadata.token_endpoint);
184
+ if (metadata.grant_types_supported &&
185
+ !metadata.grant_types_supported.includes(grantType)) {
186
+ throw new Error(`Incompatible auth server: does not support grant type ${grantType}`);
187
+ }
188
+ }
189
+ else {
190
+ tokenUrl = new URL("/token", serverUrl);
191
+ }
192
+ // Exchange refresh token
193
+ const params = new URLSearchParams({
194
+ grant_type: grantType,
195
+ client_id: clientInformation.client_id,
196
+ refresh_token: refreshToken,
197
+ });
198
+ if (clientInformation.client_secret) {
199
+ params.set("client_secret", clientInformation.client_secret);
200
+ }
201
+ const response = await fetch(tokenUrl, {
202
+ method: "POST",
203
+ headers: {
204
+ "Content-Type": "application/x-www-form-urlencoded",
205
+ },
206
+ body: params,
207
+ });
208
+ if (!response.ok) {
209
+ throw new Error(`Token refresh failed: HTTP ${response.status}`);
210
+ }
211
+ return auth_js_1.OAuthTokensSchema.parse(await response.json());
212
+ }
213
+ /**
214
+ * Performs OAuth 2.0 Dynamic Client Registration according to RFC 7591.
215
+ */
216
+ async function registerClient(serverUrl, { metadata, clientMetadata, }) {
217
+ let registrationUrl;
218
+ if (metadata) {
219
+ if (!metadata.registration_endpoint) {
220
+ throw new Error("Incompatible auth server: does not support dynamic client registration");
221
+ }
222
+ registrationUrl = new URL(metadata.registration_endpoint);
223
+ }
224
+ else {
225
+ registrationUrl = new URL("/register", serverUrl);
226
+ }
227
+ const response = await fetch(registrationUrl, {
228
+ method: "POST",
229
+ headers: {
230
+ "Content-Type": "application/json",
231
+ },
232
+ body: JSON.stringify(clientMetadata),
233
+ });
234
+ if (!response.ok) {
235
+ throw new Error(`Dynamic client registration failed: HTTP ${response.status}`);
236
+ }
237
+ return auth_js_1.OAuthClientInformationFullSchema.parse(await response.json());
238
+ }
239
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/client/auth.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,45 @@
1
1
  import { type ErrorEvent, type EventSourceInit } from "eventsource";
2
2
  import { Transport } from "../shared/transport.js";
3
3
  import { JSONRPCMessage } from "../types.js";
4
+ import { OAuthClientProvider } from "./auth.js";
4
5
  export declare class SseError extends Error {
5
6
  readonly code: number | undefined;
6
7
  readonly event: ErrorEvent;
7
8
  constructor(code: number | undefined, message: string | undefined, event: ErrorEvent);
8
9
  }
10
+ /**
11
+ * Configuration options for the `SSEClientTransport`.
12
+ */
13
+ export type SSEClientTransportOptions = {
14
+ /**
15
+ * An OAuth client provider to use for authentication.
16
+ *
17
+ * When an `authProvider` is specified and the SSE connection is started:
18
+ * 1. The connection is attempted with any existing access token from the `authProvider`.
19
+ * 2. If the access token has expired, the `authProvider` is used to refresh the token.
20
+ * 3. If token refresh fails or no access token exists, and auth is required, `OAuthClientProvider.redirectToAuthorization` is called, and an `UnauthorizedError` will be thrown from `connect`/`start`.
21
+ *
22
+ * After the user has finished authorizing via their user agent, and is redirected back to the MCP client application, call `SSEClientTransport.finishAuth` with the authorization code before retrying the connection.
23
+ *
24
+ * If an `authProvider` is not provided, and auth is required, an `UnauthorizedError` will be thrown.
25
+ *
26
+ * `UnauthorizedError` might also be thrown when sending any message over the SSE transport, indicating that the session has expired, and needs to be re-authed and reconnected.
27
+ */
28
+ authProvider?: OAuthClientProvider;
29
+ /**
30
+ * Customizes the initial SSE request to the server (the request that begins the stream).
31
+ *
32
+ * NOTE: Setting this property will prevent an `Authorization` header from
33
+ * being automatically attached to the SSE request, if an `authProvider` is
34
+ * also given. This can be worked around by setting the `Authorization` header
35
+ * manually.
36
+ */
37
+ eventSourceInit?: EventSourceInit;
38
+ /**
39
+ * Customizes recurring POST requests to the server.
40
+ */
41
+ requestInit?: RequestInit;
42
+ };
9
43
  /**
10
44
  * Client transport for SSE: this will connect to a server using Server-Sent Events for receiving
11
45
  * messages and make separate POST requests for sending messages.
@@ -17,14 +51,19 @@ export declare class SSEClientTransport implements Transport {
17
51
  private _url;
18
52
  private _eventSourceInit?;
19
53
  private _requestInit?;
54
+ private _authProvider?;
20
55
  onclose?: () => void;
21
56
  onerror?: (error: Error) => void;
22
57
  onmessage?: (message: JSONRPCMessage) => void;
23
- constructor(url: URL, opts?: {
24
- eventSourceInit?: EventSourceInit;
25
- requestInit?: RequestInit;
26
- });
58
+ constructor(url: URL, opts?: SSEClientTransportOptions);
59
+ private _authThenStart;
60
+ private _commonHeaders;
61
+ private _startOrAuth;
27
62
  start(): Promise<void>;
63
+ /**
64
+ * Call this method after the user has finished authorizing via their user agent and is redirected back to the MCP client application. This will exchange the authorization code for an access token, enabling the next connection attempt to successfully auth.
65
+ */
66
+ finishAuth(authorizationCode: string): Promise<void>;
28
67
  close(): Promise<void>;
29
68
  send(message: JSONRPCMessage): Promise<void>;
30
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/client/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AAEnE,qBAAa,QAAS,SAAQ,KAAK;aAEf,IAAI,EAAE,MAAM,GAAG,SAAS;aAExB,KAAK,EAAE,UAAU;gBAFjB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxC,OAAO,EAAE,MAAM,GAAG,SAAS,EACX,KAAK,EAAE,UAAU;CAIpC;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,SAAS;IAClD,OAAO,CAAC,YAAY,CAAC,CAAc;IACnC,OAAO,CAAC,SAAS,CAAC,CAAM;IACxB,OAAO,CAAC,gBAAgB,CAAC,CAAkB;IAC3C,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,gBAAgB,CAAC,CAAkB;IAC3C,OAAO,CAAC,YAAY,CAAC,CAAc;IAEnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAG5C,GAAG,EAAE,GAAG,EACR,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,eAAe,CAAC;QAAC,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE;IAOzE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4DhB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CA6BnD"}
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/client/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAoB,mBAAmB,EAAqB,MAAM,WAAW,CAAC;AAErF,qBAAa,QAAS,SAAQ,KAAK;aAEf,IAAI,EAAE,MAAM,GAAG,SAAS;aAExB,KAAK,EAAE,UAAU;gBAFjB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxC,OAAO,EAAE,MAAM,GAAG,SAAS,EACX,KAAK,EAAE,UAAU;CAIpC;AAED;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAEnC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,SAAS;IAClD,OAAO,CAAC,YAAY,CAAC,CAAc;IACnC,OAAO,CAAC,SAAS,CAAC,CAAM;IACxB,OAAO,CAAC,gBAAgB,CAAC,CAAkB;IAC3C,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,gBAAgB,CAAC,CAAkB;IAC3C,OAAO,CAAC,YAAY,CAAC,CAAc;IACnC,OAAO,CAAC,aAAa,CAAC,CAAsB;IAE5C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAG5C,GAAG,EAAE,GAAG,EACR,IAAI,CAAC,EAAE,yBAAyB;YAQpB,cAAc;YAoBd,cAAc;IAY5B,OAAO,CAAC,YAAY;IAmEd,KAAK;IAUX;;OAEG;IACG,UAAU,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAuCnD"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SSEClientTransport = exports.SseError = void 0;
4
4
  const eventsource_1 = require("eventsource");
5
5
  const types_js_1 = require("../types.js");
6
+ const auth_js_1 = require("./auth.js");
6
7
  class SseError extends Error {
7
8
  constructor(code, message, event) {
8
9
  super(`SSE error: ${message}`);
@@ -20,16 +21,55 @@ class SSEClientTransport {
20
21
  this._url = url;
21
22
  this._eventSourceInit = opts === null || opts === void 0 ? void 0 : opts.eventSourceInit;
22
23
  this._requestInit = opts === null || opts === void 0 ? void 0 : opts.requestInit;
24
+ this._authProvider = opts === null || opts === void 0 ? void 0 : opts.authProvider;
23
25
  }
24
- start() {
25
- if (this._eventSource) {
26
- throw new Error("SSEClientTransport already started! If using Client class, note that connect() calls start() automatically.");
26
+ async _authThenStart() {
27
+ var _a;
28
+ if (!this._authProvider) {
29
+ throw new auth_js_1.UnauthorizedError("No auth provider");
30
+ }
31
+ let result;
32
+ try {
33
+ result = await (0, auth_js_1.auth)(this._authProvider, { serverUrl: this._url });
34
+ }
35
+ catch (error) {
36
+ (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
37
+ throw error;
27
38
  }
39
+ if (result !== "AUTHORIZED") {
40
+ throw new auth_js_1.UnauthorizedError();
41
+ }
42
+ return await this._startOrAuth();
43
+ }
44
+ async _commonHeaders() {
45
+ const headers = {};
46
+ if (this._authProvider) {
47
+ const tokens = await this._authProvider.tokens();
48
+ if (tokens) {
49
+ headers["Authorization"] = `Bearer ${tokens.access_token}`;
50
+ }
51
+ }
52
+ return headers;
53
+ }
54
+ _startOrAuth() {
28
55
  return new Promise((resolve, reject) => {
29
- this._eventSource = new eventsource_1.EventSource(this._url.href, this._eventSourceInit);
56
+ var _a;
57
+ this._eventSource = new eventsource_1.EventSource(this._url.href, (_a = this._eventSourceInit) !== null && _a !== void 0 ? _a : {
58
+ fetch: (url, init) => this._commonHeaders().then((headers) => fetch(url, {
59
+ ...init,
60
+ headers: {
61
+ ...headers,
62
+ Accept: "text/event-stream"
63
+ }
64
+ })),
65
+ });
30
66
  this._abortController = new AbortController();
31
67
  this._eventSource.onerror = (event) => {
32
68
  var _a;
69
+ if (event.code === 401 && this._authProvider) {
70
+ this._authThenStart().then(resolve, reject);
71
+ return;
72
+ }
33
73
  const error = new SseError(event.code, event.message, event);
34
74
  reject(error);
35
75
  (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
@@ -69,6 +109,24 @@ class SSEClientTransport {
69
109
  };
70
110
  });
71
111
  }
112
+ async start() {
113
+ if (this._eventSource) {
114
+ throw new Error("SSEClientTransport already started! If using Client class, note that connect() calls start() automatically.");
115
+ }
116
+ return await this._startOrAuth();
117
+ }
118
+ /**
119
+ * Call this method after the user has finished authorizing via their user agent and is redirected back to the MCP client application. This will exchange the authorization code for an access token, enabling the next connection attempt to successfully auth.
120
+ */
121
+ async finishAuth(authorizationCode) {
122
+ if (!this._authProvider) {
123
+ throw new auth_js_1.UnauthorizedError("No auth provider");
124
+ }
125
+ const result = await (0, auth_js_1.auth)(this._authProvider, { serverUrl: this._url, authorizationCode });
126
+ if (result !== "AUTHORIZED") {
127
+ throw new auth_js_1.UnauthorizedError("Failed to authorize");
128
+ }
129
+ }
72
130
  async close() {
73
131
  var _a, _b, _c;
74
132
  (_a = this._abortController) === null || _a === void 0 ? void 0 : _a.abort();
@@ -81,7 +139,8 @@ class SSEClientTransport {
81
139
  throw new Error("Not connected");
82
140
  }
83
141
  try {
84
- const headers = new Headers((_a = this._requestInit) === null || _a === void 0 ? void 0 : _a.headers);
142
+ const commonHeaders = await this._commonHeaders();
143
+ const headers = new Headers({ ...commonHeaders, ...(_a = this._requestInit) === null || _a === void 0 ? void 0 : _a.headers });
85
144
  headers.set("content-type", "application/json");
86
145
  const init = {
87
146
  ...this._requestInit,
@@ -92,6 +151,14 @@ class SSEClientTransport {
92
151
  };
93
152
  const response = await fetch(this._endpoint, init);
94
153
  if (!response.ok) {
154
+ if (response.status === 401 && this._authProvider) {
155
+ const result = await (0, auth_js_1.auth)(this._authProvider, { serverUrl: this._url });
156
+ if (result !== "AUTHORIZED") {
157
+ throw new auth_js_1.UnauthorizedError();
158
+ }
159
+ // Purposely _not_ awaited, so we don't call onerror twice
160
+ return this.send(message);
161
+ }
95
162
  const text = await response.text().catch(() => null);
96
163
  throw new Error(`Error POSTing to endpoint (HTTP ${response.status}): ${text}`);
97
164
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/client/sse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/client/sse.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { IOType } from "node:child_process";
2
- import { JSONRPCMessage } from "../types.js";
3
- import { Transport } from "../shared/transport.js";
4
2
  import { Stream } from "node:stream";
3
+ import { Transport } from "../shared/transport.js";
4
+ import { JSONRPCMessage } from "../types.js";
5
5
  export type StdioServerParameters = {
6
6
  /**
7
7
  * The executable to run to start the server.
@@ -23,6 +23,12 @@ export type StdioServerParameters = {
23
23
  * The default is "inherit", meaning messages to stderr will be printed to the parent process's stderr.
24
24
  */
25
25
  stderr?: IOType | Stream | number;
26
+ /**
27
+ * The working directory to use when spawning the process.
28
+ *
29
+ * If not specified, the current working directory will be inherited.
30
+ */
31
+ cwd?: string;
26
32
  };
27
33
  /**
28
34
  * Environment variables to inherit by default, if an environment is not explicitly given.
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../src/client/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAS,MAAM,oBAAoB,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CACnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,UAgBmB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB9D;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,SAAS;IACpD,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,aAAa,CAAwB;IAE7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAElC,MAAM,EAAE,qBAAqB;IAIzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD5B;;;;OAIG;IACH,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAED,OAAO,CAAC,iBAAiB;IAenB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAc7C"}
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../src/client/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAS,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAElC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,UAgBmB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB9D;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,SAAS;IACpD,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,aAAa,CAAwB;IAE7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAElC,MAAM,EAAE,qBAAqB;IAIzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwD5B;;;;OAIG;IACH,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAED,OAAO,CAAC,iBAAiB;IAenB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAc7C"}