claude-to-im について
claude-to-im は、Claude とメッセージングチャネル間のブリッジを設定・運用するスキルです。セットアップの案内に加え、起動、停止、状態確認、診断を行えます。
主な機能
- 01チャネルの対話型セットアップ
- 02ブリッジの起動と停止
- 03状態とログの確認
- 04設定の変更
- 05診断チェック
活用シーン
- 01Claude を対応するメッセージングチャネルに接続
- 02ブリッジの稼働状況を確認
- 03問題発生後にログを調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ op7418/ claude-to-im-skill --skill claude-to-imインストール後、Claude Code で/claude-to-imを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.gitignoreCLAUDE.mdconfig.env.exampleSECURITY.mdLICENSEREADME.mdREADME_CN.mdpackage-lock.jsonpackage.jsonevals/evals.jsonreferences/setup-guides.mdtroubleshooting.mdusage.mdtoken-validation.mdscripts/build.jsdaemon.ps1daemon.shsupervisor-macos.shdoctor.shinstall-codex.shsupervisor-linux.shsupervisor-windows.ps1src/__tests__/llm-provider.test.tscodex-provider.test.tsconfig.test.tsstore.test.tspermission.test.tsweixin-adapter.test.tsweixin-api.test.tslogger.test.ts詳細
Claude-to-IM ブリッジスキル
Claude-to-IM ブリッジを管理します。
ユーザーデータは ~/.claude-to-im/ に保存されます。
スキルディレクトリ(SKILL_DIR)は ~/.claude/skills/claude-to-im にあります。
Codex のインストール環境では、代わりに ~/.codex/skills/Claude-to-IM-skill の場合があります。
どちらのパスも存在しない場合は、パターン **/skills/**/claude-to-im/SKILL.md または **/skills/**/Claude-to-IM-skill/SKILL.md を使って Glob で検索し、結果からルートを導き出します。
コマンドの解析
$ARGUMENTS からユーザーの意図を解析し、次のいずれかのサブコマンドに分類します。
| ユーザーの発言(例) | サブコマンド |
|---|---|
setup、configure、配置、我想在飞书上用 Claude、帮我连接 Telegram、帮我接微信 | setup |
start、start bridge、启动、启动桥接 | start |
stop、stop bridge、停止、停止桥接 | stop |
status、bridge status、状态、运行状态、怎么看桥接的运行状态 | status |
logs、logs 200、查看日志、查看日志 200 | logs |
reconfigure、修改配置、帮我改一下 token、换个 bot | reconfigure |
doctor、diagnose、诊断、挂了、没反应了、bot 没反应、出问题了 | doctor |
判別:status と doctor — ブリッジが実行中かどうかを確認したいだけの場合(情報の確認)は status を使います。ユーザーが問題を報告したり、何かが壊れていると疑ったりしている場合(診断)は doctor を使います。判断に迷い、ユーザーが症状(例:「没反应了」、「挂了」)を説明している場合は、doctor を優先します。
logs のオプションの数値引数を抽出します(デフォルトは 50)。
ユーザーにプラットフォームの認証情報を尋ねる前に、内部で SKILL_DIR/references/setup-guides.md を読み、各認証情報の取得先を確認してください。ガイド全体を最初にユーザーへ提示してはいけません。必要な次の手順だけを伝えます(例:「https://open.feishu.cn → アプリ → Credentials に移動して App ID を確認してください」)。ユーザーが方法を知らないと言った場合は、ガイドの該当セクションを提示してください。
実行環境の検出
サブコマンドを実行する前に、実行環境を検出します。
- Claude Code —
AskUserQuestionツールが利用可能です。対話形式のセットアップウィザードで使用します。 - Codex / その他 —
AskUserQuestionは利用できません。対話なしの手順案内に切り替え、SKILL_DIR/config.env.exampleを提示し、ユーザーに~/.claude-to-im/config.envを手動で作成するよう依頼します。
利用可能なツールの一覧に AskUserQuestion が含まれているか確認して、これを判定できます。
設定の確認(start、stop、status、logs、reconfigure、doctor に適用)
setup 以外のサブコマンドを実行する前に、~/.claude-to-im/config.env が存在するか確認します。
- 存在しない場合:
- Claude Code の場合:ユーザーに「設定が見つかりません」と伝え、AskUserQuestion を使って
setupウィザードを自動的に開始します。 - Codex の場合:ユーザーに「設定が見つかりません。次の例を参考に
~/.claude-to-im/config.envを作成してください:」と伝え、SKILL_DIR/config.env.exampleの内容を提示して終了します。デーモンを起動しようとしてはいけません。config.env がないと起動時にプロセスがクラッシュし、古い PID ファイルが残って次回以降の起動を妨げます。
- Claude Code の場合:ユーザーに「設定が見つかりません」と伝え、AskUserQuestion を使って
- 存在する場合: 要求されたサブコマンドを続行します。
サブコマンド
setup
対話形式のセットアップウィザードを実行します。このサブコマンドには AskUserQuestion が必要です。利用できない場合(Codex 環境)は、SKILL_DIR/config.env.example の内容を項目ごとの説明とともに提示し、ユーザーに設定ファイルを手動で作成するよう指示します。
AskUserQuestion が利用可能な場合は、入力を1 項目ずつ収集します。回答を受け取るたびに、次の質問へ進む前に値をユーザーに確認します(シークレットは末尾 4 文字のみ表示します)。
ステップ 1 — チャネルを選択 有効にするチャネルを尋ねます(telegram、discord、feishu、qq、weixin)。カンマ区切りの入力を受け付けます。それぞれを簡単に説明します:
- telegram — 個人利用に最適です。ストリーミングプレビュー、インライン権限ボタン。
- discord — チーム利用に適しています。サーバー/チャネル/ユーザーレベルのアクセス制御。
- feishu(Lark) — Feishu/Lark チーム向けです。ストリーミングカード、ツールの進捗、インライン権限ボタン。
- qq — QQ の C2C プライベートチャット専用です。インライン権限ボタンなし、ストリーミングプレビューなし。権限はテキストの
/perm ...コマンドを使用します。 - weixin — WeChat の QR ログイン。連携できるアカウントは 1 つのみで、新しくログインすると以前のアカウントが置き換わります。インライン権限ボタンなし、ストリーミングプレビューなし。権限はテキストの
/perm ...コマンドまたは簡易的な1/2/3の返信を使用します。音声メッセージは WeChat 自身の音声テキスト変換によるテキストのみを使用し、生の音声データはブリッジでは文字起こしされません。
ステップ 2 — チャネルごとにトークンを収集する
有効にするチャネルごとに、認証情報を 1 つずつ収集します。それぞれの値がどこにあるかを 1 文でユーザーに伝えます。ユーザーが助けを求めたり、どこにあるかわからないと述べたりした場合にのみ、(SKILL_DIR/references/setup-guides.md から)ガイドのセクション全体を表示します:
- Telegram:Bot Token → 確認(マスク表示)→ Chat ID(取得方法についてはガイドを参照)→ 確認 → Allowed User IDs(任意)。重要: Chat ID と Allowed User IDs の少なくとも一方を設定する必要があります。設定しない場合、ボットはすべてのメッセージを拒否します。
- Discord:Bot Token → 確認(マスク表示)→ Allowed User IDs → Allowed Channel IDs(任意)→ Allowed Guild IDs(任意)。重要: Allowed User IDs と Allowed Channel IDs の少なくとも一方を設定する必要があります。設定しない場合、ボットはすべてのメッセージを拒否します(デフォルトで拒否)。
- Feishu:App ID → 確認 → App Secret → 確認(マスク表示)→ Domain(任意)→ Allowed User IDs(任意)。認証情報を収集したら、ユーザーが完了する必要のある2段階のセットアップを説明します。
- フェーズ1(ブリッジ起動前):(A)権限を一括追加、(B)ボット機能を有効化、(C)最初のバージョンを公開し、管理者の承認を受ける。これにより、権限とボットが有効になります。
- フェーズ2(ブリッジの実行が必要):(D)
/claude-to-im startを実行、(E)長時間接続モードでイベント(im.message.receive_v1)とコールバック(card.action.trigger)を設定、(F)2つ目のバージョンを公開し、管理者の承認を受ける。 - 2段階に分ける理由: Feishuでは、イベントサブスクリプションの保存時にWebSocket接続を検証します。ブリッジが実行されていないと、保存に失敗します。ブリッジが接続するには、公開済みの権限が必要です。
- 短いチェックリストにまとめ、完全なガイドは求められた場合のみ提示してください。
- QQ:必須項目を2つ収集してから、任意項目を尋ねます。
- QQ App ID(必須)→ 確認
- QQ App Secret(必須)→ 確認(マスク表示)
- 次のように伝えます:これら2つの値は https://q.qq.com/qqbot/openclaw で確認できます。
- Allowed User OpenIDs(任意。Enterキーでスキップ)— 注意:これは
user_openidであり、QQ番号ではありません。まだopenidを持っていない場合は、空欄のままにできます。 - Image Enabled(任意。デフォルトはtrue。Enterキーでスキップ)— 基盤となるプロバイダーが画像入力に対応していない場合は、falseに設定します。
- Max Image Size MB(任意。デフォルトは20。Enterキーでスキップ)
- 注意事項を伝えます:QQの最初のバージョンでは、C2Cのプライベートチャットによるサンドボックスアクセスのみをサポートします。グループ/チャンネルには対応せず、インラインボタンやストリーミングプレビューもありません。
- Weixin:静的トークンを尋ねないでください。代わりに、次の手順を実行します。
- このチャンネルでは、認証情報を手動入力するのではなく、QRコードでログインすることをユーザーに伝えます。
cd SKILL_DIR && npm run weixin:loginを実行します。- ヘルパーは
~/.claude-to-im/runtime/weixin-login.htmlを作成し、ローカルブラウザーで自動的に開こうとします。 - 自動で開けない場合は、そのHTMLファイルを手動で開き、WeChatでQRコードをスキャンするようユーザーに伝えます。
- ヘルパーが成功を報告するまで待ち、連携したアカウントがローカルに保存されたことを確認します。
- 簡潔に説明します:連携したWeixinアカウントは
~/.claude-to-im/data/weixin-accounts.jsonに保存されます。ヘルパーを再実行すると、以前に連携したアカウントは置き換えられます。 - 簡潔に説明します:
CTI_WEIXIN_MEDIA_ENABLEDは、受信した画像/ファイル/動画のダウンロードのみを制御します。音声メッセージについて、ブリッジが受け付けるのはWeChatの組み込み音声テキスト変換で返されたテキストのみです。WeChatが文字起こし結果を提供しない場合、ブリッジは生の音声をダウンロード/文字起こしせず、エラーを返信します。
ステップ3 — 一般設定
ランタイム、デフォルトの作業ディレクトリ、モデル、モードを尋ねます。
- ランタイム:
claude(デフォルト)、codex、autoclaude— Claude Code CLI + Claude Agent SDKを使用します(claudeCLIのインストールが必要です)。codex— OpenAI Codex SDKを使用します(codexCLIが必要です。codex auth loginまたはOPENAI_API_KEYで認証します)。auto— 最初にClaudeを試し、Claude CLIが見つからない場合はCodexに切り替えます。
- 作業ディレクトリ:デフォルトは
$CWD - モデル(任意):空欄にすると、ランタイム固有のデフォルトモデルを継承します。上書きを希望する場合は、モデル名を入力するようユーザーに尋ねます。モデル名を固定値として指定したり、具体的な名前を提案したりしないでください。利用可能なモデルは随時変わります。
- モード:
code(デフォルト)、plan、ask
ステップ4 — 設定の書き込みと検証
- すべての設定を含む最終サマリーテーブルを表示する(シークレットは末尾 4 文字のみ表示)
- 書き込む前にユーザーに確認を求める
- Bash を使用してディレクトリ構造を作成する:
mkdir -p ~/.claude-to-im/{data,logs,runtime,data/messages} - Write を使用して
~/.claude-to-im/config.envをすべての設定を KEY=VALUE 形式で作成する - Bash を使用してパーミッションを設定する:
chmod 600 ~/.claude-to-im/config.env - トークンを検証する — 各プラットフォームの正確なコマンドと期待されるレスポンスについては
SKILL_DIR/references/token-validation.mdを参照してください。これにより、ユーザーがデーモンを起動しようとする前に、タイプミスや誤った認証情報を検出できます。Weixin の場合、QR ログインが成功した時点で検証済みとみなされます。 - サマリーテーブルとともに結果を報告します。検証が失敗した場合は、何が問題である可能性があり、どのように修正するかを説明してください。
- 成功した場合は、ユーザーに伝えてください: 「セットアップ完了!
/claude-to-im startを実行してブリッジを起動してください。」
start
事前チェック: ~/.claude-to-im/config.env が存在することを確認します(上記の「設定チェック」を参照)。存在しない場合、デーモンは即座にクラッシュし、古い PID ファイルが残ります。
実行: bash "SKILL_DIR/scripts/daemon.sh" start
出力をユーザーに表示します。失敗した場合は、ユーザーに伝えてください:
doctorを実行して診断する:/claude-to-im doctor- 最近のログを確認する:
/claude-to-im logs
stop
実行: bash "SKILL_DIR/scripts/daemon.sh" stop
status
実行: bash "SKILL_DIR/scripts/daemon.sh" status
logs
引数から省略可能な行数 N を抽出します(デフォルトは 50)。
実行: bash "SKILL_DIR/scripts/daemon.sh" logs N
reconfigure
~/.claude-to-im/config.envから現在の設定を読み取る- 現在の設定をわかりやすいテーブル形式で表示する(すべてのシークレットはマスクし、末尾 4 文字のみ表示)
- AskUserQuestion を使用して、ユーザーが何を変更したいかを尋ねる
- 新しい値を収集する際は、その値の場所をユーザーに伝えてください。ユーザーがヘルプを求めた場合にのみ、
SKILL_DIR/references/setup-guides.mdの完全なガイドを表示します - 設定ファイルをアトミックに更新する(tmp に書き込み、リネーム)
- 変更されたトークンを再検証する
- ユーザーにリマインドする: 「
/claude-to-im stopを実行してから/claude-to-im startを実行すると、変更が適用されます。」
ユーザーが reconfigure 中に Weixin アカウントを切り替えたい場合は、cd SKILL_DIR && npm run weixin:login を再度実行してください。スキャンが成功するたびに、以前にリンクされたローカルアカウントが置き換えられます。
doctor
実行: bash "SKILL_DIR/scripts/doctor.sh"
結果を表示し、失敗した項目に対する修正案を提示します。一般的な修正方法:
- SDK cli.js が見つからない →
cd SKILL_DIR && npm install - dist/daemon.mjs が古い →
cd SKILL_DIR && npm run build - 設定が存在しない →
setupを実行 - Weixin アカウントが存在しない / 期限切れ →
cd SKILL_DIR && npm run weixin:login - Weixin の音声メッセージで音声テキスト変換が見つからないと報告される → WeChat 自体の音声文字起こしを有効にして再送信してください。ブリッジは生の音声を自身で文字起こしすることはありません
より複雑な問題(メッセージが受信されない、パーミッションのタイムアウト、高いメモリ使用量、古い PID ファイル)については、詳細な診断手順が記載されている SKILL_DIR/references/troubleshooting.md を参照してください。
Feishu アップグレードに関する注意: ユーザーがこのスキルの古いバージョンからアップグレードし、Feishu がパーミッションエラーを返している場合(例: ストリーミングカードが動作しない、タイピングインジケーターが失敗する、パーミッションボタンが反応しない)、根本原因はほぼ確実に Feishu バックエンドのパーミッションまたはコールバックの不足です。ユーザーに SKILL_DIR/references/setup-guides.md の「以前のバージョンからのアップグレード」セクションを案内してください — 新しいスコープ(cardkit:card:write、cardkit:card:read、im:message:update、im:message.reactions:read、im:message.reactions:write_only)を追加し、card.action.trigger コールバックを追加して、アプリを再公開する必要があります。コールバックの追加にはアクティブな WebSocket 接続が必要なため(ブリッジが実行されている必要があります)、アップグレードには 2 回の公開サイクルが必要です。
注意事項
- 出力では必ずシークレットをマスクしてください(末尾の4文字のみを表示)。ユーザーはバグ報告でターミナル出力を共有することが多いため、トークンが漏えいするとセキュリティインシデントにつながります。
- デーモンを起動する前に、必ず config.env の有無を確認してください。存在しない場合、起動時にプロセスがクラッシュし、古い PID ファイルが残って以降の起動を妨げます(手動でのクリーンアップが必要になります)。
- デーモンは、プラットフォームのスーパーバイザー(macOS では launchd、Linux では setsid、Windows では WinSW/NSSM)によって管理される、バックグラウンドの Node.js プロセスとして実行されます。
- 設定は
~/.claude-to-im/config.envに保存され、セッションをまたいで保持されます。