@nestia/sdk 11.2.1 → 11.3.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 (59) hide show
  1. package/assets/bundle/distribute/package.json +1 -1
  2. package/lib/NestiaSdkApplication.js +17 -2
  3. package/lib/NestiaSdkApplication.js.map +1 -1
  4. package/lib/NestiaSwaggerComposer.js +2 -0
  5. package/lib/NestiaSwaggerComposer.js.map +1 -1
  6. package/lib/analyses/AccessorAnalyzer.d.ts +4 -1
  7. package/lib/analyses/AccessorAnalyzer.js.map +1 -1
  8. package/lib/analyses/ReflectControllerAnalyzer.js +3 -2
  9. package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
  10. package/lib/analyses/ReflectMcpOperationAnalyzer.d.ts +20 -0
  11. package/lib/analyses/ReflectMcpOperationAnalyzer.js +84 -0
  12. package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -0
  13. package/lib/analyses/TypedMcpRouteAnalyzer.d.ts +15 -0
  14. package/lib/analyses/TypedMcpRouteAnalyzer.js +40 -0
  15. package/lib/analyses/TypedMcpRouteAnalyzer.js.map +1 -0
  16. package/lib/generates/SdkGenerator.js +48 -0
  17. package/lib/generates/SdkGenerator.js.map +1 -1
  18. package/lib/generates/internal/ImportDictionary.d.ts +1 -0
  19. package/lib/generates/internal/ImportDictionary.js +5 -4
  20. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  21. package/lib/generates/internal/SdkDistributionComposer.d.ts +1 -0
  22. package/lib/generates/internal/SdkDistributionComposer.js +8 -1
  23. package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
  24. package/lib/generates/internal/SdkFileProgrammer.js +4 -1
  25. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  26. package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +25 -0
  27. package/lib/generates/internal/SdkMcpRouteProgrammer.js +192 -0
  28. package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -0
  29. package/lib/generates/internal/SdkRouteDirectory.d.ts +2 -1
  30. package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
  31. package/lib/structures/IReflectController.d.ts +2 -1
  32. package/lib/structures/IReflectMcpOperation.d.ts +37 -0
  33. package/lib/structures/IReflectMcpOperation.js +3 -0
  34. package/lib/structures/IReflectMcpOperation.js.map +1 -0
  35. package/lib/structures/IReflectMcpOperationParameter.d.ts +21 -0
  36. package/lib/structures/IReflectMcpOperationParameter.js +3 -0
  37. package/lib/structures/IReflectMcpOperationParameter.js.map +1 -0
  38. package/lib/structures/ITypedApplication.d.ts +2 -1
  39. package/lib/structures/ITypedMcpRoute.d.ts +33 -0
  40. package/lib/structures/ITypedMcpRoute.js +3 -0
  41. package/lib/structures/ITypedMcpRoute.js.map +1 -0
  42. package/package.json +5 -4
  43. package/src/NestiaSdkApplication.ts +23 -3
  44. package/src/NestiaSwaggerComposer.ts +1 -0
  45. package/src/analyses/AccessorAnalyzer.ts +7 -10
  46. package/src/analyses/ReflectControllerAnalyzer.ts +8 -1
  47. package/src/analyses/ReflectMcpOperationAnalyzer.ts +124 -0
  48. package/src/analyses/TypedMcpRouteAnalyzer.ts +40 -0
  49. package/src/generates/SdkGenerator.ts +55 -0
  50. package/src/generates/internal/ImportDictionary.ts +10 -8
  51. package/src/generates/internal/SdkDistributionComposer.ts +6 -0
  52. package/src/generates/internal/SdkFileProgrammer.ts +6 -2
  53. package/src/generates/internal/SdkMcpRouteProgrammer.ts +469 -0
  54. package/src/generates/internal/SdkRouteDirectory.ts +4 -1
  55. package/src/structures/IReflectController.ts +4 -1
  56. package/src/structures/IReflectMcpOperation.ts +40 -0
  57. package/src/structures/IReflectMcpOperationParameter.ts +29 -0
  58. package/src/structures/ITypedApplication.ts +2 -1
  59. package/src/structures/ITypedMcpRoute.ts +35 -0
@@ -19,6 +19,7 @@ const MapUtil_1 = require("../../utils/MapUtil");
19
19
  const FilePrinter_1 = require("./FilePrinter");
20
20
  const ImportDictionary_1 = require("./ImportDictionary");
21
21
  const SdkHttpRouteProgrammer_1 = require("./SdkHttpRouteProgrammer");
22
+ const SdkMcpRouteProgrammer_1 = require("./SdkMcpRouteProgrammer");
22
23
  const SdkRouteDirectory_1 = require("./SdkRouteDirectory");
23
24
  const SdkWebSocketRouteProgrammer_1 = require("./SdkWebSocketRouteProgrammer");
24
25
  var SdkFileProgrammer;
@@ -66,7 +67,9 @@ var SdkFileProgrammer;
66
67
  importer.declarations(route.imports);
67
68
  statements.push(...(route.protocol === "http"
68
69
  ? SdkHttpRouteProgrammer_1.SdkHttpRouteProgrammer.write(project)(importer)(route)
69
- : SdkWebSocketRouteProgrammer_1.SdkWebSocketRouteProgrammer.write(project)(importer)(route)));
70
+ : route.protocol === "websocket"
71
+ ? SdkWebSocketRouteProgrammer_1.SdkWebSocketRouteProgrammer.write(project)(importer)(route)
72
+ : SdkMcpRouteProgrammer_1.SdkMcpRouteProgrammer.write(project)(importer)(route)));
70
73
  if (i !== directory.routes.length - 1)
71
74
  statements.push(FilePrinter_1.FilePrinter.enter());
72
75
  });
@@ -1 +1 @@
1
- {"version":3,"file":"SdkFileProgrammer.js","sourceRoot":"","sources":["../../../src/generates/internal/SdkFileProgrammer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SdkFileProgrammer.js","sourceRoot":"","sources":["../../../src/generates/internal/SdkFileProgrammer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import ts from "typescript";
2
+ import { INestiaProject } from "../../structures/INestiaProject";
3
+ import { ITypedMcpRoute } from "../../structures/ITypedMcpRoute";
4
+ import { ImportDictionary } from "./ImportDictionary";
5
+ /**
6
+ * Emits a typed client wrapper for an MCP tool.
7
+ *
8
+ * Output mirrors `SdkHttpRouteProgrammer` conventions: a top-level async
9
+ * function paired with a namespace that exposes `Input`, `Output`, and
10
+ * `METADATA`. Object output types are wrapped in `Primitive<T>` from typia
11
+ * because MCP round-trips values through JSON, matching the semantics of
12
+ * `Primitive`. Void MCP tools return `Promise<void>`.
13
+ *
14
+ * The response is typed via `CallToolResult` from `@modelcontextprotocol/sdk`
15
+ * and narrowed structurally (`isError === true`, `type === "text"`) rather than
16
+ * asserted with `as any`. The single unavoidable cast is on the `arguments`
17
+ * field of `client.callTool(...)`, which the MCP SDK types as `Record<string,
18
+ * unknown> | undefined`; a user interface without an index signature is not
19
+ * structurally assignable to that record.
20
+ *
21
+ * @author wildduck - https://github.com/wildduck2
22
+ */
23
+ export declare namespace SdkMcpRouteProgrammer {
24
+ const write: (project: INestiaProject) => (importer: ImportDictionary) => (route: ITypedMcpRoute) => ts.Statement[];
25
+ }
@@ -0,0 +1,192 @@
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.SdkMcpRouteProgrammer = void 0;
7
+ const typescript_1 = __importDefault(require("typescript"));
8
+ const FilePrinter_1 = require("./FilePrinter");
9
+ /**
10
+ * Emits a typed client wrapper for an MCP tool.
11
+ *
12
+ * Output mirrors `SdkHttpRouteProgrammer` conventions: a top-level async
13
+ * function paired with a namespace that exposes `Input`, `Output`, and
14
+ * `METADATA`. Object output types are wrapped in `Primitive<T>` from typia
15
+ * because MCP round-trips values through JSON, matching the semantics of
16
+ * `Primitive`. Void MCP tools return `Promise<void>`.
17
+ *
18
+ * The response is typed via `CallToolResult` from `@modelcontextprotocol/sdk`
19
+ * and narrowed structurally (`isError === true`, `type === "text"`) rather than
20
+ * asserted with `as any`. The single unavoidable cast is on the `arguments`
21
+ * field of `client.callTool(...)`, which the MCP SDK types as `Record<string,
22
+ * unknown> | undefined`; a user interface without an index signature is not
23
+ * structurally assignable to that record.
24
+ *
25
+ * @author wildduck - https://github.com/wildduck2
26
+ */
27
+ var SdkMcpRouteProgrammer;
28
+ (function (SdkMcpRouteProgrammer) {
29
+ SdkMcpRouteProgrammer.write = (project) => (importer) => (route) => [
30
+ FilePrinter_1.FilePrinter.description(writeFunction(project)(importer)(route), writeDescription(route)),
31
+ writeNamespace(project)(importer)(route),
32
+ ];
33
+ /* ---------------------------------------------------------
34
+ FUNCTION
35
+ --------------------------------------------------------- */
36
+ const writeFunction = (_project) => (importer) => (route) => {
37
+ const clientType = typescript_1.default.factory.createTypeReferenceNode(importer.external({
38
+ declaration: true,
39
+ file: "@modelcontextprotocol/sdk/client/index.js",
40
+ type: "element",
41
+ name: "Client",
42
+ alias: "McpClient",
43
+ }));
44
+ const callToolResultTypeName = importer.external({
45
+ declaration: true,
46
+ file: "@modelcontextprotocol/sdk/types.js",
47
+ type: "element",
48
+ name: "CallToolResult",
49
+ alias: "McpCallToolResult",
50
+ });
51
+ const isVoid = isVoidReturn(route);
52
+ // Register Primitive import so Output type resolves.
53
+ if (!isVoid)
54
+ importer.external({
55
+ declaration: true,
56
+ file: "typia",
57
+ type: "element",
58
+ name: "Primitive",
59
+ });
60
+ const inputRef = route.input
61
+ ? typescript_1.default.factory.createTypeReferenceNode(`${route.name}.Input`)
62
+ : typescript_1.default.factory.createTypeLiteralNode([]);
63
+ const outputRef = typescript_1.default.factory.createTypeReferenceNode(`${route.name}.Output`);
64
+ const params = [
65
+ typescript_1.default.factory.createParameterDeclaration(undefined, undefined, "client", undefined, clientType),
66
+ ];
67
+ if (route.input) {
68
+ params.push(typescript_1.default.factory.createParameterDeclaration(undefined, undefined, "args", undefined, inputRef));
69
+ }
70
+ const toolNameExpr = typescript_1.default.factory.createPropertyAccessExpression(typescript_1.default.factory.createPropertyAccessExpression(typescript_1.default.factory.createIdentifier(route.name), "METADATA"), "tool");
71
+ const callToolParams = [
72
+ typescript_1.default.factory.createPropertyAssignment("name", toolNameExpr),
73
+ ];
74
+ if (route.input) {
75
+ callToolParams.push(typescript_1.default.factory.createPropertyAssignment("arguments", typescript_1.default.factory.createAsExpression(typescript_1.default.factory.createAsExpression(typescript_1.default.factory.createIdentifier("args"), typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.UnknownKeyword)), typescript_1.default.factory.createTypeReferenceNode("Record", [
76
+ typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword),
77
+ typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.UnknownKeyword),
78
+ ]))));
79
+ }
80
+ const body = typescript_1.default.factory.createBlock([
81
+ // const raw = await client.callTool({ ... });
82
+ // NOTE: callTool returns `CallToolResult | CompatibilityCallToolResult`
83
+ // (the pre-2024-11-05 compat variant has `toolResult`, no
84
+ // `content`). TypeScript cannot narrow the union structurally
85
+ // because both variants carry an `[x: string]: unknown` index
86
+ // signature. Branch at runtime, then cast to CallToolResult
87
+ // once for the modern path.
88
+ typescript_1.default.factory.createVariableStatement(undefined, typescript_1.default.factory.createVariableDeclarationList([
89
+ typescript_1.default.factory.createVariableDeclaration("raw", undefined, undefined, typescript_1.default.factory.createAwaitExpression(typescript_1.default.factory.createCallExpression(typescript_1.default.factory.createPropertyAccessExpression(typescript_1.default.factory.createIdentifier("client"), "callTool"), undefined, [
90
+ typescript_1.default.factory.createObjectLiteralExpression(callToolParams, true),
91
+ ]))),
92
+ ], typescript_1.default.NodeFlags.Const)),
93
+ // if ("toolResult" in raw) throw ...;
94
+ typescript_1.default.factory.createIfStatement(typescript_1.default.factory.createBinaryExpression(typescript_1.default.factory.createStringLiteral("toolResult"), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.InKeyword), typescript_1.default.factory.createIdentifier("raw")), typescript_1.default.factory.createThrowStatement(typescript_1.default.factory.createNewExpression(typescript_1.default.factory.createIdentifier("Error"), undefined, [
95
+ typescript_1.default.factory.createTemplateExpression(typescript_1.default.factory.createTemplateHead('MCP tool "'), [
96
+ typescript_1.default.factory.createTemplateSpan(toolNameExpr, typescript_1.default.factory.createTemplateTail('" returned a legacy (pre-2024-11-05) compatibility result')),
97
+ ]),
98
+ ]))),
99
+ // const result: CallToolResult = raw;
100
+ // Safe: preceding branch rejected the compat variant.
101
+ typescript_1.default.factory.createVariableStatement(undefined, typescript_1.default.factory.createVariableDeclarationList([
102
+ typescript_1.default.factory.createVariableDeclaration("result", undefined, typescript_1.default.factory.createTypeReferenceNode(callToolResultTypeName), typescript_1.default.factory.createAsExpression(typescript_1.default.factory.createIdentifier("raw"), typescript_1.default.factory.createTypeReferenceNode(callToolResultTypeName))),
103
+ ], typescript_1.default.NodeFlags.Const)),
104
+ // if (result.isError === true) throw ...;
105
+ typescript_1.default.factory.createIfStatement(typescript_1.default.factory.createBinaryExpression(typescript_1.default.factory.createPropertyAccessExpression(typescript_1.default.factory.createIdentifier("result"), "isError"), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.EqualsEqualsEqualsToken), typescript_1.default.factory.createTrue()), typescript_1.default.factory.createThrowStatement(typescript_1.default.factory.createNewExpression(typescript_1.default.factory.createIdentifier("Error"), undefined, [
106
+ typescript_1.default.factory.createTemplateExpression(typescript_1.default.factory.createTemplateHead('MCP tool "'), [
107
+ typescript_1.default.factory.createTemplateSpan(toolNameExpr, typescript_1.default.factory.createTemplateTail('" returned isError')),
108
+ ]),
109
+ ]))),
110
+ ...(isVoid
111
+ ? [typescript_1.default.factory.createReturnStatement()]
112
+ : [
113
+ // const first = result.content[0];
114
+ typescript_1.default.factory.createVariableStatement(undefined, typescript_1.default.factory.createVariableDeclarationList([
115
+ typescript_1.default.factory.createVariableDeclaration("first", undefined, undefined, typescript_1.default.factory.createElementAccessExpression(typescript_1.default.factory.createPropertyAccessExpression(typescript_1.default.factory.createIdentifier("result"), "content"), typescript_1.default.factory.createNumericLiteral(0))),
116
+ ], typescript_1.default.NodeFlags.Const)),
117
+ typescript_1.default.factory.createIfStatement(typescript_1.default.factory.createBinaryExpression(typescript_1.default.factory.createBinaryExpression(typescript_1.default.factory.createIdentifier("first"), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.EqualsEqualsEqualsToken), typescript_1.default.factory.createIdentifier("undefined")), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.BarBarToken), typescript_1.default.factory.createBinaryExpression(typescript_1.default.factory.createPropertyAccessExpression(typescript_1.default.factory.createIdentifier("first"), "type"), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.ExclamationEqualsEqualsToken), typescript_1.default.factory.createStringLiteral("text"))), typescript_1.default.factory.createThrowStatement(typescript_1.default.factory.createNewExpression(typescript_1.default.factory.createIdentifier("Error"), undefined, [
118
+ typescript_1.default.factory.createTemplateExpression(typescript_1.default.factory.createTemplateHead('MCP tool "'), [
119
+ typescript_1.default.factory.createTemplateSpan(toolNameExpr, typescript_1.default.factory.createTemplateTail('" returned no text content')),
120
+ ]),
121
+ ]))),
122
+ typescript_1.default.factory.createReturnStatement(typescript_1.default.factory.createAsExpression(typescript_1.default.factory.createCallExpression(typescript_1.default.factory.createPropertyAccessExpression(typescript_1.default.factory.createIdentifier("JSON"), "parse"), undefined, [
123
+ typescript_1.default.factory.createPropertyAccessExpression(typescript_1.default.factory.createIdentifier("first"), "text"),
124
+ ]), outputRef)),
125
+ ]),
126
+ ], true);
127
+ return typescript_1.default.factory.createFunctionDeclaration([
128
+ typescript_1.default.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword),
129
+ typescript_1.default.factory.createModifier(typescript_1.default.SyntaxKind.AsyncKeyword),
130
+ ], undefined, route.name, undefined, params, typescript_1.default.factory.createTypeReferenceNode("Promise", [outputRef]), body);
131
+ };
132
+ /* ---------------------------------------------------------
133
+ NAMESPACE
134
+ --------------------------------------------------------- */
135
+ const writeNamespace = (_project) => (importer) => (route) => {
136
+ const statements = [];
137
+ // Input type alias
138
+ if (route.input) {
139
+ statements.push(typescript_1.default.factory.createTypeAliasDeclaration([typescript_1.default.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], "Input", undefined, typescript_1.default.factory.createTypeReferenceNode(route.input.type.name)));
140
+ }
141
+ // Output type alias
142
+ const isVoid = isVoidReturn(route);
143
+ const outputType = !isVoid && route.returnType !== null
144
+ ? typescript_1.default.factory.createTypeReferenceNode(importer.external({
145
+ declaration: true,
146
+ file: "typia",
147
+ type: "element",
148
+ name: "Primitive",
149
+ }), [
150
+ typescript_1.default.factory.createTypeReferenceNode(unwrapPromise(route.returnType.name)),
151
+ ])
152
+ : typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.VoidKeyword);
153
+ statements.push(typescript_1.default.factory.createTypeAliasDeclaration([typescript_1.default.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], "Output", undefined, outputType));
154
+ // METADATA const
155
+ const metadataProps = [
156
+ typescript_1.default.factory.createPropertyAssignment("protocol", typescript_1.default.factory.createStringLiteral("mcp")),
157
+ typescript_1.default.factory.createPropertyAssignment("tool", typescript_1.default.factory.createStringLiteral(route.toolName)),
158
+ typescript_1.default.factory.createPropertyAssignment("title", route.title === null
159
+ ? typescript_1.default.factory.createNull()
160
+ : typescript_1.default.factory.createStringLiteral(route.title)),
161
+ typescript_1.default.factory.createPropertyAssignment("description", route.toolDescription === null
162
+ ? typescript_1.default.factory.createNull()
163
+ : typescript_1.default.factory.createStringLiteral(route.toolDescription)),
164
+ ];
165
+ statements.push(typescript_1.default.factory.createVariableStatement([typescript_1.default.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], typescript_1.default.factory.createVariableDeclarationList([
166
+ typescript_1.default.factory.createVariableDeclaration("METADATA", undefined, undefined, typescript_1.default.factory.createAsExpression(typescript_1.default.factory.createObjectLiteralExpression(metadataProps, true), typescript_1.default.factory.createTypeReferenceNode("const"))),
167
+ ], typescript_1.default.NodeFlags.Const)));
168
+ return typescript_1.default.factory.createModuleDeclaration([typescript_1.default.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], typescript_1.default.factory.createIdentifier(route.name), typescript_1.default.factory.createModuleBlock(statements), typescript_1.default.NodeFlags.Namespace);
169
+ };
170
+ /* ---------------------------------------------------------
171
+ DESCRIPTION
172
+ --------------------------------------------------------- */
173
+ const writeDescription = (route) => {
174
+ const lines = [];
175
+ if (route.toolDescription)
176
+ lines.push(...route.toolDescription.split("\n"));
177
+ else if (route.description)
178
+ lines.push(...route.description.split("\n"));
179
+ if (lines.length)
180
+ lines.push("");
181
+ lines.push(`@controller ${route.controller.class.name}.${route.function.name || route.name}`, `@tool ${route.toolName}`, `@accessor ${["api", "functional", ...route.accessor].join(".")}`, `@protocol mcp`, `@nestia Generated by Nestia - https://github.com/samchon/nestia`);
182
+ return lines.join("\n");
183
+ };
184
+ const unwrapPromise = (name) => {
185
+ const m = /^Promise<(.+)>$/.exec(name);
186
+ return m ? m[1] : name;
187
+ };
188
+ const isVoidReturn = (route) => route.returnType === null ||
189
+ isVoidName(unwrapPromise(route.returnType.name));
190
+ const isVoidName = (name) => name === "void" || name === "undefined";
191
+ })(SdkMcpRouteProgrammer || (exports.SdkMcpRouteProgrammer = SdkMcpRouteProgrammer = {}));
192
+ //# sourceMappingURL=SdkMcpRouteProgrammer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SdkMcpRouteProgrammer.js","sourceRoot":"","sources":["../../../src/generates/internal/SdkMcpRouteProgrammer.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import { ITypedHttpRoute } from "../../structures/ITypedHttpRoute";
2
+ import { ITypedMcpRoute } from "../../structures/ITypedMcpRoute";
2
3
  import { ITypedWebSocketRoute } from "../../structures/ITypedWebSocketRoute";
3
4
  export declare class SdkRouteDirectory {
4
5
  readonly parent: SdkRouteDirectory | null;
5
6
  readonly name: string;
6
7
  readonly module: string;
7
8
  readonly children: Map<string, SdkRouteDirectory>;
8
- readonly routes: Array<ITypedHttpRoute | ITypedWebSocketRoute>;
9
+ readonly routes: Array<ITypedHttpRoute | ITypedWebSocketRoute | ITypedMcpRoute>;
9
10
  constructor(parent: SdkRouteDirectory | null, name: string);
10
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SdkRouteDirectory.js","sourceRoot":"","sources":["../../../src/generates/internal/SdkRouteDirectory.ts"],"names":[],"mappings":";;;AAGA,MAAa,iBAAiB;IAK5B,YACW,MAAgC,EAChC,IAAY;QADZ,WAAM,GAAN,MAAM,CAA0B;QAChC,SAAI,GAAJ,IAAI,CAAQ;QAErB,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,MAAM;YACT,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;IAC3E,CAAC;CACF;AAdD,8CAcC"}
1
+ {"version":3,"file":"SdkRouteDirectory.js","sourceRoot":"","sources":["../../../src/generates/internal/SdkRouteDirectory.ts"],"names":[],"mappings":";;;AAIA,MAAa,iBAAiB;IAO5B,YACW,MAAgC,EAChC,IAAY;QADZ,WAAM,GAAN,MAAM,CAA0B;QAChC,SAAI,GAAJ,IAAI,CAAQ;QAErB,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,MAAM;YACT,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;IAC3E,CAAC;CACF;AAhBD,8CAgBC"}
@@ -1,5 +1,6 @@
1
1
  import type { VERSION_NEUTRAL } from "@nestjs/common/interfaces";
2
2
  import { IReflectHttpOperation } from "./IReflectHttpOperation";
3
+ import { IReflectMcpOperation } from "./IReflectMcpOperation";
3
4
  import { IReflectWebSocketOperation } from "./IReflectWebSocketOperation";
4
5
  export interface IReflectController {
5
6
  class: Function;
@@ -7,7 +8,7 @@ export interface IReflectController {
7
8
  paths: string[];
8
9
  file: string;
9
10
  versions: Array<string | typeof VERSION_NEUTRAL> | undefined;
10
- operations: Array<IReflectHttpOperation | IReflectWebSocketOperation>;
11
+ operations: Array<IReflectHttpOperation | IReflectWebSocketOperation | IReflectMcpOperation>;
11
12
  security: Record<string, string[]>[];
12
13
  tags: string[];
13
14
  }
@@ -0,0 +1,37 @@
1
+ import ts from "typescript";
2
+ import { IReflectImport } from "./IReflectImport";
3
+ import { IReflectMcpOperationParameter } from "./IReflectMcpOperationParameter";
4
+ import { IReflectType } from "./IReflectType";
5
+ /**
6
+ * Reflected operation metadata for a method decorated with `@McpRoute`.
7
+ *
8
+ * Produced by {@link ReflectMcpOperationAnalyzer.analyze}; consumed by
9
+ * {@link TypedMcpRouteAnalyzer.analyze} to produce the final
10
+ * {@link ITypedMcpRoute}.
11
+ *
12
+ * @author wildduck - https://github.com/wildduck2
13
+ */
14
+ export interface IReflectMcpOperation {
15
+ protocol: "mcp";
16
+ name: string;
17
+ toolName: string;
18
+ title: string | null;
19
+ toolDescription: string | null;
20
+ inputSchema: object;
21
+ outputSchema: object | null;
22
+ annotations: IReflectMcpOperation.IAnnotations | null;
23
+ function: Function;
24
+ parameters: IReflectMcpOperationParameter[];
25
+ returnType: IReflectType | null;
26
+ imports: IReflectImport[];
27
+ description: string | null;
28
+ jsDocTags: ts.JSDocTagInfo[];
29
+ }
30
+ export declare namespace IReflectMcpOperation {
31
+ interface IAnnotations {
32
+ readOnlyHint?: boolean;
33
+ destructiveHint?: boolean;
34
+ idempotentHint?: boolean;
35
+ openWorldHint?: boolean;
36
+ }
37
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IReflectMcpOperation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IReflectMcpOperation.js","sourceRoot":"","sources":["../../src/structures/IReflectMcpOperation.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { IJsDocTagInfo } from "typia";
2
+ import { IReflectImport } from "./IReflectImport";
3
+ import { IReflectType } from "./IReflectType";
4
+ /**
5
+ * Parameter descriptor for an MCP tool method. Reflected from
6
+ * `"nestia/McpRoute/Parameters"` metadata plus compile-time type information
7
+ * collected by the nestia transformer.
8
+ *
9
+ * @author wildduck - https://github.com/wildduck2
10
+ */
11
+ export interface IReflectMcpOperationParameter {
12
+ category: "params";
13
+ name: string;
14
+ index: number;
15
+ type: IReflectType;
16
+ imports: IReflectImport[];
17
+ description: string | null;
18
+ jsDocTags: IJsDocTagInfo[];
19
+ }
20
+ export declare namespace IReflectMcpOperationParameter {
21
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IReflectMcpOperationParameter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IReflectMcpOperationParameter.js","sourceRoot":"","sources":["../../src/structures/IReflectMcpOperationParameter.ts"],"names":[],"mappings":""}
@@ -1,9 +1,10 @@
1
1
  import { IMetadataDictionary } from "@typia/core";
2
2
  import { INestiaProject } from "./INestiaProject";
3
3
  import { ITypedHttpRoute } from "./ITypedHttpRoute";
4
+ import { ITypedMcpRoute } from "./ITypedMcpRoute";
4
5
  import { ITypedWebSocketRoute } from "./ITypedWebSocketRoute";
5
6
  export interface ITypedApplication {
6
7
  project: INestiaProject;
7
8
  collection: IMetadataDictionary;
8
- routes: Array<ITypedHttpRoute | ITypedWebSocketRoute>;
9
+ routes: Array<ITypedHttpRoute | ITypedWebSocketRoute | ITypedMcpRoute>;
9
10
  }
@@ -0,0 +1,33 @@
1
+ import ts from "typescript";
2
+ import { IReflectController } from "./IReflectController";
3
+ import { IReflectImport } from "./IReflectImport";
4
+ import { IReflectMcpOperation } from "./IReflectMcpOperation";
5
+ import { IReflectMcpOperationParameter } from "./IReflectMcpOperationParameter";
6
+ import { IReflectType } from "./IReflectType";
7
+ /**
8
+ * Final typed representation of an MCP tool route.
9
+ *
10
+ * Carries everything the SDK generator needs to emit a typed client function:
11
+ * the controller reference, accessor path, typia-derived input schema, and
12
+ * input/output type info.
13
+ *
14
+ * @author wildduck - https://github.com/wildduck2
15
+ */
16
+ export interface ITypedMcpRoute {
17
+ protocol: "mcp";
18
+ controller: IReflectController;
19
+ name: string;
20
+ toolName: string;
21
+ title: string | null;
22
+ toolDescription: string | null;
23
+ accessor: string[];
24
+ function: Function;
25
+ input: IReflectMcpOperationParameter | null;
26
+ returnType: IReflectType | null;
27
+ inputSchema: object;
28
+ outputSchema: object | null;
29
+ annotations: IReflectMcpOperation.IAnnotations | null;
30
+ imports: IReflectImport[];
31
+ description: string | null;
32
+ jsDocTags: ts.JSDocTagInfo[];
33
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ITypedMcpRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITypedMcpRoute.js","sourceRoot":"","sources":["../../src/structures/ITypedMcpRoute.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestia/sdk",
3
- "version": "11.2.1",
3
+ "version": "11.3.0",
4
4
  "description": "Nestia SDK and Swagger generator",
5
5
  "main": "lib/index.js",
6
6
  "exports": {
@@ -58,13 +58,14 @@
58
58
  "tsconfig-paths": "^4.1.1",
59
59
  "tstl": "^3.0.0",
60
60
  "typia": "12.1.0",
61
- "@nestia/core": "^11.2.1",
62
- "@nestia/fetcher": "^11.2.1"
61
+ "@nestia/core": "^11.3.0",
62
+ "@nestia/fetcher": "^11.3.0"
63
63
  },
64
64
  "peerDependencies": {
65
- "@nestia/core": "^11.2.1"
65
+ "@nestia/core": "^11.3.0"
66
66
  },
67
67
  "devDependencies": {
68
+ "@modelcontextprotocol/sdk": "^1.18.0",
68
69
  "@nestjs/common": "^11.1.6",
69
70
  "@nestjs/core": "^11.1.6",
70
71
  "@types/cli": "^0.11.21",
@@ -9,6 +9,7 @@ import { ConfigAnalyzer } from "./analyses/ConfigAnalyzer";
9
9
  import { PathAnalyzer } from "./analyses/PathAnalyzer";
10
10
  import { ReflectControllerAnalyzer } from "./analyses/ReflectControllerAnalyzer";
11
11
  import { TypedHttpRouteAnalyzer } from "./analyses/TypedHttpRouteAnalyzer";
12
+ import { TypedMcpRouteAnalyzer } from "./analyses/TypedMcpRouteAnalyzer";
12
13
  import { TypedWebSocketRouteAnalyzer } from "./analyses/TypedWebSocketRouteAnalyzer";
13
14
  import { E2eGenerator } from "./generates/E2eGenerator";
14
15
  import { SdkGenerator } from "./generates/SdkGenerator";
@@ -18,6 +19,7 @@ import { IReflectController } from "./structures/IReflectController";
18
19
  import { IReflectOperationError } from "./structures/IReflectOperationError";
19
20
  import { ITypedApplication } from "./structures/ITypedApplication";
20
21
  import { ITypedHttpRoute } from "./structures/ITypedHttpRoute";
22
+ import { ITypedMcpRoute } from "./structures/ITypedMcpRoute";
21
23
  import { ITypedWebSocketRoute } from "./structures/ITypedWebSocketRoute";
22
24
  import { IOperationMetadata } from "./transformers/IOperationMetadata";
23
25
  import { StringUtil } from "./utils/StringUtil";
@@ -162,7 +164,11 @@ export class NestiaSdkApplication {
162
164
  const set: HashSet<Pair<string, string>> = new HashSet();
163
165
  for (const controller of controllers)
164
166
  for (const controllerPath of controller.paths)
165
- for (const operation of controller.operations)
167
+ for (const operation of controller.operations) {
168
+ if (operation.protocol === "mcp") {
169
+ set.insert(new Pair(`mcp:${operation.toolName}`, "mcp"));
170
+ continue;
171
+ }
166
172
  for (const operationPath of operation.paths)
167
173
  set.insert(
168
174
  new Pair(
@@ -170,6 +176,7 @@ export class NestiaSdkApplication {
170
176
  operation.protocol === "http" ? operation.method : "",
171
177
  ),
172
178
  );
179
+ }
173
180
  return set.size();
174
181
  })();
175
182
 
@@ -180,7 +187,9 @@ export class NestiaSdkApplication {
180
187
  .map(
181
188
  (c) =>
182
189
  c.paths.length *
183
- c.operations.map((f) => f.paths.length).reduce((a, b) => a + b, 0),
190
+ c.operations
191
+ .map((f) => (f.protocol === "mcp" ? 1 : f.paths.length))
192
+ .reduce((a, b) => a + b, 0),
184
193
  )
185
194
  .reduce((a, b) => a + b, 0)}`,
186
195
  );
@@ -196,9 +205,20 @@ export class NestiaSdkApplication {
196
205
 
197
206
  // CONVERT TO TYPED OPERATIONS
198
207
  const globalPrefix: string = project.input.globalPrefix?.prefix ?? "";
199
- const routes: Array<ITypedHttpRoute | ITypedWebSocketRoute> = [];
208
+ const routes: Array<
209
+ ITypedHttpRoute | ITypedWebSocketRoute | ITypedMcpRoute
210
+ > = [];
200
211
  for (const c of controllers)
201
212
  for (const o of c.operations) {
213
+ if (o.protocol === "mcp") {
214
+ routes.push(
215
+ ...TypedMcpRouteAnalyzer.analyze({
216
+ controller: c,
217
+ operation: o,
218
+ }),
219
+ );
220
+ continue;
221
+ }
202
222
  const pathList: Set<string> = new Set();
203
223
  const versions: string[] = VersioningStrategy.merge(project)([
204
224
  ...(c.versions ?? []),
@@ -68,6 +68,7 @@ export namespace NestiaSwaggerComposer {
68
68
  const routes: ITypedHttpRoute[] = [];
69
69
  for (const c of controllers)
70
70
  for (const o of c.operations) {
71
+ if (o.protocol === "mcp") continue;
71
72
  const pathList: Set<string> = new Set();
72
73
  const versions: string[] = VersioningStrategy.merge(project)([
73
74
  ...(c.versions ?? []),
@@ -1,21 +1,20 @@
1
1
  import { NamingConvention } from "@typia/utils";
2
2
 
3
3
  import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
4
+ import { ITypedMcpRoute } from "../structures/ITypedMcpRoute";
4
5
  import { ITypedWebSocketRoute } from "../structures/ITypedWebSocketRoute";
5
6
 
7
+ type AnyRoute = ITypedHttpRoute | ITypedWebSocketRoute | ITypedMcpRoute;
8
+
6
9
  export namespace AccessorAnalyzer {
7
- export const analyze = (
8
- routes: Array<ITypedHttpRoute | ITypedWebSocketRoute>,
9
- ) => {
10
+ export const analyze = (routes: Array<AnyRoute>) => {
10
11
  shrink(routes);
11
12
  variable(routes);
12
13
  shrink(routes);
13
14
  for (const r of routes) r.name = r.accessor.at(-1) ?? r.name;
14
15
  };
15
16
 
16
- const prepare = (
17
- routeList: Array<ITypedHttpRoute | ITypedWebSocketRoute>,
18
- ): Map<string, number> => {
17
+ const prepare = (routeList: Array<AnyRoute>): Map<string, number> => {
19
18
  const dict: Map<string, number> = new Map();
20
19
  for (const route of routeList)
21
20
  route.accessor.forEach((_a, i) => {
@@ -25,9 +24,7 @@ export namespace AccessorAnalyzer {
25
24
  return dict;
26
25
  };
27
26
 
28
- const variable = (
29
- routeList: Array<ITypedHttpRoute | ITypedWebSocketRoute>,
30
- ) => {
27
+ const variable = (routeList: Array<AnyRoute>) => {
31
28
  const dict: Map<string, number> = prepare(routeList);
32
29
  for (const route of routeList) {
33
30
  const emended: string[] = route.accessor.slice();
@@ -49,7 +46,7 @@ export namespace AccessorAnalyzer {
49
46
  }
50
47
  };
51
48
 
52
- const shrink = (routeList: Array<ITypedHttpRoute | ITypedWebSocketRoute>) => {
49
+ const shrink = (routeList: Array<AnyRoute>) => {
53
50
  const dict: Map<string, number> = prepare(routeList);
54
51
  for (const route of routeList) {
55
52
  if (
@@ -8,10 +8,12 @@ import { INestiaProject } from "../structures/INestiaProject";
8
8
  import { INestiaSdkInput } from "../structures/INestiaSdkInput";
9
9
  import { IReflectController } from "../structures/IReflectController";
10
10
  import { IReflectHttpOperation } from "../structures/IReflectHttpOperation";
11
+ import { IReflectMcpOperation } from "../structures/IReflectMcpOperation";
11
12
  import { IReflectWebSocketOperation } from "../structures/IReflectWebSocketOperation";
12
13
  import { IOperationMetadata } from "../transformers/IOperationMetadata";
13
14
  import { ArrayUtil } from "../utils/ArrayUtil";
14
15
  import { ReflectHttpOperationAnalyzer } from "./ReflectHttpOperationAnalyzer";
16
+ import { ReflectMcpOperationAnalyzer } from "./ReflectMcpOperationAnalyzer";
15
17
  import { ReflectMetadataAnalyzer } from "./ReflectMetadataAnalyzer";
16
18
  import { ReflectWebSocketOperationAnalyzer } from "./ReflectWebSocketOperationAnalyzer";
17
19
 
@@ -81,7 +83,12 @@ export namespace ReflectControllerAnalyzer {
81
83
  function: value,
82
84
  metadata,
83
85
  };
84
- const child: IReflectHttpOperation | IReflectWebSocketOperation | null =
86
+ const child:
87
+ | IReflectHttpOperation
88
+ | IReflectWebSocketOperation
89
+ | IReflectMcpOperation
90
+ | null =
91
+ ReflectMcpOperationAnalyzer.analyze(next) ??
85
92
  ReflectWebSocketOperationAnalyzer.analyze(next) ??
86
93
  ReflectHttpOperationAnalyzer.analyze(next);
87
94
  if (child !== null) controller.operations.push(child);