MCP DuckDB Knowledge Graph Memory Server
by IzumiSy
Verified
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
// アプリケーション内で使用するログレベル
export enum LogLevel {
DEBUG = "debug",
INFO = "info",
WARN = "warning",
ERROR = "error",
}
// LogLevelからMcpLogLevelへの変換マップ
const logLevelToMcpLogLevel = {
[LogLevel.DEBUG]: "debug",
[LogLevel.INFO]: "info",
[LogLevel.WARN]: "warning",
[LogLevel.ERROR]: "error",
} as const;
// 文字列からLogLevelへの変換関数
export function stringToLogLevel(level: string): LogLevel {
switch (level.toLowerCase()) {
case "debug":
return LogLevel.DEBUG;
case "info":
return LogLevel.INFO;
case "warning":
case "warn":
return LogLevel.WARN;
case "error":
return LogLevel.ERROR;
default:
return LogLevel.INFO; // デフォルトはINFO
}
}
// ログデータの型定義
export interface LogData {
message: string;
payload?: Record<string, unknown>;
}
// Nullロガー
export class NullLogger implements Logger {
debug(message: string, payload?: Record<string, unknown>): void {
// No-op
}
info(message: string, payload?: Record<string, unknown>): void {
// No-op
}
warn(message: string, payload?: Record<string, unknown>): void {
// No-op
}
error(message: string, payload?: Record<string, unknown>): void {
// No-op
}
setLevel(level: LogLevel): void {
// No-op
}
}
// 抽象ロガーインターフェース
export interface Logger {
debug(message: string, payload?: Record<string, unknown>): void;
info(message: string, payload?: Record<string, unknown>): void;
warn(message: string, payload?: Record<string, unknown>): void;
error(message: string, payload?: Record<string, unknown>): void;
setLevel(level: LogLevel): void;
}
// コンソールロガー(デフォルト実装として)
export class ConsoleLogger implements Logger {
private level: LogLevel = LogLevel.INFO;
setLevel(level: LogLevel): void {
this.level = level;
}
debug(message: string, payload?: Record<string, unknown>): void {
if (this.shouldLog(LogLevel.DEBUG)) {
console.debug(message, payload);
}
}
info(message: string, payload?: Record<string, unknown>): void {
if (this.shouldLog(LogLevel.INFO)) {
console.info(message, payload);
}
}
warn(message: string, payload?: Record<string, unknown>): void {
if (this.shouldLog(LogLevel.WARN)) {
console.warn(message, payload);
}
}
error(message: string, payload?: Record<string, unknown>): void {
if (this.shouldLog(LogLevel.ERROR)) {
console.error(message, payload);
}
}
private shouldLog(messageLevel: LogLevel): boolean {
const levels = [
LogLevel.DEBUG,
LogLevel.INFO,
LogLevel.WARN,
LogLevel.ERROR,
];
return levels.indexOf(messageLevel) >= levels.indexOf(this.level);
}
}