Skip to main content

Configuration

Two numbers: account vs operator

signal-mcp separates the number it runs as from the number it talks to:

  • account — the Signal number the signal-cli daemon is logged in as (its -a). Every message is sent from this number.
  • operator — the human the agent serves. The send ("text me") tool messages this number, and in channel mode it's the default sender the agent listens to. This is who the agent talks to.

If you don't set --account, it defaults to --operator: the agent runs as you and messages you — Note to Self, the right setup for a personal machine. Set them to different values when the agent has its own number:

# Personal machine — account == operator == you (Note to Self)
signal-mcp --operator +15551234567

# Dedicated agent — sends FROM the agent number TO you
signal-mcp --account +353871760709 --operator +15551234567 --transport stdio

These are distinct from the allowlists, which are security gates — not addresses the agent sends to.

Command-line arguments

Every argument has an environment-variable equivalent (SIGNAL_MCP_ prefix); the flag wins when both are set.

ArgumentEnv varDefaultDescription
--operator (required)SIGNAL_MCP_OPERATORE.164 number of the human the agent serves (who it messages / listens to).
--accountSIGNAL_MCP_ACCOUNT(= --operator)E.164 number the MCP runs as (the daemon's -a); messages are sent from it.
--transportSIGNAL_MCP_TRANSPORTsseTransport: sse or stdio (use stdio for Claude Desktop/Code).
--rpc-hostSIGNAL_MCP_RPC_HOST127.0.0.1Host of the signal-cli daemon JSON-RPC interface.
--rpc-portSIGNAL_MCP_RPC_PORT7583Port of the signal-cli daemon JSON-RPC interface.
--channelSIGNAL_MCP_CHANNELfalseEnable Claude Channel mode (forces stdio).
--prefixSIGNAL_MCP_PREFIX(none)Only forward messages starting with this prefix (channel mode); stripped before delivery.
--trusted-recipientSIGNAL_MCP_TRUSTED_RECIPIENTS(none)Outbound allowlist — numbers/group ids the agent may message. Repeatable flag; comma-separated env var. Empty = all allowed.
--trusted-senderSIGNAL_MCP_TRUSTED_SENDERS(none)Inbound allowlist — authors whose messages reach the agent (channel mode). Defaults to --operator when unset.
--prompts-dirSIGNAL_MCP_PROMPTS_DIR~/.config/signal-mcp/promptsDirectory of user-defined *.md prompt templates.
--attachments-dirSIGNAL_MCP_ATTACHMENTS_DIR~/.local/share/signal-cli/attachmentsWhere signal-cli stores received attachments.
--attachment-transferSIGNAL_MCP_ATTACHMENT_TRANSFERautoHow outbound attachments reach the daemon: path, data-uri, or auto.
--attachment-max-bytesSIGNAL_MCP_ATTACHMENT_MAX_BYTES26214400Largest local file encodable as a data URI (25 MB).
--log-levelSIGNAL_MCP_LOG_LEVELINFODEBUG, INFO, WARNING, ERROR, or CRITICAL.

S3-backed attachment storage adds a further --s3-* group; see the --help output.

Trusted recipients & senders

The two allowlists are security gates, not address books:

  • --trusted-recipient restricts outbound sends. The agent still chooses each recipient (the operator for send, or an explicit user_id/group_id); any send to a target not on the allowlist is rejected before it reaches the daemon. Empty = every recipient allowed.
  • --trusted-sender restricts inbound messages in channel mode: only listed authors are forwarded to the agent. When unset, only the operator is trusted (deny-by-default).

Example configs

Minimal (SSE, Note to Self)

signal-mcp --operator +15551234567

Claude Code (stdio, dedicated agent number)

{
"mcpServers": {
"signal": {
"type": "stdio",
"command": "signal-mcp",
"args": [
"--account",
"+353871760709",
"--operator",
"+15551234567",
"--transport",
"stdio"
]
}
}
}

Channel mode + prefix

{
"mcpServers": {
"signal": {
"type": "stdio",
"command": "signal-mcp",
"args": [
"--operator",
"+15551234567",
"--channel",
"--prefix",
"cc"
]
}
}
}

Custom daemon endpoint

SIGNAL_MCP_RPC_HOST=10.0.0.5 SIGNAL_MCP_RPC_PORT=9090 \
signal-mcp --operator +15551234567

signal-cli daemon setup

The MCP connects to a running signal-cli daemon over TCP. Its -a is the account — it must match the MCP's --account:

signal-cli -a ACCOUNT_NUMBER daemon --tcp 127.0.0.1:7583 \
--receive-mode on-start --no-receive-stdout
FlagPurpose
-a / --accountThe registered phone number the daemon runs as (= MCP --account)
--tcp HOST:PORTTCP endpoint for JSON-RPC
--receive-mode on-startAlways receiving (messages queued for clients)
--no-receive-stdoutDon't print received messages to stdout

Run under a process supervisor (launchd, systemd, supervisord) for reliability.