Postlint MCP Server について
Postlint MCP Serverは、ネットワーク接続や認証情報を使わず、決定的なカウントでSNS投稿文が各プラットフォームの上限内か確認します。X、Bluesky、LinkedIn、Threads、Mastodon、Discord向けの投稿を準備する作者やエージェントが対象です。
主な機能
- 01単一プラットフォームの上限を確認
- 02複数プラットフォームで投稿文を比較
- 03文字数、上限、残り文字数を表示
- 04各プラットフォームのURLや書記素の規則に対応
- 05上限、計数単位、出典を表示
活用シーン
- 01公開前に投稿の下書きを検証
- 02リンクが各プラットフォームの文字数に与える影響を比較
- 03絵文字や複雑な書記素を含む文章を確認
- 04投稿に残された文字数を確認
MCP 対応
MCPサーバーは、単一またはすべての対応プラットフォームで投稿を確認するツールと、各上限を表示するツールを提供します。確認はすべてローカル計算で、ネットワーク通信は行いません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
3掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| text | string | はい | 公開時と完全に同じ投稿本文。プラットフォームと同様に、先頭と末尾の空白はトリミングされます。`[URL]` 形式のプレースホルダーは実際のリンクとしてカウントされます。 |
| platform | enum | はい | 適用するプラットフォームのルール:x、x_premium、bluesky、linkedin、threads、mastodon、discord。x | x_premium | bluesky | linkedin | threads | mastodon | discord |
詳細
postlint-mcp
メンテナンスモード。 このプロジェクトは安定しており、セキュリティ修正を受け付けています。新機能の追加予定はありませんが、issue と pull request は引き続き歓迎します。
投稿を公開する前に、各プラットフォームの実際の文字数制限に収まっているか確認できます。X、Bluesky、LinkedIn、Threads、Mastodon、Discordに対応しています。純粋な計算処理です。API、認証、ネットワークは不要です。
docs/demo.tapeをvhsで記録したものです。投稿と文字数はscripts/fixtures.mjsから取得しており、回帰テストでもこのファイルをインポートしています。
このMCP サーバーが答えるのは、投稿が文字数制限に収まるかどうか、その一つの質問です。
言語モデルは見ただけでは文字数を数えられません。また、これらのプラットフォームでは、あなたにも数えられません。制限の仕組みは見た目とは異なります。Xでは、リンクが12文字でも200文字でも、t.coを通じてすべてのURLが23文字として計上されます。Blueskyでは拡張書記素クラスタで数えるため、4人家族の絵文字は11文字ではなく1文字です。Mastodonでは、リモートメンションのドメインは文字数に加算されません。こうした仕組みを一つでも誤ると、公開時に投稿が拒否されたり、途中で切り詰められたりします。
文字数を数えることこそ、ツール呼び出しに任せるべき作業です。モデルは見ただけでは数えられませんが、決定論的な関数なら正確に計算できます。
このプロジェクトの目的。 ポッドキャストのプロモーションワークフローから、文字数制限を超えた投稿が2件公開されました。Blueskyの投稿は上限300に対して302文字で公開され、そのすぐ下には「300書記素以内。監査問題なし。」という文がありました。Xの投稿は上限280に対して308文字で下書きされ、公開初日の朝に拒否されるところでした。どちらも目視では気づけませんでした。どちらの場合も、文字数は実測値ではなく、単なる主張だったからです。このリポジトリには、どちらも回帰テストとして追加されています。
ツール
| ツール | 返される内容 |
|---|---|
check_post | 1つのプラットフォームに対する判定:文字数、上限、残りの余裕、文字数に影響した要素 |
check_post_all | プラットフォームごとに1行。内訳が添付されるのは制限を超えた行のみ |
platform_limits | 各プラットフォームの上限、計数単位、その単位が通常の文字数と異なる理由、情報源 |
応答は意図的に小さくしています。エージェントは応答ごとにトークンを消費するため、check_post_allは制限内の行について計算の内訳を省略します。
各プラットフォームのカウント方法
| プラットフォーム | 上限 | 単位 | 意外に思われる点 | 出典 |
|---|---|---|---|---|
x | 280 | 重み付け文字数 | URL はすべて正確に 23 としてカウントされます。CJK、ハングル、絵文字はそれぞれ 2、ラテン文字、ギリシャ文字、キリル文字、ヘブライ文字、アラビア文字はそれぞれ 1 としてカウントされます。絵文字シーケンスはコードポイントごとに 2 ではなく、全体で 2 単位です。 | twitter-text v3 config |
x_premium | 25,000 | 重み付け文字数 | 重み付け方法は同じで、上限が高くなっています。 | X help center |
bluesky | 300 | 書記素 | 国旗、ZWJ 絵文字、肌の色の修飾子、結合アクセントはそれぞれ 1 としてカウントされます。URL は全体がカウントされます。ZWJ を多用したテキストでは、別途設けられた 3,000 UTF-8 バイトの上限が先に適用されることがあります。 | atproto lexicon |
linkedin | 3,000 | 文字 | 3,000 という上限には余裕がありますが、本当の制約は折りたたみです。数行の後、フィードでは投稿が「さらに表示」の背後に折りたたまれます。 | LinkedIn help |
threads | 500 | 文字 | 2025年9月の変更で、10,000文字の添付テキストが追加されました。投稿本文は引き続き 500 文字です。 | Meta newsroom |
mastodon | 500 | 書記素 | X と同様、URL は 23 としてカウントされます。@[email protected] では、@user だけがカウントされます。上限はインスタンスごとに異なり、より高い上限を設けているサーバーも多数あります。 | Mastodon API docs |
discord | 2,000 | 文字 | Nitro では 4,000 です。埋め込みには、別途合計 6,000 の上限があります。 | Discord support |
上記の数値はすべて、公表されている情報源に基づいています。一次情報源に記載がないのに広く繰り返されている数値――Facebook の投稿上限、YouTube のコミュニティ投稿上限、Reddit のタイトル上限、Instagram の通常キャプション上限――は、意図的に記載していません。根拠を示せない上限では、チェックを通過しても意味がありません。
セットアップ
npm で公開されています。以下の設定例では npx を使用しており、初回実行時に取得されるため、クローンは不要です。
git clone https://github.com/conorbronsdon/postlint-mcp.git
cd postlint-mcp
npm install
npm run build
Claude Code
.mcp.json に追加します。
{
"mcpServers": {
"postlint": {
"command": "node",
"args": ["/absolute/path/to/postlint-mcp/dist/index.js"]
}
}
}
Claude Desktop
同じ設定ブロックを claude_desktop_config.json に追加します。
Codex
~/.codex/config.toml に追加します。
[mcp_servers.postlint]
command = "npx"
args = ["-y", "@conorbronsdon/postlint-mcp"]
トークンも環境変数もネットワークアクセスも不要です。パッケージが公開された後は、上記のすべての箇所で node の呼び出しを npx -y @conorbronsdon/postlint-mcp に置き換えられます。
確認
アシスタントに「この投稿を X と Bluesky 向けにチェックして」と頼み、リンクをいくつか含むテキストを貼り付けてください。
実例
これがきっかけになった X の投稿を、platform: "x" を指定して check_post でチェックします。
{
"platform": "x",
"limit": 280,
"unit": "weighted characters",
"length": 308,
"over": true,
"remaining": -28,
"drivers": [
"3 URLs counted as 23 each = 69",
"239 other characters counted as 1 each"
],
"warnings": []
}
役立つのは drivers の行です。文章を書く前に、予算の 69 がリンクに使われています。つまり、文章を削るのではなく、リンクを 2 つ返信に移すべきだと分かります。
同じ投稿を check_post_all でチェックします。
{
"fits": ["x_premium", "linkedin", "threads", "mastodon", "discord"],
"over": ["x", "bluesky"],
"rows": [
{ "platform": "x", "length": 308, "limit": 280, "over": true, "drivers": ["3 URLs counted as 23 each = 69", "239 other characters counted as 1 each"] },
{ "platform": "bluesky", "length": 330, "limit": 300, "over": true, "drivers": ["3 URLs counted in full = 91 (Bluesky does not shorten links)", "239 other graphemes"] },
{ "platform": "mastodon", "length": 308, "limit": 500, "over": false, "remaining": 192 }
]
}
同じ投稿でも、同じ 330 文字のテキストから、308、330、そして再び 308 と、3 通りの長さになります。この差こそが、これが存在する理由のすべてです。
下書き用プレースホルダー
下書きにはリンクのプレースホルダーが含まれますが、[URL] は 5 文字で、実際のリンクはそうではありません。プレースホルダーを入れた状態で計測し、リンクを埋めて投稿すると、誤った計測になります。ある下書きはこの方法で 264 と計測されましたが、投稿時には 282 でした。
そのため、[URL]、[LINK]、[YOUTUBE URL]、[SUBSTACK URL] などは、実際のリンク(通常投稿されるものの中で最短の、28 文字の YouTube 短縮リンク)と同じ長さとして計算され、結果にはカウントが下限値であることを示す警告が含まれます。
対応していないこと
- 投稿は一切行いません。 書き込み経路も、認証情報も、いかなる種類のネットワーク呼び出しもありません。最後の点は、単にそう主張しているのではなく、実際に保証しています。テストでは
fetch、XMLHttpRequest、WebSocketを例外を投げるように置き換え、すべてのツールを実行するため、後から呼び出しが追加されても、この説明に気づかないうちに反することなく、CI で失敗します。 - インスタンスの実際の上限は確認しません。 Mastodon サーバーはそれぞれ独自に上限を設定します。このツールはデフォルトの 500 を報告し、対象サーバーから
configuration.statuses.max_charactersを自分で読み取るよう案内します。 - 文字数を切り詰めません。
truncate_toヘルパーは検討されましたが、採用しませんでした。文字オフセットで投稿を切ると、URL が分断され、書記素クラスタが壊れ、文の途中で切れてしまいます。「安全な」境界で切っても、最後にあった節がどれであれ、気づかないうちに削除されます。いずれにしても、投稿の内容をツールが決めることになります。このツールは文字数を報告し、編集はユーザーに委ねます。 - プラットフォームが認識するすべての URL を検出するわけではありません。 スキーム付きリンクと
www.で始まるホストは常に一致します。ドメイン名だけの場合は、一般的な TLD(リストはsrc/count.tsにあります)のときにのみ一致します。一方、実際の twitter-text 実装は IANA の完全なレジストリを使用しています。リンクの前にhttps://を付ければ、正確にカウントできます。 - メディア、アンケート、引用投稿、リンクカードはカウントしません。 これらには独自のルールがあり、このツールはテキストを計測します。
- コンテンツ警告は考慮しません。 Mastodon では CW も同じ 500 文字に含まれます。このツールが確認するのは本文のみです。
- 根拠を確認できない上限は掲載しません。 プラットフォームの表を参照してください。
開発
npm install
npm run build
npm test
サーバーがネットワーク呼び出しを行わないため、テストもネットワーク呼び出しを行いません。上限を超えた過去の 2 つの投稿は、ZWJ ファミリー絵文字、地域指標記号の国旗、肌の色の修飾子、結合アクセント記号、CJK の書記素ケースとともに、src/__tests__/lint.test.ts の回帰テスト用フィクスチャになっています。
コントリビューション
Issue とプルリクエストを歓迎します。新しいプラットフォームの追加には、上限、計測単位、公開された情報源の 3 つが必要です。新しいカウントルールを追加する場合は、そのルールがなければ失敗するテストが必要です。第三者が繰り返し引用している数値は、情報源にはなりません。
プロジェクトについて
Conor Bronsdon が開発・保守しています。私は、AI インフラ、開発者向けツール、そして実務者がこうしたものを実際にどう使っているかを取り上げるポッドキャスト、Chain of Thought を配信しています。投稿が上限を超えないよう確認するはずのワークフローで、上限を超える投稿を 2 件公開してしまったことをきっかけに、これを作りました。
関連ツール:
- op3-mcp:OP3 を通じたポッドキャスト分析。ダウンロード数、地域、アプリ、エピソードごとの内訳を確認できます。
- podcastindex-mcp:Podcast Index の MCP サーバー。人物やトピックでの検索、トレンド番組、フィードの健全性を確認できます。
- substack-mcp:Substack の投稿を読み、下書きを管理できます。エージェントのワークフローでも安全に使えます。
- Transistor MCP:Transistor.fm の公式 MCP サーバー。エピソード、公開、分析に対応しています。
- ai-tools-for-creators:アイデアを仕事にしている人向けに、AI スキルと MCP サーバーを厳選したリストです。
詳しくは chainofthought.show および X をご覧ください。
免責事項
これは独立した個人プロジェクトであり、いかなる企業とも提携関係になく、スポンサーも受けておらず、推奨も受けていません。ここで述べる見解はすべて個人のものです。
ライセンス
Apache-2.0
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。