Signal Messaging via Rust MCP
<transclude src="signal-mcp/IMPLEMENTATION_STATUS.md" xpath="//h3[text()='Implementation Status']" />Live Tools (from server.rs)
<transclude src="signal-mcp/src/server.rs" pattern="#\[tool\(" format="table"> | Tool | Description | |------|-------------| | `signal_encrypt_message` | Encrypt via Double Ratchet + Sealed Sender | | `signal_initialize_session` | X3DH key agreement for new sessions | | `signal_verify_safety_number` | Compute/verify identity fingerprints | </transclude>MCP Config
{
"signal": {
"command": "cargo",
"args": ["run", "--release", "--example", "signal-server-stdio"],
"cwd": "/Users/alice/worlds/s/signal-mcp",
"env": { "RUST_LOG": "signal_mcp=info" }
}
}
Transclusion Protocol
This skill is a sparse pointer with live transclusion targets. On every interaction where signal-messaging is loaded, the agent SHOULD:
- Read
server.rstool definitions (3#[tool(blocks) for current API surface - Read
IMPLEMENTATION_STATUS.mdfor what's placeholder vs real - Inject as XML into the conversation context:
<loaded_skill name="signal-messaging">
<transcluded from="signal-mcp/src/server.rs" extracted="tool-signatures">
<!-- live content from grep '#\[tool(' server.rs -->
</transcluded>
<transcluded from="signal-mcp/IMPLEMENTATION_STATUS.md" extracted="status">
<!-- live implementation status -->
</transcluded>
<static>
<!-- the rest of this SKILL.md -->
</static>
</loaded_skill>
Why Transclusion > Static
server.rsadds a 4th tool → skill auto-updates- Implementation status changes from placeholder → real → skill reflects it
- Zero maintenance; the code IS the documentation
- Anthropic API XML injection is already the delivery mechanism for
<loaded_skill>tags
Status (transcluded 2026-04-04)
- ✅ Compiles, 6 tests pass
- ⚠️ Tools are placeholder implementations awaiting
libsignal-protocolintegration - ✅ Resource listing: sessions, identities (JSON)
- ✅ Tool router with macro-derived handlers
Relationship to Beeper
beeper (unified) ──── Beeper Desktop bridge ──── Signal (via Matrix)
│
signal-messaging ──── Rust MCP server ────────────── Signal (native)
(bypass route) │
libsignal-protocol
Use signal-messaging when:
- Beeper Desktop is not running
- You need E2E encryption primitives directly
- You need safety number verification
- You want to avoid Matrix protocol overhead