Signal MCP
Signal MCP is a local, privacy-preserving server that exposes 72 MCP tools for interacting with Signal messaging.
Messaging
Send text, attachments, stickers, and polls to contacts or groups; send notes to self
Support for quoted replies, @mentions, and view-once media
Edit or remote-delete sent messages; group admins can delete any group message
React with emoji, pin/unpin messages, set typing indicators, send read receipts
Message History & Search
Store all messages locally with FTS5 full-text search (filter by sender, paginate results)
Browse paginated conversation history per contact or group
List all conversations ordered by recency with unread counts
Mark messages as read/unread; view store statistics; prune or delete local messages
Export conversations as JSON or CSV
Contacts & Groups
List, add, update, block/unblock, and remove contacts; accept or decline message requests
Fetch your own or another contact's Signal profile (name, bio, avatar)
Create, join, update, and leave groups; manage members, admins, and disappearing message timers
Polls
Create polls in DMs or groups, vote on them, and terminate (close) them
Devices & Security
List, add, remove, and rename linked devices
List and trust identity keys (safety number verification)
Set or remove the registration lock PIN; start/finish a phone number change
Account & Configuration
Get/update account settings (read receipts, typing indicators, link previews, sealed sender, discoverability, username)
List all configured Signal accounts; get your own number
Sticker Packs
List installed packs, install new ones from signal.art URLs, retrieve sticker images as base64, upload/publish custom packs
Data Import & Sync
One-time full import or incremental sync of message history from Signal Desktop
Request contact/message/group sync from your primary device; push contacts to all linked devices
List and retrieve locally downloaded attachments
Background Service
Install/uninstall a macOS LaunchAgent or Linux systemd service for automatic message capture
Submit rate-limit challenge tokens; check whether phone numbers are registered Signal users
Allows reading, searching, and sending Signal messages, managing contacts, groups, and conversation history through a local Signal CLI daemon.
signal-mcp
signal-mcp is a layer on top of signal-cli that adds everything it's missing: persistent message history, full-text search, a usable conversation view, contact name resolution, and an MCP server so Claude can read, search, and act on your Signal messages. 100% local — no cloud, no third-party services.
v1.29.0 — New
sync_desktop/sync-desktop: incremental sync from Signal Desktop — fast on repeat calls, imports only new messages since the last run. Plus: incoming edits update the stored copy in-place, fixes for 500+ conversation crashes, improved store reliability.
What signal-cli is missing — and what signal-mcp adds
No history. signal-cli delivers a message and forgets it. signal-mcp stores every sent and received message — including messages sent from your phone — in a local SQLite database. It stays there. You can search it, browse it, export it, and ask Claude about it.
No search. signal-mcp adds an FTS5 full-text index. Find any message by keyword, filter by sender, page through results.
No conversation view. signal-cli has no concept of a thread. signal-mcp gives you paginated history per contact or group, unread counts, and last-message previews across all your chats.
Raw phone numbers everywhere. signal-mcp resolves +12025551234 → Anna Schmidt in all output.
Manual daemon management. signal-mcp auto-starts the daemon on first use, restarts it if it crashes, and can install a background service (macOS LaunchAgent or Linux systemd) that captures every incoming message — even when you're not at your computer.
Related MCP server: mcp-signal
CLI and MCP: use whichever fits the task
The CLI and MCP server share the same store and daemon. You don't have to choose one:
Task | How |
Quick send from terminal or a cron job |
|
Set up background message capture (once) |
|
Import full history from Signal Desktop (once) |
|
Export a conversation to CSV |
|
Check unread messages and conversations |
|
"What did I miss while I was offline?" | Claude via MCP |
"Find every message mentioning the invoice" | Claude via MCP |
"Summarize my week with Marco and draft a reply" | Claude via MCP |
"Who in my contacts hasn't messaged me in a month?" | Claude via MCP |
"Send the team: standup in 5 minutes" | Claude via MCP or CLI |
Features
Persistent SQLite store — every message saved locally, survives restarts
FTS5 full-text search — instant search across entire history
Signal Desktop import — migrate your complete history in one command (macOS/Linux/Windows)
Background service — captures messages automatically, even when Claude isn't running
Export — JSON or CSV with recipient and date filters
Contact name resolution — phone numbers resolved to names everywhere
72 MCP tools — complete signal-cli coverage (see coverage matrix)
Incoming edit handling — when contacts edit their messages, the stored copy updates in-place
Full CLI — all the above without Claude, from your terminal
100% local — your data never leaves your machine
Setup
Step 1 — Install signal-cli
signal-mcp is a front-end for signal-cli, which handles the Signal protocol.
macOS
brew install signal-cliLinux
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 linked device in Signal mobile).
signal-cli link --name "MyMac"This prints 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-mcpWith pip or pipx:
pip install signal-mcp
# or
pipx install signal-mcpFrom source:
git clone https://github.com/googlarz/signal-mcp
cd signal-mcp
uv tool install .Verify it works:
signal-mcp status
# → Account : +1234567890
# → Daemon : stopped (port 7583)Step 4 — Connect to Claude Code
claude mcp add signal -- signal-mcp serveRestart Claude Code. Signal tools appear automatically — ask Claude "check my Signal messages" to confirm.
Claude Code — global (~/.claude.json):
{
"mcpServers": {
"signal": {
"command": "uvx",
"args": ["signal-mcp", "serve"]
}
}
}Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"signal": {
"command": "uvx",
"args": ["signal-mcp", "serve"]
}
}
}Claude Desktop uses a restricted PATH —
uvxresolves the tool without needingsignal-mcpon your shell's PATH.
Per-project (.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, 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 AllowStep 6 — (Optional) Enable background message capture
signal-cli only delivers messages when polled. Install the background service so nothing is missed:
signal-mcp install-service # starts on login, works on macOS and LinuxMCP Tools
Messaging
Tool | Description |
| Send a text message to a contact. Supports quoted replies ( |
| Send a text message to a group. Supports quoted replies and |
| Send a file or image to a contact. Supports captions and view-once. |
| Send a file or image to a group. Supports captions and view-once. |
| Save a note to yourself (Signal's saved messages). |
| Poll for new incoming messages and delivery receipts. |
| Get messages not yet marked as read from local store. |
| Edit a previously sent message (DM or group). Updates local store. Incoming edits from contacts also update the stored copy in-place. |
| Remote-delete (unsend) a sent DM. |
| Remote-delete a sent group message. |
| React to a message with an emoji (DM or group). Set |
| Pin a message in a DM or group conversation. |
| Unpin a message in a DM or group conversation. |
| Group admin: delete any message in a group you administer. |
| Send a typing indicator to a contact. |
| Mark messages as read. Also updates local store. |
| Send a sticker to a contact. |
| Send a sticker to a group. |
Configuration
Tool | Description |
| Toggle read receipts, typing indicators, link previews, or sealed sender indicators. |
Sticker Packs
Tool | Description |
| List all installed sticker packs with |
| Install a sticker pack from a |
| Retrieve a single sticker image as base64. |
| Upload and publish a sticker pack from a local manifest.json or zip. Returns the signal.art URL. |
Contacts
Tool | Description |
| All contacts with names and numbers. Supports optional |
| Get profile info for a contact. |
| Set a local display name for a contact. |
| Block a contact. |
| Unblock a contact. |
| Remove a contact from the local list. |
| Update your own name, about text, or avatar. |
| Get the Signal number this server is running as. |
Groups
Tool | Description |
| All groups with members and metadata. |
| Create a new Signal group. |
| Join a group via invite link. |
| Rename, add/remove members, promote/demote admins, set expiry timer. |
| Leave a group. |
History & Search
Tool | Description |
| All conversations ordered by most recent message. |
| Message history with a contact or group. Supports |
| Full-text search (FTS5) across all stored messages. Supports |
| Total message count, oldest and newest message dates. |
| Mark one or more stored messages as unread. |
| Check whether phone numbers are registered Signal users. |
| Request sync of messages/contacts/groups from your primary device. |
| Push your contacts list to all linked devices. |
| Accept or decline a message request from an unknown sender. |
Security & Devices
Tool | Description |
| List identity keys and trust levels (safety numbers). |
| Trust a contact's identity key after verifying their safety number. |
| List all devices linked to your account. |
| Link a new device using a device link URI. |
| Unlink a device by ID. |
| Rename a linked device. |
| List all Signal accounts configured in signal-cli on this machine. |
| Update account settings: device name, discoverability, number sharing, username. |
| Set the Signal registration lock PIN. |
| Remove the Signal registration lock PIN. |
| Retrieve the avatar image for a contact or group as base64. |
Polls
Tool | Description |
| Create a poll in a group conversation. |
| Cast a vote on an existing poll. |
| End a poll and prevent further votes. |
Disappearing Messages
Tool | Description |
| Set or disable disappearing messages for any DM or group. |
Data & Import
Tool | Description |
| One-time full import of all historical messages from Signal Desktop. Requires sqlcipher. |
| Incremental sync from Signal Desktop — imports only messages newer than the last sync. Fast on repeat calls. First call behaves like |
| List all locally downloaded attachments (photos, files received via Signal). |
| Get details about a specific downloaded attachment by filename. |
| Delete ALL locally stored messages (requires |
| Delete locally stored messages for one contact or group. |
| Export stored messages as JSON or CSV. Supports |
CLI Usage
# Status & daemon
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
signal-mcp edit +1234567890 <timestamp> "corrected text"
signal-mcp edit <group_id> <timestamp> "corrected text"
# Pin / unpin / admin-delete messages
signal-mcp pin +1234567890 <timestamp> +1234567890
signal-mcp unpin +1234567890 <timestamp> +1234567890
signal-mcp admin-delete <group_id> <timestamp> +1234567890
# Devices
signal-mcp update-device <device_id> "My Laptop"
# Contacts & groups
signal-mcp contacts
signal-mcp contacts --json
signal-mcp groups
signal-mcp conversations # list all chats with unread count + last message
# History & search
signal-mcp history +1234567890
signal-mcp history +1234567890 --limit 20
signal-mcp history +1234567890 --limit 20 --offset 20 # page 2
signal-mcp history +1234567890 --since 2024-01-01
signal-mcp search "keyword"
signal-mcp search "keyword" --sender +1234567890 # restrict to one contact
signal-mcp search "keyword" --limit 20
signal-mcp store-stats
# Export
signal-mcp export # all messages as JSON to stdout
signal-mcp export messages.json # save to file
signal-mcp export messages.csv --format csv # CSV format
signal-mcp export --recipient +1234567890 --format csv # one conversation
signal-mcp export --since 2024-01-01 # messages from date
# Signal Desktop import (macOS) — one-time full import
signal-mcp import-desktop
signal-mcp sync-desktop # incremental: only new messages since last sync
# 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 serveGetting 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 loginRetroactively (imports everything from Signal Desktop):
signal-mcp import-desktop # macOS will prompt for Keychain access — click AllowRun both for complete coverage.
Architecture
┌─────────────────────────────────┐
│ signal-cli daemon (:7583) │
│ Signal protocol / libsignal │
└──────────┬──────────────┬────────┘
│ sends/receives│
┌──────────▼──────────┐ │ (when no service)
│ background service │ │
│ LaunchAgent/systemd │ │
└──────────┬──────────┘ │
│ writes │
┌──────────▼──────────────▼────────┐
│ SQLite store │
│ ~/.local/share/signal-mcp/ │
│ messages.db (FTS5 indexed) │
└────────────────┬─────────────────┘
│ reads/writes
┌─────────────────┼─────────────────┐
│ │ │
┌──────────▼──────┐ ┌────────▼───────┐ ┌──────▼──────────┐
│ Claude Code / │ │ signal-mcp │ │ signal-mcp CLI │
│ Claude Desktop │ │ serve (MCP) │ │ (terminal) │
│ (asks Claude) │ └────────────────┘ └─────────────────┘
└─────────────────┘How it works:
get_unread is the primary "check for new messages" tool. If the background service is installed, it reads straight from the store (the service keeps it up to date). Otherwise it polls signal-cli first (debounced to once every 30 seconds) and includes a _warning suggesting signal-mcp install-service. list_conversations is a pure store read — fast, no polling.
The daemon starts automatically on first use. Attachments are saved to ~/Downloads/signal-attachments/.
signal-cli Coverage
signal-mcp wraps the signal-cli JSON-RPC daemon. Here's what is and isn't covered:
Covered (71 tools)
signal-cli command | signal-mcp tool |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Plus tools with no direct signal-cli equivalent: get_conversation, search_messages, list_conversations, store_stats, import_desktop, sync_desktop, export_messages, mark_as_unread, clear_local_store, delete_local_messages, prune_store.
Not covered
These commands are deliberately excluded — they are not feasible to implement as MCP tools:
signal-cli command | Why |
| Voice/video calls require WebRTC and an active media stack — not feasible via MCP |
| One-time account setup; must be done before installing signal-mcp |
| Irreversibly destroys all local Signal data; too destructive to expose |
| MobileCoin payments (requires a funded wallet; out of scope) |
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-missing573 tests, 100% line coverage across all modules. All tests are fully mocked — no signal-cli installation or Signal account required to run them.
See CONTRIBUTING.md for how to add new tools.
License
MIT — see LICENSE.
Available Tools
79 toolsadd_deviceA
Link a new secondary device to your Signal account using a device-link URI. Only works when signal-mcp is the account's primary device — fails with 'This command doesn't work on linked devices' if signal-mcp was set up via signal-cli link. The URI is generated on the new device by running 'signal-cli link' or by scanning the QR code in Signal Desktop's Settings → Linked Devices → Link New Device. After linking, the new device receives future messages but not historical ones. Use list_devices to confirm the device was linked successfully. Use remove_device to unlink a device you no longer use. Do NOT share the device-link URI — it grants full Signal account access to whoever uses it.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | Device link URI (from signal-cli link output) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the operation fails on linked devices, that the new device receives only future messages, and issues a security warning about not sharing the URI. This goes beyond the basic action and fully informs the agent of consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence serves a purpose: the core action and constraint are front-loaded, followed by the URI source, post-link behavior, verification, and security warning. No fluff—it is thorough without being verbose, appropriate for a tool with security implications.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers all necessary aspects: operation, failure conditions, URI acquisition, post-link behavior, and related tools. An agent has everything needed to decide when and how to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the 'uri' parameter with 100% coverage, so baseline is 3. The description adds valuable context about how to generate the URI (from signal-cli link output or QR scan) and emphasizes its security sensitivity, enhancing the semantic understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Link a new secondary device'), the target ('your Signal account'), and the input mechanism ('using a device-link URI'). It also distinguishes itself from siblings by mentioning list_devices and remove_device as complementary operations, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly specifies when the tool works (only when signal-mcp is the primary device) and when it fails (if set up via signal-cli link), with the exact error message. It provides how to obtain the URI (signal-cli link or QR scan) and directs the agent to use list_devices to verify and remove_device to unlink, covering both context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_sticker_packA
Install a Signal sticker pack from a signal.art URL. Returns {status, pack_id} — pack_id is parsed from the URI, ready to pass directly to get_sticker or send_sticker/send_group_sticker without a separate list_sticker_packs call. Use list_sticker_packs instead if you need to browse the pack's sticker_id/emoji contents first. The URI must be a signal.art URL in the format: https://signal.art/addstickers/#pack_id=...&pack_key=...
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | Sticker pack URL (https://signal.art/addstickers/#pack_id=...&pack_key=...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the return shape ({status, pack_id}), that pack_id is parsed from the URI, and that no separate list_sticker_packs call is needed. It could add more about error behavior or side effects, but for a simple install operation it is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. Each sentence earns its place: what the tool does, what it returns and how to use it downstream, and when to prefer a sibling tool. The most critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description covers everything needed to call it correctly: the required URI format, the return value, and the relationship to related sticker tools. No meaningful gap remains for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces the required URI format and signal.art domain, but it largely repeats what the input schema already states rather than adding substantial new parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Install a Signal sticker pack from a signal.art URL." It clearly distinguishes this tool from siblings like list_sticker_packs and send_sticker by explaining that pack_id is parsed and ready for direct use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to use list_sticker_packs instead: when browsing sticker_id/emoji contents is needed. It also explains how the output feeds directly into get_sticker or send_sticker/send_group_sticker, reducing ambiguity about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | Group ID where the message was sent (get from list_groups) | |
| target_author | Yes | Phone number of the user who sent the message | |
| target_timestamp | Yes | Timestamp of the message to delete (from get_conversation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses immediate deletion for all participants, requires admin status, and works in groups. Lacks details on reversibility or error cases, but sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, zero waste. Information is efficiently presented.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers key behavior, prerequisites, and sibling differentiation. Could include potential failure modes, but does not detract from overall completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with clear descriptions. The description adds context (e.g., group_id from list_groups) but does not provide substantial new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: deleting any message in a group as an admin, regardless of author. It distinguishes from sibling tools 'delete_message' and 'delete_group_message' by specifying admin-only scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (as group admin wanting to delete others' messages) and when not to (for own messages use other tools). Also advises confirming admin status with list_groups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
block_contactA
Block a Signal contact so they can no longer send you messages or call you. Only works when signal-mcp is the account's primary device — fails with 'This command doesn't work on linked devices' if signal-mcp was set up via signal-cli link. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes | Phone number to block (E.164 format, e.g. +1234567890) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: primary-device restriction, failure mode on linked devices, local application and network propagation, silent discard of messages, suppressed delivery receipts, no notification to blocked contact, preservation of history, persistence across restarts, and reversibility. This is exhaustive and leaves no surprises for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single well-structured paragraph that front-loads the core purpose, then logically proceeds to limitations, effects, and usage guidance. While dense, every sentence contributes essential information; it could be slightly tightened but is far from verbose or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers all necessary context: prerequisites (primary device), side effects (silent discard, receipt suppression), persistence, reversibility, and clear boundaries with sibling tools. An agent can call this tool correctly with full knowledge of consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'number' is fully described in the schema with E.164 format and example. Since schema coverage is 100%, the description adds no further parameter-specific detail beyond what the schema already provides, which meets the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (block a Signal contact), the resource (a contact), and the effect (can no longer send messages or call). It also explicitly distinguishes from unblock_contact and remove_contact, making sibling differentiation immediate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (permanently stop receiving messages), when-not-to-use (temporary mute, removing a contact), and names the alternative tools (unblock_contact, remove_contact). No ambiguity about appropriate contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_scheduled_messageA
Cancel a pending scheduled message by its job ID. Use list_scheduled_messages to find the ID. Returns an error if the message was already sent or does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Scheduled message job ID from list_scheduled_messages |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It discloses the key error cases: already-sent messages and nonexistent IDs. It does not describe the success return value or permission requirements, but for a simple cancellation operation the main behavioral expectations are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences only: the first states the operation and key, the second explains how to find the ID and what errors to expect. Nothing is extraneous, and the most important detail is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter utility with no output schema or annotations, the description provides the essential inputs, ID source, and error behavior. It stops short of stating what a successful cancellation returns, but that is reasonably inferable from the clear cancel action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already defines job_id as 'Scheduled message job ID from list_scheduled_messages.' The description reinforces this source but adds no new semantic details beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Cancel') with a precise resource ('pending scheduled message') and identifies the identifying key ('by its job ID'). This clearly differentiates the tool from siblings like schedule_message, list_scheduled_messages, and run_scheduled_messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives direct guidance on how to obtain the job_id ('Use list_scheduled_messages to find the ID') and sets an expectation by noting that cancellation fails if the message was already sent. It does not explicitly name alternatives or state 'use when the message is pending,' but the intent is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Must be true to proceed — prevents accidental deletion |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the deletion is local-only and requires confirmation, but does not mention irreversibility or potential side effects like attachment deletion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first states the action and scope, second clarifies it's local-only and the requirement. No fluff, front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one param and no output schema, the description covers purpose and constraint. Lacks mention of return value or confirmation of success, which would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description merely restates the requirement from the schema ('Requires confirm=true') without adding new parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (delete all locally stored messages) and resource (signal-mcp database), and explicitly distinguishes from deleting messages from Signal, which differentiates it from siblings like 'delete_local_messages' that delete specific messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes the requirement that confirm=true must be set, which is a usage guideline. However, it does not explicitly compare with similar tools like 'prune_store' or 'delete_local_messages' to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Group name visible to all members | |
| members | Yes | Phone numbers (E.164) of initial members to invite | |
| description | No | Optional group description shown in group info |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses key behavioral traits: the creator becomes admin, all listed members receive an invitation notification, and the tool returns the group's ID and invite link. It does not mention any potential limits or side effects, but overall adequately covers the immediate effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, concise and front-loaded with the primary action, then additional details. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there are three simple parameters (no nested objects, no enums) and no output schema, the description adequately covers the tool's complete behavior: creation, admin assignment, notifications, return values, and references to related tools. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description adds minimal semantic value beyond the schema. The schema already describes 'name', 'members' (with phone numbers), and 'description' as optional. The description reiterates these in natural language but does not add new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Create a new Signal group with specified members.' It also specifies that the creator is automatically admin, members receive invitations, and returns the new group's ID and invite link. Distinguishes from siblings like update_group and send_group_message by mentioning their specific use cases after creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly guides when to use this tool (creating a group) and when to use alternatives: 'Use update_group to modify the group after creation... Use send_group_message to post messages to the group.' This provides clear context and prevents misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| options | Yes | List of answer options (minimum 2 required) | |
| group_id | No | Group ID for a group poll — provide this OR recipient | |
| question | Yes | The poll question text | |
| recipient | No | Phone number for a DM poll — provide this OR group_id | |
| multi_select | No | Allow voters to select multiple options (default: false = single choice only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description bears full responsibility. It discloses that the tool returns 'the poll timestamp needed for vote_poll and terminate_poll', and that multi_select defaults to false. However, it does not mention error handling or behavior when invalid parameters are provided, which would improve transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with four sentences, each adding essential information: core action, option requirement, multi_select behavior, recipient/group choice, return value, and reference to terminate_poll. No unnecessary words, and the most important info is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, 2 required, no output schema), the description covers all necessary aspects: what it does, how to configure it, required parameters, optional behavior (multi_select), and how the return value is used by other tools. It is complete for the intended use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaningful guidance beyond the schema: it clarifies the mutual exclusivity of recipient and group_id (not enforced in schema), and explains the effect of multi_select (allow multiple answers). This goes beyond the schema's descriptions, earning a score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a poll and send it to a Signal contact or group.' This is a specific verb (Create) and resource (poll) with a clear target (Signal). It also distinguishes itself from sibling tools like vote_poll and terminate_poll by referencing them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: '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', and recommends using terminate_poll to close the poll. This gives clear usage conditions and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_group_messageA
Remote-delete (unsend) a message you previously sent to a Signal group. Delivers a delete request to all group members' devices; the message disappears from their conversation view on Signal 5.0+ clients. You can only delete messages you sent — for admin deletion of any member's message use admin_delete_message. target_timestamp is the sent_at timestamp of the message (from get_conversation). Deletion may fail silently on older Signal clients. Remote deletion does not remove the message from the local signal-mcp store. Use when you want to retract a message you sent in a group. Do NOT use for direct messages — use delete_message instead.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | Group ID | |
| target_timestamp | Yes | Timestamp of the message to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden: discloses that deletion sends a request to group members, works on Signal 5.0+, may fail on older clients, and does not remove the message from local store. Also notes only own messages can be deleted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, front-loaded with purpose, then provides usage guidelines, alternatives, caveats, and limitations. Every sentence serves a purpose with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 parameters, no output schema, and no annotations, the description covers all necessary behavioral context: purpose, constraints, source of timestamp, failure modes, and local vs remote effects. It also distinguishes relevant siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers both parameters with descriptions, but the description adds value by explaining that target_timestamp is the sent_at timestamp from get_conversation, which aids correct parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verb and resource ('Remote-delete a message you previously sent to a Signal group') and distinguishes from sibling tools by explicitly naming admin_delete_message for admin deletion and delete_message for direct messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('when you want to retract a message you sent in a group') and when not to use ('Do NOT use for direct messages — use delete_message instead'), plus provides source for target_timestamp.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_local_messagesA
Delete locally stored messages for one contact or group. Does NOT unsend from Signal — only removes from local store.
| Name | Required | Description | Default |
|---|---|---|---|
| recipient | Yes | Phone number or group ID whose messages to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. It discloses key behavioral trait: only local deletion, no unsend. This is sufficient for a simple operation, though it omits any mention of reversibility or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with action, no wasted words. Every part adds value: what it does, scope, and what it does not do.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, description fully covers purpose, scope, and limitation. No gaps given complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter 'recipient', which is described as 'Phone number or group ID whose messages to delete'. The tool description does not add meaning beyond the schema, meeting baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Delete locally stored messages for one contact or group', specifying the verb (delete) and resource (locally stored messages). It distinguishes from siblings like delete_message by noting it does not unsend.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Does NOT unsend from Signal — only removes from local store', informing when to use (local deletion) and when not to (if unsend needed). Does not name specific alternative tools but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_messageA
Remote-delete (unsend) a message you previously sent to a Signal contact. Delivers a delete request to the recipient's device; the message disappears from their conversation view on Signal 5.0+ clients. You can only delete messages you sent — you cannot delete messages received from others. target_timestamp is the sent_at timestamp of the message (from get_conversation). Deletion may fail silently if the recipient is on an older Signal client. Remote deletion does not remove the message from the local signal-mcp store — use delete_local_messages to remove it locally. Use when you want to retract a sent message from the recipient's device. Do NOT use for group messages — use delete_group_message instead. Do NOT use to delete a message you received — only senders can remotely delete.
| Name | Required | Description | Default |
|---|---|---|---|
| recipient | Yes | Phone number of the recipient | |
| target_timestamp | Yes | Timestamp of the message to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses that deletion sends request to recipient, requires Signal 5.0+, only works for own sent messages, may fail silently, and does not remove from local store (pointing to delete_local_messages).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single paragraph with multiple sentences, each serving a purpose. Slightly long but well-organized. Could be broken into bullet points for readability, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deletion tool with no output schema, description covers behavior, constraints, parameter details, and alternatives. Missing return value information, but not critical for this type of tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds context: target_timestamp is described as 'sent_at timestamp from get_conversation', and recipient is clarified as phone number. Provides meaning beyond raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states specific action: remote-delete (unsend) a message you sent to a Signal contact. Clearly distinguishes from sibling tools by naming alternatives like delete_local_messages, delete_group_message, and admin_delete_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('retract a sent message from recipient's device') and when not to ('Do NOT use for group messages, use delete_group_message instead; Do NOT use to delete a message you received'). Also notes silent failure on older clients.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | New message text to replace the original | |
| group_id | No | Group ID for a group message edit | |
| recipient | No | Phone number for a DM message edit | |
| target_timestamp | Yes | Timestamp of the message to edit (from get_conversation or send_message response) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses editing behavior: sends via signal-cli, recipients see '(edited)' label, only text modifiable, must reference exact timestamp, only own messages, no time limit but Signal may ignore old edits. With no annotations, description fully covers behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise and front-loaded: first sentence states core purpose. Subsequent sentences add necessary constraints without redundancy. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description covers usage context, constraints, and behavioral details like Signal ignoring old edits. Missing explicit return value info, but overall complete for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds value by explaining target_timestamp must be exact, recipient vs group_id usage, and that exactly one is required. This clarifies parameter semantics beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool edits the text of a previously sent message. Distinguishes from send_message, delete_message, and other siblings by specifying that only text is modifiable, not attachments or other elements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: 'Use when correcting a typo or updating information.' Also states when not to use: 'Do NOT use to change who a message was sent to — send a new message instead.' Provides context on editing only own messages and requiring exact timestamp.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_messagesA
Export locally stored messages as a JSON or CSV string for archiving, analysis, or migration. Returns all messages in the local store by default; use recipient to restrict to one conversation. Use since (ISO 8601 datetime) to export only messages after a given point in time. JSON output preserves all fields (sender, timestamp, body, group_id); CSV output is flat and suitable for spreadsheets. Only messages already in the local store are included — messages never received on this device are absent. Use when you need a full or filtered dump of conversation history in machine-readable form. Do NOT use to read individual messages interactively — use get_conversation or search_messages for that.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Only include messages at or after this ISO datetime | |
| format | No | Output format (default: json) | |
| recipient | No | Export only this conversation (phone number or group ID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that only messages already in the local store are included, and that messages never received on this device are absent. Does not explicitly state read-only nature, but operation is clearly non-destructive. No annotations present to contradict.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main purpose and includes necessary details. Slightly verbose but every sentence serves a purpose. Could be tightened slightly without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately covers return value characteristics (JSON vs CSV format, field preservation). All three parameters are explained with practical usage context. No gaps in understanding for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3). The description adds value by explaining that recipient restricts to one conversation, since uses ISO 8601, and that JSON preserves all fields while CSV is flat. This goes beyond the bare schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool exports locally stored messages as JSON/CSV for archiving, analysis, or migration. It distinguishes itself from siblings like get_conversation and search_messages by specifying its batch export use case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use ('full or filtered dump of conversation history in machine-readable form') and when not to use ('Do NOT use to read individual messages interactively'), naming specific alternatives (get_conversation, search_messages).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_contactA
Search contacts by name or phone number fragment. Returns all contacts whose name or number contains the query string (case-insensitive). Use this to look up a phone number when you only know a name, or to verify a contact exists.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Name or phone number fragment to search for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that matching is case-insensitive substring containment, that the query can match name or number, and that all matching contacts are returned. This goes beyond a simple one-line summary, though it omits details like result ordering, pagination, or empty-result behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences deliver the core action, matching behavior, and practical use cases without filler. The most important behavioral details are front-loaded, and every sentence contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter search tool with no output schema, the description is nearly sufficient: it explains what is searched, how matching works, and what is returned. The main gap is not mentioning the alternative list_contacts or the shape of returned contact objects, which would round out agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter already has a clear schema description: 'Name or phone number fragment to search for.' The tool description adds value by specifying case-insensitive contains semantics and that both name and number are searched. With 100% schema coverage, this extra context justifies a score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a clear verb and resource: 'Search contacts by name or phone number fragment,' and clarifies that it returns matching contacts via substring matching. It is clearly distinct from list_contacts in function, though it does not explicitly name or contrast a sibling tool, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit use cases: 'look up a phone number when you only know a name' and 'verify a contact exists.' It provides clear context for when to use the tool, but it does not mention alternatives or when not to use it, such as choosing list_contacts for unfiltered contact listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finish_change_numberA
Complete the second step of a Signal phone number change by submitting the verification code. Only works when signal-mcp is the account's primary device — fails with 'This command doesn't work on linked devices' if signal-mcp was set up via signal-cli link. Must be called after start_change_number, which initiates the number change and triggers the SMS/voice code. number is the new E.164 phone number you are migrating to. verification_code is the 6-digit code received via SMS or voice call to that number. pin is required only if your account has a Signal Registration Lock PIN set — omit otherwise. On success, the account is permanently migrated to the new number; all linked devices are updated. Use start_change_number first to request the verification code before calling this tool. Do NOT call this tool without first calling start_change_number — the code will not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| pin | No | Registration lock PIN (required if the account has a PIN set) | |
| number | Yes | The new phone number in E.164 format | |
| verification_code | Yes | 6-digit verification code from SMS/voice |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the linked-device failure, the permanent migration on success, the updating of linked devices, and the pin condition. It does not mention failure scenarios (e.g., wrong code) but is otherwise thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph but logically ordered: purpose, condition, prerequisite, parameter details, success effect, and a final warning. Every sentence contributes essential information, with the most critical constraints placed early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-step process with device restrictions and conditional pin, the description covers all necessary context: the prerequisite call, the device limitation, the success outcome, and explicit guidance on when to use. No output schema exists, but the description suffices for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes parameters. The description adds extra context: number in E.164 format, 6-digit code, and the conditional nature of pin, which enriches the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool's purpose: completing the second step of a Signal number change by submitting the verification code. It clearly distinguishes from the sibling start_change_number by naming the step and the prerequisite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: must be called after start_change_number, warns not to call without it, explains the primary-device requirement, and specifies when to include the pin. This fully addresses when-to-use vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attachmentA
Retrieve metadata and the base64-encoded content of a locally saved Signal attachment by filename. Returns MIME type, file size, local path, and the raw bytes as base64 so the caller can read or display the file. Only attachments already downloaded to the local store are accessible — attachments expire on Signal's servers after ~30 days if not downloaded first. Use list_attachments to discover available filenames before calling. Use when you need to read, display, or forward the contents of a received file or image. Do NOT use to send an attachment — use send_attachment or send_group_attachment for that.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Attachment filename (get from list_attachments) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description fully discloses that only locally downloaded attachments are accessible, the 30-day server expiration, and the returned data (MIME type, file size, local path, base64 content). This is comprehensive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with clear front-loading of the main action, followed by constraints, usage guidance, and exclusions. No unnecessary words, each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers prerequisites (local download, expiration), return value contents, and usage relative to sibling tools. For a single-parameter tool with no output schema, this is maximally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'filename' is described in the schema with 'get from list_attachments', and the description adds important context about local storage and expiration. While schema coverage is 100%, the description adds meaningful extra info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Retrieve metadata and the base64-encoded content of a locally saved Signal attachment by filename.' This specifies the exact action and resource, and distinguishes from sibling tools like list_attachments and send_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('when you need to read, display, or forward the contents of a received file or image'), what to do before ('Use list_attachments to discover available filenames'), and what not to do ('Do NOT use to send an attachment') with alternative tools named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_avatarA
Retrieve the profile photo for a contact or group as base64-encoded image data. Pass a phone number (E.164) for contacts or a group ID (from list_groups) for groups. Returns raw image bytes encoded as base64 — decode to get a JPEG or PNG. Returns an error if no avatar is set for the identifier. Use get_profile to also read name and about text alongside the avatar. Use update_profile with avatar_path to set your own profile photo.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Phone number (E.164) for a contact or group ID for a group |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description discloses return format (base64-encoded bytes, decode to JPEG/PNG) and error behavior. For a read-only operation, this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences, each serving a purpose: purpose, identifier types, return format, error and alternatives. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a 1-parameter, no-output-schema tool. Covers input, output, error, and sibling comparison. No missing information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond schema by explaining that 'identifier' can be a phone number (E.164) for contacts or a group ID from list_groups. Schema only says 'string', so description adds crucial context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'Retrieve' and resource 'profile photo' for contacts/groups. Clearly distinguishes from siblings get_profile and update_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool vs alternatives: 'Use get_profile to also read name and about text alongside the avatar. Use update_profile ... to set your own profile photo.' Also notes error condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max messages to return (default: 50) | |
| since | No | Only messages after this ISO datetime (e.g. 2024-01-01T00:00:00) | |
| offset | No | Number of messages to skip for pagination (default: 0) | |
| recipient | Yes | Phone number or group ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description reveals a key behavioral trait: it automatically marks messages as read in the local store but does not send a read receipt. This adds value beyond what the input schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences. The first sentence states the primary action, and the second provides a critical behavioral note. No extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main purpose and a key behavior. It does not mention the return format or ordering, but the parameters are well-documented in the schema. Slightly more detail could improve completeness, but it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all 4 parameters. The tool description does not add additional meaning beyond the schema descriptions, so it meets the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves recent message history from the local store, specifying the verb 'Get', resource 'message history', and scope 'with a contact or group'. It distinguishes itself from the sibling 'send_read_receipt' by explicitly noting that it does not send a Signal read receipt.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a clear alternative: 'call send_read_receipt for that' if a read receipt is needed. However, it does not provide guidance on when to use this tool versus other message retrieval tools like 'receive_messages', 'export_messages', or 'get_unread'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_own_numberA
Get your own Signal phone number (the account this server is running as)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description implies a read-only operation via the verb 'Get', and for a simple getter with no side effects, this level of disclosure is adequate. However, it could explicitly state it is non-destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 12 words, front-loaded with the verb, and contains no superfluous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with no parameters and no output schema; the description sufficiently conveys its purpose and return value (the phone number). It is complete enough for an AI agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With no parameters, schema coverage is 100%, and the baseline for 0 parameters is 4. The description does not need to add parameter details since none exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific verb 'Get' and the resource 'own Signal phone number', and it distinguishes itself from siblings like 'list_accounts' which list all accounts, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when needing the server's own number, but it does not explicitly provide when-to-use vs alternatives or any context for exclusion, leaving it implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes | Phone number in E.164 format |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that data is fetched live from the Signal network (not cache), which is important behavioral context. No annotations, so description carries the burden; it adds value but doesn't mention error handling or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences covering purpose, behavioral nuance, and usage guidance. No redundancy, front-loaded with main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lists returned data fields but lacks output schema. No mention of error cases or invalid numbers. Adequate for a simple tool but could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with description for 'number' (E.164 format). Description does not add additional meaning beyond the schema, thus baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb ('Fetch') and resource ('Signal profile') with specific data fields listed. Distinguishes from sibling by mentioning update_profile for updates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states use cases: verify contact's name or check profile setup. Directs to update_profile for own profile updates, providing clear when-to-use and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stickerA
Retrieve a single sticker image as base64. Use list_sticker_packs to find pack_id and sticker_id values.
| Name | Required | Description | Default |
|---|---|---|---|
| pack_id | Yes | Sticker pack ID (hex string from list_sticker_packs) | |
| sticker_id | Yes | Sticker ID within the pack |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implicitly indicates a read-only operation by stating 'retrieve'. It does not mention side effects, permissions, or error conditions, but for a simple retrieval tool, the disclosure is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states the purpose and output format, second provides usage guidance. No unnecessary words, all information is relevant and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with two parameters and no output schema, the description is complete. It explains what the tool does, how to get the required parameters, and the format of the result (base64). No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes both parameters (pack_id and sticker_id) with types and explanations. The description adds a hint to use list_sticker_packs to find values, which is helpful but does not add meaning beyond the schema. With 100% schema coverage, baseline score is 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves a single sticker image as base64. It specifies the action (retrieve), resource (sticker image), and output format (base64). This distinguishes it from sibling tools like send_sticker or list_sticker_packs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description instructs the agent to use list_sticker_packs to find the required IDs, providing a clear prerequisite step. However, it does not explicitly state when to use this tool versus alternatives like send_sticker or send_group_sticker, though the context makes it obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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, so a call with has_more=true in the response should be followed by calling get_unread again with the same limit — the just-returned messages are no longer unread, so the next call naturally returns the next batch.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max messages to return (default: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and handles it well. It discloses that messages are marked as read after retrieval, that behavior depends on whether a background service is running, and that the tool may poll signal-cli as a fallback. It also exposes the has_more continuation behavior, which is essential for correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and every clause contributes necessary behavioral or usage information. It is somewhat long and dense, but not wasteful. It earns a high score for efficiency while leaving a little room for tighter organization.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-optional-parameter tool with no output schema, the description covers everything needed: how to invoke it, what happens after retrieval, and how to handle pagination. It even explains the background-service vs polling behavior, which is important operational context. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the limit parameter. The description adds meaning by explaining that 'limit' controls the batch size and that callers should reuse the same limit when continuing with has_more=true. This gives the parameter practical usage context beyond the schema's 'Max messages to return'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get new unread messages.' It also adds the directive 'Always use this to check for new messages,' which positions the tool as the primary entry point. However, it does not explicitly contrast itself with siblings like receive_direct or receive_messages, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: it should always be used to check for new messages, and it explains the batching pattern with has_more. It does not explicitly state when not to use it or name alternative tools, so it lacks full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_statusA
Check whether one or more phone numbers are registered Signal users. Queries Signal's servers for each number and returns a registered/unregistered status. Accepts a list so you can batch-check multiple numbers in a single call. Useful before sending to an unknown number to avoid 'unregistered user' delivery failures. Note: privacy-mode accounts or numbers that have opted out of discoverability may show as unregistered even if they actively use Signal. Use before sending to a new contact to confirm they are reachable on Signal. Do NOT use to look up contact profile details — use get_profile for that.
| Name | Required | Description | Default |
|---|---|---|---|
| recipients | Yes | List of phone numbers (E.164) to check |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes that it queries Signal servers, returns status, and accepts batches. Discloses limitation about privacy-mode. Without annotations, the description carries the full burden and does so effectively, though it could explicitly state that it's read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, with 4 sentences. The main purpose is front-loaded, and each sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description is complete: covers purpose, usage, limitations, and sibling tool distinction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage but description adds context: batching multiple numbers and what the return value is (registered/unregistered status). This adds meaning beyond the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it checks whether phone numbers are registered Signal users, using a specific verb 'check' and resource. It distinguishes itself from sibling tools like 'get_profile', making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use (before sending to unknown numbers) and when not to use (not for profile details, use 'get_profile' instead). Also notes limitation about privacy-mode accounts, providing clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_webhookA
Return the currently configured webhook URL, or null if none is set.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It does disclose the key behavior—returning null when no webhook is configured—and the read-oriented verb 'Return' implies no side effects, but it does not explicitly state read-only status, permissions, or any other behavioral constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word adds meaning, covering the operation, the resource, and the null edge case.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple, parameterless getter, and the description fully covers its behavior: it returns the current webhook URL or null if unset. No output schema exists, but the return semantics are adequately described for an agent to invoke and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the input schema is already complete and there is nothing for the description to add. This matches the baseline of 4 for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Return') and identifies the exact resource ('currently configured webhook URL'), including the null case when none is set. This clearly distinguishes it from the sibling set_webhook as the retrieving counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'currently configured' implies this tool is for reading the active webhook rather than modifying it, but the description never explicitly names alternatives or states when not to use it. It leaves the agent to infer usage from context rather than giving direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. It reveals platform-specific auth (Keychain on macOS, libsecret on Linux) and prerequisite (sqlcipher). Does not specify whether import merges or overwrites existing data, but overall good disclosure for a non-destructive import operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three efficient sentences. First sentence states purpose, second adds prerequisites and auth context, third directs to sibling. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and no output schema, description fully covers what the tool does, prerequisites, platform specifics, and alternative tool. Completely adequate for an agent to decide when to invoke.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in schema; description does not need to explain parameters. Baseline for zero params is 4. No additional param info is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it is a one-time import of all historical messages from Signal Desktop, specifying platform (macOS/Linux). Differentiates from sibling sync_desktop by saying 'for ongoing sync use sync_desktop instead.' Verb+resource+scope are precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives guidance: use for one-time import, use sync_desktop for ongoing sync. Mentions prerequisite (sqlcipher) and platform-specific authentication behaviors, which are clear when-to-use/not-use signals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | Group invite link starting with https://signal.group/# |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the full burden. It discloses that joining may require admin approval and that the request can be pending, which is useful. However, it does not mention other behavioral aspects such as visibility of the user's profile or any rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences, no redundancy, and front-loads the primary action. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description adequately covers the joining process, potential pending state, and subsequent steps. It is complete enough for the intended use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the single parameter 'uri' with 100% description coverage. The description reiterates the purpose of the parameter (invite link with format) but does not add substantial meaning beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Join a Signal group' using a specific resource type 'invite link' and provides the URL format. It distinguishes from sibling tools like create_group and leave_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (having an invite link) and mentions admin approval as a conditional outcome. It suggests a follow-up action (list_groups) but does not explicitly exclude scenarios where alternative tools would be better.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | Group ID to leave (get from list_groups) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description fully informs about behavioral traits: no longer receiving messages, removal from member list, notification to others, and irreversibility without re-invite.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each providing essential information: action, consequences, irreversibility, and how to obtain the required parameter. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple mutation tool with one parameter, the description covers all necessary context: what happens, side effects, and parameter source. No output schema is needed given the simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has high coverage (100%) and includes the same guidance ('Group ID to leave (get from list_groups)'). The description adds no new parameter information beyond the schema, so baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Leave a Signal group' clearly, specifying the action and resource. It distinguishes from other group-related tools like 'delete_group_message' or 'join_group'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use (to leave a group) and provides guidance to use list_groups to find the group_id. It does not explicitly mention when not to use, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsA
List all Signal accounts (phone numbers) registered in signal-cli on this machine. Returns each account's E.164 phone number and its registration status. Most setups have a single account; multiple accounts appear when signal-cli manages more than one number. Use get_own_number to get the active account's number in single-account setups. Use when you need to confirm which accounts are available before sending or receiving messages.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains what the tool returns (E.164 phone number and registration status) and implies it is a read-only operation. No annotations are present, so the description carries the full burden; it is transparent enough for a simple list tool, though it could explicitly state it is read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of three sentences that sequentially cover the action, the return format, and usage guidance. Every sentence adds value, and the structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no parameters and no output schema, so the description sufficiently covers its functionality, return values, and typical usage context. It explains the common scenario (single account) and purpose, making it fully complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so the baseline is 4 per the rubric. The description does not need to add parameter information; it instead describes the output, which is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to list all Signal accounts with their phone numbers and registration status. It distinguishes from the sibling tool 'get_own_number' by noting that the latter is for single-account setups, ensuring the agent knows which tool to use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises when to use this tool ('when you need to confirm which accounts are available before sending or receiving messages') and when to use an alternative ('Use get_own_number to get the active account's number in single-account setups'), providing clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_attachmentsA
List all Signal attachments that have been downloaded and saved to the local store. Returns filenames, MIME types, file sizes, and the associated message timestamp for each attachment. Only attachments explicitly downloaded (via receive_messages or import) appear here — attachments not yet fetched from Signal's servers are not listed. Use the returned filename with get_attachment to retrieve the actual file content. Use when you need to discover what media files are available locally before reading them. Do NOT use to download new attachments from Signal servers — use receive_messages for that.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It explains that only explicitly downloaded attachments are listed, not those unfetched. It also specifies return fields. However, it does not explicitly state that the operation is read-only, though implied. No contradictions with annotations (none exist).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose. Each sentence adds value: purpose, return details, usage guidance. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, description is complete: explains purpose, return contents, and usage context. Covers what an agent needs to decide when to call it and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has no parameters (100% coverage trivially). Description adds meaning by explaining what the tool returns and the condition for listing (downloaded only). Baseline for 0 params is 4, and description meets it well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List all Signal attachments that have been downloaded and saved to the local store' with a specific verb and resource. It distinguishes from siblings like get_attachment (retrieves file content) and receive_messages (downloads new attachments).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('discover what media files are available locally before reading them') and when not to use ('Do NOT use to download new attachments from Signal servers — use receive_messages for that'). Also clarifies that only downloaded attachments appear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Filter contacts by name or number (case-insensitive substring match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool returns contacts from the local store (no network calls), includes names and phone numbers, and supports substring filtering. While it does not mention potential limits or error cases, for a simple read operation this is sufficiently transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences. The first explains the core action, the second describes the optional parameter, and the third points to a related sibling tool. Every sentence adds value, with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no output schema, the description is complete. It tells the agent what the tool returns (contacts with names and numbers), how to filter, and where to go for more detailed profile information. No gaps remain for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers the search parameter with a case-insensitive substring match description. The description adds minimal extra meaning ('by name or number substring'), which is consistent but not significantly enhancing beyond the schema. Given 100% schema coverage, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all Signal contacts known to the account, specifies what is included (names and phone numbers), and distinguishes it by mentioning the local store. It also contrasts with the sibling tool get_profile, providing clarity on its unique purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the optional search parameter (to filter by name or number substring) and directs users to get_profile for fetching Signal profiles. However, it does not explicitly differentiate from other listing tools like list_conversations or list_groups, though the context implies contact-specific usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_conversationsA
List all conversations (both direct and group) ordered by most recent message. Returns contact/group name, phone number or group_id, last message preview, timestamp, and unread count. Use this to get an inbox overview before reading specific conversations with get_conversation. Contact and group names are resolved from local signal-cli contacts and groups. Use get_unread to fetch only unread messages across all conversations. Do NOT use this to read message history — use get_conversation for that.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description discloses return fields and name resolution from local contacts. Does not explicitly state read-only nature but it is implied. Adequate but could mention side effects (none) or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise with multiple sentences each adding value. Front-loaded with purpose, then return fields, usage guidance, and alternatives. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description explains all return fields adequately. Covers ordering, returned data, name resolution. Complete for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has zero parameters, so baseline is 4. Description does not add param info because none exist. Appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it lists all conversations ordered by most recent message and specifies the returned fields. Explicitly differentiates from sibling tools like get_conversation and get_unread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage context: use for inbox overview before reading specific conversations, and warns not to use for reading message history. Names alternative tools get_unread and get_conversation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_devicesA
List all devices currently linked to your Signal account, including the primary device and any linked secondaries. Returns each device's ID, name, and last-seen timestamp. Device ID 1 is always the primary device (your registered phone). Use the returned device_id values with update_device (rename), remove_device (unlink). Use when auditing which devices have access to your Signal account, or to find the ID of a device you want to rename or remove.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It explains output fields and notes device ID 1 is primary. For a read-only list operation, it is sufficiently transparent, though it could mention authentication implicitly assumed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: first states purpose and output, second adds detail about primary device, third gives usage context. No wasted words, well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, the description fully explains what the tool returns and when to use it, making it complete for an agent to decide and invoke.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has zero parameters, so baseline is 4. The description adds value by explaining the return fields, which is beyond schema requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists all devices linked to a Signal account, specifies return fields (ID, name, last-seen timestamp), and distinguishes from sibling tools like update_device and remove_device.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'when auditing which devices have access ... or to find the ID of a device you want to rename or remove.' Also references sibling tools for further actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden of behavioral disclosure. It accurately describes the read-only nature and what fields are returned, but does not mention pagination, performance, or access restrictions. Still, for a simple list tool it is sufficiently transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The first sentence fronts the core function, and the second adds contextual usage. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (no parameters, simple list), the description covers purpose, usage relationship to other tools, and what to expect in return (group details). It is complete for its scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters (100% coverage). The description does not need to add parameter details. According to the rule, 0 parameters yields a baseline of 4, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all Signal groups the account belongs to, specifying included fields (name, ID, members, admin list). It distinguishes from sibling tools like create_group, update_group, and leave_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains that the returned group_id is required for send_group_message, send_group_attachment, and update_group, and mentions update_group for modification and leave_group for exiting. Provides clear guidance on when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_identitiesA
List the Signal identity keys (safety numbers) and trust levels for one or all contacts. Each contact has a unique identity key; Signal uses these to verify end-to-end encryption integrity. Trust levels: TRUSTED_VERIFIED (manually verified), TRUSTED_UNVERIFIED (trusted on first use, TOFU), or UNTRUSTED (key changed — sending is blocked until re-trusted). Omit number to inspect all stored identities; provide number to filter to a specific contact. Use before calling trust_identity to check the current trust state and key fingerprint. Use when Signal reports 'safety number changed' to identify which contact needs re-verification. Do NOT use to trust or change trust levels — use trust_identity for that.
| Name | Required | Description | Default |
|---|---|---|---|
| number | No | Filter to a specific contact (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description fully discloses behavior: returns identity keys and trust levels, explains trust level meanings, and clarifies scope (all vs. filtered). Since no annotations exist, the description carries the full burden and meets it completely.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured, and front-loaded. Every sentence adds value without redundancy, covering purpose, explanation, usage conditions, and exclusions efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (one optional parameter, no output schema), the description is complete: explains what is returned, trust level meanings, and usage scenarios. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single optional parameter 'number' has a schema description, but the tool description adds usage context: omitting returns all, providing filters. This adds meaningful guidance beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists Signal identity keys and trust levels for one or all contacts, distinguishes from sibling trust_identity by explicitly stating what not to use it for, and explains trust levels, making purpose and differentiation clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: before calling trust_identity and when Signal reports safety number change. Also states what not to use it for (trust or change trust levels), directing to sibling tool trust_identity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scheduled_messagesA
List pending scheduled messages. Returns scheduled jobs with their ID, recipient, send time, and status. Use cancel_scheduled_message to cancel a pending job.
| Name | Required | Description | Default |
|---|---|---|---|
| include_done | No | Include already-sent, cancelled, and failed messages (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that the tool returns scheduled jobs by default (pending only) and enumerates the returned fields. This gives an agent a concrete sense of the tool's read-only, listing behavior and output shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences carry all essential information: what the tool does, what it returns, and where to go for cancellation. The most important part is front-loaded and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter and no output schema, the description is largely complete: it states the default scope (pending), the return fields, and the related cancellation tool. The behavior of include_done is left to the schema, which fully explains it, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the only parameter (include_done) with 100% coverage. The description does not need to repeat it, so the baseline of 3 is appropriate; no additional parameter meaning is added beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'List pending scheduled messages,' and adds the returned fields (ID, recipient, send time, status). This distinguishes it from sibling tools like cancel_scheduled_message and run_scheduled_messages without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for viewing pending scheduled messages and explicitly routes cancellation to cancel_scheduled_message. It does not explicitly contrast with schedule_message or run_scheduled_messages, but the use case is clear enough for an agent to decide when listing is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description bears full responsibility. It discloses the return values (pack_id, sticker_id) and their purpose, which is sufficient for a simple read-only list operation. No hidden behaviors or side effects are indicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the core purpose and immediate action. Every sentence earns its place: the first explains what the tool does and returns, the second provides an alternative tool for installation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description fully covers its behavior: listing all sticker packs, returning needed IDs, and connecting to relevant sibling tools. No gaps for this simple operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has zero parameters, so schema coverage is 100% by definition. With no parameters to describe, the description adds value by explaining the output and usage context, meeting the baseline for trivial parameter sets.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'List' and resource 'sticker packs installed on this Signal account', and specifies the return values (pack_id, sticker_id) that are needed for send_sticker/send_group_sticker, distinguishing it from sibling tools like add_sticker_pack.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool (to get IDs before sending stickers) and directs to add_sticker_pack for installing new packs, providing clear alternatives and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_as_unreadA
Mark one or more messages as unread in the local signal-mcp store. This updates only the local database — it does not affect read receipts already sent to the sender, nor does it change how messages appear on other devices. message_ids are the internal signal-mcp IDs returned by get_conversation or search_messages. Messages marked unread are returned by get_unread on the next call. Use when you want to flag a message for follow-up later.
| Name | Required | Description | Default |
|---|---|---|---|
| message_ids | Yes | List of message IDs to mark as unread |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses key traits: only local update, no impact on read receipts or other devices, IDs come from specific tools, and marked messages appear in get_unread.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, well-structured and front-loaded. It covers purpose, scope, parameter source, and effect without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description is complete. It explains local scope, ID source, and the resulting effect on get_unread, leaving no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes message_ids as a list of string IDs. The description adds value by explaining that these are internal IDs from get_conversation or search_messages, and that marking them unread affects get_unread.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool marks messages as unread in the local store, distinguishing it from siblings like delete_message or send_read_receipt. It specifies the scope (local only) and the effect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear use case: 'flag a message for follow-up later.' It also explains the local-only nature and what it does not affect, giving implicit guidance on when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | Group ID for group conversations — provide this OR recipient | |
| recipient | No | Phone number for DM conversations — provide this OR group_id | |
| target_author | Yes | Phone number of the message author (E.164) | |
| target_timestamp | Yes | Timestamp of the message to pin (from get_conversation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description discloses side effects (system notification, replacement of previous pin), permissions (any participant), and the fact that only one pin exists per conversation. Could mention reversibility, but overall good.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is informative with 9 sentences, each adding value. It is front-loaded with the main purpose. Could be slightly trimmed but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 4 parameters and no output schema, the description covers purpose, side effects, prerequisites, and usage guidance. Leaves no major gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all parameters (100%), so baseline is 3. The description adds value by specifying mutual exclusivity of recipient/group_id and sourcing target_author and target_timestamp from get_conversation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool pins a message in a DM or group conversation, making it prominent. It distinguishes from the sibling tool 'unpin_message' by explicitly mentioning it for removal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('highlight an important message for all participants') and when-not-to-use ('do NOT use if you only want to bookmark for yourself'), plus prerequisites (get target_author and target_timestamp from get_conversation).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Delete messages older than this many days (default: 180) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It transparently discloses that the operation is local-only and that it deletes based on age. It does not cover potential side effects like irreversibility or confirmation prompts, but the core behavior is well-explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two sentences. The first sentence states the action and default, the second clarifies scope and purpose. No extraneous information. Front-loaded with the action verb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity of the tool (one parameter, no output schema, no nested objects), the description is complete. It explains what it does, its scope, and its purpose, which is sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers the single parameter (days) with full description and default. The description repeats the default value (180) but adds no additional semantic meaning beyond what the schema provides. Baseline 3 is appropriate given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (delete), the resource (locally stored messages), and the condition (older than given days). It explicitly distinguishes from server-side deletion by noting that it only affects local history. This differentiates it from sibling tools like clear_local_store or delete_local_messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear use case ('keeping the store from growing unbounded') and specifies that it only affects local storage. However, it does not explicitly compare with alternatives such as clear_local_store or delete_local_messages, nor does it state when not to use this tool. The guidance is good but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
react_to_messageA
Add or remove an emoji reaction on a Signal message in a direct or group conversation. target_author is the phone number of the person who sent the original message. target_timestamp is the sent_at timestamp of that message (from get_conversation). Supply recipient for a DM conversation or group_id for a group conversation — exactly one is required. Each account can have at most one reaction per message; calling again with a different emoji replaces the previous one. Set remove=true to retract an existing reaction without adding a new one (emoji is still required as the key). Use when you want to react to or acknowledge a specific message without sending a reply. Do NOT use to send a text reply — use send_message or send_group_message for that.
| Name | Required | Description | Default |
|---|---|---|---|
| emoji | Yes | Emoji to react with (e.g. '👍') | |
| remove | No | Remove an existing reaction (default false) | |
| group_id | No | Group ID for group reactions | |
| recipient | No | Phone number for DM reactions | |
| target_author | Yes | Phone number of the message author | |
| target_timestamp | Yes | Timestamp of the message to react to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that each account can have at most one reaction per message, calling again replaces the previous one, and setting remove=true retracts an existing reaction. No annotations provided, so full burden is on description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single paragraph starting with main action, then parameter rules, then usage guidance. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the tool (6 parameters, 3 required, conditional logic), the description covers all behavioral aspects, parameter constraints, and usage context. No output schema, but description is self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond schema by explaining that exactly one of recipient/group_id is required, that emoji is still required for removal, and clarifies the roles of target_author and target_timestamp. Schema coverage is 100%, but description adds significant context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs 'add or remove' and resource 'emoji reaction', and explicitly distinguishes from sending text replies by naming alternatives send_message and send_group_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states when to use (reacting without sending a reply), when not to use (for text replies), and gives exact alternative tools. Also notes the requirement of exactly one of recipient or group_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receive_directA
Receive messages by calling signal-cli directly, bypassing the daemon. Use this as a fallback when the daemon is stuck or unresponsive — it stops the daemon, calls signal-cli receive directly, then lets the daemon restart. Prefer receive_messages (daemon mode) for normal use; use this only for troubleshooting.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Seconds to wait for messages (default: 5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does so well. It discloses the critical side effect: 'it stops the daemon, calls signal-cli receive directly, then lets the daemon restart.' The agent is warned that this tool is disruptive and not a simple read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences that front-load the core behavior, then provide context and the preferred alternative. Every sentence earns its place, and there is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one simple parameter and no output schema, the description fully covers what the tool does, when to use it, how it behaves, and how it relates to the sibling tool. An agent has everything needed to invoke it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single timeout parameter is already described in the schema. The description does not add extra meaning about the parameter beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Receive messages by calling signal-cli directly, bypassing the daemon') and clearly differentiates it from the sibling receive_messages by framing it as the direct, non-daemon mode. An agent can immediately understand what this tool does and how it differs from the normal receive path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Use this as a fallback when the daemon is stuck or unresponsive' and 'Prefer receive_messages (daemon mode) for normal use; use this only for troubleshooting.' This clearly states the condition and names the preferred alternative, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Seconds to wait for messages (default: 5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description discloses that the tool polls manually and stores messages, implying side effects. Could mention authorization or rate limits, but sufficient for a simple polling tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with front-loaded action and zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter and no output schema, the description covers purpose, usage, and behavior. A brief note on return value or side effects could improve completeness, but it's largely adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for timeout is 100% with its own description and default. Description adds no additional parameter-level detail, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool polls for new messages and stores them, and explicitly distinguishes it from the sibling get_unread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises preferring get_unread for automatic polling with results, and reserves receive_messages for cases where polling without reading is desired.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes | Phone number to remove (E.164 format) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It clearly states behavioral traits: only removes local record, does not block, delete history, or affect messaging. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with action, no wasted words. Efficiently conveys key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema, no annotations), the description is complete: explains action, constraints, and alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already describes the parameter with 100% coverage (E.164 format). Description adds no further parameter details, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action: removing a contact from the local list. Distinguishes from siblings like block_contact and update_contact by explaining what it does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool and when to use alternatives: 'To prevent incoming messages, use block_contact instead. Use update_contact to set a local display name without removing.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_deviceA
Permanently unlink a secondary device from your Signal account. Only works when signal-mcp is the account's primary device — fails with 'This command doesn't work on linked devices' if signal-mcp was set up via signal-cli link. The device loses access to send and receive messages immediately. device_id must be a secondary device (ID ≥ 2) — you cannot unlink your primary device. The removed device is not notified; it simply stops receiving messages. This action is irreversible — the device must re-link via add_device to regain access. Use list_devices to find the device_id you want to remove. Use update_device to rename a device without removing it.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | Yes | Device ID (get from list_devices) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully carries the burden. It discloses the immediate loss of access, that the removed device is not notified, the irreversibility, and the failure mode for linked devices. This is comprehensive for a destructive action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds necessary information. It opens with the core purpose, then logically covers conditions, effects, irreversibility, and alternatives. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers all needed context: prerequisites, failure conditions, behavioral impact, and alternative tools. Nothing an agent needs to decide whether to use it or how to use it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema's param description is minimal ('get from list_devices'), but the tool description adds critical semantic constraints: device_id must be ≥2 and cannot be the primary device. This goes beyond the schema and is essential for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('unlink') and resource ('secondary device from your Signal account'), and immediately differentiates from siblings by specifying it's for secondary devices only. It clearly distinguishes from add_device, update_device, and list_devices by its irreversible nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when it works (primary device only) and when it fails, and names alternatives: 'Use list_devices to find the device_id' and 'Use update_device to rename a device without removing it.' It also warns about the ID requirement (≥2) and the re-link path via add_device.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_pinA
Remove the Signal Registration Lock PIN, disabling re-registration protection on this account. Only works when signal-mcp is the account's primary device — fails with 'This command doesn't work on linked devices' if signal-mcp was set up via signal-cli link. After removal, anyone who controls your phone number can re-register Signal without a PIN. Use only if you intentionally want to disable the registration lock. Use set_pin to set a new PIN instead of removing the existing one. Do NOT remove the PIN if you rely on it as a security measure against SIM-swap attacks.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries full burden. It discloses the primary-device-only constraint and the exact error message on linked devices. It also warns about the security consequence (anyone with phone number can re-register) and the SIM-swap risk, which is critical behavioral information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, but each conveys essential information: the action, the constraint, the security warning, and the alternative. It is front-loaded with the core purpose and avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with no output schema, the description is fully complete. It covers what the tool does, when to use it, when not to, what happens on failure, and the consequences. An agent has all information needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so schema is empty and coverage is trivially 100%. Baseline for zero params is 4, and the description doesn't need to explain any parameters. No additional parameter semantics required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific verb 'Remove' and resource 'Signal Registration Lock PIN', and explains the effect (disabling re-registration protection). It also distinguishes from set_pin by explicitly recommending set_pin for setting a new PIN, making it clear this is for removal only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use only if you intentionally want to disable the registration lock.' It also provides the alternative: 'Use set_pin to set a new PIN instead of removing the existing one,' and warns against removal if relying on it for SIM-swap protection. This gives clear decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_scheduled_messagesA
Process and send any scheduled messages that are currently due. The background service calls this automatically, but you can also call it manually to deliver messages immediately without waiting for the next service run. Safe to call anytime, including when nothing is due (returns processed=0). Returns {processed: count, results: [{id, status: 'sent'|'failed', timestamp or error}, ...]} — one entry per job that was due, from list_scheduled_messages' job IDs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it reveals that the background service normally calls it, that manual invocation is supported, that nothing-due returns processed=0, and that each due job yields a per-job result with status 'sent' or 'failed' plus timestamp or error. This fully discloses the tool's behavior and return semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense: purpose, invocation method, safety, and return format are each covered in a single front-loaded passage with no filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with no output schema, the description fully explains input (none needed), trigger conditions, side effects, and the exact returned shape. It also links to list_scheduled_messages for ID provenance, making the tool self-sufficient for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is empty, so there are no parameter semantics to clarify. The description adds context about what the tool operates on (due scheduled messages) and what the result shape means, which is the useful equivalent for a parameterless action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Process and send any scheduled messages that are currently due.' It clearly distinguishes itself from the scheduling, listing, and canceling siblings by focusing on execution of due jobs, and it references list_scheduled_messages for the job IDs it consumes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call manually — to deliver messages immediately without waiting for the next background service run — and reassures that calling when nothing is due is safe. It does not explicitly list sibling tools to avoid, but the automatic-vs-manual context makes the intended trigger clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_messageA
Schedule a message to be sent at a specific future time. The message will be delivered when the background service runs (install-service) or when run_scheduled_messages is called manually. Returns the scheduled job ID — use cancel_scheduled_message to cancel it.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Message text to send | |
| send_at | Yes | When to send — ISO datetime string (e.g. '2024-06-01T09:00:00' or '2024-06-01 09:00') | |
| group_id | No | Group ID (for group messages). Mutually exclusive with recipient. | |
| recipient | No | Phone number in E.164 format (for DMs). Use group_id for group messages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It meaningfully reveals that delivery is not immediate or guaranteed at the exact timestamp, but depends on a background service or manual invocation, and that the tool returns a job ID useful for cancellation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each serving a purpose: the action, the delivery behavior, and the return value with cancellation path. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's core purpose, the asynchronous delivery model, the returned job ID, and how to cancel. While there is no output schema, the return value is described adequately. It does not cover edge cases like past send_at values, but these are not critical for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters including the ISO datetime format and group/recipient mutual exclusivity. The description adds no extra parameter-level meaning, matching the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool schedules a message for a future time, using a specific verb and resource. It distinguishes itself from immediate-send siblings like send_message and from the related cancel_scheduled_message and run_scheduled_messages tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when delivery will occur: when the background service runs or when run_scheduled_messages is called manually. It also directs cancellation to cancel_scheduled_message, though it does not explicitly contrast with immediate sending via send_message.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesA
Full-text search across all locally stored messages by keyword or phrase. Searches message bodies using SQLite FTS — results are ranked by relevance. Only messages in the local store are searchable; messages never received on this device are excluded. Use sender to narrow results to a specific conversation. Use limit and offset to paginate through large result sets. Use when looking for a specific message or topic across all Signal conversations. Do NOT use to browse a conversation chronologically — use get_conversation for that.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return (default 50) | |
| query | Yes | Keyword or phrase to search for | |
| offset | No | Skip this many results for pagination (default 0) | |
| sender | No | Filter results to messages from this phone number (E.164) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that search uses SQLite FTS, results are relevance-ranked, only locally stored messages are searched, and pagination is available. No annotations provided, but description covers behavioral traits thoroughly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six sentences, front-loaded with core purpose, then technical details, then usage guidance. No redundant or unclear statements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, constraints, parameters, and usage thoroughly. Lacks output format details but is essentially complete for a standard search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with good descriptions; description adds context like E.164 format for sender and pagination usage, exceeding minimal baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs full-text search across locally stored messages by keyword or phrase, and distinguishes itself from chronological browsing via get_conversation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (searching for specific messages/topics across conversations) and when not to (use get_conversation for chronological browsing), with parameters like sender, limit, offset explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Single file path (absolute, relative, or ~/path) | |
| paths | No | Multiple file paths to send as one message | |
| caption | No | Optional caption text shown below the attachment | |
| recipient | Yes | Phone number in E.164 format | |
| view_once | No | Send as view-once media — recipient can only view it once before it disappears |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Covers sending types and view_once, but lacks details on file size limits, network requirements, or error handling. Adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with main purpose, no redundancy. Efficient communication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple send operation, description covers purpose, parameter selection, and sibling differentiation. Lacks return value description (no output schema), but overall sufficient for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline is 3. Description adds minimal value beyond schema: explains path vs paths and view_once behavior. Does not add depth to recipient or caption.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Send one or more files or images to a Signal contact' and lists supported types. It distinguishes from sibling send_group_attachment by explicitly noting to use that for groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use path vs paths and view_once option. Tells to use send_group_attachment for groups. Lacks explicit 'do not use when' but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey behavior. It states 'push' and 'one-way sync,' indicating mutation. However, it does not detail merge behavior, idempotence, or potential conflicts. Adequate but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: action, use case, directionality. No fluff, every sentence adds value. Front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, the description covers the essential behavior. It explains what the tool does, when to use it, and its directionality. Complete for a simple sync operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist; schema coverage is 100%. Description adds no param details, but none needed. Baseline 4 is appropriate as the schema fully covers parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Push your local contacts list to all linked Signal devices.' This distinguishes it from sibling tools like list_contacts (read-only) and update_contact (individual contact update).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a specific use case: 'Useful when contacts added via signal-cli are not showing up on other devices.' Also clarifies directionality: 'one-way sync from this device outward.' Lacks explicit when-not-to-use, but sufficient for a simple tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Single file path (absolute, relative, or ~/path) | |
| paths | No | Multiple file paths to send as one message | |
| caption | No | Optional caption text shown below the attachment | |
| group_id | Yes | Group ID (get from list_groups) | |
| view_once | No | Send as view-once media — each recipient can only view it once |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries the burden. It discloses that files must exist locally, non-existent paths return an error, and view_once does not apply to documents. However, it does not mention rate limits, size limits, or what happens if group_id is invalid. Additional behavioral details could improve transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise with 5 sentences, front-loaded with key purpose and functionality. Every sentence adds value without redundancy. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description covers the main aspects of the tool: supported file types, delivery method, view_once behavior, and parameter usage. Missing details on failure modes or size limits, but adequate for a send operation with 5 parameters. Could mention return values briefly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by clarifying that view_once does not apply to document types (not in schema) and explaining the path vs paths distinction. This extra context justifies a higher score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sends files (photos, videos, documents, audio) to a Signal group in a single message. It explicitly distinguishes from siblings by directing to use send_attachment for direct messages and send_group_message for text-only messages, providing a specific verb and resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when to use: sharing files with a group chat. Also gives when not to use: direct messages or text-only. Mentions using list_groups to obtain group_id. Does not explicitly clarify when to use single path vs multiple paths, but the description and schema imply both are valid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_group_messageA
Send a text message to a Signal group. The message is delivered end-to-end encrypted to all group members. Returns the sent timestamp, which can be used as target_timestamp for react_to_message or edit_message. To @mention a member, include their name in the message text and pass a mentions list where each entry has start (character index of the mention in the text), length (character count), and author (E.164 phone number). start/length are UTF-16 code units, not Unicode codepoints — an emoji before the mention shifts the offset by 2, not 1. To reply/quote a message, provide quote_author (sender's phone number) and quote_timestamp (from get_conversation). Use list_groups to get group_id values. Use send_group_attachment to send files or images to a group. Do NOT use for direct messages to a contact — use send_message instead.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Message text to send | |
| group_id | Yes | Group ID (from list_groups) | |
| mentions | No | List of @mentions. Each item: {start: offset of the mention in the message (UTF-16 code units, not codepoints), length: mention length (UTF-16 code units), author: E.164 phone number of the mentioned member}. Example: message='Hello @Alice', mentions=[{start:6,length:6,author:'+1234567890'}] | |
| quote_author | No | Phone number (E.164) of the author of the message being quoted | |
| quote_timestamp | No | Timestamp of the quoted message (from get_conversation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses end-to-end encryption, delivery to all members, the return value semantics, the UTF-16 code unit pitfall for mentions, and the prerequisite for quoting. It stops short of failure modes or side effects, but for a send operation the disclosed traits are substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, return-value usage, mention encoding caveat, quote requirements, ID provenance, and sibling exclusions. It is front-loaded and logically ordered, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters and no output schema, the description covers everything an agent needs: how to construct mentions, the encoding gotcha, how to reply/quote, where to get identifiers, what the return value is for, and which sibling to use instead. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining the mention encoding with an emoji example, tying the return timestamp to react/edit operations, and clarifying the source of quote_timestamp and group_id. Some redundancy exists with the schema, but the added context pushes it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Send a text message to a Signal group.' It distinguishes itself from siblings by explicitly contrasting with send_message (direct messages) and send_group_attachment (files/images), so an agent can select it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: use list_groups to obtain group_id, use send_group_attachment for files, and do NOT use for direct messages (use send_message instead). It also tells when the returned timestamp is useful (for react_to_message or edit_message). This is fully actionable routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pack_id | Yes | Sticker pack ID (hex string from list_sticker_packs) | |
| group_id | Yes | Group ID (get from list_groups) | |
| sticker_id | Yes | Sticker ID within the pack (from list_sticker_packs) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. It explains that sticker is rendered as a distinct message type, not file attachment, and that invalid pack/sticker returns error. Could additionally mention lack of side effects or permissions, but the existing disclosure is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is adequately concise with front-loaded purpose. Every sentence adds value, though it could be slightly tightened. No extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 required parameters, no annotations, and no output schema, the description covers purpose, usage, parameter semantics, prerequisites, and alternatives. An agent can correctly select and invoke the tool without gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of parameters, and the description adds value by explaining that pack_id is a hex string, sticker_id is 0-based, and both must match an installed pack. Also explains how to obtain them via list_sticker_packs, going beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it sends a sticker to a Signal group, distinguishes it from sending images (use send_group_attachment instead) and from direct messages (use send_sticker). It uses specific verb+resource and identifies the unique action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (expressive image reaction in group), when-not-to-use (for regular images or DMs), and prerequisites (list_groups, list_sticker_packs, add_sticker_pack if needed). Directly names alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Message text to send | |
| recipient | Yes | Phone number in E.164 format (e.g. +1234567890) | |
| quote_author | No | Phone number of the author of the message being quoted/replied to | |
| quote_timestamp | No | Timestamp of the message being quoted/replied to (from get_conversation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses end-to-end encryption, return value (timestamp) for reactions/edits, and quoting behavior. No annotations provided, but description adds useful behavioral context beyond schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with purpose and encryption, then return value and usage tips, then alternatives. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple parameter set with full schema coverage and no output schema, the description covers purpose, usage, return value, and relationship to siblings. Adequate for effective agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3. Description adds value by explaining the usage of quote_author and quote_timestamp (for quoting) and the return timestamp usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Send' and resource 'text message to a Signal contact', and distinguishes from siblings by mentioning send_group_message and send_attachment for alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool vs alternatives: for group chats use send_group_message, for attachments use send_attachment. Also explains how to reply/quote using quote parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_message_request_responseA
Accept or decline a message request from an unknown contact (required before replying to strangers)
| Name | Required | Description | Default |
|---|---|---|---|
| accept | Yes | true to accept and start chatting, false to decline/block | |
| sender | Yes | Phone number of the contact who sent the message request |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It states what the tool does but does not disclose side effects (e.g., whether declining blocks the contact, if notifications are sent, or if there are rate limits). The behavior of accepting vs. declining is implied but not fully detailed. For a simple tool, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted words. It is front-loaded with the action and provides essential context. Perfectly concise for a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 parameters, no output schema), the description is complete enough for an agent to use correctly. It explains purpose, usage context, and the two possible actions. It does not specify return values, but for a mutation tool like this, success/failure is typically inferred. A minor gap is lacking what happens after decline (e.g., is the contact blocked?), but overall it's sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds minimal additional meaning beyond the schema. The schema already explains 'sender' as phone number and 'accept' as boolean for accept/decline. The description's context that this is a prerequisite for replying is helpful but does not significantly enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Accept or decline a message request from an unknown contact'. It specifies the resource (message request) and the two possible outcomes (accept or decline). This distinguishes it from sibling tools like 'send_message' and 'block_contact'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes usage guidance: 'required before replying to strangers'. This tells the agent when the tool must be used. While no explicit when-not-to-use is given, the context is clear for a simple two-option tool. It could be improved by mentioning alternatives like directly blocking, but it's sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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. message supports lightweight markdown for Signal's native rich text: bold, strikethrough, monospace — use it to visually distinguish different kinds of notes (e.g. a bold title per note) instead of plain text blobs. Pass attachments (e.g. a QR code image) and quote_author/quote_timestamp (to thread a follow-up under a previous note, from a prior send_note_to_self result) to combine content in one message instead of separate calls.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Note text to save. Supports **bold**, ~~strikethrough~~, `monospace` | |
| attachments | No | File paths to attach (e.g. a QR code or screenshot) | |
| quote_author | No | Your own account number, to thread this note under a previous one | |
| quote_timestamp | No | Timestamp of the note being followed up on (from a prior send_note_to_self result) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses cross-device sync and markdown rendering behavior, which is meaningful context. It does not detail return values or limitations, but for a self-messaging operation the disclosed behavior is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and compact for a 4-parameter tool. There is minor redundancy between 'synced across all your linked Signal devices' and 'sync to your phone,' but each sentence otherwise earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create-and-send tool with one required parameter and no output schema, the description covers purpose, sync behavior, message formatting, and optional attachments/quoting. It references the prior send_note_to_self result for quote_timestamp, giving enough context to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value beyond the schema: markdown usage guidance, attachment purpose, and quote_author/quote_timestamp semantics for threading follow-ups. This helps an agent use the parameters more effectively than the field descriptions alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Send a note to yourself via Signal's 'Note to Self' / saved messages feature') and explicitly distinguishes it from normal messaging siblings by targeting the user's own saved messages. There is no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete use cases ('saving reminders, bookmarks, or drafts') and advises combining attachments and quotes into one call 'instead of separate calls.' It does not explicitly say when not to use it versus send_message, but the context is clear enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_read_receiptA
Send a read receipt to a contact, notifying them that you have read their messages. The sender sees a 'Read' indicator under their messages in their Signal app. Pass all timestamps you want to mark as read in a single call to batch the receipts. Timestamps come from the received_at or sent_at fields in get_conversation. Note: read receipts are only delivered if the sender has read receipts enabled in their Signal settings. Use after reading a conversation with get_conversation to acknowledge the messages. Do NOT use to mark messages as read in the local store — get_conversation does that automatically. Do NOT use for group messages — Signal does not support per-sender read receipts in groups.
| Name | Required | Description | Default |
|---|---|---|---|
| sender | Yes | Phone number (E.164) of the contact whose messages you are acknowledging | |
| timestamps | Yes | Timestamps of the messages to mark as read (from get_conversation sent_at/received_at fields) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses effect ('Read' indicator), batching behavior, source of timestamps, and dependency on sender's settings. However, it does not mention error handling or what happens if receipts are not delivered (e.g., silent failure).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, well-structured with front-loaded purpose. Every sentence adds value, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, batching, restrictions, and prerequisite. Lacks return value description (though likely trivial) and error conditions, but sufficient for a simple notification tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so description adds limited value. The batching hint ('pass all timestamps in a single call') provides useful context beyond schema, but meaning of timestamps is already clear from schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'send read receipt' and the resource 'a contact', and distinguishes from sibling tools by explicitly forbidding use for group messages and noting that get_conversation handles local marking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance: use after reading a conversation with get_conversation, pass all timestamps in a single call to batch, and do not use for group messages or local store marking. Also notes prerequisite about sender's read receipts setting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pack_id | Yes | Sticker pack ID (hex string from list_sticker_packs) | |
| recipient | Yes | Phone number in E.164 format | |
| sticker_id | Yes | Sticker ID within the pack (from list_sticker_packs) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. It discloses sticker rendering style, error conditions for invalid pack/sticker, and prerequisite actions. Lacks details on response format or rate limits, but adequately covers behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, front-loaded with core purpose, then progressively detailed. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers prerequisites, error conditions, and alternatives. Missing return value description (success/confirmation), but given complexity and lack of output schema, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds meaning: explains pack_id as hex string, sticker_id as 0-based integer, and how to obtain valid values from list_sticker_packs. This goes beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('send'), resource ('single sticker'), and channel ('Signal contact in a direct message'). It distinguishes from siblings like send_group_sticker and send_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use (expressive image reaction/decoration), when not to use (regular images), prerequisites (list_sticker_packs/add_sticker_pack), and alternatives (send_group_sticker, send_attachment).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_sync_requestA
Request a full sync of messages, contacts, and groups from your primary Signal device to this linked device. Signal's linked-device architecture stores history on the primary device; a sync pulls that data here. Use when list_conversations shows no history, list_contacts returns fewer contacts than expected, or list_groups is missing groups that exist on your phone. The sync is asynchronous — data arrives in the background over the next few seconds. Do NOT use to receive new incoming messages — use receive_messages for that.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses asynchronous nature ('data arrives in the background over the next few seconds') and explains architecture reason. No annotations provided, so description carries the burden. Could mention if any authorization required, but overall clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then usage guidance, then behavioral note. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, no output schema, and no annotations, the description fully covers purpose, when to use, async behavior, and exclusion. Complete for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has no parameters. Baseline is 4. Description adds meaning by explaining what the sync entails, compensating for lack of params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool requests a full sync of messages, contacts, and groups from the primary device. Specifies verb (request), resource (sync), and scope (messages, contacts, groups). Distinguishes from sibling tools like receive_messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use: when list_conversations shows no history, list_contacts returns fewer contacts, or list_groups is missing groups. Also tells when not to use: for new incoming messages, use receive_messages instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_expiration_timerA
Set or disable the disappearing-messages timer for a direct or group conversation. Once set, all new messages auto-delete after expiration_seconds on both sides. Common values: 3600 (1h), 86400 (1d), 604800 (1w), 2592000 (30d). Set expiration_seconds=0 to disable disappearing messages entirely. Provide recipient for a direct conversation or group_id for a group — exactly one is required. The change is delivered to all participants and takes effect on new messages immediately; existing messages already sent are not affected. Use when you want automatic privacy for a sensitive conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | Group ID for a group conversation | |
| recipient | No | Phone number for a direct conversation | |
| expiration_seconds | Yes | Timer in seconds (0 to disable). Common: 3600=1h, 86400=1d, 604800=1w |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden. It discloses that messages auto-delete, existing messages are unaffected, changes are delivered to all participants, and how to disable (expiration_seconds=0).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main action, then efficiently covers effects, special values, and constraints. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description covers all necessary context: when to use, parameter constraints, common values, behavior on new vs existing messages. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds meaning: explains common expiration_seconds values, the exactly-one constraint between recipient and group_id, and the effect of setting 0.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs ('Set or disable the disappearing-messages timer') and clearly identifies the resource (conversations). It distinguishes from any sibling tool since no other sibling manages expiration timers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains when to use (set or disable timer) and provides common values. It does not explicitly state when not to use, but the context is clear given no similar sibling tools exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_pinA
Set a Signal Registration Lock PIN to protect your account against SIM-swap and unauthorized re-registration. Only works when signal-mcp is the account's primary device — fails with 'This command doesn't work on linked devices' if signal-mcp was set up via signal-cli link. Once set, anyone attempting to re-register your phone number on Signal must provide this PIN. The PIN must be 4–20 digits. Signal also uses the PIN to derive your storage encryption key. If you forget the PIN, you must wait 7 days for the lock to expire before re-registering. Use when you want to harden your account against SIM-swap attacks. Use remove_pin to disable the lock. Do NOT set a PIN you might forget — losing it locks you out of your account for 7 days.
| Name | Required | Description | Default |
|---|---|---|---|
| pin | Yes | 4–20 digit numeric PIN (e.g. '123456') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure, and it excels: it reveals the primary-device-only constraint, the failure mode on linked devices, the PIN format (4–20 digits), the use of the PIN for storage key derivation, the 7-day lockout on forget, and a warning against choosing a forgettable PIN. All significant side effects are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes: purpose, device constraint, re-registration effect, PIN format, key derivation, lockout consequence, when-to-use, and the alternative tool. It front-loads the primary purpose and flows logically from how it works to the warning. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, this description is fully complete. It covers what the tool does, when to use it, the only parameter, the failure scenario, side effects, and the recommendation to use remove_pin for reversal. An agent has everything needed to invoke it correctly and understand the impact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the pin parameter as '4–20 digit numeric PIN', so schema coverage is 100%. The description adds value beyond that by explaining why the PIN matters (storage key derivation) and the consequence of forgetting it (7-day lockout). This is more than a repeat of the schema, though not a completely new semantic layer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (set a Signal Registration Lock PIN), the resource (the Signal account), and the purpose (protect against SIM-swap and unauthorized re-registration). It is unmistakably distinct from siblings like remove_pin and pin_message, leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use when you want to harden your account against SIM-swap attacks' and points to remove_pin as the way to disable the lock. It also states a critical precondition: only works on the primary device, with a specific failure message on linked devices, so an agent knows exactly when to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stop | No | Set to true to cancel an active typing indicator (default: false = start typing) | |
| recipient | Yes | Phone number in E.164 format |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even without annotations, the description fully discloses behavior: auto-expires ~15 seconds, stop parameter cancels, silently ignored if recipient disabled typing indicators, only for DMs, and no error returned. No surprises.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is front-loaded with main purpose and each sentence adds useful information. It is slightly long but not verbose, efficient for a 2-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 2 parameters, no output schema, and no annotations, the description covers all necessary behavioral, usage, and limitation details comprehensively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds value by explaining the purpose of the stop parameter (cancel active indicator) and the default behavior. It also clarifies recipient usage context, improving understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool sends a typing indicator to a Signal contact. It specifies the verb 'send', the resource 'typing indicator', and distinguishes from siblings by explicitly saying it is for one-to-one DMs only (not groups) and related to before send_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use (before send_message), when to use stop=true (to cancel early), and clear exclusions (not for groups, do not call repeatedly). This helps the agent choose correctly among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_webhookA
Configure a webhook URL that receives a POST request for every incoming Signal message. The payload is a JSON object with fields: event, timestamp, sender, recipient, group_id, body, attachments, quote_id. Use this to connect signal-mcp to n8n, Make, Home Assistant, or any local HTTP endpoint. Pass url=null to disable webhooks. The URL is saved to disk and persists across restarts.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Webhook URL to POST to (e.g. 'http://localhost:5678/webhook/signal'). Omit or pass null to clear. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral disclosure. It explains the delivery mechanism (POST), the trigger (every incoming Signal message), the payload structure (JSON fields listed), the disabling behavior (null), and the persistence side effect (saved to disk, survives restarts). This is rich, non-obvious behavioral detail beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences deliver the purpose, payload, use cases, disabling mechanism, and persistence without wasted words. The core behavior is front-loaded; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter tool, this description is complete: it tells the agent what the URL is for, how the endpoint is invoked, what the payload contains, how to clear the webhook, and that the configuration persists. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The schema already documents 'url' and the clearing behavior ('Omit or pass null'). The description adds an example destination and relation to Signal, but does not materially extend the meaning of the parameter beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Configure') and resource ('a webhook URL') and clearly defines the behavior: receiving a POST for every incoming Signal message. It distinguishes itself naturally from siblings like get_webhook by describing configuration rather than retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Use this to connect signal-mcp to n8n, Make, Home Assistant, or any local HTTP endpoint' and explains the disabling case with 'Pass url=null'. It does not explicitly name alternatives or exclusions, but the context is clear enough for an agent to know when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_change_numberA
Begin migrating your Signal account to a new phone number. Only works when signal-mcp is the account's primary device — fails with 'This command doesn't work on linked devices' if signal-mcp was set up via signal-cli link. Signal sends a 6-digit verification code to the new number via SMS (or voice call if voice=true). After calling this tool, call finish_change_number with the new number and received code to complete the migration. If Signal rejects the request due to rate limits, provide a captcha token obtained from https://signalcaptchas.org/challenge/generate.html. The account remains on the old number until finish_change_number succeeds. Use finish_change_number immediately after receiving the SMS code to complete the change. Do NOT call finish_change_number without first calling this tool — the verification code will not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| voice | No | Request code via voice call instead of SMS (default: false) | |
| number | Yes | New phone number in E.164 format (e.g. +12025551234) | |
| captcha | No | Captcha token (required only if Signal demands it) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It reveals that the tool fails on linked devices, triggers SMS/voice code delivery, may require a captcha, and does not switch the number until finish_change_number succeeds. These are non-obvious behavioral traits, and all are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Each sentence earns its place: purpose, device restriction, code delivery, next-step call, rate-limit handling, and the ordering constraint. The structure is logical and front-loaded with the core action, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-step migration tool with no output schema, the description covers all necessary operational details: prerequisites, error conditions, parameter usage, the follow-up step, and the captcha workaround. An agent can correctly invoke this tool and know what to expect next.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by clarifying the voice parameter (requests voice call instead of SMS), the captcha's conditional need (only if Signal demands it), and the E.164 format for number. This goes beyond the schema's brief descriptions, though the schema already covers the basics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Begin migrating') and resource ('your Signal account to a new phone number'), and distinguishes itself from the sibling finish_change_number by framing itself as the first step. The device-requirement clause adds clarity about when it applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use context: only as the primary device, and explicitly routes the agent to finish_change_number immediately after receiving the code. It also warns against calling finish without this tool, and explains the captcha fallback for rate limits. This fully covers usage scenarios and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_statsA
Get statistics about locally stored messages (count, unread count, DB size on disk, date range)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It clearly states it retrieves statistics without side effects, and lists the exact data returned (count, unread count, DB size, date range).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that immediately conveys the action and resource. It is front-loaded and every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no params, no output schema), the description provides sufficient context about what the tool does and returns. It could arguably mention that data is local, but it already says 'locally stored'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the schema coverage is 100% trivially. The description adds no parameter details, but none are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it gets statistics about locally stored messages, listing specific metrics (count, unread count, DB size, date range). This distinguishes it from sibling tools like clear_local_store or list_conversations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a read-only informational use case. It does not explicitly provide when-to-use or alternatives, but the lack of parameters and the nature of statistics make it clear it's for querying local storage state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| captcha | Yes | Solved captcha token from the Signal captcha page | |
| challenge | Yes | Challenge token from the rate-limit error |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It reveals the tool unblocks the account by submitting a token and captcha, but omits details like error handling or side effects. Minimal but sufficient for a simple tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states purpose, second lists inputs. No extraneous information, front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given simple tool with two params and no output schema, description adequately covers what the agent needs: purpose, input sources. Sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers both parameters with descriptions. The description adds value by specifying the exact source for the captcha (Signal captcha page URL), which is beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool unblocks the account after a rate limit, with specific verb 'unblock' and resource 'account'. It is distinct from sibling tools, which do not involve rate limiting challenges.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool 'after Signal applies a rate limit' and provides instructions for obtaining inputs. It does not mention when not to use, but no sibling alternatives exist for this purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It covers the incremental nature, speed on repeat calls, first-call equivalence to import, and a prerequisite (sqlcipher). However, it does not specify side effects (e.g., whether local data is modified) or discuss safety/read-only aspects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each conveying essential information: incremental sync, performance on repeat calls, first-call behavior, and a prerequisite. No unnecessary words, front-loaded with the main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, behavior, and prerequisites adequately for a simple tool with no parameters and no output schema. It lacks details about what the tool returns after a sync, but given the low complexity, it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters with 100% coverage, so the baseline is 4. The description adds no parameter information, but none is needed since there are no parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs an incremental sync from Signal Desktop, importing only newer messages. It distinguishes from the sibling import_desktop by noting that on first call it behaves like it, making the purpose specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for repeated syncs by highlighting speed on repeat calls and contrasting with first call behavior (like import_desktop). However, it does not explicitly state when to avoid this tool or name alternatives for other scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 from the original poll message in get_conversation — a poll has no separate ID, it's identified by its message timestamp. Only the poll creator can terminate their own poll. Provide either recipient (DM poll) or group_id (group poll).
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | Group ID for a group poll — provide this OR recipient | |
| recipient | No | Phone number for a DM poll — provide this OR group_id | |
| target_author | Yes | Phone number of the poll creator — must be your own number | |
| target_timestamp | Yes | Timestamp of the poll message (from get_conversation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that voting stops, participants are notified, final results become visible, and only the creator can terminate. It also explains the identification method. It does not mention whether the action is irreversible, but 'stopping any further votes' strongly implies finality, and the disclosure is substantial for a tool of this simplicity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a three-sentence paragraph with a logical flow: action, effects, identification, restriction, and parameter selection. Every sentence earns its place, and the main action is front-loaded. It is slightly verbose but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all essential context for calling this tool: how to identify the poll (timestamp from get_conversation), the required fields (target_author, target_timestamp), the optional but exclusive parameters (recipient/group_id), and the creator restriction. It does not mention return values, but there is no output schema, and the behavior is straightforward enough that nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter is already described. The description adds meaningful context beyond the schema: it explains that target_timestamp comes from the original poll message (and why it's used as the identifier), and it clarifies the mutual exclusivity of recipient vs. group_id. This adds value over the raw schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (terminate/close) and the resource (a poll you created), and distinguishes it from sibling tools like vote_poll and create_poll by specifying the termination behavior and creator restriction. It also adds the important identification detail (via timestamp, not a separate ID).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear when-to-use guidance: it's for closing a poll you created, and it explains the parameter selection (either recipient for DM polls or group_id for group polls). It also states the creator-only restriction. However, it does not explicitly mention when not to use it (e.g., if you're not the creator) or name alternative tools, though that is implicitly clear from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trust_identityA
Trust a contact's Signal identity key after verifying their safety number out-of-band. Signal uses identity keys (safety numbers) to verify end-to-end encryption. When a contact's safety number changes (e.g. they reinstalled Signal), sending fails until you explicitly trust the new key — this tool resolves that block. Provide safety_number to trust only that specific verified key; leave it blank to trust all known keys for the number (less secure but unblocks delivery immediately). Use list_identities to inspect the current trust level and key fingerprint before calling. Use when Signal blocks delivery with 'untrusted identity' or 'safety number changed' errors. Do NOT trust without first verifying the safety number via a trusted channel (in-person, phone call). Trusting an unverified key bypasses Signal's TOFU identity verification.
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes | Phone number to trust | |
| safety_number | No | Verified safety number (leave blank to trust all known keys) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses behavioral traits: resolves delivery block, trusts specific or all known keys, and security implications. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured and each sentence adds value. Could be slightly more concise, but no redundancy. Front-loaded with purpose and usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains the effect adequately. References sibling tool list_identities, and covers prerequisites. Does not explain return values or error scenarios, but sufficient for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage with descriptions, but the tool description adds meaningful context: explaining the difference between providing a safety_number vs leaving it blank, and the security trade-off. Adds value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: trusting a Signal identity key after out-of-band verification. It distinguishes from siblings by referencing list_identities for inspection, and explains the context of safety numbers and encryption.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly indicates when to use (Signal blocks delivery with untrusted identity errors) and when not to use (without verifying the safety number). Suggests using list_identities first, and warns against trusting unverified keys.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unblock_contactA
Unblock a previously blocked Signal contact, restoring their ability to send you messages and calls. Only works when signal-mcp is the account's primary device — fails with 'This command doesn't work on linked devices' if signal-mcp was set up via signal-cli link. The contact is NOT notified that they were unblocked. Use block_contact to re-block, or list_contacts to see which contacts are blocked.
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes | Phone number to unblock (E.164 format) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the device restriction, the failure mode, and the side effect that the contact is not notified. This goes beyond basic mutation disclosure and covers relevant operational behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the main action, followed by essential conditions and alternatives. Every sentence serves a purpose with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool with no output schema, the description covers the core action, prerequisites, failure behavior, side effects, and related tools. Nothing essential is missing for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the single parameter fully with a clear description (E.164 format). The description adds no additional semantic meaning beyond the schema, so the baseline of 3 for high schema coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Unblock a previously blocked Signal contact') and the resource (Signal contact), and it explicitly distinguishes from the sibling block_contact. The verb and object are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when the tool works (primary device) and when it fails (linked devices), including the exact error message. It also names alternatives: use block_contact to re-block and list_contacts to see blocked contacts. This is thorough guidance for selection and invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | Group ID for group conversations — provide this OR recipient | |
| recipient | No | Phone number for DM conversations — provide this OR group_id | |
| target_author | Yes | Phone number of the message author (E.164) | |
| target_timestamp | Yes | Timestamp of the pinned message (from get_conversation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explains the effect (removing from header) and prerequisites but does not elaborate on whether the action is reversible, permissions needed, or if the message is otherwise affected. Adequate but could be more explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with action and effect. Every sentence adds value with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool, the description together with the schema is complete. It tells the agent what it does, what parameters are needed, and where to get them. No output schema is needed for this operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, and the description adds meaning by explaining the mutual exclusivity of recipient and group_id, and how to obtain target_author and target_timestamp from get_conversation. This goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the purpose: 'Unpin a previously pinned message in a DM or group conversation, removing it from the conversation header.' It uses specific verbs and resources, and distinguishes from sibling tools like pin_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage guidance: specify recipient for DMs or group_id for groups, and get target_author/target_timestamp from get_conversation. It also references the alternative pin_message. However, it does not explicitly exclude other scenarios or mention when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 update_configuration for messaging settings (read receipts, typing indicators).
| Name | Required | Description | Default |
|---|---|---|---|
| username | No | Set a Signal username (without @) as an alias for your number | |
| device_name | No | Name for this device shown in linked devices list | |
| number_sharing | No | Share your phone number when sending messages | |
| delete_username | No | Delete your current Signal username | |
| discoverable_by_number | No | Allow others to find your account by phone number | |
| unrestricted_unidentified_sender | No | Allow sealed-sender messages from anyone (not just contacts) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It earns credit for disclosing partial-update semantics ('only provide the settings you want to change') and explaining setting behaviors. But as a mutation tool it omits side effects (e.g., conflict between username and delete_username set together), propagation to linked devices, permission requirements, and success/return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, properly front-loaded: purpose first, then usage guidance, then param semantics, then sibling routing. The param explanations partially duplicate schema descriptions, which costs a point, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with zero annotations, no output schema, and ~77 siblings, the description covers the primary routing and partial-update behavior but leaves gaps: no return-value/confirmation info, no error/conflict behavior, and no mention of two of six parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline 3 applies. The description adds minor framing (the '@username alias' format, delete_username semantics, grouping as privacy/identity settings) but largely restates schema text and omits two params entirely: device_name and unrestricted_unidentified_sender, the latter being the most jargon-heavy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Update Signal account-level privacy and identity settings.' The concrete param explanations (discoverable_by_number, number_sharing, username, delete_username) make the scope tangible and distinguish it from siblings like update_configuration, update_profile, and update_contact, reinforced by the explicit routing sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'All parameters are optional — only provide the settings you want to change' tells the agent this is a partial-update tool, and 'Use update_configuration for messaging settings (read receipts, typing indicators)' names the alternative and the condition. However, it never disambiguates device_name from the sibling update_device, and doesn't route to update_profile/set_pin for adjacent account surfaces.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_configurationA
Update Signal account-wide messaging settings. Only works when signal-mcp is the account's primary device — fails with 'This command doesn't work on linked devices' if signal-mcp was set up via signal-cli link. read_receipts controls whether Signal tells senders when you have read their messages. typing_indicators controls whether contacts see the '...' indicator when you are composing. link_previews controls whether URLs in outgoing messages generate inline previews. unidentified_delivery_indicators controls whether sealed-sender delivery icons are shown. All parameters are optional — omit any setting you do not want to change. Changes take effect immediately and persist across sessions. signal-cli has no way to read back current values — track what you've set yourself if needed. Use update_account for account-level privacy settings (discoverability, username). Do NOT use to change your profile name or photo — use update_profile for that.
| Name | Required | Description | Default |
|---|---|---|---|
| link_previews | No | Enable/disable link previews in messages | |
| read_receipts | No | Enable/disable sending read receipts | |
| typing_indicators | No | Enable/disable sending typing indicators | |
| unidentified_delivery_indicators | No | Show/hide sealed sender indicators |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the linked-device limitation, immediate and persistent effects, and the lack of read-back. Minor omission: doesn't mention potential permission requirements, but overall transparent for a write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is thorough yet efficient. Each sentence adds distinct information—purpose, constraints, parameter meanings, alternatives. Front-loaded with the primary purpose, and no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers all needed context: what the tool does, when to use it, limitations, parameter semantics, and differentiation from siblings. An agent can call it correctly without ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds plain-language explanations of each parameter's effect (e.g., 'read_receipts controls whether Signal tells senders...') beyond the schema's brief descriptions, providing genuine added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb+resource: 'Update Signal account-wide messaging settings.' It names specific sibling tools (update_account, update_profile) to differentiate scope, making it unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use (account-wide messaging settings) and when not (profile name/photo, account-level privacy), naming the alternative tools. Also notes the primary-device requirement and failure mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_contactA
Set or update the local display name for a Signal contact. The name is stored only in signal-cli's local contact database — it is never sent to or visible by the contact. Overrides the contact's own profile name in list_contacts and conversation displays. Useful for adding a human-readable label to a number that has no Signal profile name. Use list_contacts to see current names before updating. Use when you want to assign or correct a contact's display name locally. Do NOT use to change your own profile name — use update_profile for that. Do NOT use to block or remove a contact — use block_contact or remove_contact for those.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name to set | |
| number | Yes | Phone number in E.164 format |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the name is stored only locally, never sent to the contact, and overrides the contact's profile name in displays. Lacks mention of reversibility or persistence but is adequate for a simple update operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with purpose, effect, context, and exclusions. Though slightly verbose, every sentence adds value and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully covers what the tool does, its local-only scope, its effect on displays, and provides alternatives. No output schema exists, so the description adequately fills all gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for both parameters. The description adds marginal value by explaining the purpose of the name parameter, but does not significantly enhance understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it sets or updates the local display name for a Signal contact. Specifies verb and resource, and explicitly distinguishes from sibling tools like update_profile, block_contact, and remove_contact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (adding a human-readable label) and when-not-to-use (for changing own profile, blocking, or removing). Also suggests using list_contacts first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_deviceA
Rename a linked secondary device on your Signal account. Only works when signal-mcp is the account's primary device — fails with 'This command doesn't work on linked devices' if signal-mcp was set up via signal-cli link. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New display name for the device | |
| device_id | Yes | Device ID (get from list_devices) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the full burden. It discloses the critical failure condition (only works when signal-mcp is primary), the sync behavior (name appears immediately across devices), the limitation (only secondary devices can be renamed), and the non-effect on messaging. This is comprehensive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though longer than typical descriptions, every sentence serves a purpose. It front-loads the core action and then logically expands into usage context, constraints, and alternatives without redundancy. The structure is clear and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of device management (linking, primary vs secondary, failure modes), the description is complete. It covers prerequisites, error conditions, how to get IDs, what it doesn't affect, and alternatives. No missing information an agent needs to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with basic descriptions for both parameters. The description adds valuable context beyond the schema: device_id is a small integer, device 1 is always primary, and the name is the new display name. This enriches parameter understanding, though it doesn't add formatting constraints or new fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool renames a linked secondary device on a Signal account, specifying the exact action (rename) and resource (secondary device). It distinguishes from siblings by explicitly contrasting with remove_device (unlink) and update_profile (rename primary account), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Use when you want to distinguish between multiple linked devices by a meaningful label.' Also gives when-not-to-use: 'Do NOT use to rename your own primary account — that is done via update_profile.' It directs users to list_devices for IDs and remove_device for unlinking, fully routing to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_groupA
Modify a Signal group's settings, membership, or permissions. All parameters except group_id are optional — include only what you want to change. add_members sends invitations; remove_members removes members immediately. add_admins promotes members to admin; remove_admins demotes them. expiration_seconds sets the disappearing-messages timer (0 to disable). link_mode controls the invite link: 'enabled' (anyone with link can join), 'enabled-with-approval' (admin must approve), 'disabled' (no link), or 'reset' (generate a new link and invalidate the old one). Changes are applied instantly and all members receive an update notification. You must be a group admin to change membership, admin list, or invite link. Use list_groups to get the group_id and confirm your admin status. Do NOT use to send a message — use send_group_message for that.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New group name | |
| group_id | Yes | Group ID to update | |
| link_mode | No | Invite link mode: 'disabled', 'enabled', 'enabled-with-approval', or 'reset' to generate a new link | |
| add_admins | No | Phone numbers to promote to admin | |
| add_members | No | Phone numbers to add | |
| description | No | New group description | |
| remove_admins | No | Phone numbers to demote from admin | |
| remove_members | No | Phone numbers to remove | |
| expiration_seconds | No | Disappearing message timer in seconds (0 to disable) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden. It explains that changes are applied instantly, all members receive notification, admin is required for certain changes, and details the behavior of parameters like add_members (sends invitations) vs remove_members (removes immediately).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and concise, front-loaded with the main purpose, and every sentence provides essential information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters, no output schema, and no annotations, the description is comprehensive: covers all parameter behaviors, side effects, prerequisites (admin), and provides cross-reference to list_groups. It fully compensates for missing annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), but the description adds significant value: explains add_members sends invitations, remove_members removes immediately, add_admins promotes, remove_admins demotes, expiration_seconds sets disappearing timer (0 to disable), and link_mode options with descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Modify a Signal group's settings, membership, or permissions,' which clearly states the verb (Modify) and resource (Signal group). It distinguishes from sibling tools like create_group (creates) and send_group_message (sends).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Do NOT use to send a message — use send_group_message for that' and advises using list_groups to get the group_id and confirm admin status. Provides clear when-to and when-not-to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_profileA
Update your own Signal profile visible to all contacts. name sets your display name shown to contacts who have not saved your number. about sets the bio text shown on your profile page. avatar_path sets a new profile photo from a local image file (JPEG or PNG). Set remove_avatar=true to clear your current photo without setting a new one. All parameters are optional — only include what you want to change. Changes are propagated to the Signal network immediately. Use get_profile to read a contact's current profile. Do NOT use to rename a linked device — use update_device for that. Do NOT use to change messaging settings — use update_configuration for that.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name to set | |
| about | No | About/bio text | |
| avatar_path | No | Path to avatar image file | |
| remove_avatar | No | Remove current avatar |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses that changes propagate immediately and that remove_avatar must be set to true to clear photo. Does not mention permissions, rate limits, or failure modes, but for a profile update this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four well-structured sentences, front-loaded with purpose, then parameter details, then usage guidance. No wasted words; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no output schema and no complex dependencies. Description covers main behavioral traits (immediate propagation), parameter semantics, and usage boundaries. Does not specify return value, but for an update tool that is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds significant value over schema: explains name is shown to contacts who haven't saved your number, about is bio, avatar_path must be local JPEG/PNG, and remove_avatar clear without new image. Also clarifies all optional. Schema has 100% coverage but description enriches understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool updates the user's own Signal profile, listing specific fields (name, about, avatar_path, remove_avatar). Differentiates from siblings like get_profile, update_device, and update_configuration by explicitly saying what NOT to use it for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use context (updating own profile) and when-not-to-use (renaming device, changing messaging settings), naming alternative tools for those cases. Also notes all parameters are optional.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_sticker_packA
Package and publish a sticker pack to Signal's CDN from local image files. Accepts a local manifest.json describing the pack, or a zip archive containing both the manifest and images. Signal's CDN stores the pack and returns a signal.art install URL you can share with others. Recipients call add_sticker_pack with the URL to install the pack and send its stickers. After publishing, the pack is available on Signal's network indefinitely. Use when you want to create and distribute a custom sticker pack. Use add_sticker_pack to install an existing pack for sending. Do NOT use to install a pack — use add_sticker_pack for that.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Local path to manifest.json or a zip containing the sticker pack |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the pack is stored indefinitely on Signal's CDN. No annotations provided, but the description adequately covers the non-destructive nature and outcome. Could mention permissions or overwrite behavior, but not critical.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, no fluff. First sentence states main function, then input, output, usage guidance. Well-structured and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter and no output schema, the description explains input, output URL, indefinite availability, and correct usage. It doesn't cover error handling or rate limits, but is sufficient for a simple upload tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'path' is described in schema as 'Local path to manifest.json or a zip...' and the description adds context that the manifest describes the pack. Schema coverage 100%, so baseline 3, but the description adds a slight extra nuance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool packages and publishes sticker packs to Signal's CDN, specifying input types (manifest.json or zip) and output (a signal.art install URL). It distinguishes from the sibling tool add_sticker_pack, which installs packs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (create and distribute custom sticker packs) and when not to (use add_sticker_pack for installation), with a clear alternative mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 and target_timestamp from the poll message returned by get_conversation — a poll has no separate ID, it's identified by its author + message timestamp. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| votes | Yes | Option indices to vote for (0-based). Single item for single-choice polls. | |
| group_id | No | Group ID for a group poll — provide this OR recipient | |
| recipient | No | Phone number for a DM poll — provide this OR group_id | |
| target_author | Yes | Phone number of the poll creator (E.164) | |
| target_timestamp | Yes | Timestamp of the poll message (from get_conversation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the vote is delivered via signal-cli and visible in real time, that re-voting overwrites, that partial updates are not supported, and that voting on a terminated poll returns an error. This is comprehensive behavioral disclosure for a simple action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but every sentence contributes unique guidance. It front-loads the core purpose, then covers mechanics, identification, and exclusions without redundancy. Slightly long but efficient given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and multiple parameters with dependencies, the description covers all necessary context: how to identify the poll, how to construct votes, the one-of recipient/group_id rule, error on terminated polls, and alternatives. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds substantial meaning: it explains that votes are 0-based indices, that exactly one of recipient or group_id must be provided, and how to obtain target_author and target_timestamp from get_conversation. This goes well beyond the schema's property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Cast your vote' and the resource 'an active Signal poll in a DM or group conversation'. It explicitly differentiates from siblings by saying 'Do NOT use to create a poll — use create_poll instead' and references terminate_poll, making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use ('Use when responding to an open poll in a conversation') and when-not-to-use ('Do NOT use to create a poll'), and names the alternative (create_poll). It also explains the conditions for single-choice vs multi-select and how to identify the poll via target_author and target_timestamp from get_conversation, giving complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v1.36.0- Changed
send_group_message1 field changed- changed
Input schema / properties / mentions / descriptionPrevious value: -"List of @mentions. Each item: {start: character offset of the mention in the message, length: character count of the mention, author: E.164 phone number of the mentioned member}. Example: message='Hello @Alice', mentions=[{start:6,length:6,author:'+1234567890'}]"New value: +"List of @mentions. Each item: {start: offset of the mention in the message (UTF-16 code units, not codepoints), length: mention length (UTF-16 code units), author: E.164 phone number of the mentioned member}. Example: message='Hello @Alice', mentions=[{start:6,length:6,author:'+1234567890'}]"
- Changed
terminate_poll2 fields changed- removed
Input schema / properties / poll_idRemoved value: -{ - "description": "Poll ID from the original poll message data", - "type": "integer" -} - changed
Input schema / requiredPrevious value: -[ - "target_author", - "target_timestamp", - "poll_id" -]New value: +[ + "target_author", + "target_timestamp" +]
- Changed
vote_poll2 fields changed- removed
Input schema / properties / poll_idRemoved value: -{ - "description": "Poll ID from the poll message data", - "type": "integer" -} - changed
Input schema / requiredPrevious value: -[ - "target_author", - "target_timestamp", - "poll_id", - "votes" -]New value: +[ + "target_author", + "target_timestamp", + "votes" +]
1 tool update
v1.35.0- Removed
get_configuration
1 tool update
v1.34.1- Changed
send_note_to_self4 fields changed- added
Input schema / properties / attachmentsAdded value: +{ + "description": "File paths to attach (e.g. a QR code or screenshot)", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / message / descriptionPrevious value: -"Note text to save"New value: +"Note text to save. Supports **bold**, ~~strikethrough~~, `monospace`" - added
Input schema / properties / quote_authorAdded value: +{ + "description": "Your own account number, to thread this note under a previous one", + "type": "string" +} - added
Input schema / properties / quote_timestampAdded value: +{ + "description": "Timestamp of the note being followed up on (from a prior send_note_to_self result)", + "type": "integer" +}
8 tool updates
v1.33.3- Added
cancel_scheduled_message - Added
find_contact - Added
get_webhook - Added
list_scheduled_messages - Added
receive_direct - Added
run_scheduled_messages - Added
schedule_message - Added
set_webhook
3 tool updates
v0.1.8- Changed
send_group_message7 fields changed- changed
Input schema / properties / group_id / descriptionPrevious value: -"Group ID (get from list_groups)"New value: +"Group ID (from list_groups)" - changed
Input schema / properties / mentions / descriptionPrevious value: -"List of @mentions: each item is {start, length, author} where start/length are character offsets into the message and author is a phone number"New value: +"List of @mentions. Each item: {start: character offset of the mention in the message, length: character count of the mention, author: E.164 phone number of the mentioned member}. Example: message='Hello @Alice', mentions=[{start:6,length:6,author:'+1234567890'}]" - added
Input schema / properties / mentions / items / properties / author / descriptionAdded value: +"E.164 phone number of the mentioned group member" - added
Input schema / properties / mentions / items / properties / length / descriptionAdded value: +"Length of the mention text in characters" - added
Input schema / properties / mentions / items / properties / start / descriptionAdded value: +"Character offset of the mention in the message text" - changed
Input schema / properties / quote_author / descriptionPrevious value: -"Phone number of the author of the message being quoted/replied to"New value: +"Phone number (E.164) of the author of the message being quoted" - changed
Input schema / properties / quote_timestamp / descriptionPrevious value: -"Timestamp of the message being quoted/replied to (from get_conversation)"New value: +"Timestamp of the quoted message (from get_conversation)"
- Changed
send_read_receipt2 fields changed- changed
Input schema / properties / sender / descriptionPrevious value: -"Phone number of the message sender"New value: +"Phone number (E.164) of the contact whose messages you are acknowledging" - changed
Input schema / properties / timestamps / descriptionPrevious value: -"List of message timestamps to mark read"New value: +"Timestamps of the messages to mark as read (from get_conversation sent_at/received_at fields)"
- Changed
set_pin1 field changed- changed
Input schema / properties / pin / descriptionPrevious value: -"4–20 digit PIN"New value: +"4–20 digit numeric PIN (e.g. '123456')"
23 tool updates
v0.1.2- Changed
admin_delete_message3 fields changed- changed
Input schema / properties / group_id / descriptionPrevious value: -"Group ID"New value: +"Group ID where the message was sent (get from list_groups)" - changed
Input schema / properties / target_author / descriptionPrevious value: -"Phone number of the message author"New value: +"Phone number of the user who sent the message" - changed
Input schema / properties / target_timestamp / descriptionPrevious value: -"Timestamp of the message to delete"New value: +"Timestamp of the message to delete (from get_conversation)"
- Changed
block_contact1 field changed- changed
Input schema / properties / number / descriptionPrevious value: -"Phone number to block"New value: +"Phone number to block (E.164 format, e.g. +1234567890)"
- Changed
create_group3 fields changed- changed
Input schema / properties / description / descriptionPrevious value: -"Optional group description"New value: +"Optional group description shown in group info" - changed
Input schema / properties / members / descriptionPrevious value: -"Phone numbers of initial members"New value: +"Phone numbers (E.164) of initial members to invite" - changed
Input schema / properties / name / descriptionPrevious value: -"Group name"New value: +"Group name visible to all members"
- Changed
create_poll5 fields changed- changed
Input schema / properties / group_id / descriptionPrevious value: -"Group ID for a group poll"New value: +"Group ID for a group poll — provide this OR recipient" - changed
Input schema / properties / multi_select / descriptionPrevious value: -"Allow multiple answer selection (default false)"New value: +"Allow voters to select multiple options (default: false = single choice only)" - changed
Input schema / properties / options / descriptionPrevious value: -"List of answer options (at least 2)"New value: +"List of answer options (minimum 2 required)" - changed
Input schema / properties / question / descriptionPrevious value: -"The poll question"New value: +"The poll question text" - changed
Input schema / properties / recipient / descriptionPrevious value: -"Phone number for a DM poll"New value: +"Phone number for a DM poll — provide this OR group_id"
- Changed
edit_message4 fields changed- changed
Input schema / properties / group_id / descriptionPrevious value: -"Group ID for a group message"New value: +"Group ID for a group message edit" - changed
Input schema / properties / message / descriptionPrevious value: -"New message text"New value: +"New message text to replace the original" - changed
Input schema / properties / recipient / descriptionPrevious value: -"Phone number for a DM message"New value: +"Phone number for a DM message edit" - changed
Input schema / properties / target_timestamp / descriptionPrevious value: -"Timestamp of the message to edit"New value: +"Timestamp of the message to edit (from get_conversation or send_message response)"
- Changed
join_group1 field changed- changed
Input schema / properties / uri / descriptionPrevious value: -"Group invite link (https://signal.group/#...)"New value: +"Group invite link starting with https://signal.group/#"
- Changed
leave_group1 field changed- changed
Input schema / properties / group_id / descriptionPrevious value: -"Group ID to leave"New value: +"Group ID to leave (get from list_groups)"
- Changed
list_contacts1 field changed- changed
Input schema / properties / search / descriptionPrevious value: -"Filter contacts by name or number (case-insensitive substring)"New value: +"Filter contacts by name or number (case-insensitive substring match)"
- Changed
pin_message4 fields changed- changed
Input schema / properties / group_id / descriptionPrevious value: -"Group ID for group conversations"New value: +"Group ID for group conversations — provide this OR recipient" - changed
Input schema / properties / recipient / descriptionPrevious value: -"Phone number for DM conversations"New value: +"Phone number for DM conversations — provide this OR group_id" - changed
Input schema / properties / target_author / descriptionPrevious value: -"Phone number of the message author"New value: +"Phone number of the message author (E.164)" - changed
Input schema / properties / target_timestamp / descriptionPrevious value: -"Timestamp of the message to pin"New value: +"Timestamp of the message to pin (from get_conversation)"
- Changed
remove_contact1 field changed- changed
Input schema / properties / number / descriptionPrevious value: -"Phone number to remove"New value: +"Phone number to remove (E.164 format)"
- Changed
send_attachment3 fields changed- changed
Input schema / properties / caption / descriptionPrevious value: -"Optional caption text"New value: +"Optional caption text shown below the attachment" - changed
Input schema / properties / paths / descriptionPrevious value: -"Multiple file paths to send in one message"New value: +"Multiple file paths to send as one message" - changed
Input schema / properties / view_once / descriptionPrevious value: -"Send as view-once (disappears after viewing)"New value: +"Send as view-once media — recipient can only view it once before it disappears"
- Changed
send_group_attachment3 fields changed- changed
Input schema / properties / caption / descriptionPrevious value: -"Optional caption text"New value: +"Optional caption text shown below the attachment" - changed
Input schema / properties / paths / descriptionPrevious value: -"Multiple file paths to send in one message"New value: +"Multiple file paths to send as one message" - changed
Input schema / properties / view_once / descriptionPrevious value: -"Send as view-once (disappears after viewing)"New value: +"Send as view-once media — each recipient can only view it once"
- Changed
send_group_message3 fields changed- changed
Input schema / properties / mentions / descriptionPrevious value: -"List of @mentions: each item is {start, length, author} where author is a phone number"New value: +"List of @mentions: each item is {start, length, author} where start/length are character offsets into the message and author is a phone number" - changed
Input schema / properties / quote_author / descriptionPrevious value: -"Phone number of the message being quoted/replied to"New value: +"Phone number of the author of the message being quoted/replied to" - changed
Input schema / properties / quote_timestamp / descriptionPrevious value: -"Timestamp of the message being quoted/replied to"New value: +"Timestamp of the message being quoted/replied to (from get_conversation)"
- Changed
send_group_sticker3 fields changed- changed
Input schema / properties / group_id / descriptionPrevious value: -"Group ID"New value: +"Group ID (get from list_groups)" - changed
Input schema / properties / pack_id / descriptionPrevious value: -"Sticker pack ID (hex string)"New value: +"Sticker pack ID (hex string from list_sticker_packs)" - changed
Input schema / properties / sticker_id / descriptionPrevious value: -"Sticker ID within the pack"New value: +"Sticker ID within the pack (from list_sticker_packs)"
- Changed
send_message2 fields changed- changed
Input schema / properties / quote_author / descriptionPrevious value: -"Phone number of the message being quoted/replied to"New value: +"Phone number of the author of the message being quoted/replied to" - changed
Input schema / properties / quote_timestamp / descriptionPrevious value: -"Timestamp of the message being quoted/replied to"New value: +"Timestamp of the message being quoted/replied to (from get_conversation)"
- Changed
send_sticker2 fields changed- changed
Input schema / properties / pack_id / descriptionPrevious value: -"Sticker pack ID (hex string)"New value: +"Sticker pack ID (hex string from list_sticker_packs)" - changed
Input schema / properties / sticker_id / descriptionPrevious value: -"Sticker ID within the pack"New value: +"Sticker ID within the pack (from list_sticker_packs)"
- Changed
set_typing1 field changed- changed
Input schema / properties / stop / descriptionPrevious value: -"True to stop typing indicator (default: False)"New value: +"Set to true to cancel an active typing indicator (default: false = start typing)"
- Changed
terminate_poll5 fields changed- changed
Input schema / properties / group_id / descriptionPrevious value: -"Group ID for a group poll"New value: +"Group ID for a group poll — provide this OR recipient" - changed
Input schema / properties / poll_id / descriptionPrevious value: -"Poll ID from the original poll message"New value: +"Poll ID from the original poll message data" - changed
Input schema / properties / recipient / descriptionPrevious value: -"Phone number for a DM poll"New value: +"Phone number for a DM poll — provide this OR group_id" - changed
Input schema / properties / target_author / descriptionPrevious value: -"Phone number of the poll creator (your own number)"New value: +"Phone number of the poll creator — must be your own number" - changed
Input schema / properties / target_timestamp / descriptionPrevious value: -"Timestamp of the poll message"New value: +"Timestamp of the poll message (from get_conversation)"
- Changed
unblock_contact1 field changed- changed
Input schema / properties / number / descriptionPrevious value: -"Phone number to unblock"New value: +"Phone number to unblock (E.164 format)"
- Changed
unpin_message4 fields changed- changed
Input schema / properties / group_id / descriptionPrevious value: -"Group ID for group conversations"New value: +"Group ID for group conversations — provide this OR recipient" - changed
Input schema / properties / recipient / descriptionPrevious value: -"Phone number for DM conversations"New value: +"Phone number for DM conversations — provide this OR group_id" - changed
Input schema / properties / target_author / descriptionPrevious value: -"Phone number of the message author"New value: +"Phone number of the message author (E.164)" - changed
Input schema / properties / target_timestamp / descriptionPrevious value: -"Timestamp of the pinned message"New value: +"Timestamp of the pinned message (from get_conversation)"
- Changed
update_account6 fields changed- changed
Input schema / properties / delete_username / descriptionPrevious value: -"Delete the current username"New value: +"Delete your current Signal username" - changed
Input schema / properties / device_name / descriptionPrevious value: -"Name shown on linked-device list"New value: +"Name for this device shown in linked devices list" - changed
Input schema / properties / discoverable_by_number / descriptionPrevious value: -"Allow others to find you by phone number"New value: +"Allow others to find your account by phone number" - changed
Input schema / properties / number_sharing / descriptionPrevious value: -"Share your number when sending messages"New value: +"Share your phone number when sending messages" - changed
Input schema / properties / unrestricted_unidentified_sender / descriptionPrevious value: -"Allow sealed-sender from anyone"New value: +"Allow sealed-sender messages from anyone (not just contacts)" - changed
Input schema / properties / username / descriptionPrevious value: -"Set a Signal username (without @)"New value: +"Set a Signal username (without @) as an alias for your number"
- Changed
update_device2 fields changed- changed
Input schema / properties / device_id / descriptionPrevious value: -"Device ID from list_devices"New value: +"Device ID (get from list_devices)" - changed
Input schema / properties / name / descriptionPrevious value: -"New name for the device"New value: +"New display name for the device"
- Changed
vote_poll6 fields changed- changed
Input schema / properties / group_id / descriptionPrevious value: -"Group ID for a group poll"New value: +"Group ID for a group poll — provide this OR recipient" - changed
Input schema / properties / poll_id / descriptionPrevious value: -"Poll ID from the original poll message"New value: +"Poll ID from the poll message data" - changed
Input schema / properties / recipient / descriptionPrevious value: -"Phone number for a DM poll"New value: +"Phone number for a DM poll — provide this OR group_id" - changed
Input schema / properties / target_author / descriptionPrevious value: -"Phone number of the poll creator"New value: +"Phone number of the poll creator (E.164)" - changed
Input schema / properties / target_timestamp / descriptionPrevious value: -"Timestamp of the poll message"New value: +"Timestamp of the poll message (from get_conversation)" - changed
Input schema / properties / votes / descriptionPrevious value: -"List of option indices to vote for (0-based)"New value: +"Option indices to vote for (0-based). Single item for single-choice polls."
72 tool updates
v0.1.0- First observed
add_device - First observed
add_sticker_pack - First observed
admin_delete_message - First observed
block_contact - First observed
clear_local_store - First observed
create_group - First observed
create_poll - First observed
delete_group_message - First observed
delete_local_messages - First observed
delete_message - First observed
edit_message - First observed
export_messages - First observed
finish_change_number - First observed
get_attachment - First observed
get_avatar - First observed
get_configuration - First observed
get_conversation - First observed
get_own_number - First observed
get_profile - First observed
get_sticker - First observed
get_unread - First observed
get_user_status - First observed
import_desktop - First observed
join_group - First observed
leave_group - First observed
list_accounts - First observed
list_attachments - First observed
list_contacts - First observed
list_conversations - First observed
list_devices - First observed
list_groups - First observed
list_identities - First observed
list_sticker_packs - First observed
mark_as_unread - First observed
pin_message - First observed
prune_store - First observed
react_to_message - First observed
receive_messages - First observed
remove_contact - First observed
remove_device - First observed
remove_pin - First observed
search_messages - First observed
send_attachment - First observed
send_contacts_sync - First observed
send_group_attachment - First observed
send_group_message - First observed
send_group_sticker - First observed
send_message - First observed
send_message_request_response - First observed
send_note_to_self - First observed
send_read_receipt - First observed
send_sticker - First observed
send_sync_request - First observed
set_expiration_timer - First observed
set_pin - First observed
set_typing - First observed
start_change_number - First observed
store_stats - First observed
submit_rate_limit_challenge - First observed
sync_desktop - First observed
terminate_poll - First observed
trust_identity - First observed
unblock_contact - First observed
unpin_message - First observed
update_account - First observed
update_configuration - First observed
update_contact - First observed
update_device - First observed
update_group - First observed
update_profile - First observed
upload_sticker_pack - First observed
vote_poll
TDQS
Scored across 79 tools
Tools are clearly distinguished by descriptions that explicitly separate DM vs group vs self variants and different receive methods. While there are many similar-sounding tools (e.g., receive_messages vs receive_direct vs get_unread), each has a distinct purpose and the descriptions provide unambiguous guidance.
All tool names follow a consistent verb_noun pattern (send_message, list_groups, update_profile, get_conversation). Even longer names like submit_rate_limit_challenge adhere to the pattern. There are no mixed conventions or chaotic variations.
With 79 tools, this is far beyond the typical well-scoped server (3-15). While each tool has a distinct purpose, the surface is enormous and could be consolidated (e.g., merging DM/group variants with a parameter). The sheer number makes it heavy and potentially overwhelming for agents.
The tool set covers virtually every aspect of Signal: messaging (text, attachments, stickers, polls, reactions, typing), groups, contacts, devices, profile, settings, local store management, scheduling, webhooks, security (PIN, identity), and number migration. No obvious gaps in the domain.
Maintenance
Related MCP Connectors
Your own WhatsApp as an MCP server: read, search and send from any MCP client.
The official Planning Center MCP server for interacting with your ministry's data.
The official MCP Server for the Mux API
MCP server for OnceAsk, the AI-native current-address layer for people and agents.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP Server for retrieving Signal messages using signal-export logic.8-
- AlicenseAqualityAmaintenanceLocal Signal MCP server: read via Signal Desktop, send via signal-cli8MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for Signal via signal-cli that enables sending and receiving messages, managing contacts and groups, and reacting over stdio.5 npm-
- AlicenseNot gradedqualityAmaintenanceMCP server for a local-first messaging workspace that integrates Google Messages, WhatsApp, and Signal. It enables reading, sending, searching messages, and managing conversations through MCP tools.55-