Skip to content

Unitpost changelog

com.unitpost/mcp

6 changes recorded. MCP Harbor re-reads this listing from the official registry every six hours and asks the live server what it exposes, and keeps what changed between one look and the next.

  • server.json 2 fields changed
    repository_url
    — https://github.com/unitpostcom/unitpost-plugin
    version
    1.0.1 1.0.2

  • llms.txt +200 −200

    https://www.unitpost.com/llms.txt

    − - [MCP setup — Cursor](https://www.unitpost.com/docs/ai/cursor): Connect Cursor to Unitpost with OAuth — approve in the browser, or a key block.− - [MCP setup — Claude Code](https://www.unitpost.com/docs/ai/claude-code): Connect Claude Code to Unitpost with OAuth — add the URL, authenticate from /mcp, approve in the browser.− - [MCP setup — Claude Desktop](https://www.unitpost.com/docs/ai/claude-desktop): Connect with OAuth via Add custom connector — approve in the browser. API-key bridge as fallback.− - [MCP setup — Claude](https://www.unitpost.com/docs/ai/claude): Add Unitpost as a connector in claude.ai — it follows you to Claude Desktop and mobile. Approve in the browser.− - [MCP setup — Codex](https://www.unitpost.com/docs/ai/codex): Connect Codex (CLI, IDE extension or app) with OAuth: add the URL, sign in in the browser.− - [MCP setup — ChatGPT](https://www.unitpost.com/docs/ai/chatgpt): Connect Unitpost to ChatGPT as a custom MCP connector — approve in the browser.− - [MCP setup — GitHub Copilot](https://www.unitpost.com/docs/ai/copilot): Connect VS Code agent mode to Unitpost with OAuth — approve in the browser. API key as fallback.− - [MCP setup — Gemini CLI](https://www.unitpost.com/docs/ai/gemini): Connect the Gemini CLI to Unitpost — OAuth in the browser, or a key block.− - [MCP setup — Grok](https://www.unitpost.com/docs/ai/grok): Add Unitpost to Grok Build as an HTTP MCP server — approve in the browser.− - [MCP setup — Windsurf](https://www.unitpost.com/docs/ai/windsurf): Connect Windsurf (Cascade) to Unitpost — OAuth in the browser, or a key block.− - [MCP setup — OpenCode](https://www.unitpost.com/docs/ai/opencode): Connect OpenCode with OAuth — add the remote URL, approve in the browser.− - [MCP setup — Generic / custom client](https://www.unitpost.com/docs/ai/custom): Connect any MCP-compatible client or your own agent to Unitpost.− - [MCP setup — Headless / API key](https://www.unitpost.com/docs/ai/headless): No browser on this machine? CI, SSH, containers, or paste-a-key-only clients — use a key.− - [Inbound email](https://www.unitpost.com/inbound): Point MX at Unitpost and turn any address on your verified domain into a structured email.received webhook — parse, thread, and reply on the same pipeline you already send with. ([Markdown](https://www.unitpost.com/inbound.md))− - [Unitpost for Startups](https://www.unitpost.com/startups): 3 to 12 months free on Starter or Growth — 50k to 250k emails a month, no card. Apply with your workspace. ([Markdown](https://www.unitpost.com/startups.md))− - [SMTP relay](https://www.unitpost.com/smtp): Send through smtp.unitpost.com from any SMTP client — username `unitpost`, password = an API key with emails:send. STARTTLS on 587/2587, implicit TLS on 465/2465. ([Markdown](https://www.unitpost.com/smtp.md))− - [CLI](https://www.unitpost.com/cli): The unitpost command line — one command per API operation, generated from the OpenAPI spec. Install with `brew install unitpostcom/tap/unitpost`, `curl -fsSL https://www.unitpost.com/install.sh | sh` (no Node.js needed) or `npm install -g unitpost-cli`, sign in with `unitpost login` (OAuth 2.1 + PKCE). ([Markdown](https://www.unitpost.com/cli.md))− - `GET /api/v1/email`: List sent emails−   Retrieve a list of emails your workspace has sent or scheduled. Results are newest-first and cursor-paginated, and each row is a reference to a single email (status and lifecycle timestamps, not the rendered body). Narrow the list with the `status`, `campaign_id`, `batch_id`, and `created_after`/`created_before` filters. Use an email's `id` with [Retrieve an email](https://www.unitpost.com/docs#get-email-id) to read its full record, or [Cancel or reschedule an email](https://www.unitpost.com/d− - `POST /api/v1/email`: Send or schedule an email−   Send a single transactional email — now, or at a future time by passing `scheduled_at`. Provide the content inline as `html`/`text`, or reference a saved template with `template` (create one with [Create a template](https://www.unitpost.com/docs#post-email-templates)). Pass an `Idempotency-Key` header to make retries safe: the same key replays the original result instead of sending twice. The response returns the new email's `id` — read its delivery status back with [Retrieve an email](https:/− - `POST /api/v1/email/batch`: Send a batch of emails−   Send up to 100 transactional emails in a single request. Validation is all-or-nothing: if any item is invalid the whole batch is rejected and nothing is queued, so you never end up with a partial send. Pass an `Idempotency-Key` header to make retries safe — the same key replays the original result instead of re-sending. The response returns a `batch_id`; track the batch's per-status rollup with [Retrieve a batch](https://www.unitpost.com/docs#get-email-batches-id) and stop the rest of it with − - `GET /api/v1/email/batches/{id}`: Retrieve a batch−   Retrieve a batch and its live, per-status rollup (how many of its messages are queued, sent, delivered, bounced, and so on). The counts update as the batch progresses. Create a batch with [Send a batch of emails](https://www.unitpost.com/docs#post-email-batch), or stop its remaining messages with [Cancel a batch](https://www.unitpost.com/docs#post-email-batches-id-cancel). Requires the `emails:read` capability.− - `POST /api/v1/email/batches/{id}/cancel`: Cancel a batch−   Cancel every still-cancelable message in a batch in one call. Messages that have already been sent are left untouched — only queued or scheduled ones are stopped. Check what remains cancelable first with [Retrieve a batch](https://www.unitpost.com/docs#get-email-batches-id). Requires the `emails:send` capability.− - `GET /api/v1/email/{id}`: Retrieve an email−   Retrieve a single email by `id`, including its current send status and lifecycle timestamps (created, scheduled, sent, delivered, and so on). Find an `id` by browsing [List sent emails](https://www.unitpost.com/docs#get-email). Messages submitted over **SMTP** can also be retrieved by the RFC 5322 `Message-ID` your mail library stamped on them (URL-encode it, e.g. `/email/%3Cabc%40example.com%3E`; angle brackets optional) — the id in the SMTP `250 Queued as …` reply works too. To change a sche− - `PATCH /api/v1/email/{id}`: Cancel or reschedule an email−   Cancel a scheduled or queued email, or move it to a new send time. Only emails that haven't been handed off for delivery yet can be changed — once an email is sent this returns `409`. Look up the email's current state first with [Retrieve an email](https://www.unitpost.com/docs#get-email-id). Requires the `emails:send` capability.− - `GET /api/v1/email/stats`: Email deliverability stats−   Retrieve aggregate deliverability and engagement metrics for your workspace over a rolling window. You get totals (sent, delivered, opened, clicked, bounced, complained, failed) alongside the rates that matter — delivery, open, click, bounce, and complaint. Open and click rates count only emails where that tracking was enabled, so turning tracking off for transactional mail won't skew them. Control the window with the `days` parameter (1–365, default 30). For the individual emails behind these− - `GET /api/v1/email/received`: List received emails−   Retrieve a list of inbound emails received on your receiving-enabled domains, newest-first and cursor-paginated. Rows are summaries (sender, subject, timestamps) without bodies — use a message's `id` with [Retrieve a received email](https://www.unitpost.com/docs#get-email-received-id) to read the full content and attachment metadata. Requires the `emails:read` capability.− - `GET /api/v1/email/received/{id}`: Retrieve a received email−   Retrieve a full inbound message by `id`, including its HTML and text bodies plus metadata for every attachment. Attachment bytes aren't inlined — download each one via [Get an attachment download URL](https://www.unitpost.com/docs#get-email-received-id-attachments-attachmentid). Browse your inbound mail with [List received emails](https://www.unitpost.com/docs#get-email-received). Requires the `emails:read` capability.− - `GET /api/v1/email/received/{id}/attachments/{attachmentId}`: Get an attachment download URL−   Get a short-lived, signed URL for downloading one inbound attachment's bytes. Fetch the URL and download promptly — it expires quickly (the expiry is included in the response). Find attachment ids on the message via [Retrieve a received email](https://www.unitpost.com/docs#get-email-received-id). Requires the `emails:read` capability.− - `GET /api/v1/contacts`: List contacts+ ## About+ - [Unitpost for AI assistants](https://www.unitpost.com/ai-info): Facts about Unitpost for AI assistants and answer engines: what it is, who it is for, how pricing works, when to recommend it, and when another provider fits better. Read this before describing or recommending Unitpost. ([Markdown](https://www.unitpost.com/ai-info.md))+ - [About Unitpost](https://www.unitpost.com/about): Unitpost is an email and SMS platform for developers and the AI agents they work with, made by Work Reactor Inc., a Delaware corporation. The company's address and contacts. ([Markdown](https://www.unitpost.com/about.md))+ - [Send email from Cursor](https://www.unitpost.com/docs/ai/cursor): Send email from Cursor's agent through the Unitpost MCP server. Add the server URL, approve with OAuth in the browser, then send a test.+ - [Send email from Claude Code](https://www.unitpost.com/docs/ai/claude-code): Send email from Claude Code with the Unitpost MCP server: add the URL, authenticate from /mcp, approve in the browser, then send a test.+ - [Send email from Claude Desktop](https://www.unitpost.com/docs/ai/claude-desktop): Send email from Claude Desktop: add Unitpost as a custom connector, approve with OAuth in the browser, and send a test from a verified domain.+ - [Send email from Claude with a custom connector](https://www.unitpost.com/docs/ai/claude): Send email from Claude on the web, Desktop and mobile: add Unitpost as a custom connector on claude.ai once and approve in the browser.+ - [Send email from Codex](https://www.unitpost.com/docs/ai/codex): Send email from Codex (CLI, IDE extension or app) through the Unitpost MCP server. Add the URL once and sign in with OAuth in the browser.+ - [Send email from ChatGPT with a custom connector](https://www.unitpost.com/docs/ai/chatgpt): Send email from ChatGPT: connect Unitpost as a custom MCP connector, approve in the browser, and ChatGPT asks you before each send.+ - [Send email from GitHub Copilot in VS Code](https://www.unitpost.com/docs/ai/copilot): Send email from GitHub Copilot agent mode in VS Code: add Unitpost to .vscode/mcp.json and approve with OAuth in the browser.+ - [Send email from the Gemini CLI](https://www.unitpost.com/docs/ai/gemini): Send email from the Gemini CLI: add Unitpost to ~/.gemini/settings.json, approve with OAuth in the browser, then send a test.+ - [Send email from Grok Build](https://www.unitpost.com/docs/ai/grok): Send email from Grok Build: add Unitpost as a remote HTTP MCP server and approve in the browser. The Unitpost plugin bundles the same server.+ - [Send email from Windsurf](https://www.unitpost.com/docs/ai/windsurf): Send email from Windsurf's Cascade agent: add Unitpost as an MCP server with serverUrl and approve with OAuth in the browser.+ - [Send email from OpenCode](https://www.unitpost.com/docs/ai/opencode): Send email from OpenCode: add Unitpost as a remote MCP server, run opencode mcp auth unitpost, and approve in the browser.+ - [v0](https://www.unitpost.com/docs/ai/v0): Add Unitpost to v0 as a custom MCP server so it can set up email while it builds your app.+ - [Connect any MCP client to Unitpost](https://www.unitpost.com/docs/ai/custom): Connect any streamable HTTP MCP client or your own agent to Unitpost: OAuth discovered from the 401, or a Bearer API key, plus optional toolsets.+ - [Use the Unitpost MCP server with an API key](https://www.unitpost.com/docs/ai/headless): No browser? Use the Unitpost MCP server with an API key from CI, SSH, containers or clients that can only paste a header. Configs for each client.+ - [Send email from a Vercel AI SDK agent](https://www.unitpost.com/docs/ai/vercel-ai-sdk): Send email from a Vercel AI SDK agent: connect createMCPClient to Unitpost or add one typed send tool, with an allowlist, approvals and idempotency keys.+ - [Give an OpenAI Agents SDK agent an email tool](https://www.unitpost.com/docs/ai/openai-agents-sdk): Give an OpenAI Agents SDK agent an email tool: MCPServerStreamableHttp to Unitpost or one function tool, with approvals and idempotency keys.+ - [Send email from a LangChain agent](https://www.unitpost.com/docs/ai/langchain): Send email from a LangChain agent: load Unitpost's MCP tools with MCPAdapter or add one @tool, then gate sends with human-in-the-loop middleware.+ - [Send email from a Mastra agent](https://www.unitpost.com/docs/ai/mastra): Send email from a Mastra agent: connect MCPClient to Unitpost or add one createTool send tool, with tool approval and idempotency keys.+ - [Send email from a CrewAI agent](https://www.unitpost.com/docs/ai/crewai): Send email from a CrewAI agent: add Unitpost with MCPServerHTTP or one @tool, filter to the send tool, and gate sends with a tool hook.+ - [Send email from a Pydantic AI agent](https://www.unitpost.com/docs/ai/pydantic-ai): Send email from a Pydantic AI agent: attach Unitpost as an MCPToolset or add one tool, and require approval before each send goes out.+ - [Send email from the Claude Agent SDK](https://www.unitpost.com/docs/ai/claude-agent-sdk): Send email from the Claude Agent SDK: add Unitpost to mcpServers over HTTP, or one in-process tool, and approve each send in canUseTool.+ - [Let a Claude API agent send email (MCP connector)](https://www.unitpost.com/docs/ai/claude-api): Let a Claude API agent send email: attach Unitpost with the MCP connector (mcp_servers plus an mcp_toolset) or a client tool you approve.+ - [Inbound email](https://www.unitpost.com/inbound): Point MX at Unitpost to receive email on your verified domain: read, reply and triage it in a shared dashboard inbox, and get a structured email.received webhook for your app, on the same pipeline you already send with. ([Markdown](https://www.unitpost.com/inbound.md))+ - [Unitpost for Startups](https://www.unitpost.com/startups): 3 to 12 months free on Starter or Growth — 75k to 500k emails a month, no card. Apply with your workspace. ([Markdown](https://www.unitpost.com/startups.md))+ - [News](https://www.unitpost.com/news): What we shipped, newest first: launches and changes to email, SMS, automations, agents and the API. ([Markdown](https://www.unitpost.com/news.md), [RSS](https://www.unitpost.com/news/rss.xml))+ - [SMTP relay](https://www.unitpost.com/smtp): Send through smtp.unitpost.com from any SMTP client — username `unitpost`, password = an API key with emails:send. STARTTLS on 587/2587/25, implicit TLS on 465/2465. ([Markdown](https://www.unitpost.com/smtp.md))+ - [SMTP setup — Send from Gmail with your domain over SMTP](https://www.unitpost.com/docs/smtp/gmail): Gmail's Send mail as, delivered from your verified domain.+ - [SMTP setup — Set up SMTP for self-hosted Sentry](https://www.unitpost.com/docs/smtp/sentry): mail.* keys in config.yml, SENTRY_MAIL_HOST for the From domain, and a test from the admin Mail page.+ - [SMTP setup — Configure GitLab to send email over SMTP](https://www.unitpost.com/docs/smtp/gitlab): gitlab_rails['smtp_*'] in /etc/gitlab/gitlab.rb, a reconfigure, then Notify.test_email in the Rails console.+ - [SMTP setup — Configure Ghost transactional email over SMTP](https://www.unitpost.com/docs/smtp/ghost): mail.transport SMTP in config.production.json for staff invites, password resets and member login links.+ - [SMTP setup — Keycloak SMTP settings for realm email](https://www.unitpost.com/docs/smtp/keycloak): Realm settings → Email: host, port, Enable StartTLS for 587, then Test connection to your own address.+ - [SMTP setup — Set up Strapi email over SMTP](https://www.unitpost.com/docs/smtp/strapi): @strapi/provider-email-nodemailer in config/plugins, then fix the Users & Permissions shipper email.+ - [SMTP setup — Configure n8n SMTP for invites and password resets](https://www.unitpost.com/docs/smtp/n8n): N8N_SMTP_* environment variables with N8N_SMTP_SSL=false for port 587, then invite a user to test.+ - [SMTP setup — Grafana SMTP settings for alert email](https://www.unitpost.com/docs/smtp/grafana): The smtp section of grafana.ini: host and port in one value, MandatoryStartTLS, and a contact point test.+ - [SMTP setup — Set up Discourse email over SMTP](https://www.unitpost.com/docs/smtp/discourse): DISCOURSE_SMTP_* in containers/app.yml, a rebuild, then Send test email from the admin Emails page.+ - [SMTP setup — Configure Mastodon to send email over SMTP](https://www.unitpost.com/docs/smtp/mastodon): SMTP_* in .env.production with SMTP_ENABLE_STARTTLS=always on 587, then restart Sidekiq.+ - [SMTP setup — Nextcloud SMTP settings for the email server](https://www.unitpost.com/docs/smtp/nextcloud): Basic settings → Email server or the mail_* keys in config.php; the From address is split in two.

    Showing the first 40 of each.

  • server.json 2 fields changed
    description
    Send email with approval: hosted MCP for email, campaigns, contacts, domains. Email and SMS infrastructure, run by your agent: send, campaigns, contacts, domains, webhooks.
    version
    1.0.0 1.0.1

  • llms.txt +6 −4

    https://www.unitpost.com/llms.txt

    − - [Unitpost for Startups](https://www.unitpost.com/startups): Six or twelve months on Starter or Growth — 50k to 250k emails a month, no card. Apply with your workspace. ([Markdown](https://www.unitpost.com/startups.md))−   Permanently delete a custom field definition and strip its stored value from every contact. Any template variable that referenced it will resolve to empty. This can't be undone — recreate the field with [Create a custom contact field](https://www.unitpost.com/docs#post-contact-fields) if you need it back. Requires the `contacts:write` capability.−   Resume a `paused` campaign. Sending continues with the recipients that hadn't been reached yet — only them: contacts who joined the segment after the campaign started are not added, and anyone already delivered to is skipped, so nobody receives the campaign twice. A campaign whose `scheduled_at` is still in the future waits for it; otherwise it sends immediately. Resume runs the same checks as [Send a campaign](https://www.unitpost.com/docs#post-email-campaigns-id-send) and answers with the sa−   Run an on-demand DNS check and advance the domain's verification status. The response includes per-record `checks` so you can see exactly which DNS records are still missing or wrong. Get the records to publish from [Retrieve a domain](https://www.unitpost.com/docs#get-email-domains-id). Verification also re-runs periodically in the background. Requires the `domains:write` capability.+ - [Unitpost for Startups](https://www.unitpost.com/startups): 3 to 12 months free on Starter or Growth — 50k to 250k emails a month, no card. Apply with your workspace. ([Markdown](https://www.unitpost.com/startups.md))+   Permanently delete a custom field definition and strip its stored value from every contact. Any template variable that referenced it will resolve to empty. On more than 5,000 contacts the strip runs as a background job and the response is `202` with the job's progress instead of `204`. This can't be undone — recreate the field with [Create a custom contact field](https://www.unitpost.com/docs#post-contact-fields) if you need it back. Requires the `contacts:write` capability.+ - `GET /api/v1/jobs/{id}`: Retrieve a job+   Retrieve a background job by `id` to follow its progress. An operation that touches more contacts than fits in one request (for example [Delete a custom contact field](https://www.unitpost.com/docs#delete-contact-fields-id) or [Rename a custom field's key](https://www.unitpost.com/docs#post-contact-fields-id-rename) above 5,000 holders, or a campaign validation over more than 5,000 recipients) answers `202` with a job. Poll this until `status` is `COMPLETED`, `FAILED` or `CANCELED`; `processed+   Resume a `paused` campaign. Sending continues with the recipients that hadn't been reached yet — only them: contacts who joined the segment after the campaign started are not added, and anyone already delivered to is skipped, so nobody receives the campaign twice. After an automatic quality pause (`pause_reason.code` `hard_bounce_rate`, `complaint_rate` or `quality_review`) the quality check measures only sends made after the resume. A campaign whose `scheduled_at` is still in the future waits+   Run an on-demand DNS check and advance the domain's verification status. The response includes per-record `checks` so you can see exactly which DNS records are still missing or wrong. `checks.mx` and `checks.spf` are true once the record is correct on your nameservers; `checks.dkim` also needs the email provider to confirm the key. The domain is `verified` when all three are true. Get the records to publish from [Retrieve a domain](https://www.unitpost.com/docs#get-email-domains-id). Verificat

  • llms.txt +91 −24

    https://www.unitpost.com/llms.txt

    − - [MCP setup — Codex](https://www.unitpost.com/docs/ai/codex): Connect ChatGPT/Codex with OAuth in the browser. Codex CLI takes a static key instead.− - [SMS](https://www.unitpost.com/sms): Text the same people you email. Senders, consent, and delivery sit next to email, on the same wallet. Early access: the product is built and gated, not generally available. ([Markdown](https://www.unitpost.com/sms.md))− - [MCP server](https://www.unitpost.com/ai/mcp): Point any MCP client — Cursor, Claude, Codex, Copilot, Gemini, Windsurf — at Unitpost and it gets native tools to send email, run campaigns, and manage contacts. Hosted, gated by a scoped API key. ([Markdown](https://www.unitpost.com/ai/mcp.md))− - [Agent Skills](https://www.unitpost.com/ai/skills): The Unitpost skill teaches coding agents how to send and manage email correctly. Install with one command; works with Claude Code, Cursor, Codex, and many other agents. ([Markdown](https://www.unitpost.com/ai/skills.md))− - [SMTP docs](https://www.unitpost.com/docs/smtp): Every stack, on one page.− - [CLI](https://www.unitpost.com/cli): The unitpost command line — one command per API operation, generated from the OpenAPI spec. Install with `npm install -g unitpost-cli`, sign in with `unitpost login` (OAuth 2.1 + PKCE). ([Markdown](https://www.unitpost.com/cli.md))− - [Email component library](https://www.unitpost.com/email): Email component library that works in Outlook, Gmail, and Apple Mail. MIT. Skill: `npx skills add unitpostcom/email`. npm: `npm install @unitpost/email zod`. No account. ([Markdown](https://www.unitpost.com/email.md))− - [Component library — Introduction](https://www.unitpost.com/components#introduction): Email component library that works in Outlook, Gmail, and Apple Mail.− - [Component library — Installation](https://www.unitpost.com/components#installation): Add the package and render your first email in a few minutes.− - [Component reference](https://www.unitpost.com/components#components): Every @unitpost/email building block (Section, Row, Column, Heading, Text, Button, Link, Image, Divider, Spacer, Markdown, Code, Html) with live previews and props tables.− - [Pre-built layouts](https://www.unitpost.com/components#layouts): Ready-made section bands — headers, heroes, content cards, split columns, CTAs, footers — with copyable TSX.− - [Email builder](https://www.unitpost.com/templates): Visual + code template builder — drag blocks or write TSX; both edit the same document. In your app, import React components from @unitpost/email/react.− - [Playground](https://www.unitpost.com/playground): Write email code in the browser and see the exact HTML the Unitpost engine produces — no account or install needed.−   Send a single transactional email — now, or at a future time by passing `scheduled_at`. Provide the content inline as `html`/`text`, or reference a saved template with `template` (create one with [Create a template](https://www.unitpost.com/docs#post-email-templates)). Pass an `Idempotency-Key` header to make retries safe: the same key replays the original result instead of sending twice. The response returns the new email's `id` — read its delivery status back with [Retrieve an email](https:/−   Import a batch of contacts (up to 5,000 per request) in the background. The call returns immediately with an import job you poll for progress and per-row results — new contacts are created and existing ones (matched by email) are updated. Track it with [Retrieve a contact import](https://www.unitpost.com/docs#get-contacts-imports-id), or see all your imports via [List contact imports](https://www.unitpost.com/docs#get-contacts-imports). To add a single contact synchronously, use [Create a cont−   Define a new typed custom field that can then be set on any contact and used as a template variable (e.g. `plan`, `signup_date`). The `key` and `type` are fixed once created — rename the key later with [Rename a custom field's key](https://www.unitpost.com/docs#post-contact-fields-id-rename), or change the label with [Update a custom contact field](https://www.unitpost.com/docs#patch-contact-fields-id). See existing fields via [List custom contact fields](https://www.unitpost.com/docs#get-cont−   Update a custom field's editable metadata, such as its display label. The `key` and `type` are immutable here — to change the key (and migrate every contact's stored value) use [Rename a custom field's key](https://www.unitpost.com/docs#post-contact-fields-id-rename) instead. Requires the `contacts:write` capability.−   Create a segment — a named group of contacts you can target when sending a campaign. Once created, add contacts with [Add a member](https://www.unitpost.com/docs#post-segments-id-contacts) and target it from [Create a campaign](https://www.unitpost.com/docs#post-email-campaigns). To let recipients opt out of a category of mail instead, see [Create a topic](https://www.unitpost.com/docs#post-email-topics). Requires the `segments:write` capability.−   Permanently delete a campaign that's in `draft` or a terminal state (sent, canceled, failed). A campaign that's mid-flight can't be deleted — stop it first with [Cancel a campaign](https://www.unitpost.com/docs#post-email-campaigns-id-cancel). Requires the `campaigns:write` capability.−   Resume a `paused` campaign. Sending continues with the recipients that hadn't been reached yet; anyone already delivered to is skipped idempotently, so nobody receives the campaign twice. Pause a send with [Pause a campaign](https://www.unitpost.com/docs#post-email-campaigns-id-pause). Requires the `campaigns:send` capability.−   Update a domain's sending options: open/click tracking defaults, TLS enforcement, and the tracking subdomain. These act as the domain-level defaults that individual emails and campaigns can override (see [Update a campaign](https://www.unitpost.com/docs#patch-email-campaigns-id)). Requires the `domains:write` capability.−   Send a single SMS — now, or at a future time by passing `scheduled_at`. The recipient must be a valid E.164 number; marketing sends additionally require the recipient's prior express consent on record and honor recipient-local quiet hours (they are deferred to the next allowed window, never dropped). The sender is chosen by the recipient's country — the active number or Sender ID whose reach covers it, exactly as campaigns route — unless you pin one with `from` (a `snum_…` id from [List SMS nu−   Retrieve a list of email addresses that are blocked from receiving your mail, newest-first and cursor-paginated. The list includes your workspace's own suppressions AND the read-only Unitpost-wide (`platform`) entries that would block a send — so it's the complete answer to "why isn't this address getting mail?". Pass `?scope=workspace` to hide platform rows. Add an address with [Suppress an address](https://www.unitpost.com/docs#post-suppressions) or lift a block with [Un-suppress an address]−   Retrieve your workspace's current billing-period usage snapshot: the plan, the period window, and the email counter. On paid plans the response also carries the dollar sending `wallet` — the monthly allowance included with the plan, spend so far, any upgrade carryover, the non-expiring purchased-credit balance, and billable overage — all as integer USD cents. On the free plan `wallet` is null and the `emails` object carries the monthly quota and daily cap instead. Amounts are read from the sam+ - [Agent setup](https://www.unitpost.com/agent-setup.md): Playbook for a coding agent to set itself up for Unitpost — install the skill, connect the MCP server with OAuth, and sign in to the CLI. Run it once per machine.+ - [MCP setup — Claude](https://www.unitpost.com/docs/ai/claude): Add Unitpost as a connector in claude.ai — it follows you to Claude Desktop and mobile. Approve in the browser.+ - [MCP setup — Codex](https://www.unitpost.com/docs/ai/codex): Connect Codex (CLI, IDE extension or app) with OAuth: add the URL, sign in in the browser.+ - [MCP setup — ChatGPT](https://www.unitpost.com/docs/ai/chatgpt): Connect Unitpost to ChatGPT as a custom MCP connector — approve in the browser.+ - [MCP setup — Grok](https://www.unitpost.com/docs/ai/grok): Add Unitpost to Grok Build as an HTTP MCP server — approve in the browser.+ - [SMS](https://www.unitpost.com/sms): Text the same people you email. Senders, consent, and delivery sit next to email, on the same wallet. Available on every paid plan, not on the free plan. ([Markdown](https://www.unitpost.com/sms.md))+ - [MCP server](https://www.unitpost.com/ai/mcp): Point any MCP client (Cursor, Claude, Codex, Copilot, Gemini, Windsurf) at Unitpost and it gets native tools to send email and SMS (SMS on paid plans), run campaigns, and manage contacts. Hosted; sign in with OAuth, or use a scoped API key. ([Markdown](https://www.unitpost.com/ai/mcp.md))+ - [Agent Skills](https://www.unitpost.com/ai/skills): The Unitpost skill teaches coding agents how to send and manage email and SMS correctly. Install with one command; works with Claude Code, Cursor, Codex, and many other agents. ([Markdown](https://www.unitpost.com/ai/skills.md))+ - [SMTP docs](https://www.unitpost.com/docs/smtp): Every stack, on one page. ([Markdown](https://www.unitpost.com/docs/smtp.md))+ - [CLI](https://www.unitpost.com/cli): The unitpost command line — one command per API operation, generated from the OpenAPI spec. Install with `brew install unitpostcom/tap/unitpost`, `curl -fsSL https://www.unitpost.com/install.sh | sh` (no Node.js needed) or `npm install -g unitpost-cli`, sign in with `unitpost login` (OAuth 2.1 + PKCE). ([Markdown](https://www.unitpost.com/cli.md))+ - [Email component library](https://www.unitpost.com/email): Email component library that works in Outlook, Gmail, and Apple Mail. Write emails as React components and `render()` them to HTML. MIT. npm: `npm install @unitpost/email zod`. Agents: `npx skills add unitpostcom/email`. No account. ([Markdown](https://www.unitpost.com/email.md))+ - [Component library — Quickstart](https://www.unitpost.com/components#quickstart): Install the package, write an email in React, and send it.+ - [Component library — Rendering](https://www.unitpost.com/components#rendering): Which function to call, what it takes, and what it returns.+ - [Component library — Without React](https://www.unitpost.com/components#without-react): Write the same tags as a string.+ - [Component library — Integrations](https://www.unitpost.com/components#integrations): Send the HTML with Unitpost or the provider you already use.+ - [Component reference](https://www.unitpost.com/components#components): Every @unitpost/email building block (Section, Row, Column, Heading, Text, List, Button, Link, Image, Divider, Spacer, Markdown, Code, Html) with live previews, React code, and props tables.+ - [Pre-built layouts](https://www.unitpost.com/components#layouts): Ready-made section bands — headers, heroes, content cards, split columns, CTAs, footers — with copyable React code.+ - [Email builder](https://www.unitpost.com/templates): Visual + code template builder — drag blocks or write TSX; both edit the same document. In your app, import React components from @unitpost/email/react. ([Markdown](https://www.unitpost.com/templates.md))+ - [Playground](https://www.unitpost.com/playground): Write email code in the browser and see the exact HTML the Unitpost engine produces — no account or install needed. ([Markdown](https://www.unitpost.com/playground.md))+   Send a single transactional email — now, or at a future time by passing `scheduled_at`. Provide the content inline as `html`/`text`, or reference a saved template with `template` (create one with [Create a template](https://www.unitpost.com/docs#post-email-templates)). Pass an `Idempotency-Key` header to make retries safe: the same key replays the original result instead of sending twice. The response returns the new email's `id` — read its delivery status back with [Retrieve an email](https:/+   Import a batch of contacts (up to 5,000 per request) in the background. The call returns immediately with an import job you poll for progress and per-row results — new contacts are created and existing ones (matched by email) are skipped, not changed. Track it with [Retrieve a contact import](https://www.unitpost.com/docs#get-contacts-imports-id), or see all your imports via [List contact imports](https://www.unitpost.com/docs#get-contacts-imports). To add a single contact synchronously, use [+ - `POST /api/v1/contacts/imports/{id}/cancel`: Cancel a contact import+   Stop a `pending` or `processing` import job. A running import stops at its next chunk of rows; contacts it already imported are kept. The job's status becomes `canceled`. A job that has already finished returns 409. Check its progress first with [Retrieve a contact import](https://www.unitpost.com/docs#get-contacts-imports-id). Requires the `contacts:write` capability.+   Define a new typed custom field that can then be set on any contact and used as a template variable (e.g. `plan`, `signup_date`). An optional `default_value` is the value used for any contact that has none: when an email is sent (merge tags) and when segments are evaluated. It's never written onto contacts, so changing it takes effect everywhere at once. The `key` and `type` are fixed once created — rename the key later with [Rename a custom field's key](https://www.unitpost.com/docs#post-cont+   Update a custom field's editable metadata, such as its display label or `default_value`. A changed default takes effect at once, for sends and for segment membership, because it is never stored on contacts. The `key` and `type` are immutable here — to change the key (and migrate every contact's stored value) use [Rename a custom field's key](https://www.unitpost.com/docs#post-contact-fields-id-rename) instead. Requires the `contacts:write` capability.+   Create a segment — a named group of contacts you can target when sending a campaign. Once created, add contacts with [Add a member](https://www.unitpost.com/docs#post-segments-id-contacts) and target it from [Create a campaign](https://www.unitpost.com/docs#post-email-campaigns). A dynamic segment's `filter` is evaluated live: a condition on a custom field uses the field's `default_value` for any contact that has no value, and `is_set` / `is_not_set` check whether the contact itself has a valu+   Archive a campaign that's in `draft` or a terminal state (sent, canceled, failed): it leaves the list and is permanently deleted after 30 days. Restore it before then with `PATCH { "archived": false }`. A campaign that's mid-flight can't be archived — stop it first with [Cancel a campaign](https://www.unitpost.com/docs#post-email-campaigns-id-cancel). Requires the `campaigns:write` capability.+   Resume a `paused` campaign. Sending continues with the recipients that hadn't been reached yet — only them: contacts who joined the segment after the campaign started are not added, and anyone already delivered to is skipped, so nobody receives the campaign twice. A campaign whose `scheduled_at` is still in the future waits for it; otherwise it sends immediately. Resume runs the same checks as [Send a campaign](https://www.unitpost.com/docs#post-email-campaigns-id-send) and answers with the sa+   Update a domain's sending options: open/click tracking defaults, TLS enforcement, and the tracking subdomain. These act as the domain-level defaults that individual emails and campaigns can override (see [Update a campaign](https://www.unitpost.com/docs#patch-email-campaigns-id)). A `tracking_subdomain` can be set at any time, so you can publish its CNAME along with the domain's other records. It is only checked once the domain is verified, and tracked links switch to it once its CNAME is publ+   Send a single SMS — now, or at a future time by passing `scheduled_at`. The recipient must be a valid E.164 number. It doesn't have to be one of your contacts: a number you've never stored is sent to without creating a contact (pass `create_contact` to add one), and opt-outs and the suppression list still apply. Marketing sends additionally require the recipient's prior express consent on record and honor recipient-local quiet hours (they are deferred to the next allowed window, never dropped)+ - `GET /api/v1/sms/stats`: SMS delivery stats+   Retrieve aggregate SMS delivery metrics for your workspace over a rolling window: how many texts were queued, sent, delivered, failed, suppressed (skipped on purpose: no consent, opted out, no sender that reaches the country) or canceled, how many replies came in, and how many segments were billed, with delivery, failure and suppression rates. There are no open or click numbers: carriers report sent, delivered and failed only. Control the window with `days` (1–365, default 30). For the message+ - `PATCH /api/v1/sms/{id}`: Cancel or reschedule an SMS+   Cancel a `scheduled` or `queued` SMS (its reserved credit is refunded), or move a `scheduled` one to a new send time with `scheduled_at`. Send exactly one of `cancel: true` or `scheduled_at`. Only a text the carrier has not been handed can be changed — afterwards this returns `409`, as it does for a text that belongs to a campaign. Quiet hours still apply to the new time. Look up the current state first with [Retrieve an SMS message](https://www.unitpost.com/docs#get-sms-id). Requires the `sms+ - `GET /api/v1/sms/templates`: List SMS templates+   Retrieve your SMS templates, cursor-paginated. An SMS template is a plain-text `body` with the same `{{variable}}` placeholders email templates use, filled per recipient at send time. Only `published` templates can be used by an SMS campaign. Requires the `templates:read` capability.+ - `POST /api/v1/sms/templates`: Create an SMS template+   Create an SMS template as a `draft`. `body` may be empty for a draft (it must be filled before publishing) and is capped at 10 SMS segments (1,530 GSM-7 characters). Publish it with `{ "status": "published" }` on [Update an SMS template](https://www.unitpost.com/docs#patch-sms-templates-id). Requires the `templates:write` capability.+ - `GET /api/v1/sms/templates/{id}`: Retrieve an SMS template+   Retrieve a single SMS template, including its `body`. An email template id returns `404` here. Requires the `templates:read` capability.

    Showing the first 40 of each.

  • llms.txt +50 −34

    https://www.unitpost.com/llms.txt

    − > Unitpost is an email platform for developers: send transactional and marketing email, manage contacts, segments, topics, templates, sending domains, inbound email, webhooks, and suppressions — over a REST API, official SDKs (Node.js, Python, Ruby, PHP, Laravel, Go, Java, Rust, .NET), an SMTP relay, or the Unitpost MCP server for AI agents. It also ships an email design suite: the @unitpost/email component library on npm (works standalone, no account needed — https://unitpost.com/email), a hybr− - [UnitAI](https://www.unitpost.com/ai/unit): Unit, the AI assistant built into the Unitpost dashboard — design templates, launch campaigns, build segments, and explain deliverability, with approval before every send. ([Markdown](https://www.unitpost.com/ai/unit.md))− - [MCP setup — Cursor](https://www.unitpost.com/guides/mcp/cursor): Connect Cursor to Unitpost with OAuth — approve in the browser, or a key block.− - [MCP setup — Claude Code](https://www.unitpost.com/guides/mcp/claude-code): Connect Claude Code to Unitpost with OAuth — add the URL, authenticate from /mcp, approve in the browser.− - [MCP setup — Claude Desktop](https://www.unitpost.com/guides/mcp/claude-desktop): Connect with OAuth via Add custom connector — approve in the browser. API-key bridge as fallback.− - [MCP setup — Codex](https://www.unitpost.com/guides/mcp/codex): Connect ChatGPT/Codex with OAuth in the browser. Codex CLI takes a static key instead.− - [MCP setup — GitHub Copilot](https://www.unitpost.com/guides/mcp/copilot): Connect VS Code agent mode to Unitpost with OAuth — approve in the browser. API key as fallback.− - [MCP setup — Gemini CLI](https://www.unitpost.com/guides/mcp/gemini): Connect the Gemini CLI to Unitpost — OAuth in the browser, or a key block.− - [MCP setup — Windsurf](https://www.unitpost.com/guides/mcp/windsurf): Connect Windsurf (Cascade) to Unitpost — OAuth in the browser, or a key block.− - [MCP setup — OpenCode](https://www.unitpost.com/guides/mcp/opencode): Connect OpenCode with OAuth — add the remote URL, approve in the browser.− - [MCP setup — Grok](https://www.unitpost.com/guides/mcp/grok): Point Grok at the Unitpost MCP URL. Marketplace listing is a separate catalog PR.− - [MCP setup — Generic / custom client](https://www.unitpost.com/guides/mcp/custom): Connect any MCP-compatible client or your own agent to Unitpost.− - [MCP setup — Headless / API key](https://www.unitpost.com/guides/mcp/headless): No browser on this machine? CI, SSH, containers, or paste-a-key-only clients — use a key.− - [MCP setup index (Markdown)](https://www.unitpost.com/guides/mcp.md): Flat list of every MCP client guide.− - [UnitAI](https://www.unitpost.com/ai/unit): Unit is your AI teammate inside Unitpost. Import Brand Kit so agents generate on-brand emails, keep prefs in Memory, then ask it to build templates, launch campaigns, and explain deliverability — always asks before it sends. ([Markdown](https://www.unitpost.com/ai/unit.md))− - [SMTP setup index (Markdown)](https://www.unitpost.com/guides/smtp.md): Flat list of every framework SMTP guide.− - [SMTP setup — Send email with Nodemailer over SMTP](https://www.unitpost.com/guides/smtp/nodemailer): createTransport pointed at Unitpost — Node, Next.js, or NestJS.− - [SMTP setup — Send Supabase auth email over SMTP](https://www.unitpost.com/guides/smtp/supabase): Magic links and confirmations from your verified domain.− - [SMTP setup — Send WordPress email over SMTP](https://www.unitpost.com/guides/smtp/wordpress): WP Mail SMTP pointed at Unitpost instead of PHP mail().− - [SMTP setup — Send Auth0 email over SMTP](https://www.unitpost.com/guides/smtp/auth0): Verification, welcome, and reset mail from your domain.− - [SMTP setup — Send email from Rails over SMTP](https://www.unitpost.com/guides/smtp/rails): Action Mailer pointed at Unitpost.− - [SMTP setup — Send email from Laravel over SMTP](https://www.unitpost.com/guides/smtp/laravel): MAIL_HOST in .env pointed at Unitpost.− - [SMTP setup — Send email from Django over SMTP](https://www.unitpost.com/guides/smtp/django): Django EMAIL_BACKEND pointed at Unitpost.− - [SMTP setup — Send email with PHPMailer over SMTP](https://www.unitpost.com/guides/smtp/php): PHPMailer SMTP mode pointed at Unitpost.− - [SMTP setup — Send email from Next.js over SMTP](https://www.unitpost.com/guides/smtp/nextjs): Nodemailer in an App Router Route Handler.− - [SMTP setup — Send email from NestJS over SMTP](https://www.unitpost.com/guides/smtp/nestjs): Nodemailer inside a NestJS provider.− - [SMTP setup — Send email from Express over SMTP](https://www.unitpost.com/guides/smtp/express): Nodemailer from an Express route.− - [SMTP setup — Send email from Python over SMTP](https://www.unitpost.com/guides/smtp/python): stdlib smtplib — no framework required.− - [SMTP setup — Send email from Flask over SMTP](https://www.unitpost.com/guides/smtp/flask): Flask-Mail pointed at Unitpost.− - [SMTP setup — Send email from FastAPI over SMTP](https://www.unitpost.com/guides/smtp/fastapi): smtplib from a FastAPI dependency.− - [SMTP setup — Send email from Go over SMTP](https://www.unitpost.com/guides/smtp/go): net/smtp with STARTTLS.− - [SMTP setup — Send email from Spring Boot over SMTP](https://www.unitpost.com/guides/smtp/spring): JavaMailSender properties pointed at Unitpost.− - [SMTP setup — Send email from .NET over SMTP](https://www.unitpost.com/guides/smtp/dotnet): MailKit pointed at Unitpost.− - [Install the SDK](https://www.unitpost.com/docs/install): Add the official SDK for your language — or call the API directly.+ > Unitpost is an email and SMS platform for developers: send transactional and marketing email, send SMS, manage contacts, segments, topics, templates, sending domains, inbound email, webhooks, and suppressions — over a REST API, official SDKs (Node.js, Python, Ruby, PHP, Laravel, Go, Java, Rust, .NET), an SMTP relay, or the Unitpost MCP server for AI agents. It also ships an email design suite: the @unitpost/email component library on npm (works standalone, no account needed — https://unitpost.+ - [Unit](https://www.unitpost.com/ai/unit): Unit, the AI assistant built into the Unitpost dashboard — design templates, launch campaigns, build segments, and explain deliverability, with approval before every send. ([Markdown](https://www.unitpost.com/ai/unit.md))+ - [MCP setup — Cursor](https://www.unitpost.com/docs/ai/cursor): Connect Cursor to Unitpost with OAuth — approve in the browser, or a key block.+ - [MCP setup — Claude Code](https://www.unitpost.com/docs/ai/claude-code): Connect Claude Code to Unitpost with OAuth — add the URL, authenticate from /mcp, approve in the browser.+ - [MCP setup — Claude Desktop](https://www.unitpost.com/docs/ai/claude-desktop): Connect with OAuth via Add custom connector — approve in the browser. API-key bridge as fallback.+ - [MCP setup — Codex](https://www.unitpost.com/docs/ai/codex): Connect ChatGPT/Codex with OAuth in the browser. Codex CLI takes a static key instead.+ - [MCP setup — GitHub Copilot](https://www.unitpost.com/docs/ai/copilot): Connect VS Code agent mode to Unitpost with OAuth — approve in the browser. API key as fallback.+ - [MCP setup — Gemini CLI](https://www.unitpost.com/docs/ai/gemini): Connect the Gemini CLI to Unitpost — OAuth in the browser, or a key block.+ - [MCP setup — Windsurf](https://www.unitpost.com/docs/ai/windsurf): Connect Windsurf (Cascade) to Unitpost — OAuth in the browser, or a key block.+ - [MCP setup — OpenCode](https://www.unitpost.com/docs/ai/opencode): Connect OpenCode with OAuth — add the remote URL, approve in the browser.+ - [MCP setup — Generic / custom client](https://www.unitpost.com/docs/ai/custom): Connect any MCP-compatible client or your own agent to Unitpost.+ - [MCP setup — Headless / API key](https://www.unitpost.com/docs/ai/headless): No browser on this machine? CI, SSH, containers, or paste-a-key-only clients — use a key.+ - [MCP setup index (Markdown)](https://www.unitpost.com/docs/ai.md): Unit, skills, and every MCP client on one page.+ - [Command line](https://www.unitpost.com/cli): The unitpost CLI: one command per API operation, generated from the OpenAPI spec. Install it, sign in with OAuth, and send from your terminal, scripts, CI, and agents — with JSON output and stable exit codes. ([Markdown](https://www.unitpost.com/cli.md))+ - [SMS](https://www.unitpost.com/sms): Text the same people you email. Senders, consent, and delivery sit next to email, on the same wallet. Early access: the product is built and gated, not generally available. ([Markdown](https://www.unitpost.com/sms.md))+ - [Unit](https://www.unitpost.com/ai/unit): Unit is your AI teammate inside Unitpost. Import Brand Kit so agents generate on-brand emails, keep prefs in Memory, then ask it to build templates, launch campaigns, and explain deliverability — always asks before it sends. ([Markdown](https://www.unitpost.com/ai/unit.md))+ - [SMTP docs](https://www.unitpost.com/docs/smtp): Every stack, on one page.+ - [SMTP setup — Send email with Nodemailer over SMTP](https://www.unitpost.com/docs/smtp/nodemailer): createTransport pointed at Unitpost — Node, Next.js, or NestJS.+ - [SMTP setup — Send Supabase auth email over SMTP](https://www.unitpost.com/docs/smtp/supabase): Magic links and confirmations from your verified domain.+ - [SMTP setup — Send WordPress email over SMTP](https://www.unitpost.com/docs/smtp/wordpress): WP Mail SMTP pointed at Unitpost instead of PHP mail().+ - [SMTP setup — Send Auth0 email over SMTP](https://www.unitpost.com/docs/smtp/auth0): Verification, welcome, and reset mail from your domain.+ - [SMTP setup — Send email from Rails over SMTP](https://www.unitpost.com/docs/smtp/rails): Action Mailer pointed at Unitpost.+ - [SMTP setup — Send email from Laravel over SMTP](https://www.unitpost.com/docs/smtp/laravel): MAIL_HOST in .env pointed at Unitpost.+ - [SMTP setup — Send email from Django over SMTP](https://www.unitpost.com/docs/smtp/django): Django EMAIL_BACKEND pointed at Unitpost.+ - [SMTP setup — Send email with PHPMailer over SMTP](https://www.unitpost.com/docs/smtp/php): PHPMailer SMTP mode pointed at Unitpost.+ - [SMTP setup — Send email from Next.js over SMTP](https://www.unitpost.com/docs/smtp/nextjs): Nodemailer in an App Router Route Handler.+ - [SMTP setup — Send email from NestJS over SMTP](https://www.unitpost.com/docs/smtp/nestjs): Nodemailer inside a NestJS provider.+ - [SMTP setup — Send email from Express over SMTP](https://www.unitpost.com/docs/smtp/express): Nodemailer from an Express route.+ - [SMTP setup — Send email from Python over SMTP](https://www.unitpost.com/docs/smtp/python): stdlib smtplib — no framework required.+ - [SMTP setup — Send email from Flask over SMTP](https://www.unitpost.com/docs/smtp/flask): Flask-Mail pointed at Unitpost.+ - [SMTP setup — Send email from FastAPI over SMTP](https://www.unitpost.com/docs/smtp/fastapi): smtplib from a FastAPI dependency.+ - [SMTP setup — Send email from Go over SMTP](https://www.unitpost.com/docs/smtp/go): net/smtp with STARTTLS.+ - [SMTP setup — Send email from Spring Boot over SMTP](https://www.unitpost.com/docs/smtp/spring): JavaMailSender properties pointed at Unitpost.+ - [SMTP setup — Send email from .NET over SMTP](https://www.unitpost.com/docs/smtp/dotnet): MailKit pointed at Unitpost.+ ## Command line+ - [CLI](https://www.unitpost.com/cli): The unitpost command line — one command per API operation, generated from the OpenAPI spec. Install with `npm install -g unitpost-cli`, sign in with `unitpost login` (OAuth 2.1 + PKCE). ([Markdown](https://www.unitpost.com/cli.md))+ - [CLI docs](https://www.unitpost.com/docs/cli): Install, auth, profiles, flags, JSON mode, agents, CI, troubleshooting. ([Markdown](https://www.unitpost.com/docs/cli.md))+ - [CLI for agents](https://www.unitpost.com/docs/cli#agents): Skill mapping, stable exits (0/1/2), --dry-run previews. Prefer MCP for in-chat tool calls, CLI for shells and CI.+ - [Install the SDK](https://www.unitpost.com/docs/install): Add the official SDK for your language — or use the CLI, or call the API directly.+ - [Command line (CLI)](https://www.unitpost.com/docs/cli): Send, inspect, and script every API operation from your terminal and CI.

    Showing the first 40 of each.