Multichat MCP Server
多聊天 MCP 服务器
项目概述
该项目是重构 FiveM 资源的一项大型工作的一部分,旨在打造更健壮、更易于维护的代码库。我们利用模型上下文协议 (MCP) 与外部服务和 API 集成,从而扩展资源的功能。
multichat-mcp服务器专注于同时与多个基于 unichat 的 MCP 服务器进行通信。这使我们能够查询不同的语言模型并组合它们的响应,从而可能获得更全面、更细致的结果。它充当标准的 MCP 服务器,向主机 (Roo/Cline) 公开一个可以使用的multichat工具。然后, multichat-mcp服务器管理与其他 unichat 服务器的客户端连接。
Related MCP server: MCP Server
当前问题
我们在进行跨服务器 MCP 调用时遇到了一个问题。最初的目标是使用multichat-mcp服务器直接调用其他 MCP 服务器(特别是Lacayo 1和openrouter-chat上的unichat工具。然而,这些调用一直返回“方法未找到”错误 (-32601)。
使用use_mcp_tool命令直接调用Lacayo 1上的unichat工具和openrouter-chat确实可以正常工作。这最初表明问题出在multichat-mcp的跨服务器通信上。然而,经过大量的故障排除和研究,我们发现 MCP不支持服务器之间的直接通信。主机 (Roo/Cline) 负责协调服务器之间的所有通信。
故障排除步骤和尝试的方法
我们已采取以下步骤来诊断和解决“未找到方法”错误,并探索了各种方法:
**已验证的 MCP 服务器配置:**我们仔细检查了
cline_mcp_settings.json文件,以确保所有服务器(multichat、Lacayo 1和openrouter-chat)均已正确配置,并具有正确的命令、参数和环境变量。**检查 JSON-RPC 请求格式:**我们查阅了 MCP 文档和示例,以确保
multichat-mcp发送的 JSON-RPC 请求格式正确,包括method、params和id字段。**测试直接调用:**我们确认使用
use_mcp_tool直接调用Lacayo 1上的unichat工具和openrouter-chat能够正常工作。这说明问题在于multichat-mcp中的跨服务器通信尝试。**通过 Perplexity 查阅文档:**我们广泛使用了 Perplexity MCP 服务器来搜索相关的 MCP 文档、示例和故障排除技巧。我们特别搜索了以下内容:
模型上下文协议 (MCP) 跨服务器通信最佳实践。如何在 MCP 服务器之间发出请求、服务器发现以及客户端连接管理。重点关注官方文档和示例。
模型上下文协议 (MCP) 客户端连接处理和身份验证。如何在 MCP 中正确建立和验证客户端与服务器之间的连接。重点关注官方文档和 TypeScript SDK 示例。
MCP(模型上下文协议)工具执行的精确方法名称。寻找 TypeScript SDK 中工具/调用使用、JSON-RPC 方法名称以及成功的客户端-服务器交互的真实示例。关注 GitHub 上关于方法命名的问题和讨论。
GitHub 上的模型上下文协议 (MCP) 实现,重点关注服务器间通信和跨服务器请求处理。查找去年的 TypeScript/JavaScript 示例。包含请求路由和消息传递模式。
这些搜索帮助我们理解了 MCP 的核心原理、正确的方法名称(
tools/list和tools/call)以及客户端-主机-服务器架构。我们了解到,MCP不支持直接的服务器到服务器通信。**修改服务器代码(多次迭代):**我们反复修改了
multichat-mcp服务器代码(src/index.ts和src/server.ts),尝试了不同的方法,包括:不正确的方法(已丢弃):
尝试使用原始 JSON-RPC 请求和 stdio 操作进行直接服务器到服务器调用。这是基于对 MCP 架构的误解。
在循环中创建多个
Client实例,每个实例都尝试连接到不同的服务器。这是错误的,因为每个客户端都应该连接到单个服务器。尝试使用自定义的
mcp_instructions响应类型来指示主机进行调用。MCP 不支持跨服务器通信的自定义消息类型。使用不正确的方法名称,例如将
tool/call(复数)误认为tools/call(单数)。尝试使用非标准 MCP 方法
rpc.discover和mcp.tools.list。尝试使用
tool/route通知,这不是标准的 MCP 方法。
正确方法(当前实施):
为每个目标服务器(Lacayo 1、openrouter-chat)创建一个
Client实例,并将它们存储在Map中。使用
StdioClientTransport将unichat-ts-mcp-server生成为子进程。这是必要的,因为multichat-mcp需要充当 unichat 服务器的客户端。使用
client.listTools()方法验证连接并发现可用的工具。使用具有正确
tools/call方法名称和参数的client.request()方法,遵循标准 JSON-RPC 2.0 格式。使用
client.connect()并正确处理传输。使用功能正确初始化客户端。
使用 Zod 模式验证来确保请求和响应格式正确。
确保安装了必要的依赖项(
package.json)并且正确构建了代码(tsconfig.json和npm run build)。
当前状态
multichat-mcp服务器目前仍然返回“方法未找到”错误。我们仍在调试该问题,但在理解正确的 MCP 架构和实现模式方面已取得重大进展。我们现在使用的是正确的客户端-服务器通信模型,但请求格式或服务器配置可能仍然存在一些细微问题。
涉及文件:
src/server.ts:主服务器实现。src/index.ts:服务器入口点。package.json:依赖项和构建脚本。tsconfig.json:TypeScript 配置。../../../../../../Users/kurror/AppData/Roaming/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json:MCP 服务器配置文件。
安装
先决条件:
您的系统上安装了 Node.js 和 npm。
步骤:
导航到 MCP 服务器目录:
cd C:\\Users\\kurror\\AppData\\Roaming\\Roo-Code\\MCP克隆或创建
multichat-mcp目录。将服务器文件(
package.json、tsconfig.json、src/index.ts、src/server.ts)放在multichat-mcp目录中。安装依赖项:
npm install构建 TypeScript 代码:
npm run build
配置
要启用multichat-mcp服务器,您需要将其配置添加到cline_mcp_settings.json文件中,该文件位于C:\\Users\\kurror\\AppData\\Roaming\\Code\\User\\globalStorage\\rooveterinaryinc.roo-cline\\settings\\cline_mcp_settings.json 。
将以下条目添加到mcpServers对象:
{
"mcpServers": {
"multichat": {
"command": "node",
"args": [
"C:\\Users\\kurror\\AppData\\Roaming\\Roo-Code\\MCP\\multichat-mcp\\build\\index.js"
],
"env": {}
}
}
}使用情况(测试)
您可以在 Cline 环境中使用use_mcp_tool命令测试multichat-mcp服务器。
multichat工具:
要向多个 unichat 服务器发送消息并保存其响应,请使用以下格式:
<use_mcp_tool>
<server_name>multichat</server_name>
<tool_name>multichat</tool_name>
<arguments>
{
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "What is your opinion about async programming?"
}
],
"servers": ["Lacayo 1", "openrouter-chat"],
"outputDir": "test_output"
}
</arguments>
</use_mcp_tool>messages:要发送给各个服务器的消息数组。格式遵循标准的 unichat 消息格式(包含role和content的对象数组)。servers:要调用的 unichat 服务器名称数组(例如,"Lacayo 1","openrouter-chat")。outputDir:响应将保存到的目录名称(位于 MCP 服务器的工作目录中)。**重要提示:**由于“方法未找到”错误,响应目前无法正确保存。
**read_response工具:**要读取已保存的响应文件(一旦服务器正常运行),请使用:
<use_mcp_tool>
<server_name>multichat</server_name>
<tool_name>read_response</tool_name>
<arguments>
{
"outputDir": "test_output",
"server": "Lacayo 1"
}
</arguments>
</use_mcp_tool>outputDir:保存响应的目录。server:您要读取其响应的服务器的名称。
测试重要说明:
确保
Lacayo 1和openrouter-chat服务器正在运行并在cline_mcp_settings.json中正确配置。对
multichat-mcp进行代码更改后,必须在multichat-mcp目录中运行npm run build来编译 TypeScript 代码。当配置文件发生变化时,MCP 主机(Roo/Cline)会自动重启服务器,但如果遇到问题,可能需要手动重启。
使用 Perplexity 和 Unichat
**Perplexity:**您可以使用 Perplexity MCP 服务器研究和收集与 MCP、FiveM 开发以及其他任何技术主题相关的信息。这有助于查找文档、示例和问题解决方案。
Unichat 服务器:
Lacayo 1和openrouter-chat服务器通过unichat工具提供对语言模型的访问。您可以使用这些服务器进行常规编码辅助、调试和生成代码片段。您可以使用use_mcp_tool直接测试它们,以确保它们正常运行。
更新使用和故障排除(已更正)
原始文档和故障排除步骤描述了错误的跨服务器通信方法。本节提供了更正后的使用说明,并解决了我们遇到的超时问题。
依赖项
@modelcontextprotocol/sdk:提供构建 MCP 服务器和客户端的核心功能。zod:用于模式验证和类型安全。fs/promises、path、url、crypto:Node.js 内置模块,用于文件系统操作、路径操作、URL 解析和加密功能。
multichat工具(更正用法)
multichat工具旨在将同一条消息发送到多个单聊天服务器并收集它们的响应。它不支持服务器之间的直接通信。正确的使用方法如下:
重要提示: multichat服务器和与其通信的unichat服务器必须在单独的终端窗口中运行。
**启动 unichat 服务器:**为每个要使用的 unichat 服务器(例如“Lacayo 1”、“openrouter-chat”)打开单独的终端窗口。在每个终端中,导航到 unichat 服务器目录并运行:
cd C:\Users\kurror\AppData\Roaming\Roo-Code\MCP\unichat-ts-mcp-server $env:UNICHAT_MODEL="gpt-4o" # Or your desired model $env:UNICHAT_API_KEY="your_api_key" # Replace with your actual API key node ./build/index.js**启动多聊天服务器:**在单独的终端窗口中,导航到
multichat-mcp目录并运行:cd C:\Users\kurror\AppData\Roaming\Roo-Code\MCP\multichat-mcp node ./build/index.js**发送请求:**在第三个终端窗口中,导航到
multichat-mcp目录,并创建一个包含请求内容的request.json文件。然后,使用 PowerShell 发送请求:cd C:\Users\kurror\AppData\Roaming\Roo-Code\MCP\multichat-mcp $request = @{ jsonrpc = "2.0" id = 1 method = "tools/call" params = @{ name = "multichat" arguments = @{ messages = @( @{role = "system"; content = "You are a helpful assistant."}, @{role = "user"; content = "Hello, world!"} ) servers = @("Lacayo 1", "openrouter-chat") outputDir = "my-test-output" } } } | ConvertTo-Json -Depth 10 $request | Out-File -FilePath "request.json" -Encoding utf8 Get-Content "request.json" | node ./build/index.js这将在
multichat-mcp目录中创建一个名为responses/my-test-output目录,其中包含来自各个服务器的响应(例如Lacayo 1.json、openrouter-chat.json)以及一个用于跟踪会话的_session.json文件。如果某个服务器未能响应,则会创建一个错误文件(例如Lacayo 1_error.json)。
read_response工具(更正用法)
read_response工具读取由之前的multichat呼叫生成的已保存的响应文件。
示例请求(在 Roo 内):
<use_mcp_tool>
<server_name>multichat</server_name>
<tool_name>read_response</tool_name>
<arguments>
{
"outputDir": "my-test-output",
"server": "Lacayo 1"
}
</arguments>
</use_mcp_tool>重要提示: outputDir是相对于multichat-mcp/responses目录的。该工具会在responses中找到与outputDir值匹配的子目录。在该子目录中,它会查找<server>.json文件(用于成功响应)或<server>_error.json文件(用于错误响应)。
故障排除(已更新)
**超时:**超时的主要原因是错误地假设
multichat可以直接调用其他服务器。更正后的用法(所有服务器在单独的终端上运行)解决了这个问题。在发送multichat请求*之前,*请确保所有单聊服务器均已运行。**会话目录无效:**当
read_response在multichat-mcp/responses目录中找不到指定的outputDir时,会发生此错误。请仔细检查outputDir值,并确保multichat命令已成功运行并创建了输出目录。**未创建响应文件:**如果即使按照正确的用法操作后,
responses目录中仍未创建任何文件,则可能是文件系统权限问题,multichat服务器的响应处理中存在静默错误。请检查服务器日志中是否有任何错误消息。验证目标 unichat 服务器是否正在运行并正确响应也至关重要。您可以使用use_mcp_tool和unichat工具分别测试它们。
错误如下:
setRequestHandler的错误使用:我分别传递了方法名称和模式,而不是将方法名称包含在模式中。参数访问不正确:由于模式问题,
request.params类型不正确。client.request中的响应模式不正确:我使用的是z.any(),它与RequestOptions不兼容。
修复内容如下:
**正确定义
ForwardRequestSchema:**在method字段中包含z.literal("mcp.forward")。**正确使用
setRequestHandler:**仅传递模式和处理程序函数。正确访问参数:使用模式解析后使用
request.params。在 client.request 调用中使用
z.unknown()。
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kurror/mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server