ictfax-mcp
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ictfax-mcpShow me yesterday's fax transmissions and their statuses"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ictfax-mcp
A Model Context Protocol server for ICTFax, the open-source fax server built on the ICTCore framework by ICT Innovations.
It lets an AI assistant list fax transmissions and check their status, and — only when you turn writes on — upload a document and send a fax.
Install
npx -y ictfax-mcp # no install
npm install -g ictfax-mcpRequires Node.js 18 or newer.
Related MCP server: GotFreeFax MCP Server
Configure
Variable | Required | Default | |
| yes | ICTCore REST base, normally ending in | |
| yes | API account email (ICTCore logs in by email) | |
| yes | Password for that account | |
| no |
| Account id to send faxes from |
| no |
| Unlock upload/send (see Safety) |
| no |
| Per-request timeout |
| no |
| Skip TLS verification — self-signed test servers only |
Claude Desktop example
{
"mcpServers": {
"ictfax": {
"command": "npx",
"args": ["-y", "ictfax-mcp"],
"env": {
"ICTFAX_BASE_URL": "https://your-ictfax/api",
"ICTFAX_USERNAME": "admin@example.com",
"ICTFAX_PASSWORD": "your-password"
}
}
}
}Tools
Read tools are always available:
Tool | What it does |
| List fax transmissions (id, contact, status, direction) |
| Status of one transmission by id |
Write tools appear only when ICTFAX_MCP_ALLOW_WRITE=true:
Tool | What it does |
| Upload a local PDF as a fax document; returns a document_id |
| Send a local document as a fax to a number — dials a real number |
Safety
The server is read-only by default. Sending a fax dials a real number and can
cost money, so ictfax_upload_document and ictfax_send_fax are not registered at
all unless you set ICTFAX_MCP_ALLOW_WRITE=true.
How it connects
ICTFax runs on ICTCore, which authenticates with a JWT from POST /authenticate
(login by email) and reads it back from the Authorization: Bearer header. Sending
a fax is a short chain the server handles for you: upload the document (metadata
then raw bytes, which ICTFax converts to fax format), create the recipient and a
sendfax program, create the transmission and send it.
About
Built by Tahir Almas at ICT Innovations — the team behind ICTFax, ICTPBX, ICTContact, ICTDialer and the ICTCore framework these share. ICTFax is free and open source; learn more at ictfax.org.
MIT licensed. Issues and PRs welcome at github.com/ictinnovations/ictfax-mcp.
Available Tools
2 toolsictfax_get_fax_statusGet fax statusARead-only
Get one fax transmission by id: its status (processing, completed, failed), contact and pages. Poll this after sending a fax.
| Name | Required | Description | Default |
|---|---|---|---|
| transmission_id | Yes | The transmission id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds real context beyond that: the tool is intended for repeated polling and the observable state machine is processing/completed/failed, which tells the agent when to stop polling. It does not mention rate limits or eventual-consistency behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler. The resource and returned fields come first and the polling instruction closes it, so the agent gets the actionable cue immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description partially compensates by naming the returned fields (status, contact, pages) and the status values. It could say more about what happens for an unknown id (error vs empty), but for a one-parameter read tool this is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is documented as 'The transmission id.' The description's 'by id' restates the same idea without adding format, sourcing (where to obtain the id), or constraints. Baseline 3 applies when the schema carries the meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one fax transmission by id') and enumerates what is returned (status, contact, pages), which implicitly separates it from the sibling list tool. It stops short of naming ictfax_list_faxes as the alternative, so differentiation requires a small inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Poll this after sending a fax' gives a concrete trigger condition, which is the main thing an agent needs to know. There is no explicit when-not guidance or reference to the list tool as a fallback for browsing, keeping it just below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ictfax_list_faxesList fax transmissionsARead-only
List fax transmissions on the server (inbound and outbound) with their id, contact, status and direction. Start here to find a transmission id.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=true, so the safety profile is known. The description adds useful behavioral scope (inbound and outbound, included fields), but does not disclose any additional constraints such as pagination, sorting, or result limits. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. The core action and scope are front-loaded, and the user-guidance sentence adds value without padding. Every word contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list operation, the description covers the main purpose and even states the output fields (id, contact, status, direction). There is no output schema, so this field enumeration is valuable. The only minor gap is not explaining any possible pagination or size limits, but this is not critical given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and 100% schema description coverage, so there are no parameter semantics to explain. The baseline for no parameters is 4, and the description does not need to compensate for any schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "List fax transmissions on the server (inbound and outbound)" and details the returned fields (id, contact, status, direction). It also differentiates from the sibling tool by saying "Start here to find a transmission id," which positions this tool as the list/entry-point against ictfax_get_fax_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "Start here to find a transmission id" gives clear situational context for using this tool to obtain an ID, but it does not explicitly mention when to prefer the sibling tool ictfax_get_fax_status or provide exclusion criteria. Usage guidance is implied rather than fully detailed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.1- Changed
ictfax_get_fax_status3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / transmission_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / transmission_id / minimumAdded value: +-9007199254740991
2 tool updates
v0.1.0- First observed
ictfax_get_fax_status - First observed
ictfax_list_faxes
TDQS
Scored across 2 tools
The two tools target clearly different operations: listing transmissions versus fetching a single transmission by id. Their descriptions even specify the intended workflow order (list to find an id, then get status), leaving no room for misselection.
Both names follow a predictable ictfax_ prefix plus verb_noun structure (get_fax_status, list_faxes). The only minor wrinkle is the singular/plural split between 'fax' and 'faxes', which is natural but slightly uneven.
Two tools is very thin for a fax transmission server, and one of them exists only to support the other. There is no operation to actually send or manage a fax, making the surface feel incomplete rather than deliberately minimal.
The domain clearly includes sending faxes ('poll this after sending a fax'), yet no send, cancel, delete, or content-retrieval tool exists. Only read operations are exposed, so core fax lifecycle workflows will dead-end.
Maintenance
Related MCP Connectors
Send real faxes from AI assistants: PDF to any fax number, delivery status, pages left.
Send and receive faxes from any MCP-compatible AI assistant using the Fax.Plus API
Send, receive, and verify faxes from AI assistants and agents via FaxSeal.
Send, receive and track real faxes in the US and Canada from Claude, ChatGPT or Cursor.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI assistants to send real faxes through the FaxDrop API. Provides safeguards including rate limiting, dry-run mode, and audit logging for secure fax operations.3255 npm5MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to send free and paid faxes to US and Canada numbers, check fax status, and purchase prepaid credits, all without leaving the chat.MIT
- AlicenseNot gradedqualityDmaintenanceSend, receive, and verify faxes from AI assistants and agents via the Model Context Protocol.122 npmMIT

ictcontact-mcpofficial
AlicenseBqualityAmaintenanceEnables AI assistants to monitor outbound campaigns in ICTContact/ICTDialer, including listing campaigns, checking status, reading summaries and per-call results, and optionally starting and stopping campaigns when write access is enabled.4144 npm16MIT