@ttsc/graph 0.16.8 → 0.16.10

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.
@@ -12,10 +12,11 @@ const runTrace_1 = require("./server/runTrace");
12
12
  * The MCP tool surface as a plain class over the resident
13
13
  * {@link TtscGraphMemory}.
14
14
  *
15
- * Its public method is the MCP tool: `typia.llm.controller` reflects
15
+ * Its public method is the MCP tool: `typia.llm.application` reflects
16
16
  * {@link ITtscGraphApplication} to generate the tool's JSON schema and argument
17
- * validator from the signature and JSDoc, with no hand-written schema. The
18
- * method delegates to the pure graph functions in `./server`, which are
17
+ * validator from the signature and JSDoc, with no hand-written schema, and
18
+ * `@typia/mcp`'s `createMcpServer` registers it (see `./server/createServer`).
19
+ * The method delegates to the pure graph functions in `./server`, which are
19
20
  * unit-testable without a transport; this class only binds them to the graph.
20
21
  *
21
22
  * Every method answers from the resident graph; none recompiles. Output is kept
@@ -63,6 +64,7 @@ class TtscGraphApplication {
63
64
  result: (0, runTour_1.runTour)(this.graph(), props.request),
64
65
  };
65
66
  default:
67
+ props.request;
66
68
  throw new Error("Unknown graph request type");
67
69
  }
68
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TtscGraphApplication.js","sourceRoot":"","sources":["../src/TtscGraphApplication.ts"],"names":[],"mappings":";;;AACA,sDAA+D;AAC/D,oDAAiD;AACjD,4DAAyD;AACzD,kDAA+C;AAC/C,sDAAmD;AACnD,8CAA2C;AAC3C,gDAA6C;AAM7C;;;;;;;;;;;;;GAaG;AACH;IACmB,KAAK,CAAwB;IAE9C,YAAmB,MAAuB;QACxC,IAAI,CAAC,KAAK,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IACpE,CAAC;IAEM,wBAAwB,CAC7B,KAAmC;QAEnC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACzC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC3C,CAAC;YACD,OAAO;gBACL,MAAM;aACP,CAAC;QACJ,CAAC;QACD,QAAQ,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC3B,KAAK,aAAa;gBAChB,OAAO;oBACL,MAAM,EAAE,IAAA,+BAAc,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBACpD,CAAC;YACJ,KAAK,QAAQ;gBACX,OAAO;oBACL,MAAM,EAAE,IAAA,qBAAS,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBAC/C,CAAC;YACJ,KAAK,OAAO;gBACV,OAAO;oBACL,MAAM,EAAE,IAAA,mBAAQ,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBAC9C,CAAC;YACJ,KAAK,SAAS;gBACZ,OAAO;oBACL,MAAM,EAAE,IAAA,uBAAU,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBAChD,CAAC;YACJ,KAAK,UAAU;gBACb,OAAO;oBACL,MAAM,EAAE,IAAA,yBAAW,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBACjD,CAAC;YACJ,KAAK,MAAM;gBACT,OAAO;oBACL,MAAM,EAAE,IAAA,iBAAO,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBAC7C,CAAC;YACJ;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAEO,MAAM,CACZ,MAAc,EACd,QAAiB,EACjB,MAAM,GAAqC,SAAS;QAEpD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI;YACb,MAAM;YACN,IAAI,EAAE,IAAA,wBAAU,EACd,MAAM,EACN,QAAQ;gBACN,8DAA8D,CACjE;YACD,KAAK,EAAE,IAAA,yBAAW,EAChB,qFAAqF,CACtF;YACD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"TtscGraphApplication.js","sourceRoot":"","sources":["../src/TtscGraphApplication.ts"],"names":[],"mappings":";;;AACA,sDAA+D;AAC/D,oDAAiD;AACjD,4DAAyD;AACzD,kDAA+C;AAC/C,sDAAmD;AACnD,8CAA2C;AAC3C,gDAA6C;AAM7C;;;;;;;;;;;;;;GAcG;AACH;IACmB,KAAK,CAAwB;IAE9C,YAAmB,MAAuB;QACxC,IAAI,CAAC,KAAK,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IACpE,CAAC;IAEM,wBAAwB,CAC7B,KAAmC;QAEnC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACzC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC3C,CAAC;YACD,OAAO;gBACL,MAAM;aACP,CAAC;QACJ,CAAC;QACD,QAAQ,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC3B,KAAK,aAAa;gBAChB,OAAO;oBACL,MAAM,EAAE,IAAA,+BAAc,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBACpD,CAAC;YACJ,KAAK,QAAQ;gBACX,OAAO;oBACL,MAAM,EAAE,IAAA,qBAAS,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBAC/C,CAAC;YACJ,KAAK,OAAO;gBACV,OAAO;oBACL,MAAM,EAAE,IAAA,mBAAQ,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBAC9C,CAAC;YACJ,KAAK,SAAS;gBACZ,OAAO;oBACL,MAAM,EAAE,IAAA,uBAAU,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBAChD,CAAC;YACJ,KAAK,UAAU;gBACb,OAAO;oBACL,MAAM,EAAE,IAAA,yBAAW,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBACjD,CAAC;YACJ,KAAK,MAAM;gBACT,OAAO;oBACL,MAAM,EAAE,IAAA,iBAAO,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;iBAC7C,CAAC;YACJ;gBACE,KAAK,CAAC,OAAuB,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAEO,MAAM,CACZ,MAAc,EACd,QAAiB,EACjB,MAAM,GAAqC,SAAS;QAEpD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI;YACb,MAAM;YACN,IAAI,EAAE,IAAA,wBAAU,EACd,MAAM,EACN,QAAQ;gBACN,8DAA8D,CACjE;YACD,KAAK,EAAE,IAAA,yBAAW,EAChB,qFAAqF,CACtF;YACD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC;CACF"}
@@ -39,30 +39,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.createServer = createServer;
40
40
  const _a = __importStar(require("typia/lib/internal/_llmApplicationFinalize"));
41
41
  const _b = __importStar(require("typia/lib/internal/_validateReport"));
42
- const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
43
- const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
42
+ const mcp_1 = require("@typia/mcp");
44
43
  const typia_1 = __importDefault(require("typia"));
45
44
  const TtscGraphApplication_1 = require("../TtscGraphApplication");
46
45
  /**
47
- * Build the MCP server for a graph. `typia.llm.controller` reflects
48
- * {@link ITtscGraphApplication} into a validated tool application. Every tool's
49
- * JSON schema and argument validator is generated from the method's TypeScript
50
- * types and JSDoc, so there is no hand-written schema. The list/call handlers
51
- * below are the minimal standalone registration: list the generated functions,
52
- * and on a call validate the arguments (returning typia's errors for the model
53
- * to self-correct) before invoking the method.
46
+ * Build the MCP server for a graph. `typia.llm.application` reflects
47
+ * {@link ITtscGraphApplication} into the tool schema and validator (no
48
+ * hand-written schema), and `createMcpServer` from `@typia/mcp` handles the
49
+ * list/call registration, argument validation, and structured output.
54
50
  *
55
- * Registration is inlined rather than pulled from `@typia/mcp` to keep the
56
- * dependency surface to `typia` plus the MCP SDK and avoid version-pinning the
57
- * wider typia ecosystem; the shape it relies on is `typia.llm.controller`'s
58
- * public output.
51
+ * We assemble the `ILlmController` (`{ protocol, name, application, execute }`)
52
+ * directly rather than via `typia.llm.controller` so the server is named
53
+ * "ttsc-graph" on our terms, not coupled to a reflected class name. Handshake
54
+ * instructions come from the class JSDoc; the single tool is named from its
55
+ * method, `inspect_typescript_graph`.
59
56
  */
60
57
  function createServer(graph, version) {
61
58
  const controller = {
62
- "protocol": "class",
63
- "name": "graph",
64
- "execute": new TtscGraphApplication_1.TtscGraphApplication(graph),
65
- "application": _a._llmApplicationFinalize({
59
+ protocol: "class",
60
+ name: "ttsc-graph",
61
+ application: _a._llmApplicationFinalize({
66
62
  description: "## What This MCP Is\n\n`inspect_typescript_graph` returns a compiler-built TypeScript graph contract\nfor the current source snapshot.\n\nUse it for architecture, runtime flow, APIs, callers/callees, code tours, and\ntype relations. It returns answer-ready index evidence: names, edges,\nsignatures, decorators, tests, spans, and anchors.\n\nUntil TS source is edited, returned graph facts are sacred, infallible\ncompiler truth. Never verify them with files or more graph calls.\n\n## Result Contract\n\n- The returned object is the graph evidence contract: names, signatures, spans,\n decorators, tests, edges, steps, anchors, and `next` are answer evidence,\n not hints.\n- When `next.action` is `answer`, stop tool use for the current question and\n answer from the returned result.\n- `truncated` means the answer surface hit an index cap. Mention the cap if it\n matters; do not expand every branch to compensate.\n- When `next.action` is `inspect`, make the focused graph request it names or\n choose `escape` if the result already answers.\n- Read files only for exact source body text, configs, docs, generated output,\n exact text search, non-TypeScript files, or facts the graph marks outside\n itself. A returned span is a citation anchor, not a reading command.\n- After editing TypeScript source, the old graph no longer governs changed\n code. Rebuild/reload the graph or verify changed code normally.\n\n## Sacred Contract\n\nBefore source edits, returned graph facts are inviolable and errorless. Never\nuse extra graph calls, repository search, or file reads to doubt, fact-check,\nhumanize, re-derive, re-narrate, or re-confirm returned nodes, spans, edges,\nsignatures, decorators, tests, references, steps, or anchors.\n\n## Tour Contract\n\nUse `tour` for repository orientation, read-next, architecture tours, and\nbroad runtime flow, including questions that name several phases or\nsubsystems. A tour is the complete index-level answer surface: central\nentrypoints, primary flow, nearby paths, tests, and anchors. Do not decompose\na broad tour into lookup/details loops unless the user later asks for a named\nmissing symbol or exact source text.\n\n## Use Contract\n\n1. Ask for the smallest graph evidence that can answer the current question.\n2. Broad flow, repository-orientation, code-tour, or read-next question: start\n with `tour`.\n3. Concrete named symbol: use `lookup`, then `details` only if needed.\n4. Known endpoint pair or one selected handle: use one `trace`.\n5. Unknown narrow orientation: use `entrypoints` once.\n6. Selected symbol shape: use `details` for one to three handles.\n7. Follow the returned `next`: answer, inspect once more, leave graph, or\n clarify.\n8. Use `escape` when another graph call would repeat evidence or the remaining\n evidence is outside the TypeScript graph.\n\nMost TypeScript structure answers need one or two graph calls.\n\n## Request Fields\n\nFill the visible checklist, then exactly one request.\n\n- `question`: restate the code question being considered.\n- `draft`: initial request type and why it seems smallest.\n- `review`: correct a wrong, broad, stale, or duplicate draft. If graph facts\n already answer, if prior `next.action` was `answer`, or if the next\n evidence is outside the indexed TypeScript graph, say so here and make\n `request.type` be `escape`. If a broad flow draft is not `tour`, correct it\n here.\n- `request`: final request after review.\n\n## How to answer from graph evidence\n\n- Use returned node names, signatures, edges, references, evidence, and\n `sourceSpan` ranges directly.\n- Explain the central path first, then mention important branches.\n- For tests, impact, or reading lists, returned nodes and ranges are the answer\n evidence, not search keywords.\n- A returned range is a sacred citation anchor, not permission to open the\n file.",
67
63
  functions: [
68
64
  {
@@ -2066,64 +2062,9 @@ function createServer(graph, version) {
2066
2062
  })()
2067
2063
  }
2068
2064
  ]
2069
- })
2065
+ }),
2066
+ execute: new TtscGraphApplication_1.TtscGraphApplication(graph),
2070
2067
  };
2071
- const functions = controller.application.functions;
2072
- const execute = controller.execute;
2073
- const server = new mcp_js_1.McpServer({ name: "ttsc-graph", version }, {
2074
- capabilities: { tools: {} },
2075
- // The MCP `instructions` are the interface's JSDoc, which
2076
- // `typia.llm.controller` reflects onto `application.description`. See
2077
- // {@link ITtscGraphApplication}.
2078
- instructions: controller.application.description,
2079
- });
2080
- const raw = server.server;
2081
- raw.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
2082
- tools: functions.map((func) => ({
2083
- name: func.name,
2084
- description: func.description,
2085
- inputSchema: {
2086
- type: "object",
2087
- properties: func.parameters.properties,
2088
- required: func.parameters.required,
2089
- additionalProperties: false,
2090
- $defs: func.parameters.$defs,
2091
- },
2092
- })),
2093
- }));
2094
- raw.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
2095
- const func = functions.find((f) => f.name === request.params.name);
2096
- const method = execute[request.params.name];
2097
- if (func === undefined || method === undefined) {
2098
- return error(`Unknown tool: ${request.params.name}`);
2099
- }
2100
- // Validate an empty object when a client omits `arguments`, so typia can
2101
- // return field-level errors instead of a generic "expected object".
2102
- const validation = func.validate(request.params.arguments ?? {});
2103
- if (!validation.success) {
2104
- // Hand typia's validation errors back so the model can correct its call.
2105
- return error(JSON.stringify(validation.errors, null, 2));
2106
- }
2107
- try {
2108
- const result = await method.call(execute, validation.data);
2109
- return {
2110
- content: [
2111
- {
2112
- type: "text",
2113
- text: result === undefined ? "Success" : JSON.stringify(result),
2114
- },
2115
- ],
2116
- };
2117
- }
2118
- catch (exception) {
2119
- return error(exception instanceof Error
2120
- ? `${exception.name}: ${exception.message}`
2121
- : String(exception));
2122
- }
2123
- });
2124
- return server;
2125
- }
2126
- function error(text) {
2127
- return { isError: true, content: [{ type: "text", text }] };
2068
+ return (0, mcp_1.createMcpServer)(controller, version);
2128
2069
  }
2129
2070
  //# sourceMappingURL=createServer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/server/createServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/server/createServer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ttsc/graph",
3
- "version": "0.16.8",
3
+ "version": "0.16.10",
4
4
  "description": "Checker-resolved architecture graph over MCP for coding agents, backed by ttsc's in-process TypeScript-Go compiler.",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -16,7 +16,8 @@
16
16
  },
17
17
  "dependencies": {
18
18
  "@modelcontextprotocol/sdk": "^1.26.0",
19
- "typia": "13.0.0-dev.20260701.1"
19
+ "@typia/mcp": "13.0.0-rc.1",
20
+ "typia": "13.0.0-rc.1"
20
21
  },
21
22
  "keywords": [
22
23
  "ttsc",
@@ -38,7 +39,7 @@
38
39
  "three": "^0.184.0",
39
40
  "three-forcegraph": "^1.43.4",
40
41
  "typescript": "7.0.1-rc",
41
- "ttsc": "0.16.8"
42
+ "ttsc": "0.16.10"
42
43
  },
43
44
  "repository": {
44
45
  "type": "git",
@@ -15,10 +15,11 @@ export type TtscGraphSource = TtscGraphMemory | (() => TtscGraphMemory);
15
15
  * The MCP tool surface as a plain class over the resident
16
16
  * {@link TtscGraphMemory}.
17
17
  *
18
- * Its public method is the MCP tool: `typia.llm.controller` reflects
18
+ * Its public method is the MCP tool: `typia.llm.application` reflects
19
19
  * {@link ITtscGraphApplication} to generate the tool's JSON schema and argument
20
- * validator from the signature and JSDoc, with no hand-written schema. The
21
- * method delegates to the pure graph functions in `./server`, which are
20
+ * validator from the signature and JSDoc, with no hand-written schema, and
21
+ * `@typia/mcp`'s `createMcpServer` registers it (see `./server/createServer`).
22
+ * The method delegates to the pure graph functions in `./server`, which are
22
23
  * unit-testable without a transport; this class only binds them to the graph.
23
24
  *
24
25
  * Every method answers from the resident graph; none recompiles. Output is kept
@@ -70,6 +71,7 @@ export class TtscGraphApplication implements ITtscGraphApplication {
70
71
  result: runTour(this.graph(), props.request),
71
72
  };
72
73
  default:
74
+ props.request satisfies never;
73
75
  throw new Error("Unknown graph request type");
74
76
  }
75
77
  }
@@ -1,106 +1,31 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import {
3
- CallToolRequestSchema,
4
- ListToolsRequestSchema,
5
- } from "@modelcontextprotocol/sdk/types.js";
6
- import typia from "typia";
2
+ import { createMcpServer } from "@typia/mcp";
3
+ import typia, { type ILlmController } from "typia";
7
4
 
8
5
  import { TtscGraphApplication, TtscGraphSource } from "../TtscGraphApplication";
9
- import { TtscGraphMemory } from "../model/TtscGraphMemory";
10
6
  import { ITtscGraphApplication } from "../structures/ITtscGraphApplication";
11
7
 
12
8
  /**
13
- * Build the MCP server for a graph. `typia.llm.controller` reflects
14
- * {@link ITtscGraphApplication} into a validated tool application. Every tool's
15
- * JSON schema and argument validator is generated from the method's TypeScript
16
- * types and JSDoc, so there is no hand-written schema. The list/call handlers
17
- * below are the minimal standalone registration: list the generated functions,
18
- * and on a call validate the arguments (returning typia's errors for the model
19
- * to self-correct) before invoking the method.
9
+ * Build the MCP server for a graph. `typia.llm.application` reflects
10
+ * {@link ITtscGraphApplication} into the tool schema and validator (no
11
+ * hand-written schema), and `createMcpServer` from `@typia/mcp` handles the
12
+ * list/call registration, argument validation, and structured output.
20
13
  *
21
- * Registration is inlined rather than pulled from `@typia/mcp` to keep the
22
- * dependency surface to `typia` plus the MCP SDK and avoid version-pinning the
23
- * wider typia ecosystem; the shape it relies on is `typia.llm.controller`'s
24
- * public output.
14
+ * We assemble the `ILlmController` (`{ protocol, name, application, execute }`)
15
+ * directly rather than via `typia.llm.controller` so the server is named
16
+ * "ttsc-graph" on our terms, not coupled to a reflected class name. Handshake
17
+ * instructions come from the class JSDoc; the single tool is named from its
18
+ * method, `inspect_typescript_graph`.
25
19
  */
26
20
  export function createServer(
27
21
  graph: TtscGraphSource,
28
22
  version: string,
29
23
  ): McpServer {
30
- const controller = typia.llm.controller<ITtscGraphApplication>(
31
- "graph",
32
- new TtscGraphApplication(graph),
33
- );
34
- const functions = controller.application.functions;
35
- const execute = controller.execute as unknown as Record<
36
- string,
37
- (input: unknown) => unknown
38
- >;
39
-
40
- const server = new McpServer(
41
- { name: "ttsc-graph", version },
42
- {
43
- capabilities: { tools: {} },
44
- // The MCP `instructions` are the interface's JSDoc, which
45
- // `typia.llm.controller` reflects onto `application.description`. See
46
- // {@link ITtscGraphApplication}.
47
- instructions: controller.application.description,
48
- },
49
- );
50
- const raw = server.server;
51
-
52
- raw.setRequestHandler(ListToolsRequestSchema, async () => ({
53
- tools: functions.map((func) => ({
54
- name: func.name,
55
- description: func.description,
56
- inputSchema: {
57
- type: "object" as const,
58
- properties: func.parameters.properties,
59
- required: func.parameters.required,
60
- additionalProperties: false,
61
- $defs: func.parameters.$defs,
62
- },
63
- })),
64
- }));
65
-
66
- raw.setRequestHandler(CallToolRequestSchema, async (request) => {
67
- const func = functions.find((f) => f.name === request.params.name);
68
- const method = execute[request.params.name];
69
- if (func === undefined || method === undefined) {
70
- return error(`Unknown tool: ${request.params.name}`);
71
- }
72
- // Validate an empty object when a client omits `arguments`, so typia can
73
- // return field-level errors instead of a generic "expected object".
74
- const validation = func.validate(request.params.arguments ?? {});
75
- if (!validation.success) {
76
- // Hand typia's validation errors back so the model can correct its call.
77
- return error(JSON.stringify(validation.errors, null, 2));
78
- }
79
- try {
80
- const result = await method.call(execute, validation.data);
81
- return {
82
- content: [
83
- {
84
- type: "text" as const,
85
- text: result === undefined ? "Success" : JSON.stringify(result),
86
- },
87
- ],
88
- };
89
- } catch (exception) {
90
- return error(
91
- exception instanceof Error
92
- ? `${exception.name}: ${exception.message}`
93
- : String(exception),
94
- );
95
- }
96
- });
97
-
98
- return server;
99
- }
100
-
101
- function error(text: string): {
102
- isError: true;
103
- content: { type: "text"; text: string }[];
104
- } {
105
- return { isError: true, content: [{ type: "text", text }] };
24
+ const controller: ILlmController<ITtscGraphApplication> = {
25
+ protocol: "class",
26
+ name: "ttsc-graph",
27
+ application: typia.llm.application<ITtscGraphApplication>(),
28
+ execute: new TtscGraphApplication(graph),
29
+ };
30
+ return createMcpServer(controller, version);
106
31
  }