GmailでAutoCAD自動モデリング!
はい、Gmail経由でも自動モデリングできます。仕組みは「メール(指示)→ 受信・解析 → MCPサーバ → AutoCAD」です。実装は大きく2通りあります。
---
方式A(最短):Google Apps Scriptで定期ポーリング → MCPへPOST
メリット:無料・簡単・PC常駐不要(MCP/AutoCADはPC上で常駐)
デメリット:1分おき等のポーリング(ほぼリアルタイムではない)
構成
1. Gmailフィルタで、指示メールにラベル(例:ACAD)を付与
2. Apps Script(時間主導トリガー:毎分)でラベル付き未処理メールを取得
3. メール本文をパースしてJSON化 → MCP HTTPエンドポイント(前回のhttp://127.0.0.1:8888/など)にPOST
4. 成功したメールは「処理済み」ラベル付け
指示メールのフォーマット例(推奨)
件名:ACAD: DRAW CIRCLE
本文(どれか1つの形式)
JSON:{"tool":"draw_circle","cx":100,"cy":100,"r":100}
行指示:
tool=draw_circle
cx=100
cy=100
r=100
Apps Script(貼って動くミニマム)
1. https://script.google.com/ を開き、新規プロジェクトを作成
2. 下記スクリプトを貼付け → 「デプロイ不要」、トリガーでprocessAcadEmailsを「分ベース(毎分)」に設定
// === 設定 ===
const LABEL_IN = 'ACAD'; // 指示メール用ラベル
const LABEL_OUT = 'ACAD-processed'; // 処理済みラベル
const MCP_URL = 'http://127.0.0.1:8888/'; // C#アドインHTTPやmcp_http_proxy先
function processAcadEmails() {
const labelIn = getOrCreateLabel_(LABEL_IN);
const labelOut = getOrCreateLabel_(LABEL_OUT);
const threads = labelIn.getThreads(0, 30); // 直近30件を対象(必要に応じて調整)
for (const th of threads) {
const msgs = th.getMessages();
for (const m of msgs) {
if (m.hasLabel(labelOut)) continue; // 既に処理済み
const body = m.getPlainBody().trim();
const parsed = parseBody_(body);
if (!parsed) {
// 解析失敗:スキップ(必要ならエラーレポート)
continue;
}
// MCPにPOST
const payload = JSON.stringify(parsed);
try {
const resp = UrlFetchApp.fetch(MCP_URL, {
method: 'post',
contentType: 'application/json; charset=utf-8',
payload: payload,
muteHttpExceptions: true
});
const ok = resp.getResponseCode() === 200 && JSON.parse(resp).ok === true;
if (ok) {
m.addLabel(labelOut);
} else {
// 失敗時の扱い:リトライ、別ラベル付与等
}
} catch (e) {
// 接続エラー:次回トリガーで再試行
}
}
}
}
function parseBody_(body) {
// 1) JSONならそのまま受け入れ
try {
const obj = JSON.parse(body);
return obj;
} catch (e) {}
// 2) key=value 形式をパース
const map = {};
body.split(/\r?\n/).forEach(line => {
const m = line.trim().match(/^([a-zA-Z_]+)\s*=\s*(.+)$/);
if (m) map[m[1]] = m[2];
});
// 期待: tool=draw_circle, cx, cy, r
if (map['tool'] === 'draw_circle' && map['cx'] && map['cy'] && map['r']) {
return {
tool: 'draw_circle',
cx: parseFloat(map['cx']),
cy: parseFloat(map['cy']),
r: parseFloat(map['r'])
};
}
return null;
}
function getOrCreateLabel_(name) {
return GmailApp.getUserLabelByName(name) || GmailApp.createLabel(name);
}
> これで、ACADラベル付きのメールを1分おきに拾い、tool=draw_circle指示ならAutoCADに円が作図されます(MCP/AutoCAD側は前回の構成を起動しておいてください)。
---
方式B(堅牢・ほぼリアルタイム):Gmail APIのPush通知(Pub/Sub)→ Webhook → MCP
メリット:ほぼ即時・拡張性・大規模運用向き
デメリット:GCP(Pub/Sub / Cloud Run/Functions)の設定が必要
流れ
1. Gmail APIのwatchでPub/Subトピックへ新着を通知
2. Cloud Run/FunctionsのWebhook(FastAPI/Flask)でPub/Subを受信
3. 対象メールIDをGmail APIで取得 → 本文をパース → MCPへPOST
4. 成功ならスレッドに「処理済み」ラベル付与(Gmail APIのmodify)
Webhook(FastAPI例・概略)
from fastapi import FastAPI, Request
import base64, json, httpx
MCP_ENDPOINT = "http://<your-mcp-host>:8888/"
app = FastAPI()
@app.post("/pubsub")
async def pubsub(req: Request):
envelope = await req.json()
msg = json.loads(base64.b64decode(envelope["message"]["data"]))
# msg には historyId 等。ここからGmail APIで差分を取得し、対象メッセージを読む。
# (認証はサービスアカウント or OAuth2、scopes: gmail.readonly / gmail.modify)
# 取得した本文をparseして下のようにMCPへ
cmd = {"tool":"draw_circle","cx":100,"cy":100,"r":100} # 実際は本文から組み立て
async with httpx.AsyncClient() as cli:
r = await cli.post(MCP_ENDPOINT, json=cmd, timeout=10)
return "OK"
> この方式はLINEやChatGPT経由の仕組みと同じMCPツールを叩けます。通知~作図まで数秒。
---
セキュリティ & 運用の注意
認証:MCP HTTPはローカル限定かBearerトークン/TLS必須
フォーマット固定:メールは件名ルール+JSON本文が堅牢(誤解析を防止)
冪等性:同一Message-IDを一度だけ処理(Apps ScriptならACAD-processedラベルで実現)
監査ログ:送信者/日時/コマンド/引数/処理結果をサーバ側に記録
単位/UCS:mm/インチの混在防止。WCS・Z=0原則、必要なら単位指定(unit=mm)をメールに含める
---
すぐ試すなら(おすすめ手順)
1. AutoCAD側:前回のC#アドインHTTP(http://127.0.0.1:8888/)を起動
2. Gmail:フィルタで指示メールにACADラベル付与
3. Apps Scriptを設置 → 毎分トリガー
4. テストメール送信:件名ACAD: DRAW CIRCLE、本文
{"tool":"draw_circle","cx":100,"cy":100,"r":100}
5. 1分後、モデル空間に円が出現すればOK
---
必要なら、LINE/ChatGPT/Gmailすべてから同じMCPツール群を叩けるように、
追加ツール(draw_line, draw_arc, insert_block, extrude, set_layer…)
JSONスキーマ、バリデーション、エラーレスポンス規約
Pub/Sub構成の完全テンプレート(Terraform含む)
までまとめたサンプル一式も用意できます。
コメント
コメントを投稿