postscript-mcp
Allows AI agents to manage SMS marketing for Shopify stores via Postscript, with tools to query subscribers, look up opt-in keyword IDs, add subscribers with consent, list campaigns, and check audience segment sizes.
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., "@postscript-mcpcheck the size of my VIP segment"
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.
postscript-mcp
MCP server for Postscript, the SMS marketing platform for Shopify e-commerce stores. 5 tools for AI copywriting and marketing agents to query subscribers, look up opt-in keyword IDs, add new subscribers (with proper consent flow), list active SMS campaigns, and check audience segment sizes before drafting SMS blasts.
As of May 2026, Postscript does not have an official MCP server. The community attempt is a zero-star placeholder. This is the production-quality rail to fill that gap.
The 5 tools
Tool | Purpose |
| Query the active SMS subscriber list |
| Look up SMS opt-in keyword IDs (required for compliant subscriber creation) |
| Add a new phone number to a list, tied to a documented consent flow |
| Retrieve recent SMS campaigns and their deployment status |
| Look up audience segments and their subscriber counts |
Related MCP server: mailchimp-mcp
Install
pip install postscript-mcpConfigure
export POSTSCRIPT_API_KEY="your-postscript-private-api-key"Get a Postscript Private API Key in your Postscript dashboard under Apps -> API. The key is sent as a Bearer token; vault it server-side only.
Use with Claude Desktop
{
"mcpServers": {
"postscript": {
"command": "postscript-mcp",
"env": {
"POSTSCRIPT_API_KEY": "your-postscript-private-api-key"
}
}
}
}Restart Claude Desktop. The 5 Postscript tools are now available.
Use case: AI SMS marketing assistant
Typical agent flow:
Call
check_segment_size()to see which audience segments exist and how many subscribers each contains. Pick the right one for the campaign.Call
list_campaigns()to see what has already been sent and avoid sending a duplicate.(For subscriber growth flows) Call
get_keyword_id()to find the consent-flow keyword for the right list, thenadd_subscriber(phone_number, keyword_id)to add a new opt-in.Drafting an SMS: use the segment + subscriber data to scope the message correctly before passing it to a downstream SMS-send tool (Postscript send endpoints are intentionally NOT in this MCP to keep the rail safe).
Compliance note
SMS subscriber creation is regulated under TCPA (US) and CTIA carrier requirements. The add_subscriber tool always requires a keyword_id, which ties every new subscription to a documented consent flow you previously configured in Postscript. This MCP does not provide a way to add subscribers without a keyword_id. Do not attempt to bypass this; non-consented subscribers are a compliance and legal risk for the merchant.
Architecture
Public MIT-licensed wrapper around the Postscript REST API v2
Async HTTP via
httpxpydantic v2 input validation
Bearer token auth, server-side only
Rate-limit aware (429 returns a clean error)
Development
git clone https://github.com/NoBanks/postscript-mcp.git
cd postscript-mcp
pip install -e ".[dev]"
pytestLicense
MIT. See LICENSE.
Author
Ryan Hammer (NoBanks). Solo founder + engineer. Built this and 10 other MCP servers as part of a sprint to expose AI agent rails for the products and platforms shipping daily.
GitHub: @NoBanks
X/Twitter: @livingagentic
Open to AI engineering roles, contract or full-time, remote-only.
Available Tools
5 toolsadd_subscriberA
Add a new phone number to the SMS list using a specific keyword ID. The keyword_id ties the subscription to an existing documented consent flow (required for TCPA/CTIA compliance). Returns the created subscriber.
| Name | Required | Description | Default |
|---|---|---|---|
| phone_number | Yes | E.164 format, e.g. +14155551234 | |
| keyword_id | Yes | ID from get_keyword_id, ties subscription to consent flow | |
| properties | No | Optional custom subscriber properties (key-value pairs) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description adds that tool returns created subscriber and mentions compliance requirement, but lacks details on errors, rate limits, or side effects beyond schema.
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?
Two sentences with no redundant information. First sentence states purpose, second adds return value and compliance context. Efficient and front-loaded.
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 3-parameter creation tool with no output schema, the description covers essential aspects: action, compliance, return value. Lacks detail on nested 'properties' object but sufficient for basic 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?
Schema coverage is 100%, and description repeats schema descriptions without adding new insight beyond rephrasing. 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?
Description clearly states action (add), resource (phone number to SMS list), and specific mechanism (using keyword ID). Emphasizes TCPA/CTIA compliance, distinguishing it from sibling tools like list_subscribers or get_keyword_id.
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?
Provides context that keyword_id ties to consent flow, implying need for prior existence, but does not explicitly state when to use or alternatives. Lacks explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_segment_sizeA
Look up audience segments to see how many subscribers each contains. Use BEFORE drafting an SMS blast so the agent can scope the campaign correctly.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It states a readonly query behavior but does not disclose any potential side effects, permissions, or limitations (e.g., rate limits, data freshness). The description is minimal and lacks depth for behavioral understanding.
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 two sentences long, with the first sentence stating the function and the second providing usage context. It is front-loaded and contains no redundant 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?
The tool is simple and the description covers the basic function and usage context. However, without an output schema or annotations, the description does not specify the return format or details like whether it returns all segments or only accessible ones. This leaves some ambiguity for the agent.
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 zero parameters, so schema coverage is 100%. Since there are no parameters, the description naturally adds no parameter-specific info. Baseline for 0 parameters is 4, and the description meets that.
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 action: 'Look up audience segments to see how many subscribers each contains.' This is a specific verb-resource combination. The sibling tools (add_subscriber, get_keyword_id, list_campaigns, list_subscribers) are distinct, so there is no ambiguity.
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 explicit usage guidance: 'Use BEFORE drafting an SMS blast so the agent can scope the campaign correctly.' This tells the agent when to invoke the tool, though it does not explicitly mention when not to use it or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_keyword_idA
Look up all SMS opt-in keywords configured in the Postscript account. Returns each keyword's ID and reply message. Use the returned ID when calling add_subscriber so the new subscriber is tied to a documented consent flow.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses the tool's behavior: it performs a lookup and returns keyword ID and reply message. No hidden side effects or constraints are omitted.
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 two sentences, each essential: the first states what the tool does, the second explains why it matters. No extraneous content.
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 simple lookup tool with no parameters and no nested objects, the description provides sufficient context: it lists returned fields (ID and reply message) and ties to a sibling tool. No output schema exists, but the description covers the output.
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 zero parameters, so the description adds no parameter info beyond what the schema provides (none needed). Schema coverage is 100%, meeting the baseline for 0 parameters.
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 explicitly states the tool 'looks up all SMS opt-in keywords' and returns 'each keyword's ID and reply message,' clearly distinguishing it from sibling tools like add_subscriber.
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 directly guides usage by stating 'Use the returned ID when calling add_subscriber,' linking the tool to a sibling and explaining the purpose, though it doesn't explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_campaignsA
Retrieve recent SMS marketing campaigns and their deployment status. Useful for an AI agent to check what has already been sent before drafting a new one.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of campaigns to return |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without any annotations, the description implies a read-only operation but does not explicitly state behavioral traits like whether it is safe or if there are rate limits. The term 'retrieve' suggests no side effects, but more detail would improve transparency.
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 only two sentences (22 words), front-loaded with the action, and every sentence adds value without redundancy.
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 simple list tool with one optional parameter and no output schema, the description adequately conveys what the tool does and when to use it, though it does not detail the return format.
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 covers the only parameter (limit) with 100% description, making the baseline 3. The tool description adds no additional meaning beyond what the schema provides.
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 'Retrieve' and the resource 'recent SMS marketing campaigns and their deployment status', which distinguishes it from sibling tools like list_subscribers.
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 explicitly says it is 'useful for an AI agent to check what has already been sent before drafting a new one', providing clear context for when to use the tool, though it does not mention when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_subscribersA
Query the active SMS subscriber list to retrieve subscriber IDs and phone numbers. Useful for downstream targeting decisions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of subscribers to return |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description implies a read operation but does not disclose limitations, pagination, or authentication needs. It is adequate for a simple list tool but could be more explicit.
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 two sentences with no wasted words. It front-loads the purpose and provides a usage hint efficiently.
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 simplicity (1 param, no output schema), the description is complete: it explains the output (IDs and phone numbers), specifies 'active' subscribers, and gives a usage context. No 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 covers the single parameter 'limit' with a description. The tool description does not add extra meaning to the parameter beyond the schema, so baseline 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 verb 'Query', the resource 'active SMS subscriber list', and what it retrieves ('subscriber IDs and phone numbers'). It distinguishes from sibling tools like add_subscriber (add) and check_segment_size.
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 mentions it is 'useful for downstream targeting decisions', implying a use case. However, it does not explicitly state when not to use or compare to alternatives like check_segment_size.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct action (add, check, get, list) on different resources (subscriber, segment, keyword, campaign). No overlap in purpose.
All tool names follow the verb_noun pattern with lowercase and underscores, e.g., add_subscriber, check_segment_size.
5 tools covers the essential operations for subscriber management, keyword lookup, segment sizing, and campaign listing without unnecessary redundancy.
Covers add/list for subscribers, keyword retrieval, segment size check, and campaign listing but lacks update/delete subscriber and campaign creation/sending tools.
Maintenance
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
The Mobile Text Alerts SMS MCP server enables your AI to send SMS messages & manage contacts
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Related MCP Servers
- AlicenseAqualityAmaintenanceMailchimp MCP Server - Access Mailchimp data from Claude via MCP.10024MIT
- AlicenseAqualityDmaintenanceAn MCP server that interfaces with the Mailchimp Marketing API to manage audiences, email campaigns, and subscribers. It enables users to create and schedule campaigns, handle member lists, and send test or live emails through natural language commands.1334MIT
- FlicenseAqualityDmaintenanceMCP server for RevenueCat that lets AI agents query subscriber data, check entitlements, fetch offerings, and manage subscriptions via natural language.6
- AlicenseNot gradedqualityCmaintenanceEnables SMS marketing for Shopify via Postscript, allowing AI agents to manage campaigns and communications through natural language queries.12MIT
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/NoBanks/postscript-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server