Signal MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| send_messageA | Send a text message to a Signal contact. The message is delivered end-to-end encrypted. Returns the sent timestamp, which can be used as target_timestamp for react_to_message or edit_message. To reply/quote a specific message, provide quote_author and quote_timestamp (get timestamps from get_conversation). Use send_group_message for group chats, send_attachment for files/images. |
| send_group_messageA | Send a text message to a Signal group. All group members receive the message. Returns the sent timestamp for use with react_to_message or edit_message. To @mention specific members, provide a mentions list with character offsets into the message text. To reply to a message, provide quote_author and quote_timestamp. Use list_groups to find the group_id. |
| send_note_to_selfA | Send a note to yourself via Signal's 'Note to Self' / saved messages feature. The note is synced across all your linked Signal devices. Useful for saving reminders, bookmarks, or drafts that sync to your phone. |
| edit_messageA | Edit the text of a previously sent message. Sends the edit via signal-cli to all original recipients; they see the updated text inline with an '(edited)' label. Only the message text can be modified — attachments, quoted replies, and reactions are immutable. The edit must reference the exact timestamp of the original message as returned by send_message or get_conversation. Edits can only be made to messages you sent; editing someone else's message returns an error. There is no enforced time limit, but Signal clients may ignore edits on very old messages. Provide recipient for a DM edit or group_id for a group edit; exactly one is required. Use when correcting a typo or updating information in a message you already sent. Do NOT use to change who a message was sent to — send a new message instead. |
| receive_messagesA | Manually poll signal-cli for new messages and store them. Prefer get_unread — it does this automatically and returns results in one call. Use receive_messages only if you want to poll without reading results. |
| list_contactsA | List all Signal contacts known to this account, including names and phone numbers. Use the optional search parameter to filter by name or number substring. Returns contacts from signal-cli's local contact store. Use get_profile to fetch the current Signal profile for a specific contact. |
| list_groupsA | List all Signal groups this account belongs to, including group name, ID, members, and admin list. The group_id returned here is required for send_group_message, send_group_attachment, and update_group. Use update_group to modify a group, or leave_group to exit. |
| get_conversationA | Get recent message history with a contact or group from local store. Automatically marks returned messages as read in the local store (does NOT send a Signal read receipt — call send_read_receipt for that). |
| search_messagesC | Search for messages containing a keyword |
| send_attachmentA | Send one or more files or images to a Signal contact. Supports photos, videos, documents, and audio files. Use path for a single file or paths to send multiple files in one message. Set view_once=true to send media that auto-deletes after the recipient views it once. For groups use send_group_attachment instead. |
| send_group_attachmentA | Send one or more files (photos, videos, documents, audio) to a Signal group in a single message. All current group members receive the attachment via the normal Signal encrypted delivery pipeline. Provide path for a single file or paths for multiple files sent together in one message. Set view_once=true so each member can only open the media once before it disappears — ideal for sensitive images; does not apply to document types. The file must exist and be readable on the local filesystem; non-existent paths return an error. Use list_groups to obtain the group_id. Use when sharing a file with a group chat. Do NOT use for direct messages — use send_attachment instead. Do NOT use when you only want to send text — use send_group_message instead. |
| react_to_messageA | React to a Signal message with an emoji (DM or group). Set remove=true to remove a reaction. |
| set_typingA | Send a 'typing…' indicator to a Signal contact to show you are composing a message. The indicator appears immediately in the recipient's conversation and auto-expires after ~15 seconds if no message is sent — you do not need to call stop=true after sending the message. Call with stop=true to cancel an in-progress typing indicator early (e.g. if the user abandons the message). signal-cli relays the indicator via the Signal protocol; if the recipient has typing indicators disabled in their settings, it is silently ignored on their end — no error is returned. Typing indicators are only supported for one-to-one DMs; passing a group_id is not valid. Use before send_message to create a realistic 'typing' effect in an automated workflow. Do NOT use for groups — group typing indicators are not supported by Signal. Do NOT call repeatedly in a tight loop; one call per composing session is sufficient. |
| get_profileA | Fetch the Signal profile for a contact, including their display name, about text, and avatar. Profile data is fetched live from the Signal network (not local cache). Use this to verify a contact's current name or check if they have a profile set up. Use update_profile to update your own profile. |
| block_contactA | Block a Signal contact so they can no longer send you messages or call you. The block is applied locally via signal-cli and propagated to the Signal network. The blocked contact receives NO notification — from their perspective, messages appear sent but are silently discarded before reaching you; delivery receipts are suppressed. Blocking does not delete existing message history; prior conversations remain in your local store. The block persists across restarts and is reversible — call unblock_contact to lift it. Use when you want to permanently stop receiving messages from a contact. Use unblock_contact to reverse the block. Do NOT use as a temporary mute — blocking hides the contact from normal message flow entirely. Do NOT use to remove a contact from your list — use remove_contact for that. |
| unblock_contactA | Unblock a previously blocked Signal contact, restoring their ability to send you messages and calls. The contact is NOT notified that they were unblocked. Use block_contact to re-block, or list_contacts to see which contacts are blocked. |
| remove_contactA | Remove a contact from the local signal-cli contact list on this device. This only removes the local record — it does NOT block the contact, delete message history, or affect the contact's ability to message you. To prevent incoming messages, use block_contact instead. Use update_contact to set a local display name without removing. |
| update_profileB | Update your own Signal profile (name, about text, avatar) |
| create_groupA | Create a new Signal group with specified members. You are automatically added as the group admin. All listed members receive an invitation notification. Returns the new group's ID and invite link. Use update_group to modify the group after creation (name, description, members, link settings). Use send_group_message to post messages to the group. |
| join_groupA | Join a Signal group using an invite link (https://signal.group/#...). If the group requires admin approval, your join request will be pending until approved. After joining, use list_groups to find the group_id for sending messages. |
| list_devicesB | List all devices linked to your Signal account |
| add_deviceB | Link a new device to your Signal account using a device link URI |
| remove_deviceB | Unlink a device from your Signal account |
| get_own_numberA | Get your own Signal phone number (the account this server is running as) |
| store_statsA | Get statistics about locally stored messages (count, unread count, DB size on disk, date range) |
| get_unreadA | Get new unread messages. If the background service (signal-mcp install-service) is running, reads directly from the local store. Otherwise polls signal-cli first to fetch any messages that arrived since the last check, then returns unread. Always use this to check for new messages. Messages are marked as read after retrieval. Response includes has_more=true if more unread messages exist beyond the limit — call again with a higher limit or paginate. |
| import_desktopA | Full one-time import of all historical messages from Signal Desktop (macOS/Linux). Requires sqlcipher. On macOS prompts for Keychain access; on Linux uses libsecret/GNOME Keyring. For ongoing sync use sync_desktop instead. |
| sync_desktopA | Incremental sync from Signal Desktop: imports only messages newer than the last sync. Fast on repeat calls. On first call behaves like import_desktop (imports everything). Requires sqlcipher. |
| list_conversationsA | List all conversations (direct and group) ordered by most recent message |
| get_user_statusA | Check whether one or more phone numbers are registered Signal users |
| send_sync_requestA | Request a sync of messages, contacts, and groups from your primary Signal device. Useful if history is missing on this linked device. |
| delete_messageB | Remote-delete (unsend) a message you sent to a contact |
| delete_group_messageB | Remote-delete (unsend) a message you sent to a group |
| send_read_receiptA | Mark one or more messages as read (sends read receipts to sender) |
| update_contactA | Set a local display name for a contact |
| update_groupC | Update a group's name, description, members, admins, or expiration timer |
| leave_groupA | Leave a Signal group. After leaving, you will no longer receive messages from the group and will be removed from the member list. Other members are notified that you left. This action is irreversible without being re-invited. Use list_groups to find the group_id. |
| pin_messageA | Pin a message in a DM or group conversation so it appears prominently in the conversation header. Pinning delivers a system-level pin notification to all participants via signal-cli; they see the pinned message highlighted at the top of the thread. Any participant can pin any message — admin privileges are not required. Only one message can be pinned per conversation at a time; pinning a new message automatically replaces the previous pin. Provide exactly one of recipient (for a DM) or group_id (for a group). Get target_author and target_timestamp from get_conversation — both are required to identify the message. Use unpin_message to remove a pinned message without replacing it. Use when you want to highlight an important message for all participants. Do NOT use if you only want to bookmark a message for yourself — pinning is visible to everyone. |
| unpin_messageA | Unpin a previously pinned message in a DM or group conversation, removing it from the conversation header. Provide either recipient (for DMs) or group_id (for groups). Get target_author and target_timestamp from get_conversation. Use pin_message to pin a message. |
| admin_delete_messageA | As a group admin, delete any message posted in a group you administer, regardless of who sent it. The message is removed for all participants immediately. Only works if you are an admin of the specified group — use list_groups to confirm admin status. For deleting your own messages use delete_message (DM) or delete_group_message (group) instead. |
| send_contacts_syncA | Push your local contacts list to all linked Signal devices (e.g., phone, desktop). Useful when contacts added via signal-cli are not showing up on other devices. This is a one-way sync from this device outward. |
| update_deviceA | Rename a linked secondary device on your Signal account. The updated name is synced to the Signal network and appears immediately in your Signal app's Settings → Linked Devices list across all your devices. Only secondary (linked) devices can be renamed; the primary device name is set during registration. Use list_devices to find all linked device IDs and their current names. The device_id is a small integer (e.g. 2, 3); device 1 is always the primary. Renaming does not affect the device's ability to send or receive messages. Use when you want to distinguish between multiple linked devices by a meaningful label. Use remove_device to unlink a device entirely. Do NOT use to rename your own primary account — that is done via update_profile. |
| mark_as_unreadB | Mark messages as unread in the local store |
| get_avatarB | Get the avatar image for a contact or group as base64-encoded data |
| send_message_request_responseA | Accept or decline a message request from an unknown contact (required before replying to strangers) |
| create_pollA | Create a poll and send it to a Signal contact or group. Provide at least 2 options. Set multi_select=true to allow voters to pick multiple answers. Provide either recipient (DM) or group_id (group) — exactly one is required. Returns the poll timestamp needed for vote_poll and terminate_poll. Use terminate_poll to close the poll and stop accepting votes. |
| vote_pollA | Cast your vote on an active Signal poll in a DM or group conversation. Your vote is delivered via signal-cli and is visible to all participants in real time. Each participant can vote once; re-voting overwrites the previous selection. For single-choice polls, provide exactly one option index in votes. For multi-select polls, provide all chosen indices in a single call — partial updates are not supported. votes are 0-based indices corresponding to the options array from the original create_poll call. Get target_author, target_timestamp, and poll_id from the poll message returned by get_conversation. Provide exactly one of recipient (for a DM poll) or group_id (for a group poll). Voting on a terminated poll returns an error. Use terminate_poll to close a poll you created and freeze the results. Use when responding to an open poll in a conversation. Do NOT use to create a poll — use create_poll instead. |
| terminate_pollA | Close (terminate) a poll you created, stopping any further votes. All participants are notified that the poll has ended and can see the final results. Get target_timestamp and poll_id from the original poll message in get_conversation. Only the poll creator can terminate their own poll. Provide either recipient (DM poll) or group_id (group poll). |
| set_expiration_timerB | Set or disable the disappearing message timer for a conversation |
| list_identitiesA | List identity keys and trust levels for contacts (safety number verification) |
| trust_identityC | Trust a contact's identity key after verifying their safety number |
| clear_local_storeA | Delete ALL locally stored messages from the signal-mcp database. This does NOT delete messages from Signal — only from the local store. Requires confirm=true. |
| delete_local_messagesA | Delete locally stored messages for one contact or group. Does NOT unsend from Signal — only removes from local store. |
| export_messagesA | Export stored messages as JSON or CSV text. Optionally filter by conversation or date. |
| get_configurationA | Get current Signal account configuration (read receipts, typing indicators, link previews) |
| update_configurationC | Toggle Signal account settings: read receipts, typing indicators, link previews |
| list_sticker_packsA | List all sticker packs installed on this Signal account. Returns pack_id and sticker_id values needed for send_sticker and send_group_sticker. Use add_sticker_pack to install a new pack from a signal.art URL. |
| add_sticker_packA | Install a Signal sticker pack from a signal.art URL. Once installed, use list_sticker_packs to browse pack contents, then send_sticker or send_group_sticker to send individual stickers. The URI must be a signal.art URL in the format: https://signal.art/addstickers/#pack_id=...&pack_key=... |
| send_stickerA | Send a single sticker to a Signal contact in a direct message. Stickers are small images from installed packs delivered as a distinct message type — they appear rendered in the conversation, not as a file attachment. Both pack_id (a hex string) and sticker_id (a 0-based integer) must match an installed pack; referencing an uninstalled pack or an invalid sticker_id returns an error. Use list_sticker_packs to browse all installed packs and retrieve valid pack_id and sticker_id values. If no packs are installed, call add_sticker_pack first with a signal.art URL to install one. Use when you want to send an expressive image reaction or decoration to a contact. Use send_group_sticker to send a sticker to a group instead of a DM. Do NOT use to send a regular image file — use send_attachment for that. |
| send_group_stickerA | Send a single sticker to a Signal group so all members receive it. Stickers are small images from installed packs delivered as a distinct message type — they appear rendered in the group conversation, not as a file attachment. Both pack_id (a hex string) and sticker_id (a 0-based integer) must match an installed pack; referencing an uninstalled pack or invalid sticker_id returns an error. Use list_sticker_packs to browse installed packs and retrieve valid pack_id and sticker_id values. If no packs are installed, call add_sticker_pack first with a signal.art URL to install one. Use list_groups to obtain the group_id. Use when sending an expressive image reaction or decoration to a group chat. Use send_sticker for direct messages instead of group chats. Do NOT use to send a regular image file — use send_group_attachment for that. |
| list_attachmentsA | List all downloaded attachments saved locally (photos, files received via Signal) |
| get_attachmentA | Get details about a specific downloaded attachment by filename |
| get_stickerA | Retrieve a single sticker image as base64. Use list_sticker_packs to find pack_id and sticker_id values. |
| upload_sticker_packB | Upload and publish a sticker pack from a local manifest.json or zip file. Returns the signal.art URL. |
| list_accountsA | List all Signal accounts (phone numbers) configured in signal-cli on this machine. |
| update_accountA | Update Signal account-level privacy and identity settings. All parameters are optional — only provide the settings you want to change. discoverable_by_number controls whether others can find you by phone number. number_sharing controls whether your number is shared with contacts you message. username sets a @username alias; delete_username removes it. Use get_configuration for messaging settings (read receipts, typing indicators). |
| set_pinA | Set the Signal registration lock PIN (protects your account if your SIM is stolen). |
| remove_pinA | Remove the Signal registration lock PIN. |
| start_change_numberA | Begin a phone number change. Signal sends a verification code to the new number via SMS (or voice if voice=true). Call finish_change_number to complete. Requires a captcha token if Signal rejects the request — solve it at https://signalcaptchas.org/challenge/generate.html |
| finish_change_numberA | Complete a phone number change using the verification code received via SMS or voice. |
| submit_rate_limit_challengeA | Unblock the account after Signal applies a rate limit. Provide the challenge token from the error and a solved captcha from https://signalcaptchas.org/challenge/generate.html |
| prune_storeA | Delete locally stored messages older than a given number of days (default: 180). Does NOT delete messages from Signal servers — only the local history cache. Useful for keeping the store from growing unbounded. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/googlarz/signal-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server