- M1-M2: 数据层与核心API(DuckDB, entries/tags/comments/search服务) - M3: SSR页面(EJS模板,接真实数据) - M4: 管理后台(登录/用户/内容源/AI ingest) - M5: 采集层(scheduler+rss/html/eryajf适配器) - M6: MCP只读接口(Streamable HTTP, 4工具) - M7: Docker部署(Dockerfile+docker-compose) - 测试: 10个用例全部通过 - 修复: DuckDB连接参数绑定、状态机迁移、标签树操作
43 lines
1.3 KiB
JavaScript
43 lines
1.3 KiB
JavaScript
import { Router } from "express";
|
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
import { registerTools } from "./tools.js";
|
|
|
|
export const mcpRouter = Router();
|
|
|
|
mcpRouter.post("/mcp", async (req, res) => {
|
|
try {
|
|
const server = new McpServer({
|
|
name: "awesome-index",
|
|
version: "0.1.0",
|
|
});
|
|
registerTools(server);
|
|
|
|
const transport = new StreamableHTTPServerTransport({
|
|
sessionIdGenerator: undefined,
|
|
enableJsonResponse: true,
|
|
});
|
|
|
|
res.on("close", async () => {
|
|
await transport.close();
|
|
await server.close();
|
|
});
|
|
|
|
await server.connect(transport);
|
|
await transport.handleRequest(req, res, req.body);
|
|
} catch (err) {
|
|
console.error("[mcp] request failed:", err.message);
|
|
if (!res.headersSent) {
|
|
res.status(500).json({ jsonrpc: "2.0", error: { code: -32603, message: "Internal error" }, id: null });
|
|
}
|
|
}
|
|
});
|
|
|
|
mcpRouter.get("/mcp", (_req, res) => {
|
|
res.status(405).json({ jsonrpc: "2.0", error: { code: -32000, message: "GET not supported (stateless mode)" }, id: null });
|
|
});
|
|
|
|
mcpRouter.delete("/mcp", (_req, res) => {
|
|
res.status(405).json({ jsonrpc: "2.0", error: { code: -32000, message: "DELETE not supported (stateless mode)" }, id: null });
|
|
});
|