Skip to main content
Glama
marcomoauro

Substack MCP Server

by marcomoauro

upload_image

Upload an image to Substack from an HTTP URL or local file path, returning a hosted Substack URL for use in posts and drafts.

Instructions

Host an image on your Substack publication and get back a Substack URL — the one thing image2.src in set_post_body and cover_image in update_draft will actually render. The source is either an http(s) URL, which the server downloads and re-hosts, or path, an absolute path to a local file on the machine running this server, which is read straight from disk: use that for an image you generated or edited locally, with no need to publish it anywhere first. Private and loopback hosts are refused, HEIC is not accepted, max 10 MB.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlNoThe http(s) URL of an image to upload. The server downloads it and re-hosts it on Substack. Private, loopback and link-local hosts are refused. Max 10 MB. HEIC is not accepted. Provide exactly one of `url` or `path`.
pathNoAbsolute path to an image file on the machine running this server, read directly from disk with no download. Use this for a locally generated or edited image. The path must be absolute — a relative one would resolve against the server's working directory, not the caller's. The type is detected from the file's contents, not its extension: PNG, JPEG, GIF and WebP are accepted, HEIC is not. Max 10 MB. Provide exactly one of `url` or `path`.
post_idNoOptional id of the post the image belongs to. Its effect is unconfirmed.
Behavior5/5

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

With no annotations, the description carries the full burden and does so admirably. It discloses key behaviors: server-side download for URL, direct disk read for path, refusal of private/loopback/link-local hosts, rejection of HEIC, max 10 MB, and content-based type detection. These are non-obvious and crucial for a caller to avoid errors.

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 a single, dense paragraph that front-loads the main action and then provides the two variants and constraints. Every sentence adds critical information; there is no filler. It is appropriately sized given the number of constraints and the need to distinguish the two input modes.

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?

No output schema exists, yet the description clearly states the return value ('get back a Substack URL'). It covers the two input modes, constraints, and the relationship to callers. The tool's complexity is moderate, but the description leaves no critical unknowns for a caller to invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The tool description largely restates what the schema already says for the url and path parameters (refusal constraints, max size, HEIC). It adds the 'will actually render' tie-in, which aids purpose, but does not materially extend parameter semantics 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 opens with a specific verb and resource: 'Host an image on your Substack publication and get back a Substack URL.' It clearly distinguishes this tool from siblings by noting the returned URL is exactly what image2.src in set_post_body and cover_image in update_draft will render. This is unambiguous and contextually differentiated.

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 explains when to use each input mode: 'url' for remote images the server downloads and re-hosts, 'path' for locally generated or edited images read directly from disk. It also ties the tool to the consuming tools (set_post_body, update_draft), making the use case evident. No alternatives are listed among siblings because none exist; the guidance is fully sufficient.

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

Install Server

Other Tools

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/marcomoauro/substack-mcp'

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