Substack by Cotlet について
Substack by Cotletは、Substack出版物を管理する技術者向けのセルフホスト型Python APIおよびMCPサーバーです。ログイン済みのChromeセッションを利用し、MCPに加えてRESTとPythonのインターフェースも提供します。
主な機能
- 01投稿、下書き、Notes、コメントの管理
- 02投稿とNotesの予約公開
- 03購読者と出版物の統計へのアクセス
- 04ChromeセッションCookieで接続
- 05MCP、REST API、Pythonに対応
活用シーン
- 01Markdownから下書きを作成して公開予約
- 02未返信コメントの確認
- 03購読者リストのエクスポート
- 04購読、収益、投稿状況のレポート作成
MCP 対応
stdioまたはストリーミング可能なHTTPを通じて、Substack出版物と読者の操作ツールをMCPクライアントに公開します。読み取り専用、公開、メッセージ操作のヒントにより、重要な操作前にクライアントが確認を求められます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://cotlet.dev/mcp/v1/substack/connectclaude mcp add --transport http dev-cotlet-substack https://cotlet.dev/mcp/v1/substack/connect{"mcpServers":{"dev-cotlet-substack":{"type":"http","url":"https://cotlet.dev/mcp/v1/substack/connect"}}}Cursor で開く{"servers":{"dev-cotlet-substack":{"type":"http","url":"https://cotlet.dev/mcp/v1/substack/connect"}}}VS Code で開く{"mcpServers":{"dev-cotlet-substack":{"type":"http","url":"https://cotlet.dev/mcp/v1/substack/connect"}}}{"mcpServers":{"dev-cotlet-substack":{"serverUrl":"https://cotlet.dev/mcp/v1/substack/connect"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://cotlet.dev/mcp/v1/substack/connecthttps://cotlet.dev/mcp/v1/substack認証が必要ツール
詳細
Substack API とセルフホスト可能な MCP サーバー
ご自身のパソコンで、ご自身の Google Chrome のセッションを使って Python で実行する Substack API と Substack MCP サーバー です。Cotlet の本番環境で運用している Substack ツール全50種類を利用できます。Markdown からの投稿や下書きの作成、公開と予約投稿、Notes、コメント、購読者、統計、レコメンデーション、ダイレクトメッセージに対応しています。
Substack には、投稿の作成やNotesの公開、購読者の管理を行うための公開APIも、公式MCPサーバーもありません。このリポジトリでは、その両方を利用できます。
- Claude Code、Claude Desktop、Cursor、Codex、その他のMCPクライアント向けの MCPサーバー。stdio または HTTP で接続できます。セットアップ
http://127.0.0.1:8787/api/v1/substackの REST API。OpenAPI ドキュメントは/docsで確認できます。セットアップ- Python:
call("list_posts", status="draft")と、すぐに実行できる14個のスクリプトをexamples/に用意しています。
ご自身で実行したい技術者向けです。非商用利用に限ります(ライセンス)。サーバー上で24時間365日稼働させたい場合、Substack のサイト変更後も動作するようにしたい場合、チームやビジネスで利用したい場合は、cotlet.dev のホステッド版をご利用ください。
git clone https://github.com/cotletdev/substack-api-mcp-server.git && cd substack-api-mcp-server
python3 -m venv .venv && . .venv/bin/activate && pip install -e .
substack-mcp connect # reads your Substack session from Chrome
substack-mcp call list_posts
claude mcp add substack -- "$PWD/.venv/bin/substack-mcp" mcp
目次
- 仕組み
- 要件
- インストール
- Chrome を接続する
- MCP サーバー
- REST API
- Python とサンプルスクリプト
- 全50種類のツール
- 設定
- セキュリティと Substack アカウント
- エラー
- セルフホスト版とホステッド版
- よくある質問
- ライセンス
仕組み
AI agent (MCP) / script (REST, Python) ──▶ substack-mcp on your computer ──your Substack cookies──▶ substack.com
▲
substack-mcp connect ───────┘ reads them once from your Chrome (DevTools Protocol)
- いつもどおり、ご自身の Chrome で Substack にサインインします。
substack-mcp connectは Chrome DevTools Protocol 経由でその Chrome に接続し、substack.com の Cookie を読み取って~/.config/substack-api-mcp/session.jsonに保存します。このファイルはご自身のユーザーのみが読み取れます。Substack はメールで送られるコードまたはリンクでサインインするため、確認や保存が必要なパスワードはありません。- すべてのツール呼び出しは、Chrome の TLS フィンガープリントをコピーする curl_cffi を使い、Cookie を添えて Substack 独自のウェブアプリのエンドポイント(読者側は
substack.com/api/v1、出版物のダッシュボードはyourname.substack.com/api/v1)にリクエストを送信します。ヘッドレスブラウザーは実行されません。
Substack のセッション Cookie(substack.sid)の有効期間は約3か月です。Substack からサインアウトされた場合、リモートデバッグが有効な状態で Chrome が開いていれば、サーバーは Chrome から Cookie を再度読み取ります。
要件
- Python 3.11 以降。
- Substack にサインインした Google Chrome 144 以降。任意の Chrome または Chromium が、デバッグポートを使って動作します。
- macOS、Linux、または Windows。
- Substack アカウント。パブリッシャーツール(投稿、購読者、統計、コメント)は、アカウントで管理者、オーナー、編集者、または寄稿者として運用している最初の出版物で動作します。リーダーツール(フィード、検索、Notes、メッセージ)は、どのアカウントでも動作します。
インストール
git clone https://github.com/cotletdev/substack-api-mcp-server.git
cd substack-api-mcp-server
python3 -m venv .venv
. .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
substack-mcp --version
uv を使う場合:uv venv && uv pip install -e . を実行してから、uv run substack-mcp ... を実行してください。
AI エージェント(Claude Code、Codex、Cursor)を使ってセットアップしますか?このフォルダーを開いて、リポジトリをセットアップするよう依頼してください。AGENTS.md に各手順が記載されており、Chrome での操作が必要な手順だけを案内します。
更新するには、git pull && pip install -e . を実行してください。ホステッド版の Substack ツールに加えられた変更はすべて、このリポジトリにも反映されます。
Chrome を接続する
オプション A:普段使いの Chrome(推奨)
-
Chrome で
chrome://inspect/#remote-debuggingを開き、remote debugging をオンにします。Chrome は、このコンピューター上のプログラムからの DevTools 接続を受け付けるようになり、接続のたびに確認を求めます。 -
substack.com にサインインしていることを確認します。
-
次を実行します。
substack-mcp connect -
Chrome が接続を許可するか確認します。Allow をクリックします。
Saved 19 Substack cookies to /Users/you/.config/substack-api-mcp/session.json
Signed in to Substack as Maya Chen (@mayachen)
その後、remote debugging をオフに戻すことができます。Substack からサインアウトしたあと、サーバーが新しいセッションを自動的に取得できるようにする場合は、オンのままにしてください。
connect は、デフォルトのプロファイルフォルダーにある Chrome の DevToolsActivePort ファイルを探します。Chrome Beta、Canary、またはカスタムのプロファイルフォルダーを使う場合は、--profile-dir "<folder>" を指定してください。
オプション B:デバッグポートを使う Chrome
Chrome はデフォルトのプロファイルではデバッグポートを開かないため、別のプロファイルを起動して、そこで一度 Substack にサインインしてから接続します。
# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-substack"
# Linux
google-chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-substack"
# Windows
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="%USERPROFILE%\.chrome-substack"
substack-mcp connect --cdp http://127.0.0.1:9222
--cdp には ws:// の DevTools URL も指定できます。たとえば、SSH トンネル経由で接続した別のマシン上の Chrome の URL を指定できます。
オプション C:Cookie を手動で貼り付ける
Chrome のないサーバーの場合:Chrome で substack.com の DevTools を開き、Application > Cookies > https://substack.com に移動して、substack.sid の値をコピーし、次を実行します。
substack-mcp connect --token # paste it, input is hidden
# or, without a session file:
export SUBSTACK_AUTH_TOKEN=...
貼り付けたトークンは自動更新されません。Substack からサインアウトしたら、新しいトークンを貼り付けてください。
セッションはいつでも次の方法で確認できます。
substack-mcp status
MCP サーバー
MCP サーバーには、すべてのツールが入力スキーマ、エージェント向けの説明、ヒントとともに一覧表示されます。読み取りツールには読み取り専用のマークが付けられ、公開、メッセージ送信、削除を行うツールには、実行前にクライアントが確認を求めるようマークが付けられます。
Claude Code
claude mcp add substack -- /path/to/substack-api-mcp-server/.venv/bin/substack-mcp mcp
# read only:
claude mcp add substack -- /path/to/substack-api-mcp-server/.venv/bin/substack-mcp mcp --read-only
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または %APPDATA%\Claude\claude_desktop_config.json(Windows):
{
"mcpServers": {
"substack": {
"command": "/path/to/substack-api-mcp-server/.venv/bin/substack-mcp",
"args": ["mcp"]
}
}
}
Cursor
~/.cursor/mcp.json。Claude Desktop と同じブロックです。すぐに使えるコピーは mcp.json にあります。
Codex
~/.codex/config.toml:
[mcp_servers.substack]
command = "/path/to/substack-api-mcp-server/.venv/bin/substack-mcp"
args = ["mcp"]
HTTP 経由
substack-mcp serve は、URL を指定するクライアント向けに、http://127.0.0.1:8787/mcp でストリーミング可能な HTTP 経由の MCP も提供します。
substack-mcp serve
claude mcp add --transport http substack http://127.0.0.1:8787/mcp
その後、エージェントに次のような依頼ができます。
essay.md を全員向けの下書きにして、火曜日のニューヨーク時間 8:00 に公開するよう予約してください。公開されたら、その投稿へのリンクカード付きの Note を投稿してください。
直近 3 件の投稿に寄せられたコメントのうち、まだ返信していないものを見つけ、それぞれに短い返信の下書きを作成してください。
先週の数値を教えてください:新規購読者と有料購読者、解約、収益、各投稿の開封数。
過去 30 日間で、読者はどこから来ましたか?
REST API
substack-mcp serve # http://127.0.0.1:8787, MCP at /mcp, docs at /docs
各ツールには /api/v1/substack 配下に固有のルートがあり、cotlet.dev のホスト型 API と同じパスを使うため、どちらか一方を対象に書いたコードをもう一方でも動かせます。パスの各部分とクエリ文字列が引数となり、JSON ボディで残りの引数を渡します。
curl 'http://127.0.0.1:8787/api/v1/substack/posts?status=scheduled'
curl 'http://127.0.0.1:8787/api/v1/substack/stats?period=30d'
curl -X POST http://127.0.0.1:8787/api/v1/substack/drafts \
-H 'Content-Type: application/json' \
-d '{"title": "Notes on pricing", "body_markdown": "## Why I raised prices\n\nThree reasons..."}'
名前でツールを指定し、ボディを引数として渡します。
curl -X POST http://127.0.0.1:8787/api/v1/substack/tools/list_comments -d '{"post_id": "148213977"}'
GET /api/v1/substack/tools:ルート、入力スキーマ、回答例を含むすべてのツール。GET /docs:インタラクティブな OpenAPI ドキュメントです。GET /openapi.jsonは、n8n、Postman、または生成クライアント向けのスキーマです。- 回答は JSON 形式です。リストには
next_cursorが返されます。次のページを取得するには、これをcursorとして渡してください。
サーバーは 127.0.0.1 のみで待ち受けます。自分の別のデバイスからアクセスするには、トークンを設定してください。以後、すべてのリクエストに Authorization: Bearer <token> が必要になります。
SUBSTACK_MCP_TOKEN=$(openssl rand -hex 24) substack-mcp serve --host 0.0.0.0
Python とサンプルスクリプト
Python から直接実行でき、サーバーは不要です。
from substack_api_mcp import call
from substack_api_mcp.scripting import paginate, write_rows
posts = list(paginate("list_posts", {"status": "published"}, "posts"))
write_rows(posts, "posts.csv")
draft = call("create_draft", title="Notes on pricing", body_markdown="Three reasons...")
call("schedule_post", post_id=draft["post_id"], publish_at="2026-11-03T08:00:00-05:00")
または、シェルから 1 つのツールを実行します:substack-mcp call get_post_stats post_id=148213977。JSON オブジェクトを指定することもできます。
すぐに使えるスクリプトは examples/ にあります。各スクリプトは JSON を出力し、用途に応じて --out file.csv または --out file.json を受け付けます。また、--help も利用できます。
| スクリプト | 機能 |
|---|---|
draft_from_markdown.py | .md ファイルから下書きを作成します。最初の見出しがタイトルになり、見出し、リンク、リストはそのまま保持されます。--publish-at で公開日時を予約できます。 |
schedule_post.py | 下書きを指定時刻に予約公開します。--cancel を指定すると予約を取り消して下書きに戻します。 |
publish_note.py | Note を今すぐ、または指定時刻に公開します。--link-latest を指定すると、最新の投稿へのリンクカードを追加します。 |
list_posts.py | 公開済み、下書き、予約済みの投稿について、タイトル、対象読者、日付、URL を表示します。 |
get_post.py | 1 件の投稿を Markdown ファイルとして保存します。 |
weekly_report.py | 新規購読者と有料購読者、解約、収益、および各新規投稿の開封数と新規購読者数を表示します。 |
post_stats.py | 直近 N 件の投稿について、開封数、開封率、閲覧数、いいね数、再投稿数、新規購読者数を表示します。 |
daily_stats.py | 購読者、有料購読者、フォロワー、閲覧数を日ごとに表示します。 |
traffic_sources.py | 訪問者の流入元を、閲覧数の多い順に表示します。 |
unanswered_comments.py | 直近 N 件の投稿に寄せられた、まだ返信していないコメントを表示します。 |
reply_to_comment.py | 1 件のコメントに返信します。 |
list_subscribers.py | プランまたは登録日で購読者を表示し、アクティビティ評価も表示します。 |
export_subscribers.py | ダッシュボードのエクスポート機能で出力されるものと同じ形式で、全リストを CSV として出力します。 |
add_subscribers.py | テキストファイルまたは CSV ファイルのメールアドレスを、確認後に無料購読者として追加します。 |
python examples/draft_from_markdown.py essay.md --publish-at 2026-11-03T08:00:00-05:00
python examples/unanswered_comments.py --last 3 --out todo.csv
定期実行する場合、コンピューターの電源が入っていれば、ローカルの cron を利用できます:0 8 * * 1 cd ~/substack-api-mcp-server && .venv/bin/python examples/weekly_report.py。
全 50 ツール
post_id は list_posts から、comment_id は list_comments から取得します。substack-mcp tools はこの一覧を出力し、substack-mcp tools --json は入力スキーマも追加します。
投稿と下書き
| ツール | アクセス | REST ルート | 機能 |
|---|---|---|---|
list_posts | 読み取り | GET /posts | パブリケーションの投稿を新しい順に、ステータスと対象読者とともに表示します。 |
get_post | 読み取り | GET /posts/{post_id} | 投稿の全情報:タイトル、サブタイトル、Markdown 形式の本文、対象読者、URL、日付。 |
create_draft | 書き込み | POST /drafts | Markdown から新しい下書きを作成します。公開または予約するまで送信されません。 |
update_draft | 書き込み | PATCH /drafts/{post_id} | 下書きのタイトル、サブタイトル、本文、対象読者を変更します。 |
duplicate_post | 書き込み | POST /posts/{post_id}/duplicate | 任意の投稿を新しい下書きにコピーします。 |
delete_post | 書き込み | DELETE /posts/{post_id} | 下書き、予約済み、または公開済みの投稿をコメントとともに削除します。 |
公開
| ツール | アクセス | REST ルート | 機能 |
|---|---|---|---|
publish_post | 書き込み | POST /posts/{post_id}/publish | 下書きを今すぐ公開します。 |
schedule_post | 書き込み | PUT /posts/{post_id}/schedule | 下書きを指定時刻に、ウェブとメールで公開します。 |
cancel_scheduled_post | 書き込み | DELETE /posts/{post_id}/schedule | 予約済み投稿の公開を取り消します。投稿は下書きとして残ります。 |
unpublish_post | 書き込み | DELETE /posts/{post_id}/publish | 公開済みの投稿をウェブから取り下げ、下書きに戻します。 |
セクションと投稿タグ
| ツール | アクセス | REST ルート | 内容 |
|---|---|---|---|
list_sections | 読み取り | GET /sections | あなたの出版物のセクション。出版物内の個別のニュースレターです。 |
list_post_tags | 読み取り | GET /post-tags | 投稿を分類するために出版物で使用しているタグです。 |
create_post_tag | 書き込み | POST /post-tags | 投稿を分類するための新しいタグです。 |
tag_post | 書き込み | PUT /posts/{post_id}/tags/{tag_id} | 投稿にタグを追加、または削除します。 |
コメント
| ツール | アクセス | REST ルート | 内容 |
|---|---|---|---|
list_comments | 読み取り | GET /posts/{post_id}/comments | 投稿へのコメントです。投稿者、本文、返信済みかどうかを確認できます。 |
reply_to_comment | 書き込み | POST /comments/{comment_id}/replies | あなたの投稿に付いたコメントに、あなたとして返信します。 |
pin_comment | 書き込み | PUT /comments/{comment_id}/pin | 投稿のコメント欄の先頭にコメントを固定、または固定を解除します。 |
like_comment | 書き込み | PUT /comments/{comment_id}/like | あなたとしてコメントまたはノートに「いいね」する、または取り消します。 |
remove_comment | 書き込み | POST /comments/{comment_id}/remove | 出版物のモデレーターとして、投稿に付いた他のユーザーのコメントを削除します。 |
delete_comment | 書き込み | DELETE /comments/{comment_id} | 自分のコメント、ノート、またはノートへの返信を削除します。 |
ノート
| ツール | アクセス | REST ルート | 内容 |
|---|---|---|---|
list_notes | 読み取り | GET /notes | あなたまたは他の Substack ユーザーが投稿したノートです。新しい順に、「いいね」と返信も確認できます。 |
list_note_replies | 読み取り | GET /notes/{note_id}/replies | ノートへの返信です。投稿者、本文、「いいね」を確認できます。 |
publish_note | 書き込み | POST /notes | Substack Notes に短い投稿を今すぐ、または指定時刻に公開します。任意で、自分の投稿へのリンクカードを付けられます。 |
reply_to_note | 書き込み | POST /notes/{note_id}/replies | 任意のノートまたはノートへの返信に、あなたとして返信します。 |
購読者
| ツール | アクセス | REST ルート | 内容 |
|---|---|---|---|
list_subscribers | 読み取り | GET /subscribers | プラン、開始日、アクティビティ評価を含む購読者の一覧です。 |
add_subscriber | 書き込み | POST /subscribers | メールアドレスを1件、無料購読者としてリストに追加します。 |
remove_subscriber | 書き込み | DELETE /subscribers/{email} | 購読者リストからメールアドレスを1件削除します。 |
export_subscribers | 読み取り | GET /subscribers/export | 購読者の全リストをCSV形式のダウンロードリンクと行数で取得します。 |
list_subscriber_tags | 読み取り | GET /subscriber-tags | 購読者を分類するために使用しているタグです。 |
create_subscriber_tag | 書き込み | POST /subscriber-tags | 購読者を分類するための新しい非公開タグです。 |
tag_subscribers | 書き込み | POST /subscriber-tags/{tag_id}/subscribers | メールアドレスを指定して購読者にタグを付ける、または削除します。 |
統計
| ツール | アクセス | REST ルート | 内容 |
|---|---|---|---|
get_publication_stats | 読み取り | GET /stats | 期間ごとの購読者総数、有料購読者数、新規購読者数、有料購読の解約数、推定収益です。 |
get_daily_stats | 読み取り | GET /stats/daily | 日ごとの購読者総数、有料購読者数、フォロワー数、閲覧数です。 |
get_audience_insights | 読み取り | GET /audience | 購読者の居住地と、読者を共有している出版物です。 |
list_traffic_sources | 読み取り | GET /traffic-sources | 期間中に出版物の訪問者がどこから来たかを、閲覧数の多い順に表示します。 |
get_post_stats | 読み取り | GET /posts/{post_id}/stats | 受信者数、開封数、開封率、閲覧数、「いいね」数、再共有数、獲得した購読者数です。 |
get_post_traffic | 読み取り | GET /posts/{post_id}/traffic | 投稿の読者がどこから来たかを、流入元、カテゴリ、デバイス別に表示します。 |
get_post_engagement | 読み取り | GET /posts/{post_id}/engagement | 投稿に「いいね」やコメントをした人と、獲得・失った購読者です。 |
おすすめ
| ツール | アクセス | REST ルート | 機能 |
|---|---|---|---|
list_recommendations | 読み取り | GET /recommendations | あなたがおすすめしている、またはあなたをおすすめしている出版物と、それぞれが送った購読者を一覧表示します。 |
recommend_publication | 書き込み | PUT /recommendations/{publication_id} | 別の出版物を読者におすすめする、またはおすすめを停止します。 |
リーダー、フィード、メッセージ
| ツール | アクセス | REST ルート | 機能 |
|---|---|---|---|
get_feed | 読み取り | GET /feed | Substack のホームフィードです。「あなた向け」または「フォロー中」の投稿と Notes を表示します。 |
search_substack | 読み取り | GET /search | Substack 全体からユーザー、投稿、Notes を検索します。 |
list_activity | 読み取り | GET /activity | Substack の通知です。返信、いいね、新しいフォロワー、リストックを新しい順に表示します。 |
get_unread_counts | 読み取り | GET /unread-counts | 未読のダイレクトメッセージ、メッセージリクエスト、アクティビティ通知の件数を確認します。 |
list_conversations | 読み取り | GET /conversations | ダイレクトメッセージの会話を最新順に、最後のメッセージとともに表示します。 |
get_conversation | 読み取り | GET /conversations/{conversation_id} | 1 件のダイレクトメッセージの会話における最新のメッセージを、古い順に表示します。 |
send_message | 書き込み | POST /messages | Substack で、会話内または相手を指定してダイレクトメッセージを送信します。 |
follow_user | 書き込み | PUT /users/{user}/follow | Substack ユーザーをフォローまたはフォロー解除し、そのユーザーの Notes がフィードに表示されるようにします。 |
like_post | 書き込み | PUT /posts/{post_id}/like | あなたとして、Substack の投稿にいいねまたはいいね解除します。 |
list_subscriptions | 読み取り | GET /subscriptions | 購読している出版物を、プランとメールが届いているかどうかとともに一覧表示します。 |
意図的に実装していないもの:Substack へのサインイン、メール、プロフィール、アカウント設定、出版物のアドレスや所有権、および金銭が動くあらゆる機能(有料プラン、支払い、無料購読の提供)。すべてのリクエストはガードを通過し、これらの Substack パスへの書き込みは拒否されます。
設定
| 変数 | デフォルト | 機能 |
|---|---|---|
SUBSTACK_MCP_HOME | ~/.config/substack-api-mcp | session.json の保存フォルダーです。 |
SUBSTACK_AUTH_TOKEN | substack-mcp connect の代わりに使う、Substack の substack.sid Cookie です。 | |
SUBSTACK_PROXY | Substack へのすべてのリクエストに使うプロキシです。例:http://user:pass@host:port。 | |
SUBSTACK_MCP_READ_ONLY | 1 にすると、Substack に変更を加えるすべてのツールを非表示にし、実行を拒否します(--read-only と同じです)。 | |
SUBSTACK_MCP_TOKEN | serve が必要とするベアラートークンです。127.0.0.1 以外でリッスンする場合に必要です。 | |
SUBSTACK_MCP_HOST, SUBSTACK_MCP_PORT | 127.0.0.1, 8787 | serve のアドレスです。 |
セキュリティと Substack アカウント
- パスワードはどこにも保存しません。 Substack では、メールで届くコードを使ってサインインします。読み取るのは Cookie のみで、substack.com の Cookie に限られます。
- セッションファイルはあなた自身のものです。
session.jsonはモード 0600 で作成されます。このファイルを持つ人は Substack であなたとして操作できるため、git や共有フォルダーに置かないでください。 - デフォルトではローカルで動作します。
serveは127.0.0.1にバインドし、SUBSTACK_MCP_TOKENが設定されていない場合は別のアドレスへのバインドを拒否します。 - substack.com のみを対象とします。 substack.com およびそのサブドメイン以外へのリクエストとリダイレクトは拒否されます。
- 読み取り専用モードです。
--read-onlyまたはSUBSTACK_MCP_READ_ONLY=1を指定すると、読み取りツール 25 個のみが公開されます。 - 操作は実在する人に届きます。 公開済みまたは予約済みの投稿は購読者にメールで送信され、Notes、コメント、返信、DM はあなたの名前で送信されます。MCP クライアントは実行前に確認を求めますが、スクリプトは確認しないため、まずテスト用の出版物で試してください。
- 追加するのは、登録を希望した人だけにしてください。
add_subscriberは Substack の歓迎メールを送信します。登録していない人をインポートすると、Substack のルールに違反します。
エラー
REST API は {"error": "<code>", "message": "..."} を返します。MCP サーバーは同じコードとメッセージをツールエラーとして返します。
| ステータス | コード | 対処方法 |
|---|---|---|
| 401 | auth_required, auth_expired | セッションがない、Substack からサインアウトされた、または機密性の高い操作(購読者リストなど)の前に再度サインインするよう求められています。Chrome で substack.com からサインアウトして再度サインインし、substack-mcp connect を実行してください。 |
| 403 | app_permission_denied | パブリケーションでのあなたの役割では、この操作を実行できません。 |
| 403 | scope_denied | サーバーが読み取り専用で実行されているか、この呼び出しによってアカウント設定が変更されます。 |
| 403 | target_blocked | Substack がリクエストを拒否したか、ボット確認を表示しました。Chrome で substack.com を一度開いてから、再試行してください。 |
| 409 | captcha_required | Substack が CAPTCHA を求めています。Chrome で解決してください。 |
| 422 | invalid_input | 引数が不足しているか正しくありません。メッセージに該当する引数が示されています。 |
| 429 | rate_limited | Substack がアカウントの利用を制限しています。数分待ってください。 |
| 502 | target_error | Substack がエラーを返したか、サイトが変更されました。最新のツールを入手するには git pull を実行するか、issue を作成してください。 |
セルフホストまたはホスト版
| このリポジトリ | Cotlet、ホスト版 | |
|---|---|---|
| ツール | 同じ 50 個 | 同じ 50 個 |
| 実行場所 | 電源が入っている間、お使いのコンピューター上 | クラウド上、24 時間 365 日 |
| Substack セッション | お使いの Chrome、ローカルファイルに保存された Cookie | EU 内のお客様専用 Cloud Browser、AES-256-GCM で暗号化されたプロファイル |
| Substack のサイトが変更された場合 | 修正後に一度 git pull | お客様に代わって修正。すべてのツールを毎日テスト |
| 承認 | MCP クライアントが呼び出しごとに確認 | 投稿、Notes、返信、DM はお客様の承認待ちになります。ツールごとに切り替え可能 |
| 対応対象 | お使いのマシン上の MCP クライアント、ローカルスクリプト | Claude.ai と ChatGPT のコネクター、n8n、Make、Zapier、任意の HTTP クライアント |
| 利用できるユーザー | 非営利目的で利用する個人 | チーム、企業、代理店 |
| 価格 | 無料 | 2,000 クレジット付きの無料 7 日間トライアル(カード不要)。その後は 5,000 クレジットで $29 からの一回限りのパック |
ホスト版では、成功した呼び出しは 20~30 クレジット(ほとんどのツールで 25 クレジット)を使用し、失敗した呼び出しは無料です。また、Cloud Browser でエージェント向けのアプリを有効にしている間は、1 日あたり 50 クレジットを使用します。料金の詳細。
FAQ
Substack に公式 API はありますか? 限定的なもののみです(2026 年 10 月 11 日時点で確認)。Developer API は、承認後に公開クリエイタープロフィールを検索できますが、投稿や Notes の作成、購読者の管理、メールの送信に使える公開 API はありません。RSS で読み込めるのは公開投稿のみです。詳細と情報源:cotlet.dev/integrations/substack-api-mcp-server。
Claude、ChatGPT、Cursor 向けの Substack MCP サーバーはありますか?
はい。このサーバーはお使いのマシン上で動作します。Claude Code、Claude Desktop、Cursor、Codex では substack-mcp mcp を実行します。ChatGPT と Claude.ai のコネクターには公開 HTTPS URL が必要です。ホスト型 Substack MCP サーバーを使うと、その URL を利用できます。
Markdown から Substack の投稿を予約できますか?
はい。python examples/draft_from_markdown.py essay.md --publish-at 2026-11-03T08:00:00-05:00 を実行します。Substack のエディターは Markdown をインポートしません。このスクリプトは、見出し、太字、リンク、リスト、コードブロックを含むファイルを下書きとして送信し、投稿を予約します。画像には公開 URL が必要です。
投稿だけでなく Notes も予約できますか?
はい。publish_note は publish_at の日時を受け取り、指定した日時まで Note は予約済み Notes に保管されます。リンクカードを作成するには、公開済みの投稿が必要です。
Substack の購読者を CSV にエクスポートできますか?
はい。python examples/export_subscribers.py --out subscribers.csv を実行すると、購読者ダッシュボードの「エクスポート」と同じ CSV が作成されます。list_subscribers.py --plan paid または --since 2026-10-01 を使うと、プラン、登録日、アクティビティ評価を含む絞り込み済みリストを取得できます。
投稿を Markdown としてエクスポートできますか?
はい。examples/get_post.py --post-id <id> --out post.md を使うと、ペイウォールで非公開になっている部分や、自分の出版物の下書きも含め、投稿を 1 件ずつエクスポートできます。ID は list_posts.py で確認できます。
これは Substack スクレイパーですか? スクレイパーに期待されること(投稿、購読者、統計のエクスポート)はできますが、ヘッドレスブラウザーで HTML を解析することはありません。Substack のウェブアプリと同じ JSON エンドポイントを、自分のアカウントと出版物で呼び出します。
なぜ Chrome が必要なのですか? Substack のセッションを読み取るためです。Substack ではメールで送られるコードを使ってサインインするため、そもそも渡すパスワードはありません。Chrome を使うのはサインインごとに 1 回だけで、呼び出しのたびには使いません。
Substack からサインアウトされた場合はどうなりますか?
呼び出しは auth_expired で失敗します。Chrome のリモートデバッグが有効になっていれば、次の呼び出しでサーバーが新しい Cookie を読み取ります(Chrome に確認されたら「許可」をクリックしてください)。それ以外の場合は、再度 substack-mcp connect を実行します。有効なセッションでも、購読者リストの取得時に再サインインを求められることがあります。その場合は substack.com でサインアウトしてから再度サインインし、connect を実行してください。
有料の Substack プランが必要ですか? いいえ。収益、有料購読者、解約に関する機能は、有料購読を提供している出版物でのみ利用できます。
すべての購読者にメールを送信できますか? エディターと同じ方法で、投稿の公開または予約を通じてのみ送信できます。Substack が投稿のメールを送るのは 1 回だけです。送信後の編集はウェブとアプリに反映されます。
VPS や Docker で実行できますか?
技術的には可能で、SUBSTACK_AUTH_TOKEN を使います。その場合、Substack にはデータセンターの IP アドレスからセッションにアクセスしているように見えるため、本人からのアクセスには見えにくくなります。常時稼働の構成には、ホスト型バージョンを使うと、固定 IP の自分専用 Cloud Browser にセッションを保持できます。
Substack アカウントが停止されることはありますか? リクエストには Chrome のフィンガープリントが付与され、ユーザーがクリックするように 1 件ずつ送信されます。プラットフォームが決して措置を取らないと保証することはできません。通常の使い方を守り、大量のユーザーを追加したりメッセージを送信したりしないでください。
仕事やクライアント向けに使えますか? いいえ。ライセンスで認められているのは非商用利用のみです。チーム、企業、クライアントの業務には Cotlet を利用するか、[email protected] までお問い合わせください。
オープンソースですか? ソースコードは公開されていますが、ライセンスはオープンソースライセンスではありません。非商用利用のみで、業務での利用はできません。
ツールが動かない、または別のツールが必要です。 ツール名とエラーメッセージを添えて、イシューを作成してください。
ライセンス
PolyForm Noncommercial License 1.0.0。要約すると、以下のとおりです。
- 許可されること: 非営利目的での使用。ご自身の Substack アカウントを使った個人的な目的での使用、または慈善団体、学校、公的研究機関、政府機関による使用が該当します。コードの変更、および同じライセンスでの共有も許可されます。
- 許可されないこと: ご自身の事業を含む、あらゆる商用利用。クライアント向けの業務。このプロジェクトや、これを基にしたサービスの販売または提供。
このリポジトリの以前のバージョン(ホスト型 API 用のスクリプト、コミット 4399e88 まで)は、引き続き MIT ライセンスです。
Cotlet(@cotletdev)が保守しています。Substack はその所有者の商標です。このプロジェクトは非公式であり、Substack とは提携関係になく、承認や支援も受けていません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。