Skip to main content
Glama

substack-mcp

Сервер протокола контекста модели (MCP) для Substack. Позволяет Claude Code создавать черновики, загружать изображения, устанавливать обложки, планировать и публиковать посты в вашей публикации Substack.

Построено на базе python-substack. Использует внутренний API Substack (публичного API для публикации не существует). Не является аффилированным лицом Substack Inc.

Инструменты

Обязательные

  • create_draft(title, content_markdown, subtitle?, audience?) — Создать новый черновик из Markdown.

  • update_draft(post_id, title?, subtitle?, content_markdown?, audience?) — Редактировать существующий черновик.

  • upload_image(image_path) — Загрузить локальный файл или удаленный URL в CDN Substack, возвращая URL.

  • publish_draft(post_id, send_email?, share_automatically?) — Опубликовать немедленно. send_email переключает отправку по электронной почте.

Рекомендуемые

  • schedule_draft(post_id, iso_datetime) — Запланировать публикацию на будущую дату/время (ISO 8601).

  • unschedule_draft(post_id) — Отменить запланированную публикацию.

  • set_cover_image(post_id, image_url) — Установить обложку (из URL upload_image).

Вспомогательные

  • list_drafts(limit?) — Список недавних черновиков.

  • get_draft(post_id) — Получить полное содержимое черновика.

  • delete_draft(post_id) — Безвозвратное удаление.

Related MCP server: Substack MCP Server

Настройка

# 1. Install dependencies
uv pip install -e .

# 2. Make sure you're logged in to Substack in Chrome (or Brave/Edge) — that's it.

# 3. Save credentials — auto-detects your existing browser session
substack-mcp-setup

# 4. Register with Claude Code
claude mcp add substack-mcp --scope user -- /Users/$USER/substack/.venv/bin/substack-mcp

Перезапустите Claude Code, после чего /mcp должен показать substack-mcp как connected.

Как работает аутентификация

По умолчанию substack-mcp-setup считывает cookie substack.sid напрямую из вашего существующего сеанса Chrome через pycookiecheat. Substack не может определить, что что-то было автоматизировано, потому что ничего не было: это тот же сеанс, который вы уже используете.

macOS один раз запросит доступ к связке ключей ("Chrome Safe Storage"). Нажмите "Всегда разрешать" ("Always Allow"), чтобы он не спрашивал снова в следующий раз.

Поддерживаются: Chrome, Brave, Edge, Chromium, Vivaldi, Opera.

Резервные режимы

# Specific browser
substack-mcp-setup --from-browser brave

# Playwright-based (often blocked by Substack — use --chrome instead)
substack-mcp-setup --browser

# Manual paste from DevTools
substack-mcp-setup --manual

Токены хранятся в ~/Library/Application Support/substack-mcp/config.json с правами доступа 0600.

Безопасность

Cookie substack.sid эквивалентен паролю — любой, у кого он есть, имеет полный доступ к учетной записи (публикация постов, редактирование биллинга и т. д.). Относитесь к нему соответствующим образом.

Где хранится токен

  • macOS: ~/Library/Application Support/substack-mcp/config.json (режим 0600)

  • Linux: ~/.config/substack-mcp/config.json (режим 0600)

  • Или через переменные окружения: SUBSTACK_PUBLICATION_URL + SUBSTACK_SESSION_TOKEN (переменные окружения наследуются дочерними процессами — будьте осторожны при порождении подпроцессов)

.gitignore исключает config.json; никогда не добавляйте его в коммит. MCP также записывает временный файл cookie через tempfile.mkstemp (режим 0600) и удаляет его в блоке finally — см. auth.py:write_cookie_file.

Если токен скомпрометирован

  1. Выйдите из всех сеансов: Substack → Настройки → Безопасность → "Выйти из всех сеансов". Это немедленно аннулирует каждый существующий substack.sid.

  2. Снова войдите в Substack в своем браузере.

  3. Запустите substack-mcp-setup повторно, чтобы захватить новый cookie.

Безопасность загрузки изображений

upload_image принимает только:

  • HTTP(S) URL-адреса, или

  • Локальные файлы с расширениями изображений (.png, .jpg, .jpeg, .gif, .webp, .heic, .heif), которые не находятся в чувствительных системных путях (/etc, /System, ~/.ssh, ~/.aws, ~/Library/Keychains и т. д.)

Это защищает от того, чтобы помощника обманом (через инъекцию промпта в полученном контенте) заставили загрузить, например, закрытый ключ SSH в CDN Substack.

Известное ограничение: Markdown-синтаксис изображений ![alt](path) внутри create_draft обрабатывается python-substack и обходит эту проверку. Если вы передаете ненадежный Markdown, сначала очистите пути к изображениям.

Зависимости

Версии закреплены с помощью ~= (совместимый релиз, без мажорных обновлений). Обновление python-substack, в частности, должно проверяться — он взаимодействует с приватным API Substack и находится вне официальной поверхности Substack.

Примечания

  • audience принимает: everyone (по умолчанию), only_paid, founding, only_free.

  • Markdown-синтаксис изображений ![alt](path/or/url) автоматически загружает локальные файлы при вызове create_draft.

  • Обложка (устанавливаемая через set_cover_image) — это то, что отображается на главной странице вашей публикации и в социальных сетях. Если вы не установите ее явно, Substack обычно использует первое изображение в теле поста.

Available Tools

11 tools
create_draftA

Create a new Substack draft post from Markdown.

Args: title: Post title (max 280 chars). content_markdown: Body in Markdown. Supports headings, bold/italic, links, bullet lists, blockquotes, code blocks, and images (alt - local paths are auto-uploaded to Substack CDN). subtitle: Optional subtitle (max 280 chars). audience: Who can read it: 'everyone' (default), 'only_paid', 'founding', or 'only_free'.

Returns: Summary including post_id, title, edit_url.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
content_markdownYes
subtitleNo
audienceNoeveryone

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses important behavior: auto-uploading local image paths to Substack CDN. However, it omits permissions, reversibility, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with Args and Returns, and each sentence provides value. It is somewhat lengthy but not verbose; front-loaded purpose and parameter details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description covers purpose, parameters with constraints, and return summary. It lacks some behavioral details like authentication needs, but is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It adds max char limits for 'title' and 'subtitle', allowed values for 'audience', and explains Markdown support and image handling for 'content_markdown'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Create a new Substack draft post from Markdown,' making the verb and resource clear. It differentiates from sibling tools like 'delete_draft' and 'publish_draft' by focusing on creation from Markdown.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool does but does not explicitly say when to use it versus alternatives like 'update_draft' or 'schedule_draft.' It provides no exclusions or context for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_draftA

Permanently delete a draft. This cannot be undone.

Args: post_id: Draft ID.

Returns: {post_id, deleted: true}

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description notes the operation is permanent and cannot be undone, and states the return format. However, it lacks details on side effects, authorization needs, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: two sentences plus an Args/Returns block. No fluff, immediately conveys the action and key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete operation with one parameter and no output schema, the description adequately covers purpose, effect, parameter, and return. It is nearly complete, though missing error handling or precondition details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds 'Draft ID' for post_id, but provides no further context like where to find the ID or expected format. Minimal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it permanently deletes a draft, with a strong verb ('delete') and specific resource ('draft'). Among siblings like create_draft, get_draft, list_drafts, etc., it is uniquely identified.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like unschedule_draft or update_draft. The description does not mention prerequisites or scenarios where deletion is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_draftA

Get full details of a specific draft, including the body content.

Args: post_id: Draft ID.

Returns: Full draft data including draft_body (ProseMirror JSON).

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries burden. It mentions the return includes 'full draft data including draft_body (ProseMirror JSON),' which is helpful. However, it doesn't disclose error handling (e.g., if draft not found) or permissions needed, leaving some gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise with clear sections (Args, Returns). Each sentence adds value, no redundancy. Front-loaded purpose, followed by parameter and return details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description partially explains returns ('full draft data including draft_body') but lacks specifics on other fields or structure. For a simple get operation, it's adequate but not exhaustive. No annotations to supplement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has one required param (post_id) with no description. Description adds 'post_id: Draft ID,' which is minimal and largely restates the schema title. With 0% schema coverage, description should provide more context (e.g., format, constraints).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Get full details of a specific draft, including the body content.' This specifies a read operation for a single draft, distinguishing it from siblings like list_drafts (multiple) and create_draft/update_draft.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description implies use for retrieving a single draft by ID, but lacks explicit guidance on when to use this vs siblings. No mention of when not to use or alternatives beyond the implied context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_draftsA

List recent drafts (unpublished posts).

Args: limit: Max number of drafts to return (1-50). Default 10.

Returns: List of draft summaries with post_id, title, edit_url, etc.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It indicates read-only behavior by saying 'List' and mentions return fields. It doesn't hide any destructive aspects, and the behavior is straightforward. A perfect score would need to explicitly state non-destructiveness, but it's clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences in the main body, plus a structured Args/Returns section. Every sentence adds value, no fluff. The purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low complexity (1 parameter, no required), the presence of an output schema (described in Returns), and no annotations missing critical info, the description is complete. It covers purpose, parameter, and return format sufficiently for an agent to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only 'limit' with type and default. The description adds semantics: 'Max number of drafts to return (1-50). Default 10.' This explains constraints (1-50) and default behavior, compensating fully for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List recent drafts (unpublished posts)', specifying the verb 'list' and resource 'drafts', with a clarifying parenthetical. It distinguishes from siblings like get_draft (single) and create_draft (creation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies it lists recent drafts with an optional limit. It doesn't explicitly say when to use it over other tools, but given the sibling list, it's the only list tool, so context is clear. A small gap is not mentioning that it only returns recent ones, but that's inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_noteA

Post a Note (Substack's short-form, X/Threads-like post) to the public feed.

Notes are different from Posts:

  • No title or subtitle.

  • No email delivery to subscribers.

  • Not added to the publication's article archive.

  • Visible in the Substack Notes feed (cross-publication discovery surface).

Use Notes for:

  • Quick thoughts, links, restacks, questions to your audience

  • Daily presence between long-form posts

  • Networking with other Substackers (replies, mutual follows)

Args: text: Plain text body. Use \n\n to separate paragraphs and \n for soft line breaks. Max 4000 chars (Substack's practical Notes limit).

Returns: {note_id, url, raw}

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description bears full burden. Describes the operation (post to public feed) and key behavioral traits (no email delivery, not archived). Lacks details on authentication or rate limits, but sufficient for a simple create tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with bullet points and clear sections. Slightly verbose but all information is relevant. Front-loaded with main purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 1-parameter tool with no output schema and no annotations, the description is fully complete: explains return value (note_id, url, raw), differentiates from sibling tools, and covers usage guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 0% coverage ('text' is just 'string'), but description fully compensates: explains format (plain text), paragraph separation (\n\n), soft line breaks (\n), and max length (4000 chars).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it posts a Note (Substack's short-form post) to the public feed. Distinguishes Notes from Posts by listing specific differences (no title, no email, no archive). The verb 'Post' matches the tool name and resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly specifies when to use Notes vs Posts, and provides concrete use cases: quick thoughts, links, restacks, questions, daily presence, networking. Also states what Notes are not, which helps avoid misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_draftA

Publish a draft immediately.

Args: post_id: Draft ID. send_email: If True (default), send the post as an email to subscribers. If False, publish to web only without emailing. share_automatically: If True, auto-share to Substack social channels.

Returns: {post_id, title, public_url, post_date, send_email}

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
send_emailNo
share_automaticallyNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries burden. It explains the effect of boolean parameters (send_email, share_automatically) and returns a dict. But it doesn't disclose potential irreversibility, permission requirements, or side effects beyond those stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise and well-structured: a brief purpose statement followed by a clean bulleted list of parameters and return. Every sentence adds value with no repetition or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description includes return fields (post_id, title, public_url, etc.). It covers the tool's behavior adequately for a simple publish operation. Lacks error handling info but within acceptable bounds.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Description adds meaningful context: 'send_email' and 'share_automatically' each have conditional behavior explained. 'post_id' is simply 'Draft ID', lacking detail. With 0% schema coverage, the description compensates well for most parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Publish a draft immediately.' with a specific verb and resource. It distinguishes from siblings like 'schedule_draft' (scheduling) and 'delete_draft' (deletion) by focusing on immediate publication.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies immediate publishing, and sibling tool 'schedule_draft' suggests alternative for future scheduling. However, no explicit when-not-to-use or exclusion criteria are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schedule_draftA

Schedule a draft to publish at a future datetime.

Args: post_id: Draft ID. iso_datetime: ISO 8601 datetime, e.g., '2026-05-15T09:00:00+09:00' for JST or '2026-05-15T00:00:00Z' for UTC.

Returns: {post_id, scheduled_for}

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
iso_datetimeYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, and the description does not disclose behavioral traits such as whether scheduling overwrites existing schedule, permission requirements, or side effects. The description is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear structure (what, args, returns), though the Args/Returns format adds minor verbosity; it is front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description includes return value details. However, it lacks behavioral context and usage guidance, leaving some gaps for a complete understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds full meaning to both parameters beyond the schema: explains post_id as Draft ID and provides explicit ISO 8601 datetime format examples, compensating for 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool schedules a draft to publish at a future datetime, distinguishing it from siblings like publish_draft (immediate) and unschedule_draft (cancel).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives; it only describes the action without context of when to choose it over similar tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_cover_imageA

Set the cover (thumbnail) image for a draft.

The cover image is shown on the publication homepage, in social shares, and as the email header. Use upload_image first to get a CDN URL.

Args: post_id: Draft ID. image_url: Substack CDN URL from upload_image, or any public image URL.

Returns: Updated draft summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
image_urlYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It explains where the cover image is used (homepage, social shares, email header) and notes the return type (updated draft summary). It does not mention side effects like overwriting, but the behavior is largely implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with purpose, followed by context, argument details, and return. No redundant information. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity (2 params, no output schema), the description covers essential usage: purpose, prerequisite (upload_image), parameter semantics, and return value. It lacks info on idempotency or error handling, but completeness is adequate for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 0% coverage, but the description adds meaning beyond property names. It specifies 'post_id: Draft ID' and 'image_url: Substack CDN URL from upload_image, or any public image URL.' This clarifies valid values and origin requirements.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Set the cover (thumbnail) image for a draft.' The verb 'set' and resource 'cover image' are specific and distinct from sibling tools like upload_image or update_draft.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: 'Use upload_image first to get a CDN URL.' It also clarifies that image_url can be 'any public image URL', not just from upload_image. This helps the agent understand prerequisites and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unschedule_draftB

Cancel a scheduled publish, keeping the post as a draft.

Args: post_id: Draft ID.

Returns: {post_id}

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears the full burden. It states the tool cancels a scheduled publish and keeps the post as a draft, but does not disclose potential side effects, required permissions, or whether the post must be in scheduled state. The return value is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief with only two sentences, front-loaded with the purpose. Every word carries meaning, though it could be slightly expanded without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity (one parameter, no output schema, no annotations), the description covers the basic action and argument. However, it lacks behavioral details that would complete the context for an agent, such as whether the tool can be called on non-scheduled posts or if it's idempotent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description only reiterates 'Draft ID', adding little beyond the parameter name. No format, constraints, or additional context is given for the post_id parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: cancel a scheduled publish, keeping the post as a draft. The verb 'cancel' and resource 'scheduled publish' are specific and contrast with sibling tools like schedule_draft and publish_draft.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (when a post is scheduled and you want to unschedule it) but provides no explicit guidance on prerequisites, when not to use, or alternatives. The context of sibling tools helps but the description itself lacks directive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_draftA

Update an existing draft. Provide only the fields you want to change.

Args: post_id: Draft ID returned by create_draft or list_drafts. title: New title (optional). subtitle: New subtitle (optional). content_markdown: New body in Markdown (optional, replaces full body). audience: New audience setting (optional).

Returns: Updated draft summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
titleNo
subtitleNo
content_markdownNo
audienceNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It explains partial update behavior and return of a draft summary. It does not disclose permissions or side effects, but given the simplicity, it's adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, structured with an Args and Returns section, and contains no redundant information. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, no output schema, and no annotations, the description covers the core functionality well. It could optionally list possible audience values, but overall it's sufficient for correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by explaining each parameter, including the source of post_id and the effect of content_markdown replacing the full body.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Update an existing draft' and lists the modifiable fields, clearly distinguishing from siblings like create_draft and delete_draft.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It advises 'Provide only the fields you want to change,' indicating partial updates, and implies usage when an existing draft needs modification. However, it does not specify when not to use or provide alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_imageA

Upload an image to Substack's CDN and return its public URL.

Args: image_path: Local file path (e.g., /Users/foo/cover.png) or remote URL.

Returns: {url, id, width, height} — pass url to set_cover_image or embed in Markdown as alt.

ParametersJSON Schema
NameRequiredDescriptionDefault
image_pathYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries full burden. It discloses input (local/remote), return structure, and usage of result. However, it does not mention side effects, idempotency, file size limits, or permanence of URL, leaving gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with Args and Returns sections, each sentence is relevant. It could be slightly more concise, but it's clear and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter and no output schema, the description covers input format, output fields, and usage context. Missing file format/size constraints, but overall complete for a straightforward upload tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter image_path has 0% schema description coverage, but the description adds critical semantics: it accepts both local file paths and remote URLs with examples. This goes beyond the bare string type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool uploads an image to Substack's CDN and returns a public URL, specifying the verb and resource. It distinguishes from sibling set_cover_image by indicating the URL can be passed there.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage before set_cover_image or Markdown embedding, but lacks explicit when-not or alternative tools beyond set_cover_image. No exclusions or context signals for when to avoid.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 11 tool updatesv0.1.0
    • First observedcreate_draft
    • First observeddelete_draft
    • First observedget_draft
    • First observedlist_drafts
    • First observedpost_note
    • First observedpublish_draft
    • First observedschedule_draft
    • First observedset_cover_image
    • First observedunschedule_draft
    • First observedupdate_draft
    • First observedupload_image

TDQS

A4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: draft CRUD, publishing, scheduling, notes, and image operations. No two tools overlap in functionality.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with underscores (e.g., create_draft, publish_draft, upload_image), making the API predictable.

Tool Count5/5

11 tools is well-scoped for a Substack server, covering drafting, publishing, scheduling, notes, and images without being excessive.

Completeness4/5

The tool set covers core drafting and publishing workflows comprehensively, but lacks tools for managing published posts, subscribers, or analytics, which are minor gaps for a content creation MCP.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nanameru/substack-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server