# ESP32 MCP Server Component Example 这是一个展示如何使用 `esp_mcp_server` 组件的完整示例应用。 ## 功能特性 ### 🔧 自定义工具 - **Echo Tool**: 回显消息工具 - **GPIO Control**: LED 控制工具 - **ADC Read**: ADC 读取工具 ### 📦 自定义资源 - **Echo Resource**: 回显资源 (`echo://{message}`) - **Sensor Data**: 传感器数据资源 (`esp32://sensors/data`) ### 🌐 网络功能 - WiFi Station 模式连接 - HTTP MCP 服务器 - 动态 IP 地址分配 ## 硬件要求 - ESP32 开发板 - LED(连接到 GPIO 2,可配置) - 按钮(连接到 GPIO 0,可配置) - 可选:模拟传感器连接到 ADC 通道 0 ## 快速开始 ### 1. 配置 WiFi ### 2. 编译和烧录 ```bash # 设置 ESP-IDF 环境 get_idf # 编译项目 idf.py build # 烧录到设备 idf.py flash monitor ``` ### 3. 查找 ESP32 IP 地址 从串口监视器中查找类似的日志: ``` I (12345) MCP_EXAMPLE: got ip:192.168.1.100 ``` ### 4. 测试 MCP 服务器 #### 列出可用工具 ```bash curl -X POST http://192.168.1.100/mcp \\ -H "Content-Type: application/json" \\ -d '{ "jsonrpc": "2.0", "method": "tools/list", "params": {}, "id": 1 }' ``` #### 调用 Echo 工具 ```bash curl -X POST http://192.168.1.100/mcp \\ -H "Content-Type: application/json" \\ -d '{ "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "echo", "arguments": {"message": "Hello MCP!"} }, "id": 2 }' ``` #### 控制 LED ```bash # 打开 LED curl -X POST http://192.168.1.100/mcp \\ -H "Content-Type: application/json" \\ -d '{ "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "gpio_control", "arguments": {"pin": 2, "state": true} }, "id": 3 }' # 关闭 LED curl -X POST http://192.168.1.100/mcp \\ -H "Content-Type: application/json" \\ -d '{ "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "gpio_control", "arguments": {"pin": 2, "state": false} }, "id": 4 }' ``` #### 读取 ADC 值 ```bash curl -X POST http://192.168.1.100/mcp \\ -H "Content-Type: application/json" \\ -d '{ "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "adc_read", "arguments": {} }, "id": 5 }' ``` #### 列出可用资源 ```bash curl -X POST http://192.168.1.100/mcp \\ -H "Content-Type: application/json" \\ -d '{ "jsonrpc": "2.0", "method": "resources/list", "params": {}, "id": 6 }' ``` #### 读取传感器数据 ```bash curl -X POST http://192.168.1.100/mcp \\ -H "Content-Type: application/json" \\ -d '{ "jsonrpc": "2.0", "method": "resources/read", "params": { "uri": "esp32://sensors/data" }, "id": 7 }' ``` #### 访问 Echo 资源 ```bash curl -X POST http://192.168.1.100/mcp \\ -H "Content-Type: application/json" \\ -d '{ "jsonrpc": "2.0", "method": "resources/read", "params": { "uri": "echo://hello-world" }, "id": 8 }' ``` ## 代码结构 ### 工具实现 每个工具都有一个处理函数,接收 JSON 参数并返回 JSON 结果: ```c static cJSON* echo_tool_handler(const cJSON *arguments, void *user_data) { // 从参数中提取数据 cJSON *message = cJSON_GetObjectItem(arguments, "message"); // 创建响应 cJSON *result = cJSON_CreateObject(); // ... 构建响应内容 return result; } ``` ### 资源实现 每个资源都有一个处理函数,接收 URI 并返回字符串内容: ```c static char* sensor_data_handler(const char *uri, void *user_data) { char *data = malloc(512); // ... 生成资源内容 return data; // 会被服务器自动释放 } ``` ### 注册过程 工具和资源在 `register_custom_tools_and_resources()` 函数中注册: ```c // 创建工具配置 esp_mcp_tool_config_t tool_config = { .name = "echo", .title = "Echo Tool", .description = "Echoes back messages", .input_schema = schema, .handler = echo_tool_handler, .user_data = NULL }; // 注册工具 esp_mcp_server_register_tool(mcp_server, &tool_config); ``` ## 配置选项 ### GPIO 配置 - `CONFIG_EXAMPLE_LED_GPIO`: LED GPIO 引脚(默认:2) - `CONFIG_EXAMPLE_BUTTON_GPIO`: 按钮 GPIO 引脚(默认:0) ### WiFi 配置 - `CONFIG_ESP_WIFI_SSID`: WiFi 网络名称 - `CONFIG_ESP_WIFI_PASSWORD`: WiFi 密码 - `CONFIG_ESP_MAXIMUM_RETRY`: 最大重连次数(默认:5) ## 扩展示例 ### 添加新工具 1. 创建处理函数: ```c static cJSON* my_tool_handler(const cJSON *arguments, void *user_data) { // 实现您的工具逻辑 return result; } ``` 2. 创建输入模式(可选): ```c cJSON *schema = cJSON_CreateObject(); // ... 定义参数模式 ``` 3. 注册工具: ```c esp_mcp_tool_config_t tool_config = { .name = "my_tool", .handler = my_tool_handler, // ... 其他配置 }; esp_mcp_server_register_tool(mcp_server, &tool_config); ``` ### 添加新资源 1. 创建处理函数: ```c static char* my_resource_handler(const char *uri, void *user_data) { char *content = malloc(256); // ... 生成资源内容 return content; } ``` 2. 注册资源: ```c esp_mcp_resource_config_t resource_config = { .uri_template = "my://resource/{param}", .name = "my_resource", .handler = my_resource_handler, // ... 其他配置 }; esp_mcp_server_register_resource(mcp_server, &resource_config); ``` ## 故障排除 ### 常见问题 1. **WiFi 连接失败** - 检查 SSID 和密码配置 - 确认 WiFi 网络可用 - 查看串口日志中的错误信息 2. **MCP 服务器启动失败** - 检查端口是否被占用 - 确认内存充足 - 查看错误日志 3. **工具调用失败** - 验证 JSON 格式正确 - 检查参数类型和名称 - 查看工具处理函数的实现 ### 调试技巧 - 启用详细日志:`CONFIG_LOG_DEFAULT_LEVEL_DEBUG=y` - 监控内存使用:观察 "Free heap" 日志 - 使用 JSON 格式化工具验证请求格式 ## 性能优化 - 减少 JSON 对象的创建和销毁 - 使用静态缓冲区而不是动态分配(适当时) - 限制并发会话数量 - 优化回调函数的执行时间 ## 许可证 本示例遵循 ESP-IDF 的许可证条款。
To create a project from this example, run:
idf.py create-project-from-example "0x1abin/esp_mcp_server=0.0.1:simple"