unofax
MCP connector

Send a fax from your AI assistant

Add one URL to Claude, ChatGPT or any MCP client. Your assistant gets your original document ready to fax. You check the preview and pay on our website, so nothing is sent without you.

Overview

The connector is a remote MCP server over Streamable HTTP. It needs no account, sign-in or API key. Faxes cost the same as on the website, A$0.59 per page including GST, and the cover sheet is free.

Sending from your own code? The connector works from any MCP client, but each fax is paid for on our website. To send with no one in the loop, use the x402 API.
Server URL
https://unofax.com/api/mcp

Connect it

Leave authentication off wherever your client asks for it.

  • Claude: open Customize → Connectors, choose Add custom connector, name it unofax and paste the server URL. In a chat, turn unofax on from the tools menu.
  • ChatGPT: add a custom connector in developer mode with the server URL and no authentication, then turn it on in the chat.
  • Claude Code and other clients: add it as a remote HTTP server. Any client that takes custom MCP servers uses the same URL.
Claude Code
claude mcp add --transport http unofax https://unofax.com/api/mcp
.mcp.json
{
  "mcpServers": {
    "unofax": {
      "type": "http",
      "url": "https://unofax.com/api/mcp"
    }
  }
}

How a fax goes

  1. The assistant confirms the recipient's fax number with the user.
  2. It prepares the fax from the original file, and gets a private reviewUrl.
  3. It checks the status until the fax is converted and priced.
  4. The user opens reviewUrl, checks the preview, enters an email and pays. Paying is what sends the fax.
What the user says
Fax this signed form to +1 415 555 1212.
Add a cover sheet from Jane Smith to Acme Legal,
with the subject "Signed contract".

Tools

Assistants call these themselves. Results from prepare_fax, finish_fax_upload and get_fax_status include reviewUrl, the private page where the user checks the preview and pays, and instructions, which say what to do next.

prepare_faxTakes the file the user attached and starts a fax.
create_fax_uploadReserves a fax and returns a signed link to upload the file to.
finish_fax_uploadStarts converting an uploaded file, with any cover sheet.
get_fax_statusConversion, final price, preview, payment and delivery status.
get_fax_infoPrice per page, dialing codes and document limits.

prepare_fax

Takes a file reference from the host, such as an attachment in ChatGPT, fetches the original and starts the fax. The file is never retyped, rebuilt or sent as text. Each call creates a new fax, so an assistant calls it once. It does not charge or send.

Arguments

  • faxNumberstringRequired
    The recipient's fax number with + and country code, as the user confirmed it. Not the sender's number.
  • fileobjectRequired
    The host's reference to the user's original attachment: download_url and file_id, with file_name and mime_type if known.
  • fileNamestring
    The file's name with its extension, such as contract.pdf. Needed when file.file_name is missing.
  • coverSheetobject
    A free cover page, with the same fields as in the x402 API. An empty object adds a default cover. Leave it out for no cover. The recipient's fax comes from faxNumber.
TOOLprepare_fax
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "prepare_fax",
    "arguments": {
      "faxNumber": "+14155551212",
      "file": {
        "download_url": "https://files.example.com/contract.pdf",
        "file_id": "file_abc123",
        "file_name": "contract.pdf",
        "mime_type": "application/pdf"
      },
      "coverSheet": {
        "senderName": "Jane Smith",
        "recipientName": "Acme Legal",
        "subject": "Signed contract"
      }
    }
  }
}
structuredContent
{
  "jobId": "019d7a7f-a183-752d-9b3b-11511179033b",
  "reviewUrl": "https://unofax.com/?job=019d7a7f-a183-752d-9b3b-11511179033b",
  "currency": "AUD",
  "instructions": "Open reviewUrl to preview, enter an email and pay. Nothing is sent until payment. Only SENT confirms delivery. Use get_fax_status with this jobId to check progress; wait at least 5 seconds between checks.",
  "status": "CONVERTING",
  "canCancel": false,
  "faxNumber": "+14155551212"
}

Signed upload

For clients with no file references that can read the original file and make an HTTP request. Call create_fax_upload with faxNumber and fileName, PUT the unchanged bytes to uploadUrl, then call finish_fax_upload with jobId and any coverSheet.

Send the raw bytes, not JSON, base64 or multipart. Repeating finish_fax_upload is safe: it returns the job's status without creating another fax. If your client can do neither, ask the user to upload the file on the website.

PUTuploadUrl
curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @contract.pdf

get_fax_status

Takes jobId and returns the job's conversion, final price, preview, payment and delivery status. It does not pay or send. Wait at least 5 seconds between checks. costCents is in AUD cents.

CONVERTED
{
  "jobId": "019d7a7f-a183-752d-9b3b-11511179033b",
  "reviewUrl": "https://unofax.com/?job=019d7a7f-a183-752d-9b3b-11511179033b",
  "currency": "AUD",
  "instructions": "Open reviewUrl to preview, enter an email and pay. Nothing is sent until payment. Only SENT confirms delivery. Use get_fax_status with this jobId to check progress; wait at least 5 seconds between checks.",
  "status": "CONVERTED",
  "canCancel": false,
  "faxNumber": "+14155551212",
  "pageCount": 3,
  "costCents": 177,
  "previewUrl": "https://unofax.com/preview/019d7a7f-a183-752d-9b3b-11511179033b/contract.pdf?Expires=...&Signature=..."
}

get_fax_info

Takes no arguments, and returns the price per page, supported dialing codes and document limits. Some subdestinations are excluded; prepare_fax checks the full number.

TOOLget_fax_info
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "get_fax_info",
    "arguments": {}
  }
}
structuredContent
{
  "currency": "AUD",
  "pricePerPageCents": 59,
  "maxDocumentBytes": 104857600,
  "maxPages": 300,
  "supportedDialCodes": [
    "1",
    "44",
    "61",
    "81",
    "..."
  ],
  "websiteUrl": "https://unofax.com",
  "instructions": "..."
}

Limits

  • pages
    Up to 300 pages a fax. The cover sheet does not count.
  • size
    Up to 100 MiB a document.
  • files
    PDF, Word (.doc, .docx), TXT, PNG, JPG, GIF, WebP and HEIC.
  • documents
    One document a fax. For several, send the user to the website, which combines up to 10 files.
  • rate
    Up to 60 new faxes an hour from one address. Polling a job does not count.

Statuses

Treat a status not listed here as still in progress. Only SENT confirms delivery.

  • CREATED
    Reserved, waiting for the upload to finish.
  • CONVERTING
    Being converted to fax format. Usually a few seconds.
  • CONVERTED
    Ready. pageCount, costCents and previewUrl are final. Waiting for the user to pay. Also reported as AWAITING_PAYMENT.
  • PAYMENT_EXPIRED
    Not paid in time. Nothing was sent or charged.
  • PAID
    Paid, and queued to go out. Also reported as SENDING while the fax transmits.
  • RETRYING
    An attempt did not go through, such as a busy line. It is retried automatically.
  • ACTION_REQUIRED
    The fax needs something from the sender before it can go on.
  • SENT
    Delivered. The only status that confirms delivery.
  • FAILED
    Could not be delivered. See error.
  • CANCELLED
    Cancelled before it was sent.

Errors

Tool errors have no codes. They come back as a tool result with isError set, and text an assistant can act on.

  • invalid recipient
    The number is malformed or goes somewhere unsupported. Confirm it with the user.
  • file type
    The file name has no supported extension. Pass the original file, not a converted copy.
  • file reference
    The host's link could not be fetched. Get a fresh reference, or use the signed upload. Never fall back to retyped text.
  • job …
    A failure after the fax was created names its job. Check get_fax_status before retrying, so you don't create a second fax.
  • rate limit
    Too many faxes from this address. Try again next hour.

Safety

  • Preparing a fax never charges or sends it. Only the user's payment on the website does.
  • Assistants must never ask for card details. Payment happens on reviewUrl.
  • Job IDs, reviewUrl and file links are private: anyone holding one can see that fax. Don't log or share them.
  • The original file is always sent as it is, never retyped or rebuilt, so the fax matches what the user signed.

Discovery

Agents can find the connector from these files, without reading this page.