mcp-observer-server 是一个 MCP(模型上下文协议)服务器,它可以监控文件系统事件,并向 MCP 客户端提供实时通知。它就像一个(更具双向性的)桥梁,连接着你的本地文件系统和像 Claude Inspector 这样的 AI 助手,使它们能够自动响应文件的变化。
注意: 这是我正在开发的一个文件监控 MCP 服务器的演示/概念验证。我看到很多关于这类东西的问题、评论、议题和讨论,所以我想发布这个最小化的实现,来分享我的方法。
uv 安装依赖(或者,我想也可以用其他方式)。make start 运行服务器(使用 uv),或者运行 npx @modelcontextprotocol/inspector uv run src/mcp_observer_server/server.py。subscribe 工具监控目录或文件(或者,你可以运行“列出资源”,点击一个资源,然后点击“订阅”按钮来订阅它)。watched.txt 的文件,路径为 src/mcp_observer_server/watched.txt(该文件已被添加到 .gitignore 中,所以你需要自己创建它),但你也可以订阅其他文件。你可以使用 subscribe_default 工具订阅这个文件。watched.txt 文件(或者你订阅的任何文件),你应该会在 Inspector 右下角的面板中看到服务器通知。这样就完成了概念验证。MCP 观察者服务器可以跟踪系统上的文件和目录变化,允许 MCP 客户端订阅这些事件,并在文件被创建、修改、删除或移动时采取行动(当前演示仅处理修改事件)。该服务器实现了完整的模型上下文协议规范,具备以下功能:
我试图解决的主要痛点是,除非像 Claude Code 这样的工具自己触及文件并将更改写入其中,否则它对仓库/项目中发生的事情一无所知。(你知道那些“自上次读取以来文件已更改”的通知吧?)拥有一个能够实际监控你在项目中操作的客户端或编码助手,而你不必将每个任务都委托给 Claude 让它知道发生了什么,在我看来非常有用。一些实际应用包括:
MCP 协议定义了资源订阅的概念,客户端可以请求接收资源更改的通知,服务器可以选择发送通知。以下是流程图:
协议规定客户端应向服务器发送读取请求以读取更改(顺便说一下,所有这些都是可选的)。但我觉得这有点麻烦,还需要额外的交互,我更希望资源更新通知能同时描述更改内容。幸运的是,SDK 提供了 meta/_meta 字段,你几乎可以发送任何你想要的内容。所以我可能想发送更改的行数、更改的差异,谁知道呢。在这个演示中我还没有实现这些,目前我只是发送时间戳。(实际上我从服务器中移除了除最小概念验证之外的所有内容。)此外,它只是在标准输入输出传输上运行,没有什么花哨的东西。
注意!!! 我还没有用任何“真正的”MCP 客户端测试过这个——据我所知,很少有客户端真正支持资源订阅,因为这本来就是可选的。不过,幸运的是 Inspector 是一个非常好的客户端,你可以用它来测试这个服务器。
服务器实现采用了精简的架构,优先考虑简单性、可靠性和可维护性。
watched 字典进行直接的路径到会话映射。call_soon_threadsafe 实现线程安全的通信。watched 将 Path 对象映射到 ServerSession 对象集。subscribe 和 unsubscribe。该实现实现了功能和简单性之间的良好平衡,形成了一个可靠且易于维护的代码库。
⚠️ 重要提示
我还没有用任何“真正的”MCP 客户端测试过这个——据我所知,很少有客户端真正支持资源订阅,因为这本来就是可选的。不过,幸运的是 Inspector 是一个非常好的客户端,你可以用它来测试这个服务器。
💡 使用建议
按照演示说明的步骤进行操作,可顺利完成对服务器的测试。在实际使用中,可根据实际应用场景对服务器进行扩展和优化。