simple

Example of the component 0x1abin/esp_mcp_server v0.0.1
# 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"

or download archive (~7.12 KB)