Asi signal-messaging

Signal Protocol MCP server (Rust). 3 tools — encrypt, initialize_session, verify_safety_number. Bypass route when Beeper Desktop is down.

install
source · Clone the upstream repo
git clone https://github.com/plurigrid/asi
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/plurigrid/asi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/asi/skills/signal-messaging" ~/.claude/skills/plurigrid-asi-signal-messaging && rm -rf "$T"
manifest: plugins/asi/skills/signal-messaging/SKILL.md
source content

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:

  1. Read
    server.rs
    tool definitions (3
    #[tool(
    blocks) for current API surface
  2. Read
    IMPLEMENTATION_STATUS.md
    for what's placeholder vs real
  3. 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.rs
    adds 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-protocol
    integration
  • ✅ 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