Tinysend

Write, send and follow your Tinysend newsletters, and sign up for things with your Tinysend address.

Hosted MCP Server

npx add-mcp 'https://mcp.tinysend.com/mcp'

Installs into Claude Code, Codex, Cursor and more

Documentation

The tools at https://mcp.tinysend.com/mcp (streamable HTTP), for ChatGPT, Claude and Muse.

  • Connect: add https://mcp.tinysend.com/mcp as a connector in ChatGPT or Claude; in Claude Code, claude mcp add --transport http tinysend https://mcp.tinysend.com/mcp.
  • Sign-in: OAuth 2.1 with S256 PKCE and dynamic client registration; mcp.tinysend.com is its own authorization server. The person signs in to Tinysend, picks the newsletters this connection may use, and whether it may send (scopes read, write and send). An API key is not accepted here: keys are for the REST API.
  • Read: reads, never changes anything. Write: changes the person’s newsletters, drafts or subscribers. Sensitive write: asks on the server first: the first call says what would happen and answers a confirm code, and only a second call with that code does it.
  • Answers: a sentence to say back, and the same facts as data (structuredContent). An error is an answer with isError and a sentence that says why and what to do.
  • The agent address: mail to name.label@tinysend.com is readable through the agent tools below; password resets and sign-in alerts never are.

Reads

list_newsletters

Use this when the person asks about their tinysend newsletters, or you need a newsletter’s id for another tool. Start here. Not for the posts of a newsletter: use list_posts.

  • Takes: Nothing
  • Answers: The newsletters this connection may use, each with its id, its subscribers, its address and when it last sent
  • Label: Read

list_posts

Use this when the person asks about a newsletter’s posts: what was sent, how issues did, which drafts wait. Not for one post’s full text: use read_post.

  • Takes: newsletter
  • Answers: A newsletter’s latest posts, newest first, drafts included: each with its id, its status, when it was sent and how many people opened and clicked
  • Label: Read

read_post

Use this when the person asks what a post says or how one sent post did, or before edit_draft to get its current words. Not for finding a post: use list_posts.

  • Takes: post
  • Answers: A post’s subject, its markdown, its status, when it was sent and its numbers (recipients, delivered, opened, clicked, bounced)
  • Label: Read

read_newsletter

Use this when the person asks how a newsletter is doing overall: its subscribers, its growth, its open and click rates. Not for one issue’s numbers: use read_post.

  • Takes: newsletter
  • Answers: A newsletter’s subscribers by status (active, waiting to confirm, unsubscribed, bounced), how many joined in the last week and month, and its opens and clicks across every send
  • Label: Read

find_subscribers

Use this when the person asks whether someone is subscribed, or who subscribed: search by part of an email, on one newsletter or all, by status (active, pending, unsubscribed, bounced). Not for counts: use read_newsletter.

  • Takes: query (optional), newsletter (optional), status (optional), limit (optional)
  • Answers: Subscribers whose email contains the text, each with the newsletter, their status, when they joined and when they last opened
  • Label: Read

get_agent_address

Use this when you are about to fill in a sign-up, booking or download form for the person and need an email address that is theirs. Type a new label per site into the form, then call wait_for_email. Not for sending mail: these tools only receive.

  • Takes: Nothing
  • Answers: The person’s address and how to make a label on it for one site: name.label@tinysend.com, with an example
  • Label: Read

wait_for_email

Use this when you have just typed a label address into a form and the site sends a code or a confirmation link. It waits up to timeout_seconds (default 60, at most 180, 0 checks once) and answers as soon as mail arrives; since defaults to now. A code is never guessed. Not for the person’s own mail: only labels are readable.

  • Takes: address (optional), timeout_seconds (optional), from_contains (optional), subject_contains (optional), since (optional)
  • Answers: The code or confirmation link in the mail that arrives at the label, with how sure the reading is, or that nothing arrived in time
  • Label: Read

list_agent_mail

Use this when the person asks what arrived at their labels, or you need an email id for get_agent_mail. Not for waiting on new mail: use wait_for_email.

  • Takes: address (optional), limit (optional)
  • Answers: The mail that arrived at the person’s labels, newest first, each with its id, sender, subject and time; a withheld message shows no subject
  • Label: Read

get_agent_mail

Use this when you need the code or link from a message that list_agent_mail or wait_for_email named. Not for finding mail: use list_agent_mail.

  • Takes: email_id
  • Answers: One message that arrived at a label: its sender, its subject, and the code and confirmation link read out of it
  • Label: Read

list_agent_aliases

Use this when the person asks which labels exist or which sites wrote to them. Not for the mail itself: use list_agent_mail.

  • Takes: Nothing
  • Answers: The labels on the person’s address: each address, its note, who made it, who first wrote to it, how many messages came and whether it is on
  • Label: Read

Writes

create_newsletter

Use this when the person asks to start a new newsletter. It has no subscribers yet and sends nothing. Not for writing an issue: use create_draft on an existing newsletter.

  • Takes: name, description (optional), request_id (optional)
  • Label: Write
  • Undo: None. The person deletes it in tinysend; nothing was sent

create_draft

Use this when the person asks you to write or save an issue, an announcement or a post for one of their newsletters. It only saves a draft and sends nothing. Not for sending: use send_post once the person asks.

  • Takes: newsletter, subject, markdown, request_id (optional)
  • Label: Write
  • Undo: delete_draft

edit_draft

Use this when the person asks to change a draft’s subject or words. Give the whole new markdown. Drafts only. Not for a post already sent: write a new draft instead.

  • Takes: post, subject (optional), markdown (optional)
  • Label: Write
  • Undo: edit_draft

send_post

Use this only when the person explicitly asks to send a draft to their subscribers. It emails every active subscriber at once and cannot be undone; say how many it reaches. Not for a test or a preview: show the draft with read_post.

  • Takes: post, confirm (optional)
  • Label: Sensitive write (asks first)
  • Undo: None. A sent email cannot be taken back

delete_draft

Use this when the person asks to delete or throw away a draft. Drafts only. Not for a sent post, which stays.

  • Takes: post, confirm (optional)
  • Label: Sensitive write (asks first)
  • Undo: None. The answer carries the subject and markdown, and create_draft makes it again

add_subscriber

Use this when the person asks to add someone to one of their newsletters. That someone gets an email to confirm and is subscribed only once they click it. Not for importing many addresses: the person imports a file in tinysend.

  • Takes: newsletter, email, name (optional), confirm (optional)
  • Label: Sensitive write (asks first)
  • Undo: remove_subscriber

remove_subscriber

Use this when the person asks to remove or unsubscribe someone from one of their newsletters, by their email. Not for finding them: use find_subscribers.

  • Takes: newsletter, email, confirm (optional)
  • Label: Sensitive write (asks first)
  • Undo: add_subscriber

create_agent_alias

Use this when the person wants a label to show in their tinysend account before it is used, with a note on what it is for. Optional: mail to a new label arrives without it. Not for reading mail: use wait_for_email.

  • Takes: label, note (optional), request_id (optional)
  • Label: Write
  • Undo: None. The person switches the label off in tinysend

Shapes

  • newsletter: a newsletter’s id, or its name exactly as list_newsletters shows it
  • post: a post’s id, as list_posts shows it
  • markdown: the post’s body in markdown: headings, lists, links, bold; images as![alt](https url)
  • confirm: the code the first call answered; pass it only after the person said yes
  • request_id: any id you choose for this create, up to 128 characters: the same call again with the same id answers what the first one made instead of making a second

Questions?

Contact us at hi@tinysend.com.