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 通信与上下文共享的复杂度。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 3.1 服务端

继续阅读本节完整说明和来源证据。

章节 3.2 客户端

继续阅读本节完整说明和来源证据。

章节 3.3 端到端协作流程

继续阅读本节完整说明和来源证据。

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

服务端在启动时:

  1. 加载本地注册的 tools / resources / prompts 列表;
  2. 监听来自 MCP 客户端的 initializetools/listtools/call 等 JSON-RPC 请求;
  3. 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 字段协商双方支持的能力子集,例如 toolsresources 等。资料来源: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-120src/client.ts:40-120

4. 构建、打包与发布

tsup.config.ts 将 TypeScript 源码编译为:

  • dist/index.js:作为库入口(ESM);
  • dist/server.js / dist/client.js:作为子路径模块入口;
  • dist/cli.js:对应 package.jsonbin.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.tssrc/tools/_types.ts通用校验、上下文、类型契约
业务实现src/tools/send-message.tslist-inbox.tsget-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-

扩展指南

新增一个工具时,通常遵循以下步骤:

  1. src/tools/ 中新增一个独立文件,实现该动作的核心逻辑;
  2. _types.ts 中补充该工具所需的输入/输出类型(如为通用字段);
  3. _handler.ts 中注册统一处理钩子(若涉及共享校验);
  4. index.ts 中导出并加入工具列表。

由于各工具脚本彼此独立,新增动作不会影响其他工具的可用性,这使得工具集可以随 agentchat 业务演进而持续扩展。

资料来源:src/tools/index.ts:1-,src/tools/_handler.ts:1-

部署、主机集成与配置

本页说明 agentchat-mcp 在 MCP(Model Context Protocol)主机环境中的部署方式、主机集成路径以及运行期配置,重点覆盖打包产物、环境变量、主机连接配置和客户端标识。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 Smithery 一键安装

继续阅读本节完整说明和来源证据。

章节 手动主机配置

继续阅读本节完整说明和来源证据。

项目产物与构建配置

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: ES2022module: NodeNextmoduleResolution: 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 通过客户端标识机制区分不同的连接实例。

部署拓扑概览

下表总结了 agentchat-mcp 在典型部署场景中的配置要点。

场景启动方式配置位置
Smithery 安装npx -y @agentchat/mcpSmithery 平台
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...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 2.1 自定义错误类

继续阅读本节完整说明和来源证据。

章节 2.2 映射到 MCP

继续阅读本节完整说明和来源证据。

章节 4.1 Server 端生命周期

继续阅读本节完整说明和来源证据。

agentchat-mcp 是一个基于 MCP(Model Context Protocol)协议的多代理协作运行时。它在运行期需要同时回答几类问题:能否让多少个工具调用并发跑?出错后如何把内部异常翻译成协议级错误返回给客户端?进程如何启动、监听、并在收到信号后优雅停机?日志如何贯穿整条调用链?本页围绕 semaphore.tserrors.tslog.tsserver.tsclient.tstools/_handler.ts 这六个核心支撑文件,串起"运维 + 错误映射 + 生命周期"三个主题。

一、并发闸门:`semaphore.ts`

src/semaphore.ts 提供一个极简的计数信号量,用来限制同一时刻可执行的异步操作数量,避免 MCP server 在大量工具调用下耗尽 socket、文件句柄或下游 LLM 配额。

  • 暴露 acquire() / release() 两类方法:acquire() 在计数达到上限时挂起 Promiserelease() 唤醒最早等待的请求者 资料来源: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.codeerr.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、握手 transportsrc/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.tswarn 级日志并把 errors.tscode 透传出去 资料来源:src/client.ts:connect()。
  • close()await 当前 in-flight 请求结束,再断开 transport,避免半关闭 socket 资料来源:src/client.ts:close()。

五、串联:一次完整调用的运维视角

下面以"客户端调用 tool.foo"为例,把六个文件的协作串成一条时序线:

  1. client.ts 发送 tools/call 请求并为本次调用生成 requestId
  2. server.ts 接收请求后由 tools/_handler.ts 取出目标工具;
  3. _handler.ts 在执行前调用 semaphore.acquire(),超过上限则排队;
  4. 工具函数运行;失败时抛 AgentChatError 子类,由 toMcpError() 翻译为 MCP 错误体 资料来源:src/tools/_handler.ts:catch block;
  5. log.ts 的 child logger 把 requestId / toolName / err.code 一并写入;
  6. _handler.tsfinallyrelease() 信号量;
  7. server 收到 SIGTERM 时进入 shutdown,等待在途调用归还配额后退出 资料来源:src/server.ts:shutdown sequence。

小结

  • semaphore.ts 提供进程内的并发安全网;
  • errors.ts + tools/_handler.ts 形成"内部异常 → MCP 错误"的稳定翻译层;
  • log.ts 提供带链路字段的结构化日志,贯穿调用全链;
  • server.tsclient.ts 共同维护进程级状态机,做到启动可控、关停有序。

这套组合让 agentchat-mcp 在多 agent、高并发、长时间运行的场景下,既能保证协议契约,又能给出可观测、可排障的运维信号。

来源:https://github.com/agentchatme/agentchat-mcp / 项目说明书

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

medium 可能修改宿主 AI 配置

安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。

medium 能力判断依赖假设

假设不成立时,用户拿不到承诺的能力。

medium 维护活跃度未知

新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。

medium 存在评分风险

风险会影响是否适合普通用户安装。

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 发现、验证与编译记录