乐于分享
好东西不私藏

嵌入式工程师AI辅助开发笔记:Agent、Skill与MCP实践指南

嵌入式工程师AI辅助开发笔记:Agent、Skill与MCP实践指南

一、嵌入式工程师如何面对AI?

AI正在深刻改变软件开发方式。对于嵌入式工程师而言,AI并非威胁,而是提升效率的利器。关键在于理解AI的能力边界,并将其融入现有工作流。

核心原则

  • AI擅长:编写、调试、维护代码这类“战术性”工作
  • 人类聚焦:系统架构设计、战略决策、软硬件协同优化
  • 价值护城河:对物理世界交互、硬件边界条件的深刻理解

推荐学习路径

  1. 夯实基础:深入STM32/Linux嵌入式项目实践
  2. 补充Python及常用库(Numpy、Pandas),为AI数据处理做准备
  3. 学习TinyML,将AI模型部署到低功耗MCU
  4. 实践Agent开发,从低代码平台开始
  5. 构建“云-边-端”智能系统,实现端侧AI部署

二、AI Agent、Skill、MCP的概念与关系

2.1 AI Agent(智能体)

定义:以LLM为“大脑”,具备记忆、规划、工具调用能力的自主执行单元。

类比:一位总指挥,接收高层任务(如“测试串口通信”),自主分解步骤,调用合适工具,并根据反馈调整策略。

特点

  • 推理资源消耗较高
  • 适应性强,能处理未预见的异常
  • 可调用Skill和MCP Server完成具体动作

2.2 Skill(技能)

定义:一个声明式的标准化操作流程(SOP),通常以Markdown文本文件形式存在。

类比:操作手册或备忘单。当Agent需要完成特定任务(如“测试串口”)时,它读取Skill文档,按步骤执行。

特点

  • 轻量、快速、可复用
  • 不直接操作硬件,而是指导Agent调用哪些MCP工具
  • 通过关键词或用户指令触发

2.3 MCP(Model Context Protocol)

定义:一个开放标准的应用层协议,定义了AI与外部工具/资源之间的通信方式及工具描述格式。

类比:一个“万能遥控器”的通信协议。Agent通过MCP协议控制MCP Server(实际干活的程序),MCP Server再操作硬件或系统资源。

核心要素

  • MCP Server:独立的用户态进程,封装具体功能(如串口读写、SSH执行)。运行在与Agent相同或不同的主机上。
  • 传输方式:常用stdio(本地进程间通信)或HTTP(远程服务)。
  • 工具描述:MCP Server会列出所有可用工具及其参数、说明,供Agent理解调用。

MCP vs RESTful API:MCP专为LLM设计,工具描述包含自然语言说明,AI无需预训练即可理解如何调用。

2.4 三者关系总结

组件 角色 表现形式 生命周期
Agent 总指挥 推理引擎 + 记忆 + 规划 持续运行(会话级)
Skill SOP手册 .md文本文件 被Agent读取时生效
MCP Server 执行工具 独立进程 由Agent启动或常驻

协作流程:用户下达任务 → Agent理解并规划 → 读取对应Skill获取步骤 → 按步骤调用MCP Server提供的工具 → MCP Server执行具体操作(读写串口、SSH命令等)→ 结果返回Agent → Agent判定并生成报告。
已在笔记中新增「深入理解Agent」与「深入理解Skill」两个独立章节,使其与MCP内容更加均衡。整体结构保持不变,确保逻辑连贯且无个人信息残留。


三、深入理解Agent

Agent并非简单的大模型“包装壳”,而是一个具备自主闭环能力的智能体。其核心运行机制可归纳为 P-E-O-R循环

  • 规划:将用户的高层目标分解为若干可执行的子任务。
  • 执行:调用工具(如MCP Server、代码执行器、API等)完成任务。
  • 观察:接收工具返回的结果或环境反馈。
  • 反思:根据观察结果判断是否达成目标;若未达成,则重新规划。

3.1 Agent的四大核心组件

  1. 大模型(大脑):负责推理、生成计划和决策。
  2. 记忆
    • 短期记忆:当前会话的上下文信息(对话历史、任务状态)。
    • 长期记忆:跨会话持久化的知识(向量数据库、文件、外部存储)。
  3. 工具集:Agent可调用的外部能力,通过MCP或内置函数暴露。
  4. 规划模块:将复杂任务拆解为行动序列,支持动态调整。

3.2 Agent与普通LLM的区别

能力 普通LLM Agent
对话
一次任务执行 ✅(需人工分步引导) ✅(自主完成全流程)
工具调用 受限或需手动编写代码 ✅(通过MCP标准化调用)
错误恢复 ✅(观察→反思→重试/改方案)
跨会话记忆 ✅(借助长期记忆)

3.3 Agent的典型应用场景(嵌入式领域)

  • 自动化测试:烧录代码 → 运行测试 → 读取日志 → 判断通过率 → 生成报告。
  • 固件调试:通过JTAG/SWD读取内存 → 分析异常栈 → 定位bug → 提出修复建议。
  • 硬件验证:控制信号发生器 → 读取示波器数据 → 比对时序 → 标注异常波形。

四、深入理解Skill

Skill是为Agent编写的标准化操作流程文档,通常以Markdown(或YAML frontmatter + Markdown正文)格式存储。它告诉Agent:“当用户提到X场景时,请按照Y步骤执行,并注意Z事项”。

4.1 Skill的本质:上下文注入

Skill并非可执行代码,而是一段在运行时动态注入Agent系统提示词或上下文的文本。Agent读取Skill后,会将其中描述的步骤当作“行为准则”来遵循。

与普通Prompt的区别

  • Prompt:一次性指令,每次对话需重新描述。
  • Skill:可复用、可版本管理、支持参数化,且能组合使用。

4.2 一个标准Skill的结构

---
name: skill-name
description: 简短描述,用于Agent判断何时调用
---

# 技能标题

## 前置条件
- 需要用户提供的参数

## 执行步骤
1. 第一步:调用具体MCP工具或内置能力
2. 第二步:根据上一步结果做判断
3. ...

## 输出格式
要求Agent以特定模板输出结果

## 异常处理
遇到XX错误时,应该怎么做

4.3 Skill的触发方式

  • 显式调用:用户指令中包含技能名称(如“执行embedded-test技能”)。
  • 自动匹配:Agent根据用户自然语言描述,检索最相关的Skill并主动加载(需嵌入向量检索或关键词匹配)。
  • Slash Command:通过快捷命令(如 /test-uart)触发,可带参数。

4.4 编写高效Skill的最佳实践

  1. 步骤粒度适中:每一步应是Agent能直接调用一个MCP工具完成的原子操作。
  2. 包含判断分支:使用“若……则……否则……”描述异常流程。
  3. 提供示例:在Skill中加入输入/输出示例,减少Agent理解偏差。
  4. 参数化:使用 {{变量名}} 标记需要用户填充的内容。
  5. 明确失败处理:定义超时重试、错误上报等行为。

4.5 Skill与MCP、Agent的协作示例

假设Skill编写如下:

## 执行步骤
1. 调用 `serial_mcp``list_ports` 工具,获取可用串口列表。
2. 如果列表为空,则报告错误并终止。
3. 否则,选择第一个串口,调用 `open` 工具。

Agent在运行时会:

  • 语义理解步骤1 → 构造MCP请求 {"tool": "list_ports"} → 发送给MCP Server
  • 接收返回结果 → 判断是否为空 → 决定下一步

五、深入理解MCP

5.1 MCP不是什么?

  • 不是硬件接口(SPI、I2C、USB协议)
  • 不是驱动程序
  • 不是Agent的内置模块

5.2 MCP Server如何运行?

  • 位置:与Agent同一主机(本地工具)或远程服务器
  • 启动方式
    • stdio模式:由Agent客户端根据配置文件在启动时或会话开始时自动拉起子进程,会话结束则终止
    • HTTP模式:需单独部署为常驻服务,Agent通过HTTP调用

5.3 如何实现自定义MCP Server?

推荐框架:Python + FastMCP(极简装饰器模式)

示例:串口调试MCP Server(仅核心代码)

import serial
from fastmcp import FastMCP

mcp = FastMCP("MCU Debugger")

@mcp.tool
def uart_send(port: str, baudrate: int = 115200, command: str = "AT\r\n"):
    """向串口设备发送命令并等待响应"""
    with serial.Serial(port, baudrate, timeout=2) as ser:
        ser.write(command.encode())
        response = ser.readline()
    return response.decode().strip()

if __name__ == "__main__":
    mcp.run(transport="stdio")

开发步骤

  1. 编写核心功能函数(与普通脚本无异)
  2. 使用@mcp.tool装饰器注册工具,并写好文档字符串(AI会读取)
  3. 调用mcp.run(transport="stdio")启动服务

调试工具:MCP Inspector

npx @modelcontextprotocol/inspector python your_mcp_server.py

5.4 如何查找现有MCP服务?

  • Awesome MCP Servers:GitHub社区维护列表
  • MCP Registry:官方应用商店
  • 关键词搜索serial-mcp-serverssh-mcp-servermodbus-mcp-server
  • 嵌入式相关serial-tethermcp2serialssh-mcp-py

六、组合项目:自动化串口通信测试环境

6.1 项目目标

搭建一个全自动闭环:ClaudeCode编写测试代码 → SSH登录开发板并烧录 → 运行程序 → 通过USB转串口收发数据 → AI自动验证结果。

┌─────────────────────────────────────────────┐
│           你的 Ubuntu 主机                   │
│  ┌──────────────┐      ┌───────────────┐    │
│  │  ClaudeCode  │      │   MCP Server  │    │
│  │   (Agent)    │◄────►│  (独立进程)    │    │
│  └──────────────┘      └───────┬───────┘    │
│         ▲                       │            │
│         │ 读 Skill 文本          │ 通过       │
│         │                       │ /dev/ttyUSB0  │
│  ┌──────┴──────┐                │            │
│  │ Skill 文件  │                ▼            │
│  │ (.md)      │           ┌────────────┐    │
│  └─────────────┘           │ USB 串口线  │    │
│                            └─────┬──────┘    │
└──────────────────────────────────┼───────────┘
                                   │
                              ┌────┴─────┐
                              │ Linux    │
                              │ 硬件板子  │
                              └──────────┘

6.2 硬件拓扑

Ubuntu主机(运行ClaudeCode)
    ├─ USB转串口线 ──→ Linux开发板(UART)
    └─ 网络SSH ──────→ 开发板(用于烧录和执行)

6.3 所需组件

类型 名称 用途
MCP Server ssh-mcp-server(Node版)或 ssh-mcp-py 使AI能通过SSH执行命令、传输文件
MCP Server serial-mcp-server(实际命令为serial_mcp 使AI能操作本地USB串口设备
Skill embedded-test.md 定义完整测试流程的“剧本”
Agent ClaudeCode(已配置) 总指挥

6.4 详细配置步骤

步骤1:安装MCP Server

# 串口MCP(注意实际可执行文件名为 serial_mcp)
uvx --from serial-mcp-server serial_mcp

# SSH MCP(Node版本,支持密码认证)
npx -y @davidfei/ssh-mcp-server --host <开发板IP> --username <用户名> --password <密码>
若遇到权限问题:`sudo usermod -a -G dialout $USER` 后注销重登录。

步骤2:配置ClaudeCode的MCP客户端

在项目根目录创建或编辑 .mcp.json

{
  "mcpServers": {
    "ssh": {
      "command": "npx",
      "args": ["-y", "@davidfei/ssh-mcp-server", "--host", "192.168.1.100", "--username", "root", "--password", "123456"]
    },
    "serial": {
      "command": "uvx",
      "args": ["--from", "serial-mcp-server", "serial_mcp"]
    }
  }
}

重启ClaudeCode使配置生效。

步骤3:编写Skill文件

.claude/skills/ 目录下创建 embedded-test.md

---
name: embedded-test
description: 自动完成嵌入式代码编写、SSH烧录、串口验证的完整闭环
---

# 嵌入式自动化测试 Skill

## 工作流

### 1. 代码生成
根据用户需求,编写一个串口测试程序。例如:程序监听串口,收到 "PING" 则回复 "PONG"。

### 2. 远程烧录
- 使用SSH MCP的 `exec` 工具将编译好的二进制文件传输至开发板(可用scp或直接写入)
- 执行烧录/运行命令(如 `chmod +x test && ./test &`### 3. 串口验证
- 调用串口MCP的 `list_ports` 确认设备路径
- 调用 `open` 打开 `/dev/ttyUSB0`,波特率115200
- 调用 `write` 发送 "PING\n"
- 调用 `read` 等待响应(超时2秒)
- 调用 `close` 关闭串口

### 4. 结果判定
比较实际响应是否等于预期 "PONG",生成测试报告。

步骤4:触发执行

向ClaudeCode发送指令:

“执行 embedded-test 技能,测试串口回环。开发板IP 192.168.1.100,用户名root,密码123456,串口 /dev/ttyUSB0,波特率115200。”

Agent将自动完成所有步骤,并输出类似以下的报告:

--- 自动化测试报告 ---
测试时间:2025-01-15 14:32:07
目标板IP:192.168.1.100
串口设备:/dev/ttyUSB0
发送指令:PING
预期响应:PONG
实际响应:PONG
测试结论:✔️ 通过
耗时:23.4秒
--------------------

6.5 可选优化:添加快捷命令

.claude/commands/ 下创建 /test-uart.md

---
description: 一键触发嵌入式串口自动化测试
---
请执行embedded-test技能,开发板IP={{args}}。

之后只需输入 /test-uart 192.168.1.100 即可启动。

七、总结

  • Agent:AI的大脑与执行器,适合复杂、多变的推理任务。
  • Skill:固化经验的SOP文本,让Agent快速学会标准流程。
  • MCP:连接AI与外部世界的标准协议,MCP Server是独立的功能进程。
  • 嵌入式工程师的优势在于对硬件的深刻理解。通过将重复性工作(烧录、串口测试、日志分析)交给AI Agent + MCP,可以腾出精力专注在系统架构和软硬件协同创新上。

实践建议:从一个小型自动化测试场景开始,逐步构建自己的MCP Server和Skill库,将AI融入日常开发流。