MCP or API
Newsletter MCP vs email API: which should you use?
By FlockStackPublished
Use the MCP server when a person asks an assistant to do the work. Use the REST API when you wrote the program and want it to do the same thing every time. Underneath they are one product, so you are choosing who makes the next call, not which features you get.
What they share
MCP is an open standard for connecting AI applications to tools. FlockStack's server uses it to give an assistant the same actions the REST API gives your code.
- The actions. 381 of them, the same ones the dashboard runs, in 54 groups. Each endpoint is a tool named after its operation ID.
- The checks and the errors. Plan limits, the from address, the postal address, suppression, campaigns that pause when bounces or complaints climb.
- The keys. The same
Authorization: Bearerheader, the same five levels (read only, drafts only, send with approval, full access, signups only), the same regions. The authentication guide has them. - The rate limit. 300 requests a minute for each key, counted across REST and MCP together.
- The approvals. A send with approval key's sends, schedules and deletes wait for you on either.
- The price. Both come with every plan, the Free plan included. See pricing. Emails count the same.
Where they differ
| MCP server | REST API | |
|---|---|---|
| Who decides the next call | The assistant, each time | Your code, the same every time |
| Sign-in | ChatGPT, Claude and Grok Bot: you sign in to FlockStack and allow them, and pick a level. Claude Code, Codex and Cursor: an API key | An API key |
| What it can see | Only the tools the key's level can run | Every endpoint in the OpenAPI document; a call above the key's level answers 403 forbidden |
| When an approval is needed | A tool result, not an error, with status: "approval_required" |
202 Accepted with a Retry-After header and the same body |
| Waiting for the decision | The assistant reads get_approval_status |
Poll the status URL in the answer, or subscribe to the approval.decided webhook |
| A confirmation before sending | The tools that send are marked as ones that can't be undone, and say to ask first, so most clients ask you | None. Your code is the client |
| From a web page | Not used for this | A signups only key can call POST /api/v1/contacts from the browser |
| Reference | The tools on the MCP page | The API reference and OpenAPI 3.1 at /api/v1/openapi.json |
The transport differs too. MCP here is Streamable HTTP and stateless: every request carries a key or a token, with no session to keep. OAuth follows the MCP authorization spec, with PKCE. Access tokens last an hour and refresh tokens keep a connection for 90 days after its last use.
Pick by the job
| You want | Use | Why |
|---|---|---|
| To talk to ChatGPT, Claude or Grok Bot and have it run things | MCP, by signing in | No key to copy, and you choose what the app may do |
| A coding agent in your editor to draft and prepare issues | MCP with a key (Claude Code, Codex, Cursor) | One command or one config file |
| A job on a schedule that publishes or syncs | The API | The same calls each run, with no model deciding |
| Subscribers from another system, such as a CRM or a checkout | The API | A fixed mapping from your records to add_contact or import_contacts |
| A signup form on your own web page | The API, with a signups only key | The key can only add a contact, so it is safe in a web page |
| An assistant to draft and your code to continue after you approve | Both | See below |
The difference that matters: who can say yes
The two share the same approval queue. They do not share a conversation. On MCP, two layers can stop a send: your client may ask you before it runs a tool that sends, and FlockStack holds the request if the key is send with approval. On the API there is one layer. A script that calls POST /api/v1/campaigns/{id}/send with a full access key sends when it runs.
So the transport is not what makes a send safe. The key's level is, and the queue behind it. The agent safety guide is the reference. In short:
- Give an assistant send with approval, or drafts only. Start there.
- Keep full access for your own scripts on a server you control.
- If an agent has full access anyway, turn on Ask me before an agent sends for that newsletter, on the Approvals page. Then sends and deletes wait for you whatever the key's level.
A fully autonomous send is possible with a full access key and no switch. Nothing in this post needs one, and FlockStack's own guide keeps full access for your own scripts on a server you control.
Using both
A common split is an assistant that prepares and a program that follows through. Run the assistant on a drafts or send with approval key. Have it create the draft and ask to schedule it. Your own code, which holds a separate key, listens for the approval.decided webhook and does the next step when the status is approved: tag the audience, post the link, update your own records. You still read each request on the Approvals page before anything goes out.
To do the first half of that with Claude Code, follow the Claude Code guide. With several newsletters, give each agent a key for one newsletter.
What neither does
- Neither is a transactional email API. There is no endpoint for a one-off message to one address. Sending is to a newsletter's list, with a test email as the exception.
- Neither writes the issue. The assistant's model does that, or you do. FlockStack has a few small writing helpers, such as subject line suggestions, that run on a daily allowance.
- Neither makes an assistant right. An assistant can choose the wrong tool or the wrong input. The checks and the approval step are there for that. Read the draft before you approve.
- Neither avoids limits. One key gets 300 requests a minute, and each send action has an hourly limit of its own.
Sources
- The Model Context Protocol's introduction: MCP is an open-source standard for connecting AI applications such as Claude or ChatGPT to external systems: modelcontextprotocol.io, checked
- The MCP authorization specification: authorization uses OAuth 2.1, and a client sends the token in the Authorization header on every HTTP request: modelcontextprotocol.io, checked
- FlockStack's authentication documentation: key levels, regions, and the rate limit of 300 requests a minute across REST and MCP: flockstack.io, checked
- FlockStack's agent safety documentation: the approval answer over REST and over MCP, the approval.decided webhook and the per-newsletter switch: flockstack.io, checked
- FlockStack's MCP documentation: how each client connects, and which tools are marked as ones that can't be undone: flockstack.io, checked
Questions
- Is the MCP server a different product from the API?
- No. Both run the same actions as the dashboard, with the same inputs, checks and errors. Each endpoint of the API is a tool of the MCP server, named after the endpoint's operation ID.
- Is MCP safer than the API, or the other way round?
- Neither. What a caller can do is set by its key's level, and what waits for you is set by the approval queue, and both are the same on either. An MCP client may also ask you before it runs a tool that sends. A script has no such step.
- Do the MCP server and the API have separate rate limits?
- No. A key gets 300 requests a minute across REST and MCP together, and some actions have a limit of their own for each key and for the account.
- Does it cost more to use MCP?
- No. Both come with every plan, the Free plan included. The emails either one sends count toward your plan's emails in the same way.
- What is the difference between an email API and a newsletter API?
- An email API sends one message to one address on request. FlockStack's API works on a newsletter, with campaigns to a list, subscribers, segments, automations and reports. It has no endpoint for a one-off message to a single address; the closest is a test email, which goes to the account owner or to up to 10 addresses you name.
Start with a key
Create your account and a key on the API keys page. The same key works for the API and for the MCP clients that use keys.
Create an account and a key