关于 Llama-Server MCP Proxy
这是一个为 llama-server 添加 MCP 工具调用能力的 Node.js 代理,面向使用 llama-server 图形界面的用户。它在处理聊天补全请求时支持多轮工具调用,并保留流式响应。
主要功能
- 01连接配置的 MCP 服务
- 02将可用工具写入系统提示词
- 03支持迭代式工具调用
- 04流式传递响应和工具结果
- 05可配置端点与调试日志
适用场景
- 01为 llama-server 图形界面添加 MCP 工具
- 02让大模型在一次对话轮次中调用多个工具
- 03通过流式输出查看工具执行过程
MCP 相关
代理连接 mcp-config.json 中配置的兼容 MCP 的工具服务,获取工具列表并执行模型发起的调用。
详细介绍
Llama-Server MCP 代理
这个 Node.js 应用程序充当 llama-server 的代理服务。它的主要目的是拦截聊天完成请求,通过模型上下文协议 (MCP) 使用工具能力增强这些请求,并允许大模型迭代地使用这些工具。
它将标准 llama-server GUI 请求(例如获取主页)直接代理到你的本地 llama-server 实例,并特别处理 /v1/chat/completions 请求以启用工具交互。
当前状态
- Brave 搜索可用
- Search1 API 可用
- 文件系统访问存在问题,具体取决于使用的模型
- Puppeteer
主要特性
- MCP 工具集成: 连接到在
mcp-config.json中定义的 MCP 兼容工具服务。 - 动态系统提示词: 自动生成列出可用工具及其描述的系统提示词,将其注入到大模型的上下文中。
- 迭代工具使用: 允许大模型在单个用户回合中进行多个工具调用。代理处理请求-响应流:
- 大模型指示进行工具调用。
- 代理检测并解析工具调用。
- 代理通过相应的 MCP 客户端执行工具。
- 代理将工具结果发送回大模型。
- 大模型使用结果继续响应或调用另一个工具。
- 流式传输支持: 维持大模型响应的流式传输(服务器发送事件)到客户端,包括中间消息如"[执行工具...]"和工具结果。
- 错误处理: 转发来自
llama-server的错误,并为失败的工具执行提供错误消息给大模型和客户端。大模型将分析错误并尝试找到可行的方法。 - 可配置: 使用环境变量配置端口、
llama-serverURL 和 MCP 配置路径。 - 调试日志: 可选的详细调试日志,通过环境变量启用。
前置要求
- Node.js: 版本 18 或更高(由
@modelcontextprotocol/sdk依赖指示)。 llama-server: 运行中的llama-server实例(或兼容的类 OpenAI API 端点)。- MCP 工具服务: 一个或多个 MCP 兼容的工具服务,你希望大模型能够访问。
设置
-
克隆仓库(或创建项目目录):
# 如果你有一个 git 仓库: # git clone <your-repo-url> # cd llama-server_mcp_proxy # 如果从头开始,创建一个目录并进入: mkdir llama-server_mcp_proxy cd llama-server_mcp_proxy -
创建
package.json: 如果你没有该文件,请创建一个package.json文件,内容如下:{ "name": "llama-server-mcp-proxy", "version": "1.0.0", "description": "A proxy for llama-server to enable MCP tool usage.", "main": "llama-server-mcp-proxy.js", "scripts": { "start": "node llama-server-mcp-proxy.js" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.8.0" } } -
安装依赖项: 在项目目录中运行以下命令来安装必要的包:
npm install这将使用你的
package.json(以及package-lock.json,如果存在且一致)来安装@modelcontextprotocol/sdk。 -
创建
mcp-config.json: 该文件告诉代理如何连接到你的 MCP 工具服务。默认情况下,它应该与你的代理脚本(例如llama-server-mcp-proxy.js)位于同一目录中,或者你可以通过MCP_CONFIG_PATH环境变量指定其路径。作为快速开始示例,将
mcp-config.json.example重命名为mcp-config.jsonmcp-config.json.example:{ "mcpServers": { "search1api": { "command": "npx", "args": [ "search1api-mcp", "--port", "0", "--api-key", "YOUR_SEARCH1API_KEY_PLACEHOLDER" ], "env": { "DEBUG": "true" } }, "another_tool_server": { "command": "path/to/your/tool/server/executable", "args": [ "--some-config-for-tool", "value", "--api-key", "ANOTHER_API_KEY_PLACEHOLDER" ], "env": {} } } }mcpServers:一个对象,其中每个键都是你的工具服务的唯一名称(例如"search1api"、"my_custom_tools")。command:执行以启动 MCP 工具服务的命令。这可以是用于 npx 可运行包的npx、可执行文件的直接路径或脚本。args:传递给命令的参数数组。--port 0通常用于让 MCP 服务选择一个可用的端口用于 stdio 通信。- 将
YOUR_SEARCH1API_KEY_PLACEHOLDER和其他占位符替换为你的实际 API 密钥或必要的配置。
env:一个可选的环境变量对象,用于为 MCP 服务进程设置。
通过复制示例并填入你的实际 API 密钥和路径来创建你的实际
mcp-config.json。 -
将
mcp-config.json添加到.gitignore: 为了防止意外提交你的敏感 API 密钥,在项目根目录中创建或更新.gitignore文件:node_modules/ mcp-config.json *.log # 添加你想忽略的其他文件/目录 -
保存代理代码: 将前面步骤中提供的 JavaScript 代理代码保存到一个文件中,例如
llama-server-mcp-proxy.js(如package.json中所引用的)。
运行代理
-
确保
llama-server正在运行。 代理需要连接到它。默认情况下,它假设llama-server在http://localhost:8080。 -
启动代理服务: 在项目目录中打开终端并运行:
npm start或直接使用 Node:
node llama-server-mcp-proxy.js你应该看到控制台输出显示代理已启动、它连接到的 MCP 服务以及可用的工具。
-
配置环境变量(可选): 你可以使用环境变量自定义代理的行为:
PORT:代理服务将监听的端口(默认值:9090)。LLAMA_SERVER_URL:你运行的llama-server实例的 URL(默认值:http://localhost:8080)。MCP_CONFIG_PATH:mcp-config.json文件的完整路径(默认值:相对于脚本的./mcp-config.json)。MCP_PROXY_DEBUG:设置为true以获得详细的调试日志(默认值:false)。LLAMA_SERVER_TIMEOUT:向llama-server发送请求的超时时间(毫秒)(默认值:60000)。
示例(Linux/macOS):
PORT=9000 LLAMA_SERVER_URL=http://127.0.0.1:8081 MCP_PROXY_DEBUG=true node llama-server-mcp-proxy.js示例(Windows PowerShell):
$env:PORT="9000"; $env:LLAMA_SERVER_URL="http://127.0.0.1:8081"; $env:MCP_PROXY_DEBUG="true"; node llama-server-mcp-proxy.js
用法
- 代理服务运行后,将你的大模型 GUI 客户端(例如访问通常与
llama-server通信的网页 UI 的浏览器)指向代理的地址和端口(例如,如果代理在端口 9090 上运行,则为http://localhost:9090)。 - 像往常一样与大模型交互。
- 当你要求大模型执行可能受益于某个已配置工具的任务时,它应该:
- 表示其使用工具的意图。
- 输出格式为
TOOL_NAME(ARG_NAME="ARG_VALUE", ...)或可能是 XML 格式的工具调用。
- 代理将:
- 检测此工具调用。
- 在流中显示 "[Executing tool: TOOL_NAME...]" 消息。
- 执行该工具。
- 在流中显示 "[Tool Result for TOOL_NAME]: ...RAW_RESULT..." 消息。
- 将结果反馈给大模型。
- 大模型随后将使用工具的结果来制定其最终响应,或决定调用另一个工具。
识别的工具调用格式
代理在大模型完成其当前响应段(由 [DONE] 指示)后,尝试识别大模型输出中的工具调用,主要有两种格式:
-
简单函数风格:
示例:
news(query="latest AI research", max_results=3) -
XML 风格:
<tool_call> <tool>tool_name</tool> <params> <param1>value1</param1> <param2>value2</param2> </params> </tool_call>
代理将相应地为每种格式解析参数。
故障排除
- "Tool ... not found in any connected MCP server":
- 确保大模型输出的工具名称与代理启动时列出的工具名称完全匹配(这些工具名称来自你的 MCP 服务)。
- 检查
mcp-config.json中工具服务命令或配置是否存在拼写错误。 - 验证你的 MCP 工具服务是否正确启动并成功注册了它们的工具。检查代理启动时的控制台输出以查看连接消息。
- 代理错误 /
llama-server错误(500、502 等):- 确保
llama-server正在运行且可在LLAMA_SERVER_URL处访问。 - 检查
llama-server自身的日志以了解任何问题。 - 启用
MCP_PROXY_DEBUG=true以从代理获得更详细的日志。
- 确保
- 工具执行错误(例如 "402 Payment Required"): 这些错误来自 MCP 工具服务本身。代理会将它们报告给大模型,大模型应该理想地尝试不同的方法或通知你。
- "Socket hang up" /
ECONNRESET: 如果llama-server意外关闭连接,可能会出现这种情况。如果代理发送了格式不正确的请求(例如不正确的 JSON 结构、有问题的标头)或llama-server本身遇到内部错误,就可能发生这种情况。来自代理和llama-server的调试日志至关重要。
依赖项
@modelcontextprotocol/sdk: 版本^1.8.0(及其在package-lock.json中列出的传递依赖项)。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。