line-approval-mcp
Integrates with LINE Messaging API to send notifications and approval/question messages with buttons, receive replies via signed webhooks from allowlisted users, and make those answers available to agents or scripts for branching.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@line-approval-mcpsend me a LINE approval asking if I should deploy to production"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
line-approval-bridge
AI エージェント(Claude Code の定期タスク、シェルスクリプトなど)から あなたの LINE に通知し、返信・承認を待って、その答えで処理を分岐する ための小さなブリッジです。
Claude Code / スクリプト ──(MCP / CLI)──▶ Cloudflare Worker ──push──▶ あなたの LINE
▲ │ ▲ │
└──────── 結果をポーリング ───────────┘ └──── Webhook(返信)────────┘notify(text)… 一方向の通知ask_approval(question, options, timeout)… 「承認 / 却下」などのボタン付きで質問し、回答が来るまで待つget_reply(id)… 回答の取得(待ちの再開)
公式 LINE Bot MCP Server との違い
公式 LINE Bot MCP Server は 送信専用 です。メッセージを送ることはできますが、ユーザーの返信を受け取ってエージェントに返す仕組みはありません。
line-approval-bridge は 人間の判断を待つ(human-in-the-loop) ことに特化しています。
公式 LINE Bot MCP Server | line-approval-bridge | |
メッセージ送信 | できる | できる |
返信の受信(Webhook) | なし | あり(署名検証つき) |
承認ボタンを出して待つ | なし |
|
返信内容で処理を分岐 | なし |
|
自由入力の返信 | なし | あり( |
受信者の制限 | — | 許可した userId のみ |
Related MCP server: LINE Bot MCP Server
特徴
無料で動く: Cloudflare Workers 無料プラン + Workers KV、LINE コミュニケーションプラン(無料・月 200 通)
安全:
X-Line-Signature(HMAC-SHA256)を検証。許可リストにない userId は無視。API は Bearer トークン必須返信は通数を消費しない: 「受け付けました」の返事は reply API(無料)で返す
MCP サーバー + CLI: Claude Code からはツールとして、シェルからは終了コードで分岐
ローカル開発モード: LINE に実際に送らず、署名付き Webhook をシミュレートして全フローを試せる
なぜ Cloudflare Workers か(Vercel ではなく)
KV ストアが Workers に標準で付いてくる(Vercel は外部の Redis 連携が必要で、設定項目が増える)
無料枠で十分(1 日 10 万リクエスト、KV 読み取り 10 万回・書き込み 1,000 回)
Web Crypto がそのまま使えるので、署名検証が依存ライブラリなしで書ける
スリープ(コールドスタート)が実質なく、LINE の Webhook にすぐ応答できる
セットアップ
所要時間は 30 分ほどです。トークンやパスワードはすべてご自身で発行・入力してください。 このリポジトリやチャットに貼る必要はありません。
必要なもの
LINE アカウント(スマホの LINE アプリ)
Cloudflare アカウント(無料)
Node.js 20 以上、git
1. LINE 公式アカウントを作り、Messaging API を有効にする
LINE Official Account Manager を開き、LINE アカウントでログイン
「アカウントを作成」から LINE 公式アカウントを作る(名前は何でもよい。例:
My Agent)作ったアカウントを開き、右上の 設定 → 左メニュー Messaging API → 「Messaging API を利用する」
プロバイダーを選ぶ(なければ新規作成。名前は何でもよい)→ OK
同じ設定画面の左メニュー 応答設定 で次のようにする
応答メッセージ: オフ(自動返信がブリッジの返事と混ざるのを防ぐ)
Webhook: オン
あいさつメッセージ: お好みで
2. トークンと自分の userId を確認する
LINE Developers コンソール を開き、手順 1 のプロバイダー → チャネル(公式アカウント名)を選びます。
確認する値 | 場所 | このあと入れる先 |
チャネルシークレット | 「チャネル基本設定」タブ → チャネルシークレット | Worker の secret |
あなたの userId( | 「チャネル基本設定」タブ → 一番下の「あなたのユーザーID」 | Worker の secret |
チャネルアクセストークン(長期) | 「Messaging API設定」タブ → 一番下「チャネルアクセストークン(長期)」の 発行 | Worker の secret |
続けて「Messaging API設定」タブにある QR コードを LINE アプリで読み取り、公式アカウントを友だち追加 してください(友だちでないと通知が届きません)。
3. Worker をデプロイする
git clone https://github.com/fumy98/line-approval-bridge.git
cd line-approval-bridge
npm install
cd api
npx wrangler login # ブラウザが開くので Cloudflare にログインして許可
npx wrangler kv namespace create KV最後のコマンドが表示する id = "..." を、api/wrangler.toml の REPLACE_WITH_YOUR_KV_NAMESPACE_ID と置き換えます。
次に secret を 4 つ登録します。コマンドごとに入力を求められるので、値を貼り付けて Enter(画面には表示されません)。
npx wrangler secret put LINE_CHANNEL_SECRET # 手順 2 のチャネルシークレット
npx wrangler secret put LINE_CHANNEL_ACCESS_TOKEN # 手順 2 のチャネルアクセストークン(長期)
npx wrangler secret put ALLOWED_USER_IDS # 手順 2 のあなたの userId(複数ならカンマ区切り)
openssl rand -hex 32 # API_TOKEN 用のランダム文字列を作る(控えておく)
npx wrangler secret put API_TOKEN # ↑で作った文字列
npx wrangler deploydeploy の最後に https://line-approval-bridge.<あなたのサブドメイン>.workers.dev が表示されます。これが Worker の URL です。
4. LINE に Webhook URL を登録する
LINE Developers コンソール →「Messaging API設定」タブ → Webhook URL の「編集」に
https://line-approval-bridge.<あなたのサブドメイン>.workers.dev/webhookを入れて「更新」→「検証」で 成功 と出れば OK。その下の Webhook の利用 をオンにします。
(コンソールを開かなくても、手順 5 のあとで node client/dist/cli.js setup-webhook を実行すれば、LINE の API 経由で URL の登録と疎通テストまで行えます。)
5. クライアント(CLI / MCP)を準備する
cd .. # リポジトリ直下に戻る
npm run build環境変数を 2 つ使います(.env.example 参照)。シェルで使う場合は ~/.zshrc などに書きます。
export LINE_APPROVAL_URL="https://line-approval-bridge.<あなたのサブドメイン>.workers.dev"
export LINE_APPROVAL_TOKEN="<手順 3 で作った API_TOKEN>"動作確認:
node client/dist/cli.js notify "テスト通知です"
node client/dist/cli.js ask "承認テストです。どちらかを押してください" --wait 300 --print valueLINE に届いたメッセージの「承認」ボタンを押すと、ターミナルに 承認 と表示されます。
6. Claude Code に MCP サーバーとして登録する
claude mcp add line-approval --scope user \
-e LINE_APPROVAL_URL="https://line-approval-bridge.<あなたのサブドメイン>.workers.dev" \
-e LINE_APPROVAL_TOKEN="<API_TOKEN>" \
-- node "$(pwd)/client/dist/mcp.js"--scope user にすると、すべてのプロジェクトと定期タスクから使えます。値は手元の ~/.claude.json にだけ保存されます。claude mcp list で line-approval が Connected になっていれば完了です。
トークンの置き場所まとめ
値 | 置き場所 | git に入るか |
| Cloudflare の Worker secret( | 入らない |
| シェルの環境変数、または | 入らない |
ローカル開発用の値 |
| 入らない |
KV namespace id |
| 入る(秘密情報ではない) |
使い方
MCP ツール(Claude Code から)
ツール | 引数 | 戻り値 |
|
|
|
|
|
|
|
| 同上 |
wait_seconds を過ぎても回答がなければ pending と id を返します。エージェントは get_reply(id) を呼べば待ちを再開できます(依頼そのものは timeout まで有効)。
例: 週の動画トピックを LINE で承認する
Claude Code の定期タスクのプロンプトに、次のように書きます。
1. 来週の動画トピックを 7 本考えて topics.md に書く。
2. line-approval の ask_approval を呼ぶ。
question: 「来週のトピック案です」+ 7 本のタイトルを番号付きで
options: ["承認", "却下"]
timeout: 43200(12 時間)
3. 返ってきた answer で分岐する。
- 「承認」: topics.md の状態を approved にしてコミットする。
- 「却下」: 何もせず notify で「今週は見送りました」と送る。
- 自由入力(例「3 番を別の話題に」): 指示どおり直して、もう一度 ask_approval する(最大 3 回)。
- expired / pending: notify で「未承認のため保留しました」と送って終了する。CLI(シェルスクリプトから)
line-approval notify "<text>"
line-approval ask "<question>" [--options 承認,却下] [--no-free-text] [--timeout 秒] [--wait 秒 | --no-wait] [--print value|json]
line-approval get <id> [--wait 秒] [--print value|json]
line-approval quota # 今月の送信数(npm link -w client で line-approval コマンドとして使えます。そうしない場合は node client/dist/cli.js。)
終了コード: 0 回答あり / 2 期限切れ / 3 まだ回答待ち(--wait 経過) / 1 エラー
answer=$(line-approval ask "本番にデプロイしますか?" --timeout 3600 --print value)
case "$?:$answer" in
0:承認) ./deploy.sh ;;
0:*) echo "却下またはコメント: $answer" ;;
*) echo "回答なし" ;;
esacLINE 側での答え方
ボタンを押す(いちばん確実)
ボタンと同じ文字を送る(例:
承認)→ 最新の依頼への回答自由に書いて送る(例:
3 番だけ差し替えて)→ 最新の依頼への自由入力回答(allow_free_textが true の場合)#ID 内容と送る(例:#K7Q2MX 却下)→ 古い依頼にも回答できる。ID はメッセージ内の#K7Q2MX回答は最初の 1 回だけ有効。期限切れ・回答済みの依頼にはそう返事します
HTTP API
すべて Authorization: Bearer <API_TOKEN> が必要です(/health と /webhook を除く)。
メソッド | パス | 本文 / 結果 |
|
|
|
|
|
|
|
| 依頼オブジェクト |
|
|
|
|
| LINE からの Webhook(署名検証) |
|
|
|
to を省略すると DEFAULT_TO(なければ ALLOWED_USER_IDS の先頭)に送ります。to に許可リスト外の userId を指定すると 400 になります。
制限と注意
月 200 通: LINE の無料プランでは push(
notifyとask_approval)が 1 回 1 通として数えられます。「受け付けました」の返事は reply なので数えられません。line-approval quotaで確認できます反映に最大 1 分ほどかかることがあります: Workers KV は結果整合のため、ボタンを押してから
answeredが読めるまで遅れる場合があります。人の承認待ちという用途では問題にならない想定ですボタンはメッセージ内(Flex Message)に表示されるので、スマホでも PC 版 LINE でも押せます。スマホでは入力欄の上にもクイックリプライのボタンが出ます(こちらは最新のメッセージのみ)
1 対 1 のトークのみ: グループ・複数人での承認は対象外です
ローカル開発
LINE に実際には送らず(LINE_DRY_RUN=true)、ログに出すだけのモードです。
cp api/.dev.vars.example api/.dev.vars
npm run dev # http://localhost:8787
# 別のターミナルで
export LINE_APPROVAL_URL=http://localhost:8787 LINE_APPROVAL_TOKEN=local-dev-token
node client/dist/cli.js ask "テスト" --wait 120 --print value
# さらに別のターミナルで、LINE で返信したことにする(ID は dev サーバーのログの #XXXXXX)
npm run simulate -- tap XXXXXX 0 # ボタン 0 番を押す
npm run simulate -- text "承認" # 文字で返信
npm run simulate -- text "hi" --user Uother # 許可リスト外のユーザー(無視される)テスト:
npm test # 署名検証・許可リスト・依頼のライフサイクル・CLI・MCP
npm run typecheckディレクトリ構成
api/ Cloudflare Worker(Webhook 受信・HTTP API・KV)
client/ クライアントライブラリ、CLI(line-approval)、MCP サーバー(line-approval-mcp)
scripts/ ローカル開発用の Webhook シミュレータAPI(api/)とクライアント(client/)は分離しており、クライアントは HTTP 経由でのみ API を呼びます。
English summary
line-approval-bridge lets an AI agent (Claude Code scheduled tasks, scripts) send you a LINE message and wait for your reply or approval, then branch on it. The official LINE Bot MCP Server can only send; this project adds the receiving side: a Cloudflare Worker that verifies LINE webhook signatures, accepts replies only from allowlisted userIds, stores them in Workers KV, and exposes a bearer-token HTTP API. A stdio MCP server (notify, ask_approval, get_reply) and a CLI (exit codes for branching) wrap the API. Runs on free tiers (Cloudflare Workers + LINE's 200 messages/month plan; acknowledgements use the free reply API). Includes a local dry-run mode with a signed-webhook simulator and tests for signature verification, the allowlist and the request lifecycle.
License
This server cannot be deployed
Maintenance
Related MCP Connectors
Give any AI agent a way to ask a person — for approval, a decision, an answer or a review.
- iotPushOAuthcom.iotpush
Notifications you can answer: agents push to your phone and wait for your approval or reply.
Human approvals, notifications, inbound webhooks, wake-ups for headless agents. Free trial: /try
Reach your own phone from an AI agent: notifications, approval questions, reminders, ring, files.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI agents to send messages, manage rich menus, and interact with users through LINE Official Accounts via the LINE Messaging API. Supports both individual messaging and broadcasting to all followers with text and customizable flex messages.181,215 npmApache 2.0
- AlicenseAqualityCmaintenanceEnables an AI agent to connect to a LINE Official Account via the LINE Messaging API, sending push and broadcast text or flex messages, managing rich menus, and retrieving user profiles, message quotas, follower IDs, and group summaries.13Apache 2.0
- AlicenseNot gradedqualityCmaintenanceConnects an AI agent to a LINE Official Account through the LINE Messaging API, enabling it to push and broadcast text or flex messages to users. It also supports retrieving user profiles, message quotas, follower IDs, and group summaries, plus creating and managing rich menus.5 npmApache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to run one or many LINE Official Accounts through natural language — sending broadcasts, Flex, Rich, and coupon messages, managing rich menus, audiences, coupons, webhooks, insights, and LINE Shopping operations. Includes pre-flight quota and quiet-hour guardrails, Thai-localized output, and zero-setup image hosting for tappable rich messages.31 npmMIT