Atlas / MCP servers / dmontgomery40 / Faxbot

FaxbotBLOCK

mcp/dmontgomery40/faxbot

Self-hosted, open source, fax-sending API. HIPAA compliant. This fax API includes MCP (Model Context Protocol) support for AI assistant integration.

Verdict
BLOCK
Grade
F
Trust score
32 /100
Exposed tools
2 1r · 1w · 0d
Transport
stdio · streamable-http
License
NOASSERTION
Stars
1
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Faxbot is a proprietary, self-hosted fax platform with a web Admin Console, a REST API, cloud and SIP providers, and integrations for AI assistants. It helps organizations send and receive documents, choose delivery routes, track costs, and deliver incoming documents to the inboxes staff already use.

This README describes the current source checkout. Published packages and deployed installations may have fewer features; the roadmap distinguishes implemented capabilities from planned work and experiments.

License

New Faxbot-owned work requires prior written permission from David Montgomery for use, modification, distribution, resale, or hosting. Contact [email protected] for permission. The setup instructions below are for authorized users. See LICENSE for the terms.

Earlier MIT releases retain their existing permissions, including material already released on public development branches. LICENSE-MIT preserves that notice; it does not license new proprietary additions. Third-party components keep their own licenses.

What Faxbot does

  • Send and receive faxes. Prepare PDF, TXT, and supported TIFF documents, track outbound jobs, and organize received faxes in mailboxes. Uncertain submissions wait for confirmation instead of being blindly se
Read from source at commit 3a8827d95331OBSERVED · 2026-10-11
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add faxbot-fax-decoder --env API_KEY=${API_KEY} --env FAXBOT_SMTP_PASSWORD=${FAXBOT_SMTP_PASSWORD} --env MCP_OAUTH_SUBJECT_KEYS_FILE=${MCP_OAUTH_SUBJECT_KEYS_FILE} --env OAUTH_AUDIENCE=${OAUTH_AUDIENCE} -- npx -y faxbot-fax-decoder
claude-desktop
{
  "mcpServers": {
    "faxbot-fax-decoder": {
      "command": "npx",
      "args": [
        "-y",
        "faxbot-fax-decoder"
      ],
      "env": {
        "API_KEY": "${API_KEY}",
        "FAXBOT_SMTP_PASSWORD": "${FAXBOT_SMTP_PASSWORD}",
        "MCP_OAUTH_SUBJECT_KEYS_FILE": "${MCP_OAUTH_SUBJECT_KEYS_FILE}",
        "OAUTH_AUDIENCE": "${OAUTH_AUDIENCE}"
      }
    }
  }
}
03

Exposed tools (2)

1 read · 1 write · 0 destructive.

ToolRiskDescription
OwnerreadEverything
send_faxwritereturn await _submit(resolve(ctx), to, fileName, _decode(fileContent), fileType, operationId)
04

Trust audit

BLOCKgrade F · trust 32/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (9 observation(s))
Network
declared (16 observation(s))
Shell
declared (7 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

CRITICALHard-coded secrets · secret.private_key · CWE-798, CWE-321
api/app/intake/sources/settings.py:260
or '-----BEGIN PRIVATE KEY-----' not in data['private_key']):
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
api/app/terminal.py:44
os.environ.copy() ... websocket
Why it matters. reads secrets in the same file that sends data out
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
scripts/get-status.sh:24
/.env" ... curl
Why it matters. reads secrets in the same file that sends data out
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
api/app/sip_network.py:62
METADATA_ADDRESS = ('169.254.169.254', 80)
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
api/alembic/env.py:15
schema = importlib.import_module(package + ".schema")
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
api/alembic/env.py:16
legacy = importlib.import_module(package + ".schema_legacy")
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
api/alembic/env.py:19
config.attributes["schema_configuration"] = importlib.import_module(package + ".schema_configuration")
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
api/alembic/env.py:20
config.attributes["schema_outbound"] = importlib.import_module(package + ".schema_outbound")
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
api/alembic/env.py:21
config.attributes["schema_access"] = importlib.import_module(package + ".schema_access")
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
api/admin_ui/src/api/types.ts:282
callback_url: string;
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
api/admin_ui/src/api/types.ts:330
callback_url?: string;
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
api/admin_ui/src/components/PluginConfigDialog.tsx:73
value={config.callback_url || ''}
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
api/app/server.py:31
os.environ.setdefault('FAXBOT_CONSOLE_ORIGINS', f'http://127.0.0.1:{arguments.port},http://localhost:{arguments.port}')
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
api/app/routing/analog.py:138
text = data.lstrip('')
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
api/app/routing/channel_peak.py:113
text = text.lstrip('')
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
api/app/routing/closures.py:112
text = text.lstrip('')
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
api/app/routing/origin_classes.py:173
first = str(text or '').lstrip('').splitlines()[0] if str(text or '').strip() else ''
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
api/app/routing/origin_classes.py:201
reader = csv.reader(io.StringIO(text.lstrip('')))
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
api/tests/test_access_context.py:43
'DATABASE_URL': 'postgresql://private-user:synthetic-password@private-host/private-database',
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
api/tests/test_config_values.py:68
'DATABASE_URL': 'postgresql://synthetic:[email protected]/faxbot',
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
api/tests/test_config_values.py:123
'DATABASE_URL': 'postgresql://operator:[email protected]/faxbot',
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
api/tests/test_config_views.py:83
'DATABASE_URL': 'postgresql://synthetic-user:[email protected]/faxbot?token=synthetic-query-secret',
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
api/admin_ui/src/__tests__/login.test.tsx:66
expect(backend.requestsTo('POST', '/auth/key-login')[0].body).toEqual({ api_key: 'fbk_live_scan_original' });
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
api/admin_ui/src/test/server.ts:89
['key_scan', { id: 'key_scan', token: 'fbk_live_scan_original', principal_id: 'p_scanner', name: 'Scanner', note: '',
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
api/tests/test_access_authentication.py:72
password = 'wrong-private-password'

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 3a8827d95331full audit observations/trust-audit/mcp-server/dmontgomery40__faxbot.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-113a8827d95331BLOCKF32first audit
06

Questions

What is the Faxbot MCP server?

Self-hosted, open source, fax-sending API. HIPAA compliant. This fax API includes MCP (Model Context Protocol) support for AI assistant integration.

What tools does Faxbot expose?

2 in total: 1 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is Faxbot safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (32/100) and found 4 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does Faxbot need?

It reads API_KEY, FAXBOT_SMTP_PASSWORD, MCP_OAUTH_SUBJECT_KEYS_FILE, OAUTH_AUDIENCE, OAUTH_ISSUER, OAUTH_JWKS_URL and OPENROUTER_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Faxbot run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as faxbot-fax-decoder.

How current is this page?

The grade is for one exact copy of the source (3a8827d95331), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement