ictfax-mcp
OfficialClick on "Install 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: TCXC 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?
The description adds meaningful behavioral context beyond the readOnlyHint annotation by naming the possible statuses (processing, completed, failed) and framing this as a polling operation after sending. This clarifies the asynchronous nature of fax transmission without contradicting the annotations.
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 sentences contain all necessary information with no filler. The core action and scope are front-loaded, and the polling guidance follows naturally.
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 simple single-parameter read operation, the description is complete: it identifies the resource, explains what data will be returned, and tells the agent when to use it. The lack of an output schema is mitigated by the explicit list of returned content.
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 schema already describes transmission_id as 'The transmission id.' The description's 'by id' adds no new semantic meaning beyond what the schema provides, so the baseline score of 3 is appropriate.
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 states a specific verb and resource: 'Get one fax transmission by id,' and enumerates the content returned (status, contact, pages). It clearly distinguishes itself from the sibling listing tool by emphasizing a single transmission identified by id.
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 'Poll this after sending a fax' gives clear contextual guidance on when to call this tool. It does not explicitly contrast it with ictfax_list_faxes, so it stops short of full when-not-to-use guidance.
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.
TDQS
Each tool has a clear, separate purpose: one lists all transmissions, the other retrieves a single transmission by ID. There is no overlap or ambiguity between the two.
Both tools follow the same verb_noun pattern with a consistent ictfax_ prefix (list_faxes, get_fax_status). The naming is predictable and uniform.
With only two tools, the server feels minimal and borderline thin for a fax integration. It covers listing and status checking but lacks the breadth expected of a full service, though it could be acceptable for a narrowly scoped monitoring tool.
The tool surface covers only read-oriented operations (list and get status). There is no way to send, cancel, or manage faxes, which are core actions for a fax server, leaving significant functionality absent.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Send, receive, and verify faxes from AI assistants and agents via FaxSeal.
Send a fax from Claude, ChatGPT, or Cursor. Upload a PDF, pay, get delivery status.
Send free or paid faxes to US/Canada from Claude, ChatGPT, and other AI agents.
Send real faxes from AI assistants. Pay per fax ($1 + $0.25/page), no account or API key.
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.3225MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to interact with the TelecomsXChange wholesale telecom API for voice termination, SMS, DID management, eSIM, and account operations through 55 tools and 7 guided workflows using natural language.2MIT
- 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 gradedqualityBmaintenanceSend, receive, and verify faxes from AI assistants and agents via the Model Context Protocol.63MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ictinnovations/ictfax-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server