Substack MCP Server
Enables management of Substack publications including creating and publishing posts with cover images, creating short-form notes, retrieving content and comments, and accessing profile information.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Substack MCP Servercreate a draft post titled 'AI Writing Tools' with a cover image from my desktop"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Substack MCP Server
An MCP (Model Context Protocol) server that allows Claude Desktop and Claude Code to interact with your Substack publication. Create posts with cover images, publish notes, manage your content, and more - all through natural conversation with Claude.
Features
✅ Post Management: Create full blog posts with cover images
✅ Notes: Create short-form Substack notes
✅ Profile Access: Get your own profile and other users' profiles
✅ Content Retrieval: Fetch posts, notes, and comments
✅ Image Upload: Native Substack image upload (v2.3.0) - no third-party dependencies
✅ Draft Mode: Create drafts for review before publishing
Version 2.3.0 - What's New
This version replaces Imgur with Substack's native image upload:
Native Integration: Direct upload to Substack's CDN (Amazon S3)
Data URI Format: Images encoded as base64 data URIs
Automatic MIME Detection: Supports PNG, JPG, JPEG, GIF, WEBP
Post Association: Images properly linked to posts via
postIdMore Reliable: No third-party API dependencies
Prerequisites
Node.js 18+ installed on your system
Substack account with publication access
Substack API Key (connect.sid cookie value)
Getting Your Substack API Key
The Substack API uses cookie-based authentication:
Login to Substack in your browser
Open Developer Tools (F12 or Right-click → Inspect)
Go to Application/Storage tab → Cookies →
https://substack.comFind the
connect.sidcookie and copy its valueThis value is your
SUBSTACK_API_KEY
⚠️ Important: Keep this cookie value private. Do not commit it to version control.
Cookie Extraction Tools
The tools/ directory contains utility scripts to help extract your Substack cookie:
extract-cookie.js- Manual cookie extraction toolextract-cookie-auto.js- Automated cookie extraction
To use these tools, save your cookie value to tools/cookie.txt (this file is git-ignored for security).
Installation
Building the MCP Server
# Clone or download this repository
cd substack-mcp
# Install dependencies
npm install
# Build the TypeScript code
npm run buildFor Claude Desktop
Open your Claude Desktop configuration file:
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Add the Substack MCP server configuration:
{
"mcpServers": {
"substack": {
"command": "node",
"args": ["C:\\mcp-servers\\substack-mcp\\dist\\mcp-server.js"],
"env": {
"SUBSTACK_API_KEY": "your-connect-sid-cookie-value-here",
"SUBSTACK_HOSTNAME": "yoursite.substack.com"
}
}
}
}Replace
your-connect-sid-cookie-value-herewith your actual cookie valueReplace
yoursite.substack.comwith your Substack hostnameRestart Claude Desktop
For Claude Code
Add to your Claude Code MCP configuration or use:
claude mcp add substack-mcpAvailable Tools
mcp__substack__create_post
Create a full blog post with optional cover image
Parameters:
title(required): Post titlebody(required): Post content (supports markdown)subtitle(optional): Post subtitlecover_image(optional): Path to cover image filedraft(optional): Create as draft (default: true)
Example:
{
title: "My Amazing Post",
body: "This is the content of my post...",
cover_image: "c:/temp/cover-image.png",
draft: true
}mcp__substack__create_note
Create a new Substack note (short-form post)
Parameters:
text(required): Note content
mcp__substack__create_note_with_link
Create a note with a link attachment
Parameters:
text(required): Note contentlink(required): URL to attach
mcp__substack__get_own_profile
Get your own Substack profile information
Returns: name, slug, handle, bio, follower count, photo URL
mcp__substack__get_profile_posts
Get your recent posts
Parameters:
limit(optional): Number of posts to retrieve (default: 10)
mcp__substack__get_post
Get a specific post by ID with full content
Parameters:
post_id(required): The post ID
mcp__substack__get_post_comments
Get comments for a specific post
Parameters:
post_id(required): The post IDlimit(optional): Number of comments (default: 20)
mcp__substack__get_notes
Get your recent notes
Parameters:
limit(optional): Number of notes (default: 10)
Usage Examples
With Claude Desktop/Code
Once configured, you can have natural conversations with Claude:
"Create a new blog post titled 'Why I Love Programming' with this content..."
"Create a draft post with the article from article.md and use cover.png as the cover image"
"Get my recent posts from the last week"
"Create a note saying 'New post just published!'"Claude will automatically use the appropriate MCP tools to fulfill your requests.
Environment Variables
SUBSTACK_API_KEY(required): Your connect.sid cookie valueSUBSTACK_HOSTNAME(required): Your Substack hostname (e.g., "yourname.substack.com")
Workflow Example
Here's a typical workflow for creating a post with cover image:
Write your article in markdown format
Create or generate a cover image
Tell Claude: "Create a draft post with article.md and cover.png"
Claude will:
Read the markdown file
Upload the cover image to Substack's CDN
Create the draft post with both
Return the draft URL for review
Documentation
CLAUDE.md - Development guidelines for Claude Code
Troubleshooting
"SUBSTACK_API_KEY environment variable is required"
Make sure you've added the SUBSTACK_API_KEY to the env section of your MCP configuration.
"Failed to connect"
Verify your connect.sid cookie value is correct and hasn't expired
Check that you're logged into Substack in your browser
Try getting a fresh cookie value by logging out and back in
MCP server not appearing in Claude Desktop
Check that the path to
mcp-server.jsis correctEnsure Node.js 18+ is installed:
node --versionRun
npm run buildto compile the TypeScriptRestart Claude Desktop after configuration changes
Image upload fails
Ensure the image file exists and is readable
Check that the file format is supported (PNG, JPG, JPEG, GIF, WEBP)
Verify your Substack API key is valid
Development
To extend the MCP server:
Edit
src/mcp-server.tsto add new toolsRun
npm run buildto compile TypeScriptRestart Claude Desktop/Code to load changes
Testing
npm test # Run all tests
npm run test:unit # Unit tests only
npm run lint # Check code style
npm run format # Format codeSecurity Notes
Never commit your connect.sid cookie value to version control
Store your API key securely using environment variables
The cookie value gives full access to your Substack account
Regularly refresh your cookie value for security
Version History
v2.3.0 (Nov 2025): Native Substack image upload, replaces Imgur
v2.2.0: Added Imgur-based cover image upload
v2.1.0: Added create_post tool with ProseMirror support
v2.0.0: Initial MCP server implementation
License
MIT - See LICENSE file for details
Credits
Built on top of the substack-api TypeScript client.
MCP server and image upload implementation by Daniel Simon Jr.
Available Tools
8 toolscreate_noteC
Create a new Substack note (short-form post)
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text content of the note |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states this is a creation operation but doesn't mention permissions needed, whether it's idempotent, rate limits, or what happens on success/failure. For a mutation tool with zero annotation coverage, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's appropriately sized for a simple creation tool and front-loads the essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is inadequate. It doesn't explain what happens after creation (e.g., returns a note ID), error conditions, or how this differs behaviorally from similar tools. Given the complexity and lack of structured data, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single 'text' parameter. The description adds no additional parameter semantics beyond what's in the schema, such as format constraints or examples. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Create' and resource 'Substack note (short-form post)', making the purpose unambiguous. It distinguishes from siblings like 'create_post' by specifying 'note' versus 'post', though it doesn't explicitly contrast with 'create_note_with_link' beyond the name difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'create_post' or 'create_note_with_link'. It doesn't mention prerequisites, context, or exclusions, leaving the agent to infer usage from tool names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_note_with_linkC
Create a new Substack note with a link attachment
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text content of the note | |
| link | Yes | URL to attach to the note |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. While it indicates a creation action, it doesn't specify whether this requires authentication, what permissions are needed, whether the note is published immediately or saved as draft, or what happens on failure. For a mutation tool with zero annotation coverage, this leaves significant behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that communicates the core functionality without unnecessary words. It's appropriately sized for a tool with two parameters and gets straight to the point with zero wasted language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a creation tool with no annotations and no output schema, the description is insufficient. It doesn't explain what gets returned (e.g., note ID, success status), error conditions, or important behavioral aspects like whether the link is validated. The combination of mutation functionality with minimal disclosure creates significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage, with both parameters ('text' and 'link') clearly documented in the schema itself. The description doesn't add any additional parameter information beyond what's already in the schema, so it meets the baseline of 3 where the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create a new Substack note') and specifies the resource ('with a link attachment'), making the purpose immediately understandable. It distinguishes from the sibling 'create_note' by explicitly mentioning the link attachment feature. However, it doesn't fully differentiate from 'create_post' which might have overlapping functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'create_note' or 'create_post'. There's no mention of prerequisites, context requirements, or specific scenarios where this tool is preferred over sibling tools that might also create content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_postC
Create and publish a full Substack blog post with optional cover image
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | The title of the post | |
| subtitle | No | The subtitle of the post (optional) | |
| body | Yes | The body content of the post (HTML or markdown) | |
| cover_image | No | Path to cover image file (optional, will be uploaded to Substack) | |
| draft | No | Save as draft instead of publishing (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions 'publish' and 'draft' options, but fails to cover critical aspects like authentication requirements, rate limits, error handling, or whether the operation is idempotent. This leaves significant gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core action ('Create and publish') and includes key optional features. There is no wasted verbiage, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a mutation tool with no annotations and no output schema, the description is insufficient. It lacks details on return values, error conditions, and behavioral traits like side effects or permissions, leaving the agent with incomplete context for safe and effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so parameters are well-documented there. The description adds minimal value by mentioning 'optional cover image', which aligns with the schema but doesn't provide additional semantics beyond what's already covered. This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create and publish') and resource ('a full Substack blog post'), making the purpose evident. However, it doesn't explicitly differentiate from sibling tools like 'create_note' or 'create_note_with_link', which likely create different types of content, so it's not a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'create_note' or 'create_note_with_link', nor does it mention prerequisites such as authentication or context. It only hints at optional features like cover images, but lacks explicit usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_notesC
Get your recent Substack notes (short-form posts)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of notes to retrieve (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool retrieves 'recent' notes, implying recency-based ordering, but doesn't specify authentication needs, rate limits, pagination, or what 'recent' means (e.g., time frame). This leaves gaps for a read operation that could have hidden constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose. The parenthetical 'short-form posts' adds useful clarification without redundancy. It could be slightly more structured by explicitly contrasting with siblings, but it's appropriately sized with zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (1 optional parameter, no output schema, no annotations), the description is minimally adequate. It covers the basic purpose but lacks details on behavioral traits like ordering or authentication. With no output schema, it doesn't explain return values, which is a gap, but the simplicity of the tool keeps it from being severely incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the 'limit' parameter clearly documented. The description adds no additional parameter semantics beyond implying 'recent' notes, which doesn't directly map to a documented parameter. Since schema coverage is high, the baseline score of 3 is appropriate, as the description doesn't compensate but doesn't need to heavily.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and resource ('your recent Substack notes'), with the parenthetical clarifying that notes are short-form posts. It distinguishes from siblings like get_post (for long-form posts) and get_profile_posts (for others' posts), though not explicitly. However, it doesn't fully differentiate from all siblings like get_own_profile, which might also return user data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention siblings like get_post (for specific posts) or get_profile_posts (for posts from other users), nor does it specify prerequisites or contexts for retrieving notes versus other content types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_own_profileB
Get your own Substack profile information
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It implies a read operation ('Get'), but doesn't specify authentication requirements, rate limits, error conditions, or what data is returned (e.g., public vs. private fields). For a tool with zero annotation coverage, this leaves significant gaps in understanding its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose without any wasted words. It's appropriately sized for a simple, parameterless tool, making it easy for an agent to parse and understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema, no annotations), the description is minimally adequate. It states what the tool does but lacks details on return values, authentication, or error handling. Without an output schema, the agent must infer the response structure, making this description incomplete for full contextual understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and the schema description coverage is 100% (since there are no parameters to describe). In such cases, the baseline score is 4, as there's no need for the description to compensate for missing parameter documentation. The description doesn't add parameter details, but none are required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('your own Substack profile information'), making the purpose immediately understandable. It distinguishes itself from sibling tools like 'get_profile_posts' by focusing on profile metadata rather than content. However, it doesn't explicitly contrast with all siblings, keeping it at a 4 rather than a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_profile_posts' or other profile-related operations. It lacks any mention of prerequisites, context, or exclusions, leaving the agent to infer usage based on the tool name alone. This minimal guidance scores a 2.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_postB
Get a specific Substack post by ID with full content
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | The ID of the post to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states it retrieves a post with full content, but doesn't disclose behavioral traits like authentication requirements, rate limits, error conditions, or whether it's a read-only operation. The description is minimal and lacks necessary context for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's front-loaded with the core purpose and includes essential scope details. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete for a tool that retrieves data. It doesn't explain what 'full content' includes, the return format, error handling, or authentication needs. For a read operation with zero structured coverage, this leaves significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the post_id parameter. The description adds no additional meaning beyond what the schema provides (e.g., format examples, constraints, or context about valid IDs). Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get'), resource ('Substack post'), and scope ('by ID with full content'). It distinguishes from siblings like get_notes (list) and get_post_comments (different resource) by specifying retrieval of a single post with full content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when needing a specific post by ID with full content, but doesn't explicitly state when to use alternatives like get_profile_posts (for lists) or get_post_comments (for comments). No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_post_commentsB
Get comments for a specific Substack post
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | The ID of the post | |
| limit | No | Number of comments to retrieve (default: 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states what the tool does but lacks critical details like whether it's read-only, requires authentication, has rate limits, or how comments are returned (e.g., pagination, sorting). This is a significant gap for a tool with potential behavioral implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose with zero waste. It's appropriately sized and front-loaded, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (2 parameters, no output schema, no annotations), the description is minimally adequate. It covers the basic purpose but lacks behavioral context and usage guidelines, which are important for an agent to operate effectively in this domain with sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so the input schema already documents both parameters ('post_id' and 'limit') with clear descriptions. The description adds no additional meaning beyond what's in the schema, such as format details or usage examples, but this is acceptable given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Get') and resource ('comments for a specific Substack post'), making it immediately understandable. However, it doesn't differentiate from sibling tools like 'get_post' or 'get_notes', which might retrieve related content, so it doesn't reach the highest score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'get_post' or 'get_notes', nor does it specify prerequisites or exclusions, leaving the agent to infer usage from context alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profile_postsC
Get your recent Substack posts
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of posts to retrieve (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool retrieves posts but doesn't mention whether it's read-only, requires authentication, has rate limits, or what the return format looks like. This leaves significant gaps in understanding the tool's behavior and safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without any wasted words. It's appropriately sized and front-loaded, making it easy to parse quickly, which is ideal for conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete. It doesn't address key contextual elements like authentication requirements, return format, or error handling. For a tool that retrieves data, more information is needed to ensure the agent can use it effectively and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the 'limit' parameter clearly documented. The description doesn't add any additional meaning beyond the schema, such as explaining what 'recent' means or default behavior details. Since the schema does the heavy lifting, the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and resource ('your recent Substack posts'), making the tool's purpose understandable. However, it doesn't differentiate from sibling tools like 'get_post' or 'get_notes', which appear to retrieve similar content, so it doesn't fully distinguish itself from alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_post' or 'get_notes'. It lacks context about prerequisites, such as authentication needs, and doesn't specify any exclusions or when-not-to-use scenarios, leaving the agent with minimal usage direction.
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.
8 tool updates
v1.0.0- First observed
create_note - First observed
create_note_with_link - First observed
create_post - First observed
get_notes - First observed
get_own_profile - First observed
get_post - First observed
get_post_comments - First observed
get_profile_posts
TDQS
Most tools are clearly distinct, focusing on specific resources like notes, posts, profiles, and comments. However, there is some potential overlap between 'create_note' and 'create_note_with_link', as the latter could be seen as a variant of the former, which might cause minor confusion in selection.
All tool names follow a consistent verb_noun pattern using snake_case, such as 'create_note', 'get_notes', and 'get_post_comments'. This predictability makes it easy for agents to understand and use the tool set without naming confusion.
With 8 tools, the server is well-scoped for managing Substack content, covering creation and retrieval of notes, posts, profiles, and comments. This count is appropriate, providing essential operations without being overwhelming or too sparse for the domain.
The tool set offers good coverage for core Substack operations, including CRUD-like actions for notes and posts, and retrieval of profiles and comments. A minor gap is the lack of update or delete tools for posts and notes, which agents might need to work around, but the surface supports key workflows effectively.
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
Create, manage, publish, and analyze Inblog content through AI agents.
Publish and manage articles, series, comments, reactions, newsletters and blog analytics.
Publish, update, list, and delete Markdown pages on Booklet directly from your AI assistant.
Create, import, and publish Jellypod podcast episodes from your AI assistant.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/danielsimonjr/substack-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server