项目简介
Efrit MCP服务器是Efrit AI编程助手的后端服务,它遵循Model Context Protocol (MCP) 标准,使大型语言模型(LLM)客户端能够安全、高效地与Emacs中的Efrit助手进行交互。通过Efrit MCP服务器,LLM可以直接调用Emacs功能,执行Elisp代码、Shell命令、管理缓冲区、探索代码库、进行版本控制操作,并进行多轮对话,将Emacs转变为强大的LLM可编程环境。
主要功能点
- LLM与Emacs交互桥梁: 提供标准的JSON-RPC接口,允许LLM客户端通过MCP协议向Emacs中的Efrit助手发送指令并获取响应。
- Emacs功能代理: 封装Efrit在Emacs中提供的强大功能为LLM可调用的工具(如执行Elisp代码、Shell命令、文件操作、版本控制等)。
- 多实例管理: 支持配置和管理多个Efrit Emacs实例,允许LLM按需与不同的Emacs环境交互。
- 安全与稳定性: 实现路径验证、原子文件操作、超时机制、并发控制和错误处理,确保安全可靠的通信。
- 队列系统通信: 通过文件系统队列与Emacs Efrit进行异步通信,实现解耦和高吞吐量。
- 实例状态与统计: 提供工具查询Efrit实例的运行状态、健康状况和队列统计信息。
安装步骤
Efrit MCP服务器本身是Node.js应用,但它依赖于运行中的Efrit Emacs助手。
-
安装Efrit Emacs助手:
- 确保已安装Emacs 28.1+。
- 克隆Efrit仓库:'git clone https://github.com/steveyegge/efrit.git'
- 在Emacs配置文件 ('~/.emacs.d/init.el') 中添加:
(add-to-list 'load-path "/path/to/efrit/lisp") (require 'efrit) - 配置Anthropic API密钥(推荐使用'~/.authinfo.gpg'):
machine api.anthropic.com login personal password YOUR_ANTHROPIC_API_KEY_HERE - 在Emacs中启动Efrit的远程队列:'M-x efrit-remote-queue-start'。此操作会在您的数据目录(通常是'~/.emacs.d/.efrit/queues/')中创建文件队列,供MCP服务器使用。
-
安装Efrit MCP服务器:
- 进入Efrit仓库的'mcp'目录:'cd /path/to/efrit/mcp'
- 安装Node.js依赖:'npm install'
- 构建服务器代码:'npm run build'
- (可选)为了方便管理,您可以将可执行文件路径添加到系统PATH中,或使用PM2等进程管理器运行。
服务器配置
MCP客户端需要知道如何启动并连接到Efrit MCP服务器。Efrit MCP服务器设计为通过Stdio(标准输入/输出)与MCP客户端通信。
MCP客户端连接配置示例 (JSON格式):
{ "name": "Efrit Emacs AI Backend", "command": "/path/to/efrit/mcp/dist/server.js", "args": [], "environment": { "EFRIT_LOG_LEVEL": "info", "EFRIT_DEFAULT_INSTANCE": "primary" }, "description": "连接到Emacs Efrit编程助手的MCP服务器,提供在Emacs中执行代码、探索项目和对话的能力。", "notes": [ "请将 'command' 字段中的 '/path/to/efrit/mcp/dist/server.js' 替换为Efrit MCP服务器实际可执行文件的绝对路径。", "MCP服务器的内部配置(例如Efrit实例的队列目录、超时时间、并发限制等)可以通过修改 '/path/to/efrit/mcp/config/instances.json' 文件来调整。", "可以通过在 'environment' 字段中设置环境变量(如 'EFRIT_LOG_LEVEL', 'EFRIT_DEFAULT_INSTANCE')来覆盖服务器的默认行为。" ] }
MCP服务器提供的工具 (由MCP客户端动态发现或通过能力声明获取): Efrit MCP服务器会向连接的MCP客户端声明以下MCP工具:
- 'efrit_execute': 在Emacs实例中执行命令、Elisp代码或聊天消息。此工具接受以下参数:
- 'type' (必填): 执行类型,可以是 '"command"' (执行自然语言命令,如'efrit-do')、'"eval"' (求值Elisp代码) 或 '"chat"' (进行多轮对话,如'efrit-chat')。
- 'content' (必填): 要执行的命令、Elisp代码或聊天消息内容。
- 'instance_id' (可选): 目标Efrit实例的ID。未指定时使用服务器配置的默认实例。
- 'return_context' (可选): 布尔值,是否在响应中包含Emacs的上下文信息(如当前缓冲区、模式等)。
- 'timeout' (可选): 超时时间(秒),可以覆盖实例的默认超时设置。
- 'efrit_list_instances': 列出所有已配置的Efrit Emacs实例及其当前运行状态。此工具接受以下参数:
- 'include_stats' (可选): 布尔值,是否在每个实例的信息中包含详细的队列统计信息。
- 'efrit_get_queue_stats': 获取特定Efrit Emacs实例的队列统计信息。此工具接受以下参数:
- 'instance_id' (可选): 目标实例的ID。未指定时使用服务器配置的默认实例。
基本使用方法 (供LLM客户端调用示例)
LLM客户端会通过MCP协议调用服务器暴露的工具。例如,调用'efrit_execute'工具来执行Emacs命令:
- 执行自然语言命令:
{ "tool": "efrit_execute", "params": { "type": "command", "content": "列出当前目录下的所有Elisp文件并计数" } } - 执行Elisp代码:
{ "tool": "efrit_execute", "params": { "type": "eval", "content": "(buffer-name)" } } - 开始多轮对话:
{ "tool": "efrit_execute", "params": { "type": "chat", "content": "帮我理解一下当前文件中的错误处理机制" } } - 查询实例状态:
{ "tool": "efrit_list_instances", "params": { "include_stats": true } }
信息
分类
开发者工具