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含む)

までまとめたサンプル一式も用意できます。




コメント

このブログの人気の投稿

ミライアイ内服薬は薬事法違反で、ほとんど効果がない詐欺ですか?

最高裁での上告理由書受理・却下の判断基準について

裁判官の忌避申立書の作成例