4つの AI から自分の LINE に知らせる ― LINE 公式の MCP と、危ない道具を止める小さなフィルター
Claude Code・Codex・Grok・Gemini(Antigravity)の4つの AI から、自分の LINE にメッセージを送れるようにしました。LINE 社の公式の MCP を使い、手持ちの LINE 公式アカウントから自分あてに届ける形です。長い作業が終わったときの知らせや、調べたことのまとめを、外出先のスマホで受け取れます。
MCP は、AI に外部の道具を使わせるための共通のつなぎ方です。これまでの記事:Orca で複数の AI をまとめる、AI から Chrome を動かす、AI から X を使う、4つの AI から Google 一式を使う。
全体の構成

- LINE 公式の MCP:LINE 社の
@line/line-bot-mcp-server(記事を書いた時点ではプレビュー版)。LINE 公式アカウントの Messaging API を使う - できること:公式アカウントから友だちに送る、送れる残りの通数やプロフィールを調べる
- できないこと:届いたメッセージを読むこと、ふだんの個人のトークを読んだり、個人として送ったりすること
個人のトークを読む方法を探すと非公式のものも出てきますが、LINE の規約に反し、アカウントを止められるおそれがあります。今回は公式の方法だけにしました。
1. LINE 側の準備

- Messaging API を有効にする:LINE Official Account Manager で公式アカウントを開き、右上の「設定」→ 左の「Messaging API」→「Messaging API を利用する」
- プロバイダーを選ぶ:初めてなら新しく作る。あとから変えられないので注意
- トークンを発行する:LINE Developers コンソールで、プロバイダー → チャネルを開き、「Messaging API設定」タブの一番下にある「チャネルアクセストークン(長期)」で「発行」
- 自分のユーザーID を写す:同じチャネルの「チャネル基本設定」タブの一番下に「あなたのユーザーID」がある
- メモに書く:トークンとユーザーID を、パソコンの secret フォルダのメモに書く
自分の LINE で、その公式アカウントを友だちにしておくことも忘れずに。友だちでないと届きません。無料のプランでは、送れるのは月 200 通まででした(MCP の道具で残りの通数を確かめられます)。
2. 起動用のスクリプト
ほかの連携と同じく、キーは AI の設定ファイルに書かず、起動のたびに secret フォルダから読みます。LINE 公式の MCP は Node.js 22 以上が必要です。
#!/bin/zsh
# LINE 公式の MCP を起動する。キーは起動のたびに ~/secret から読む。
SECRET_FILE=~/secret/keys.txt
# 見出しは書き方がまちまちなので、空白を除いて「含む」で探す
read_after() {
awk -v label="$1" '/LINE Developers/ { s = 1 } { h = $0; gsub(/[ ]/, "", h) } s && index(h, label) > 0 && h !~ /古い/ { getline; print; exit }' "$SECRET_FILE"
}
export CHANNEL_ACCESS_TOKEN=$(read_after "チャネルアクセストークン")
export DESTINATION_USER_ID=$(read_after "ユーザーID")
export NPM_CONFIG_IGNORE_SCRIPTS=true
# 友だち全員に届く一斉送信と、リッチメニューの変更・削除は使えないようにする
BLOCKED=broadcast_text_message,broadcast_flex_message,create_rich_menu,delete_rich_menu,set_rich_menu_default,cancel_rich_menu_default
exec /usr/bin/python3 ~/bin/mcp-filter.py $BLOCKED -- \
/opt/homebrew/bin/npx -y @line/line-bot-mcp-server@0.5.0 "$@"
DESTINATION_USER_ID に自分のユーザーID を入れておくと、送り先を指定しないときは自分あてになります。
3. 危ない道具は、間に1つ挟んで止める

LINE 公式の MCP には、友だち全員に届く「一斉送信」や、トーク画面の下に出るメニュー(リッチメニュー)を作り変える道具も入っています。もとからある公式アカウントを使うので、AI がうっかり使うと困ります。
AI ごとの「使ってよいか確認する」設定で止めることもできますが、4つの AI で設定のしかたがばらばらです。そこで、MCP サーバーの前に立つ小さな Python のプログラム(mcp-filter.py)を書きました。指定した道具を一覧から消し、呼ばれても「使えない」と返します。
#!/usr/bin/env python3
# stdio の MCP サーバーの前に立ち、指定した道具を一覧から消し、呼ばれても断る。
# 使い方:mcp-filter.py 道具名,道具名 -- 起動コマンド…
import json
import subprocess
import sys
import threading
blocked = set(sys.argv[1].split(","))
cmd = sys.argv[sys.argv.index("--") + 1:]
child = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True, bufsize=1)
list_ids = set()
out_lock = threading.Lock()
def write_out(line):
with out_lock:
sys.stdout.write(line)
sys.stdout.flush()
def from_child():
for line in child.stdout:
try:
msg = json.loads(line)
except ValueError:
write_out(line)
continue
if msg.get("id") in list_ids and "result" in msg:
list_ids.discard(msg["id"])
msg["result"]["tools"] = [t for t in msg["result"].get("tools", []) if t.get("name") not in blocked]
line = json.dumps(msg, ensure_ascii=False) + "\n"
write_out(line)
threading.Thread(target=from_child, daemon=True).start()
for line in sys.stdin:
try:
msg = json.loads(line)
except ValueError:
msg = None
if isinstance(msg, dict) and msg.get("method") == "tools/list":
list_ids.add(msg.get("id"))
if isinstance(msg, dict) and msg.get("method") == "tools/call" and msg.get("params", {}).get("name") in blocked:
write_out(json.dumps({"jsonrpc": "2.0", "id": msg.get("id"), "result": {
"isError": True,
"content": [{"type": "text", "text": "この道具は使えないように設定されています(mcp-filter.py)。"}]}},
ensure_ascii=False) + "\n")
continue
child.stdin.write(line)
child.stdin.flush()
child.stdin.close()
child.wait()
試しに一斉送信の道具を直接呼んでみて、ちゃんと断られることを確かめました。Mac に最初から入っている Python 3.9 の標準の機能だけで動きます。
4. 4つの AI に登録して、送ってみる
claude mcp add -s user line -- ~/bin/line-mcp.sh # Claude Code
codex mcp add line -- ~/bin/line-mcp.sh # Codex
grok mcp add line ~/bin/line-mcp.sh # Grok
agy mcp add line ~/bin/line-mcp.sh # Gemini(Antigravity CLI)
Orca の中で Codex に登録するときは、CODEX_HOME の向き先に気をつけます(Google の記事で書いたとおり)。
まず残りの通数(0 / 200)と、自分のプロフィールが取れることを確かめてから、テストのメッセージを1通送りました。スマホの LINE に、公式アカウントからそのまま届きました。これで「この作業が終わったら LINE で知らせて」と AI に頼めるようになりました。
使うときの決まり
- 送る前に、必ず人が文面を確認する
- 送り先は自分だけにする
- パスワードやキーなど、秘密の情報は送らない
つまずいたところ
トークンを発行する画面が見つからない
Messaging API を有効にするのは LINE Official Account Manager ですが、トークンを発行するのは LINE Developers コンソールという別のサイトです。コンソールでプロバイダー → チャネルと開き、「Messaging API設定」タブを一番下までスクロールすると「チャネルアクセストークン(長期)」があります。
メモの見出しの書き方が、スクリプトと合わない
メモには「【チャネルアクセストークン(長期)】」「あなたのユーザーID」のように、画面の表示そのままで書いていました。スクリプトが決まった見出しだけを探していたため、最初は値を読めませんでした。空白を除いて「その言葉を含む行」を探すように変えて、書き方が多少違っても読めるようにしました。
まとめ
- LINE 社の公式の MCP で、4つの AI から公式アカウントを通して自分の LINE に送れる
- 届いたメッセージや個人のトークは読めない。送るだけと割り切る
- 準備は LINE Official Account Manager(Messaging API の有効化)と LINE Developers コンソール(トークン・ユーザーID)の2か所
- 一斉送信やメニューの変更は、
mcp-filter.pyで4つの AI まとめて使えないようにした - 送る前に、必ず人が文面を確認する
