logging refactoring

This commit is contained in:
azykov@mail.ru
2026-07-09 10:32:10 +03:00
parent 812e36d0af
commit bc5b3572df
10 changed files with 152 additions and 70 deletions
+34 -30
View File
@@ -2,7 +2,9 @@ import Fastify, { type FastifyInstance } from "fastify";
import { ToolDef } from "./types";
import McpSession from "./mcpConnection";
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
import { pingTool, testAddTool, testRemoveTool, listToolsTool, invokeToolTool } from "./mcpTools";
import * as mcpTools from "./mcpTools";
import { logged } from "./utils/logged";
import cors from '@fastify/cors';
export class Server {
private readonly app: FastifyInstance;
@@ -14,34 +16,20 @@ export class Server {
this.port = port;
this.app = Fastify({
trustProxy: true,
logger: {
serializers: {
req(request) {
return {
method: request.method,
url: request.url,
host: request.headers.host,
remoteAddress: request.ip,
headers: request.headers, // <-- full header set
};
},
},
},
// logger: {
// level: process.env.LOG_LEVEL ?? "info",
// ...(process.env.NODE_ENV !== "production"
// ? {
// transport: {
// target: "pino-pretty",
// options: { colorize: true, translateTime: "HH:MM:ss.l", ignore: "pid,hostname" },
// },
// }
// : {}),
// serializers: {
// req(request) {
// return {
// method: request.method,
// url: request.url,
// host: request.headers.host,
// remoteAddress: request.ip,
// headers: request.headers, // <-- full header set
// };
// },
// },
// },
});
this.registerLogging();
this.registerRoutes();
}
private registerLogging(): void {
@@ -73,8 +61,10 @@ export class Server {
public registerTools(...tools: ToolDef[]): void {
for (const tool of tools) {
if (!this.getTool(tool.title))
this.tools[tool.title] = tool;
if (!this.getTool(tool.title)) {
// console.log(`Registering new tool ${tool.title}`);
this.tools[tool.title] = logged(tool);
}
}
this.emitToolListChange();
@@ -88,8 +78,11 @@ export class Server {
}
private emitToolListChange() {
const toolList = Object.values(this.tools);
console.log(`Advertising updated tool list: ${toolList.map((tool) => tool.title)}`);
for (const session of Object.values(this.sessions))
session.handleToolListChange(Object.values(this.tools));
session.handleToolListChange(toolList);
}
public getSession(sessionId: string): McpSession | undefined {
@@ -101,6 +94,9 @@ export class Server {
// underlying Node req/res it expects.
private registerRoutes(): void {
this.app.post("/mcp", async (request, reply) => {
reply.raw.setHeader('Access-Control-Allow-Origin', request.headers.origin ?? '*');
reply.raw.setHeader('Access-Control-Allow-Credentials', 'true');
reply.raw.setHeader('Vary', 'Origin');
let session: McpSession | undefined;
@@ -157,10 +153,18 @@ export class Server {
}
async start(): Promise<void> {
await this.app.register(cors, {
origin: true,
credentials: true,
});
await this.registerLogging();
await this.registerRoutes();
await this.app.listen({ port: this.port, host: "0.0.0.0" });
this.app.log.info(`MCP ping server listening on http://0.0.0.0:${this.port}/mcp`);
}
}
export const server = new Server();
server.registerTools(pingTool, listToolsTool, invokeToolTool, testAddTool, testRemoveTool);
server.registerTools(...Object.values(mcpTools));