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.
https://unofax.com/api/mcpConnect 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 mcp add --transport http unofax https://unofax.com/api/mcp{
"mcpServers": {
"unofax": {
"type": "http",
"url": "https://unofax.com/api/mcp"
}
}
}How a fax goes
- The assistant confirms the recipient's fax number with the user.
- It prepares the fax from the original file, and gets a private
reviewUrl. - It checks the status until the fax is converted and priced.
- The user opens
reviewUrl, checks the preview, enters an email and pays. Paying is what sends the fax.
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_fax | Takes the file the user attached and starts a fax. |
|---|---|
create_fax_upload | Reserves a fax and returns a signed link to upload the file to. |
finish_fax_upload | Starts converting an uploaded file, with any cover sheet. |
get_fax_status | Conversion, final price, preview, payment and delivery status. |
get_fax_info | Price 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
faxNumberstringRequiredThe recipient's fax number with+and country code, as the user confirmed it. Not the sender's number.fileobjectRequiredThe host's reference to the user's original attachment:download_urlandfile_id, withfile_nameandmime_typeif known.fileNamestringThe file's name with its extension, such ascontract.pdf. Needed whenfile.file_nameis missing.coverSheetobjectA 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 fromfaxNumber.
{
"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"
}
}
}
}{
"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.
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: application/octet-stream" \
--data-binary @contract.pdfget_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.
{
"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.
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_fax_info",
"arguments": {}
}
}{
"currency": "AUD",
"pricePerPageCents": 59,
"maxDocumentBytes": 104857600,
"maxPages": 300,
"supportedDialCodes": [
"1",
"44",
"61",
"81",
"..."
],
"websiteUrl": "https://unofax.com",
"instructions": "..."
}Limits
pagesUp to 300 pages a fax. The cover sheet does not count.sizeUp to 100 MiB a document.filesPDF, Word (.doc,.docx), TXT, PNG, JPG, GIF, WebP and HEIC.documentsOne document a fax. For several, send the user to the website, which combines up to 10 files.upload linkA signed upload URL expires after 15 minutes.rateUp 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.
CREATEDReserved, waiting for the upload to finish.CONVERTINGBeing converted to fax format. Usually a few seconds.CONVERTEDReady. pageCount, costCents and previewUrl are final. Waiting for the user to pay. Also reported as AWAITING_PAYMENT.PAYMENT_EXPIREDNot paid in time. Nothing was sent or charged.PAIDPaid, and queued to go out. Also reported as SENDING while the fax transmits.RETRYINGAn attempt did not go through, such as a busy line. It is retried automatically.ACTION_REQUIREDThe fax needs something from the sender before it can go on.SENTDelivered. The only status that confirms delivery.FAILEDCould not be delivered. See error.CANCELLEDCancelled 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 recipientThe number is malformed or goes somewhere unsupported. Confirm it with the user.file typeThe file name has no supported extension. Pass the original file, not a converted copy.file referenceThe 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. Checkget_fax_statusbefore retrying, so you don't create a second fax.rate limitToo 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,
reviewUrland 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.
- AI catalog
/.well-known/ai-catalog.json - llms.txt
/llms.txt