|
| 1 | +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; |
| 2 | +import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; |
| 3 | +import { LangiumEvaluator, type LangiumEvaluatorResultData } from 'langium-ai-tools'; |
| 4 | +import { createLangiumGrammarServices } from 'langium/grammar'; |
| 5 | + |
| 6 | +import { NodeFileSystem } from 'langium/node'; |
| 7 | +import { z } from 'zod'; |
| 8 | + |
| 9 | +const server = new McpServer({ |
| 10 | + name: 'langium-mpc-server', |
| 11 | + version: '1.0.0' |
| 12 | +}); |
| 13 | + |
| 14 | +server.registerTool('langium-syntax-checker', |
| 15 | + { |
| 16 | + title: 'Langium Evaluator Tool', |
| 17 | + description: 'Checks Langium code for errors', |
| 18 | + inputSchema: { code: z.string() } |
| 19 | + }, |
| 20 | + async ({ code }) => { |
| 21 | + const validationResult = await validateLangiumCode(code); |
| 22 | + return { |
| 23 | + content: [ |
| 24 | + { |
| 25 | + type: 'text', |
| 26 | + text: validationResult ?? 'The provided Langium code has no issues.' |
| 27 | + } |
| 28 | + ] |
| 29 | + } |
| 30 | + } |
| 31 | +); |
| 32 | + |
| 33 | +export const langiumEvaluator = new LangiumEvaluator(createLangiumGrammarServices(NodeFileSystem).grammar); |
| 34 | + |
| 35 | +export async function validateLangiumCode(code: string): Promise<string | undefined> { |
| 36 | + const evalResult = await langiumEvaluator.evaluate(code); |
| 37 | + if (evalResult.data) { |
| 38 | + const langiumData = evalResult.data as LangiumEvaluatorResultData; |
| 39 | + if (langiumData.diagnostics.length > 0) { |
| 40 | + return langiumData.diagnostics.map(d => |
| 41 | + `${asText(d.severity)}: ${d.message} at line ${d.range.start.line + 1}, column ${d.range.start.character + 1}` |
| 42 | + ).join('\n'); |
| 43 | + } |
| 44 | + } |
| 45 | + return undefined; |
| 46 | +} |
| 47 | + |
| 48 | +function asText(severity: number | undefined): string { |
| 49 | + |
| 50 | + switch (severity) { |
| 51 | + case 1: return 'Error'; |
| 52 | + case 2: return 'Warning'; |
| 53 | + case 3: return 'Information'; |
| 54 | + case 4: return 'Hint'; |
| 55 | + default: return 'Unknown'; |
| 56 | + } |
| 57 | +} |
| 58 | + |
| 59 | +const transport = new StdioServerTransport(); |
| 60 | +await server.connect(transport); |
0 commit comments