@malek0512/loopback4-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +124 -0
  2. package/dist/component.d.ts +8 -0
  3. package/dist/component.d.ts.map +1 -0
  4. package/dist/component.js +67 -0
  5. package/dist/component.js.map +1 -0
  6. package/dist/controllers/index.d.ts +2 -0
  7. package/dist/controllers/index.d.ts.map +1 -0
  8. package/dist/controllers/index.js +18 -0
  9. package/dist/controllers/index.js.map +1 -0
  10. package/dist/controllers/mcp.controller.d.ts +16 -0
  11. package/dist/controllers/mcp.controller.d.ts.map +1 -0
  12. package/dist/controllers/mcp.controller.js +66 -0
  13. package/dist/controllers/mcp.controller.js.map +1 -0
  14. package/dist/decorators/index.d.ts +2 -0
  15. package/dist/decorators/index.d.ts.map +1 -0
  16. package/dist/decorators/index.js +18 -0
  17. package/dist/decorators/index.js.map +1 -0
  18. package/dist/decorators/mcp-tool.decorator.d.ts +21 -0
  19. package/dist/decorators/mcp-tool.decorator.d.ts.map +1 -0
  20. package/dist/decorators/mcp-tool.decorator.js +30 -0
  21. package/dist/decorators/mcp-tool.decorator.js.map +1 -0
  22. package/dist/execution/context-manager.d.ts +14 -0
  23. package/dist/execution/context-manager.d.ts.map +1 -0
  24. package/dist/execution/context-manager.js +41 -0
  25. package/dist/execution/context-manager.js.map +1 -0
  26. package/dist/execution/index.d.ts +4 -0
  27. package/dist/execution/index.d.ts.map +1 -0
  28. package/dist/execution/index.js +20 -0
  29. package/dist/execution/index.js.map +1 -0
  30. package/dist/execution/result-formatter.d.ts +16 -0
  31. package/dist/execution/result-formatter.d.ts.map +1 -0
  32. package/dist/execution/result-formatter.js +102 -0
  33. package/dist/execution/result-formatter.js.map +1 -0
  34. package/dist/execution/tool-executor.d.ts +12 -0
  35. package/dist/execution/tool-executor.d.ts.map +1 -0
  36. package/dist/execution/tool-executor.js +72 -0
  37. package/dist/execution/tool-executor.js.map +1 -0
  38. package/dist/index.d.ts +6 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +25 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/observers/index.d.ts +2 -0
  43. package/dist/observers/index.d.ts.map +1 -0
  44. package/dist/observers/index.js +18 -0
  45. package/dist/observers/index.js.map +1 -0
  46. package/dist/observers/mcp-boot.observer.d.ts +9 -0
  47. package/dist/observers/mcp-boot.observer.d.ts.map +1 -0
  48. package/dist/observers/mcp-boot.observer.js +36 -0
  49. package/dist/observers/mcp-boot.observer.js.map +1 -0
  50. package/dist/protocol/index.d.ts +4 -0
  51. package/dist/protocol/index.d.ts.map +1 -0
  52. package/dist/protocol/index.js +20 -0
  53. package/dist/protocol/index.js.map +1 -0
  54. package/dist/protocol/json-rpc.handler.d.ts +10 -0
  55. package/dist/protocol/json-rpc.handler.d.ts.map +1 -0
  56. package/dist/protocol/json-rpc.handler.js +63 -0
  57. package/dist/protocol/json-rpc.handler.js.map +1 -0
  58. package/dist/protocol/message-router.d.ts +18 -0
  59. package/dist/protocol/message-router.d.ts.map +1 -0
  60. package/dist/protocol/message-router.js +106 -0
  61. package/dist/protocol/message-router.js.map +1 -0
  62. package/dist/protocol/types.d.ts +227 -0
  63. package/dist/protocol/types.d.ts.map +1 -0
  64. package/dist/protocol/types.js +56 -0
  65. package/dist/protocol/types.js.map +1 -0
  66. package/dist/registry/index.d.ts +4 -0
  67. package/dist/registry/index.d.ts.map +1 -0
  68. package/dist/registry/index.js +20 -0
  69. package/dist/registry/index.js.map +1 -0
  70. package/dist/registry/metadata-scanner.d.ts +13 -0
  71. package/dist/registry/metadata-scanner.d.ts.map +1 -0
  72. package/dist/registry/metadata-scanner.js +101 -0
  73. package/dist/registry/metadata-scanner.js.map +1 -0
  74. package/dist/registry/schema-generator.d.ts +19 -0
  75. package/dist/registry/schema-generator.d.ts.map +1 -0
  76. package/dist/registry/schema-generator.js +90 -0
  77. package/dist/registry/schema-generator.js.map +1 -0
  78. package/dist/registry/tool-registry.d.ts +23 -0
  79. package/dist/registry/tool-registry.d.ts.map +1 -0
  80. package/dist/registry/tool-registry.js +58 -0
  81. package/dist/registry/tool-registry.js.map +1 -0
  82. package/dist/transport/index.d.ts +2 -0
  83. package/dist/transport/index.d.ts.map +1 -0
  84. package/dist/transport/index.js +18 -0
  85. package/dist/transport/index.js.map +1 -0
  86. package/dist/transport/sse.transport.d.ts +9 -0
  87. package/dist/transport/sse.transport.d.ts.map +1 -0
  88. package/dist/transport/sse.transport.js +67 -0
  89. package/dist/transport/sse.transport.js.map +1 -0
  90. package/package.json +26 -0
  91. package/src/component.ts +58 -0
  92. package/src/controllers/index.ts +1 -0
  93. package/src/controllers/mcp.controller.ts +42 -0
  94. package/src/decorators/index.ts +1 -0
  95. package/src/decorators/mcp-tool.decorator.ts +57 -0
  96. package/src/execution/context-manager.ts +44 -0
  97. package/src/execution/index.ts +3 -0
  98. package/src/execution/result-formatter.ts +104 -0
  99. package/src/execution/tool-executor.ts +61 -0
  100. package/src/index.ts +5 -0
  101. package/src/observers/index.ts +1 -0
  102. package/src/observers/mcp-boot.observer.ts +19 -0
  103. package/src/protocol/index.ts +3 -0
  104. package/src/protocol/json-rpc.handler.ts +77 -0
  105. package/src/protocol/message-router.ts +125 -0
  106. package/src/protocol/types.ts +309 -0
  107. package/src/registry/index.ts +3 -0
  108. package/src/registry/metadata-scanner.ts +105 -0
  109. package/src/registry/schema-generator.ts +82 -0
  110. package/src/registry/tool-registry.ts +57 -0
  111. package/src/transport/index.ts +1 -0
  112. package/src/transport/sse.transport.ts +56 -0
package/README.md ADDED
@@ -0,0 +1,124 @@
1
+ # @malek0512/loopback4-mcp
2
+
3
+ > MCP (Model Context Protocol) component for LoopBack 4 — expose your REST controllers as AI-callable tools via JSON-RPC 2.0 and SSE.
4
+
5
+ ## What it does
6
+
7
+ Adds a `POST /mcp` and `GET /mcp/sse` endpoint to your LoopBack 4 application. Any controller method decorated with `@mcpTool()` is automatically discovered at startup and registered as an MCP tool, making it callable by LLMs and AI agents (Claude, GPT, etc.) through the standard Model Context Protocol.
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npm install @malek0512/loopback4-mcp
13
+ ```
14
+
15
+ Peer dependencies (already present in any LB4 app):
16
+ - `@loopback/core`
17
+ - `@loopback/rest`
18
+ - `@loopback/openapi-v3`
19
+
20
+ ## Usage
21
+
22
+ ### 1. Add `McpComponent` to your application
23
+
24
+ ```typescript
25
+ // src/application.ts
26
+ import {McpComponent} from '@malek0512/loopback4-mcp';
27
+
28
+ export class MyApplication extends BootMixin(ServiceMixin(RepositoryMixin(RestApplication))) {
29
+ constructor(options: ApplicationConfig = {}) {
30
+ super(options);
31
+ this.component(McpComponent); // ← one line
32
+ // ...
33
+ }
34
+ }
35
+ ```
36
+
37
+ ### 2. Decorate controller methods with `@mcpTool()`
38
+
39
+ ```typescript
40
+ import {mcpTool} from '@malek0512/loopback4-mcp';
41
+
42
+ export class OrderController {
43
+ @mcpTool({
44
+ name: 'list_orders',
45
+ description: 'List all orders, optionally filtered by status',
46
+ })
47
+ @get('/orders')
48
+ async find(): Promise<Order[]> {
49
+ return this.orderRepository.find();
50
+ }
51
+
52
+ @mcpTool({
53
+ name: 'create_order',
54
+ description: 'Create a new order',
55
+ })
56
+ @post('/orders')
57
+ async create(@requestBody() order: Omit<Order, 'id'>): Promise<Order> {
58
+ return this.orderRepository.create(order);
59
+ }
60
+
61
+ @mcpTool({
62
+ name: 'delete_order',
63
+ description: 'Delete an order by ID',
64
+ })
65
+ @del('/orders/{id}')
66
+ async deleteById(@param.path.number('id') id: number): Promise<void> {
67
+ return this.orderRepository.deleteById(id);
68
+ }
69
+ }
70
+ ```
71
+
72
+ ### 3. Test with MCP Inspector
73
+
74
+ ```bash
75
+ npm start
76
+ npx @modelcontextprotocol/inspector http://localhost:3000/mcp
77
+ ```
78
+
79
+ ## Endpoints
80
+
81
+ | Method | Path | Description |
82
+ |--------|------|-------------|
83
+ | `POST` | `/mcp` | JSON-RPC 2.0 endpoint (initialize, tools/list, tools/call) |
84
+ | `GET` | `/mcp/sse` | Server-Sent Events transport |
85
+ | `GET` | `/mcp/health` | Health check |
86
+
87
+ ## MCP Methods supported
88
+
89
+ | Method | Description |
90
+ |--------|-------------|
91
+ | `initialize` | MCP handshake |
92
+ | `tools/list` | Returns all `@mcpTool()` decorated methods with their JSON Schema |
93
+ | `tools/call` | Invokes a tool with arguments |
94
+
95
+ ## How `@mcpTool()` options map to MCP
96
+
97
+ ```typescript
98
+ @mcpTool({
99
+ name: 'create_order', // Tool name exposed to LLMs
100
+ description: 'Create order', // Shown in tools/list
101
+ inputSchema: { // Optional: override auto-generated JSON Schema
102
+ type: 'object',
103
+ properties: { ... }
104
+ }
105
+ })
106
+ ```
107
+
108
+ The input schema is auto-generated from your LoopBack decorators (`@param.path`, `@requestBody`, etc.) — you don't need to write it manually.
109
+
110
+ ## Architecture
111
+
112
+ ```
113
+ POST /mcp
114
+ → McpController
115
+ → MessageRouter (JSON-RPC 2.0)
116
+ → tools/list → ToolRegistry.list()
117
+ → tools/call → ToolExecutor → controller method
118
+ ```
119
+
120
+ At startup, `MetadataScanner` scans all controllers tagged `controller`, reads `@mcpTool()` metadata, and registers each method as a `ToolDescriptor` in `ToolRegistry`. Input schemas are generated via `getControllerSpec()` from `@loopback/openapi-v3`.
121
+
122
+ ## License
123
+
124
+ MIT
@@ -0,0 +1,8 @@
1
+ import { Component, Application } from '@loopback/core';
2
+ import { McpController } from './controllers/mcp.controller';
3
+ export declare class McpComponent implements Component {
4
+ private app;
5
+ controllers: (typeof McpController)[];
6
+ constructor(app: Application);
7
+ }
8
+ //# sourceMappingURL=component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAKT,WAAW,EAEZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAW3D,qBAGa,YAAa,YAAW,SAAS;IAK1C,OAAO,CAAC,GAAG;IAJb,WAAW,2BAAmB;gBAIpB,GAAG,EAAE,WAAW;CA6B3B"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.McpComponent = void 0;
16
+ const core_1 = require("@loopback/core");
17
+ const mcp_controller_1 = require("./controllers/mcp.controller");
18
+ const tool_registry_1 = require("./registry/tool-registry");
19
+ const metadata_scanner_1 = require("./registry/metadata-scanner");
20
+ const schema_generator_1 = require("./registry/schema-generator");
21
+ const json_rpc_handler_1 = require("./protocol/json-rpc.handler");
22
+ const message_router_1 = require("./protocol/message-router");
23
+ const tool_executor_1 = require("./execution/tool-executor");
24
+ const context_manager_1 = require("./execution/context-manager");
25
+ const result_formatter_1 = require("./execution/result-formatter");
26
+ const sse_transport_1 = require("./transport/sse.transport");
27
+ let McpComponent = class McpComponent {
28
+ constructor(app) {
29
+ this.app = app;
30
+ this.controllers = [mcp_controller_1.McpController];
31
+ // Bind all MCP services as singletons so state (tool registry, initialized flag) persists across requests
32
+ this.app.bind('mcp.toolRegistry').toClass(tool_registry_1.ToolRegistry).inScope(core_1.BindingScope.SINGLETON);
33
+ this.app.bind('mcp.metadataScanner').toClass(metadata_scanner_1.MetadataScanner).inScope(core_1.BindingScope.SINGLETON);
34
+ this.app.bind('mcp.schemaGenerator').toClass(schema_generator_1.SchemaGenerator).inScope(core_1.BindingScope.SINGLETON);
35
+ this.app.bind('mcp.jsonRpcHandler').toClass(json_rpc_handler_1.JsonRpcHandler).inScope(core_1.BindingScope.SINGLETON);
36
+ this.app.bind('mcp.messageRouter').toClass(message_router_1.MessageRouter).inScope(core_1.BindingScope.SINGLETON);
37
+ this.app.bind('mcp.toolExecutor').toClass(tool_executor_1.ToolExecutor).inScope(core_1.BindingScope.SINGLETON);
38
+ this.app.bind('mcp.contextManager').toClass(context_manager_1.ContextManager).inScope(core_1.BindingScope.SINGLETON);
39
+ this.app.bind('mcp.resultFormatter').toClass(result_formatter_1.ResultFormatter).inScope(core_1.BindingScope.SINGLETON);
40
+ this.app.bind('mcp.sseTransport').toClass(sse_transport_1.SseTransport).inScope(core_1.BindingScope.SINGLETON);
41
+ // Scan for MCP tools after application starts
42
+ this.app.on('started', async () => {
43
+ // Delay scanning to ensure all controllers are fully initialized
44
+ setTimeout(async () => {
45
+ try {
46
+ console.log('[MCP] Scanning for MCP tools...');
47
+ const scanner = await this.app.get('mcp.metadataScanner');
48
+ await scanner.scan();
49
+ const registry = await this.app.get('mcp.toolRegistry');
50
+ console.log(`[MCP] Tool scanning complete. Found ${registry.size} tools.`);
51
+ }
52
+ catch (error) {
53
+ console.error('[MCP] Error scanning tools:', error);
54
+ }
55
+ }, 100);
56
+ });
57
+ }
58
+ };
59
+ exports.McpComponent = McpComponent;
60
+ exports.McpComponent = McpComponent = __decorate([
61
+ (0, core_1.injectable)({
62
+ tags: { [core_1.ContextTags.KEY]: 'components.McpComponent' },
63
+ }),
64
+ __param(0, (0, core_1.inject)(core_1.CoreBindings.APPLICATION_INSTANCE)),
65
+ __metadata("design:paramtypes", [core_1.Application])
66
+ ], McpComponent);
67
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './mcp.controller';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/controllers/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mcp.controller"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/controllers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC"}
@@ -0,0 +1,16 @@
1
+ import { Request, Response } from '@loopback/rest';
2
+ import { MessageRouter } from '../protocol/message-router';
3
+ import { SseTransport } from '../transport/sse.transport';
4
+ import { JsonRpcRequest } from '../protocol/types';
5
+ export declare class McpController {
6
+ private messageRouter;
7
+ private sseTransport;
8
+ constructor(messageRouter: MessageRouter, sseTransport: SseTransport);
9
+ handleMessage(request: JsonRpcRequest): Promise<unknown>;
10
+ handleSse(req: Request, res: Response): Promise<void>;
11
+ health(): Promise<{
12
+ status: string;
13
+ timestamp: number;
14
+ }>;
15
+ }
16
+ //# sourceMappingURL=mcp.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.controller.d.ts","sourceRoot":"","sources":["../../src/controllers/mcp.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,OAAO,EACP,QAAQ,EAGT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAEjD,qBAAa,aAAa;IAGtB,OAAO,CAAC,aAAa;IAErB,OAAO,CAAC,YAAY;gBAFZ,aAAa,EAAE,aAAa,EAE5B,YAAY,EAAE,YAAY;IAI9B,aAAa,CAAgB,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvE,SAAS,CACsB,GAAG,EAAE,OAAO,EACX,GAAG,EAAE,QAAQ,GAChD,OAAO,CAAC,IAAI,CAAC;IAKV,MAAM,IAAI,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,CAAC;CAM7D"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.McpController = void 0;
16
+ const core_1 = require("@loopback/core");
17
+ const rest_1 = require("@loopback/rest");
18
+ const message_router_1 = require("../protocol/message-router");
19
+ const sse_transport_1 = require("../transport/sse.transport");
20
+ let McpController = class McpController {
21
+ constructor(messageRouter, sseTransport) {
22
+ this.messageRouter = messageRouter;
23
+ this.sseTransport = sseTransport;
24
+ }
25
+ async handleMessage(request) {
26
+ return this.messageRouter.route(request);
27
+ }
28
+ async handleSse(req, res) {
29
+ return this.sseTransport.handleConnection(req, res);
30
+ }
31
+ async health() {
32
+ return {
33
+ status: 'ok',
34
+ timestamp: Date.now(),
35
+ };
36
+ }
37
+ };
38
+ exports.McpController = McpController;
39
+ __decorate([
40
+ (0, rest_1.post)('/mcp'),
41
+ __param(0, (0, rest_1.requestBody)()),
42
+ __metadata("design:type", Function),
43
+ __metadata("design:paramtypes", [Object]),
44
+ __metadata("design:returntype", Promise)
45
+ ], McpController.prototype, "handleMessage", null);
46
+ __decorate([
47
+ (0, rest_1.get)('/mcp/sse'),
48
+ __param(0, (0, core_1.inject)(rest_1.RestBindings.Http.REQUEST)),
49
+ __param(1, (0, core_1.inject)(rest_1.RestBindings.Http.RESPONSE)),
50
+ __metadata("design:type", Function),
51
+ __metadata("design:paramtypes", [Object, Object]),
52
+ __metadata("design:returntype", Promise)
53
+ ], McpController.prototype, "handleSse", null);
54
+ __decorate([
55
+ (0, rest_1.get)('/mcp/health'),
56
+ __metadata("design:type", Function),
57
+ __metadata("design:paramtypes", []),
58
+ __metadata("design:returntype", Promise)
59
+ ], McpController.prototype, "health", null);
60
+ exports.McpController = McpController = __decorate([
61
+ __param(0, (0, core_1.inject)('mcp.messageRouter')),
62
+ __param(1, (0, core_1.inject)('mcp.sseTransport')),
63
+ __metadata("design:paramtypes", [message_router_1.MessageRouter,
64
+ sse_transport_1.SseTransport])
65
+ ], McpController);
66
+ //# sourceMappingURL=mcp.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.controller.js","sourceRoot":"","sources":["../../src/controllers/mcp.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yCAAsC;AACtC,yCAOwB;AACxB,+DAAyD;AACzD,8DAAwD;AAGxD,IAAa,aAAa,GAA1B,MAAa,aAAa;IACxB,YAEU,aAA4B,EAE5B,YAA0B;QAF1B,kBAAa,GAAb,aAAa,CAAe;QAE5B,iBAAY,GAAZ,YAAY,CAAc;IACjC,CAAC;IAGE,AAAN,KAAK,CAAC,aAAa,CAAgB,OAAuB;QACxD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAGK,AAAN,KAAK,CAAC,SAAS,CACsB,GAAY,EACX,GAAa;QAEjD,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM;QACV,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;CACF,CAAA;AA5BY,sCAAa;AASlB;IADL,IAAA,WAAI,EAAC,MAAM,CAAC;IACQ,WAAA,IAAA,kBAAW,GAAE,CAAA;;;;kDAEjC;AAGK;IADL,IAAA,UAAG,EAAC,UAAU,CAAC;IAEb,WAAA,IAAA,aAAM,EAAC,mBAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACjC,WAAA,IAAA,aAAM,EAAC,mBAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;;;;8CAGpC;AAGK;IADL,IAAA,UAAG,EAAC,aAAa,CAAC;;;;2CAMlB;wBA3BU,aAAa;IAErB,WAAA,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAA;IAE3B,WAAA,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAA;qCADJ,8BAAa;QAEd,4BAAY;GALzB,aAAa,CA4BzB"}
@@ -0,0 +1,2 @@
1
+ export * from './mcp-tool.decorator';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mcp-tool.decorator"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC"}
@@ -0,0 +1,21 @@
1
+ import { JsonSchema } from '../protocol/types';
2
+ export declare const MCP_TOOL_METADATA_KEY = "mcp:tool";
3
+ export interface McpToolMetadata {
4
+ name: string;
5
+ description?: string;
6
+ inputSchema?: JsonSchema;
7
+ preHook?: {
8
+ binding?: string;
9
+ function?: Function;
10
+ };
11
+ postHook?: {
12
+ binding?: string;
13
+ function?: Function;
14
+ };
15
+ }
16
+ export declare function mcpTool(metadata: McpToolMetadata): MethodDecorator;
17
+ export declare namespace McpToolMetadata {
18
+ function getMetadata(target: Object, methodName: string): McpToolMetadata | undefined;
19
+ function getAllMetadata(target: Object): Map<string, McpToolMetadata>;
20
+ }
21
+ //# sourceMappingURL=mcp-tool.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool.decorator.d.ts","sourceRoot":"","sources":["../../src/decorators/mcp-tool.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAE7C,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;KACrB,CAAC;CACH;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,eAAe,CAMlE;AAED,yBAAiB,eAAe,CAAC;IAC/B,SAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,eAAe,GAAG,SAAS,CAM7B;IAED,SAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAgB3E;CACF"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.McpToolMetadata = exports.MCP_TOOL_METADATA_KEY = void 0;
4
+ exports.mcpTool = mcpTool;
5
+ const core_1 = require("@loopback/core");
6
+ exports.MCP_TOOL_METADATA_KEY = 'mcp:tool';
7
+ function mcpTool(metadata) {
8
+ return core_1.MethodDecoratorFactory.createDecorator(exports.MCP_TOOL_METADATA_KEY, metadata, { decoratorName: '@mcpTool' });
9
+ }
10
+ var McpToolMetadata;
11
+ (function (McpToolMetadata) {
12
+ function getMetadata(target, methodName) {
13
+ return core_1.MetadataInspector.getMethodMetadata(exports.MCP_TOOL_METADATA_KEY, target, methodName);
14
+ }
15
+ McpToolMetadata.getMetadata = getMetadata;
16
+ function getAllMetadata(target) {
17
+ const metadata = new Map();
18
+ const proto = Object.getPrototypeOf(target);
19
+ const methodNames = Object.getOwnPropertyNames(proto).filter(name => typeof proto[name] === 'function' && name !== 'constructor');
20
+ for (const methodName of methodNames) {
21
+ const toolMetadata = getMetadata(target, methodName);
22
+ if (toolMetadata) {
23
+ metadata.set(methodName, toolMetadata);
24
+ }
25
+ }
26
+ return metadata;
27
+ }
28
+ McpToolMetadata.getAllMetadata = getAllMetadata;
29
+ })(McpToolMetadata || (exports.McpToolMetadata = McpToolMetadata = {}));
30
+ //# sourceMappingURL=mcp-tool.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool.decorator.js","sourceRoot":"","sources":["../../src/decorators/mcp-tool.decorator.ts"],"names":[],"mappings":";;;AAmBA,0BAMC;AAzBD,yCAAyE;AAG5D,QAAA,qBAAqB,GAAG,UAAU,CAAC;AAgBhD,SAAgB,OAAO,CAAC,QAAyB;IAC/C,OAAO,6BAAsB,CAAC,eAAe,CAC3C,6BAAqB,EACrB,QAAQ,EACR,EAAC,aAAa,EAAE,UAAU,EAAC,CAC5B,CAAC;AACJ,CAAC;AAED,IAAiB,eAAe,CA6B/B;AA7BD,WAAiB,eAAe;IAC9B,SAAgB,WAAW,CACzB,MAAc,EACd,UAAkB;QAElB,OAAO,wBAAiB,CAAC,iBAAiB,CACxC,6BAAqB,EACrB,MAAM,EACN,UAAU,CACX,CAAC;IACJ,CAAC;IATe,2BAAW,cAS1B,CAAA;IAED,SAAgB,cAAc,CAAC,MAAc;QAC3C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,MAAM,CAC1D,IAAI,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,IAAI,IAAI,KAAK,aAAa,CACpE,CAAC;QAEF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,YAAY,EAAE,CAAC;gBACjB,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAhBe,8BAAc,iBAgB7B,CAAA;AACH,CAAC,EA7BgB,eAAe,+BAAf,eAAe,QA6B/B"}
@@ -0,0 +1,14 @@
1
+ export interface ExecutionContext {
2
+ toolName: string;
3
+ arguments: Record<string, unknown>;
4
+ timestamp: number;
5
+ requestId?: string;
6
+ }
7
+ export declare class ContextManager {
8
+ private contexts;
9
+ createContext(toolName: string, args: Record<string, unknown>, requestId?: string): ExecutionContext;
10
+ getContext(requestId: string): ExecutionContext | undefined;
11
+ clearContext(requestId: string): boolean;
12
+ clearAll(): void;
13
+ }
14
+ //# sourceMappingURL=context-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.d.ts","sourceRoot":"","sources":["../../src/execution/context-manager.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBACa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAuC;IAEvD,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,CAAC,EAAE,MAAM,GACjB,gBAAgB;IAenB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI3D,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIxC,QAAQ,IAAI,IAAI;CAGjB"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ContextManager = void 0;
10
+ const core_1 = require("@loopback/core");
11
+ let ContextManager = class ContextManager {
12
+ constructor() {
13
+ this.contexts = new Map();
14
+ }
15
+ createContext(toolName, args, requestId) {
16
+ const context = {
17
+ toolName,
18
+ arguments: args,
19
+ timestamp: Date.now(),
20
+ requestId,
21
+ };
22
+ if (requestId) {
23
+ this.contexts.set(requestId, context);
24
+ }
25
+ return context;
26
+ }
27
+ getContext(requestId) {
28
+ return this.contexts.get(requestId);
29
+ }
30
+ clearContext(requestId) {
31
+ return this.contexts.delete(requestId);
32
+ }
33
+ clearAll() {
34
+ this.contexts.clear();
35
+ }
36
+ };
37
+ exports.ContextManager = ContextManager;
38
+ exports.ContextManager = ContextManager = __decorate([
39
+ (0, core_1.bind)({ scope: core_1.BindingScope.SINGLETON })
40
+ ], ContextManager);
41
+ //# sourceMappingURL=context-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/execution/context-manager.ts"],"names":[],"mappings":";;;;;;;;;AAAA,yCAAkD;AAU3C,IAAM,cAAc,GAApB,MAAM,cAAc;IAApB;QACG,aAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAgCzD,CAAC;IA9BC,aAAa,CACX,QAAgB,EAChB,IAA6B,EAC7B,SAAkB;QAElB,MAAM,OAAO,GAAqB;YAChC,QAAQ;YACR,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS;SACV,CAAC;QAEF,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,YAAY,CAAC,SAAiB;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF,CAAA;AAjCY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,WAAI,EAAC,EAAC,KAAK,EAAE,mBAAY,CAAC,SAAS,EAAC,CAAC;GACzB,cAAc,CAiC1B"}
@@ -0,0 +1,4 @@
1
+ export * from './tool-executor';
2
+ export * from './context-manager';
3
+ export * from './result-formatter';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./tool-executor"), exports);
18
+ __exportStar(require("./context-manager"), exports);
19
+ __exportStar(require("./result-formatter"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,oDAAkC;AAClC,qDAAmC"}
@@ -0,0 +1,16 @@
1
+ import { Content } from '../protocol/types';
2
+ export declare class ResultFormatter {
3
+ /**
4
+ * Format the result of a tool execution into MCP Content format
5
+ */
6
+ format(result: unknown): Content[];
7
+ /**
8
+ * Format an error into MCP Content format
9
+ */
10
+ formatError(error: unknown): Content[];
11
+ private isContentArray;
12
+ private isContent;
13
+ private hasContentProperty;
14
+ private toTextContent;
15
+ }
16
+ //# sourceMappingURL=result-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-formatter.d.ts","sourceRoot":"","sources":["../../src/execution/result-formatter.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAc,MAAM,mBAAmB,CAAC;AAEvD,qBACa,eAAe;IAC1B;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE;IAelC;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE;IA8BtC,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,aAAa;CAoBtB"}