Installation
Prerequisites
- Python 3.13+ — python.org or
brew install python - signal-cli — a command-line interface for Signal
- uv (recommended) or
pipfor Python package management
Installing signal-cli
Follow the official installation instructions.
Register your Signal account (if using a dedicated number):
signal-cli -u YOUR_PHONE_NUMBER register
signal-cli -u YOUR_PHONE_NUMBER verify CODE_RECEIVED
Link as a secondary device (recommended — keeps your phone as primary):
signal-cli link --qr-url-output qrcode.png
# Scan qrcode.png with Signal > Settings > Linked Devices > Link New Device
signal-cli will print a phone number to use for --account going forward.
Install Signal MCP
No clone required — install straight from GitHub with uv. This puts a
signal-mcp command on your PATH:
uv tool install git+https://github.com/joestump/signal-mcp
Upgrade later (it tracks main) with:
uv tool upgrade signal-mcp
For S3 attachment offloading (see Configuration), install the s3 extra:
uv tool install "signal-mcp[s3] @ git+https://github.com/joestump/signal-mcp"
:::tip Zero-install
Don't want a persistent install? uvx builds and runs it straight from GitHub
into a cache — this is the form used in the Claude Code config below:
uvx --from git+https://github.com/joestump/signal-mcp signal-mcp --operator YOUR_PHONE_NUMBER
:::
Start the daemon
signal-cli must run as a persistent daemon so the MCP server can connect to it:
signal-cli -a YOUR_PHONE_NUMBER daemon --tcp 127.0.0.1:7583 \
--receive-mode on-start --no-receive-stdout
Run the daemon under a supervisor (launchd on macOS, systemd on Linux) so it stays up and restarts on crash.
Run the MCP server
With Claude Code
Add to your .mcp.json or ~/.claude.json. If you ran uv tool install, point
command at the installed signal-mcp:
{
"mcpServers": {
"signal": {
"type": "stdio",
"command": "signal-mcp",
"args": ["--operator", "+15551234567", "--transport", "stdio"]
}
}
}
Or skip the install entirely and let uvx fetch it from GitHub on launch:
{
"mcpServers": {
"signal": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "git+https://github.com/joestump/signal-mcp", "signal-mcp", "--operator", "+15551234567", "--transport", "stdio"]
}
}
}
Standalone
signal-mcp --operator YOUR_PHONE_NUMBER [--transport {sse|stdio}] \
[--rpc-host 127.0.0.1] [--rpc-port 7583]
The daemon endpoint defaults to 127.0.0.1:7583 and can also be set via SIGNAL_CLI_RPC_HOST / SIGNAL_CLI_RPC_PORT environment variables.