UNPKG

seo-mcp-server

Version:

SEO MCP Server (minimal) - ai_content_detect only

98 lines 4.36 kB
#!/usr/bin/env node "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SEOServer = void 0; const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js"); const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js"); const types_js_1 = require("@modelcontextprotocol/sdk/types.js"); const aiContentDetect_js_1 = require("./tools/aiContentDetect.js"); class SEOServer { server; constructor() { this.server = new index_js_1.Server({ name: 'seo-mcp-server', version: '3.0.5', }, { capabilities: { tools: {}, }, }); // 将环境变量中的 API Key 注入全局,供工具使用 const envKey = process.env.SEO_MCP_AI_DETECT_API_KEY; globalThis.__SEO_MCP_AI_DETECT_API_KEY__ = envKey; this.setupToolHandlers(); // 禁止启动期输出,避免宿主将stderr/stdout当作协议噪声 this.server.onerror = () => { }; process.on('SIGINT', async () => { await this.server.close(); process.exit(0); }); } setupToolHandlers() { // 仅注册 ai_content_detect this.server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => { return { tools: [ { name: 'ai_content_detect', description: 'AI内容生成检测:在内容生成后、SEO质检前进行AI痕迹检测,返回percent、linesscore、mintxt,并给出pass/review/fail与下一步动作建议', inputSchema: { type: 'object', properties: { content: { type: 'string', description: '检测文本(建议≥100字)' }, configId: { type: 'string', description: '可选:配置ID(预留多账号/多环境扩展)' }, locale: { type: 'string', description: '语言标识,默认zh-CN' }, thresholds: { type: 'object', properties: { maxPercent: { type: 'number', description: '通过上限(默认35)' }, reviewPercent: { type: 'number', description: '复核上限(默认55)' }, minLineScore: { type: 'number', description: '逐段最低分阈值(默认3)' } } } }, required: ['content'] } } ] }; }); this.server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; try { switch (name) { case 'ai_content_detect': { const key = process.env.SEO_MCP_AI_DETECT_API_KEY; globalThis.__SEO_MCP_AI_DETECT_API_KEY__ = key; const res = await (0, aiContentDetect_js_1.aiContentDetect)(args); return { content: [{ type: 'text', text: JSON.stringify(res, null, 2) }] }; } default: throw new Error(`Unknown tool: ${name}`); } } catch (error) { return { content: [ { type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` } ], isError: true }; } }); } async run() { const transport = new stdio_js_1.StdioServerTransport(); await this.server.connect(transport); // 静默启动:不向 stdout/stderr 输出任何非协议内容 } } exports.SEOServer = SEOServer; const server = new SEOServer(); server.run().catch(console.error); //# sourceMappingURL=index.js.map