fastmcp 4.12.6 → 4.12.8

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/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  A TypeScript framework for building [MCP](https://glama.ai/mcp) servers capable of handling client sessions.
4
4
 
5
- > [!NOTE]
5
+ > [!IMPORTANT]
6
6
  >
7
- > For a Python implementation, see [FastMCP](https://github.com/jlowin/fastmcp).
7
+ > FastMCP implements the legacy, handshake-based MCP revisions (`2025-11-25` and earlier). It does not support the current specification, [`2026-07-28`](https://modelcontextprotocol.io/specification/2026-07-28/), which made the protocol stateless — no `initialize` handshake and no `Mcp-Session-Id`. For a framework targeting the current spec, use [ViteMCP](https://github.com/vitemcp/server).
8
8
 
9
9
  ## Features
10
10
 
package/dist/FastMCP.cjs CHANGED
@@ -24,7 +24,7 @@ var _chunkU36NARZGcjs = require('./chunk-U36NARZG.cjs');
24
24
 
25
25
 
26
26
 
27
- var _chunkRQ6222DUcjs = require('./chunk-RQ6222DU.cjs');
27
+ var _chunkKMG3C24Zcjs = require('./chunk-KMG3C24Z.cjs');
28
28
 
29
29
 
30
30
 
@@ -49,5 +49,5 @@ var _chunkRQ6222DUcjs = require('./chunk-RQ6222DU.cjs');
49
49
 
50
50
 
51
51
 
52
- exports.AuthProvider = _chunkRQ6222DUcjs.AuthProvider; exports.AzureProvider = _chunkRQ6222DUcjs.AzureProvider; exports.DiscoveryDocumentCache = _chunkU36NARZGcjs.DiscoveryDocumentCache; exports.FastMCP = _chunkU36NARZGcjs.FastMCP; exports.FastMCPError = _chunkU36NARZGcjs.FastMCPError; exports.FastMCPSession = _chunkU36NARZGcjs.FastMCPSession; exports.GitHubProvider = _chunkRQ6222DUcjs.GitHubProvider; exports.GoogleProvider = _chunkRQ6222DUcjs.GoogleProvider; exports.MEDIA_FETCH_TIMEOUT_MS = _chunkU36NARZGcjs.MEDIA_FETCH_TIMEOUT_MS; exports.OAuthProvider = _chunkRQ6222DUcjs.OAuthProvider; exports.ServerState = _chunkU36NARZGcjs.ServerState; exports.SessionError = _chunkU36NARZGcjs.SessionError; exports.UnexpectedStateError = _chunkU36NARZGcjs.UnexpectedStateError; exports.UserError = _chunkU36NARZGcjs.UserError; exports.audioContent = _chunkU36NARZGcjs.audioContent; exports.getAuthSession = _chunkRQ6222DUcjs.getAuthSession; exports.imageContent = _chunkU36NARZGcjs.imageContent; exports.jsonSchemaAdapter = _chunkU36NARZGcjs.jsonSchemaAdapter; exports.requireAll = _chunkRQ6222DUcjs.requireAll; exports.requireAny = _chunkRQ6222DUcjs.requireAny; exports.requireAuth = _chunkRQ6222DUcjs.requireAuth; exports.requireRole = _chunkRQ6222DUcjs.requireRole; exports.requireScopes = _chunkRQ6222DUcjs.requireScopes;
52
+ exports.AuthProvider = _chunkKMG3C24Zcjs.AuthProvider; exports.AzureProvider = _chunkKMG3C24Zcjs.AzureProvider; exports.DiscoveryDocumentCache = _chunkU36NARZGcjs.DiscoveryDocumentCache; exports.FastMCP = _chunkU36NARZGcjs.FastMCP; exports.FastMCPError = _chunkU36NARZGcjs.FastMCPError; exports.FastMCPSession = _chunkU36NARZGcjs.FastMCPSession; exports.GitHubProvider = _chunkKMG3C24Zcjs.GitHubProvider; exports.GoogleProvider = _chunkKMG3C24Zcjs.GoogleProvider; exports.MEDIA_FETCH_TIMEOUT_MS = _chunkU36NARZGcjs.MEDIA_FETCH_TIMEOUT_MS; exports.OAuthProvider = _chunkKMG3C24Zcjs.OAuthProvider; exports.ServerState = _chunkU36NARZGcjs.ServerState; exports.SessionError = _chunkU36NARZGcjs.SessionError; exports.UnexpectedStateError = _chunkU36NARZGcjs.UnexpectedStateError; exports.UserError = _chunkU36NARZGcjs.UserError; exports.audioContent = _chunkU36NARZGcjs.audioContent; exports.getAuthSession = _chunkKMG3C24Zcjs.getAuthSession; exports.imageContent = _chunkU36NARZGcjs.imageContent; exports.jsonSchemaAdapter = _chunkU36NARZGcjs.jsonSchemaAdapter; exports.requireAll = _chunkKMG3C24Zcjs.requireAll; exports.requireAny = _chunkKMG3C24Zcjs.requireAny; exports.requireAuth = _chunkKMG3C24Zcjs.requireAuth; exports.requireRole = _chunkKMG3C24Zcjs.requireRole; exports.requireScopes = _chunkKMG3C24Zcjs.requireScopes;
53
53
  //# sourceMappingURL=FastMCP.cjs.map
@@ -12,8 +12,8 @@ import { CorsOptions } from 'mcp-proxy';
12
12
  export { CorsOptions } from 'mcp-proxy';
13
13
  import { StrictEventEmitter } from 'strict-event-emitter-types';
14
14
  import { z } from 'zod';
15
- import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-B_OJFNC0.cjs';
16
- export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-B_OJFNC0.cjs';
15
+ import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-zVRjvkf8.cjs';
16
+ export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-zVRjvkf8.cjs';
17
17
  import 'node:http';
18
18
 
19
19
  declare class DiscoveryDocumentCache {
package/dist/FastMCP.d.ts CHANGED
@@ -12,8 +12,8 @@ import { CorsOptions } from 'mcp-proxy';
12
12
  export { CorsOptions } from 'mcp-proxy';
13
13
  import { StrictEventEmitter } from 'strict-event-emitter-types';
14
14
  import { z } from 'zod';
15
- import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-B_OJFNC0.js';
16
- export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-B_OJFNC0.js';
15
+ import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-zVRjvkf8.js';
16
+ export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-zVRjvkf8.js';
17
17
  import 'node:http';
18
18
 
19
19
  declare class DiscoveryDocumentCache {
package/dist/FastMCP.js CHANGED
@@ -24,7 +24,7 @@ import {
24
24
  requireAuth,
25
25
  requireRole,
26
26
  requireScopes
27
- } from "./chunk-SZ4XCW5X.js";
27
+ } from "./chunk-Y7GSHCYB.js";
28
28
  export {
29
29
  AuthProvider,
30
30
  AzureProvider,
@@ -454,6 +454,14 @@ declare class OAuthProxy {
454
454
  private config;
455
455
  private consentManager;
456
456
  private jwtIssuer?;
457
+ /**
458
+ * The fallback storage this proxy created for itself, if any. It runs a
459
+ * cleanup timer that keeps the event loop alive, so `destroy()` has to stop
460
+ * it — and once the storage is wrapped for encryption it is reachable
461
+ * through nothing else. A caller-supplied storage is deliberately not
462
+ * recorded here: its lifetime belongs to the caller.
463
+ */
464
+ private ownedTokenStorage;
457
465
  /**
458
466
  * Keyed by proxy-issued client_id for authorize/token-exchange lookups and
459
467
  * for the defence-in-depth callback checks. A registration never changes
@@ -454,6 +454,14 @@ declare class OAuthProxy {
454
454
  private config;
455
455
  private consentManager;
456
456
  private jwtIssuer?;
457
+ /**
458
+ * The fallback storage this proxy created for itself, if any. It runs a
459
+ * cleanup timer that keeps the event loop alive, so `destroy()` has to stop
460
+ * it — and once the storage is wrapped for encryption it is reachable
461
+ * through nothing else. A caller-supplied storage is deliberately not
462
+ * recorded here: its lifetime belongs to the caller.
463
+ */
464
+ private ownedTokenStorage;
457
465
  /**
458
466
  * Keyed by proxy-issued client_id for authorize/token-exchange lookups and
459
467
  * for the defence-in-depth callback checks. A registration never changes
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- var _chunkRQ6222DUcjs = require('../chunk-RQ6222DU.cjs');
27
+ var _chunkKMG3C24Zcjs = require('../chunk-KMG3C24Z.cjs');
28
28
 
29
29
 
30
30
 
@@ -51,5 +51,5 @@ var _chunkRQ6222DUcjs = require('../chunk-RQ6222DU.cjs');
51
51
 
52
52
 
53
53
 
54
- exports.AuthProvider = _chunkRQ6222DUcjs.AuthProvider; exports.AzureProvider = _chunkRQ6222DUcjs.AzureProvider; exports.ConsentManager = _chunkRQ6222DUcjs.ConsentManager; exports.DEFAULT_ACCESS_TOKEN_TTL = _chunkRQ6222DUcjs.DEFAULT_ACCESS_TOKEN_TTL; exports.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH = _chunkRQ6222DUcjs.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH; exports.DEFAULT_AUTHORIZATION_CODE_TTL = _chunkRQ6222DUcjs.DEFAULT_AUTHORIZATION_CODE_TTL; exports.DEFAULT_REFRESH_TOKEN_TTL = _chunkRQ6222DUcjs.DEFAULT_REFRESH_TOKEN_TTL; exports.DEFAULT_TRANSACTION_TTL = _chunkRQ6222DUcjs.DEFAULT_TRANSACTION_TTL; exports.DiskStore = _chunkRQ6222DUcjs.DiskStore; exports.EncryptedTokenStorage = _chunkRQ6222DUcjs.EncryptedTokenStorage; exports.GitHubProvider = _chunkRQ6222DUcjs.GitHubProvider; exports.GoogleProvider = _chunkRQ6222DUcjs.GoogleProvider; exports.JWKSVerifier = _chunkRQ6222DUcjs.JWKSVerifier; exports.JWTIssuer = _chunkRQ6222DUcjs.JWTIssuer; exports.MemoryTokenStorage = _chunkRQ6222DUcjs.MemoryTokenStorage; exports.OAuthProvider = _chunkRQ6222DUcjs.OAuthProvider; exports.OAuthProxy = _chunkRQ6222DUcjs.OAuthProxy; exports.OAuthProxyError = _chunkRQ6222DUcjs.OAuthProxyError; exports.PKCEUtils = _chunkRQ6222DUcjs.PKCEUtils; exports.getAuthSession = _chunkRQ6222DUcjs.getAuthSession; exports.requireAll = _chunkRQ6222DUcjs.requireAll; exports.requireAny = _chunkRQ6222DUcjs.requireAny; exports.requireAuth = _chunkRQ6222DUcjs.requireAuth; exports.requireRole = _chunkRQ6222DUcjs.requireRole; exports.requireScopes = _chunkRQ6222DUcjs.requireScopes;
54
+ exports.AuthProvider = _chunkKMG3C24Zcjs.AuthProvider; exports.AzureProvider = _chunkKMG3C24Zcjs.AzureProvider; exports.ConsentManager = _chunkKMG3C24Zcjs.ConsentManager; exports.DEFAULT_ACCESS_TOKEN_TTL = _chunkKMG3C24Zcjs.DEFAULT_ACCESS_TOKEN_TTL; exports.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH = _chunkKMG3C24Zcjs.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH; exports.DEFAULT_AUTHORIZATION_CODE_TTL = _chunkKMG3C24Zcjs.DEFAULT_AUTHORIZATION_CODE_TTL; exports.DEFAULT_REFRESH_TOKEN_TTL = _chunkKMG3C24Zcjs.DEFAULT_REFRESH_TOKEN_TTL; exports.DEFAULT_TRANSACTION_TTL = _chunkKMG3C24Zcjs.DEFAULT_TRANSACTION_TTL; exports.DiskStore = _chunkKMG3C24Zcjs.DiskStore; exports.EncryptedTokenStorage = _chunkKMG3C24Zcjs.EncryptedTokenStorage; exports.GitHubProvider = _chunkKMG3C24Zcjs.GitHubProvider; exports.GoogleProvider = _chunkKMG3C24Zcjs.GoogleProvider; exports.JWKSVerifier = _chunkKMG3C24Zcjs.JWKSVerifier; exports.JWTIssuer = _chunkKMG3C24Zcjs.JWTIssuer; exports.MemoryTokenStorage = _chunkKMG3C24Zcjs.MemoryTokenStorage; exports.OAuthProvider = _chunkKMG3C24Zcjs.OAuthProvider; exports.OAuthProxy = _chunkKMG3C24Zcjs.OAuthProxy; exports.OAuthProxyError = _chunkKMG3C24Zcjs.OAuthProxyError; exports.PKCEUtils = _chunkKMG3C24Zcjs.PKCEUtils; exports.getAuthSession = _chunkKMG3C24Zcjs.getAuthSession; exports.requireAll = _chunkKMG3C24Zcjs.requireAll; exports.requireAny = _chunkKMG3C24Zcjs.requireAny; exports.requireAuth = _chunkKMG3C24Zcjs.requireAuth; exports.requireRole = _chunkKMG3C24Zcjs.requireRole; exports.requireScopes = _chunkKMG3C24Zcjs.requireScopes;
55
55
  //# sourceMappingURL=index.cjs.map
@@ -1,5 +1,5 @@
1
- import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-B_OJFNC0.cjs';
2
- export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-B_OJFNC0.cjs';
1
+ import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-zVRjvkf8.cjs';
2
+ export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-zVRjvkf8.cjs';
3
3
  import 'node:http';
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-B_OJFNC0.js';
2
- export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-B_OJFNC0.js';
1
+ import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-zVRjvkf8.js';
2
+ export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-zVRjvkf8.js';
3
3
  import 'node:http';
4
4
 
5
5
  /**
@@ -24,7 +24,7 @@ import {
24
24
  requireAuth,
25
25
  requireRole,
26
26
  requireScopes
27
- } from "../chunk-SZ4XCW5X.js";
27
+ } from "../chunk-Y7GSHCYB.js";
28
28
  export {
29
29
  AuthProvider,
30
30
  AzureProvider,
@@ -938,11 +938,11 @@ var PKCEUtils = class _PKCEUtils {
938
938
  return false;
939
939
  }
940
940
  if (method === "plain") {
941
- return verifier === challenge;
941
+ return equalsConstantTime(verifier, challenge);
942
942
  }
943
943
  if (method === "S256") {
944
944
  const computedChallenge = _PKCEUtils.generateChallenge(verifier, "S256");
945
- return computedChallenge === challenge;
945
+ return equalsConstantTime(computedChallenge, challenge);
946
946
  }
947
947
  return false;
948
948
  }
@@ -955,6 +955,11 @@ var PKCEUtils = class _PKCEUtils {
955
955
  return buffer.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
956
956
  }
957
957
  };
958
+ function equalsConstantTime(a, b) {
959
+ const bufA = Buffer.from(a, "utf8");
960
+ const bufB = Buffer.from(b, "utf8");
961
+ return bufA.length === bufB.length && _crypto.timingSafeEqual.call(void 0, bufA, bufB);
962
+ }
958
963
 
959
964
  // src/auth/utils/tokenStore.ts
960
965
 
@@ -1135,16 +1140,24 @@ var OAuthProxy = (_class4 = class {
1135
1140
 
1136
1141
 
1137
1142
 
1143
+ /**
1144
+ * The fallback storage this proxy created for itself, if any. It runs a
1145
+ * cleanup timer that keeps the event loop alive, so `destroy()` has to stop
1146
+ * it — and once the storage is wrapped for encryption it is reachable
1147
+ * through nothing else. A caller-supplied storage is deliberately not
1148
+ * recorded here: its lifetime belongs to the caller.
1149
+ */
1150
+ __init7() {this.ownedTokenStorage = null}
1138
1151
  /**
1139
1152
  * Keyed by proxy-issued client_id for authorize/token-exchange lookups and
1140
1153
  * for the defence-in-depth callback checks. A registration never changes
1141
1154
  * after it is written, so caching it locally cannot go stale; it is also
1142
1155
  * persisted, so another instance can hydrate it.
1143
1156
  */
1144
- __init7() {this.registeredClientsByClientId = /* @__PURE__ */ new Map()}
1157
+ __init8() {this.registeredClientsByClientId = /* @__PURE__ */ new Map()}
1145
1158
 
1146
1159
 
1147
- constructor(config) {;_class4.prototype.__init5.call(this);_class4.prototype.__init6.call(this);_class4.prototype.__init7.call(this);
1160
+ constructor(config) {;_class4.prototype.__init5.call(this);_class4.prototype.__init6.call(this);_class4.prototype.__init7.call(this);_class4.prototype.__init8.call(this);
1148
1161
  this.config = {
1149
1162
  authorizationCodeTtl: DEFAULT_AUTHORIZATION_CODE_TTL,
1150
1163
  consentRequired: true,
@@ -1156,7 +1169,11 @@ var OAuthProxy = (_class4 = class {
1156
1169
  upstreamTokenEndpointAuthMethod: "client_secret_basic",
1157
1170
  ...config
1158
1171
  };
1159
- let storage = config.tokenStorage || new MemoryTokenStorage();
1172
+ let storage = config.tokenStorage;
1173
+ if (!storage) {
1174
+ this.ownedTokenStorage = new MemoryTokenStorage();
1175
+ storage = this.ownedTokenStorage;
1176
+ }
1160
1177
  const isAlreadyEncrypted = storage.constructor.name === "EncryptedTokenStorage";
1161
1178
  if (!isAlreadyEncrypted && config.encryptionKey !== false) {
1162
1179
  const encryptionKey = typeof config.encryptionKey === "string" ? config.encryptionKey : this.generateSigningKey();
@@ -1233,6 +1250,7 @@ var OAuthProxy = (_class4 = class {
1233
1250
  clearInterval(this.cleanupInterval);
1234
1251
  this.cleanupInterval = null;
1235
1252
  }
1253
+ _optionalChain([this, 'access', _8 => _8.ownedTokenStorage, 'optionalAccess', _9 => _9.destroy, 'call', _10 => _10()]);
1236
1254
  this.registeredClientsByClientId.clear();
1237
1255
  }
1238
1256
  /**
@@ -1443,7 +1461,7 @@ var OAuthProxy = (_class4 = class {
1443
1461
  return null;
1444
1462
  }
1445
1463
  const result = await this.jwtIssuer.verify(fastmcpToken);
1446
- if (!result.valid || !_optionalChain([result, 'access', _8 => _8.claims, 'optionalAccess', _9 => _9.jti])) {
1464
+ if (!result.valid || !_optionalChain([result, 'access', _11 => _11.claims, 'optionalAccess', _12 => _12.jti])) {
1447
1465
  return null;
1448
1466
  }
1449
1467
  const mapping = await this.tokenStorage.get(
@@ -1630,7 +1648,7 @@ var OAuthProxy = (_class4 = class {
1630
1648
  throw new Error("JWT issuer not initialized");
1631
1649
  }
1632
1650
  const result = await this.jwtIssuer.verify(token);
1633
- if (!result.valid || !_optionalChain([result, 'access', _10 => _10.claims, 'optionalAccess', _11 => _11.jti])) {
1651
+ if (!result.valid || !_optionalChain([result, 'access', _13 => _13.claims, 'optionalAccess', _14 => _14.jti])) {
1634
1652
  throw new Error("Failed to extract JTI from token");
1635
1653
  }
1636
1654
  return result.claims.jti;
@@ -1798,7 +1816,7 @@ var OAuthProxy = (_class4 = class {
1798
1816
  "Invalid or expired refresh token"
1799
1817
  );
1800
1818
  }
1801
- const jti = _optionalChain([verifyResult, 'access', _12 => _12.claims, 'optionalAccess', _13 => _13.jti]);
1819
+ const jti = _optionalChain([verifyResult, 'access', _15 => _15.claims, 'optionalAccess', _16 => _16.jti]);
1802
1820
  if (!jti) {
1803
1821
  throw new OAuthProxyError("invalid_grant", "Refresh token missing JTI");
1804
1822
  }
@@ -2247,7 +2265,7 @@ var AuthProvider = class {
2247
2265
  if (!request) {
2248
2266
  return void 0;
2249
2267
  }
2250
- const authHeader = _optionalChain([request, 'access', _14 => _14.headers, 'optionalAccess', _15 => _15.authorization]);
2268
+ const authHeader = _optionalChain([request, 'access', _17 => _17.headers, 'optionalAccess', _18 => _18.authorization]);
2251
2269
  if (!authHeader || !authHeader.startsWith("Bearer ")) {
2252
2270
  return void 0;
2253
2271
  }
@@ -2448,10 +2466,10 @@ var OAuthProvider = class extends AuthProvider {
2448
2466
  var _promises = require('fs/promises');
2449
2467
  var _path = require('path');
2450
2468
  var DiskStore = (_class5 = class {
2451
- __init8() {this.cleanupInterval = null}
2469
+ __init9() {this.cleanupInterval = null}
2452
2470
 
2453
2471
 
2454
- constructor(options) {;_class5.prototype.__init8.call(this);
2472
+ constructor(options) {;_class5.prototype.__init9.call(this);
2455
2473
  this.directory = options.directory;
2456
2474
  this.fileExtension = options.fileExtension || ".json";
2457
2475
  void this.ensureDirectory();
@@ -2624,9 +2642,9 @@ var DiskStore = (_class5 = class {
2624
2642
  var JWKSVerifier = (_class6 = class {
2625
2643
 
2626
2644
 
2627
- __init9() {this.joseLoaded = false}
2645
+ __init10() {this.joseLoaded = false}
2628
2646
 
2629
- constructor(config) {;_class6.prototype.__init9.call(this);
2647
+ constructor(config) {;_class6.prototype.__init10.call(this);
2630
2648
  this.config = {
2631
2649
  cacheDuration: 36e5,
2632
2650
  // 1 hour
@@ -2784,4 +2802,4 @@ Original error: ${error.message}`
2784
2802
 
2785
2803
 
2786
2804
  exports.getAuthSession = getAuthSession; exports.requireAll = requireAll; exports.requireAny = requireAny; exports.requireAuth = requireAuth; exports.requireRole = requireRole; exports.requireScopes = requireScopes; exports.DEFAULT_ACCESS_TOKEN_TTL = DEFAULT_ACCESS_TOKEN_TTL; exports.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH = DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH; exports.DEFAULT_REFRESH_TOKEN_TTL = DEFAULT_REFRESH_TOKEN_TTL; exports.DEFAULT_AUTHORIZATION_CODE_TTL = DEFAULT_AUTHORIZATION_CODE_TTL; exports.DEFAULT_TRANSACTION_TTL = DEFAULT_TRANSACTION_TTL; exports.ConsentManager = ConsentManager; exports.JWTIssuer = JWTIssuer; exports.PKCEUtils = PKCEUtils; exports.EncryptedTokenStorage = EncryptedTokenStorage; exports.MemoryTokenStorage = MemoryTokenStorage; exports.OAuthProxy = OAuthProxy; exports.OAuthProxyError = OAuthProxyError; exports.AuthProvider = AuthProvider; exports.AzureProvider = AzureProvider; exports.GitHubProvider = GitHubProvider; exports.GoogleProvider = GoogleProvider; exports.OAuthProvider = OAuthProvider; exports.DiskStore = DiskStore; exports.JWKSVerifier = JWKSVerifier;
2787
- //# sourceMappingURL=chunk-RQ6222DU.cjs.map
2805
+ //# sourceMappingURL=chunk-KMG3C24Z.cjs.map