Gmail で開いているメールのパーマネント ID(変わらない ID)をワンクリックでコピーできる Chrome 拡張「Gmail Message Link」を作りました。コピーした ID を AI エージェントに渡せば、「このメールについて」と頼むだけで、AI が Gmail API でそのメールを開けます。
なぜ作ったか
Gmail でメールを開くと、アドレスバーはこんな形になります。
https://mail.google.com/mail/u/0/#search/<検索語>/FMfcgzXXXXXXXXXXXXXXXXXXXXXXXXXX
末尾の FMfcgz... は Gmail の画面だけで使う ID です。この URL を AI エージェントに渡しても、Gmail API ではメールを特定できません。
API で使える ID を手で取り出すこともできます。メールの「︙」から「メッセージのソースを表示」を開くと、その URL に permmsgid=msg-f:<10進数> が入っています。ただ、毎回メニューを開いてソースのページを表示するのは手間です。そこで、ボタン一つでコピーできるようにしました。
できること
ツールバーのボタンで、開いているメールの ID をコピー
Gmail でメールを開いた状態で、ツールバーの拡張のボタンを押すと、ID がクリップボードにコピーされます。ポップアップにも同じ内容が表示されます。
スレッドに複数のメールがあるときは、表示されているうちの最後のメール(たいてい最新)の ID をコピーします。
右クリックで、スレッドの中の好きなメールの ID をコピー
スレッドの途中のメールを指したいときは、そのメールの上で右クリックして「このメールの ID をコピー」を選びます。右クリックしたメールの ID がコピーされ、画面の下に「ID をコピーしました。」と表示されます。
コピーされる内容
件名: 【サンプル】ご注文ありがとうございます
差出人: shop@example.com <shop@example.com>
Gmail API message id: 1234567890abcdef
permmsgid: msg-f:1311768467294899695
Gmail API thread id: 1234567890abcdef
thread: thread-f:1311768467294899695
メールの ID とスレッドの ID を、Gmail API の形(16進数)と Gmail の内部の形(msg-f: / thread-f:)の両方でコピーします。件名と差出人も付くので、AI が開いたメールが合っているかを、人も AI も確かめやすくなります。
メールが1通だけのスレッドでは、メールの ID とスレッドの ID が同じ値になります。また、件名はスレッドの見出しから取るので、返信のメールでも Re: は付きません。
AI エージェントに渡してみた
コピーした値を、Claude Code の Gmail コネクタに渡して試しました(2026-10-17)。
| 渡した値 | 使ったツール | 結果 |
|---|---|---|
| 16進数の message id | get_message | 開けた |
| 16進数の thread id | get_thread | 開けた |
msg-f:<10進数> | get_message | 開けた |
msg-a:r<10進数>(自分が送ったメール) | get_message | 開けた |
| 10進数だけ | get_message | Invalid id value |
コピーした内容をそのまま貼り付けて「このメールを要約して」のように頼めば、AI がメールを開いてくれます。
権限は最小限
メールを扱う拡張なので、権限はできるだけ小さくしました。
- 権限は
clipboardWrite(コピー)とcontextMenus(右クリックメニュー)だけです。 - 外への通信はしません。Gmail の OAuth も使いません。
- ID・件名・差出人は Gmail の画面(DOM)にすでに入っているので、それを読んでコピーするだけです。メールの本文は読みません。
仕組み
Gmail でメールを開くと、ID が要素の属性として DOM に入っています。拡張は、ここから ID・件名・差出人を読みます。
- 件名の要素:
h2[data-thread-perm-id="thread-f:…"]とh2[data-legacy-thread-id="<16進数>"]。件名は、この要素の文字列から取ります。 - メールの要素:
div[data-message-id="#msg-f:…"]とdiv[data-legacy-message-id="<16進数>"]。差出人は、この中のspan[email]のnameとemailの属性から取ります。
Gmail は画面を切り替えても受信トレイの一覧を DOM に残しているので、checkVisibility() で画面に見えている要素だけに絞っています。
受信したメールでは、msg-f の10進数を16進数にすると Gmail API の ID になります(BigInt("1311768467294899695").toString(16) → "1234567890abcdef")。
既にある拡張との違い
似た拡張はすでにあります(2026-10-17 に Web で検索した範囲)。
- Mail message URL: RFC822 の Message-ID を使った Gmail の検索 URL をコピーする。
- Gmail Message ID Finder: Message-ID を使った検索語をコピーする。
- Copy Gmail Message-Id: Message-ID をコピーする。
どれも RFC822 の Message-ID 系の値を扱います。Gmail Message Link は、AI エージェントがそのまま Gmail API に渡せる ID を、件名・差出人と一緒にコピーするところが違います。
制限
- 受信トレイの一覧からはコピーできません。 Gmail は一覧の行の右クリックメニューを自前のメニューに置き換えているので、拡張の項目が出ません。メールを開いてから使ってください。
- Gmail の内部の属性に頼っています。 属性名は非公開なので、Gmail の更新で動かなくなるかもしれません。
- 複数のアカウント(
/u/1/)ではまだ試していません。
今後
- 日付と RFC822 の Message-ID(
rfc822msgid)もコピーできるようにする。 - 一覧で選んだメールの ID も、ツールバーのボタンでコピーできるようにする。
入手方法
GitHub で公開しています。
個人で作った拡張なので、ご利用は自己責任でお願いします。
Chrome ウェブストアには出していないので、パッケージ化されていない拡張機能として読み込みます。
- リポジトリをクローンするか、ZIP でダウンロードして展開する。
- Chrome で
chrome://extensionsを開き、右上の「デベロッパー モード」をオンにする。 - 「パッケージ化されていない拡張機能を読み込む」を押し、リポジトリのフォルダを選ぶ。
- すでに開いている Gmail のタブは、再読み込みする。