项目简介

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助手。

  1. 安装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服务器使用。
  2. 安装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命令:

  1. 执行自然语言命令:
    {
      "tool": "efrit_execute",
      "params": {
        "type": "command",
        "content": "列出当前目录下的所有Elisp文件并计数"
      }
    }
  2. 执行Elisp代码:
    {
      "tool": "efrit_execute",
      "params": {
        "type": "eval",
        "content": "(buffer-name)"
      }
    }
  3. 开始多轮对话:
    {
      "tool": "efrit_execute",
      "params": {
        "type": "chat",
        "content": "帮我理解一下当前文件中的错误处理机制"
      }
    }
  4. 查询实例状态:
    {
      "tool": "efrit_list_instances",
      "params": {
        "include_stats": true
      }
    }

信息

分类

开发者工具