embedded-mcp-toolkit

embedded-mcp-toolkit

基于MCP协议的嵌入式板卡远程管理工具,提供串口、SSH和本地PowerShell的交互能力,支持会话管理、一键登录等功能。

Category
Visit Server

README

一、简介

1. 是什么?

embedded-mcp-toolkit 是一个基于 MCP(Model Context Protocol)协议的嵌入式板卡远程管理工具,通过多个 MCP 工具提供嵌入式设备交互能力。支持以下功能:

  • 串口管理:打开/关闭串口连接、发送命令、读取输出、一键登录(自动检测 PSH 并解锁)、进入 U-Boot 命令行
  • SSH 管理:打开/关闭 SSH 会话、发送命令、读取输出、一键登录(自动检测 PSH 并解锁)、查看远端设备活跃连接
  • 本地 PowerShell:打开/关闭本地 PowerShell 会话、发送命令、读取输出,方便在对话中直接操作 Windows 环境
  • Windows 系统扫描:扫描可用 COM/LPT 端口、扫描本机网络适配器与 IP 配置
  • 基础信息:查询 MCP 服务器版本、获取当前设备配置信息
  • 多会话管理:同时保持多个串口、SSH、PowerShell 会话,支持独立读写
  • KeyProvider 密钥管理:支持文件 IPC 和终端交互两种方式,自动处理 PSH 动态口令生成的密钥
  • 进程退出自动清理:客户端断开或进程终止时自动释放所有串口、SSH、PowerShell 连接

2. 架构关系

OpenCode、MCP Client 与 MCP Server 的三层关系如下:

┌─────────────────────────────────────────────┐
│  OpenCode (MCP Host)                        │
│  ┌────────────┐  ┌────────────┐             │
│  │ MCP Client │  │ MCP Client │  ...        │
│  │ (stdio)    │  │ (http)     │             │
│  └─────┬──────┘  └─────┬──────┘             │
└────────┼───────────────┼────────────────────┘
         │               │
    stdin/stdout      HTTP/SSE
         │               │
┌────────┴────────┐   ┌──┴───────────┐
│ MCP Server A    │   │ MCP Server B │
│ (embedded-mcp-  │   │ (其他服务)    │
│  toolkit)       │   │              │
└─────────────────┘   └──────────────┘
角色 说明 在本项目中的体现
MCP Host AI 应用,管理多个 Client,把 tool result 喂给 LLM OpenCode / Claude Code
MCP Client Host 内部组件,与 Server 保持 1:1 连接,通过 JSON-RPC 通信 Host 每配置一个 Server 就创建一个 Client
MCP Server 提供 tools 供 Agent 调用的独立进程 embedded-mcp-toolkit

通信流程:OpenCode 读取配置 → 创建 MCP Client → 以 stdio 启动 MCP Server 子进程 → 双方通过 JSON-RPC 通信。Agent 说"调用 xx 工具"时,Host 通过 Client 向 Server 发 tools/call,结果返回给 LLM。

注意:Server 发送的推送通知(如 notifications/message)由 Client 接收后止于 Host,不会转发给 Agent。因此需要 Agent 感知的事件应通过 tool 返回值(pull 模式)传递,详见开发计划 2

3. 怎么安装

2.1 npm

目前支持工具的全局安装和本地指定目录安装,但是全局安装后还是只能在某个目录配置使用(需要claude配置文件、设备配置文件、mcp配置文件以及日志等),暂未测试过全局配置。

mkdir mcp-toolkit
cd mcp-toolkit

# 当前目录安装
npm i @smai-kit/embedded-mcp-toolkit

# 初始化
./node_modules/.bin/embedded-mcp-toolkit init

安装配置完成后目录结构如下:

mcp-toolkit
├── .claude                      # claude配置目录   
│   ├── CLAUDE.md
│   ├── settings.local.json      # 项目配置文件,不用管
│   ├── skills                   # claude skills,只是写了一些技能,实际可能不需要
│   ├── start-claude.bat.tmp     # 以指定环境变量启动claude的bat脚本
│   └── start-claude.ps1.tmp     # 以指定环境变量启动claude的powershell脚本
├── .mcp.json                    # claude code的mcp配置文件
├── .opencode                    # opencode的配置目录,暂时不用管
│   └── opencode.json
├── configs                      # 配置目录
│   ├── challenge.txt            # 登录psh时的挑战码(动态口令)
│   ├── config.example.yaml      # 配置模板文件
│   ├── config.yaml              # 复制上面的模板文件,进行板子的添加和修改
│   └── password_input.txt       # 密钥文件,通过挑战码生成
├── log                          # 日志目录,当前claude启动时会自动创建,写入一些工具调用日志
│   ├── 2026-05-27_09-06-09.log
├── node_modules                 # node依赖包目录,可以不用管
│   ├── .bin
│   ├── .package-lock.json
│   ├── @smai-kit                # @smai-kit/embedded-mcp-toolkit中是编译后的js脚本
│   ├── #...
│   └── zod
├── package-lock.json
└── package.json                 # npm项目包依赖管理文件,不用管

2.2 源码安装

git clone源码后:

npm i         # 安装依赖
npm run build # 编译,编译后就可以在当前目录下启动claude使用了

4. 工具介绍

4.1 基础工具

工具名称 功能说明 常用提示词
greet_tool 测试工具,按名称问候 给苏木打个招呼
version_tool 获取 MCP 服务器版本和工具包信息 当前MCP版本是什么
device_info_tool 获取当前设备配置(SSH、串口、KeyProvider) 当前设备信息是什么 / 列出默认的设备

4.2 串口工具

工具名称 功能说明 常用提示词
serial_open 打开串口连接,启动交互式 shell 会话 打开串口 / 连接 COM3
serial_close 关闭串口会话,释放端口资源 关闭串口 / 退出串口 serial_1
serial_write 向串口会话发送命令 向串口发送命令 / 在串口执行 whoami
serial_read 读取串口会话的输出数据 读取串口输出 / 看看串口返回了什么
serial_list 列出所有活跃的串口会话 列出串口会话 / 当前有哪些串口连接
serial_exec 向串口发送命令并等待输出(write + delay + read) 在串口执行 uname -a / 让串口运行命令 xxx
serial_shell_login 一键串口登录,自动检测 PSH 状态并解锁 串口一键登录 / 串口登录 board-test
serial_enter_uboot 重启设备并进入 U-Boot 命令行 重启进入 uboot / 进入 U-Boot 命令行

4.3 SSH 工具

工具名称 功能说明 常用提示词
ssh_shell_open 打开交互式 SSH shell 会话 打开 SSH / SSH 连接 board-test
ssh_shell_close 关闭 SSH shell 会话,释放连接 关闭 SSH / 退出 ssh_1
ssh_shell_write 向 SSH 会话发送命令 SSH 发送命令 / 在 ssh 里执行 ls
ssh_shell_read 读取 SSH 会话的输出数据 读取 SSH 输出 / SSH 返回了什么
ssh_shell_list 列出所有活跃的 SSH 会话 列出 SSH 会话 / 当前有哪些 SSH 连接
ssh_shell_exec 向 SSH 发送命令并等待输出(write + delay + read) SSH 执行 ifconfig / 在 SSH 运行命令 xxx
ssh_shell_connection 检查远端板卡上活跃的 SSH 连接 查看设备上的 SSH 连接 / 谁连到了这台设备
ssh_shell_login 一键 SSH 登录,自动检测 PSH 状态并解锁 SSH 一键登录 / SSH 登录 board-test

4.4 Windows 工具

工具名称 功能说明 常用提示词
port_scan_tool 扫描 Windows 设备管理器中的 COM / LPT 端口 扫描可用串口 / 查看有哪些 COM 口
network_scan_tool 扫描 Windows 网络适配器和 IP 配置 扫描网络适配器 / 查看本机网卡信息
power_shell_open 打开本地 PowerShell 交互式会话 打开 PowerShell / 启动本地 PowerShell
power_shell_close 关闭 PowerShell 会话并终止进程 关闭 PowerShell / 退出 power_1
power_shell_write 向 PowerShell 会话发送命令 PowerShell 执行命令 / 执行 ps 命令 xxx
power_shell_read 读取 PowerShell 会话的输出数据 读取 PowerShell 输出 / PowerShell 返回了什么
power_shell_list 列出所有活跃的 PowerShell 会话 列出 PowerShell 会话 / 当前有哪些 ps 会话
power_shell_exec 向 PowerShell 发送命令并等待输出(write + delay + read) PowerShell 执行 ipconfig / 用 ps 运行 xxx

二、配置说明

1. claude配置

目前还未测试过全局配置,后续测试验证。当前配置下,只测试过在指定项目目录使用

1.1 .claude/settings.local.json

{
  "permissions": {
    "allow": [
      "mcp__embedded-board__device_info_tool",
      "mcp__embedded-board__ssh_shell_login",
      "mcp__embedded-board__ssh_shell_connection",
      "mcp__embedded-board__ssh_shell_close",
      "mcp__embedded-board__serial_shell_login",
      "mcp__embedded-board__serial_close",
      "mcp__embedded-board__serial_exec",
      "mcp__embedded-board__version_tool",
      "mcp__embedded-board__ssh_shell_exec",
      "mcp__embedded-board__serial_list",
      "mcp__embedded-board__serial_read",
      "mcp__embedded-board__ssh_shell_list"
    ]
  },
  "enabledMcpjsonServers": [
    "embedded-board"
  ]
}
  • permissions:允许claude自动执行而不需要用户确认,这个其实不用管,在claude code运行时会提醒 Yes, and don’t ask again for: xxxx,选择这个就会自动添加到这里,下一次再运行就不需要再确认。
  • enabledMcpjsonServers:启用的 MCP 服务器列表。当前仅启用 embedded-board

1.2 .mcp.json

此文件和.claude同级,文件内容如下(npm本地安装):

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "mcpServers": {
    "embedded-board": {
      "command": "./node_modules/.bin/embedded-mcp-toolkit",
      "args": [],
      "env": {
        "DEVICE": "board-b",
        "BOARD_CONFIG_PATH": "./configs/config.yaml",
        "LOG_SAVE": "1",
        "LOG_DIR": "./log"
      }
    }
  }
}

这个是MCP的配置文件。env 字段中定义的环境变量会在 Claude 启动 MCP server 时,注入到 MCP server 子进程process.env 中。也就是说,这些变量只在 src/mcp.ts 进程中通过 process.env.DEVICE 等方式读取,不会 影响 Claude 自身的 shell 环境变量。

  • DEVICE:默认的设备名称,对应 config.yamldevices 下的 key
  • BOARD_CONFIG_PATH:配置文件路径,相对于 MCP server 进程的工作目录(即启动 Claude 时的 cwd
  • LOG_SAVE:是否存储日志到文件("1" 表示开启),会记录工具调用信息,例如工具名称、调用时传入的参数
  • LOG_DIR:日志存储的目录,同样相对于 MCP server 进程的工作目录

Tips:MCP server 进程的工作目录就是启动 Claude(或其他 MCP 客户端)时所在的目录。可以在日志文件的第一行看到 cwd: xxx 来确认实际的工作目录。

环境变量不生效?看一下这里:常见问题 2. 环境变量未生效?

2. 日志信息

这个是在.mcp.json中配置的,得到的日志信息可能如下:

[2026-05-27 18:55:39] [INFO] MCP server starting... cwd: E:\AI\embedded-mcp-toolkit
[2026-05-27 18:55:39] [INFO] MCP server env: {"DEVICE":"board-b","BOARD_CONFIG_PATH":"./configs/config.yaml","LOG_SAVE":"1","LOG_DIR":"./log"}
[2026-05-27 18:56:20] [INFO] [greet_tool] name=苏木
[2026-05-27 18:56:27] [INFO] [version_tool]
[2026-05-27 18:56:38] [INFO] [device_info_tool] device=(default)
[2026-05-27 18:56:38] [INFO] Config loaded: E:\AI\embedded-mcp-toolkit\configs\config.yaml
[2026-05-27 18:56:38] [INFO] Device resolved: board-b
[2026-05-27 18:56:38] [INFO] [KeyProvider/ssh] challenge file: E:\AI\embedded-mcp-toolkit\configs\challenge.txt
[2026-05-27 18:56:38] [INFO] [KeyProvider/ssh] key file:       E:\AI\embedded-mcp-toolkit\configs\password_input.txt
[2026-05-27 18:56:38] [INFO] [KeyProvider/serial] challenge file: E:\AI\embedded-mcp-toolkit\configs\challenge.txt
[2026-05-27 18:56:38] [INFO] [KeyProvider/serial] key file:       E:\AI\embedded-mcp-toolkit\configs\password_input.txt
[2026-05-27 18:57:13] [INFO] [serial_open] device=(default) port=(auto) baudRate=115200
[2026-05-27 18:57:13] [INFO] Device resolved: board-b
[2026-05-27 18:57:13] [INFO] [serial_open] session opened: serial_1 port=COM3
[2026-05-27 18:57:36] [INFO] [serial_close] session_id=serial_1
[2026-05-27 18:57:55] [INFO] [serial_shell_login] device=(default) timeout=1500 key=(none)
[2026-05-27 18:57:55] [INFO] Device resolved: board-b
[2026-05-27 18:57:57] [INFO] [serial_shell_login] session opened: serial_2 port=COM3
[2026-05-27 18:58:13] [INFO] [serial_exec] session_id=serial_2 command=exit delay=1000 clear=1
[2026-05-27 18:58:27] [INFO] [serial_shell_login] device=(default) timeout=1500 key=(none)
[2026-05-27 18:58:27] [INFO] Device resolved: board-b
[2026-05-27 18:58:30] [INFO] Device resolved: board-b
[2026-05-27 18:58:30] [INFO] [KeyProvider/serial] challenge file: E:\AI\embedded-mcp-toolkit\configs\challenge.txt
[2026-05-27 18:58:30] [INFO] [KeyProvider/serial] key file:       E:\AI\embedded-mcp-toolkit\configs\password_input.txt
[2026-05-27 18:58:38] [INFO] [serial_shell_login] session reused: serial_2 port=COM3
[2026-05-27 18:58:54] [INFO] [serial_enter_uboot] session_id=serial_2 timeout=60s
[2026-05-27 18:59:11] [INFO] [serial_enter_uboot] detected any-key autoboot prompt
[2026-05-27 18:59:36] [INFO] [serial_exec] session_id=serial_2 command=help delay=3000 clear=1

会记录工具的名称、传入的参数等。

3. configs配置

3.1 config.yaml

# ============================================
# embedded-mcp-toolkit 设备配置文件模板
# 复制并修改: cp config.example.yaml config.yaml
# ============================================

# 默认使用的设备(对应 devices 下的 key)
default: board-b

devices:
  # ---- 设备 A ----
  board-a:
    ssh:
      host: "192.168.16.103"
      port: 22
      username: "root"
      password: "root"
      keyProvider:
        mode: "file" # file: 通过文件 IPC 获取密钥; terminal: 终端交互输入
        challengeFilePath: "./configs/challenge.txt" # 挑战信息写入文件路径
        keyFilePath: "./configs/password_input.txt" # 轮询密钥的文件路径
        pollInterval: 500 # 轮询间隔(毫秒)
        timeout: 120000 # 超时(毫秒),默认 2 分钟
    serial:
      port: "COM4"
      baudRate: 115200
      keyProvider:
        keyProvider:
        mode: "file"
        challengeFilePath: "./configs/challenge.txt"
        keyFilePath: "./configs/password_input.txt"
        pollInterval: 500
        timeout: 120000

  # ---- 设备 B ----
  board-b:
    ssh:
      host: "192.168.16.105"
      port: 22
      username: "root"
      password: "root"
      keyProvider:
        mode: "file"
        challengeFilePath: "./configs/challenge.txt"
        keyFilePath: "./configs/password_input.txt"
        pollInterval: 500
        timeout: 120000
    serial:
      port: "COM3"
      baudRate: 115200
      keyProvider:
        mode: "file"
        challengeFilePath: "./configs/challenge.txt"
        keyFilePath: "./configs/password_input.txt"
        pollInterval: 500
        timeout: 120000

一般来说只需要修改下面几个字段:

    ssh:
      host: "xxx.xxx.xxx.xxx" # 设备IP地址
      port: 22
      username: "root"        # 设备的用户名
      password: "root"        # 设备用户的登录密码
    serial:
      port: "COM3"            # 串口的端号
      baudRate: 115200        # 波特率

其中keyProvider是对于具有psh的设备在解密时提供密钥方式的选择,支持文件读写和终端输入,对于claude code中自动调用工具登录的场景,最好还是使用文件读写的方式。这个字段可以保持默认。

3.2 两个txt文本文件

configs/challenge.txt
configs/password_input.txt
  • configs/challenge.txt是存放动态口令的,当一键登录的时候,会自动读取串口或者ssh的动态口令并存储到这个文件中
  • configs/password_input.txt是存放密钥,使用动态口令生成密钥后写入这个文件即可

Tips:当密钥被读走后,这两个文件都会被清空。

三、简单示例

1. 启动 claude

cd mcp-toolkit
claude

然后可以在claude中执行 /mcp list来查看mcp服务是否连接:

╭─── Claude Code v2.1.152 ─────────────────────────────────────────────────────────────╮
│                                   │ Tips for getting started                         │
│           Welcome back!           │ Run /init to create a CLAUDE.md file with instr… │
│                                   │ ──────────────────────────────────────────────── │
│              ▐▛███▜▌              │ What's new                                       │
│             ▝▜█████▛▘             │ `/code-review --fix` now applies review finding… │
│               ▘▘ ▝▝               │ Skills and slash commands can now set `disallow… │
│                                   │ Added `/reload-skills` command to re-scan skill… │
│   Lanz-Auto · API Usage Billing   │ /release-notes for more                          │
│            D:\Temp\aaa            │                                                  │
╰──────────────────────────────────────────────────────────────────────────────────────╯


❯ /mcp list

────────────────────────────────────────────────────────────────────────────────────────
  Manage MCP servers
  1 server

    Project MCPs (D:\Temp\aaa\.mcp.json)
  ❯ embedded-board · ✔ connected · 18 tools

  https://code.claude.com/docs/en/mcp for help
 ↑/↓ to navigate · Enter to confirm · Esc to cancel

connected前面✔就表示mcp连接成功。

2. 常用提示词

# 获取当前设备信息
❯ 当前设备信息是什么

# 登录设备,没有xxx的话是会用默认设备
❯ ssh一键登录xxx设备
❯ 串口一键登录xxx设备

# 退出登录
❯ 退出xxx设备登录
❯ 关闭ssh_id
❯ 关闭串口serial_id
❯ 关闭所有会话

四、常见问题

1. 串口被拒绝(Port busy / Access denied)

Windows 下串口(COM 口)是独占资源,同一时间只能有一个进程打开。如果 MCP server 尝试打开串口时提示 Port is openAccess deniedPermission denied,说明该 COM 口已被其他程序占用。

1.1 常见占用场景

  • 其他串口调试工具未关闭(如 SecureCRT、PuTTY、MobaXterm、Xshell、minicom 等)
  • 资源管理器窗口打开着该串口(某些驱动会在资源管理器中锁定)
  • 上一个 MCP server 实例未正常退出,残留进程仍持有串口句柄
  • 虚拟机软件(VMware、VirtualBox)占用了宿主机串口做直通映射

1.2 排查方法

(1)关闭所有可能占用串口的工具,然后重试。

(2)Windows 任务管理器检查是否有残留的 node.exe 进程,如果有则结束掉。

(3)使用 PowerShell 查看串口占用(需要管理员权限):

# 查看当前系统可用串口
[System.IO.Ports.SerialPort]::GetPortNames()

# 查看串口设备详细信息
Get-WMIObject Win32_SerialPort | Select-Object Name, Description, DeviceID

(4)在设备管理器(devmgmt.msc)中确认 COM 口编号未变化(USB 转串口设备重新插拔后编号可能改变)。

1.3 解决方法

  • 关闭占用程序后重试
  • 如果是在 Claude 中,先执行"关闭所有会话"确保释放串口,再重新登录
  • 重新插拔 USB 转串口设备,确认 COM 口编号后在 config.yaml 中更新 serial.port 字段

<a id="section1">2. 环境变量未生效?</a>

如果启动后日志中没有看到 env 信息,或者工具运行时读取不到这些变量,可以从以下几个方面排查:

(1)Claude Code 版本过低:也可能是个原因吧,我使用的是 2.1.152 版本。更新命令:

npm list -g @anthropic-ai/claude-code              # 查看当前系统安装的node包的版本
npm view @anthropic-ai/claude-code versions --json # 查看 npm 服务器上发布的所有版本
npm i -g @anthropic-ai/claude-code                 # 全局安装

(2).mcp.json 文件路径不正确:该文件必须放在 Claude 启动时的项目根目录下(与 .claude/ 目录同级)。如果放错了位置,Claude 不会读取它。

(3)enabledMcpjsonServers 未配置:需要在 .claude/settings.local.json 中配置 "enabledMcpjsonServers": ["embedded-board"],否则 Claude 不会启动对应的 MCP server。

(4)修改 .mcp.json 后未重启 Claude.mcp.json 只在 Claude 启动时读取一次。修改后需要完全退出 Claude 再重新启动,新的环境变量才会生效。

(5)JSON 格式错误.mcp.json 中缺少逗号、引号不匹配等语法错误会导致整个文件解析失败,Claude 可能静默忽略该配置。

(6)command 路径错误:如果 command 指定的脚本路径不存在(如未执行 npm install 导致 ./node_modules/.bin/embedded-mcp-toolkit 不存在),MCP server 无法启动,环境变量自然也无法被读取。

(7)相对路径的工作目录问题BOARD_CONFIG_PATHLOG_DIR 使用的是相对路径,它们是相对于 MCP server 进程的 cwd(即启动 Claude 时所在的目录)解析的。如果不是从项目根目录启动 Claude,这些相对路径可能指向错误的位置。

3. 其他问题

......

五、开发计划

1. Shell 会话持续监听与错误扫描

1.1 目标

改造 shell 会话(adb/ssh/serial/powershell)的数据采集机制,从"按需收集"升级为"持续监听 + 并行扫描",使 AI 能在任意时间点获取完整会话输出及已识别的错误告警。

1.2 架构设计

stdout/stderr.on("data") ──→ appendBuffer(data)
                               ├── 存入 #buffer(等待 read() 拉取)
                               └── 即时扫描错误模式 → 命中则记入 #alerts 列表

两路并行

通路 功能 触发方式
数据存储 持续写入 #buffer,不再丢弃 data 事件自动触发
模式识别 扫描 error pattern,写入 #alerts data 事件自动触发

与现有行为对比

  • 现有#collecting 仅在 write()read() 之间开启,其余时间数据丢弃
  • 改造后open()#collecting 始终为 true,所有输出持续归档

1.3 TODO 任务清单

# 状态 任务 涉及文件 优先级
1 去掉 #collecting = false 关闭点 src/transport/adb.ts
open() 中 banner 收集后不再关闭 #collectingread(clear=1) 中保留 #buffer = "" 但不关闭 #collecting
2 新增 #alerts 告警队列与 Alert 类型定义 src/transport/adb.ts
定义 Alert { pattern, timestamp, detail } 结构;新增 #alerts: Alert[] 成员
3 实现 #scanAlerts(data) 错误模式扫描器 src/transport/adb.ts
预定义嵌入式常见错误正则库(kernel panic、OOM、segfault、watchdog timeout 等);在 appendBuffer 入口调用 #scanAlerts(data)
4 增强 read() 返回值结构 src/transport/adb.ts
read() 返回 { data, alerts: [{ pattern, timestamp, detail }] };如有未读告警一并返回并清空 #alerts
5 增强 exec() 返回值,附带 alerts src/mcp/tools/adb/shell.ts
exec() 内部调用 read() 后,将 alerts 一并封装进 MCP 响应内容
6 适配 SSH transport src/transport/ssh.ts
对 ssh.ts 做与 adb.ts 相同的改造(持续 buffer + 错误扫描 + alerts)
7 适配 Serial transport src/transport/serial.ts
对 serial.ts 做相同改造
8 适配 PowerShell transport src/transport/powershell.ts
对 powershell.ts 做相同改造
9 抽取公共基类/混入,消除重复代码 src/transport/
四个 transport 类存在大量重复的 buffer/collecting 逻辑,改造完成后考虑抽取 BaseTransport 抽象类

1.4 错误模式库

模式名 正则 / 关键字 场景
kernel_panic Kernel panic 内核崩溃
oom Out of memory / OOM killer 内存耗尽
segfault Segmentation fault 段错误
watchdog_timeout watchdog.*timeout 看门狗超时
bus_error Bus error 总线错误
gpio_error gpio.*error GPIO 异常
i2c_error i2c.*error I2C 通信异常
spi_error spi.*error SPI 通信异常
uart_error uart.*error / serial.*error 串口异常
mount_error mount.*fail 挂载失败
network_down link down / network unreachable 网络断开
nand_error nand.*(error|fail) NAND 闪存异常
emmc_error mmc.*error / mmcblk.*error eMMC 异常

1.5 预期效果

  • AI 调用 exec("dmesg") 后,返回值中自动附带 alerts: [{ pattern: "oom", detail: "..." }],无需 AI 自行解析长文本
  • 后台持续采集不丢数据,即使 AI 间隔较长时间才调用下一次 read()
  • 告警在 stdout 到达瞬间即被识别,不依赖 AI 轮询频率

2. Agent 消息拉取通知

2.1 目标

MCP 协议的服务端推送通知(notifications/message)由 host 拦截,无法直接到达 Agent(LLM)。改为 pull 模式:服务端维护事件消息队列,Agent 通过工具主动拉取,实现 Agent 可感知的异步通知。

2.2 架构设计

会话事件(断开/超时/异常) ──→ messageQueue.push(event)
                                    ↓
Agent 调用 fetch_notifications_tool ──→ 取出并清空 messageQueue → 返回给 Agent

与 push 通知对比

push 通知 pull 拉取
方向 服务端→host Agent→服务端(请求-响应)
Agent 可见 否(host 拦截) 是(作为 tool result 返回)
实现依赖 需 host 适配 标准 MCP tool 即可

2.3 TODO 任务清单

# 状态 任务 涉及文件 优先级
1 定义消息队列与事件类型 src/infra/
定义 EventMessage { type, timestamp, detail } 结构;实现 MessageQueue 类(push / drain)
2 新增 fetch_notifications_tool 拉取工具 src/mcp/tools/basic/
Agent 调用后返回消息队列中的全部事件并清空;无事件时返回提示信息
3 会话异常断开时自动写入消息队列 src/mcp/tools/{ssh,serial,adb,win}/
SSH/串口/ADB/PowerShell 会话因网络中断、超时、进程退出等原因断开时,自动将事件入队
4 客户端断开时推送告警 src/mcp/server.ts
stdin close 回调中,将"client disconnected"事件写入消息队列(需注意此时可能已无法响应工具调用)

2.4 预期效果

  • Agent 在每次操作前/后调用 fetch_notifications_tool 检查是否有异步事件,无需持续轮询
  • 会话断开等异常不再"静默丢失",Agent 能在下一轮对话中获知
  • 不依赖 host 的特殊适配,标准 MCP tool 即可工作

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured