[{"data":1,"prerenderedAt":36},["ShallowReactive",2],{"$f2ydb75ikpo8w3":3},{"href":4,"title":5,"description":6,"kind":7,"mark":8,"planned":9,"contributors":10,"provenance":8,"html":11,"headings":12},"\u002Fdocs\u002Ftools\u002Fpostmark","Postmark","Transactional email from your own Postmark account, through Postmark's MCP server, which you host.","integrates",null,false,[],"\u003Ch2 id=\"what-a-member-can-do\">What a member can do\u003C\u002Fh2>\n\u003Cp>With Postmark connected, a member can send email from your Postmark server, singly, in batches or from your\ntemplates; manage templates; search sent messages and bounces, and diagnose a delivery; and read your delivery\nstatistics. Which of these it has is what the server you host offers and what the task names.\u003C\u002Fp>\n\u003Cp>Name each Postmark tool a task needs, such as \u003Ccode>postmark.sendEmailWithTemplate\u003C\u002Fcode> and\n\u003Ccode>postmark.searchOutboundMessages\u003C\u002Fcode>, rather than all of Postmark: a tool the task does not name is refused, and a\ntask that can only send from a template cannot write an email of its own.\u003C\u002Fp>\n\u003Cp>This is for mail your company sends. A member's own Zero Human address, and the \u003Cstrong>Inbox\u003C\u002Fstrong> on its member page, only\nreceive.\u003C\u002Fp>\n\u003Ch2 id=\"who-connects-it\">Who connects it\u003C\u002Fh2>\n\u003Cp>Postmark offers no hosted MCP server. Its own server, \u003Ccode>@activecampaign\u002Fpostmark-mcp\u003C\u002Fcode>, runs next to whatever uses\nit, so to connect Postmark you run that server yourself, behind an HTTPS address that Zero Human OS calls with a\ntoken of your choosing. Your Postmark server token stays on your server; Zero Human OS only ever holds your bearer\ntoken.\u003C\u002Fp>\n\u003Cp>Mail goes out from your Postmark server, from a sender your Postmark account has confirmed: the one a call names,\nor the default sender you set on your server.\u003C\u002Fp>\n\u003Cp>Connect Postmark \u003Cstrong>on the task that sends\u003C\u002Fstrong>, not on a member, team, role or the enterprise. A connection on any of\nthose also reaches the \u003Ca href=\"\u002Fdocs\u002Fwork\u002Fchat\">chat\u003C\u002Fa> of every member it covers, where a send is a single approval away\nfrom going out without the task's skill, inputs or checks. A task's own connection never reaches chat.\u003C\u002Fp>\n\u003Ch2 id=\"what-waits-for-you\">What waits for you\u003C\u002Fh2>\n\u003Cp>Nothing sent through Postmark waits for you unless the task declares a gate on the tool that sends. To see each\nemail before it goes, gate that tool: the run waits with the exact message it would send, and nothing is sent until\nyou approve it on \u003Cstrong>Gates\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{ &quot;tool&quot;: &quot;postmark.sendEmailWithTemplate&quot;, &quot;owner&quot;: &quot;ceo&quot;, &quot;approval&quot;: &quot;specific&quot; }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>See \u003Ca href=\"\u002Fdocs\u002Fcontrol\u002Fgates\">Gates and tool scopes\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"setup\">Setup\u003C\u002Fh2>\n\u003Ch3 id=\"run-postmarks-mcp-server\">Run Postmark's MCP server\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Run \u003Ccode>@activecampaign\u002Fpostmark-mcp\u003C\u002Fcode>, the package published by Postmark's owner. A lookalike package without the\n\u003Ccode>@activecampaign\u002F\u003C\u002Fcode> scope was found copying mail it sent; never use it. It needs your Postmark \u003Cstrong>server API\ntoken\u003C\u002Fstrong>, a \u003Cstrong>default sender\u003C\u002Fstrong> your Postmark account has confirmed, and a \u003Cstrong>message stream\u003C\u002Fstrong> (\u003Ccode>outbound\u003C\u002Fcode> for\ntransactional mail).\u003C\u002Fli>\n\u003Cli>Postmark's server speaks MCP over standard input and output only. Put a bridge in front of it that serves it\nover MCP's \u003Cstrong>Streamable HTTP\u003C\u002Fstrong> transport, at a public HTTPS address, and refuses any request whose\n\u003Ccode>Authorization\u003C\u002Fcode> header is not \u003Ccode>Bearer &lt;your token&gt;\u003C\u002Fcode>. Choose a long random token.\u003C\u002Fli>\n\u003Cli>If your bridge can, offer only the tools your tasks need. What the bridge does not offer, no task can call.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"connect-it\">Connect it\u003C\u002Fh3>\n\u003Col>\n\u003Cli>In the portal, on \u003Cstrong>Tools\u003C\u002Fstrong>, choose \u003Cstrong>Add tool\u003C\u002Fstrong>. \u003Cstrong>Layer:\u003C\u002Fstrong> Task, and \u003Cstrong>Bind on:\u003C\u002Fstrong> the task that sends.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Kind:\u003C\u002Fstrong> MCP. \u003Cstrong>Tool type:\u003C\u002Fstrong> \u003Ccode>postmark\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>MCP server URL:\u003C\u002Fstrong> your bridge's address.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Auth:\u003C\u002Fstrong> Bearer token \u002F PAT, and your bearer token.\u003C\u002Fli>\n\u003Cli>On the task, name the Postmark tools it needs, and declare a gate on each one that sends.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Check it.\u003C\u002Fstrong> Run the task with your own address as the recipient. Approve the gate, and the run page shows the\ncall and Postmark's reply; the message appears in Postmark's \u003Cstrong>Activity\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"troubleshooting\">Troubleshooting\u003C\u002Fh2>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>What you see\u003C\u002Fth>\n\u003Cth>Why\u003C\u002Fth>\n\u003Cth>What to do\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>tool_not_bound:postmark\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>No Postmark connection reaches this run\u003C\u002Ftd>\n\u003Ctd>Bind it on this task, or at a layer the run reaches\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>The run's log says \u003Ccode>tool.not_offered\u003C\u002Fcode> for a Postmark tool\u003C\u002Ftd>\n\u003Ctd>Your bridge did not answer when the run started, or offers no tool by that name\u003C\u002Ftd>\n\u003Ctd>Check the bridge is reachable at its public address, and that it offers the tool by that name\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Calls fail with an auth error\u003C\u002Ftd>\n\u003Ctd>The bearer token in the binding is not the one your bridge expects\u003C\u002Ftd>\n\u003Ctd>Edit the binding and paste the token again\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Postmark refuses the sender\u003C\u002Ftd>\n\u003Ctd>The sender is not confirmed in your Postmark account\u003C\u002Ftd>\n\u003Ctd>Confirm the sender signature or domain in Postmark\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>A send goes out without an approval\u003C\u002Ftd>\n\u003Ctd>The task declares no gate on that tool\u003C\u002Ftd>\n\u003Ctd>Add a gate on it to the task\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n",[13,17,20,23,26,30,33],{"id":14,"text":15,"level":16,"planned":9},"what-a-member-can-do","What a member can do",2,{"id":18,"text":19,"level":16,"planned":9},"who-connects-it","Who connects it",{"id":21,"text":22,"level":16,"planned":9},"what-waits-for-you","What waits for you",{"id":24,"text":25,"level":16,"planned":9},"setup","Setup",{"id":27,"text":28,"level":29,"planned":9},"run-postmarks-mcp-server","Run Postmark's MCP server",3,{"id":31,"text":32,"level":29,"planned":9},"connect-it","Connect it",{"id":34,"text":35,"level":16,"planned":9},"troubleshooting","Troubleshooting",1791124519814]