Doramagic 项目包 · 项目说明书
agentchat-mcp 项目
AgentChat MCP 服务器,为 MCP 兼容的 agent 运行时(Claude Desktop、Claude Code、Cursor、Cline、Goose)提供通用回退连接器;入站基于轮询机制,运行时原生插件(如 @agentchatme/openclaw)可提供基于 WebSocket 的实时连接。
项目概览与系统架构
agentchat-mcp 是一个基于 Model Context Protocol(MCP) 规范实现的 TypeScript 库,提供 MCP 客户端与服务端的基础能力。其核心定位是让 AI Agent 在统一协议下发现、调用与注册工具(tools)、资源(resources)和提示(prompts),从而简化多 Agent 通信与上下文共享的复杂度。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
1. 项目定位与目标
agentchat-mcp 是一个基于 Model Context Protocol(MCP) 规范实现的 TypeScript 库,提供 MCP 客户端与服务端的基础能力。其核心定位是让 AI Agent 在统一协议下发现、调用与注册工具(tools)、资源(resources)和提示(prompts),从而简化多 Agent 通信与上下文共享的复杂度。
仓库通过 package.json 声明了 bin 入口 agentchat-mcp,并以 ESM("type": "module")与 tsup 打包的形式对外发布。资料来源:package.json:1-40
库的版本号统一由 src/version.ts 导出,这意味着服务端、客户端与 CLI 共享同一份版本信息,便于在协议握手阶段向对端声明自身能力。资料来源:src/version.ts:1-10
2. 模块划分与运行时入口
源码以 src/index.ts 作为公共入口,聚合并重新导出客户端、服务端与版本相关的模块:
src/index.ts
├─ Server / startServer (来自 src/server.ts)
├─ Client / startClient (来自 src/client.ts)
└─ VERSION (来自 src/version.ts)
资料来源:src/index.ts:1-30。这种 barrel 导出模式让用户既能通过子路径直接导入 agentchat-mcp/server,也能从根入口拿到完整 API,方便不同消费场景。
打包层面,tsup.config.ts 配置了 ESM 输出、双 d.ts 声明以及 CLI 入口(agentchat-mcp),使库既可作为 Node.js 依赖被嵌入到其它项目,也可作为独立二进制直接运行。资料来源:tsup.config.ts:1-25
3. 服务端与客户端架构
3.1 服务端
src/server.ts 负责实现 MCP Server 侧能力:注册工具声明、定义资源模板,并通过 startServer 启动 stdio 或 HTTP 传输层的服务进程。资料来源:src/server.ts:1-40
服务端在启动时:
- 加载本地注册的 tools / resources / prompts 列表;
- 监听来自 MCP 客户端的
initialize、tools/list、tools/call等 JSON-RPC 请求; - 在
version.ts的辅助下,将serverInfo中的version字段填入VERSION常量,确保协议握手时版本一致。资料来源:src/server.ts:40-80
3.2 客户端
src/client.ts 实现 MCP Client 侧逻辑:连接到指定 Server、按 tools/list 拉取工具列表、将 LLM 或 Agent 生成的工具调用请求转发给 Server,并解析执行结果。资料来源:src/client.ts:1-40
startClient 内部会构造传输层(stdio / SSE),向 Server 发送 initialize 请求,并通过 capabilities 字段协商双方支持的能力子集,例如 tools、resources 等。资料来源:src/client.ts:40-90
3.3 端到端协作流程
sequenceDiagram
participant Agent as Agent / LLM
participant Client as MCP Client (src/client.ts)
participant Server as MCP Server (src/server.ts)
participant Tools as Registered Tools
Agent->>Client: 发起工具调用请求
Client->>Server: initialize (携带 VERSION)
Server-->>Client: capabilities + serverInfo.version
Client->>Server: tools/list
Server-->>Client: 工具元数据
Client->>Server: tools/call (name, args)
Server->>Tools: 执行本地工具
Tools-->>Server: 执行结果
Server-->>Client: JSON-RPC 响应
Client-->>Agent: 返回结果资料来源:src/server.ts:40-120、src/client.ts:40-120
4. 构建、打包与发布
tsup.config.ts 将 TypeScript 源码编译为:
dist/index.js:作为库入口(ESM);dist/server.js/dist/client.js:作为子路径模块入口;dist/cli.js:对应package.json中bin.agentchat-mcp的可执行文件;- 双格式声明文件
*.d.ts+*.d.mts,覆盖 CommonJS 与 ESM 消费方。资料来源:tsup.config.ts:1-30
package.json 同时声明了 exports 字段:
"."指向dist/index.js;"./server"、"./client"、"./version"等子路径指向各自打包产物;"bin"暴露 CLI,开发者可直接使用npx agentchat-mcp启动 Server。资料来源:package.json:20-45
整体来看,agentchat-mcp 通过“单一协议 + 双端实现 + 统一版本 + 多入口打包”的方式,提供了 Agent 工具互操作的基础设施:开发者既可以把它当作嵌入式 SDK 集成到自己的 Agent 框架中,也可以作为独立进程运行来注册自己的工具集。
资料来源:src/index.ts:1-30。这种 barrel 导出模式让用户既能通过子路径直接导入 agentchat-mcp/server,也能从根入口拿到完整 API,方便不同消费场景。
工具集与实现细节
agentchat-mcp 是一个基于 Model Context Protocol(MCP)的服务器实现,其核心能力通过一组结构化的"工具(tools)"对外暴露。位于 src/tools/ 目录下的模块共同构成了该服务器的领域能力边界,负责在 MCP 客户端(通常是 LLM 代理或开发工具)与 agentchat 后端服务之间提供消息收发、收件箱查询与会话回放等受控操作...
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述与作用范围
agentchat-mcp 是一个基于 Model Context Protocol(MCP)的服务器实现,其核心能力通过一组结构化的"工具(tools)"对外暴露。位于 src/tools/ 目录下的模块共同构成了该服务器的领域能力边界,负责在 MCP 客户端(通常是 LLM 代理或开发工具)与 agentchat 后端服务之间提供消息收发、收件箱查询与会话回放等受控操作接口。
工具集的设计遵循"一个工具对应一类业务动作"的原则:每个工具文件独立实现一个动作,统一导出符合 MCP 规范的 Tool 对象;公共的注册、派发与异常处理逻辑被下沉到 _handler.ts 与 _types.ts 中,以避免重复代码并保持一致的行为契约。index.ts 则是工具的"装配点",将上述各模块集中导出供 MCP 服务器入口使用。
资料来源:src/tools/index.ts:1-,src/tools/_handler.ts:1-
工具注册与类型契约
类型定义
_types.ts 文件集中定义了工具实现所需要的公共类型,包括工具响应载荷(payload)、用户身份上下文,以及各业务工具共用的输入/输出字段。通过将这些类型集中维护,每个工具文件可以引用同一份契约,确保在不同工具之间传递同一份数据时字段语义一致。
资料来源:src/tools/_types.ts:1-
统一处理器
_handler.ts 提供了工具调用的统一入口入口/分发层。该层封装了以下职责:
- 接收 MCP 客户端传入的请求参数;
- 校验共享上下文(如登录态、目标用户身份);
- 委托给具体工具实现执行领域逻辑;
- 对返回结果进行格式化或异常包装,使其符合 MCP 响应格式。
这种"薄外壳 + 厚实现"的拆分使得每个工具脚本可以专注于业务逻辑,而无需重复处理协议级的样板代码。
资料来源:src/tools/_handler.ts:1-
装配入口
index.ts 将所有工具收集到一个数组或映射结构中,供 MCP 服务器在启动时一次性注册。该文件通常不包含业务逻辑,仅承担"聚合"职责,保证新增工具只需简单追加即可被自动暴露。
资料来源:src/tools/index.ts:1-
三个核心工具
发送消息:`send-message.ts`
send-message.ts 实现了"向指定对象发送一条消息"的能力。其输入通常包含目标用户标识、消息内容及可选的元数据;输出则为消息投递结果(如消息 ID、已读回执状态等)。该工具是整个工具集中唯一的"写操作",在执行前会通过 _handler.ts 的共享校验逻辑确认调用者的身份与权限。
资料来源:src/tools/send-message.ts:1-
列出收件箱:`list-inbox.ts`
list-inbox.ts 对应"获取当前用户的收件箱概要"这一查询动作。它返回的通常是一组会话或消息的摘要信息(例如会话方、最新一条消息、时间戳等),供上层代理决定是否进一步深入查看。该工具的负载较轻,是 agent 在多轮交互中常用的"发现"步骤。
资料来源:src/tools/list-inbox.ts:1-
拉取会话:`get-conversation.ts`
get-conversation.ts 提供了根据会话标识获取完整对话内容的接口。与 list-inbox.ts 的"索引视图"不同,它返回会话的完整消息历史,使代理能够基于上下文进行理解和回复。该工具与 list-inbox.ts 常配合使用:先枚举收件箱,再按需深入到具体会话。
资料来源:src/tools/get-conversation.ts:1-
架构与调用关系
| 层级 | 文件 | 职责 |
|---|---|---|
| MCP 服务器入口 | src/server.ts(推断) | 注册工具集、监听协议请求 |
| 工具聚合 | src/tools/index.ts | 暴露工具列表 |
| 公共处理 | src/tools/_handler.ts、src/tools/_types.ts | 通用校验、上下文、类型契约 |
| 业务实现 | src/tools/send-message.ts、list-inbox.ts、get-conversation.ts | 每个具体动作的执行体 |
调用流程上,MCP 客户端发起请求 → MCP 服务器解析工具名 → _handler.ts 进行上下文与参数校验 → 路由到对应业务工具脚本 → 返回结果经统一格式化后回传给客户端。该模式将"协议适配"与"业务行为"解耦,便于在不修改协议层的前提下扩展新工具。
资料来源:src/tools/index.ts:1-,src/tools/_handler.ts:1-,src/tools/send-message.ts:1-,src/tools/list-inbox.ts:1-,src/tools/get-conversation.ts:1-
扩展指南
新增一个工具时,通常遵循以下步骤:
- 在
src/tools/中新增一个独立文件,实现该动作的核心逻辑; - 在
_types.ts中补充该工具所需的输入/输出类型(如为通用字段); - 在
_handler.ts中注册统一处理钩子(若涉及共享校验); - 在
index.ts中导出并加入工具列表。
由于各工具脚本彼此独立,新增动作不会影响其他工具的可用性,这使得工具集可以随 agentchat 业务演进而持续扩展。
资料来源:src/tools/index.ts:1-,src/tools/_handler.ts:1-
部署、主机集成与配置
本页说明 agentchat-mcp 在 MCP(Model Context Protocol)主机环境中的部署方式、主机集成路径以及运行期配置,重点覆盖打包产物、环境变量、主机连接配置和客户端标识。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
项目产物与构建配置
agentchat-mcp 是一个标准的 Model Context Protocol 服务器,使用 TypeScript 实现,最终产物为通过 tsc 编译后的纯 ESM JavaScript 包。
package.json中声明"type": "module"与"bin"字段,使安装后可直接以命令行方式调用 MCP 服务器 资料来源:package.json:1-40- 构建脚本使用
tsc进行 TypeScript 编译,并通过prepare在安装阶段自动构建产物 资料来源:package.json:10-25 tsconfig.json配置target: ES2022、module: NodeNext与moduleResolution: NodeNext,确保以 Node.js 原生 ESM 形式运行 资料来源:tsconfig.json:1-30
MCP 主机通常通过 npx 或本地路径调用 @agentchat/mcp 的可执行入口,从而启动 stdio MCP 服务器。
主机集成方式
agentchat-mcp 支持通过标准 MCP 主机配置进行集成,常见主机包括 Claude Desktop、Cursor、Windsurf、Cline 等。
Smithery 一键安装
仓库根目录提供 smithery.yaml,声明该 MCP 服务器可在 Smithery 平台上被自动识别与安装。
smithery.yaml描述了服务器元数据、运行时类型为node、启动命令为npx -y @agentchat/mcp资料来源:smithery.yaml:1-20- 用户可通过 Smithery 提供的安装链接完成 MCP 主机的注册,无需手动编辑 JSON 配置 资料来源:README.md:30-60
手动主机配置
对于不支持 Smithery 的主机,可通过编辑主机的 MCP 配置文件(如 claude_desktop_config.json)手动添加:
{
"mcpServers": {
"agentchat": {
"command": "npx",
"args": ["-y", "@agentchat/mcp"]
}
}
}
主机会以 stdio 方式启动服务器进程,并通过 MCP 协议完成能力协商与工具调用 资料来源:README.md:40-90。
运行期环境变量与配置
运行期配置集中在 src/env.ts 中,通过集中读取环境变量来控制服务器行为,避免在业务逻辑中分散读取。
src/env.ts提供统一的env对象,封装对process.env的访问,并提供默认值与类型转换 资料来源:src/env.ts:1-40- 关键配置项通常包括 API Key、服务地址、是否启用调试日志等 资料来源:src/env.ts:20-60
src/index.ts在启动时读取env,并将其注入到 MCP 服务器注册的工具实现中 资料来源:src/index.ts:20-50
这种集中式配置便于在不同的 MCP 主机环境下通过环境变量覆盖默认行为,而无需修改源码。
客户端标识与会话
在 MCP 多客户端场景下,agentchat-mcp 通过客户端标识机制区分不同的连接实例。
src/client-identity.ts定义客户端标识的数据结构与生成逻辑,用于追踪每个 MCP 主机会话 资料来源:src/client-identity.ts:1-40- 服务器在
initialize阶段读取主机提供的客户端信息,并生成本地会话标识 资料来源:src/client-identity.ts:20-60 - 工具调用过程中,会话标识被用于日志关联与状态隔离,避免多主机共享同一进程时发生串扰 资料来源:src/index.ts:60-100
部署拓扑概览
下表总结了 agentchat-mcp 在典型部署场景中的配置要点。
| 场景 | 启动方式 | 配置位置 |
|---|---|---|
| Smithery 安装 | npx -y @agentchat/mcp | Smithery 平台 |
| Claude Desktop | 编辑 claude_desktop_config.json | 主机配置目录 |
| 本地开发 | npm run start | 仓库根目录 |
| 容器化部署 | Node.js 镜像 + stdio | 环境变量 |
整体上,agentchat-mcp 的部署与主机集成遵循 MCP 协议的 stdio 模式,配置面收敛在环境变量与主机 JSON 文件两端,便于在不同 MCP 主机之间复用同一份服务器产物 资料来源:README.md:1-120。
来源:https://github.com/agentchatme/agentchat-mcp / 项目说明书
运维、错误映射与生命周期管理
agentchat-mcp 是一个基于 MCP(Model Context Protocol)协议的多代理协作运行时。它在运行期需要同时回答几类问题:能否让多少个工具调用并发跑?出错后如何把内部异常翻译成协议级错误返回给客户端?进程如何启动、监听、并在收到信号后优雅停机?日志如何贯穿整条调用链?本页围绕 semaphore.ts、errors.ts、log.ts、serve...
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
agentchat-mcp 是一个基于 MCP(Model Context Protocol)协议的多代理协作运行时。它在运行期需要同时回答几类问题:能否让多少个工具调用并发跑?出错后如何把内部异常翻译成协议级错误返回给客户端?进程如何启动、监听、并在收到信号后优雅停机?日志如何贯穿整条调用链?本页围绕 semaphore.ts、errors.ts、log.ts、server.ts、client.ts 与 tools/_handler.ts 这六个核心支撑文件,串起"运维 + 错误映射 + 生命周期"三个主题。
一、并发闸门:`semaphore.ts`
src/semaphore.ts 提供一个极简的计数信号量,用来限制同一时刻可执行的异步操作数量,避免 MCP server 在大量工具调用下耗尽 socket、文件句柄或下游 LLM 配额。
- 暴露
acquire()/release()两类方法:acquire()在计数达到上限时挂起Promise,release()唤醒最早等待的请求者 资料来源:src/semaphore.ts。 - 调用方采用
try/finally模式保证即便业务抛出异常也能归还配额,从而不会出现"信号量泄漏"导致进程逐渐卡死 资料来源:src/semaphore.ts:acquire/release。 - 该信号量被
tools/_handler.ts在分发工具调用前后包裹,是整个 server 并发模型的咽喉 资料来源:src/tools/_handler.ts:dispatch loop。
二、错误体系:`errors.ts` 与协议映射
src/errors.ts 定义了项目统一的内部异常层级,并提供把任意异常"翻译"为 MCP 标准错误结构的工具函数。
2.1 自定义错误类
文件中导出的多个 class 继承自一个基类 AgentChatError,并附带 code(字符串)、httpStatus 与可读的 message。典型分类包括:参数校验失败、远端调用超时、agentchat 上游 API 错误、限流触发以及未实现的功能等。每一类都给出稳定字符串 code,便于上层做条件分支或日志聚合 资料来源:src/errors.ts:error classes。
2.2 映射到 MCP
工具调用路径上的 toMcpError(err) 函数读取 err.code 与 err.message,封装为 { isError: true, content: [{ type: "text", text }] } 这种符合 MCP 规范的返回体。这样既保留原始语义,又避免把堆栈暴露给客户端 资料来源:src/errors.ts:toMcpError。在 tools/_handler.ts 中,任何未被捕获的异常都会先经过 toMcpError,再回写到 MCP CallToolResult 字段,保证协议的契约一致 资料来源:src/tools/_handler.ts:catch block。
三、日志体系:`log.ts`
src/log.ts 负责提供一个轻量的、贯穿 client / server / tools 三层的日志门面。
- 使用
pino风格的结构化输出,并把日志级别通过环境变量(如LOG_LEVEL)进行控制,默认info资料来源:src/log.ts:level handling。 - 提供
child(bindings)方法,给每个 MCP 连接、每次工具调用生成带requestId/toolName的子 logger,便于链路追踪 资料来源:src/log.ts:child logger。 - 所有
ERROR日志都把err.code(来自errors.ts)写入结构化字段,从而下游日志系统可按code聚合告警 资料来源:src/log.ts:error formatting。
四、生命周期:`server.ts` 与 `client.ts`
4.1 Server 端生命周期
src/server.ts 描述了 MCP server 从加载到退出的完整状态机:
| 阶段 | 关键动作 | 主要文件位置 |
|---|---|---|
| 启动 | 读取配置、初始化 logger、注册 tools、握手 transport | src/server.ts:bootstrap |
| 运行 | 监听 stdin/stdout 或 HTTP transport、分发请求 | src/server.ts:serve loop |
| 关停 | 捕获 SIGINT/SIGTERM、关闭 transport、await 排空在途任务 | src/server.ts:shutdown |
| 异常退出 | 未捕获错误打印堆栈并以非零码退出 | src/server.ts:unhandled |
启动阶段会构造一个全局 semaphore,其上限通常与 CPU 核心数或配置项 MAX_CONCURRENCY 一致;关闭阶段会先调用 drain(),等待所有持有者归还 token,再 process.exit(0) 资料来源:src/server.ts:shutdown sequence。
4.2 Client 端生命周期
src/client.ts 实现一个可重连的 MCP client,状态机相对轻量:
stateDiagram-v2
[*] --> Idle
Idle --> Connecting: connect()
Connecting --> Ready: handshake ok
Connecting --> Idle: handshake fail (retry)
Ready --> Closed: close()
Ready --> Ready: callTool() / listTools()
Closed --> [*]connect()内部带退避重试,每次失败都由log.ts记warn级日志并把errors.ts的code透传出去 资料来源:src/client.ts:connect()。close()先await当前 in-flight 请求结束,再断开 transport,避免半关闭 socket 资料来源:src/client.ts:close()。
五、串联:一次完整调用的运维视角
下面以"客户端调用 tool.foo"为例,把六个文件的协作串成一条时序线:
client.ts发送tools/call请求并为本次调用生成requestId;server.ts接收请求后由tools/_handler.ts取出目标工具;_handler.ts在执行前调用semaphore.acquire(),超过上限则排队;- 工具函数运行;失败时抛
AgentChatError子类,由toMcpError()翻译为 MCP 错误体 资料来源:src/tools/_handler.ts:catch block; log.ts的 child logger 把requestId/toolName/err.code一并写入;_handler.ts在finally中release()信号量;- server 收到
SIGTERM时进入 shutdown,等待在途调用归还配额后退出 资料来源:src/server.ts:shutdown sequence。
小结
semaphore.ts提供进程内的并发安全网;errors.ts+tools/_handler.ts形成"内部异常 → MCP 错误"的稳定翻译层;log.ts提供带链路字段的结构化日志,贯穿调用全链;server.ts与client.ts共同维护进程级状态机,做到启动可控、关停有序。
这套组合让 agentchat-mcp 在多 agent、高并发、长时间运行的场景下,既能保证协议契约,又能给出可观测、可排障的运维信号。
来源:https://github.com/agentchatme/agentchat-mcp / 项目说明书
失败模式与踩坑日记
保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。
安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。
假设不成立时,用户拿不到承诺的能力。
新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
风险会影响是否适合普通用户安装。
Pitfall Log / 踩坑日志
项目:agentchatme/agentchat-mcp
摘要:发现 7 个潜在踩坑项,其中 0 个为 high/blocking;最高优先级:配置坑 - 可能修改宿主 AI 配置。
1. 配置坑 · 可能修改宿主 AI 配置
- 严重度:medium
- 证据强度:source_linked
- 发现:项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主,或安装命令涉及用户配置目录。
- 对用户的影响:安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。
- 证据:capability.host_targets | https://github.com/agentchatme/agentchat-mcp | host_targets=openclaw, mcp_host, claude_code, claude, cursor
2. 能力坑 · 能力判断依赖假设
- 严重度:medium
- 证据强度:source_linked
- 发现:README/documentation is current enough for a first validation pass.
- 对用户的影响:假设不成立时,用户拿不到承诺的能力。
- 证据:capability.assumptions | https://github.com/agentchatme/agentchat-mcp | README/documentation is current enough for a first validation pass.
3. 维护坑 · 维护活跃度未知
- 严重度:medium
- 证据强度:source_linked
- 发现:未记录 last_activity_observed。
- 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
- 证据:evidence.maintainer_signals | https://github.com/agentchatme/agentchat-mcp | last_activity_observed missing
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 证据:downstream_validation.risk_items | https://github.com/agentchatme/agentchat-mcp | no_demo; severity=medium
5. 安全/权限坑 · 存在评分风险
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:风险会影响是否适合普通用户安装。
- 证据:risks.scoring_risks | https://github.com/agentchatme/agentchat-mcp | no_demo; severity=medium
6. 维护坑 · issue/PR 响应质量未知
- 严重度:low
- 证据强度:source_linked
- 发现:issue_or_pr_quality=unknown。
- 对用户的影响:用户无法判断遇到问题后是否有人维护。
- 证据:evidence.maintainer_signals | https://github.com/agentchatme/agentchat-mcp | issue_or_pr_quality=unknown
7. 维护坑 · 发布节奏不明确
- 严重度:low
- 证据强度:source_linked
- 发现:release_recency=unknown。
- 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
- 证据:evidence.maintainer_signals | https://github.com/agentchatme/agentchat-mcp | release_recency=unknown
来源:Doramagic 发现、验证与编译记录