Complete Signal MCP server and CLI via signal-cli
Project description
signal-mcp
The most complete Signal MCP server and CLI. Let Claude send and receive Signal messages, manage contacts and groups, search history, and more — all running 100% locally via signal-cli.
What Claude can do
Once connected, just ask Claude naturally:
"Check my Signal messages and summarize what I missed" "Send Anna a message saying I'll be 10 minutes late" "Search my Signal history for anything about the meeting" "Show me all my conversations and who messaged me most recently" "Import all my old messages from Signal Desktop"
Features
- 38 MCP tools — full coverage of everything signal-cli supports
- Complete conversation history — both sent and received messages stored locally
- Full-text search — FTS5 SQLite index across all messages
- Signal Desktop import — pull your entire message history in one command
- Background service — macOS LaunchAgent or Linux systemd unit captures messages automatically
- Full CLI — use Signal from your terminal without Claude
- 100% local — no cloud, no third-party services, your data stays on your machine
- Auto-starts daemon — no manual process management
Setup
Step 1 — Install signal-cli
signal-mcp is a front-end for signal-cli, which handles the Signal protocol.
macOS
brew install signal-cli
Linux
Download the latest release from signal-cli releases, extract it, and put the signal-cli binary on your $PATH.
Step 2 — Link your Signal account
signal-cli needs to be linked to your existing Signal account (the same way you'd add a new device in Signal mobile).
signal-cli link --name "MyMac"
This prints a sgnl:// URI and a QR code in your terminal. On your phone:
Signal → Settings → Linked Devices → + → scan the QR code
Once scanned, signal-cli is linked and ready.
Step 3 — Install signal-mcp
With uv (recommended):
uv tool install signal-mcp
With pip / pipx:
pip install signal-mcp
# or
pipx install signal-mcp
From source:
git clone https://github.com/googlarz/signal-mcp
cd signal-mcp
uv tool install .
Verify it works:
signal-mcp status
You should see your phone number and daemon status.
Step 4 — Connect to Claude Code
claude mcp add signal -- signal-mcp serve
Restart Claude Code. Signal tools appear automatically — ask Claude "check my Signal messages" to confirm.
Manual config alternatives
Add to ~/.claude.json (global):
{
"mcpServers": {
"signal": {
"command": "signal-mcp",
"args": ["serve"]
}
}
}
Or per-project in .mcp.json:
{
"mcpServers": {
"signal": {
"command": "uv",
"args": ["run", "--directory", "/path/to/signal-mcp", "signal-mcp", "serve"]
}
}
}
Step 5 — (Optional) Import Signal Desktop history
If you use Signal Desktop on macOS, you can import your full message history in one command:
brew install sqlcipher # required for decryption
signal-mcp import-desktop # macOS will prompt for Keychain access — click Allow
Step 6 — (Optional) Enable background message capture
signal-cli only delivers messages when polled. Install the background service to capture everything automatically:
signal-mcp install-service # starts on login, works on macOS and Linux
MCP Tools
| Tool | Description |
|---|---|
send_message |
Send text to a contact |
send_group_message |
Send text to a group |
receive_messages |
Poll for new messages |
list_contacts |
All contacts with names and numbers |
list_groups |
All groups with members |
list_conversations |
All conversations ordered by most recent |
get_conversation |
Message history with a contact or group (supports since filter) |
search_messages |
Full-text search across all stored messages |
send_attachment |
Send a file or image to a contact |
send_group_attachment |
Send a file or image to a group |
react_to_message |
React with an emoji |
set_typing |
Send a typing indicator |
get_profile |
Contact profile info |
get_unread |
Unread messages only |
block_contact |
Block a contact |
delete_message |
Remote-delete (unsend) a sent message |
delete_group_message |
Remote-delete a message from a group |
send_read_receipt |
Mark messages as read |
update_contact |
Set a local display name for a contact |
leave_group |
Leave a Signal group |
list_identities |
List identity keys and trust levels |
trust_identity |
Trust a contact's identity key |
update_group |
Rename group, add/remove members, set expiry timer |
create_group |
Create a new Signal group |
join_group |
Join a group via invite link |
set_expiration_timer |
Set or disable disappearing messages |
unblock_contact |
Unblock a previously blocked contact |
remove_contact |
Remove a contact from local list |
update_profile |
Update your own name, about text, or avatar |
list_devices |
List all linked devices on your account |
add_device |
Link a new device |
remove_device |
Unlink a device |
get_own_number |
Get your own Signal phone number |
store_stats |
Stored message count and date range |
import_desktop |
Import full history from Signal Desktop |
send_note_to_self |
Save a note to yourself (saved messages) |
edit_message |
Edit a previously sent message |
CLI Usage
# Status
signal-mcp status # account + daemon info
signal-mcp daemon # start daemon in foreground
signal-mcp stop # stop the daemon
# Send & receive
signal-mcp send +1234567890 "Hello!"
signal-mcp send-group <group_id> "Hey!"
signal-mcp note "Remember to buy milk" # save a note to yourself
signal-mcp receive # poll once
signal-mcp receive --watch # keep watching (saves to store)
# Edit & delete
signal-mcp edit +1234567890 <timestamp> "corrected text"
signal-mcp edit <group_id> <timestamp> "corrected text"
# Contacts & groups
signal-mcp contacts
signal-mcp contacts --json
signal-mcp groups
# History & search
signal-mcp history +1234567890
signal-mcp history +1234567890 --limit 20 --offset 20 # page 2
signal-mcp history +1234567890 --since 2024-01-01
signal-mcp search "keyword"
signal-mcp store-stats
# Signal Desktop import (macOS — full history)
signal-mcp import-desktop
# Background service (macOS LaunchAgent or Linux systemd)
signal-mcp install-service # auto-starts on login, captures all messages
signal-mcp uninstall-service
# MCP server (for Claude Code)
signal-mcp serve
Getting full message history
signal-cli only delivers new messages — it has no history API. Two ways to get history:
Going forward (captures everything from now on):
signal-mcp install-service # background watcher, auto-starts on login
Retroactively (imports everything from Signal Desktop):
signal-mcp import-desktop # macOS will prompt for Keychain access — click Allow
Run both for complete coverage.
Architecture
Claude Code
│ MCP (stdio transport)
▼
signal-mcp serve
├── SQLite store (~/.local/share/signal-mcp/messages.db)
│ FTS5 full-text search, sent + received messages
│
└── signal-cli daemon (JSON-RPC on localhost:7583)
│ Signal protocol (libsignal)
▼
Signal network
The signal-cli daemon is started automatically on first use and kept alive across tool calls. Received attachments are saved to ~/Downloads/signal-attachments/.
Development
git clone https://github.com/googlarz/signal-mcp
cd signal-mcp
uv sync --dev
uv run pytest
uv run pytest --cov --cov-report=term-missing
All tests are fully mocked — no signal-cli installation or Signal account required.
See CONTRIBUTING.md for how to add new tools.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file signal_mcp-1.3.3.tar.gz.
File metadata
- Download URL: signal_mcp-1.3.3.tar.gz
- Upload date:
- Size: 77.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
31ebc330a48e4d18e178ea17a8d52632e08e337e802ebcebfb43bf96979efe77
|
|
| MD5 |
2a5cad98bcdb8670d2191549c391da17
|
|
| BLAKE2b-256 |
554e76662342f5830d15592c310c0aceb0ec268ee03f750dbc9f13a30a1d9ae7
|
Provenance
The following attestation bundles were made for signal_mcp-1.3.3.tar.gz:
Publisher:
publish.yml on googlarz/signal-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
signal_mcp-1.3.3.tar.gz -
Subject digest:
31ebc330a48e4d18e178ea17a8d52632e08e337e802ebcebfb43bf96979efe77 - Sigstore transparency entry: 1435941447
- Sigstore integration time:
-
Permalink:
googlarz/signal-mcp@77e693734a6065760d3293a875be5ff911f10e76 -
Branch / Tag:
refs/tags/v1.3.3 - Owner: https://github.com/googlarz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@77e693734a6065760d3293a875be5ff911f10e76 -
Trigger Event:
release
-
Statement type:
File details
Details for the file signal_mcp-1.3.3-py3-none-any.whl.
File metadata
- Download URL: signal_mcp-1.3.3-py3-none-any.whl
- Upload date:
- Size: 27.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d5f8521aa85cc3e089b755f8194ef3ee263ad874e2379ec82395657115987536
|
|
| MD5 |
9d64ad04d44cb01eecac9b7b98015f68
|
|
| BLAKE2b-256 |
fca23c40377661bbaab9e0d6e70057b41424653c10629e5fad37555dff2cfb45
|
Provenance
The following attestation bundles were made for signal_mcp-1.3.3-py3-none-any.whl:
Publisher:
publish.yml on googlarz/signal-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
signal_mcp-1.3.3-py3-none-any.whl -
Subject digest:
d5f8521aa85cc3e089b755f8194ef3ee263ad874e2379ec82395657115987536 - Sigstore transparency entry: 1435941449
- Sigstore integration time:
-
Permalink:
googlarz/signal-mcp@77e693734a6065760d3293a875be5ff911f10e76 -
Branch / Tag:
refs/tags/v1.3.3 - Owner: https://github.com/googlarz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@77e693734a6065760d3293a875be5ff911f10e76 -
Trigger Event:
release
-
Statement type: