signal-mcp
PyPI
v1.36.0
Published by an unidentified publisher — no publish provenance and no public repository, so the publisher could not be verified and the source cannot be independently located.
Complete Signal MCP server and CLI via signal-cli
The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.
1. Threat score — 100 − 9.5 = 91. What the published surface and source actually contain:
| Points | What was found | Category |
|---|---|---|
| −9.5 | Description names a credential store the tool cannot reach ×2 MTC-INJ-SCHEMA-1 | injection |
2. Client adoption risk — 91 − 8 = 83. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:
| Points | Adoption-risk factor |
|---|---|
| −6 | capability blast radius (high) — client exposure if the model is manipulated |
| −2 | publisher verification (unlinked) — no provenance/repo link, but the shipped source was fully read |
Capability observations and info notes are shown under Findings but never scored.
Open any row's finding below for the file, line and evidence behind a deduction.
In the server's implementation (`src/signal_mcp/cli.py:483`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ragma: no cover subprocess.run([ "signal-cli", "-u", account, "daemon", f"--http", f"loc
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/signal_mcp/cli.py
In the server's implementation (`src/signal_mcp/client.py:185`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: .5) proc = subprocess.Popen( [ "signal-cli", "-u", self.account,
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/signal_mcp/client.py
In the server's implementation (`src/signal_mcp/config.py:46`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: JVM start) result = subprocess.run( ["signal-cli", "listAccounts"], capture_output=True, tex
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/signal_mcp/config.py
In the server's implementation (`src/signal_mcp/desktop.py:67`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ): result = subprocess.run( ["security", "find-generic-password", "-s", service, "-w"],
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/signal_mcp/desktop.py
Tool "get_unread" describes a credential store (SSH keys, cloud credentials, a keychain or an equivalent) that nothing in its input schema can address. A tool's interface is the honest statement of what it touches; prose that reaches past it is addressed to the model, not to a reader.
Evidence: Keychain
Fix: Remove the reference, or expose the target as an explicit, validated parameter so the client can see and consent to what the tool reads.
Location: tool get_unread · description
Tool "import_desktop" describes a credential store (SSH keys, cloud credentials, a keychain or an equivalent) that nothing in its input schema can address. A tool's interface is the honest statement of what it touches; prose that reaches past it is addressed to the model, not to a reader.
Evidence: Keychain
Fix: Remove the reference, or expose the target as an explicit, validated parameter so the client can see and consent to what the tool reads.
Location: tool import_desktop · description
Tool "set_webhook" takes a URL/host parameter "url" with no allowlist/pattern. An outbound-request tool with an unbounded destination enables SSRF and cloud-metadata access (e.g. 169.254.169.254).
Fix: Allowlist destinations or constrain the parameter; block private/link-local addresses server-side.
Location: tool set_webhook · inputSchema.properties.url
Each tool and what it can reach — statically extracted from the published source.
create_pollnetwork egressdelete_local_messagesnetwork egressdelete_messagenetwork egressedit_messagenetwork egressexport_messagesnetwork egresspin_messagenetwork egressprune_storenetwork egressreact_to_messagenetwork egressschedule_messagenetwork egresssend_attachmentnetwork egresssend_messagenetwork egresssend_message_request_responsenetwork egresssend_stickernetwork egressset_expiration_timernetwork egressset_typingnetwork egressset_webhooknetwork egresssubmit_rate_limit_challengenetwork egressterminate_pollnetwork egressunpin_messagenetwork egressvote_pollnetwork egressadd_deviceno sensitive capabilityadd_sticker_packno sensitive capabilityadmin_delete_messageno sensitive capabilityblock_contactno sensitive capabilitycancel_scheduled_messageno sensitive capabilityclear_local_storeno sensitive capabilitycreate_groupno sensitive capabilitydelete_group_messageno sensitive capabilityfind_contactno sensitive capabilityfinish_change_numberno sensitive capabilityget_attachmentno sensitive capabilityget_avatarno sensitive capabilityget_conversationno sensitive capabilityget_own_numberno sensitive capabilityget_profileno sensitive capabilityget_stickerno sensitive capabilityget_unreadno sensitive capabilityget_user_statusno sensitive capabilityget_webhookno sensitive capabilityimport_desktopno sensitive capabilityjoin_groupno sensitive capabilityleave_groupno sensitive capabilitylist_accountsno sensitive capabilitylist_attachmentsno sensitive capabilitylist_contactsno sensitive capabilitylist_conversationsno sensitive capabilitylist_devicesno sensitive capabilitylist_groupsno sensitive capabilitylist_identitiesno sensitive capabilitylist_scheduled_messagesno sensitive capabilitylist_sticker_packsno sensitive capabilitymark_as_unreadno sensitive capabilityreceive_directno sensitive capabilityreceive_messagesno sensitive capabilityremove_contactno sensitive capabilityremove_deviceno sensitive capabilityremove_pinno sensitive capabilityrun_scheduled_messagesno sensitive capabilitysearch_messagesno sensitive capabilitysend_contacts_syncno sensitive capabilitysend_group_attachmentno sensitive capabilitysend_group_messageno sensitive capabilitysend_group_stickerno sensitive capabilitysend_note_to_selfno sensitive capabilitysend_read_receiptno sensitive capabilitysend_sync_requestno sensitive capabilityset_pinno sensitive capabilitystart_change_numberno sensitive capabilitystore_statsno sensitive capabilitysync_desktopno sensitive capabilitytrust_identityno sensitive capabilityunblock_contactno sensitive capabilityupdate_accountno sensitive capabilityupdate_configurationno sensitive capabilityupdate_contactno sensitive capabilityupdate_deviceno sensitive capabilityupdate_groupno sensitive capabilityupdate_profileno sensitive capabilityupload_sticker_packno sensitive capabilityScan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.
| Version | Score | Findings | Engine | Scanned |
|---|---|---|---|---|
v1.36.0 latest |
B 83/100 | 7 | 1.13.0 | 2026-09-05 |
v1.35.1 |
B 83/100 | 7 | 1.13.0 | 2026-09-04 |
v1.31.0 |
B 83/100 | 6 | 1.13.0 | 2026-08-25 |
Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.
The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.
npx mcptrustchecker scan signal-mcp --online --registry pypi
Independent packages implementing the same tool, scanned with the same engine. Compare all 4 side by side →
MCP server for VC Deal Flow Signal — search, shortlist, compare, and predict startup engineering acceleration across 20 sectors. Transparent, citable funding-likelihood scores with full evidence chains. Commit velocity, contributor growth, and repo-expans
connect signal to mcp
MCP server for Signal messaging via signal-cli JSON-RPC
FDA device & vehicle recall risk for AI agents: recall history, MAUDE trend, risk score.
Open-source MCP server exposing Agent402.Tools' catalog — 500+ strong: 400+ self-hostable tools + 100 multi-tool skill packs (security-audit, trend-analysis, structured-scrape, decode-blob, forecasting-bake-off) for AI agents — browser, web search & answe
Zero-dependency MCP server that gives AI agents a self-updating project memory in AGENTS.md. Returns merge instructions instead of mutating state, so every change is a reviewable diff.
MCP Apps UI resources and server helpers for n8n
MCP server providing comprehensive access to BookStack knowledge management system
MCP server for tracking achievements with STAR methodology