mcp-signal
mcp-signal
signal-exportを介してローカルの暗号化データベースからSignal Desktopの履歴を読み取り、signal-cliを介してメッセージを送信するローカルModel Context Protocol (MCP) サーバーです。
mcp-signalは、個人のSignal自動化のためのコアワークフロー(チャット一覧の取得、メッセージの読み取り、メッセージ検索、グループの確認、ダイレクトチャットやグループチャットへのメッセージ送信)に焦点を当てています。すべてローカルで実行され、ネットワークリスナーを使用しないstdioトランスポートを採用しています。
注意 — バックエンドの混在について。 読み取り/検索はローカルのSignal Desktopデータベースから行われます。送信には
signal-cliを使用します。これは別途インストールし、Signalアカウントとリンクさせる必要があります。signal-cliが利用できない場合、読み取り/検索は機能しますが、送信ツールは機能しません。
機能
Signal Desktopからのダイレクトチャットおよびグループチャットの一覧表示
チャットの最近のメッセージの読み取り
特定のチャット内またはすべてのチャットを横断したメッセージ検索
送信に使用する
signal-cliグループIDを含むグループチャットの一覧表示メッセージ送信先:
電話番号による直接の宛先
グループIDによるグループ
正確なチャット名によるチャット(曖昧さチェックあり)
すべてマシン上で実行され、ネットワークリスナーを使用しないstdioトランスポート
セットアップ
前提条件
Python 3.13+
ローカルメッセージデータベースを持つSignal Desktop
送信を行いたい場合は、インストールおよびリンク済みの
signal-cli
インストール
リポジトリをクローンする
git clone https://github.com/Sealjay/mcp-signal.git cd mcp-signal依存関係をインストールする
uv syncsignal-cliをインストールする (オプション — 送信にのみ必要)macOSの場合、Homebrewが最も簡単です:
brew install signal-cli
送信設定
サーバーは、リポジトリルートに存在する場合、ローカルの .env.local ファイルを自動的に読み込みます。このファイルはgitの管理対象外であり、マシン固有の設定を行うのに推奨される場所です。
cat > .env.local <<'EOF'
SIGNAL_ACCOUNT="+441234567890"
EOFオプションの環境変数:
変数 | 用途 |
|
|
| Signal Desktopデータディレクトリの上書き |
| 必要に応じて暗号化されたデスクトップDBのパスワード |
| 必要に応じて暗号化されたデスクトップDBの生キー |
シェルで設定された環境変数は .env.local よりも優先されます。
signal-cli のリンク(初回実行時のみ)
mcp-signal 自体はリンクを管理しません。最初にローカルの signal-cli デバイスをリンクしてください:
signal-cli link -n "signal-mcp"SignalモバイルアプリでQRコードをスキャンします(設定 → リンクされたデバイス → 新しいデバイスをリンク)。
現在の signal-cli バージョンでは、link に -a / --account を渡さないでください。新しいセカンダリデバイスをリンクする際に電話番号は必要ありません。
QRコードが承認されたら、リンクされたアカウントが表示されていることを確認します:
signal-cli listAccountsそのアカウントは .env.local の SIGNAL_ACCOUNT 値と一致している必要があります。
signal-cli はリンクされたアカウントの状態を独自のローカルデータディレクトリ(macOS/Linuxでは通常 ~/.local/share/signal-cli/data)に保存します。この状態は このリポジトリの外 に存在し、mcp-signal によって コミットされません。
すべてが接続されていることを確認します:
uv run signal-mcp smokeMCPクライアントの設定
すべてのクライアントはstdio経由で同じ方法でサーバーを起動します。macOSでは uv への絶対パスが必要になる場合があります。以下の macOS: uv PATH を参照してください。
Claude Code
CLIを使用するのが最も迅速です:
claude mcp add --transport stdio signal --scope user -- uv run --directory /absolute/path/to/mcp-signal signal-mcp serveまたは、プロジェクトルートの .mcp.json(ユーザー単位のサーバーの場合は ~/.claude.json)に追加します:
{
"mcpServers": {
"signal": {
"type": "stdio",
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/mcp-signal", "signal-mcp", "serve"]
}
}
}ファイルを直接編集した場合は、Claude Codeセッションを再起動して反映させてください。
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) に追加します:
{
"mcpServers": {
"signal": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/mcp-signal", "signal-mcp", "serve"]
}
}
}Claude Desktopを再起動します。利用可能な統合として signal が表示されるはずです。
Cursor
~/.cursor/mcp.json に追加します:
{
"mcpServers": {
"signal": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/mcp-signal", "signal-mcp", "serve"]
}
}
}Cursorを再起動します。
macOS: uv PATH
GUIアプリ(Claude Desktop、Cursor)は、対話型ターミナルからPATHを継承しない場合があるため、uv が spawn uv ENOENT で失敗することがあります。command に uv への絶対パスを使用することで修正できます:
Homebrew —
/opt/homebrew/bin/uv(Apple Silicon) または/usr/local/bin/uv(Intel)手動インストール — ターミナルで
which uvを実行して確認してください
例:
{
"mcpServers": {
"signal": {
"command": "/opt/homebrew/bin/uv",
"args": ["run", "--directory", "/absolute/path/to/mcp-signal", "signal-mcp", "serve"]
}
}
}アーキテクチャ
コンポーネント | 説明 |
MCPサーバー | Python/FastMCP, stdioトランスポート |
読み取りパス | ローカルのSignal Desktopデータベースを読み取る |
送信パス | 必要に応じて起動される |
状態 | 個別のキャッシュなし。Signal Desktopデータから直接読み取り |
データフロー
MCPクライアントがstdio経由で
signal-mcp serveを起動します。読み取り/検索ツールがローカルのSignal Desktopデータベースに対して
signal-exportを呼び出します。グループ一覧表示と送信は
signal-cli -a ACCOUNT jsonRpcを呼び出します。結果が構造化されたJSONとして返されます。
プロジェクト構造
mcp-signal/
src/mcp_signal/
config.py
main.py
reader.py
server.py
signal_cli.py
tests/
CLAUDE.md
LICENSE
README.md
SECURITY.mdツール
ツール | 用途 |
| Signal Desktopからのダイレクトチャットおよびグループチャットの一覧表示 |
| 特定のチャットのメッセージを読み取る |
| 特定のチャット内またはすべてのチャットを横断してメッセージを検索する |
| グループIDを含む |
| ダイレクトな宛先またはグループへのテキストメッセージ送信 |
| デスクトップDB / |
プライバシーとセキュリティ
クラウド中継なし。ネットワークリスナーなし。すべてのデータはマシン上に留まります。
読み取り/検索はローカルのSignal Desktopデータのみを使用します。
送信操作には、ローカルで設定された
signal-cliアカウントが必要です。.env.localはSIGNAL_ACCOUNTなどのローカルシークレット用であり、コミットされません。signal-cliのリンクされたデバイス状態は、このリポジトリの外にある独自のローカルアプリデータディレクトリに保存され、コミットされません。
脆弱性の報告方法については SECURITY.md を参照してください。
制限事項
プロンプトインジェクションのリスク: 多くのMCPサーバーと同様に、このサーバーも the lethal trifecta の対象となります。悪意のある受信メッセージが、他のメッセージを流出させるようエージェントに指示する可能性があります。ツール面を適切に扱い、送信アクションを承認する前に確認してください。
バックエンドの混在: チャット履歴はSignal Desktopから取得されますが、送信は
signal-cliから行われます。添付ファイルなし: テキストのみの送信です。
リアルタイム通知なし: ポーリング/読み取り専用です。
MCPインスタンスごとに1アカウント。
グループ送信には
signal-cliが必要: ローカルDBの読み取りだけでは、グループに安全に送信するための十分な情報が得られません。
開発
uv sync
uv run signal-mcp smoke
uv run pytest
uv run ruff check .トラブルシューティング
signal-cliが見つからない —signal-cliがPATHにあるか確認するか、.env.localでSIGNAL_CLI_PATHを設定してください。macOSではbrew install signal-cliが最も簡単です。読み取り/検索は機能するが送信が失敗する —
signal-cliがリンクされていないか、SIGNAL_ACCOUNTが設定されていません。signal-cli listAccountsを実行して確認し、.env.localをチェックしてください。signal-cli linkがハングまたは失敗する — 現在のバージョンではlinkに-a/--accountを渡さないでください。signal-cli link -n "signal-mcp"を実行し、携帯電話からQRコードをスキャンしてください。MCPクライアントがサーバーを起動できない —
argsには相対パスではなく、リポジトリへの絶対パスを含める必要があります。uv自体がspawn uv ENOENTで失敗する場合は、macOS:uvPATH を参照してください。メッセージが返されない — Signal Desktopがインストールされており、メッセージ履歴があることを確認してください。読み取りパスはローカルのSignal Desktopデータベースを直接クエリします。
コントリビューション
プルリクエストによるコントリビューションを歓迎します。以下を行ってください:
プッシュ前に
uv run ruff check .を実行する。uv run pytestがパスすることを確認する。
完全な開発ワークフローについては CLAUDE.md を参照してください。
ライセンス
MITライセンス — LICENSE を参照してください。
Maintenance
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Sealjay/mcp-signal'
If you have feedback or need assistance with the MCP directory API, please join our Discord server