mcpField
S
send-message

send-message

github.com/terrylica生産性172 回インストール今日更新
リポジトリ

send-message について

send-messageは、MTProto経由で個人のTelegramアカウントからメッセージを送るスキルです。認証確認、トピック選択、HTML形式、長文分割、編集方法を案内します。

主な機能

  1. 01Telegramセッションの認証確認
  2. 02グループの特定トピックへの送信
  3. 03Telegram HTMLによる書式設定
  4. 04長文の自動分割
  5. 05編集と訂正メッセージの案内

活用シーン

  1. 01適切なグループトピックへの更新投稿
  2. 02コードや見出しを含む書式付きメッセージの送信
  3. 03長文を連続した複数投稿で配信
  4. 04既読メッセージの無断編集を回避

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/terrylica/cc-skills --skill send-message

インストール後、Claude Code で/send-messageを入力して読み込まれたか確認します。

詳細

Telegram メッセージを送信する

MTProto 経由で、ボットではなく個人の Telegram アカウントからメッセージを送信します。

自己進化型スキル:このスキルは使用を通じて改善されます。指示が間違っている、パラメーターが変化している、または回避策が必要だった場合は、後回しにせず、このファイルをすぐに修正してください。実際に再現できる問題がある場合のみ更新してください。

事前確認

送信する前に、ファイルが存在することだけでなく、セッションが認証済みであることを確認してください。

bun "$SCRIPT" check-auth

EXPIRED の場合は、最初に /tlg:setup を実行してください(3 ステップの非対話型認証パターンを使用します)。

スーパーグループを優先する方法

Bruntwork グループ(-1003958083153)は、トピック機能を備えたスーパーグループです。このグループへのすべてのメッセージは、特定のトピックを指定する必要があります。トピックを指定せず、スーパーグループ自体に投稿してはいけません。

基本チャットよりスーパーグループを優先する理由:

  • サーバー全体で共通のメッセージ ID。 すべてのメンバーに、各メッセージの同じ id=N が表示されます。両者の Claude Code は引用を同じように解決できるため、閲覧者の指定が不要で、境界をまたぐ際の曖昧さもありません。
  • トピックごとの名前空間。 ポリシーが日々のチェックインの間に埋もれることはありません。各テーマに独立したピン留め機能を備えた、検索可能なスレッドが用意されています。
  • AI エージェントによる宛先指定。 Claude Code は reply_to_msg_id を介して、特定のトピックを対象に読み取りや書き込みを行えます。これにより、「このバグ報告を Bug Reports に投稿する」「Policies で例外措置の決定を検索する」といった正確な振り分けが可能になります。
  • 確認シグナルとしての絵文字リアクション。 リアクションは message.reactions.results を介してプログラムから読み取れるため、テキストでの返信を求めずに簡単な ACK の確認ができます。

トピック選択のルール: メッセージを作成するときは、以下の Topic Registry から最も具体的なトピックを選択してください。General は他に選択肢がない場合のみ使用してください。同じメッセージを複数のトピックに重複して投稿してはいけません。

引用のルール: id=N のみの引用は、すべてのメンバーで同じように解決されます。過去のメッセージを参照する場合は、その ID を引用してください。両者の Claude Code は client.get_messages(supergroup_id, ids=N) を使って自動で検索できます。

tg-cli.ts でトピックに送信する場合: トピックの root_msg_id を指定して --reply-to フラグを使用してください。root_msg_id の値については、以下の Topic Registry セクションを参照してください。

bun "$SCRIPT" send --html --reply-to 5 -1003958083153 "<b>Policy update</b> ..."

長いメッセージの自動分割

Telegram では、解析後の文字数がメッセージあたり 4096 文字に制限されています。tg-cli.ts の send と draft は、約 3900 文字を超えるメッセージを複数の投稿に自動分割し、HTML の書式とセクション構成を維持します。

分割アルゴリズム:すべてのチャンクが制限内に収まるよう、最も細かく安全な境界で分割します。

  1. \n\n━━━━━━━━━━━━━━\n\n(大きなセクションの区切り。優先)
  2. \n━━━━━━━━━━━━━━\n(セクションの区切り)
  3. \n\n(段落の区切り)
  4. \n(改行)
  5. 文字数による強制分割(最終手段。警告が表示され、タグが壊れる可能性があります)

続きの各チャンクには、順序が明確に伝わるよう、先頭に <i>(Part N/M)</i> ヘッダーが追加されます。すべてのパートで同じ --reply-to の宛先が使われるため、複数パートの投稿も 1 つのトピックのスレッドにまとまります。

メッセージを手動で分割する必要はもうありません。 HTML 全体を 1 つの文字列として作成し、send に渡せば、分割処理が対応します。

サイズを考慮した作成のガイダンス:1 回の投稿に収まるメッセージ(≤ 3900 文字)を優先してください。分割するとパート用ヘッダーが加わり、表示上の余分な情報が増えます。自然に長くなるメッセージ(ピン留めする参照資料など)は、分割処理に任せてください。━━━━━━━━━━━━━━ の区切りを使って構成し、論理的なセクションの間で適切に分割されるようにしてください。

使用方法:tg-cli.ts(セッションが有効な場合)

迷ったら、--html を使用してください。 メッセージに <b>、<i>、<code>、<pre>、<a href>、太字の見出し、インラインコード、または Markdown 形式の **太字**/`コード` のいずれかが含まれる場合は、必ず --html を渡す(その前に Markdown を HTML タグに変換する)か、装飾を取り除いてください。--html を指定せずに Telegram 形式の Markdown を送信すると、アスタリスクやバッククォートがそのまま受信者に表示されます。見出し、区切り線、コードスパンを含む複数セクションのメッセージでは、必ず --html を使用してください。

メッセージがすでに崩れて表示された場合の修正パターン:Correction — earlier message rendered as raw text, corrected version below: を先頭に付けてから、正しく HTML 形式にした内容を再送信します(メッセージが既読の場合は、黙って編集しないでください。下記の「編集の規律」を参照)。

/usr/bin/env bash << 'SEND_EOF'
ROOT="$(cc-plugin-root tlg)"
SCRIPT="$ROOT/scripts/tg-cli.ts"

# Default: plain text (use only for single-line unformatted messages)
bun "$SCRIPT" send @username "Hello"

# HTML formatting — the recommended default for any structured message
bun "$SCRIPT" send --html -1003958083153 "<b>Bold header</b>

Body with <code>inline code</code> and <a href='https://example.com'>a link</a>."

# By chat ID (groups use negative IDs)
bun "$SCRIPT" send -1003958083153 "Hello group"

# Specific profile
bun "$SCRIPT" -p personal send @username "Hello"

# Edit a message by ID
bun "$SCRIPT" edit -1003958083153 12345 "<b>Updated text</b>"

# Delete a message by ID
bun "$SCRIPT" delete -1003958083153 12345
SEND_EOF

長い HTML メッセージ:tg-cli.ts send --html は、3900 文字(プレーンテキスト)のしきい値で自動的に分割します。HTML 全体を 1 つの文字列として作成し、分割処理に任せてください。上記の「長いメッセージの自動分割」を参照してください。

編集の規律 — 未読と既読

基本原則:受信者がまだメッセージを読んでいないと確信できる場合に限り、黙って編集してください。相手がメッセージを見た後に編集すると、誤った記録を作り、混乱を招くおそれがあります(相手は元のテキストを覚えているのに、チャットには別のテキストが表示されるためです)。

状況対応
アクティブな非同期チャットで 30 秒以内にメッセージを送信し、Telegram に誰も触れていない編集しても安全です — 自由に修正してください
誤字や事実誤認のあるメッセージを送信したばかりで、受信者から返信がない編集しても安全です — まだ読まれていない可能性が高いです
受信者があなたのメッセージに返信した黙って編集しないでください — 補足を送信してください
受信者がメッセージを読んだものの、まだ返信していない(既読通知が表示されている、または入力中インジケーターが表示された後に消えた)黙って編集しないでください — 補足を送信してください
受信者が読んだかどうかわからない補足を送信するのが原則です — 混乱させるより安全です
チャット内で他の人がメッセージを引用した編集しないでください — 引用が古い文脈になっているため、代わりに補足してください

補足のパターン(編集が安全でない場合):

Correction on my previous message: <specific change>

または

Update to what I said above: <new info that supersedes>

後から読み返した人が、前のメッセージを参照しなくても内容を理解できるよう、補足だけで意味が通じるようにしてください。

重要な理由:既読メッセージを黙って編集することは、チャットシステムにおいて最も混乱を招く UX のアンチパターンの 1 つです。受信者は「Terry が X と言った」と覚えているのに、今は「X'」と表示されており、自分の記憶違いなのか、ガスライティングされているのかと困惑します。編集は、相手がメッセージを見る前に使う特権であり、過去を書き換えるためのものではありません。

既読かどうかを判断する方法:Telegram の MTProto は、1 対 1 および小規模なグループチャットでは messages.readHistoryOutbox 更新を通じて既読通知を公開しますが、大規模なグループでは信頼できません。最も安全な判断基準は、経過時間とアクティビティです。約 60 秒以上経過している場合、または受信者がチャットでアクティブだった場合は、読まれたものと考えてください。

Telegram HTML 書式設定リファレンス

GramJS では Markdown ではなく HTML を使用します。

タグ表示形式
<b>text</b>太字
<i>text</i>斜体
<u>text</u>下線
<s>text</s>取り消し線
<code>text</code>インラインコード
<pre>text</pre>コードブロック
<a href="url">text</a>ハイパーリンク
<tg-spoiler>text</tg-spoiler>ネタバレ
水平区切り線のルール(必須の規約)

長いメッセージのセクション間には、水平区切り線として ━(U+2501)を使用します。

長さのルール:14 文字を推奨し、最大 22 文字とします。

  • 推奨:━━━━━━━━━━━━━━(━ 14 個)
  • 許容される上限:━━━━━━━━━━━━━━━━━━━━━━(━ 22 個、=14 + 8)
  • 22 文字を超えないでください。長い区切り線はモバイルクライアント上で視覚的なバランスを損ない、本文が画面外にはみ出します。

理由:Telegram のモバイルクライアントでは本文は折り返されますが、罫線文字で構成された区切り線は折り返されません。28 文字の区切り線は画面幅の狭いスマートフォンで横スクロールを発生させますが、14 文字ならどの画面幅にもすっきり収まり、明確なセクション区切りとして機能します。視覚的な強調を強めたい場合は、区切り線を長くするのではなく、その上に見出し(<b>...</b>)を使用してください。

絵文字も使用できますが、ユーザーは絵文字を使わない装飾を好む場合があります。その場合は、<pre> ブロックと罫線文字を使用してください。

プロファイル

プロファイルアカウントユーザー ID
work(デフォルト)@ExampleOpsAccount
personal@personal_account

既知のグループチャット ID

グループチャット ID種類
Terry & MD (Bruntwork)-1003958083153スーパーグループ
Terry & MD (Bruntwork)-1003958083153レガシー基本チャット(2026-04-16 より前。過去のメッセージは読み取り専用)

トピックレジストリ(Bruntwork スーパーグループ)

特定のトピックにメッセージを送信するには、send_message() に reply_to=<root_msg_id> を指定するか、tg-cli.ts で --reply-to を使用します。

トピックroot_msg_id範囲
全般1あらゆる話題、簡単な質問
割り当てと成果物2タスクの定義、PR レビュー、Block の進捗確認
日常業務3出勤・退勤、シフト状況
オンボーディングとアクセス4リポジトリアクセス、SSH/Tailscale、ツールのプロビジョニング
ポリシーと規約5cc-skills の適用除外、規約、規律
バグ報告とインシデント6マージの競合、フックのバグ、パイプラインの障害
ツールのセットアップと設定7example-service、example-app、example-pipeline
ナレッジベースと学習8KB ページ、調査資料、スキルのリファレンス
人事とスケジュール9シフト時間、Bruntwork との調整
セッションモニター185Claude Code セッションのリアルタイム要約(CC Nasim Bot)

アンチパターン(絶対にしないでください)

アンチパターン失敗する理由
事前に認証を確認せずに bun "$SCRIPT" を実行するセッションの有効期限が切れていると、認証に失敗します
事前チェックでセッションファイルの存在だけを確認するセッションファイルが存在しても、有効期限が切れている場合があります — check-auth で確認する必要があります
書式設定するメッセージにプレーンテキストを使うGramJS では Markdown ではなく HTML を使用します。書式設定には --html フラグを使ってください

エラー処理

エラー原因修正方法
Unknown profile無効な -p の値work または personal を使ってください
Cannot find any entityユーザー名/ID が不正dialogs コマンドで確認するか、find-user を使って解決してください
message cannot be empty空の文字列が渡されたメッセージ本文を指定してください
Session expiredセッションが無効になった/tlg:setup を実行して、対話なしで再認証してください

実行後の振り返り

このスキルの実行後、終了する前に次の点を確認してください。

  1. コマンドは成功しましたか? — 失敗した場合は、失敗の原因となった手順またはエラーテーブルを修正してください。
  2. パラメーターや出力に変更はありましたか? — tg-cli.ts のインターフェースに変更があった場合は、Usage の例と Parameters テーブルを更新して合わせてください。
  3. 回避策が必要でしたか? — 別のフラグや追加手順など、その場しのぎの対応が必要だった場合は、次回同じ回避策が不要になるよう、この SKILL.md を更新してください。

実際に再現可能な問題がある場合にのみ更新してください。憶測に基づいて更新しないでください。

コメント