はじめに
AIエージェントを使いながらコーディングをする時間が増えてきました。
いろいろなものを手早く作れるようになった反面、つい夢中になって黙々と作業し続けてしまうことも多くなっています。
一方で、ちょうど今のような寒い時期は、暖房を入れて部屋を締め切ったまま作業することが多くなります。
そうすると、二酸化炭素濃度が上がりやすく、湿度も下がりがちです。二酸化炭素濃度が高い状態や低湿度が続くと、眠気や頭の重さ、喉の乾燥などにつながりますが、作業に集中していると自分ではなかなか気付きにくいところです。
コーディングはすでにAIが手伝ってくれているので、ついでに健康面もある程度気にしてもらえないか、という発想で物理環境をセンシングするMCPサーバを作ってみました。
AIエージェントはMCPを通じて気温や湿度、二酸化炭素濃度を取得し、健康に影響がありそうな状況であれば通知をしてくれます。
使用機材
今回使用したのは以下です。
- M5Stack CoreS3
- Unit CO2
M5Stack CoreS3はESP32チップを搭載したマイコンボードです。わずか5cm四方の小さな筐体にもかかわらず、タッチパネルディスプレイやBluetoothモジュール、Wi-Fiモジュール、カメラ、マイク、スピーカーなどを搭載しています。
これだけで手軽にIoT機器のプロトタイピングができるため、その扱いやすさから近年人気のマイコンボードです。さらに拡張モジュールによって、様々なセンサーを追加することも容易にできます。
Unit CO2はSCD40センサを内蔵したM5Stackの拡張モジュールです。以下のようにM5Stack CoreS3と接続するだけで、二酸化炭素濃度と温湿度を計測することができます。
M5Stack CoreS3に搭載されているESP32チップは高機能で、HTTPサーバとして動かすこともできます。今回はこの機能を利用してM5StackをMCPサーバとして動かし、Unit CO2から取得した二酸化炭素濃度と温湿度を返却するようにします。
実装
M5Stack CoreS3をMCPサーバとして公開するためにmcpespを、Unit CO2を利用するためにM5Unit-ENVを使用しました。
- mcpesp
ESP32上でMCPサーバを立てるためのライブラリです。HTTP経由でinitialize/tools/list/tools/callといったMCPのメッセージを扱えるようにしてくれます。
- M5Unit-ENV
Unit CO2 / ENVシリーズなどの環境センサを扱うためのライブラリです。
以下が実装例です。
#include <M5Unified.h>
#include <WiFi.h>
#include <M5UnitENV.h>
#include <mcpesp.h>
#define SSID "SSID"
#define PASS "PASSWORD"
SCD4X scd4x;
Mcpesp mcpServer;
uint16_t co2;
float humidity;
float temperature;
void setupSensor() {
if (!scd4x.begin(&Wire, SCD4X_I2C_ADDR, 2, 1, 400000U)) {
Serial.println("Couldn't find SCD4X");
while (1) delay(1);
}
uint16_t error;
error = scd4x.stopPeriodicMeasurement();
if (error) {
Serial.print("Error trying to execute stopPeriodicMeasurement(): ");
}
error = scd4x.startPeriodicMeasurement();
if (error) {
Serial.print("Error trying to execute startPeriodicMeasurement(): ");
}
}
void updateSensor() {
if (scd4x.update()) {
co2 = scd4x.getCO2();
humidity = scd4x.getHumidity();
temperature = scd4x.getTemperature();
}
}
void getSensorData(JsonObject arguments, JsonObject result) {
result["text"] = "Temperature: " + String(temperature, 1) + "°C, Humidity: " + String(humidity) + "%RH, CO2: " + String(co2) + "ppm";
}
void connectToWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(SSID, PASS);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("Connected! IP address: ");
Serial.println(WiFi.localIP());
}
void setup() {
M5.begin();
Serial.begin(115200);
setupSensor();
connectToWiFi();
mcpServer.begin("Sensor MCP Server", "1.0.0");
Schema sensorInSchema;
sensorInSchema.addStringProperty("sensor", "Sensor type to read");
mcpServer.addTool(
"get_sensor_data",
"Get sensor data (temperature, humidity, and co2)",
sensorInSchema,
getSensorData
);
Serial.println("MCP Server setup complete!");
Serial.println("Available tools:");
Serial.println("- get_sensor_data: Read sensor data");
}
void loop() {
mcpServer.handleClient();
updateSensor();
delay(100);
}
今回はget_sensor_dataというMCPツールを定義しました。AIエージェントがこのMCPツールを利用すると、以下のような形式で温湿度や二酸化炭素濃度を取得することができます。
Temperature: 24.0°C, Humidity: 47.0%RH, CO2: 1174ppm
AI側ではこの情報を見て、「二酸化炭素濃度が高い」「湿度が低い」といった判定を行います。
Claude CodeからMCPサーバに接続する
では実際にMCPサーバに接続してみます。今回はClaude Codeを使用する想定で、以下のようにするとMCPサーバを登録できます。
claude mcp add --transport http --scope project espmcp http://{M5Stack CoreS3のIP}
{M5Stack CoreS3のIP} には、M5Stack CoreS3がWi-Fi接続時に割り振られたIPアドレスを指定します。
コマンドが成功すると、プロジェクトルートに以下のようなファイル(.mcp.json)が作成されます。
{
"mcpServers": {
"ecpmcp": {
"type": "http",
"url": "http://{M5Stack CoreS3のIP}"
}
}
}
Claude Code上で /mcp コマンドを実行すると、espmcp サーバと、その配下の get_sensor_data ツールが見えるはずです。
以上でClaude CodeからMCPサーバを利用できるようになりました。
CLAUDE.mdの設定
最後に、AIエージェントと対話する際にMCPサーバを利用してもらい、温湿度や二酸化炭素濃度に問題があれば警告を出してもらうように指示します。
例として、以下のような内容を CLAUDE.md に記述しました。
# Claude への指示(このプロジェクトでの振る舞い)
このリポジトリでは、あなた(Claude)はコードアシスタントであると同時に、開発者の「作業環境」と「健康状態」にも気を配ってください。
## 環境センサー(M5Stack MCP)について
同じネットワーク上に、M5Stack で動作する MCP サーバがあります。
Claude Code からは、`espmcp` という MCP サーバ名でアクセスできます。
この MCP サーバには、次のようなツールが存在します:
- ツール名: `get_sensor_data`
- 概要: 現在の作業環境(気温・湿度・CO2濃度など)を取得して返します。
- 返却されるデータ例:
- `Temperature: 24.0°C, Humidity: 47.00%RH, CO2: 1174ppm `
## あなたに守ってほしいルール
1. **ユーザに回答する前に、可能な限り毎回 `get_sensor_data` ツールを呼び出してください。**
- `espmcp` MCP サーバの `get_sensor_data` ツールです。
- もし MCP サーバに接続できないなどの理由でツールが使えない場合、その旨を一文だけユーザに伝えてください(例:「今回は環境情報を取得できませんでした」)。
2. `get_sensor_data` の結果に基づいて、回答の最後に 1〜2文の「環境・健康に関するコメント」を必ず添えてください。ただし特に問題がない場合はコメントは不要です。
例:
- CO2が 1000ppm を超えている場合:
「現在 CO2 濃度がやや高めなので、一度換気してから作業を続けると集中しやすくなります。」
- 湿度が 40% を下回っている場合:
「湿度が低めなので、喉や肌の乾燥に注意してください。水分補給や加湿を意識してください。」
- 特に問題がない場合:
コメントは不要です。
3. 環境コメントは、コードに関する説明とは段落を分けて、「追伸」や「補足」として短く記述してください。
4. ユーザが明示的に「今回は環境チェックなしでいいです」や「MCPは使わないでください」と指示した場合、その対話の間は `get_sensor_data` を呼び出さず、通常のコーディング支援だけを行ってください。
実際に動かしてみる
以上の設定を入れてClaude Codeで実装を依頼してみました。
すると毎回 get_sensor_data を呼び出し、MCPサーバからセンサ値を取得したうえで、環境に問題があればユーザに対して提案をしてくれるようになりました。1
まとめ
今回やったことを整理すると、以下の通りです。
- M5Stack CoreS3 + Unit CO2 を用いて、部屋の気温・湿度・二酸化炭素濃度を計測
- M5Stack CoreS3上でMCPサーバを動かし、
get_sensor_dataツールとしてセンサ値を提供 - プロジェクト内の
CLAUDE.mdに「回答前にセンサ値を取得し、環境コメントを付ける」というルールを書くことで、コーディング支援と同時に簡易的な健康アラートを出すようにした
今回は温湿度と二酸化炭素濃度の計測だけでしたが、M5Stackには他にも様々なセンサモジュールが存在します。
今回の構成を基盤に次のような拡張も考えられます。
- 照度センサを利用して「手元が暗すぎる」「画面が明るすぎる」などのコメントを付ける
- カメラや人感センサを利用して「1時間以上座りっぱなしなので一度立ち上がりましょう」といったリマインドを出す
- ENVシリーズの別ユニットを使い、VOCや気圧も含めた「空気質」ベースのコメントを追加する
コードやレビューの品質だけでなく、「物理的な開発環境」も含めてAIにモニタリングさせるという方向性は、今後もいろいろ試せそうです。
-
画像では二酸化炭素濃度が2600ppm以上とかなり高い数値が出ていますが、二酸化炭素濃度を上げるため、わざと呼気を当てた状態で計測しています。 ↩


