@eggjs/tegg-controller-plugin 3.53.0 → 3.56.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/README.md CHANGED
@@ -211,3 +211,126 @@ export class FooController {
211
211
  }
212
212
  }
213
213
  ```
214
+
215
+ ### MCP 注解
216
+
217
+ #### MCPController/MCPPrompt/MCPTool/MCPResource
218
+
219
+ `@MCPController` 注解用来声明当前类是一个 MCP controller。
220
+ 通过使用装饰器 `@MCPPrompt` `@MCPTool` `@MCPResource` 来声明对应的 MCP 类型。
221
+ 使用 `@ToolArgsSchema` `@PromptArgsSchema` `@Extra` 来 schema 和 extra。
222
+
223
+ ```ts
224
+ import {
225
+ MCPController,
226
+ PromptArgs,
227
+ ToolArgs,
228
+ MCPPromptResponse,
229
+ MCPToolResponse,
230
+ MCPResourceResponse,
231
+ MCPPrompt,
232
+ MCPTool,
233
+ MCPResource,
234
+ PromptArgsSchema,
235
+ Logger,
236
+ Inject,
237
+ ToolArgsSchema,
238
+ } from '@eggjs/tegg';
239
+ import z from 'zod';
240
+
241
+ export const PromptType = {
242
+ name: z.string(),
243
+ };
244
+
245
+ export const ToolType = {
246
+ name: z.string({
247
+ description: 'npm package name',
248
+ }),
249
+ };
250
+
251
+
252
+ @MCPController()
253
+ export class McpController {
254
+
255
+ @Inject()
256
+ logger: Logger;
257
+
258
+ @MCPPrompt()
259
+ async foo(@PromptArgsSchema(PromptType) args: PromptArgs<typeof PromptType>): Promise<MCPPromptResponse> {
260
+ this.logger.info('hello world');
261
+ return {
262
+ messages: [
263
+ {
264
+ role: 'user',
265
+ content: {
266
+ type: 'text',
267
+ text: `Generate a concise but descriptive commit message for these changes:\n\n${args.name}`,
268
+ },
269
+ },
270
+ ],
271
+ };
272
+ }
273
+
274
+ @MCPTool()
275
+ async bar(@ToolArgsSchema(ToolType) args: ToolArgs<typeof ToolType>): Promise<MCPToolResponse> {
276
+ return {
277
+ content: [
278
+ {
279
+ type: 'text',
280
+ text: `npm package: ${args.name} not found`,
281
+ },
282
+ ],
283
+ };
284
+ }
285
+
286
+
287
+ @MCPResource({
288
+ template: [
289
+ 'mcp://npm/{name}{?version}',
290
+ {
291
+ list: () => {
292
+ return {
293
+ resources: [
294
+ { name: 'egg', uri: 'mcp://npm/egg?version=4.10.0' },
295
+ { name: 'mcp', uri: 'mcp://npm/mcp?version=0.10.0' },
296
+ ],
297
+ };
298
+ },
299
+ },
300
+ ],
301
+ })
302
+ async car(uri: URL): Promise<MCPResourceResponse> {
303
+ return {
304
+ contents: [{
305
+ uri: uri.toString(),
306
+ text: 'MOCK TEXT',
307
+ }],
308
+ };
309
+ }
310
+ }
311
+
312
+ ```
313
+
314
+ #### MCP 地址
315
+ MCP controller 完整的实现了 SSE / streamable HTTP / streamable stateless HTTP 三种模式,默认情况下,他们的路径分别是 `/mcp/init` `/mcp/stream` `/mcp/stateless/stream`, 你可以根据你所需要的场景,灵活使用对应的接口。
316
+
317
+ ``` ts
318
+ // config.{env}.ts
319
+ import { randomUUID } from 'node:crypto';
320
+
321
+ export default () => {
322
+
323
+ const config = {
324
+ mcp: {
325
+ sseInitPath: '/mcp/init', // SSE path
326
+ sseMessagePath: '/mcp/message', // SSE message path
327
+ streamPath: '/mcp/stream', // streamable path
328
+ statelessStreamPath: '/mcp/stateless/stream', // stateless streamable path
329
+ sessionIdGenerator: randomUUID,
330
+ },
331
+ };
332
+
333
+ return config;
334
+ };
335
+
336
+ ```
@@ -0,0 +1,3 @@
1
+ import { EggContext, Next } from '@eggjs/tegg';
2
+ declare const _default: () => (ctx: EggContext, next: Next) => Promise<void>;
3
+ export default _default;
@@ -0,0 +1,22 @@
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
+ const path_to_regexp_1 = __importDefault(require("path-to-regexp"));
7
+ exports.default = () => {
8
+ return async function mcpBodyMiddleware(ctx, next) {
9
+ const arr = [ctx.app.config.mcp.sseInitPath, ctx.app.config.mcp.sseMessagePath, ctx.app.config.mcp.streamPath, ctx.app.config.mcp.statelessStreamPath];
10
+ const res = arr.some(igPath => {
11
+ const match = (0, path_to_regexp_1.default)(igPath, [], {
12
+ end: false,
13
+ });
14
+ return match.test(ctx.path);
15
+ });
16
+ if (res) {
17
+ ctx.disableBodyParser = true;
18
+ }
19
+ await next();
20
+ };
21
+ };
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwX2JvZHlfbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1jcF9ib2R5X21pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxvRUFBMEM7QUFFMUMsa0JBQWUsR0FBRyxFQUFFO0lBQ2xCLE9BQU8sS0FBSyxVQUFVLGlCQUFpQixDQUFDLEdBQWUsRUFBRSxJQUFVO1FBQ2pFLE1BQU0sR0FBRyxHQUFHLENBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFFLENBQUM7UUFDekosTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1QixNQUFNLEtBQUssR0FBRyxJQUFBLHdCQUFZLEVBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRTtnQkFDckMsR0FBRyxFQUFFLEtBQUs7YUFDWCxDQUFDLENBQUM7WUFDSCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLEdBQUcsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDL0IsQ0FBQztRQUNELE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDZixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMifQ==
package/app.js CHANGED
@@ -11,6 +11,7 @@ const ControllerMetadataManager_1 = require("./lib/ControllerMetadataManager");
11
11
  const EggControllerPrototypeHook_1 = require("./lib/EggControllerPrototypeHook");
12
12
  const RootProtoManager_1 = require("./lib/RootProtoManager");
13
13
  const EggControllerLoader_1 = require("./lib/EggControllerLoader");
14
+ const MCPControllerRegister_1 = require("./lib/impl/mcp/MCPControllerRegister");
14
15
  // Load Controller process
15
16
  // 1. await add load unit is ready, controller may depend other load unit
16
17
  // 2. load ${app_base_dir}app/controller file
@@ -40,6 +41,32 @@ class ControllerAppBootHook {
40
41
  });
41
42
  // init http root proto middleware
42
43
  this.prepareMiddleware(this.app.config.coreMiddleware);
44
+ if (this.app.mcpProxy) {
45
+ this.controllerRegisterFactory.registerControllerRegister(tegg_1.ControllerType.MCP, MCPControllerRegister_1.MCPControllerRegister.create);
46
+ // Don't let the mcp's body be consumed
47
+ this.app.config.coreMiddleware.unshift('mcpBodyMiddleware');
48
+ if (this.app.config.security.csrf.ignore) {
49
+ if (Array.isArray(this.app.config.security.csrf.ignore)) {
50
+ this.app.config.security.csrf.ignore = [
51
+ this.app.config.mcp.sseInitPath,
52
+ this.app.config.mcp.sseMessagePath,
53
+ this.app.config.mcp.streamPath,
54
+ this.app.config.mcp.statelessStreamPath,
55
+ ...(Array.isArray(this.app.config.security.csrf.ignore)
56
+ ? this.app.config.security.csrf.ignore
57
+ : [this.app.config.security.csrf.ignore]),
58
+ ];
59
+ }
60
+ }
61
+ else {
62
+ this.app.config.security.csrf.ignore = [
63
+ this.app.config.mcp.sseInitPath,
64
+ this.app.config.mcp.sseMessagePath,
65
+ this.app.config.mcp.streamPath,
66
+ this.app.config.mcp.statelessStreamPath,
67
+ ];
68
+ }
69
+ }
43
70
  }
44
71
  prepareMiddleware(middlewareNames) {
45
72
  if (!middlewareNames.includes('teggCtxLifecycleMiddleware')) {
@@ -59,6 +86,9 @@ class ControllerAppBootHook {
59
86
  // The HTTPControllerRegister will collect all the methods
60
87
  // and register methods after collect is done.
61
88
  (_a = HTTPControllerRegister_1.HTTPControllerRegister.instance) === null || _a === void 0 ? void 0 : _a.doRegister(this.app.rootProtoManager);
89
+ if (this.app.mcpProxy) {
90
+ MCPControllerRegister_1.MCPControllerRegister.connectStatelessStreamTransport();
91
+ }
62
92
  }
63
93
  async beforeClose() {
64
94
  if (this.controllerLoadUnitHandler) {
@@ -71,4 +101,4 @@ class ControllerAppBootHook {
71
101
  }
72
102
  }
73
103
  exports.default = ControllerAppBootHook;
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsaUVBQW9GO0FBQ3BGLCtFQUE0RTtBQUU1RSxzQ0FBMkU7QUFDM0UsbUZBQWdGO0FBQ2hGLCtFQUE0RTtBQUM1RSwrRUFBNEU7QUFDNUUsc0RBQStGO0FBQy9GLCtFQUE0RTtBQUM1RSxpRkFBOEU7QUFDOUUsNkRBQTBEO0FBQzFELG1FQUFnRTtBQUVoRSwwQkFBMEI7QUFDMUIseUVBQXlFO0FBQ3pFLDZDQUE2QztBQUM3QyxzREFBc0Q7QUFFdEQsTUFBcUIscUJBQXFCO0lBT3hDLFlBQVksR0FBZ0I7UUFDMUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxxREFBeUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLG1DQUFnQixFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUM7UUFDcEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsR0FBRyxtQ0FBNEIsQ0FBQztRQUNyRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUkscURBQXlCLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3RyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSx1REFBMEIsRUFBRSxDQUFDO0lBQ2xFLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENB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
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsaUVBQW9GO0FBQ3BGLCtFQUE0RTtBQUU1RSxzQ0FBMkU7QUFDM0UsbUZBQWdGO0FBQ2hGLCtFQUE0RTtBQUM1RSwrRUFBNEU7QUFDNUUsc0RBQStGO0FBQy9GLCtFQUE0RTtBQUM1RSxpRkFBOEU7QUFDOUUsNkRBQTBEO0FBQzFELG1FQUFnRTtBQUNoRSxnRkFBNkU7QUFFN0UsMEJBQTBCO0FBQzFCLHlFQUF5RTtBQUN6RSw2Q0FBNkM7QUFDN0Msc0RBQXNEO0FBRXRELE1BQXFCLHFCQUFxQjtJQU94QyxZQUFZLEdBQWdCO1FBQzFCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUkscURBQXlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxtQ0FBZ0IsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1FBQ3BFLElBQUksQ0FBQyxHQUFHLENBQUMsNEJBQTRCLEdBQUcsbUNBQTRCLENBQUM7UUFDckUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHFEQUF5QixDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0csSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksdURBQTBCLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsaUJBQWlC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
@@ -0,0 +1,11 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ declare const _default: () => {
3
+ mcp: {
4
+ sseInitPath: string;
5
+ sseMessagePath: string;
6
+ streamPath: string;
7
+ statelessStreamPath: string;
8
+ sessionIdGenerator: typeof randomUUID;
9
+ };
10
+ };
11
+ export default _default;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_crypto_1 = require("node:crypto");
4
+ exports.default = () => {
5
+ const config = {
6
+ mcp: {
7
+ sseInitPath: '/mcp/init',
8
+ sseMessagePath: '/mcp/message',
9
+ streamPath: '/mcp/stream',
10
+ statelessStreamPath: '/mcp/stateless/stream',
11
+ sessionIdGenerator: node_crypto_1.randomUUID,
12
+ },
13
+ };
14
+ return config;
15
+ };
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb25maWcuZGVmYXVsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUF5QztBQUV6QyxrQkFBZSxHQUFHLEVBQUU7SUFFbEIsTUFBTSxNQUFNLEdBQUc7UUFDYixHQUFHLEVBQUU7WUFDSCxXQUFXLEVBQUUsV0FBVztZQUN4QixjQUFjLEVBQUUsY0FBYztZQUM5QixVQUFVLEVBQUUsYUFBYTtZQUN6QixtQkFBbUIsRUFBRSx1QkFBdUI7WUFDNUMsa0JBQWtCLEVBQUUsd0JBQVU7U0FDL0I7S0FDRixDQUFDO0lBRUYsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDIn0=
@@ -0,0 +1,27 @@
1
+ import { EventStore } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
2
+ export interface MCPConfigOptions {
3
+ sseInitPath: string;
4
+ sseMessagePath: string;
5
+ streamPath: string;
6
+ statelessStreamPath: string;
7
+ sessionIdGenerator?: () => string;
8
+ eventStore?: EventStore;
9
+ sseHeartTime?: number;
10
+ }
11
+ export declare class MCPConfig {
12
+ private _sseInitPath;
13
+ private _sseMessagePath;
14
+ private _streamPath;
15
+ private _statelessStreamPath;
16
+ private _sessionIdGenerator;
17
+ private _eventStore;
18
+ private _sseHeartTime;
19
+ constructor(options: MCPConfigOptions);
20
+ get sseInitPath(): string;
21
+ get sseMessagePath(): string;
22
+ get streamPath(): string;
23
+ get statelessStreamPath(): string;
24
+ get sessionIdGenerator(): () => string;
25
+ get eventStore(): EventStore;
26
+ get sseHeartTime(): number;
27
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MCPConfig = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const inMemoryEventStore_js_1 = require("@modelcontextprotocol/sdk/examples/shared/inMemoryEventStore.js");
6
+ class MCPConfig {
7
+ constructor(options) {
8
+ var _a, _b, _c;
9
+ this._sessionIdGenerator = (_a = options.sessionIdGenerator) !== null && _a !== void 0 ? _a : node_crypto_1.randomUUID;
10
+ this._sseInitPath = options.sseInitPath;
11
+ this._sseMessagePath = options.sseMessagePath;
12
+ this._streamPath = options.streamPath;
13
+ this._statelessStreamPath = options.statelessStreamPath;
14
+ this._eventStore = (_b = options.eventStore) !== null && _b !== void 0 ? _b : new inMemoryEventStore_js_1.InMemoryEventStore();
15
+ this._sseHeartTime = (_c = options.sseHeartTime) !== null && _c !== void 0 ? _c : 25000;
16
+ }
17
+ get sseInitPath() {
18
+ return this._sseInitPath;
19
+ }
20
+ get sseMessagePath() {
21
+ return this._sseMessagePath;
22
+ }
23
+ get streamPath() {
24
+ return this._streamPath;
25
+ }
26
+ get statelessStreamPath() {
27
+ return this._statelessStreamPath;
28
+ }
29
+ get sessionIdGenerator() {
30
+ return this._sessionIdGenerator;
31
+ }
32
+ get eventStore() {
33
+ return this._eventStore;
34
+ }
35
+ get sseHeartTime() {
36
+ return this._sseHeartTime;
37
+ }
38
+ }
39
+ exports.MCPConfig = MCPConfig;
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTUNQQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF5QztBQUV6QywyR0FBcUc7QUFZckcsTUFBYSxTQUFTO0lBU3BCLFlBQVksT0FBeUI7O1FBQ25DLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFBLE9BQU8sQ0FBQyxrQkFBa0IsbUNBQUksd0JBQVUsQ0FBQztRQUNwRSxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzlDLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUN0QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1FBQ3hELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBQSxPQUFPLENBQUMsVUFBVSxtQ0FBSSxJQUFJLDBDQUFrQixFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFBLE9BQU8sQ0FBQyxZQUFZLG1DQUFJLEtBQUssQ0FBQztJQUNyRCxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBOUNELDhCQThDQyJ9
@@ -0,0 +1,51 @@
1
+ import type { Application, Context } from 'egg';
2
+ import http, { ServerResponse } from 'node:http';
3
+ import { ControllerMetadata, MCPControllerMeta, MCPPromptMeta, MCPResourceMeta, MCPToolMeta } from '@eggjs/tegg';
4
+ import { EggPrototype } from '@eggjs/tegg-metadata';
5
+ import { ControllerRegister } from '../../ControllerRegister';
6
+ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
7
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
8
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import { MCPProtocols } from '@eggjs/mcp-proxy';
10
+ export interface MCPControllerHook {
11
+ preSSEInitHandle?: (ctx: Context, transport: SSEServerTransport, register: MCPControllerRegister) => Promise<void>;
12
+ preHandleInitHandle?: (ctx: Context) => Promise<void>;
13
+ preHandle?: (ctx: Context) => Promise<void>;
14
+ onStreamSessionInitialized?: (ctx: Context, transport: StreamableHTTPServerTransport, register: MCPControllerRegister) => Promise<void>;
15
+ preProxy?: (ctx: Context, proxyReq: http.IncomingMessage, proxyResp: http.ServerResponse) => Promise<void>;
16
+ schemaLoader?: (controllerMeta: MCPControllerMeta, meta: MCPPromptMeta | MCPToolMeta) => Promise<Parameters<McpServer['tool']>['2'] | Parameters<McpServer['prompt']>['2']>;
17
+ checkAndRunProxy?: (ctx: Context, type: MCPProtocols, sessionId: string) => Promise<boolean>;
18
+ }
19
+ export declare class MCPControllerRegister implements ControllerRegister {
20
+ static instance?: MCPControllerRegister;
21
+ readonly app: Application;
22
+ private readonly eggContainerFactory;
23
+ private readonly router;
24
+ private controllerProtos;
25
+ private registeredControllerProtos;
26
+ transports: Record<string, SSEServerTransport>;
27
+ sseConnections: Map<string, {
28
+ res: ServerResponse;
29
+ intervalId: NodeJS.Timeout;
30
+ }>;
31
+ private mcpServer;
32
+ private statelessMcpServer;
33
+ private controllerMeta;
34
+ private mcpConfig;
35
+ statelessTransport: StreamableHTTPServerTransport;
36
+ streamTransports: Record<string, StreamableHTTPServerTransport>;
37
+ static hooks: MCPControllerHook[];
38
+ static create(proto: EggPrototype, controllerMeta: ControllerMetadata, app: Application): MCPControllerRegister;
39
+ constructor(_proto: EggPrototype, controllerMeta: MCPControllerMeta, app: Application);
40
+ static addHook(hook: MCPControllerHook): void;
41
+ static connectStatelessStreamTransport(): Promise<void>;
42
+ mcpStatelessStreamServerInit(): void;
43
+ mcpStreamServerInit(): void;
44
+ mcpServerInit(): void;
45
+ sseCtxStorageRun(ctx: Context, transport: SSEServerTransport | StreamableHTTPServerTransport): void;
46
+ mcpServerRegister(): void;
47
+ mcpPromptRegister(controllerProto: EggPrototype, promptMeta: MCPPromptMeta): Promise<void>;
48
+ mcpToolRegister(controllerProto: EggPrototype, toolMeta: MCPToolMeta): Promise<void>;
49
+ mcpResourceRegister(controllerProto: EggPrototype, resourceMeta: MCPResourceMeta): Promise<void>;
50
+ register(): Promise<void>;
51
+ }
@@ -0,0 +1,512 @@
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.MCPControllerRegister = void 0;
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const node_http_1 = require("node:http");
9
+ const node_net_1 = require("node:net");
10
+ const tegg_1 = require("@eggjs/tegg");
11
+ const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
12
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
13
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
14
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
15
+ const mcp_proxy_1 = require("@eggjs/mcp-proxy");
16
+ const raw_body_1 = __importDefault(require("raw-body"));
17
+ const content_type_1 = __importDefault(require("content-type"));
18
+ const MCPConfig_1 = require("./MCPConfig");
19
+ class MCPControllerRegister {
20
+ static create(proto, controllerMeta, app) {
21
+ (0, node_assert_1.default)(controllerMeta.type === tegg_1.ControllerType.MCP, 'controller meta type is not MCP');
22
+ if (!MCPControllerRegister.instance) {
23
+ MCPControllerRegister.instance = new MCPControllerRegister(proto, controllerMeta, app);
24
+ }
25
+ MCPControllerRegister.instance.controllerProtos.push(proto);
26
+ return MCPControllerRegister.instance;
27
+ }
28
+ constructor(_proto, controllerMeta, app) {
29
+ this.controllerProtos = [];
30
+ this.registeredControllerProtos = [];
31
+ this.transports = {};
32
+ this.sseConnections = new Map();
33
+ this.streamTransports = {};
34
+ this.app = app;
35
+ this.eggContainerFactory = app.eggContainerFactory;
36
+ this.router = app.router;
37
+ this.controllerMeta = controllerMeta;
38
+ this.mcpConfig = new MCPConfig_1.MCPConfig(app.config.mcp);
39
+ }
40
+ static addHook(hook) {
41
+ MCPControllerRegister.hooks.push(hook);
42
+ }
43
+ static async connectStatelessStreamTransport() {
44
+ if (MCPControllerRegister.instance && MCPControllerRegister.instance.statelessTransport) {
45
+ MCPControllerRegister.instance.statelessMcpServer.connect(MCPControllerRegister.instance.statelessTransport);
46
+ // 由于 mcp server stateless 需要我们在这里 init
47
+ // 以防止后续请求进入时初次 init 后,请求打到别的进程,而别的进程没有 init
48
+ const socket = new node_net_1.Socket();
49
+ const req = new node_http_1.IncomingMessage(socket);
50
+ const res = new node_http_1.ServerResponse(req);
51
+ req.method = 'POST';
52
+ req.url = MCPControllerRegister.instance.mcpConfig.statelessStreamPath;
53
+ req.headers = {
54
+ accept: 'application/json, text/event-stream',
55
+ 'content-type': 'application/json',
56
+ };
57
+ const initBody = {
58
+ jsonrpc: '2.0',
59
+ id: 0,
60
+ method: 'initialize',
61
+ params: {
62
+ protocolVersion: '2024-11-05',
63
+ capabilities: {},
64
+ clientInfo: {
65
+ name: 'init-client',
66
+ version: '1.0.0',
67
+ },
68
+ },
69
+ };
70
+ await MCPControllerRegister.instance.statelessTransport.handleRequest(req, res, initBody);
71
+ }
72
+ }
73
+ mcpStatelessStreamServerInit() {
74
+ const postRouterFunc = this.router.post;
75
+ const self = this;
76
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
77
+ sessionIdGenerator: undefined,
78
+ });
79
+ self.statelessTransport = transport;
80
+ const initHandler = async (ctx) => {
81
+ var _a;
82
+ if (MCPControllerRegister.hooks.length > 0) {
83
+ for (const hook of MCPControllerRegister.hooks) {
84
+ await ((_a = hook.preHandle) === null || _a === void 0 ? void 0 : _a.call(hook, self.app.currentContext));
85
+ }
86
+ }
87
+ ctx.respond = false;
88
+ ctx.set({
89
+ 'content-type': 'text/event-stream',
90
+ 'transfer-encoding': 'chunked',
91
+ });
92
+ await ctx.app.ctxStorage.run(ctx, async () => {
93
+ await self.statelessTransport.handleRequest(ctx.req, ctx.res);
94
+ });
95
+ return;
96
+ };
97
+ Reflect.apply(postRouterFunc, this.router, [
98
+ 'chairMcpStatelessStreamInit',
99
+ this.mcpConfig.statelessStreamPath,
100
+ ...[],
101
+ initHandler,
102
+ ]);
103
+ // stateless 只支持 post
104
+ const getRouterFunc = this.router.get;
105
+ const delRouterFunc = this.router.del;
106
+ const notHandler = async (ctx) => {
107
+ ctx.status = 405;
108
+ ctx.body = {
109
+ jsonrpc: '2.0',
110
+ error: {
111
+ code: -32000,
112
+ message: 'Method not allowed.',
113
+ },
114
+ id: null,
115
+ };
116
+ };
117
+ Reflect.apply(getRouterFunc, this.router, [
118
+ 'chairMcpStatelessStreamInit',
119
+ this.mcpConfig.statelessStreamPath,
120
+ ...[],
121
+ notHandler,
122
+ ]);
123
+ Reflect.apply(delRouterFunc, this.router, [
124
+ 'chairMcpStatelessStreamInit',
125
+ this.mcpConfig.statelessStreamPath,
126
+ ...[],
127
+ notHandler,
128
+ ]);
129
+ }
130
+ mcpStreamServerInit() {
131
+ const allRouterFunc = this.router.all;
132
+ const self = this;
133
+ const initHandler = async (ctx) => {
134
+ var _a, _b, _c, _d, _e;
135
+ ctx.respond = false;
136
+ if (MCPControllerRegister.hooks.length > 0) {
137
+ for (const hook of MCPControllerRegister.hooks) {
138
+ await ((_a = hook.preHandle) === null || _a === void 0 ? void 0 : _a.call(hook, self.app.currentContext));
139
+ }
140
+ }
141
+ const sessionId = ctx.req.headers['mcp-session-id'];
142
+ if (!sessionId) {
143
+ const ct = content_type_1.default.parse((_b = ctx.req.headers['content-type']) !== null && _b !== void 0 ? _b : '');
144
+ let body;
145
+ try {
146
+ const rawBody = await (0, raw_body_1.default)(ctx.req, {
147
+ limit: '4mb',
148
+ encoding: (_c = ct.parameters.charset) !== null && _c !== void 0 ? _c : 'utf-8',
149
+ });
150
+ body = JSON.parse(rawBody);
151
+ }
152
+ catch (e) {
153
+ ctx.status = 400;
154
+ ctx.body = {
155
+ jsonrpc: '2.0',
156
+ error: {
157
+ code: -32000,
158
+ message: `Bad Request: body should is json, ${e.toString()}`,
159
+ },
160
+ id: null,
161
+ };
162
+ return;
163
+ }
164
+ if ((0, types_js_1.isInitializeRequest)(body)) {
165
+ ctx.respond = false;
166
+ const eventStore = this.mcpConfig.eventStore;
167
+ const self = this;
168
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
169
+ sessionIdGenerator: () => this.mcpConfig.sessionIdGenerator(),
170
+ eventStore,
171
+ onsessioninitialized: async () => {
172
+ var _a;
173
+ if (MCPControllerRegister.hooks.length > 0) {
174
+ for (const hook of MCPControllerRegister.hooks) {
175
+ await ((_a = hook.onStreamSessionInitialized) === null || _a === void 0 ? void 0 : _a.call(hook, self.app.currentContext, transport, self));
176
+ }
177
+ }
178
+ },
179
+ });
180
+ ctx.set({
181
+ 'content-type': 'text/event-stream',
182
+ 'transfer-encoding': 'chunked',
183
+ });
184
+ await self.mcpServer.connect(transport);
185
+ await ctx.app.ctxStorage.run(ctx, async () => {
186
+ await transport.handleRequest(ctx.req, ctx.res, body);
187
+ });
188
+ }
189
+ else {
190
+ ctx.status = 400;
191
+ ctx.body = {
192
+ jsonrpc: '2.0',
193
+ error: {
194
+ code: -32000,
195
+ message: 'Bad Request: No valid session ID provided',
196
+ },
197
+ id: null,
198
+ };
199
+ return;
200
+ }
201
+ }
202
+ else if (sessionId) {
203
+ const transport = self.streamTransports[sessionId];
204
+ if (transport) {
205
+ if (MCPControllerRegister.hooks.length > 0) {
206
+ for (const hook of MCPControllerRegister.hooks) {
207
+ await ((_d = hook.preHandle) === null || _d === void 0 ? void 0 : _d.call(hook, self.app.currentContext));
208
+ }
209
+ }
210
+ ctx.respond = false;
211
+ ctx.set({
212
+ 'content-type': 'text/event-stream',
213
+ 'transfer-encoding': 'chunked',
214
+ });
215
+ await ctx.app.ctxStorage.run(ctx, async () => {
216
+ await transport.handleRequest(ctx.req, ctx.res);
217
+ });
218
+ return;
219
+ }
220
+ if (MCPControllerRegister.hooks.length > 0) {
221
+ for (const hook of MCPControllerRegister.hooks) {
222
+ const checked = await ((_e = hook.checkAndRunProxy) === null || _e === void 0 ? void 0 : _e.call(hook, self.app.currentContext, mcp_proxy_1.MCPProtocols.STREAM, sessionId));
223
+ if (checked) {
224
+ return;
225
+ }
226
+ }
227
+ }
228
+ }
229
+ return;
230
+ };
231
+ Reflect.apply(allRouterFunc, this.router, [
232
+ 'chairMcpStreamInit',
233
+ self.mcpConfig.streamPath,
234
+ ...[],
235
+ initHandler,
236
+ ]);
237
+ }
238
+ mcpServerInit() {
239
+ const routerFunc = this.router.get;
240
+ // const aclMiddleware = aclMiddlewareFactory(this.controllerMeta, this.methodMeta);
241
+ // if (aclMiddleware) {
242
+ // methodMiddlewares.push(aclMiddleware);
243
+ // }
244
+ const self = this;
245
+ const initHandler = async (ctx) => {
246
+ var _a;
247
+ const transport = new sse_js_1.SSEServerTransport(self.mcpConfig.sseMessagePath, ctx.res);
248
+ const id = transport.sessionId;
249
+ if (MCPControllerRegister.hooks.length > 0) {
250
+ for (const hook of MCPControllerRegister.hooks) {
251
+ await ((_a = hook.preSSEInitHandle) === null || _a === void 0 ? void 0 : _a.call(hook, self.app.currentContext, transport, self));
252
+ }
253
+ }
254
+ // https://github.com/modelcontextprotocol/typescript-sdk/issues/270#issuecomment-2789526821
255
+ const intervalId = setInterval(() => {
256
+ if (self.sseConnections.has(id) && !ctx.res.writableEnded) {
257
+ ctx.res.write(': keepalive\n\n');
258
+ }
259
+ else {
260
+ clearInterval(intervalId);
261
+ self.sseConnections.delete(id);
262
+ }
263
+ }, self.mcpConfig.sseHeartTime);
264
+ self.sseConnections.set(id, { res: ctx.res, intervalId });
265
+ self.transports[id] = transport;
266
+ ctx.set({
267
+ 'content-type': 'text/event-stream',
268
+ 'transfer-encoding': 'chunked',
269
+ });
270
+ ctx.respond = false;
271
+ await self.mcpServer.connect(transport);
272
+ return self.sseCtxStorageRun.bind(self)(ctx, transport);
273
+ };
274
+ Reflect.apply(routerFunc, this.router, [
275
+ 'chairMcpInit',
276
+ self.mcpConfig.sseInitPath,
277
+ ...[],
278
+ initHandler,
279
+ ]);
280
+ }
281
+ sseCtxStorageRun(ctx, transport) {
282
+ const closeFunc = transport.onclose;
283
+ transport.onclose = (...args) => {
284
+ closeFunc === null || closeFunc === void 0 ? void 0 : closeFunc(...args);
285
+ };
286
+ transport.onerror = error => {
287
+ this.app.logger.error('session %s error %o', transport.sessionId, error);
288
+ };
289
+ const messageFunc = transport.onmessage;
290
+ transport.onmessage = async (...args) => {
291
+ await ctx.app.ctxStorage.run(ctx, async () => {
292
+ await messageFunc(...args);
293
+ });
294
+ };
295
+ }
296
+ mcpServerRegister() {
297
+ const routerFunc = this.router.post;
298
+ const self = this;
299
+ // const aclMiddleware = aclMiddlewareFactory(this.controllerMeta, this.methodMeta);
300
+ // if (aclMiddleware) {
301
+ // methodMiddlewares.push(aclMiddleware);
302
+ // }
303
+ const messageHander = async (ctx) => {
304
+ var _a, _b;
305
+ const sessionId = ctx.query.sessionId;
306
+ if (self.transports[sessionId]) {
307
+ if (MCPControllerRegister.hooks.length > 0) {
308
+ for (const hook of MCPControllerRegister.hooks) {
309
+ await ((_a = hook.preHandleInitHandle) === null || _a === void 0 ? void 0 : _a.call(hook, self.app.currentContext));
310
+ }
311
+ }
312
+ self.app.logger.info('message coming', sessionId);
313
+ try {
314
+ await self.transports[sessionId].handlePostMessage(ctx.req, ctx.res);
315
+ }
316
+ catch (error) {
317
+ self.app.logger.error('Error handling MCP message', error);
318
+ if (!ctx.res.headersSent) {
319
+ ctx.status = 500;
320
+ ctx.body = {
321
+ jsonrpc: '2.0',
322
+ error: {
323
+ code: -32603,
324
+ message: `Internal error: ${error.message}`,
325
+ },
326
+ id: null,
327
+ };
328
+ }
329
+ }
330
+ return;
331
+ }
332
+ if (MCPControllerRegister.hooks.length > 0) {
333
+ for (const hook of MCPControllerRegister.hooks) {
334
+ const checked = await ((_b = hook.checkAndRunProxy) === null || _b === void 0 ? void 0 : _b.call(hook, self.app.currentContext, mcp_proxy_1.MCPProtocols.SSE, sessionId));
335
+ if (checked) {
336
+ return;
337
+ }
338
+ }
339
+ }
340
+ };
341
+ Reflect.apply(routerFunc, this.router, [
342
+ 'chairMcpMessage',
343
+ self.mcpConfig.sseMessagePath,
344
+ ...[],
345
+ messageHander,
346
+ ]);
347
+ }
348
+ async mcpPromptRegister(controllerProto, promptMeta) {
349
+ var _a, _b, _c, _d;
350
+ const controllerMeta = controllerProto.getMetaData(tegg_1.CONTROLLER_META_DATA);
351
+ const args = [(_a = promptMeta.mcpName) !== null && _a !== void 0 ? _a : promptMeta.name];
352
+ if (promptMeta.description) {
353
+ args.push(promptMeta.description);
354
+ }
355
+ let schema;
356
+ if ((_b = promptMeta.detail) === null || _b === void 0 ? void 0 : _b.argsSchema) {
357
+ schema = (_c = promptMeta.detail) === null || _c === void 0 ? void 0 : _c.argsSchema;
358
+ args.push(schema);
359
+ }
360
+ else if (MCPControllerRegister.hooks.length > 0) {
361
+ for (const hook of MCPControllerRegister.hooks) {
362
+ schema = await ((_d = hook.schemaLoader) === null || _d === void 0 ? void 0 : _d.call(hook, controllerMeta, promptMeta));
363
+ if (schema) {
364
+ args.push(schema);
365
+ break;
366
+ }
367
+ }
368
+ }
369
+ const self = this;
370
+ const handler = async (...args) => {
371
+ const eggObj = await self.eggContainerFactory.getOrCreateEggObject(controllerProto, controllerProto.name);
372
+ const realObj = eggObj.obj;
373
+ const realMethod = realObj[promptMeta.name];
374
+ let newArgs = [];
375
+ if (schema && promptMeta.detail) {
376
+ // 如果有 schema 则证明入参第一个就是 schema
377
+ newArgs[promptMeta.detail.index] = args[0];
378
+ // 如果有 schema 则证明入参第二个就是 extra
379
+ if (promptMeta.extra) {
380
+ newArgs[promptMeta.extra] = args[1];
381
+ }
382
+ }
383
+ else if (promptMeta.extra) {
384
+ // 无 schema, 那么入参第一个就是 extra
385
+ newArgs[promptMeta.extra] = args[0];
386
+ }
387
+ newArgs = [...newArgs, ...args];
388
+ return Reflect.apply(realMethod, realObj, newArgs);
389
+ };
390
+ args.push(handler);
391
+ this.mcpServer.prompt(...args);
392
+ this.statelessMcpServer.prompt(...args);
393
+ }
394
+ async mcpToolRegister(controllerProto, toolMeta) {
395
+ var _a, _b, _c, _d, _e;
396
+ const controllerMeta = controllerProto.getMetaData(tegg_1.CONTROLLER_META_DATA);
397
+ const args = [(_a = toolMeta.mcpName) !== null && _a !== void 0 ? _a : toolMeta.name];
398
+ if (toolMeta.description) {
399
+ args.push(toolMeta.description);
400
+ }
401
+ let schema;
402
+ if ((_b = toolMeta.detail) === null || _b === void 0 ? void 0 : _b.argsSchema) {
403
+ schema = (_c = toolMeta.detail) === null || _c === void 0 ? void 0 : _c.argsSchema;
404
+ args.push((_d = toolMeta.detail) === null || _d === void 0 ? void 0 : _d.argsSchema);
405
+ }
406
+ else if (MCPControllerRegister.hooks.length > 0) {
407
+ for (const hook of MCPControllerRegister.hooks) {
408
+ schema = await ((_e = hook.schemaLoader) === null || _e === void 0 ? void 0 : _e.call(hook, controllerMeta, toolMeta));
409
+ if (schema) {
410
+ args.push(schema);
411
+ break;
412
+ }
413
+ }
414
+ }
415
+ const self = this;
416
+ const handler = async (...args) => {
417
+ const eggObj = await self.eggContainerFactory.getOrCreateEggObject(controllerProto, controllerProto.name);
418
+ const realObj = eggObj.obj;
419
+ const realMethod = realObj[toolMeta.name];
420
+ let newArgs = [];
421
+ if (schema && toolMeta.detail) {
422
+ // 如果有 schema 则证明入参第一个就是 schema
423
+ newArgs[toolMeta.detail.index] = args[0];
424
+ // 如果有 schema 则证明入参第二个就是 extra
425
+ if (toolMeta.extra) {
426
+ newArgs[toolMeta.extra] = args[1];
427
+ }
428
+ }
429
+ else if (toolMeta.extra) {
430
+ // 无 schema, 那么入参第一个就是 extra
431
+ newArgs[toolMeta.extra] = args[0];
432
+ }
433
+ newArgs = [...newArgs, ...args];
434
+ return Reflect.apply(realMethod, realObj, newArgs);
435
+ };
436
+ args.push(handler);
437
+ this.mcpServer.tool(...args);
438
+ this.statelessMcpServer.tool(...args);
439
+ }
440
+ async mcpResourceRegister(controllerProto, resourceMeta) {
441
+ var _a;
442
+ const args = [(_a = resourceMeta.mcpName) !== null && _a !== void 0 ? _a : resourceMeta.name];
443
+ if (resourceMeta.uri) {
444
+ args.push(resourceMeta.uri);
445
+ }
446
+ if (resourceMeta.template) {
447
+ const template = resourceMeta.template;
448
+ args.push(template);
449
+ }
450
+ if (resourceMeta.metadata) {
451
+ args.push(resourceMeta.metadata);
452
+ }
453
+ const self = this;
454
+ const handler = async (...args) => {
455
+ const eggObj = await self.eggContainerFactory.getOrCreateEggObject(controllerProto, controllerProto.name);
456
+ const realObj = eggObj.obj;
457
+ const realMethod = realObj[resourceMeta.name];
458
+ return Reflect.apply(realMethod, realObj, args);
459
+ };
460
+ args.push(handler);
461
+ this.mcpServer.resource(...args);
462
+ this.statelessMcpServer.resource(...args);
463
+ }
464
+ async register() {
465
+ var _a, _b, _c, _d;
466
+ const promptMap = new Map();
467
+ const resourceMap = new Map();
468
+ const toolMap = new Map();
469
+ for (const proto of this.controllerProtos) {
470
+ if (this.registeredControllerProtos.includes(proto)) {
471
+ continue;
472
+ }
473
+ const metadata = proto.getMetaData(tegg_1.CONTROLLER_META_DATA);
474
+ for (const prompt of metadata.prompts) {
475
+ promptMap.set(prompt, proto);
476
+ }
477
+ for (const resource of metadata.resources) {
478
+ resourceMap.set(resource, proto);
479
+ }
480
+ for (const tool of metadata.tools) {
481
+ toolMap.set(tool, proto);
482
+ }
483
+ this.registeredControllerProtos.push(proto);
484
+ }
485
+ if (!this.mcpServer) {
486
+ this.mcpServer = new mcp_js_1.McpServer({
487
+ name: (_a = this.controllerMeta.name) !== null && _a !== void 0 ? _a : `chair-mcp-${this.app.name}-server`,
488
+ version: (_b = this.controllerMeta.version) !== null && _b !== void 0 ? _b : '1.0.0',
489
+ }, { capabilities: { logging: {} } });
490
+ this.statelessMcpServer = new mcp_js_1.McpServer({
491
+ name: (_c = this.controllerMeta.name) !== null && _c !== void 0 ? _c : `chair-mcp-${this.app.name}-stateless-server`,
492
+ version: (_d = this.controllerMeta.version) !== null && _d !== void 0 ? _d : '1.0.0',
493
+ }, { capabilities: { logging: {} } });
494
+ this.mcpStatelessStreamServerInit();
495
+ this.mcpStreamServerInit();
496
+ this.mcpServerInit();
497
+ this.mcpServerRegister();
498
+ }
499
+ for (const [prompt, controllerProto] of promptMap.entries()) {
500
+ await this.mcpPromptRegister(controllerProto, prompt);
501
+ }
502
+ for (const [tool, controllerProto] of toolMap.entries()) {
503
+ await this.mcpToolRegister(controllerProto, tool);
504
+ }
505
+ for (const [resource, controllerProto] of resourceMap.entries()) {
506
+ await this.mcpResourceRegister(controllerProto, resource);
507
+ }
508
+ }
509
+ }
510
+ exports.MCPControllerRegister = MCPControllerRegister;
511
+ MCPControllerRegister.hooks = [];
512
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQ29udHJvbGxlclJlZ2lzdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTUNQQ29udHJvbGxlclJlZ2lzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLDhEQUFpQztBQUNqQyx5Q0FBa0U7QUFDbEUsdUNBQWtDO0FBRWxDLHNDQVFxQjtBQUlyQixvRUFBNkU7QUFDN0UsMEZBQW1HO0FBQ25HLG9FQUFvRTtBQUNwRSxpRUFBeUY7QUFDekYsZ0RBQWdEO0FBRWhELHdEQUFrQztBQUNsQyxnRUFBdUM7QUFFdkMsMkNBQXdDO0FBa0J4QyxNQUFhLHFCQUFxQjtJQWlCaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFtQixFQUFFLGNBQWtDLEVBQUUsR0FBZ0I7UUFDckYsSUFBQSxxQkFBTSxFQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUsscUJBQWMsQ0FBQyxHQUFHLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMscUJBQXFCLENBQUMsUUFBUSxHQUFHLElBQUkscUJBQXFCLENBQUMsS0FBSyxFQUFFLGNBQW1DLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUcsQ0FBQztRQUNELHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUVELFlBQVksTUFBb0IsRUFBRSxjQUFpQyxFQUFFLEdBQWdCO1FBckI3RSxxQkFBZ0IsR0FBbUIsRUFBRSxDQUFDO1FBQ3RDLCtCQUEwQixHQUFtQixFQUFFLENBQUM7UUFDeEQsZUFBVSxHQUF1QyxFQUFFLENBQUM7UUFDcEQsbUJBQWMsR0FBRyxJQUFJLEdBQUcsRUFBK0QsQ0FBQztRQU14RixxQkFBZ0IsR0FBa0QsRUFBRSxDQUFDO1FBYW5FLElBQUksQ0FBQyxHQUFHLEdBQUcs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
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "tegg"
8
8
  ]
9
9
  },
10
- "version": "3.53.0",
10
+ "version": "3.56.0",
11
11
  "description": "controller decorator for egg",
12
12
  "keywords": [
13
13
  "egg",
@@ -19,6 +19,8 @@
19
19
  "files": [
20
20
  "app.js",
21
21
  "app.d.ts",
22
+ "config/**/*.js",
23
+ "config/**/*.d.ts",
22
24
  "lib/**/*.js",
23
25
  "lib/**/*.d.ts",
24
26
  "app/**/*.js",
@@ -46,23 +48,27 @@
46
48
  "node": ">=14.0.0"
47
49
  },
48
50
  "dependencies": {
49
- "@eggjs/egg-module-common": "^3.53.0",
51
+ "@eggjs/egg-module-common": "^3.56.0",
52
+ "@eggjs/mcp-proxy": "^3.56.0",
50
53
  "@eggjs/router": "^2.0.1",
51
- "@eggjs/tegg": "^3.53.0",
52
- "@eggjs/tegg-common-util": "^3.53.0",
53
- "@eggjs/tegg-loader": "^3.53.0",
54
- "@eggjs/tegg-metadata": "^3.53.0",
55
- "@eggjs/tegg-runtime": "^3.53.0",
54
+ "@eggjs/tegg": "^3.56.0",
55
+ "@eggjs/tegg-common-util": "^3.56.0",
56
+ "@eggjs/tegg-loader": "^3.56.0",
57
+ "@eggjs/tegg-metadata": "^3.56.0",
58
+ "@eggjs/tegg-runtime": "^3.56.0",
59
+ "@modelcontextprotocol/sdk": "^1.10.0",
60
+ "content-type": "^1.0.5",
56
61
  "egg-errors": "^2.3.0",
57
62
  "globby": "^10.0.2",
58
63
  "koa-compose": "^3.2.1",
59
64
  "path-to-regexp": "^1.8.0",
65
+ "raw-body": "^2.5.2",
60
66
  "sdk-base": "^4.2.0"
61
67
  },
62
68
  "devDependencies": {
63
- "@eggjs/module-test-util": "^3.53.0",
64
- "@eggjs/tegg-config": "^3.53.0",
65
- "@eggjs/tegg-plugin": "^3.53.0",
69
+ "@eggjs/module-test-util": "^3.56.0",
70
+ "@eggjs/tegg-config": "^3.56.0",
71
+ "@eggjs/tegg-plugin": "^3.56.0",
66
72
  "@types/mocha": "^10.0.1",
67
73
  "@types/node": "^20.2.4",
68
74
  "cross-env": "^7.0.3",
@@ -76,5 +82,5 @@
76
82
  "publishConfig": {
77
83
  "access": "public"
78
84
  },
79
- "gitHead": "ce2d38c61483393e1f3c86f2635aa3f4fa226c81"
85
+ "gitHead": "2a40c01ffd60b28598b3dd2ad763dbc97330e746"
80
86
  }
@@ -1,11 +1,12 @@
1
1
  import 'egg';
2
2
  import '@eggjs/tegg-plugin';
3
+ import '@eggjs/mcp-proxy';
3
4
  import { RootProtoManager } from '../lib/RootProtoManager';
4
5
  import { ControllerRegisterFactory } from '../lib/ControllerRegisterFactory';
5
6
  import { ControllerMetaBuilderFactory } from '@eggjs/tegg';
6
7
 
7
8
  declare module 'egg' {
8
- export interface TEggControllerApp {
9
+ export interface TEggControllerApp extends MCPProxyApp {
9
10
  rootProtoManager: RootProtoManager;
10
11
  controllerRegisterFactory: ControllerRegisterFactory;
11
12
  controllerMetaBuilderFactory: typeof ControllerMetaBuilderFactory;