An MCP client that uses signal for sending and receiving texts.
Project description
Signal MCP Client
An MCP (Model Context Protocol) client that uses Signal for sending and receiving texts.
Setup The Signal Chat Bot
These Instructions are for Linux. With some minor modification this should also work on a Mac or Windows. I recommend to use an extra phone number for the bot, so you don't have to use your own.
- Install uv and podman:
sudo apt install podman curl -LsSf https://astral.sh/uv/install.sh | sh
- Start the Signal CLI Rest Server container:
mkdir -p $HOME/.local/share/signal-api podman run \ --name signal-cli-api \ --replace \ -p 8080:8080 \ -v $HOME/.local/share/signal-api:/home/.local/share/signal-cli \ -e 'MODE=json-rpc' \ docker.io/bbernhard/signal-cli-rest-api:0.184-dev
- Connect the signal-cli-rest-api container to your signal account by opening this link and scanning the QR code:
http://localhost:8080/v1/qrcodelink?device_name=signal-api - Create a config.json with your mcp servers. For example for testing you can use:
cat << EOF > config.json { "servers": [{ "name": "echo-mcp-server-for-testing", "command": "uvx", "args": ["echo-mcp-server-for-testing"], "env": {"SECRET_KEY": "123456789"} }] } EOF
- Create a session directory for saving the message history, images, videos and settings for each user and start the MCP client:
export ANTHROPIC_API_KEY='your-key' export SIGNAL_PHONE_NUMBER='+1234567890' export FAL_API_KEY='your-key' # optional for transcribing voice messages uvx signal-mcp-client \ --config config.json \ --session-save-dir /absolute/path/to/session/dir \ --available-models claude-3-7-sonnet-latest claude-3-5-haiku-latest \ --default-model-name claude-3-7-sonnet-latest \ --default-system-prompt "" \ --default-llm-chat-message-context-limit 50
Adding MCP Server
Add the MCP server in the config.json file.
Here are some example servers I use:
- vlc-mcp-server: An MCP Server to play and control local movies using VLC.
- fal-ai-mcp-server: An MCP Server to use the fal.ai APIs to generate images and videos.
Contributing
Contributions to this project are welcome. Feel free to report bugs, suggest ideas, or create merge requests.
Development
Running from source
- Clone the repo
git clone git@github.com:piebro/signal-mcp-client.git. - Go into the root dir
cd signal-mcp-client. - Run the MCP client:
export ANTHROPIC_API_KEY='your-key' export SIGNAL_PHONE_NUMBER='+1234567890' export FAL_API_KEY='your-key' # optional for transcribing voice messages # additional optional environment variables: export SIGNAL_WS_BASE_URL="ws://localhost:8080" export SIGNAL_HTTP_BASE_URL="http://localhost:8080" export CLIENT_LOG_LEVEL="DEBUG" export SERVER_LOG_LEVEL="DEBUG" # you can also use a .env file in the root directory to set the environment variables uv run signal_mcp_client/main.py \ --config config.json \ --session-save-dir absolute/path/to/session/dir \ --available-models claude-3-7-sonnet-latest claude-3-5-haiku-latest \ --default-model-name claude-3-7-sonnet-latest \ --default-system-prompt "" \ --default-llm-chat-message-context-limit 50
Formatting and Linting
The code is formatted and linted with ruff:
uv run ruff format
uv run ruff check --fix
Building with uv
Build the package using uv:
uv build
Releasing a New Version
To release a new version of the package to PyPI, create and push a new Git tag:
git tag v0.2.0
git push origin v0.2.0
Running as a Systemd Service
To ensure the Signal REST API and the MCP Client run automatically on boot and restart if they fail, you can set them up as systemd user services. User services run under your specific user account.
This setup assumes that you have completed the setup steps and your project is located at /home/$USER/signal-mcp-client.
-
Enable User Lingering to keep your user session active after logging out.
sudo loginctl enable-linger $USER
-
Create Systemd Service Directory
mkdir -p /home/$USER/.config/systemd/user/
-
Create Service File for Signal REST API
cat << EOF > "/home/$USER/.config/systemd/user/signal-cli-rest-api.service" [Unit] Description=Signal CLI REST API Container After=network.target Wants=network-online.target [Service] Environment="XDG_RUNTIME_DIR=/run/user/%U" Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=%t/bus" SyslogIdentifier=signal-cli-rest-api Restart=on-failure RestartSec=30 ExecStartPre=-/usr/bin/podman stop signal-cli-api ExecStartPre=-/usr/bin/podman rm signal-cli-api ExecStart=/usr/bin/podman run --name signal-cli-api \\ -p 127.0.0.1:8080:8080 \\ --replace \\ -v /home/$USER/.local/share/signal-api:/home/.local/share/signal-cli \\ -e MODE=json-rpc \\ docker.io/bbernhard/signal-cli-rest-api:latest ExecStop=/usr/bin/podman stop signal-cli-api [Install] WantedBy=default.target EOF
-
Create Service File for Signal MCP Client
cat << EOF > "/home/$USER/.config/systemd/user/signal-mcp-client.service" [Unit] Description=Signal MCP Client Application After=network.target signal-cli-rest-api.service Wants=signal-cli-rest-api.service [Service] WorkingDirectory=/home/$USER/signal-mcp-client EnvironmentFile=/home/$USER/signal-mcp-client/.env Environment="PATH=/usr/bin:/home/$USER/.local/bin:%{PATH}" SyslogIdentifier=signal-mcp-client Restart=on-failure RestartSec=30 ExecStart=/home/$USER/.local/bin/uv run signal_mcp_client/main.py [Install] WantedBy=default.target EOF
-
Enable and Start the Services
systemctl --user daemon-reload systemctl --user enable signal-cli-rest-api.service systemctl --user enable signal-mcp-client.service systemctl --user start signal-cli-rest-api.service systemctl --user start signal-mcp-client.service
-
Check Service Status and Logs
systemctl --user status signal-cli-rest-api.service systemctl --user status signal-mcp-client.service journalctl --user -u signal-cli-rest-api.service -f journalctl --user -u signal-mcp-client.service -f
License
This project is licensed under the MIT License. See the LICENSE file for details.
Project details
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_client-0.1.4.tar.gz.
File metadata
- Download URL: signal_mcp_client-0.1.4.tar.gz
- Upload date:
- Size: 112.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b45319e155b04d7d9d28c2119bb643ef676fc794e854c126d532e4d7c339111
|
|
| MD5 |
f96159b2472aea21f4e0c67c28a32d0e
|
|
| BLAKE2b-256 |
36d5ce86a5b6af99a3783888887738a841b155cc4848da0c2e10176adf52cf56
|
Provenance
The following attestation bundles were made for signal_mcp_client-0.1.4.tar.gz:
Publisher:
publish.yml on piebro/signal-mcp-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
signal_mcp_client-0.1.4.tar.gz -
Subject digest:
3b45319e155b04d7d9d28c2119bb643ef676fc794e854c126d532e4d7c339111 - Sigstore transparency entry: 203336663
- Sigstore integration time:
-
Permalink:
piebro/signal-mcp-client@0e62738ed015bf1dcb5c2c9e3b6bb799de739b3e -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/piebro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0e62738ed015bf1dcb5c2c9e3b6bb799de739b3e -
Trigger Event:
push
-
Statement type:
File details
Details for the file signal_mcp_client-0.1.4-py3-none-any.whl.
File metadata
- Download URL: signal_mcp_client-0.1.4-py3-none-any.whl
- Upload date:
- Size: 14.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d092af4047b67a9246f3546ba83871514a0eaa4ade21e4a4a1295544c0ea3a6
|
|
| MD5 |
045625b0250f63aa69b71fc511cf0abe
|
|
| BLAKE2b-256 |
bbc184d0ad7c7d4c92f359bbd5b53865a1de92c8ad031860c4d4f1c1ebbe7d59
|
Provenance
The following attestation bundles were made for signal_mcp_client-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on piebro/signal-mcp-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
signal_mcp_client-0.1.4-py3-none-any.whl -
Subject digest:
1d092af4047b67a9246f3546ba83871514a0eaa4ade21e4a4a1295544c0ea3a6 - Sigstore transparency entry: 203336665
- Sigstore integration time:
-
Permalink:
piebro/signal-mcp-client@0e62738ed015bf1dcb5c2c9e3b6bb799de739b3e -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/piebro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0e62738ed015bf1dcb5c2c9e3b6bb799de739b3e -
Trigger Event:
push
-
Statement type: