Win 10 MCP Server   Simple Persistant Logging

Win 10 MCP Server Simple Persistant Logging

🚀 Windows 10环境下MCP服务器的日志持久化解决方案

本项目聚焦于解决Windows 10环境下MCP服务器使用时出现的问题。在使用MCP服务器时,Claude可能出现“偷懒”情况,即不完全写入文件,致使中间过程文件被覆盖且无法恢复。本方案通过一系列步骤实现日志持久化,有效解决该问题。

🚀 快速开始

第一步:创建日志记录功能

为确保每次操作都能记录到硬盘,创建一个新的logger.mjs文件。此脚本会自动创建logs目录,并将所有日志信息追加到KAN_server.log文件中。

代码解释

  • 使用fs.promises模块处理异步文件操作。
  • 确保logs目录存在,避免路径错误。
  • 定义日志文件,用appendFile方法将内容追加到该文件。

第二步:修改index.js中的write_file逻辑

index.js文件里,修改write_file操作的处理逻辑,实现以下功能:

  1. 路径验证:确保传入的文件路径合法。
  2. 文件备份:写入新内容前,检查现有文件是否存在,生成含日期时间的备份文件名。
  3. 日志记录:将所有关键操作记录到日志文件。

修改后的逻辑流程

  1. 解析传入参数,确保符合要求。
  2. 验证目标文件路径是否合法。
  3. 检查文件是否存在:
    • 若存在,生成含日期时间的备份文件名,并重命名原文件。
    • 若不存在,直接写入新内容。
  4. 写入新内容后,将成功或失败信息记录到日志文件。

✨ 主要特性

  • 日志持久化:通过创建日志记录功能,确保每次操作都能记录到硬盘,避免中间过程文件被覆盖。
  • 文件备份:在写入新内容前对现有文件进行备份,保证数据的可恢复性。
  • JSON响应:返回给Claude桌面应用的内容为JSON格式,确保信息能正确显示。

💻 使用示例

基础用法

以下是logger.mjs文件的示例代码:

// 使用fs.promises模块处理异步文件操作
import { promises as fs } from 'fs';
import path from 'path';

// 确保logs目录存在
const logsDir = path.join(process.cwd(), 'logs');
await fs.mkdir(logsDir, { recursive: true });

// 定义日志文件
const logFile = path.join(logsDir, 'KAN_server.log');

// 追加日志信息到文件
async function logMessage(message) {
try {
await fs.appendFile(logFile, `${new Date().toISOString()} - ${message}\n`);
} catch (error) {
console.error('Error writing to log file:', error);
}
}

// 导出日志记录函数
export { logMessage };

高级用法

以下是index.js中修改后的write_file逻辑示例:

// 解析传入参数
const { filePath, content } = parseArgs(args);

// 验证目标文件路径
if (!isValidPath(filePath)) {
logMessage(`Invalid file path: ${filePath}`);
return { status: 'error', message: 'Invalid file path' };
}

// 检查文件是否存在
const fileExists = await fs.access(filePath).then(() => true).catch(() => false);
if (fileExists) {
// 生成备份文件名
const backupFileName = generateBackupFileName();
const backupFilePath = path.join(path.dirname(filePath), backupFileName);

// 重命名原文件
await fs.rename(filePath, backupFilePath);
logMessage(`File backed up to: ${backupFilePath}`);
}

// 写入新内容
try {
await fs.writeFile(filePath, content);
logMessage(`File written successfully: ${filePath}`);
return { status: 'success', message: 'File written successfully', backupFile: backupFileName || null };
} catch (error) {
logMessage(`Error writing file: ${filePath}, ${error.message}`);
return { status: 'error', message: 'Error writing file' };
}

🔧 技术细节

备份文件名的生成规则

为确保备份文件名唯一且易于识别,采用以下格式:

[月份][日期][年份最后两位]_[小时][分钟]__CLDBak

例如:032524_14_59__CLDBak

返回给Claude桌面应用的响应

返回的内容必须是JSON格式,以确保Claude桌面应用能正确显示信息。修改后的代码确保了这一点,并在响应文本中包含了备份文件的信息。

示例响应

{
"status": "success",
"message": "File written successfully. Backup file created as 032524_14_59__CLDBak."
}

📄 许可证

文档未提及相关许可证信息。

⚠️ 重要提示

  • 确保目标目录有写入权限,避免因权限问题导致操作失败。
  • 注意异常处理,在所有关键步骤中添加了错误捕捉和日志记录,以便及时发现和解决问题。
  • 正确处理相对路径和绝对路径的情况,确保文件操作的准确性。

💡 使用建议

考虑到未来可能需要使用语音模式操作Windows 10,代码中添加了详细的注释,方便后续维护。在进行代码修改或扩展时,可参考这些注释。

  • 0 关注
  • 0 收藏,8 浏览
  • system 提出于 2025-09-29 14:03

相似服务问题