fastmcp 4.19.0 → 4.20.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.
- package/dist/FastMCP.cjs +3 -3
- package/dist/FastMCP.js +2 -2
- package/dist/auth/index.cjs +2 -2
- package/dist/auth/index.js +1 -1
- package/dist/{chunk-SYZRGVQX.cjs → chunk-KGXPEC7J.cjs} +55 -30
- package/dist/chunk-KGXPEC7J.cjs.map +1 -0
- package/dist/{chunk-KWRV7CHJ.js → chunk-LRXZYGFR.js} +15 -1
- package/dist/chunk-LRXZYGFR.js.map +1 -0
- package/dist/{chunk-UODI5E6U.js → chunk-XJWV6G5Q.js} +47 -22
- package/dist/chunk-XJWV6G5Q.js.map +1 -0
- package/dist/{chunk-E3HXGE2O.cjs → chunk-YO76IUZ6.cjs} +28 -14
- package/dist/chunk-YO76IUZ6.cjs.map +1 -0
- package/dist/examples/custom-routes.cjs +3 -3
- package/dist/examples/custom-routes.js +2 -2
- package/dist/openapi/index.cjs +132 -44
- package/dist/openapi/index.cjs.map +1 -1
- package/dist/openapi/index.d.cts +19 -0
- package/dist/openapi/index.d.ts +19 -0
- package/dist/openapi/index.js +125 -37
- package/dist/openapi/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-E3HXGE2O.cjs.map +0 -1
- package/dist/chunk-KWRV7CHJ.js.map +0 -1
- package/dist/chunk-SYZRGVQX.cjs.map +0 -1
- package/dist/chunk-UODI5E6U.js.map +0 -1
package/dist/FastMCP.cjs
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
var
|
|
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
|
|
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 =
|
|
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-
|
|
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-
|
|
27
|
+
} from "./chunk-LRXZYGFR.js";
|
|
28
28
|
export {
|
|
29
29
|
AuthProvider,
|
|
30
30
|
AzureProvider,
|
package/dist/auth/index.cjs
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
var
|
|
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 =
|
|
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
|
package/dist/auth/index.js
CHANGED
|
@@ -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; }
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
-
...
|
|
2087
|
+
...authenticate ? { authenticate } : {},
|
|
2094
2088
|
cors: httpConfig.cors,
|
|
2095
2089
|
createServer: async (request) => {
|
|
2096
2090
|
let auth;
|
|
2097
|
-
if (
|
|
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
|
-
...
|
|
2135
|
+
...authenticate ? { authenticate } : {},
|
|
2143
2136
|
cors: httpConfig.cors,
|
|
2144
2137
|
createServer: async (request) => {
|
|
2145
2138
|
let auth;
|
|
2146
|
-
if (
|
|
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-
|
|
2895
|
+
//# sourceMappingURL=chunk-KGXPEC7J.cjs.map
|