fastmcp 4.19.0 → 4.19.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.
package/dist/FastMCP.cjs CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
 
13
13
 
14
- var _chunkSYZRGVQXcjs = require('./chunk-SYZRGVQX.cjs');
14
+ var _chunkKGXPEC7Jcjs = require('./chunk-KGXPEC7J.cjs');
15
15
 
16
16
 
17
17
 
@@ -24,7 +24,7 @@ var _chunkSYZRGVQXcjs = require('./chunk-SYZRGVQX.cjs');
24
24
 
25
25
 
26
26
 
27
- var _chunkE3HXGE2Ocjs = require('./chunk-E3HXGE2O.cjs');
27
+ var _chunkYO76IUZ6cjs = require('./chunk-YO76IUZ6.cjs');
28
28
 
29
29
 
30
30
 
@@ -49,5 +49,5 @@ var _chunkE3HXGE2Ocjs = require('./chunk-E3HXGE2O.cjs');
49
49
 
50
50
 
51
51
 
52
- exports.AuthProvider = _chunkE3HXGE2Ocjs.AuthProvider; exports.AzureProvider = _chunkE3HXGE2Ocjs.AzureProvider; exports.DiscoveryDocumentCache = _chunkSYZRGVQXcjs.DiscoveryDocumentCache; exports.FastMCP = _chunkSYZRGVQXcjs.FastMCP; exports.FastMCPError = _chunkSYZRGVQXcjs.FastMCPError; exports.FastMCPSession = _chunkSYZRGVQXcjs.FastMCPSession; exports.GitHubProvider = _chunkE3HXGE2Ocjs.GitHubProvider; exports.GoogleProvider = _chunkE3HXGE2Ocjs.GoogleProvider; exports.MEDIA_FETCH_TIMEOUT_MS = _chunkSYZRGVQXcjs.MEDIA_FETCH_TIMEOUT_MS; exports.OAuthProvider = _chunkE3HXGE2Ocjs.OAuthProvider; exports.ServerState = _chunkSYZRGVQXcjs.ServerState; exports.SessionError = _chunkSYZRGVQXcjs.SessionError; exports.UnexpectedStateError = _chunkSYZRGVQXcjs.UnexpectedStateError; exports.UserError = _chunkSYZRGVQXcjs.UserError; exports.audioContent = _chunkSYZRGVQXcjs.audioContent; exports.getAuthSession = _chunkE3HXGE2Ocjs.getAuthSession; exports.imageContent = _chunkSYZRGVQXcjs.imageContent; exports.jsonSchemaAdapter = _chunkSYZRGVQXcjs.jsonSchemaAdapter; exports.requireAll = _chunkE3HXGE2Ocjs.requireAll; exports.requireAny = _chunkE3HXGE2Ocjs.requireAny; exports.requireAuth = _chunkE3HXGE2Ocjs.requireAuth; exports.requireRole = _chunkE3HXGE2Ocjs.requireRole; exports.requireScopes = _chunkE3HXGE2Ocjs.requireScopes;
52
+ exports.AuthProvider = _chunkYO76IUZ6cjs.AuthProvider; exports.AzureProvider = _chunkYO76IUZ6cjs.AzureProvider; exports.DiscoveryDocumentCache = _chunkKGXPEC7Jcjs.DiscoveryDocumentCache; exports.FastMCP = _chunkKGXPEC7Jcjs.FastMCP; exports.FastMCPError = _chunkKGXPEC7Jcjs.FastMCPError; exports.FastMCPSession = _chunkKGXPEC7Jcjs.FastMCPSession; exports.GitHubProvider = _chunkYO76IUZ6cjs.GitHubProvider; exports.GoogleProvider = _chunkYO76IUZ6cjs.GoogleProvider; exports.MEDIA_FETCH_TIMEOUT_MS = _chunkKGXPEC7Jcjs.MEDIA_FETCH_TIMEOUT_MS; exports.OAuthProvider = _chunkYO76IUZ6cjs.OAuthProvider; exports.ServerState = _chunkKGXPEC7Jcjs.ServerState; exports.SessionError = _chunkKGXPEC7Jcjs.SessionError; exports.UnexpectedStateError = _chunkKGXPEC7Jcjs.UnexpectedStateError; exports.UserError = _chunkKGXPEC7Jcjs.UserError; exports.audioContent = _chunkKGXPEC7Jcjs.audioContent; exports.getAuthSession = _chunkYO76IUZ6cjs.getAuthSession; exports.imageContent = _chunkKGXPEC7Jcjs.imageContent; exports.jsonSchemaAdapter = _chunkKGXPEC7Jcjs.jsonSchemaAdapter; exports.requireAll = _chunkYO76IUZ6cjs.requireAll; exports.requireAny = _chunkYO76IUZ6cjs.requireAny; exports.requireAuth = _chunkYO76IUZ6cjs.requireAuth; exports.requireRole = _chunkYO76IUZ6cjs.requireRole; exports.requireScopes = _chunkYO76IUZ6cjs.requireScopes;
53
53
  //# sourceMappingURL=FastMCP.cjs.map
package/dist/FastMCP.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  audioContent,
12
12
  imageContent,
13
13
  jsonSchemaAdapter
14
- } from "./chunk-UODI5E6U.js";
14
+ } from "./chunk-XJWV6G5Q.js";
15
15
  import {
16
16
  AuthProvider,
17
17
  AzureProvider,
@@ -24,7 +24,7 @@ import {
24
24
  requireAuth,
25
25
  requireRole,
26
26
  requireScopes
27
- } from "./chunk-KWRV7CHJ.js";
27
+ } from "./chunk-LRXZYGFR.js";
28
28
  export {
29
29
  AuthProvider,
30
30
  AzureProvider,
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- var _chunkE3HXGE2Ocjs = require('../chunk-E3HXGE2O.cjs');
27
+ var _chunkYO76IUZ6cjs = require('../chunk-YO76IUZ6.cjs');
28
28
 
29
29
 
30
30
 
@@ -51,5 +51,5 @@ var _chunkE3HXGE2Ocjs = require('../chunk-E3HXGE2O.cjs');
51
51
 
52
52
 
53
53
 
54
- exports.AuthProvider = _chunkE3HXGE2Ocjs.AuthProvider; exports.AzureProvider = _chunkE3HXGE2Ocjs.AzureProvider; exports.ConsentManager = _chunkE3HXGE2Ocjs.ConsentManager; exports.DEFAULT_ACCESS_TOKEN_TTL = _chunkE3HXGE2Ocjs.DEFAULT_ACCESS_TOKEN_TTL; exports.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH = _chunkE3HXGE2Ocjs.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH; exports.DEFAULT_AUTHORIZATION_CODE_TTL = _chunkE3HXGE2Ocjs.DEFAULT_AUTHORIZATION_CODE_TTL; exports.DEFAULT_REFRESH_TOKEN_TTL = _chunkE3HXGE2Ocjs.DEFAULT_REFRESH_TOKEN_TTL; exports.DEFAULT_TRANSACTION_TTL = _chunkE3HXGE2Ocjs.DEFAULT_TRANSACTION_TTL; exports.DiskStore = _chunkE3HXGE2Ocjs.DiskStore; exports.EncryptedTokenStorage = _chunkE3HXGE2Ocjs.EncryptedTokenStorage; exports.GitHubProvider = _chunkE3HXGE2Ocjs.GitHubProvider; exports.GoogleProvider = _chunkE3HXGE2Ocjs.GoogleProvider; exports.JWKSVerifier = _chunkE3HXGE2Ocjs.JWKSVerifier; exports.JWTIssuer = _chunkE3HXGE2Ocjs.JWTIssuer; exports.MemoryTokenStorage = _chunkE3HXGE2Ocjs.MemoryTokenStorage; exports.OAuthProvider = _chunkE3HXGE2Ocjs.OAuthProvider; exports.OAuthProxy = _chunkE3HXGE2Ocjs.OAuthProxy; exports.OAuthProxyError = _chunkE3HXGE2Ocjs.OAuthProxyError; exports.PKCEUtils = _chunkE3HXGE2Ocjs.PKCEUtils; exports.getAuthSession = _chunkE3HXGE2Ocjs.getAuthSession; exports.requireAll = _chunkE3HXGE2Ocjs.requireAll; exports.requireAny = _chunkE3HXGE2Ocjs.requireAny; exports.requireAuth = _chunkE3HXGE2Ocjs.requireAuth; exports.requireRole = _chunkE3HXGE2Ocjs.requireRole; exports.requireScopes = _chunkE3HXGE2Ocjs.requireScopes;
54
+ exports.AuthProvider = _chunkYO76IUZ6cjs.AuthProvider; exports.AzureProvider = _chunkYO76IUZ6cjs.AzureProvider; exports.ConsentManager = _chunkYO76IUZ6cjs.ConsentManager; exports.DEFAULT_ACCESS_TOKEN_TTL = _chunkYO76IUZ6cjs.DEFAULT_ACCESS_TOKEN_TTL; exports.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH = _chunkYO76IUZ6cjs.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH; exports.DEFAULT_AUTHORIZATION_CODE_TTL = _chunkYO76IUZ6cjs.DEFAULT_AUTHORIZATION_CODE_TTL; exports.DEFAULT_REFRESH_TOKEN_TTL = _chunkYO76IUZ6cjs.DEFAULT_REFRESH_TOKEN_TTL; exports.DEFAULT_TRANSACTION_TTL = _chunkYO76IUZ6cjs.DEFAULT_TRANSACTION_TTL; exports.DiskStore = _chunkYO76IUZ6cjs.DiskStore; exports.EncryptedTokenStorage = _chunkYO76IUZ6cjs.EncryptedTokenStorage; exports.GitHubProvider = _chunkYO76IUZ6cjs.GitHubProvider; exports.GoogleProvider = _chunkYO76IUZ6cjs.GoogleProvider; exports.JWKSVerifier = _chunkYO76IUZ6cjs.JWKSVerifier; exports.JWTIssuer = _chunkYO76IUZ6cjs.JWTIssuer; exports.MemoryTokenStorage = _chunkYO76IUZ6cjs.MemoryTokenStorage; exports.OAuthProvider = _chunkYO76IUZ6cjs.OAuthProvider; exports.OAuthProxy = _chunkYO76IUZ6cjs.OAuthProxy; exports.OAuthProxyError = _chunkYO76IUZ6cjs.OAuthProxyError; exports.PKCEUtils = _chunkYO76IUZ6cjs.PKCEUtils; exports.getAuthSession = _chunkYO76IUZ6cjs.getAuthSession; exports.requireAll = _chunkYO76IUZ6cjs.requireAll; exports.requireAny = _chunkYO76IUZ6cjs.requireAny; exports.requireAuth = _chunkYO76IUZ6cjs.requireAuth; exports.requireRole = _chunkYO76IUZ6cjs.requireRole; exports.requireScopes = _chunkYO76IUZ6cjs.requireScopes;
55
55
  //# sourceMappingURL=index.cjs.map
@@ -24,7 +24,7 @@ import {
24
24
  requireAuth,
25
25
  requireRole,
26
26
  requireScopes
27
- } from "../chunk-KWRV7CHJ.js";
27
+ } from "../chunk-LRXZYGFR.js";
28
28
  export {
29
29
  AuthProvider,
30
30
  AzureProvider,
@@ -1,4 +1,8 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/FastMCP.ts
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+ var _chunkYO76IUZ6cjs = require('./chunk-YO76IUZ6.cjs');
4
+
5
+ // src/FastMCP.ts
2
6
  var _indexjs = require('@modelcontextprotocol/sdk/server/index.js');
3
7
  var _stdiojs = require('@modelcontextprotocol/sdk/server/stdio.js');
4
8
 
@@ -27,17 +31,6 @@ var _uritemplates = require('uri-templates'); var _uritemplates2 = _interopRequi
27
31
  var _xsschema = require('xsschema');
28
32
  var _zod = require('zod');
29
33
 
30
- // src/cancelResponseBody.ts
31
- var cancelResponseBody = async (response) => {
32
- if (!response.body) {
33
- return;
34
- }
35
- try {
36
- await response.body.cancel();
37
- } catch (e2) {
38
- }
39
- };
40
-
41
34
  // src/DiscoveryDocumentCache.ts
42
35
  var DiscoveryDocumentCache = class {
43
36
  get size() {
@@ -138,7 +131,7 @@ var DiscoveryDocumentCache = class {
138
131
  throw error;
139
132
  }
140
133
  if (!res.ok) {
141
- await cancelResponseBody(res);
134
+ await _chunkYO76IUZ6cjs.cancelResponseBody.call(void 0, res);
142
135
  throw new Error(
143
136
  `Failed to fetch discovery document from ${url}: ${res.status} ${res.statusText}`
144
137
  );
@@ -187,7 +180,7 @@ async function compileSchema(schema) {
187
180
  let ajvModule;
188
181
  try {
189
182
  ajvModule = await Promise.resolve().then(() => _interopRequireWildcard(require("ajv")));
190
- } catch (e3) {
183
+ } catch (e2) {
191
184
  throw new Error(
192
185
  'The "ajv" package is required to validate JSON Schema tool parameters. Install it with: npm install ajv'
193
186
  );
@@ -200,7 +193,7 @@ async function compileSchema(schema) {
200
193
  unwrapDefault(formatsModule)
201
194
  );
202
195
  addFormats(ajv);
203
- } catch (e4) {
196
+ } catch (e3) {
204
197
  }
205
198
  return ajv.compile(schema);
206
199
  }
@@ -234,7 +227,7 @@ var imageContent = async (input) => {
234
227
  signal: AbortSignal.timeout(timeoutMs)
235
228
  });
236
229
  if (!response.ok) {
237
- await cancelResponseBody(response);
230
+ await _chunkYO76IUZ6cjs.cancelResponseBody.call(void 0, response);
238
231
  throw new Error(
239
232
  `Server responded with status: ${response.status} - ${response.statusText}`
240
233
  );
@@ -296,7 +289,7 @@ var audioContent = async (input) => {
296
289
  signal: AbortSignal.timeout(timeoutMs)
297
290
  });
298
291
  if (!response.ok) {
299
- await cancelResponseBody(response);
292
+ await _chunkYO76IUZ6cjs.cancelResponseBody.call(void 0, response);
300
293
  throw new Error(
301
294
  `Server responded with status: ${response.status} - ${response.statusText}`
302
295
  );
@@ -708,7 +701,7 @@ ${e instanceof Error ? e.stack : JSON.stringify(e)}`
708
701
  this.#pingInFlight = true;
709
702
  try {
710
703
  await this.#server.ping();
711
- } catch (e5) {
704
+ } catch (e4) {
712
705
  const logLevel = pingConfig.logLevel;
713
706
  if (logLevel === "debug") {
714
707
  this.#logger.debug("[FastMCP debug] server ping failed");
@@ -1622,7 +1615,7 @@ function parseBasicAuthHeader(authHeader) {
1622
1615
  const credMatch = credentials.match(/^([^:]+):(.*)$/);
1623
1616
  if (!credMatch) return null;
1624
1617
  return { clientId: credMatch[1], clientSecret: credMatch[2] };
1625
- } catch (e6) {
1618
+ } catch (e5) {
1626
1619
  return null;
1627
1620
  }
1628
1621
  }
@@ -2089,15 +2082,14 @@ var FastMCP = class extends FastMCPEventEmitter {
2089
2082
  this.#logger.info(
2090
2083
  `[FastMCP info] Starting server in stateless mode on HTTP Stream at ${protocol}://${httpConfig.host}:${httpConfig.port}${streamEndpoint}`
2091
2084
  );
2085
+ const authenticate = this.#authenticate ? this.#memoizedAuthenticate() : void 0;
2092
2086
  this.#httpStreamServer = await _mcpproxy.startHTTPServer.call(void 0, {
2093
- ...this.#authenticate ? { authenticate: this.#authenticate } : {},
2087
+ ...authenticate ? { authenticate } : {},
2094
2088
  cors: httpConfig.cors,
2095
2089
  createServer: async (request) => {
2096
2090
  let auth;
2097
- if (this.#authenticate) {
2098
- auth = this.#requireAuthenticated(
2099
- await this.#authenticate(request)
2100
- );
2091
+ if (authenticate) {
2092
+ auth = this.#requireAuthenticated(await authenticate(request));
2101
2093
  }
2102
2094
  const sessionId = Array.isArray(request.headers["mcp-session-id"]) ? request.headers["mcp-session-id"][0] : request.headers["mcp-session-id"];
2103
2095
  return this.#createSession(auth, sessionId, true);
@@ -2138,15 +2130,14 @@ var FastMCP = class extends FastMCPEventEmitter {
2138
2130
  streamEndpoint
2139
2131
  });
2140
2132
  } else {
2133
+ const authenticate = this.#authenticate ? this.#memoizedAuthenticate() : void 0;
2141
2134
  this.#httpStreamServer = await _mcpproxy.startHTTPServer.call(void 0, {
2142
- ...this.#authenticate ? { authenticate: this.#authenticate } : {},
2135
+ ...authenticate ? { authenticate } : {},
2143
2136
  cors: httpConfig.cors,
2144
2137
  createServer: async (request) => {
2145
2138
  let auth;
2146
- if (this.#authenticate) {
2147
- auth = this.#requireAuthenticated(
2148
- await this.#authenticate(request)
2149
- );
2139
+ if (authenticate) {
2140
+ auth = this.#requireAuthenticated(await authenticate(request));
2150
2141
  }
2151
2142
  const sessionId = Array.isArray(request.headers["mcp-session-id"]) ? request.headers["mcp-session-id"][0] : request.headers["mcp-session-id"];
2152
2143
  return this.#createSession(auth, sessionId);
@@ -2699,6 +2690,40 @@ var FastMCP = class extends FastMCPEventEmitter {
2699
2690
  }
2700
2691
  }
2701
2692
  };
2693
+ /**
2694
+ * On `httpStream`, `authenticate` is handed to both mcp-proxy (which calls it
2695
+ * once per request to gate the 401) and this server's own `createServer`
2696
+ * callback (which calls it again to obtain the session auth). Both receive
2697
+ * the identical `IncomingMessage`, so a single request would otherwise be
2698
+ * authenticated twice — halving the effective budget of any non-idempotent
2699
+ * `authenticate` (see #352).
2700
+ *
2701
+ * This wraps `#authenticate` in a per-request memo keyed on the request
2702
+ * object, collapsing the two calls into one real invocation. The *promise* is
2703
+ * cached (not the resolved value) so a second call that arrives before the
2704
+ * first settles joins it rather than starting a competing attempt. Keys are
2705
+ * the request objects themselves, so each request is authenticated exactly
2706
+ * once, a distinct request is authenticated afresh, and entries are collected
2707
+ * with their requests — nothing leaks across requests. A rejected or nullish
2708
+ * result is cached as-is, so a failed authentication is never seen as a
2709
+ * success by the second caller.
2710
+ */
2711
+ #memoizedAuthenticate() {
2712
+ const authenticate = this.#authenticate;
2713
+ const cache = /* @__PURE__ */ new WeakMap();
2714
+ return (request) => {
2715
+ if (!request) {
2716
+ return authenticate(request);
2717
+ }
2718
+ const cached = cache.get(request);
2719
+ if (cached) {
2720
+ return cached;
2721
+ }
2722
+ const result = Promise.resolve(authenticate(request));
2723
+ cache.set(request, result);
2724
+ return result;
2725
+ };
2726
+ }
2702
2727
  /**
2703
2728
  * Converts Node.js IncomingMessage to Web Request for Hono
2704
2729
  */
@@ -2867,4 +2892,4 @@ var FastMCP = class extends FastMCPEventEmitter {
2867
2892
 
2868
2893
 
2869
2894
  exports.DiscoveryDocumentCache = DiscoveryDocumentCache; exports.jsonSchemaAdapter = jsonSchemaAdapter; exports.MEDIA_FETCH_TIMEOUT_MS = MEDIA_FETCH_TIMEOUT_MS; exports.imageContent = imageContent; exports.audioContent = audioContent; exports.FastMCPError = FastMCPError; exports.SessionError = SessionError; exports.UnexpectedStateError = UnexpectedStateError; exports.UserError = UserError; exports.ServerState = ServerState; exports.FastMCPSession = FastMCPSession; exports.FastMCP = FastMCP;
2870
- //# sourceMappingURL=chunk-SYZRGVQX.cjs.map
2895
+ //# sourceMappingURL=chunk-KGXPEC7J.cjs.map