ActivitySmith
Server Details
AI agents and scripts reporting back to your iPhone with Push Notifications and Live Activities.
- Status
- Healthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 34 tools
Each tool targets a distinct resource and action across approvals, API keys, channels, widget metrics, live activity streams, push notifications, badges, tags, and account entities. Overlapping-looking pairs like wait_for_approval vs get_approval and send_push_notification vs replace_push_notification are clearly differentiated by their descriptions. No two tools appear to do the same thing.
All tools use a consistent snake_case, verb-first pattern (create_, get_, list_, update_, delete_, set_, send_, etc.). Multi-word resources extend predictably (live_activity_stream, widget_metric, app_icon_badge_count), with no camelCase or alternate verb-style mixing.
34 tools is high for an MCP server and exceeds the 25+ threshold that signals an overloaded surface. Although ActivitySmith covers several subdomains, the many granular CRUD tools create selection overhead for agents and could likely be consolidated.
Core lifecycle coverage is strong for channels, widget metrics, live activities, and push notifications, with create/read/update/delete or equivalent operations. Minor gaps remain, such as no list_approvals for recovering a lost approval ID, no explicit push notification deletion, and tags being list-only rather than fully managed.
Available Tools
34 toolscancel_approvalCancel ApprovalADestructiveIdempotentInspect
Cancel a pending approval request that is no longer needed, for example because the agent changed plans or the operation already happened. The approval Live Activity on the user's iPhone updates to show it was cancelled, the user can no longer approve or reject it, and any wait_for_approval call returns the cancelled state. Only pending requests change; for an approval that is already decided, timed out, or cancelled, this returns its current state unchanged. Do not cancel to retry; use wait_for_approval to keep waiting. Returns the approval's resulting state.
| Name | Required | Description | Default |
|---|---|---|---|
| approval_id | Yes | approval_id returned by request_approval. |
Output Schema
| Name | Required | Description |
|---|---|---|
| approval | Yes | |
| next_action | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly=false, destructive=true, idempotent=true, openWorld=true). The description adds substantial context beyond that: the iPhone Live Activity updates, the user loses the ability to approve/reject, any wait_for_approval call returns the cancelled state, and non-pending requests are returned unchanged. This is rich side-effect disclosure that annotations alone could not convey.
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?
Front-loaded with the core action, then side effects, then the non-pending caveat, then the retry exclusion. Every sentence carries distinct information, though the closing 'Returns the approval's resulting state' is mildly redundant given an output schema exists.
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 mutation with an output schema and full annotation coverage, the description covers purpose, side effects, edge cases (non-pending), and the retry anti-pattern. 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?
Schema description coverage is 100% and the single approval_id parameter is already documented as coming from request_approval. The description adds no additional syntax or format detail beyond the schema, 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?
States a specific verb and resource ('Cancel a pending approval request') and immediately scopes it to 'pending' requests, which distinguishes it from request_approval, get_approval, and wait_for_approval. An agent can tell exactly what this tool does without opening any schema.
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?
Gives explicit when-to-use ('no longer needed... agent changed plans or the operation already happened'), explicit when-not ('Do not cancel to retry; use wait_for_approval to keep waiting'), and names the sibling alternative. It also clarifies the no-op case for already-decided/timed-out/cancelled approvals, removing ambiguity about retry behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_api_keyCreate API KeyAInspect
Create an ActivitySmith API key for code that calls the ActivitySmith API, such as a CI job, server, or script. The secret is returned once. Store it directly in the user's secret manager or a git-ignored environment file, never commit it or print it in chat, and tell the user where you saved it. Keys keep working after this MCP connection is disconnected; the user can delete them in the ActivitySmith web app. Use scope_mode "channels" with channel_slugs only when the key should reach a subset of recipients. Requires the "Manage API keys" permission, which the user grants on the ActivitySmith approval screen.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Descriptive name, such as "GitHub Actions deploy" or "Production server". | |
| scope_mode | No | all (default) lets the key deliver to every device in the account. channels limits it to the channels in channel_slugs or channel_public_ids. | all |
| channel_slugs | No | Channel slugs from list_channels, used when scope_mode is channels. | |
| channel_public_ids | No | Channel public IDs from list_channels, used when scope_mode is channels. Combined with channel_slugs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| api_key | Yes | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds the details that actually matter for a secret-issuing tool: the secret is returned exactly once, keys survive disconnection of this MCP session, revocation happens in the web app, and a specific permission ("Manage API keys") is required via an approval screen. It also states a safe-handling procedure (secret manager or git-ignored env file, never commit or print in chat).
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, front-loaded with purpose, then secret handling, then lifecycle, then the scope caveat and permission. No sentence is padding — each carries a fact an agent would otherwise get wrong (printing the secret in chat, assuming the key dies with the session).
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?
An output schema exists, so return-shape explanation is not required. What remains — auth/permission requirements, one-time secret exposure, persistence beyond the session, and where to store the value — is all covered, which is exactly the risk surface for a credential-creation 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 the baseline is 3. The description still earns above baseline by linking scope_mode "channels" to channel_slugs with a decision rule (subset of recipients) that the schema's field-level text does not state as explicitly, and by surfacing the name/permission context an agent needs before filling in the 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 opens with a specific verb and resource ("Create an ActivitySmith API key") and immediately scopes the audience for that key (CI job, server, script). This distinguishes it cleanly from siblings like rename_api_key, delete_api_key, and list_api_keys without needing the schema.
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 a concrete conditional rule for the risky parameter: "Use scope_mode 'channels' with channel_slugs only when the key should reach a subset of recipients." That is real when/when-not guidance. It stops short of naming sibling alternatives (e.g., list_api_keys for existing keys), so it falls just under a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_channelCreate ChannelAInspect
Create a channel: a named group of recipients that Push Notifications, Live Activities, and App Icon Badge updates can target with target_channel_slugs, and that API keys can be scoped to. Channels are optional; without them, deliveries go to every device in the account. Only create one when the user wants to route deliveries to some people or devices. The new channel is empty, so add recipients with set_channel_users or set_channel_devices. Fails if the slug already exists. Returns the channel's public_id and slug.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Name used to target the channel, such as ops or ios-beta. It is lowercased, spaces and underscores become dashes, other symbols are removed, and the result is cut to 64 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| channel | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the created channel is empty, creation fails on duplicate slug, and the response contains public_id and slug. It does not discuss permission/auth requirements, which is the only notable gap.
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?
Front-loaded with the verb and a definition, then the decision rule, then the follow-up. Most sentences earn their place, though the closing line about return values ('Returns the channel's public_id and slug') is partly redundant given an output schema exists.
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 creation tool this is fully sufficient: it defines the concept, gives the create-or-not decision rule, names the follow-up tools to populate the channel, states the duplicate-slug failure mode, and notes the return payload. Nothing an agent needs in order 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?
Schema description coverage is 100%, so the slug's normalization rules (lowercasing, dash substitution, 64-char truncation) are already fully documented in the schema. The description only implies the slug is the targeting handle via 'target_channel_slugs', adding no new syntax or constraint detail. Baseline 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?
States a specific verb+resource ('Create a channel') and then defines what a channel actually is — a named recipient group targetable via target_channel_slugs and scopeable by API keys. This conceptual grounding lets an agent distinguish it from siblings like create_api_key or create_widget_metric even though the name alone is generic.
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 NOT to use it ('Channels are optional; without them, deliveries go to every device') and when to use it ('Only create one when the user wants to route deliveries to some people or devices'). It also names the follow-up tools (set_channel_users, set_channel_devices) needed to make the channel useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_widget_metricCreate Widget MetricAInspect
Create a Lock Screen Widget metric: a named value, such as monthly revenue or deploy success rate, that the user can show in an ActivitySmith widget on their iPhone or iPad Lock Screen. Create each metric once, then send values with set_widget_metric_value using the same key. To change the label or format later, use update_widget_metric. The new metric has no value yet, and nothing changes on the Lock Screen until the user adds a widget for it. Fails if the key already exists in the account. Returns the created metric, including its public_id.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Stable identifier that set_widget_metric_value, the REST API, and the SDKs use to send values. 1-64 lowercase letters, numbers, dots, underscores, or dashes, starting with a letter or number (uppercase is lowercased). Examples: mrr, deploy.success_rate. | |
| unit | No | Unit suffix for the unit format, up to 16 characters, such as ms, users, or GB. Ignored for other formats. | |
| label | Yes | Name shown on the widget, up to 80 characters. Examples: MRR, Deploy success. | |
| format | No | How the widget displays the value: number (1,234), currency (requires currency_code, shows $1,234), percent (send 99.9 to show 99.9%), unit (a number with a unit suffix, such as 120 ms), or string (text up to 64 characters). | number |
| unit_spacing | No | For the unit format only: none shows 120ms, space shows 120 ms. Ignored for other formats. | none |
| currency_code | No | 3-letter ISO 4217 currency code, such as USD or EUR. Required when format is currency, ignored otherwise. |
Output Schema
| Name | Required | Description |
|---|---|---|
| metric | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish that this is a non-read-only, non-destructive, closed-world write. The description adds what the annotations cannot: the duplicate-key failure mode, the postcondition that the new metric has no value and nothing appears on the Lock Screen until a widget is added, and that the response includes public_id. That is meaningful behavioral context beyond structured fields.
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?
Front-loaded with the purpose, then routing, then semantics, then failure mode and return value in descending priority. Five sentences where none is filler, though 'Create each metric once' partially duplicates the later 'Fails if the key already exists,' a small overlap.
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 6-parameter create tool with full enum/default coverage, an output schema, and sibling routing, the description covers what the schema cannot: lifecycle, idempotency failure, and side-effect timing. Nothing needed to invoke it correctly is missing, and return values are additionally summarized despite the output schema.
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% with enums and defaults, so the baseline is 3; the description earns an extra point by tying the key parameter to its cross-tool contract ('using the same key' shared with set_widget_metric_value) and by identifying label/format as the mutable fields via update_widget_metric.
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 ('Create a Lock Screen Widget metric') and then defines the concept concretely ('a named value ... shown in an ActivitySmith widget on their iPhone or iPad Lock Screen'). It explicitly distinguishes itself from the two closest siblings, set_widget_metric_value and update_widget_metric, so an agent can pick correctly without opening the schema.
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?
Gives explicit routing: create each metric once, then use set_widget_metric_value with the same key to send values, and use update_widget_metric to change label or format. It also states the creation precondition (fails if the key already exists), which is the when-not condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_api_keyDelete API KeyADestructiveInspect
Permanently delete an ActivitySmith API key. Anything still using it starts failing immediately, and this cannot be undone. Confirm the key name with the user before deleting a key you did not create in this session. Requires the "Manage API keys" permission, which the user grants on the ActivitySmith approval screen.
| Name | Required | Description | Default |
|---|---|---|---|
| public_id | Yes | API key public_id from list_api_keys. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| success | Yes | |
| public_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description goes further with what the agent cannot learn from them: 'Anything still using it starts failing immediately', 'cannot be undone', and the 'Manage API keys' permission granted on the approval screen. That is exactly the extra context a destructive call needs.
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, irreversibility and blast radius front-loaded, then the guardrail, then the permission prerequisite. No sentence is redundant and nothing is buried.
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?
An output schema exists so return values need no explanation, and the description covers the remaining gaps an agent needs: irreversibility, downstream breakage, the confirmation step, and the required permission. Nothing material is missing for a single-parameter destructive 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 the single public_id parameter and its 16-character constraint are already documented, including its 'from list_api_keys' provenance. The description's only added signal is the instruction to confirm the key name with the user, which is a procedural caution rather than parameter semantics, so the baseline 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?
States a specific verb ('Permanently delete') and resource ('ActivitySmith API key') in the first four words, which cleanly separates it from create_api_key, rename_api_key and list_api_keys without needing to name 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?
Gives a concrete precondition ('Confirm the key name with the user before deleting a key you did not create in this session') and a permission requirement, which tells the agent when the call is legitimate. It stops short of naming an alternative such as rename_api_key when the intent is a modification rather than removal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_channelDelete ChannelADestructiveInspect
Delete a channel. It disappears from list_channels, its slug no longer works for targeting, and its user and device assignments stop applying. Users and devices themselves are not affected, and API keys scoped to this channel no longer deliver through it. This cannot be undone through MCP, so confirm with the user first. Returns success with the deleted channel's public_id and slug.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Channel slug, such as ops or ios-beta, from list_channels. Provide public_id or slug. | |
| public_id | No | Channel public_id from list_channels. Provide public_id or slug; if you send both, they must match the same channel. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| message | Yes | |
| success | Yes | |
| public_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint=true annotation, the description details the exact blast radius: disappearance from list_channels, broken slug targeting, lost user/device assignments, API-key delivery stopping, and the reassurance that users/devices themselves survive. It also states irreversibility through MCP and the return payload — context annotations alone do not provide.
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 delete action is front-loaded, followed by consequences, non-consequences, the irreversibility warning, and the return value. Every sentence carries distinct information about scope or safety, 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?
With destructiveHint and no-readOnly annotations covering the safety profile, 100% schema coverage, and an output schema present, the description fills the remaining gaps: consequence scope, irreversibility, and confirmation requirement. An agent has everything needed 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?
Schema description coverage is 100%, so both slug and public_id (including the 'provide one or the other, both must match' rule) are already fully documented in the schema. The description adds only an incidental note that the slug stops working for targeting, not 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+resource ('Delete a channel') and immediately enumerates concrete effects (removal from list_channels, slug stops resolving, assignments stop applying), leaving no ambiguity about what operation this is. Though it never names a sibling explicitly, 'delete_channel' is unmistakable among update_channel/create_channel.
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 one real usage guideline: 'This cannot be undone through MCP, so confirm with the user first.' However it never states when to delete versus update/deprecate a channel, nor any preconditions beyond confirmation, so usage is only partially covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_widget_metricDelete Widget MetricADestructiveInspect
Delete a Lock Screen Widget metric. It disappears from list_widget_metrics, set_widget_metric_value calls with its key fail with Metric not found, and widgets showing it stop receiving new values. This cannot be undone through MCP; to rename a metric or change its format, use update_widget_metric instead. Returns success and the deleted metric's public_id.
| Name | Required | Description | Default |
|---|---|---|---|
| public_id | Yes | The metric's public_id, from list_widget_metrics or create_widget_metric. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| success | Yes | |
| public_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already flag destructiveHint=true, the description goes well beyond them by enumerating concrete downstream effects: removal from list_widget_metrics, set_widget_metric_value failing with 'Metric not found', and widgets silently stopping updates. It also states the change is irreversible via MCP and describes the return value.
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 the action, then consequences, then the alternative. Every sentence carries distinct information and none is padding.
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 destructive tool with an output schema and destructive annotations, this covers effects, irreversibility, the alternative tool, and the return value. Nothing an agent needs in order to invoke it safely 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% and the single parameter's description already tells the agent where to obtain public_id (list_widget_metrics or create_widget_metric). The description adds no further syntax or format detail, which is the expected baseline when the schema does the work.
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 ('Delete a Lock Screen Widget metric') and immediately distinguishes it from update_widget_metric. An agent can tell it apart from the other delete_* siblings (delete_api_key, delete_channel) by the resource named.
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 routes the agent explicitly: 'to rename a metric or change its format, use update_widget_metric instead,' and warns it cannot be undone through MCP. It gives a clear alternative for the adjacent need but stops short of describing prerequisites (e.g., permissions) or any other when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
end_live_activity_streamEnd Live Activity StreamADestructiveInspect
End the current Live Activity for a managed stream and remove the stream key. Use it when the tracked work is finished; to stop updates temporarily and keep the key, use pause_live_activity_stream instead. A later set_live_activity_stream call with the same key starts a new Live Activity. Ending remotely also uses the device's ActivityKit push budget, so end once for a genuine lifecycle completion and do not repeatedly end and recreate a stream to refresh it.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional final Tags. Omit to preserve; send [] to clear. | |
| alert | No | Optional APNs alert payload for the ending update. | |
| action | No | Optional action button/tap target. Use { title, type: "open_url", url } with an HTTP/HTTPS URL or shortcuts://run-shortcut?name=... to open a URL or run an iPhone Shortcut. Use { title, type: "webhook", url, method, body } to call an HTTPS webhook. Webhook method can be GET or POST. | |
| metadata | No | Optional final app-only details. Omit to preserve; send {} to clear. | |
| stream_key | Yes | Stable Live Activity stream key. Use the same key to update the same stream. Do not create new keys for routine updates: every new stream requires another remote start and uses the device's limited iOS push-to-start budget. Use only letters, numbers, underscores, and hyphens. | |
| content_state | No | Optional final Live Activity content state. If omitted, ActivitySmith uses the latest stored state when possible. | |
| secondary_action | No | Optional secondary action button for alert, progress, and segmented_progress Live Activities. Uses the same object shape as action. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and openWorldHint=true, but the description adds real behavioral context beyond them: the stream key is removed, a later set_live_activity_stream with the same key starts a fresh Activity, and ending remotely consumes the device's ActivityKit push budget. That budget/lifecycle detail is exactly the kind of non-obvious consequence an agent needs.
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 the action, then routing to the alternative, then a caution. Every sentence carries distinct decision-relevant information 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?
An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description fills the remaining gaps: lifecycle semantics, the key-removal consequence, and push-budget cost.
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 tags, alert, action, metadata, content_state, and stream_key thoroughly. The description adds no parameter-level detail beyond what the schema provides, so the baseline 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?
States a specific verb and resource ('End the current Live Activity for a managed stream') plus the concrete side effect of removing the stream key. It is immediately distinguishable from siblings like get_live_activity, list_live_activities, and pause_live_activity_stream.
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?
Gives an explicit when-to-use condition ('when the tracked work is finished') and names the alternative for the opposite case ('to stop updates temporarily and keep the key, use pause_live_activity_stream'). It even adds a when-not-to-use warning against repeatedly ending and recreating a stream.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_approvalGet ApprovalARead-onlyIdempotentInspect
Get the current state of an approval request without waiting: pending, approved, rejected, timed_out, or cancelled, with the decision time when there is one. Use it for status checks or to recover after losing track of a request. To block until the user decides, use wait_for_approval instead. Returns Approval not found for an unknown ID.
| Name | Required | Description | Default |
|---|---|---|---|
| approval_id | Yes | approval_id returned by request_approval. |
Output Schema
| Name | Required | Description |
|---|---|---|
| approval | Yes | |
| next_action | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real behavioral context beyond them: the call is non-blocking ('without waiting'), it returns the decision time when available, and it discloses the error behavior ('Returns Approval not found for an unknown ID'). This is materially more than the safety profile the annotations provide.
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 tight sentences, front-loaded with the core action and return states, then usage, then the alternative, then the error case. No sentence is redundant against the schema or annotations.
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?
Output schema exists so return values needn't be restated, annotations cover the safety profile, and the description still supplies the non-blocking semantics, the routing to wait_for_approval, and the not-found error. An agent has everything needed to call this 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 description coverage is 100% and the single approval_id parameter is fully documented in the schema (its provenance from request_approval), so the schema carries the burden. The prose adds no format, syntax, or lifecycle detail about the ID beyond what structured data already states — baseline 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?
Names a specific verb+resource ('Get the current state of an approval request') and enumerates the exact states returned (pending, approved, rejected, timed_out, cancelled). It also explicitly distinguishes itself from the sibling wait_for_approval, so an agent can select correctly without opening either schema.
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?
Gives explicit when-to-use cases ('status checks', 'recover after losing track of a request') and an explicit when-not/alternative ('To block until the user decides, use wait_for_approval instead'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_channelGet ChannelARead-onlyInspect
Get one channel with the users and individual devices assigned to it. A delivery sent to the channel reaches every active device of each assigned user, plus each individually assigned device. Call this before set_channel_users or set_channel_devices, which replace the whole list, so you can keep existing assignments. Returns the channel's slug and public_id, users (public_id, email, name), and devices (user public_id, email, device_id).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Channel slug, such as ops or ios-beta, from list_channels. Provide public_id or slug. | |
| public_id | No | Channel public_id from list_channels. Provide public_id or slug; if you send both, they must match the same channel. |
Output Schema
| Name | Required | Description |
|---|---|---|
| channel | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so safety is covered. The description goes further by explaining the delivery semantics (a delivery reaches every active device of each assigned user plus individually assigned devices), which is genuine behavioral context beyond the annotations. It does not mention auth requirements or rate limits, but for a read tool that is acceptable.
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?
Front-loaded with the core action, then usage guidance, then return shape. Three sentences and every one carries weight; the delivery-semantics sentence is the most verbose but still informative rather than 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?
An output schema exists, so the description's return-value narration is technically redundant, yet nothing an agent needs is missing: purpose, when-to-use relative to the set_channel_* siblings, and the resource relationships are all covered.
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 documents slug and public_id including the 'provide one, or both must match' rule. The description adds no syntax or format detail for the parameters beyond what the schema provides, so baseline 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?
Specific verb (Get) plus resource (one channel) and explicit scope (with the users and individual devices assigned to it). It is easily distinguished from list_channels (plural, all channels) and the set_channel_* mutators named in the text.
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 call it: 'Call this before set_channel_users or set_channel_devices, which replace the whole list, so you can keep existing assignments.' It names the alternatives and the condition that selects this tool over them, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_live_activityGet Live ActivityARead-onlyInspect
Get one Live Activity from this account by its ID returned by list_live_activities, including metadata, tags, channels, and action payloads. Read-only; to update or end it, use the stream tools. Returns a not found error for an unknown ID.
| Name | Required | Description | Default |
|---|---|---|---|
| activity_id | Yes | The activity_id from list_live_activities. |
Output Schema
| Name | Required | Description |
|---|---|---|
| activity | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral detail beyond annotations: it enumerates the returned content and discloses the not-found error for an unknown ID.
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 tightly scoped sentences with the core action, returned contents, read-only guidance, and error behavior. Purpose is front-loaded and nothing 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?
Given the simple single-ID schema, existing output schema, and read-only annotations, the description covers everything an agent needs: ID provenance, return contents, alternative tools for mutation, and error behavior. No material 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?
Schema coverage is 100%, and the schema already documents that activity_id comes from list_live_activities. The description repeats that source but adds no syntax, format, or validation detail beyond the schema, so the baseline 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?
States a specific verb ('Get') and resource ('one Live Activity') scoped to this account and identified by ID. It also names the source of the ID (list_live_activities) and distinguishes the operation from the stream-based update/end 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?
Explicitly says to use this for retrieval by ID and directs update/end operations to the stream tools. It also tells the agent where to obtain the required ID, making both the trigger and the alternative path clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_push_notificationGet Push NotificationARead-onlyInspect
Get one sent Push Notification from this account by its public ID, with its content, delivery status, number of devices notified, errors, Tags, metadata, and replacement count. Use it to inspect a specific notification, for example before calling replace_push_notification. To browse or filter history, use list_push_notifications. Returns a not found error for an unknown ID.
| Name | Required | Description | Default |
|---|---|---|---|
| public_id | Yes | The Push Notification's public_id from list_push_notifications, or the notification_id returned by send_push_notification (they are the same value). |
Output Schema
| Name | Required | Description |
|---|---|---|
| push_notification | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered structurally. The description adds genuine behavioral context beyond that: the not-found error for an unknown ID and the fact that the record reflects a sent notification's delivery outcome (status, device count, errors). It stops short of describing pagination or failure modes beyond the 404-equivalent.
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 the core action, then usage routing, then the error case — every sentence carries information. Mild redundancy: the enumerated return fields partially duplicate what the existing output schema already defines.
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 read tool with a full output schema and read-only annotations, the description covers purpose, sibling routing, and the one non-obvious behavior (unknown-ID error). Nothing an agent needs to select or call this 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?
Schema description coverage is 100% and the single parameter's provenance is fully documented in the schema (public_id from list, or the notification_id from send). The description repeats 'by its public ID' but adds no format, syntax, or constraint beyond the schema, 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?
Specific verb+resource ('Get one sent Push Notification ... by its public ID') with an explicit enumeration of the returned content (delivery status, device count, errors, Tags, metadata, replacement count). It is clearly distinguishable from siblings list_push_notifications and replace_push_notification.
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?
Gives both a use case ('inspect a specific notification, for example before calling replace_push_notification') and an explicit alternative for the other case ('To browse or filter history, use list_push_notifications'). This is exactly the when/when-not routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_account_devicesList Account DevicesARead-onlyInspect
List the iPhones and iPads paired to this account, with each device's device_id, owner email, name, and app and iOS versions. Use it to find device_id values for set_channel_devices. Ordered active first, then most recently updated and created, with stable device and owner tie-breakers. Defaults: limit 100, offset 0; maximum limit 100. Continue with meta.next_offset and the same filters; stop when it is null. Results can change between requests.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum devices to return, 1-100. Defaults to 100. | |
| offset | No | Number of devices to skip. Use meta.next_offset from the previous page. Defaults to 0. | |
| include_inactive | No | Include devices that can no longer receive deliveries, such as unpaired phones. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | |
| devices | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful non-annotation context: the result ordering (active first, then recently updated/created, with stable tie-breakers) and the volatility note 'Results can change between requests.' It does not mention auth requirements or rate limits, keeping it from a 5.
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 tool's purpose and returned fields, then adds usage, ordering, pagination, and volatility notes. It is efficient overall, though the 'Defaults: limit 100, offset 0; maximum limit 100' sentence partially duplicates schema information, which slightly reduces the value density.
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?
With an output schema present, the description need not explain return values. It covers the practical needs for a paginated list tool: what is listed, why to use it, how results are ordered, how to paginate, and that results can shift between requests. Nothing essential 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 schema already documents limit, offset, and include_inactive fully. The description repeats defaults and the maximum limit, and mirrors the schema's guidance to continue with meta.next_offset, adding little beyond the structured fields. Baseline 3 is appropriate when the schema does the heavy lifting.
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: 'List the iPhones and iPads paired to this account,' and enumerates the returned fields. It clearly distinguishes this tool from siblings like list_account_users and list_channels by scoping to paired devices.
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 to use it to find device_id values for set_channel_devices, giving a concrete downstream consumer. It does not state when not to use it or name alternative list tools, so it falls short of a full when/when-not/alternatives treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_account_usersList Account UsersARead-onlyInspect
List the people in this ActivitySmith account with their email, name, role, and how many active devices they have. Use it to choose users for set_channel_users, or device owners for set_channel_devices; pass their emails. Owners come first, then admins, then members, each sorted by email. Returns all users at once, without pagination.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| users | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuinely non-obvious behavior beyond that: deterministic ordering (owners, then admins, then members, each by email) and that all users are returned at once with no pagination. Only the absence of any auth/permission note keeps it from a 5.
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 load-bearing: what it returns, when to use it and what to forward, and the ordering/pagination contract. The most decision-relevant fact (purpose) is front-loaded 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?
With an output schema present, return-value structure need not be explained, and the description still covers ordering, completeness of results, and intended downstream use. Nothing an agent needs to call this no-arg read tool 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 tool takes zero parameters, so per the rubric the baseline is 4. The only 'pass their emails' remark describes what to send to sibling tools, not an argument of this one, so it neither helps nor hurts.
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 ('List') and resource ('people in this ActivitySmith account') and enumerates the returned fields (email, name, role, active device count), which cleanly separates it from list_account_devices and the other list_* siblings. An agent can identify the tool's scope without opening the schema.
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?
Gives explicit downstream usage: 'Use it to choose users for set_channel_users, or device owners for set_channel_devices; pass their emails.' It names the two consuming siblings and tells the agent what value to hand them, which is exactly the routing guidance needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_api_keysList API KeysARead-onlyInspect
List API keys for the authorized ActivitySmith account, newest first. Returns names, key prefixes, channel scope, and whether a key was created by an AI agent. Secret key values are never returned. Requires the "Manage API keys" permission, which the user grants on the ActivitySmith approval screen.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| api_keys | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/destructive annotations, the description discloses concrete behavioral facts: results are ordered newest first, the exact fields returned, that secret key values are never returned, and that a specific 'Manage API keys' permission granted via the approval screen is required. This is meaningful auth and data-exposure context an agent cannot get from the annotations.
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 short sentences, front-loaded with purpose and ordering, then returns and permission needs. No filler or restatement of the title.
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 zero-parameter list tool with an output schema present, the description is fully sufficient: scope, ordering, returned fields, permission requirements, and a security caveat are all covered. Nothing needed to invoke 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 tool takes no parameters, so there is nothing for the description to clarify beyond the schema. The baseline for a zero-parameter tool 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?
States a specific verb and resource ('List API keys') plus scope ('for the authorized ActivitySmith account') and ordering ('newest first'). An agent can distinguish it at a glance from siblings like create_api_key, delete_api_key, and rename_api_key.
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 account-level scope and permission requirement imply when the tool applies, but there is no explicit guidance on when to prefer it over other listing tools (e.g., list_account_users, list_tags) or any stated exclusions. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_channelsList ChannelsARead-onlyInspect
List the account's channels with each channel's slug, public_id, and the number of assigned users and devices. Channels are optional groups of recipients that Push Notifications, Live Activities, and the App Icon Badge can target with target_channel_slugs. Use this to find the slug or public_id that get_channel, update_channel, delete_channel, set_channel_users, and set_channel_devices need. Returns all channels at once, newest first, without pagination.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| channels | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: it returns all channels at once, ordered newest first, with no pagination – an important disclosure for a list tool that agents would otherwise assume paginates.
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 earning its place: what it returns, what a channel is/does, and which siblings depend on its output. The scoping fact (no pagination, newest first) is placed at the end where it reads as a caveat rather than burying the 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?
An output schema exists, and the description still names the salient return fields, so the agent knows both the shape and the semantics. No parameters, no destructive behavior, and full sibling routing make this complete for a zero-arg 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?
The tool takes zero parameters, so the baseline of 4 applies; there is no parameter semantics for the description to compensate for. The mention of target_channel_slugs refers to sibling tools rather than this tool's inputs, which is clarifying but not 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?
Specific verb+resource ('List the account's channels') plus the exact payload fields returned (slug, public_id, assigned user/device counts). It also explains what a channel is, and implicitly contrasts with the single-channel get_channel sibling.
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 the use case: find the slug or public_id required by get_channel, update_channel, delete_channel, set_channel_users, and set_channel_devices. This routes the agent through the dependency chain rather than leaving it to infer which sibling to call first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_live_activitiesList Live ActivitiesARead-onlyInspect
List Live Activities sent from this account, newest first, with their status, Tags, and latest content. Use it to review recent activity or find an activity_id; for one known activity, use get_live_activity. To change a running activity, use the stream tools such as set_live_activity_stream. Equal creation times use descending ID order. Equal creation times use descending ID order. Defaults: limit 50, offset 0; maximum limit 100. Continue with meta.next_offset and the same filters; stop when it is null. Results can change between requests.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Only return activities with these Tags, up to 20 slugs such as deploys (see list_tags). Matching is case-insensitive. | |
| limit | No | Maximum activities to return, 1-100. Defaults to 50. | |
| offset | No | Number of activities to skip. Use meta.next_offset from the previous page. Defaults to 0. | |
| status | No | Only return activities with this status: in_progress, completed, cancelled, or expired. Omit for all. | |
| tag_mode | No | How tags combine: all (default) requires every listed Tag, any requires at least one. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), and the description adds genuine behavior: the tie-break rule for equal creation times, pagination continuation via meta.next_offset, and the volatility caveat "Results can change between requests." It stops short of describing auth or filter-combination internals, but goes well beyond the annotations.
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?
Front-loaded and mostly efficient, but "Equal creation times use descending ID order." is duplicated verbatim, wasting a sentence. That redundancy is a real structural flaw in an otherwise well-ordered description.
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?
An output schema exists and annotations carry the safety profile, so the description only needs to cover scoping, ordering, filtering and pagination — which it does. An agent has everything required to call this 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 description coverage is 100%, so the schema already documents all five parameters including defaults and the tag_mode enum, making 3 the baseline. The description restates defaults (limit 50, offset 0, max 100) and adds only the continuation instruction "Continue with meta.next_offset and the same filters; stop when it is null," which is marginal 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?
Specific verb+resource ("List Live Activities sent from this account") with scope, ordering ("newest first") and returned fields declared. It is clearly distinguishable from get_live_activity and the stream siblings.
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 two use cases (review recent activity, find an activity_id) and routes the agent to alternatives by condition: get_live_activity for one known activity, set_live_activity_stream and other stream tools for changing a running activity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_push_notificationsList Push NotificationsARead-onlyInspect
List Push Notification history for the account, newest first. Use it to review what was sent, find a notification's public_id, or filter by Tags; for one known notification, use get_push_notification. Equal creation times use descending ID order. Equal creation times use descending ID order. Defaults: limit 50, offset 0; maximum limit 100. Continue with meta.next_offset and the same filters; stop when it is null. Results can change between requests.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Only return items with these Tags, up to 20 slugs such as deploys or billing (see list_tags). Matching is case-insensitive. | |
| limit | No | Maximum items to return, 1-100. Defaults to 50. | |
| offset | No | Number of items to skip. Use meta.next_offset from the previous page. Defaults to 0. | |
| tag_mode | No | How tags combine: all (default) returns items that have every listed Tag, any returns items with at least one. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuinely new behavior: stable tie-breaking by descending ID, pagination continuation semantics, and the caveat that 'Results can change between requests' (non-snapshot reads). It does not cover rate limits or result-size characteristics, keeping it short of a 5.
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?
Mostly dense and front-loaded, but the sentence 'Equal creation times use descending ID order.' is duplicated verbatim, which is wasted text and suggests an editing defect. The rest earns its place, so this is a modest rather than severe deduction.
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?
An output schema exists, so return values need not be explained, and the description still supplies the one output detail an agent must act on: driving the next page from meta.next_offset. For a read-only, filter-and-paginate list tool, nothing needed 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?
Schema description coverage is 100%, so tags, limit, offset and tag_mode are already fully documented in the schema. The description only restates defaults (limit 50, offset 0, max 100) that the schema already carries, adding no new parameter meaning. Baseline 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?
States a specific verb and resource ('List Push Notification history for the account') plus ordering ('newest first'), and explicitly distinguishes itself from the sibling get_push_notification for single-notification lookups. An agent can route correctly without opening either schema.
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?
Gives concrete use cases (review what was sent, find a public_id, filter by Tags), names the alternative for the single-notification case, and spells out the pagination loop: continue with meta.next_offset using the same filters and stop when it is null.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsList TagsARead-onlyInspect
List the account's Tags with how many Push Notifications and Live Activities use each one. Use it to find Tag slugs for the tags filter of list_push_notifications and list_live_activities, or to reuse existing Tags when sending. Sorted alphabetically by slug, then ID. Defaults: limit 50, offset 0; maximum limit 100. Continue with meta.next_offset and the same filters; stop when it is null. Results can change between requests.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum Tags to return, 1-100. Defaults to 50. | |
| query | No | Optional case-insensitive text matched anywhere in the Tag slug. Example: deploy matches deploys and deploy-prod. | |
| offset | No | Number of Tags to skip. Use meta.next_offset from the previous page. Defaults to 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: alphabetical sort by slug then ID, pagination continuation via meta.next_offset, and the caveat that 'Results can change between requests'. No auth or rate-limit detail, hence not a 5.
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?
Front-loaded with purpose, then usage, then sorting/pagination details — every sentence is informative. Slight redundancy in repeating the limit/offset defaults already present in the schema keeps it from a 5.
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?
An output schema exists, so return-value explanation is unnecessary, and the description covers everything else an agent needs: purpose, sibling routing, sort order, pagination loop, and stability caveat. Nothing required 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 limit, offset, and query are already fully documented in the schema. The description largely restates the defaults (limit 50, offset 0, maximum 100) without adding syntax or semantics beyond what the schema provides, so baseline 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?
States a specific verb and resource ('List the account's Tags') plus the returned payload shape ('with how many Push Notifications and Live Activities use each one'). It explicitly names the sibling tools it complements (list_push_notifications, list_live_activities), so an agent can distinguish it from other list_* tools without opening schemas.
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?
Gives concrete when-to-use conditions: finding Tag slugs for the tags filter of list_push_notifications and list_live_activities, or reusing existing Tags when sending. The alternatives are named directly and the purpose for calling is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_widget_metricsList Widget MetricsARead-onlyInspect
List every Lock Screen Widget metric in the account, newest first, with each metric's key, label, format, and latest value. Use it to find a metric's public_id (for update_widget_metric and delete_widget_metric) or key (for set_widget_metric_value), or to check the current value before changing it. Deleted metrics are excluded. Returns all metrics at once, without pagination.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| metrics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds non-obvious behavior on top: deleted metrics are excluded, results are returned in full without pagination, and ordering is newest-first. It stops short of noting account/permission scope, but the added behavioral context is 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?
Three tight sentences, front-loaded with what is returned before the routing guidance. Every sentence carries distinct information: contents, usage, and result-set behavior.
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?
An output schema exists, so return values need not be explained, yet the description still flags the non-paginated full result set and exclusion of deleted metrics. For a zero-parameter list tool with rich annotations, nothing an agent needs in order 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?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. The description does not need to compensate for any schema gap.
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 ('List') and resource ('Lock Screen Widget metric'), plus the ordering ('newest first') and the fields returned (key, label, format, latest value). This cleanly separates it from siblings like list_channels or list_api_keys without opening any schema.
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?
Gives explicit when-to-use guidance tied to three named alternatives: find public_id for update_widget_metric/delete_widget_metric, find key for set_widget_metric_value, or read the current value before changing it. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_live_activity_streamPause Live Activity StreamADestructiveInspect
Pause a managed Live Activity stream and end its current activity if needed. Pausing can send a remote end and use the device's ActivityKit push budget; use it only for a genuine pause, not as update-rate control. Future set_live_activity_stream calls for the same key are ignored until resume_live_activity_stream is called.
| Name | Required | Description | Default |
|---|---|---|---|
| stream_key | Yes | Stable Live Activity stream key. Use the same key to update the same stream. Do not create new keys for routine updates: every new stream requires another remote start and uses the device's limited iOS push-to-start budget. Use only letters, numbers, underscores, and hyphens. | |
| content_state | No | Optional final Live Activity content state for the pause. If omitted, ActivitySmith uses the latest stored state when possible. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes | |
| operation | Yes | |
| paused_at | Yes | |
| timestamp | Yes | |
| stream_key | Yes | |
| activity_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, openWorldHint=true), the description discloses concrete side effects: a remote end may be sent, the device's ActivityKit push budget is consumed, and subsequent set_live_activity_stream calls are suppressed. It also names the recovery path (resume_live_activity_stream), which the annotations cannot convey.
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 ordered as action, cautionary guidance, then state consequence. The scoping and budget warning is front-loaded and no sentence is redundant or padding.
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 destructive, budget-consuming operation with two documented parameters and an output schema, the description covers the important unknowns: what gets destroyed, what it costs, and what state results. Return-value detail is correctly left to the output schema.
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 stream_key and content_state are already documented, including key reuse and budget warnings in the schema itself. The description adds no parameter-level syntax or format detail, so the baseline 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?
States a specific verb (pause) and resource (Live Activity stream) and clarifies the composite effect: ending the current activity when needed. It also implicitly distinguishes itself from set_live_activity_stream and resume_live_activity_stream by name, so an agent can separate it from its closest siblings without opening a schema.
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 when/when-not guidance: 'use it only for a genuine pause, not as update-rate control,' plus the consequence that future set_live_activity_stream calls are ignored until resume_live_activity_stream is called. This routes the agent to the correct sibling for rate changes and explains the state transition required to undo it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_api_keyRename API KeyAIdempotentInspect
Rename an ActivitySmith API key. The key secret and its access do not change. Requires the "Manage API keys" permission, which the user grants on the ActivitySmith approval screen.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New descriptive name, such as "GitHub Actions deploy". | |
| public_id | Yes | API key public_id from list_api_keys. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| success | Yes | |
| public_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive, idempotent, closed-world behavior, so the bar is lower. The description usefully adds that the secret and access are preserved and that an approval-screen permission is required, which annotations cannot express; it stops short of richer detail like failure modes or rename conflicts.
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, front-loaded with the action, followed by scope and prerequisite. No filler or repetition of the schema.
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?
An output schema exists, annotations cover the safety profile, and the schema fully documents both params. The description supplies the two things structured fields cannot: the permission prerequisite and the guarantee that the secret/access are untouched. Nothing needed to call this 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?
Schema coverage is 100% and both parameters carry their own descriptions (including the example name and the pointer to list_api_keys for public_id), so the schema does the heavy lifting. The description adds no parameter-level meaning beyond that, making the baseline 3 correct.
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 and resource ("Rename an ActivitySmith API key") and immediately bounds the effect ("The key secret and its access do not change"), which separates it from the create/delete/list API key siblings in the same family.
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?
Gives clear usage context: it names the required "Manage API keys" permission and what is unaffected by the operation, so the agent knows this is a metadata-only rename. It does not, however, explicitly contrast with list_api_keys or delete_api_key, and there is no update_api_key sibling to route away from.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_push_notificationReplace Push NotificationADestructiveInspect
Replace a Push Notification that was already sent, using the notification_id returned by send_push_notification.
The replacement takes the old notification's place on the Lock Screen and in Notification Center, so the user does not end up with two. It arrives silently: no sound and no screen wake. Use it to update a Push Notification you already sent, for example when an incident you alerted on is resolved.
Replacement content fully replaces the old title, subtitle, message, redirection, media, icon, actions, and payload. Omitted metadata and tags keep their stored values. The notification goes to the same recipients as the original. History is updated in place.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Optional HTTPS image URL, such as a logo or avatar, shown next to a smaller ActivitySmith app icon. | |
| tags | No | Optional account tags. Omit to keep the stored tags; [] clears them. | |
| badge | No | Optional app badge count. | |
| media | No | Optional HTTPS image, audio, or video URL. Can be combined with redirection, but not with actions. | |
| title | Yes | Replacement Push Notification title. | |
| actions | No | Optional expanded notification actions, up to 4. open_url actions accept HTTP/HTTPS URLs or installed apps' custom URL schemes, such as spotify:// or shortcuts://run-shortcut?name=Example. webhook actions call an HTTPS endpoint with optional GET or POST method and optional JSON body. Do not combine actions with media. | |
| message | No | Optional replacement message body. | |
| payload | No | Optional custom JSON payload delivered with the replacement. | |
| metadata | No | Optional app-only details with the same limits as send_push_notification. Omit to keep the stored metadata; {} clears it. | |
| subtitle | No | Optional replacement subtitle. | |
| redirection | No | Optional normal-tap target. Use an HTTP/HTTPS URL or an installed app's custom URL scheme, such as spotify:// or shortcuts://run-shortcut?name=Example. Custom app schemes require iOS app 1.13.4 build 2 or later. No web fallback. | |
| notification_id | Yes | notification_id returned when the Push Notification was sent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | No | |
| success | Yes | |
| timestamp | Yes | |
| users_notified | Yes | |
| notification_id | Yes | |
| devices_notified | Yes | |
| effective_channel_slugs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint=true already declared, the description goes well beyond it: it explains what is destroyed (the old notification's slot on Lock Screen and Notification Center), how it is delivered (silently, no sound, no screen wake), the merge-vs-replace rule (content fields fully replaced; omitted metadata and tags keep stored values), and that recipients and history are preserved/updated in place.
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?
Front-loaded with purpose and identity, then delivery behavior, then the replace/merge rule — a sensible precedence order. Slightly long at four paragraphs, with mild restatement in the second paragraph, but every paragraph carries distinct 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 12-parameter mutation tool with an output schema, the description covers the destructive effect, silent delivery, content-replacement semantics, recipient behavior, and history handling. Nothing an agent needs to invoke it safely is missing, and return values are covered by the output schema.
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, but the description supplies cross-parameter semantics the schema does not: which fields are wholesale replaced versus which retain stored values, and that the notification targets the original recipients. The tags/metadata omit-vs-clear behavior is largely duplicated from the schema, so it stops short of 5.
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 and resource ('Replace a Push Notification that was already sent') and immediately binds it to the identifier source ('notification_id returned by send_push_notification'), which separates it cleanly from the send and get siblings. An agent can distinguish it without opening the schema.
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?
Gives a concrete when-to-use scenario ('update a Push Notification you already sent, for example when an incident you alerted on is resolved') and ties it to the send_push_notification workflow that produces the id. It never states the inverse case (use send_push_notification for a brand-new notification), but the context is strong enough to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_approvalRequest ApprovalAInspect
Ask the ActivitySmith account owner for a decision. Sends an actionable Live Activity when available, falls back to an actionable Push Notification, and waits up to 45 seconds. If the result is pending, call wait_for_approval repeatedly with the returned approval ID. The approval ID stays valid across client timeouts and reconnects. Choose action-specific approve_label and reject_label values when they make the decision clearer, such as Send/Cancel or Deploy/Hold. When approving a concrete command or tool call, include execution_context and the most relevant scope so the user can evaluate the actual operation.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Optional primary scope for the decision. For local shell commands, provide working_directory with the full current working directory. Otherwise use the most decision-relevant project, environment, customer, account, or resource. Omit when no meaningful scope exists. | |
| details | No | Optional short context that helps the user decide. | |
| delivery | No | Optional delivery preference. auto prefers a Live Activity and falls back to a Push Notification. | auto |
| question | Yes | The decision the user needs to make. | |
| appearance | No | Optional pending Live Activity appearance. Customize its tint, SF Symbol, and badge. This does not change Push Notifications or resolved approval states. | |
| reject_label | No | Optional alternative action label. Choose a clear outcome such as Cancel, Keep Draft, or Don't Send. Defaults to Reject. | Reject |
| approve_label | No | Optional positive action label. When approving a specific action, prefer a concrete verb such as Send, Deploy, Publish, or Delete. Defaults to Approve. | Approve |
| execution_context | No | Optional structured context for the specific operation awaiting approval. Include it for commands and tool calls; omit it for question-only decisions. | |
| target_channel_slugs | No | Advanced optional targeting for team accounts. Omit to notify the account-wide default devices. |
Output Schema
| Name | Required | Description |
|---|---|---|
| approval | Yes | |
| next_action | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, idempotentHint=false, openWorldHint=true) by disclosing the 45-second wait, the delivery fallback chain, and that the approval ID survives client timeouts and reconnects. The instruction to re-poll rather than re-request implicitly conveys the non-idempotent behavior that a repeat call would open a second request.
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 what/how/when are front-loaded in the first two sentences, and the remaining sentences carry concrete directives rather than filler. Slightly dense with five distinct instructions packed together, but 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?
An output schema exists, so return values need not be documented, and the description still usefully references the returned approval ID and pending state. For a 9-parameter tool with nested objects and a 45-second blocking wait, it covers polling, labels, and execution_context well; minor gaps remain on target_channel_slugs and appearance usage.
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 operating meaning: it explains when to choose action-specific approve_label/reject_label values ('Send/Cancel', 'Deploy/Hold') and when to include execution_context plus the most relevant scope. It does not address target_channel_slugs or appearance, which the schema handles 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?
States a specific verb and resource ('Ask the ActivitySmith account owner for a decision') and immediately explains the mechanism (Live Activity, Push Notification fallback, 45-second wait). An agent can distinguish this from siblings like wait_for_approval, get_approval, and cancel_approval without opening any schema.
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 routes the follow-up case: 'If the result is pending, call wait_for_approval repeatedly with the returned approval ID.' It also gives conditional guidance for labels and for including execution_context/scope when approving a concrete command. It stops short of an explicit when-not-to-use rule (e.g., when to prefer send_push_notification or cancel_approval instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_live_activity_streamResume Live Activity StreamAInspect
Resume a genuinely paused managed Live Activity stream. The next set_live_activity_stream call can remotely start the stream again and consume push-to-start budget.
| Name | Required | Description | Default |
|---|---|---|---|
| stream_key | Yes | Stable Live Activity stream key. Use the same key to update the same stream. Do not create new keys for routine updates: every new stream requires another remote start and uses the device's limited iOS push-to-start budget. Use only letters, numbers, underscores, and hyphens. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| success | Yes | |
| operation | Yes | |
| timestamp | Yes | |
| stream_key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (not read-only, not destructive, not open-world), so the bar is lower. The description adds real behavioral context beyond them: this tool itself does not restart the stream, and the subsequent set_live_activity_stream call consumes push-to-start budget, which is a cost/limit the agent should know about.
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, zero waste, with the scope qualifier and the downstream consequence each getting exactly one sentence. Front-loaded with the core 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?
An output schema exists, so return values need no explanation, and annotations carry the safety profile. The description supplies the state precondition and the follow-up cost, but does not say what happens if the stream is not paused (an error/validation case) or whether any permissions are required.
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 is a single parameter with 100% schema description coverage, and that schema text already explains key stability and the push-to-start budget rationale. The description adds no parameter-level syntax or format detail 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?
States a specific verb (resume) and resource (Live Activity stream), qualified by 'genuinely paused managed' to define the exact state being acted on. This cleanly separates it from pause_live_activity_stream, end_live_activity_stream, and set_live_activity_stream in the sibling list.
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 'genuinely paused' implies the precondition for calling it, and the description explains the follow-up action (the next set_live_activity_stream call restarts the stream). It stops short of explicitly naming an alternative or stating what to do if the stream is not paused.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_push_notificationSend Push NotificationAInspect
Send an ActivitySmith Push Notification to this account. Optionally target channel slugs.
Normal notification taps use redirection, which accepts HTTP/HTTPS URLs and installed apps' custom URL schemes, such as spotify:// or shortcuts://run-shortcut?name=Example.
Expanded notification actions use actions, up to 4 items. open_url actions accept the same external URLs as redirection. Custom app schemes require iOS app 1.13.4 build 2 or later and the target app to be installed; no web fallback is provided. Unsafe schemes and ActivitySmith's internal scheme are blocked. webhook actions call an HTTPS endpoint with GET or POST and optional JSON body.
media can be combined with redirection, but media cannot be combined with actions.
The result includes notification_id. Pass it to replace_push_notification to update this notification later, for example when an incident you alerted on is resolved.
icon shows an HTTPS image, such as a logo or avatar, next to a smaller ActivitySmith app icon; iOS may hide the subtitle. interruption_level is passive (quiet, no sound), active (default), or time-sensitive (can break through Focus when allowed); use time-sensitive only for things the user must see now. Both require iOS app 1.16.0 or later.
Action examples: [ { "title": "Open Build", "type": "open_url", "url": "https://github.com/acme/web/actions/runs/123" }, { "title": "Chat with Jarvis", "type": "open_url", "url": "shortcuts://run-shortcut?name=Jarvis" }, { "title": "Create Incident", "type": "webhook", "url": "https://hooks.example.com/incidents/create", "method": "POST", "body": { "service": "payments-api", "severity": "high" } } ]
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Optional HTTPS image URL, such as a logo or avatar, shown next to a smaller ActivitySmith app icon. | |
| tags | No | Optional account tags used to organize history. | |
| badge | No | Optional app badge count. | |
| media | No | Optional HTTPS image, audio, or video URL. Can be combined with redirection, but not with actions. | |
| sound | No | Optional APNs sound name, such as default. | |
| title | Yes | Push Notification title. | |
| actions | No | Optional expanded notification actions, up to 4. open_url actions accept HTTP/HTTPS URLs or installed apps' custom URL schemes, such as spotify:// or shortcuts://run-shortcut?name=Example. webhook actions call an HTTPS endpoint with optional GET or POST method and optional JSON body. Do not combine actions with media. | |
| message | No | Optional Push Notification message body. | |
| payload | No | Optional custom JSON payload delivered with the notification. | |
| metadata | No | Optional app-only details: up to 50 string keys (1–100 characters), with string (up to 4000 characters), finite number, or boolean values; 16 KB total. Stored in history, never sent to APNs. No nested values or null. | |
| subtitle | No | Optional subtitle shown with the Push Notification. | |
| redirection | No | Optional normal-tap target. Use an HTTP/HTTPS URL or an installed app's custom URL scheme, such as spotify:// or shortcuts://run-shortcut?name=Example. Custom app schemes require iOS app 1.13.4 build 2 or later. No web fallback. | |
| interruption_level | No | Optional delivery urgency: passive, active (default), or time-sensitive. | |
| target_channel_slugs | No | Optional channel slugs to target. Omit to target the account-wide default delivery scope. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | Yes | |
| success | Yes | |
| timestamp | Yes | |
| users_notified | Yes | |
| notification_id | No | |
| devices_notified | Yes | |
| effective_channel_slugs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, and the description does not contradict them. It adds genuine operational context beyond the annotations: no web fallback for custom schemes, unsafe and internal schemes blocked, iOS version/build floors (1.13.4 build 2, 1.16.0), and that the result carries a notification_id usable with replace_push_notification. Some of this restates schema property text, which keeps it from a 5.
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 first sentence front-loads the purpose well, but the body is a long undifferentiated block and several paragraphs (redirection URL rules, media/actions mutual exclusion, icon rendering) substantially repeat the corresponding schema property descriptions. The action example block earns its place; the redundancy with structured fields does not.
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 14-parameter tool with nested objects, one enum, and a 100%-covered schema, the description covers the hard parts: platform requirements, blocked schemes, option mutual exclusions, and the notification_id handoff to replace_push_notification. An output schema exists, so return values need not be explained, and nothing needed for a correct call 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 3 is the baseline; the description earns a point by supplying concrete, correctly-shaped action examples (open_url with a GitHub URL, a shortcuts:// scheme, and a webhook with method and JSON body) that show how the untyped 'actions' array items should be constructed. That is meaningfully more than the schema conveys, though the remaining 13 parameters get nothing extra.
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 and resource ('Send an ActivitySmith Push Notification to this account') plus the optional targeting scope ('Optionally target channel slugs'). It also names the sibling that continues the workflow ('Pass it to replace_push_notification to update this notification later'), so an agent can distinguish it from replace_push_notification and list_push_notifications without opening a schema.
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?
Gives conditional guidance on option selection: 'use time-sensitive only for things the user must see now', 'media can be combined with redirection, but media cannot be combined with actions', and routes follow-up updates to replace_push_notification. It does not state when to prefer this tool over siblings like list_push_notifications or get_push_notification, but for a creation tool the operative 'when' is largely covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_channel_devicesSet Channel DevicesADestructiveIdempotentInspect
Replace the full list of individually assigned devices in a channel. Use it to include specific devices, such as one person's iPad, without adding all of that person's devices through set_channel_users. Devices left out are removed, and sending no devices removes them all; user assignments are kept. To add one device, call get_channel first and send the existing devices plus the new one. Each device must belong to the given account user (see list_account_devices). Returns the channel and the resulting device assignments.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Channel slug, such as ops or ios-beta, from list_channels. Provide public_id or slug. | |
| devices | No | Complete list of devices to assign. Duplicates are ignored. | |
| public_id | No | Channel public_id from list_channels. Provide public_id or slug; if you send both, they must match the same channel. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| devices | Yes | |
| success | Yes | |
| public_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true, but the description adds the exact replacement semantics the hints cannot: devices left out are removed, sending an empty list removes them all, and user assignments are preserved. This is the critical behavioral detail an agent needs before calling a full-replacement mutation.
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?
Front-loaded with the replacement purpose, then the sibling distinction, then the add-one-device procedure. Every sentence carries operational weight, though the closing line about return values is mildly redundant given the output schema exists.
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 destructive full-replacement mutation with an output schema present, the description covers purpose, alternative routing, replacement/removal semantics, and ID sourcing. Nothing an agent needs to invoke it safely 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 slug/public_id/devices and their sub-fields (baseline 3). The description adds a genuine validation constraint beyond the schema — 'Each device must belong to the given account user' — which tells the agent a mismatched device will fail, justifying a modest bump.
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 (Replace) and resource (full list of individually assigned devices in a channel), and immediately scopes it against the sibling set_channel_users. An agent can distinguish this from the user-assignment tool without reading either schema.
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 names the alternative (set_channel_users) and the condition selecting this tool instead, explains the procedure for the common 'add one device' case (call get_channel first, resend existing plus new), and points to list_account_devices for valid device IDs. When-to-use, when-not, and prerequisites are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_channel_usersSet Channel UsersADestructiveIdempotentInspect
Replace the full list of users assigned to a channel. Every active device of each listed user receives deliveries sent to the channel. Users left out are removed, and sending no users removes them all; individually assigned devices from set_channel_devices are kept. To add one user, call get_channel first and send the existing users plus the new one. Users must belong to the account (see list_account_users). Returns the channel and the resulting list of user emails.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Channel slug, such as ops or ios-beta, from list_channels. Provide public_id or slug. | |
| public_id | No | Channel public_id from list_channels. Provide public_id or slug; if you send both, they must match the same channel. | |
| user_emails | No | Emails of account users, from list_account_users. Combined with user_public_ids. | |
| user_public_ids | No | User public IDs, as returned by get_channel. Combined with user_emails. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| success | Yes | |
| public_id | Yes | |
| user_emails | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and idempotent=true, but the description goes further by spelling out exactly what is destroyed (users omitted from the list are removed; an empty list removes all) and what is preserved (individually assigned devices from set_channel_devices). It also discloses the return payload, which annotations cannot convey.
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?
Front-loaded with the replacement semantics, then prerequisites, then the add-one-user workflow. Dense and information-bearing, though the closing sentence about return values is slightly redundant given an output schema exists.
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 destructive, full-replacement mutation with zero required parameters, it covers the destructive scope, the empty-list edge case, the surviving device assignments, the required lookup tools, and the response. Nothing needed to call it safely 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 real meaning on top by explaining that an empty/omitted user list wipes all assignments and that the two user fields are combined into one logical set, plus the constraint that emails must belong to the account.
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 and resource ('Replace the full list of users assigned to a channel') and immediately frames it as a full-replacement operation, which distinguishes it from sibling set_channel_devices (explicitly named) and update_channel.
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?
Gives explicit when-to-use guidance: to add a single user, call get_channel first and send existing users plus the new one. It names the alternative (set_channel_devices) and clarifies that device-level assignments survive, and states the prerequisite that users must belong to the account via list_account_users.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_live_activity_streamSet Live Activity StreamAInspect
Create or update a managed Live Activity stream by stable stream_key.
This is the preferred Live Activity MCP workflow. Do not use legacy start/update/end ids. The stream_key is the handle.
REMOTE DELIVERY BUDGET: Each non-noop operation can send a remote ActivityKit push. iOS applies device-dependent push-to-start and update budgets and may throttle delivery even after APNs accepts the request. Use one stable stream_key for each real-world activity and send updates when its user-visible state meaningfully changes. Event-driven transitions may be seconds apart—for example, successive steps in a short deployment—and should be sent promptly; do not delay them to satisfy a fixed minimum interval. Short bursts of genuine progress are expected. Avoid sustained polling, heartbeat updates, per-second timer ticks, unchanged values, and high-frequency churn that does not communicate a meaningful transition. Coalesce only redundant or excessively granular changes. Do not retry a successful call to force display: success means APNs accepted the push, not that the device displayed it.
First call starts the Live Activity. Later calls with the same stream_key, same content_state.type, and same target channels update it. Repeating the same payload returns operation "noop". Changing the type or target channels rotates to a new underlying Live Activity.
Keep content_state.type and target channels stable to avoid consuming another push-to-start operation. For countdowns, send timer fields once and let the device render elapsed time locally instead of sending frequent updates.
Supported content_state.type values: segmented_progress, progress, metrics, stats, alert, timer, value.
Icons work with stats, metrics, progress, segmented_progress, alert, timer, and value. Use Apple SF Symbol names for icons. Badges work with alert, progress, segmented_progress, and value. A top-level action adds the Live Activity tap/action button and can open an HTTP/HTTPS URL, run an iPhone Shortcut with shortcuts://run-shortcut?name=..., or trigger a backend webhook. A top-level secondary_action adds a second button for alert, progress, segmented_progress, and value Live Activities.
Examples: { "value": { "title": "Current revenue", "subtitle": "Today", "type": "value", "value": "$1,240", "color": "cyan", "icon": "dollarsign.circle", "badge": { "title": "Live", "color": "green" } }, "segmented_progress": { "title": "Deploying API", "subtitle": "Step 2 of 4", "type": "segmented_progress", "current_step": 2, "number_of_steps": 4 }, "progress": { "title": "Uploading build", "subtitle": "42% complete", "type": "progress", "percentage": 42 }, "metrics": { "title": "Server load", "subtitle": "Current usage", "type": "metrics", "metrics": [ { "label": "CPU", "value": 27, "unit": "%" } ] }, "stats": { "title": "Sales", "subtitle": "Last 15 minutes", "type": "stats", "metrics": [ { "label": "Revenue", "value": 12.8, "unit": "k" }, { "label": "Orders", "value": 37 }, { "label": "Avg Order", "value": "$346" } ] }, "alert": { "title": "Alert", "message": "Incident response started. Primary API is degraded across regions.", "type": "alert", "color": "magenta", "icon": { "symbol": "exclamationmark.circle", "color": "yellow" }, "badge": { "title": "Escalated", "color": "gray" } }, "timer": { "title": "Benchmark Run", "subtitle": "sampling performance", "type": "timer", "duration_seconds": 300, "color": "cyan", "counts_down": true } }
Action examples: { "open_url": { "title": "Open Runbook", "type": "open_url", "url": "https://example.com/runbook" }, "shortcut": { "title": "Chat with Jarvis", "type": "open_url", "url": "shortcuts://run-shortcut?name=Jarvis" }, "webhook": { "title": "Acknowledge", "type": "webhook", "url": "https://example.com/hooks/ack", "method": "POST", "body": { "incident_id": "inc_123" } } }
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional account tags used to organize Live Activity history. | |
| alert | No | Optional APNs alert payload shown when the Live Activity starts or updates. | |
| action | No | Optional action button/tap target. Use { title, type: "open_url", url } with an HTTP/HTTPS URL or shortcuts://run-shortcut?name=... to open a URL or run an iPhone Shortcut. Use { title, type: "webhook", url, method, body } to call an HTTPS webhook. Webhook method can be GET or POST. | |
| metadata | No | Optional app-only details with string, number, or boolean values. Omit to preserve; send {} to clear. Never sent to ActivityKit. | |
| stream_key | Yes | Stable Live Activity stream key. Use the same key to update the same stream. Do not create new keys for routine updates: every new stream requires another remote start and uses the device's limited iOS push-to-start budget. Use only letters, numbers, underscores, and hyphens. | |
| content_state | Yes | Live Activity content state. Set type to one of: segmented_progress, progress, metrics, stats, alert, timer, value. Use segmented_progress for step-based work, progress for continuous completion, metrics or stats for multiple values, value for one prominent string or number, alert for important status, and timer for countdown or elapsed time. Icons work with all types: use icon as an SF Symbol string or { symbol, color }, plus optional icon_color and icon_style. Badges work with alert, progress, segmented_progress, and value: use badge { title, color }. Other optional presentation fields include subtitle, color, auto_dismiss_seconds, and auto_dismiss_minutes. | |
| secondary_action | No | Optional secondary action button for alert, progress, and segmented_progress Live Activities. Uses the same object shape as action. | |
| target_channel_slugs | No | Optional channel slugs to target. Omit to target the account-wide default delivery scope. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false). It discloses APNs remote delivery budgets, device-dependent push-to-start throttling, noop-on-identical-payload behavior, rotation to a new Live Activity when type/channels change, and the crucial caveat that success means APNs accepted the push, not that the device displayed it.
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?
Front-loaded with purpose, then budget semantics, then lifecycle mechanics, then type enumeration and examples. Well organized, but the seven content-type and three action JSON examples are lengthy and partially duplicate what the schema already documents, which dilutes the density somewhat.
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 complex, high-blast-radius mutation tool with nested objects, this covers lifecycle, budget behavior, payload stability, action surfaces, and type compatibility. An output schema exists, so return values need not be described, and 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?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: which content_state.type maps to which use case, icon/badge compatibility per type, action vs secondary_action shapes and their supported Live Activity types, and why stream_key must stay stable. The inline examples also clarify the nested content_state structure beyond the terse schema 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?
Opens with a specific verb+resource+key: 'Create or update a managed Live Activity stream by stable stream_key.' It immediately distinguishes itself from the legacy start/update/end id workflow, so an agent can tell which path to take without opening a schema.
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?
Rich when-to-use and when-not guidance: send updates on meaningful user-visible state changes, avoid sustained polling/heartbeats/per-second ticks, coalesce redundant changes, and don't retry a successful call. It does not, however, route the agent to the obvious siblings pause_live_activity_stream / resume_live_activity_stream / end_live_activity_stream for those lifecycle transitions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_widget_metric_valueSet Widget Metric ValueAInspect
Record the latest value of a Lock Screen Widget metric, identified by its key. Use it whenever the tracked number or text changes, such as new revenue, signups, or uptime. The value replaces the previous one. Widgets on the user's Lock Screen pick it up on their next refresh, about every 15 minutes, so it is not instant; for an immediate alert, use send_push_notification. The metric must already exist (see list_widget_metrics and create_widget_metric). Each successful call counts as a billable metric update and returns a billing error when the account's trial or plan does not allow more. Returns the metric with its new latest value.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key of an existing metric, as shown by list_widget_metrics. Example: mrr. | |
| value | Yes | New value. For number, currency, percent, and unit metrics, send a number; formatted text such as "$1,234.50", "99.9%", or "120ms" is also parsed. For string metrics, send text up to 64 characters. | |
| timestamp | No | Optional ISO 8601 time the value was measured, such as 2026-10-18T09:00:00Z. Defaults to now. |
Output Schema
| Name | Required | Description |
|---|---|---|
| metric | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: replacement semantics ('the value replaces the previous one'), ~15-minute propagation latency, explicit non-instant behavior, billing semantics ('counts as a billable metric update' with a billing error path), and the returned payload. This is exactly the operational detail an agent needs for a write 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?
Front-loaded with purpose and tightly organized: purpose, trigger, replacement/latency, alternative, prerequisites, billing, return. It runs long for a single paragraph, but nearly every sentence carries actionable information, so almost nothing 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?
Given a write tool with an output schema, the description covers everything else an agent needs: prerequisites, latency expectations, an alternative for the urgency case, billing failure behavior, and confirmation that the updated metric is returned. No meaningful gap remains.
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 key, value, and timestamp are already well documented in the schema, including the number-vs-string value rules and the timestamp default. The description reinforces the key identification but adds no parsing or format detail beyond the schema, so baseline 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?
States a precise verb and resource: 'Record the latest value of a Lock Screen Widget metric, identified by its key.' The framing (set/record a value, not create or update the metric itself) clearly distinguishes it from create_widget_metric and update_widget_metric.
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 it ('whenever the tracked number or text changes'), names the alternative for the immediate case ('for an immediate alert, use send_push_notification'), and points to prerequisites (list_widget_metrics, create_widget_metric). Both the trigger condition and the sibling routing are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_app_icon_badge_countUpdate App Icon BadgeAInspect
Set the number shown on the ActivitySmith App Icon Badge on the user's iPhone or iPad, such as a count of open incidents or pending reviews. It updates the badge silently, without showing a Push Notification; use send_push_notification when the user should be alerted, or its badge field to set both at once. Send 0 to clear the badge. The value replaces the current number rather than adding to it, so repeating a call is safe. Optionally target channel slugs. Describe the result only as setting or clearing the App Icon Badge.
| Name | Required | Description | Default |
|---|---|---|---|
| badge | Yes | Number to show on the App Icon Badge. Send 0 to clear it. | |
| target_channel_slugs | No | Optional channel slugs to target. Omit to target the account-wide default delivery scope. |
Output Schema
| Name | Required | Description |
|---|---|---|
| badge | Yes | |
| success | Yes | |
| timestamp | Yes | |
| users_updated | Yes | |
| devices_updated | Yes | |
| effective_channel_slugs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered, yet the description adds real value: it discloses the update is silent (no push notification), that the value replaces rather than increments (idempotent, safe to repeat), and that 0 clears the badge. It stops short of mentioning auth requirements or rate limits, but the added behavioral context 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?
Front-loads the core action and resource, then layers in the alternative-tool routing, the clearing rule, the replace-not-add semantics, and targeting. Every sentence carries distinct information and the closing instruction on how to phrase results is useful rather than 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?
With an output schema present, return values need not be explained. Given only two parameters and full schema coverage, the description covers purpose, alternative-tool routing, edge cases (0 clears, replacement semantics), and scoping, so nothing needed 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?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description's notes on Send 0 to clear and optional channel slugs largely restate what the schema already says, adding no syntax or format detail beyond it, which fits the baseline 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?
States a specific verb (set) and resource (App Icon Badge number) with concrete examples of what the count represents. It explicitly distinguishes itself from send_push_notification, so an agent can pick the right tool without opening either schema.
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?
Gives explicit when-to-use routing: this tool for silent badge updates, send_push_notification when the user should be alerted, and the badge field of that tool to do both at once. Also documents the Send 0 to clear case, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_channelUpdate ChannelADestructiveIdempotentInspect
Rename a channel by changing its slug. Assigned users, devices, and API key scopes stay attached. Senders that target the old slug, such as scripts, SDK calls, and agents using target_channel_slugs, stop reaching this channel until they switch to the new slug, so confirm with the user first. Identify the channel with public_id or current_slug and pass the new name as slug. Alternatively, pass the current slug as slug and the new name as new_slug. Fails if the new slug is already used. Returns the updated channel.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | The new slug when the channel is identified by public_id or current_slug. When new_slug is also sent without public_id, this is the current slug instead. Normalized like create_channel. | |
| new_slug | No | The new slug, when slug carries the current slug. Normalized like create_channel. | |
| public_id | No | Channel public_id from list_channels. Use with slug, which is then the new slug. | |
| current_slug | No | The channel's current slug. Use with slug, which is then the new slug. |
Output Schema
| Name | Required | Description |
|---|---|---|
| channel | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantive context beyond them: what is preserved (assigned users, devices, API key scopes), what breaks (scripts/SDK calls/agents targeting the old slug stop reaching the channel), and the failure condition (new slug already taken). This is exactly the kind of behavioral disclosure annotations cannot carry.
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?
Purpose is front-loaded, and each of the five sentences carries distinct information (scope, preservation, consequence, param patterns, failure, return). It is dense but not padded; slightly long, which keeps it from a 5.
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 destructive mutation with full annotation coverage and an output schema, the description supplies the caveats an agent needs before invoking: preservation of attachments, breakage of old-slug senders, the failure mode, and the two valid parameter shapes. Nothing material 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%, and the schema itself documents the convoluted dual-mode slug semantics. The description restates the two identification patterns ('public_id or current_slug ... as slug' vs. 'current slug as slug and new name as new_slug') without adding syntax or normalization detail beyond what the schema already provides, so the baseline 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 opens with a specific verb+resource ('Rename a channel by changing its slug') that immediately distinguishes it from siblings like rename_api_key, create_channel, or delete_channel. The exact mutation mechanics are stated, not implied.
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 clearly states when this applies and adds an explicit caution ('confirm with the user first') plus a concrete consequence for downstream senders. It does not name an alternative sibling (e.g., delete_channel vs. this rename), so it falls short of the explicit alternatives criterion for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_widget_metricUpdate Widget MetricADestructiveIdempotentInspect
Change an existing Lock Screen Widget metric's definition: key, label, format, currency, or unit. All definition fields are replaced, so send the current values (from list_widget_metrics) for anything you want to keep. To record a new value, use set_widget_metric_value instead. Side effects: a new key breaks scripts, SDK calls, and agents that still send values with the old key, and switching between the string format and a numeric format clears the latest value. Widgets show the change on their next refresh, about every 15 minutes. Fails if another metric already uses the key. Returns the updated metric.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Stable identifier that set_widget_metric_value, the REST API, and the SDKs use to send values. 1-64 lowercase letters, numbers, dots, underscores, or dashes, starting with a letter or number (uppercase is lowercased). Examples: mrr, deploy.success_rate. | |
| unit | No | Unit suffix for the unit format, up to 16 characters, such as ms, users, or GB. Ignored for other formats. | |
| label | Yes | Name shown on the widget, up to 80 characters. Examples: MRR, Deploy success. | |
| format | Yes | How the widget displays the value: number (1,234), currency (requires currency_code, shows $1,234), percent (send 99.9 to show 99.9%), unit (a number with a unit suffix, such as 120 ms), or string (text up to 64 characters). | |
| public_id | Yes | The metric's public_id, from list_widget_metrics or create_widget_metric. | |
| unit_spacing | No | For the unit format only: none shows 120ms, space shows 120 ms. Ignored for other formats. | none |
| currency_code | No | 3-letter ISO 4217 currency code, such as USD or EUR. Required when format is currency, ignored otherwise. |
Output Schema
| Name | Required | Description |
|---|---|---|
| metric | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive and idempotent, but the description goes well beyond them: full-replace semantics, the concrete breakage caused by a new key (scripts, SDK calls, agents), the latest-value purge when switching string/numeric formats, the ~15-minute refresh delay, and the duplicate-key failure. This is exactly the destructive-behavior context annotations cannot convey.
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?
Front-loads the operation, then the destructive mechanics, then routing, then side effects and failure modes. Every sentence carries distinct information with no padding.
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 destructive, multi-param mutation tool this is complete: it covers replace semantics, recovery via list_widget_metrics, sibling routing, side effects, timing, and failure conditions, and an output schema plus the closing 'Returns the updated metric' handles the return value.
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 cross-field semantics the schema does not: that required fields must carry current values or they are silently dropped, and that key changes break downstream consumers. It does not restate format/currency_code interlock details, which the schema already covers.
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 ('Change an existing Lock Screen Widget metric's definition') and enumerates the mutable fields (key, label, format, currency, unit). It explicitly names the sibling it is not (set_widget_metric_value) and distinguishes recording a value from editing the definition.
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 routes the agent: use set_widget_metric_value to record a value, and pull current values from list_widget_metrics before saving. It also states the pre-condition (all fields replaced) that determines whether the agent must first fetch existing state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_approvalWait for ApprovalARead-onlyIdempotentInspect
Wait up to 45 seconds for a pending approval without polling the database. The wait wakes immediately through Redis when the user acts. If the result remains pending, call this tool again with the same ID.
| Name | Required | Description | Default |
|---|---|---|---|
| approval_id | Yes | approval_id returned by request_approval. |
Output Schema
| Name | Required | Description |
|---|---|---|
| approval | Yes | |
| next_action | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses the 45-second cap, the immediate-wake mechanism ('wakes immediately through Redis when the user acts'), and the retry contract, all of which an agent needs to use a long-poll correctly. The retry guidance is consistent with idempotentHint=true.
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, front-loaded with the action and its bound, followed by the mechanism and the retry rule. No filler or restatement of the tool name.
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 blocking duration, wake behavior, and retry semantics, and an output schema exists so return values need not be explained. Nothing an agent needs in order to invoke this 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?
Schema coverage is 100% and the schema already explains that approval_id comes from request_approval. The description adds the operationally important detail that retries must reuse the same ID, which the schema does not convey. With only one well-documented parameter, this is a modest but real addition.
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+resource ('wait ... for a pending approval'), the exact bound ('up to 45 seconds'), and implicitly distinguishes itself from the polling sibling get_approval via 'without polling the database'. An agent can tell what this does and how it differs from the other approval 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?
It gives a clear usage context (waiting on a pending approval) and an explicit follow-up rule: 'If the result remains pending, call this tool again with the same ID.' It gestures at the alternative ('without polling the database') but never names get_approval or states when not to use this tool.
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.
34 tool updates
- First observed
cancel_approval - First observed
create_api_key - First observed
create_channel - First observed
create_widget_metric - First observed
delete_api_key - First observed
delete_channel - First observed
delete_widget_metric - First observed
end_live_activity_stream - First observed
get_approval - First observed
get_channel - First observed
get_live_activity - First observed
get_push_notification - First observed
list_account_devices - First observed
list_account_users - First observed
list_api_keys - First observed
list_channels - First observed
list_live_activities - First observed
list_push_notifications - First observed
list_tags - First observed
list_widget_metrics - First observed
pause_live_activity_stream - First observed
rename_api_key - First observed
replace_push_notification - First observed
request_approval - First observed
resume_live_activity_stream - First observed
send_push_notification - First observed
set_channel_devices - First observed
set_channel_users - First observed
set_live_activity_stream - First observed
set_widget_metric_value - First observed
update_app_icon_badge_count - First observed
update_channel - First observed
update_widget_metric - First observed
wait_for_approval
Publisher details
- Operator
- ActivitySmith · Publisher source
- Operator website
- https://activitysmith.com · Publisher source
- Vendor relationship
- First-party
- Documentation
- https://activitysmith.com/docs/mcp-server
- Trust center
- Not available
- Restrictions
- Requires an ActivitySmith account and the ActivitySmith app on iPhone or iPad. 7-day free trial, then a paid plan. · Publisher source
Related MCP Connectors
Push notifications for AI agents - send instant iPhone notifications from any MCP client.
Reach your own phone from an AI agent: notifications, approval questions, reminders, ring, files.
Give your AI agent a memory and body on your iPhone: set alarms, ring your phone, over MCP.
- 00WidgetOAuthcom.00widget
Publish status cards and Live Activities to iOS widgets, the Lock Screen, and the Dynamic Island.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI agents to push numbers and metrics to iPhone Home Screen, Lock Screen, and Live Activities widgets and read them back.5MIT

Alphornofficial
AlicenseNot gradedqualityBmaintenanceLet AI agents notify you on Slack, Telegram, email, SMS, or push via an Alphorn webhook.383 npmAGPL 3.0
Machinaofficial
FlicenseNot gradedqualityCmaintenanceAI's home on your Mac: gives AI agents remote access to iMessage, Notes, Reminders, Contacts, and more via MCP.1-- AlicenseAqualityCmaintenanceEnables AI assistants to send push notifications and interactive alerts to iPhone and Mac devices via the BotBell app. It allows AI to receive user replies and manage notification bots for tasks like alerts, reminders, and remote approvals.210 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.