seo-mcp-server
Version:
SEO MCP Server (minimal) - ai_content_detect only
98 lines • 4.36 kB
JavaScript
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
;