UNPKG

textlint

Version:

The pluggable linting tool for natural language.

112 lines (96 loc) 3 kB
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; import pkgConf from "read-pkg-up"; import { createLinter, loadTextlintrc, type CreateLinterOptions } from "../index.js"; const version = pkgConf.sync({ cwd: __dirname }).pkg.version; const server = new McpServer({ name: "textlint", version }); const makeLinterOptions = async (): Promise<CreateLinterOptions> => { const descriptor = await loadTextlintrc(); return { descriptor }; }; server.tool( "lintFile", "Lint files using textlint", { filePaths: z.array(z.string().min(1)).nonempty() }, async ({ filePaths }) => { const linterOptions = await makeLinterOptions(); const linter = createLinter(linterOptions); const results = await linter.lintFiles(filePaths); const content = results.map((result) => ({ type: "text" as const, text: JSON.stringify(result) })); return { content }; } ); server.tool( "lintText", "Lint text using textlint", { text: z.string().nonempty(), stdinFilename: z.string().nonempty() }, async ({ text, stdinFilename }) => { const linterOptions = await makeLinterOptions(); const linter = createLinter(linterOptions); const result = await linter.lintText(text, stdinFilename); const content = [ { type: "text" as const, text: JSON.stringify(result) } ]; return { content }; } ); server.tool( "getLintFixedFileContent", "Get lint-fixed content of files using textlint", { filePaths: z.array(z.string().min(1)).nonempty() }, async ({ filePaths }) => { const linterOptions = await makeLinterOptions(); const linter = createLinter(linterOptions); const results = await linter.fixFiles(filePaths); const content = results.map((result) => ({ type: "text" as const, text: JSON.stringify(result) })); return { content }; } ); server.tool( "getLintFixedTextContent", "Get lint-fixed content of text using textlint", { text: z.string().nonempty(), stdinFilename: z.string().nonempty() }, async ({ text, stdinFilename }) => { const linterOptions = await makeLinterOptions(); const linter = createLinter(linterOptions); const result = await linter.fixText(text, stdinFilename); const content = [ { type: "text" as const, text: JSON.stringify(result) } ]; return { content }; } ); const connectStdioMcpServer = async () => { const transport = new StdioServerTransport(); await server.connect(transport); return server; }; export { connectStdioMcpServer, server };