Tickstem
The Tickstem MCP server lets AI assistants manage cron jobs, uptime monitoring, heartbeat monitoring, and email verification.
Cron Job Management
List, get, register, update, pause, resume, and delete cron jobs
View execution history (status, duration, HTTP status code, errors)
Uptime Monitoring
Create, list, get, pause, resume, and delete monitors for HTTP/HTTPS endpoints
Support custom response assertions (status code, response time, body content)
View recent check history (up/down/timeout, duration, SSL expiry)
Heartbeat Monitoring (Dead-Man's Switch)
Create, list, get, update, pause, resume, and delete heartbeat monitors that alert if expected pings stop arriving
Ping a heartbeat to signal a successful job run (no API key needed, just a token)
View recent ping history
Email Verification
Verify email addresses by checking syntax, MX records, disposable domain lists, and role-based prefixes (e.g. admin@, support@)
List past verification results with pagination
tickstem/mcp
MCP server for Tickstem — exposes cron job scheduling, uptime monitoring, heartbeat monitoring, and email verification as native tools for AI coding assistants (Claude, Cursor, Copilot, and any MCP-compatible agent).
Let your AI assistant register cron jobs, create uptime monitors with response assertions, manage heartbeat monitors, verify email addresses, and query results — while you write the app code.
Install
Download a pre-built binary (no Go required):
Platform | Binary |
macOS (Apple Silicon) |
|
macOS (Intel) |
|
Linux (x86-64) |
|
Linux (ARM64) |
|
Windows (x86-64) |
|
Download from Releases, make executable, and place on your PATH:
# macOS / Linux example
chmod +x tsk-mcp-darwin-arm64
mv tsk-mcp-darwin-arm64 /usr/local/bin/tsk-mcpOr install with Go:
go install github.com/tickstem/mcp/cmd/tsk-mcp@latestRelated MCP server: @loggydev/mcp-server
Quick start
export TICKSTEM_API_KEY=tsk_your_key_here
tsk-mcpThe server speaks the Model Context Protocol over stdio — connect it to any MCP-compatible client.
Claude Code
Add to your ~/.claude/claude_desktop_config.json (or equivalent):
{
"mcpServers": {
"tickstem": {
"command": "tsk-mcp",
"env": {
"TICKSTEM_API_KEY": "tsk_your_key_here"
}
}
}
}Available tools
Cron jobs
Tool | Description |
| List all cron jobs in the account |
| Get a cron job by ID |
| Register a new cron job (name, schedule, endpoint) |
| Update an existing job — only provided fields change |
| Pause a job so it no longer fires |
| Resume a paused or failing job |
| Permanently delete a job and its execution history |
| List execution history for a job, most recent first |
Uptime monitoring
Tool | Description |
| List all monitors — status, URL, interval, SSL expiry, assertions |
| Create a monitor with optional response assertions (status code, response time, body) |
| Get a monitor by ID |
| Pause a monitor so it stops polling |
| Resume a paused monitor |
| Permanently delete a monitor and its check history |
| List recent checks — status, HTTP code, duration, error, SSL expiry |
Response assertions
create_monitor accepts an assertions parameter — a JSON array of conditions that must all pass for a check to be considered up. When assertions are set they replace the default 2xx/3xx logic.
[
{ "source": "status_code", "comparison": "eq", "target": "200" },
{ "source": "response_time", "comparison": "lt", "target": "2000" },
{ "source": "body", "comparison": "contains", "target": "\"status\":\"ok\"" }
]Source | Valid comparisons | Target |
|
| integer string |
|
| integer string (ms) |
|
| plain string |
Heartbeat monitoring
Tool | Description |
| List all heartbeats — status, token, interval, grace window, last ping time |
| Create a heartbeat monitor (dead-man's switch) |
| Get a heartbeat by ID |
| Update name, interval, or grace window |
| Suppress alerts during planned downtime |
| Resume alerting after a pause |
| Permanently delete a heartbeat and its ping history |
| Record a successful job run — no API key needed, token is the credential |
| List recent pings for a heartbeat, most recent first |
Email verification
Tool | Description |
| Check syntax, MX records, disposable domain, and role-based prefix |
| List past verification results for the account |
Environment variables
Variable | Required | Description |
| Yes | API key from app.tickstem.dev |
| No | Override API base URL (e.g. |
Local development
export TICKSTEM_API_KEY=tsk_your_key_here
export TICKSTEM_BASE_URL=http://localhost:8080/v1
go run ./cmd/tsk-mcpSDKs
The MCP server handles infrastructure management from your AI assistant. For application code, use the SDK that matches your language:
Language | Install | Docs |
Python |
| |
Go (cron) |
| |
Go (uptime) |
| |
Go (heartbeat) |
| |
Go (verify) |
| |
Node.js |
|
All SDKs use the same API key.
Get an API key
app.tickstem.dev — free tier includes 1,000 cron executions, 5 uptime monitors, 5 heartbeat monitors, and 500 email verifications per month.
License
MIT
Available Tools
26 toolscreate_heartbeatADestructive
Create a heartbeat monitor (dead-man's switch). Your job should POST to the returned ping URL after each successful run. If the ping stops arriving within the interval + grace window, Tickstem sends an alert.
| Name | Required | Description | Default |
|---|---|---|---|
| grace_secs | No | Buffer after the deadline before alerting (0–86400, default 300) | |
| interval_secs | No | Expected ping interval in seconds (60–86400, default 3600) | |
| name | Yes | Human-readable label for the heartbeat |
Output Schema
| Name | Required | Description |
|---|---|---|
| created_at | Yes | |
| grace_secs | Yes | |
| id | Yes | |
| interval_secs | Yes | |
| last_pinged_at | Yes | |
| name | Yes | |
| next_expected_at | Yes | |
| status | Yes | |
| token | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true and no readOnly, consistent with creation. The description adds behavioral context: it creates a resource that expects periodic pings and triggers alerts. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. The purpose is front-loaded, and the mechanism is explained succinctly.
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 an output schema exists, return values are not needed. The description covers creation, usage pattern, and alerting behavior. It is complete for a create tool, though it could mention constraints like name uniqueness.
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?
All three parameters are described in the schema (100% coverage). The description mentions the ping URL but does not add parameter-specific semantics beyond the schema. According to guidelines, baseline is 3 when coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a heartbeat monitor (dead-man's switch) and explains its mechanism (POST to ping URL, alert on missed pings). This distinguishes it from sibling tools like 'create_monitor' which likely creates a different type of monitor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage instructions: 'Your job should POST to the returned ping URL after each successful run.' It explains when alerts are sent. However, it does not explicitly mention when not to use this tool or compare to alternatives like 'create_monitor'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_monitorADestructive
Create an uptime monitor that polls an HTTP/HTTPS endpoint on a schedule and alerts on failure. Supports response assertions to validate that the response is correct — not just that the server responded. Assertions use source (status_code, response_time, body) + comparison (eq, ne, lt, lte, gt, gte, contains, not_contains) + target. When assertions are set they replace the default 2xx/3xx success logic. For HTTPS endpoints, SSL certificate expiry is captured automatically and an alert is sent 30 days before expiry. Pass assertions as a JSON string, e.g.: [{"source":"status_code","comparison":"eq","target":"200"},{"source":"body","comparison":"contains","target":""status":"ok""}]
| Name | Required | Description | Default |
|---|---|---|---|
| assertions | No | Optional JSON array of assertion objects. Each must have source, comparison, and target fields. Sources: status_code, response_time, body. Numeric comparisons (status_code, response_time): eq, ne, lt, lte, gt, gte — target must be an integer string. Body comparisons: eq, ne, contains, not_contains — target is a plain string. | |
| interval_secs | No | Check interval in seconds (60–86400). Free plan minimum is 300s, paid plans 60s. Defaults to 60. | |
| name | Yes | Human-readable label for the monitor | |
| timeout_secs | No | Request timeout in seconds (5–30, default 10) | |
| url | Yes | HTTP or HTTPS URL to check |
Output Schema
| Name | Required | Description |
|---|---|---|
| assertions | Yes | |
| created_at | Yes | |
| id | Yes | |
| interval_secs | Yes | |
| name | Yes | |
| next_check_at | No | |
| ssl_expires_at | No | |
| status | Yes | |
| timeout_secs | Yes | |
| updated_at | Yes | |
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavioral details beyond the annotations: assertions replace default success logic, SSL expiry captures 30 days before expiry. Annotations are present (destructiveHint=true, readOnlyHint=false), and the description does not contradict them. It does not mention rate limits or other constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but well-structured, starting with the main purpose, then detailing assertions, then SSL. It could be more concise, but it contains no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and 100% parameter coverage, the description provides sufficient context for an agent to understand when to use this tool, what parameters are needed, and key behaviors (assertions, SSL alerts). It is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by providing an example JSON string for assertions, specifying numeric ranges for interval and timeout, and clarifying default values. This goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Create an uptime monitor that polls an HTTP/HTTPS endpoint on a schedule and alerts on failure.' It uses a specific verb ('Create') and resource ('uptime monitor'), and distinguishes from sibling tools like create_heartbeat and delete_monitor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use assertions and the default success logic without assertions. It also mentions SSL expiry alerting. However, it does not explicitly state when not to use this tool or what prerequisites are required (e.g., authentication).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_heartbeatADestructive
Permanently delete a heartbeat monitor and all its ping history. This cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| heartbeat_id | Yes | The heartbeat ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, but description adds value by stating 'permanently delete' and 'cannot be undone', emphasizing irreversibility. No contradiction with 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?
Two sentences clearly conveying purpose and consequence. Front-loaded with essential information, no extraneous text.
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?
Despite simplicity, description covers the irreversible nature and scope of deletion. Output schema exists and need not be described. Adequate for a straightforward delete 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% for the single parameter (heartbeat_id), and description does not add further meaning beyond the schema. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool permanently deletes a heartbeat monitor and its ping history, using specific verb and resource. It distinguishes from siblings like delete_monitor or pause_heartbeat by specifying the exact resource affected.
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?
No guidance on when to use this tool versus alternatives like delete_monitor or pause_heartbeat. No mention of prerequisites or conditions that would make this tool appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_jobADestructive
Permanently delete a cron job and its execution history
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the annotations by specifying 'permanently' and 'execution history', reinforcing the destructive nature. The annotations already set destructiveHint=true, so the description provides additional context without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 7 words, front-loading the key action and resource. Every word earns its place with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, destructive action, with output schema), the description covers the action, scope (including execution history), and is fully adequate for agent understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes job_id as 'The job ID' with 100% coverage. The description does not add further meaning about the parameter format or source, so it meets the baseline but does not improve it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'permanently delete' and the resource 'cron job and its execution history', which is specific and distinguishes it from sibling tools like create_job or update_job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (to delete a job) but provides no explicit guidance on alternatives or exclusions. It is adequate but lacks explicit context for when not to use this tool versus other deletion tools for different resources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_monitorADestructive
Permanently delete an uptime monitor and all its check history. This cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | The monitor ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set destructiveHint=true, but the description adds specific details: deletion includes the monitor and its entire check history, and it cannot be undone. This goes beyond the annotation's binary flag to provide concrete behavioral insights.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loading the critical action and consequence. Every word is necessary, and no redundancy exists. It is optimally concise for communicating the tool's essence.
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 parameter set (one required field) and the presence of an output schema, the description fully covers the tool's behavior: destruction scope and irreversibility. No additional context is needed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters, with 'monitor_id' described as 'The monitor ID'. The description does not add any further meaning or usage context for the parameter, so it meets the baseline without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Permanently delete' and the resource 'uptime monitor and all its check history'. It distinguishes from sibling tools like delete_heartbeat and delete_job by specifying the resource type, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for permanent removal but lacks explicit guidance on when to use this tool versus alternatives such as pause_monitor or list_monitors. The irreversibility warning is helpful but does not fully address usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_heartbeatBDestructive
Get a single heartbeat monitor by ID. Returns its status, ping token, interval, grace window, and last pinged time.
| Name | Required | Description | Default |
|---|---|---|---|
| heartbeat_id | Yes | The heartbeat ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| created_at | Yes | |
| grace_secs | Yes | |
| id | Yes | |
| interval_secs | Yes | |
| last_pinged_at | Yes | |
| name | Yes | |
| next_expected_at | Yes | |
| status | Yes | |
| token | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states a read operation ('Get'), but annotations mark destructiveHint=true, which is a direct contradiction. The description does not address this inconsistency or disclose any behavioral traits beyond the simple get.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that immediately states the core purpose and return values, making it extremely concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although the description mentions return fields and an output schema exists, the contradiction between the description (read) and annotations (destructive) creates a major gap. The description fails to clarify the actual behavior, making it incomplete for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds no parameter details beyond what is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves a single heartbeat monitor by ID and lists specific return fields. This distinguishes it from sibling tools like list_heartbeats (multiple) and update_heartbeat (modification).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use: when you need a specific heartbeat monitor by ID. However, it does not explicitly state when not to use or mention alternatives like list_heartbeats for multiple monitors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jobBDestructive
Get a cron job by ID
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| created_at | Yes | |
| description | No | |
| endpoint | Yes | |
| id | Yes | |
| method | Yes | |
| name | Yes | |
| next_run_at | No | |
| schedule | Yes | |
| status | Yes | |
| timeout_secs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'Get' which implies a read operation, but annotations set destructiveHint: true, contradicting the description. This is a clear annotation contradiction, severely misleading an agent. No additional behavioral context is provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no filler, achieving high efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 parameter, output schema exists), the description is minimally adequate but fails to address the annotation contradiction or provide usage context, leaving gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with one parameter (job_id) having a description. The description adds no extra meaning beyond the schema, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the verb 'Get' and specifies the resource 'cron job by ID', clearly indicating the tool retrieves a single cron job. It distinguishes from siblings like list_jobs (which lists all jobs) and create/delete/update tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a specific job by ID, but provides no guidance on when to use this tool versus alternatives like list_jobs or monitor retrieval tools. No exclusions or context are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_monitorBDestructive
Get a single uptime monitor by ID. Returns current status, SSL expiry date, assertion rules, and next scheduled check time.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | The monitor ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| assertions | Yes | |
| created_at | Yes | |
| id | Yes | |
| interval_secs | Yes | |
| name | Yes | |
| next_check_at | No | |
| ssl_expires_at | No | |
| status | Yes | |
| timeout_secs | Yes | |
| updated_at | Yes | |
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description indicates a read operation ('Get'), but annotations show destructiveHint=true and readOnlyHint=false, creating a contradiction. No additional behavioral context is provided beyond the misleading annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence of 17 words, front-loaded with purpose, no unnecessary 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?
Specifies return fields (status, SSL expiry, assertion rules, next check), which compensates for the output schema not being shown. However, the annotation contradiction undermines overall completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with a clear description for monitor_id. The description adds no additional meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'Get' and resource 'single uptime monitor by ID'. Lists specific return fields (current status, SSL expiry, etc.), differentiating from sibling tools like create_monitor or get_heartbeat.
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?
No guidance on when to use this tool versus alternatives such as list_monitors or get_heartbeat. No prerequisites or exclusions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_executionsBDestructive
List execution history for a cron job, most recent first
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| executions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description indicates a read operation ('list'), but annotations set `destructiveHint: true` and `readOnlyHint: false`, creating a contradiction. No additional behavioral context is provided.
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?
A single, front-loaded sentence with no extraneous information, perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one parameter and an output schema, the description covers the basic purpose but lacks any usage or behavioral context, especially relevant given the contradictory annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description does not need to add parameter details. It adds no meaning beyond the schema, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('list'), the resource ('execution history'), and the scope ('for a cron job'), with ordering implied ('most recent first'). It effectively distinguishes from sibling tools like list_jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_heartbeat_pingsBDestructive
List recent pings for a heartbeat monitor, most recent first.
| Name | Required | Description | Default |
|---|---|---|---|
| heartbeat_id | Yes | The heartbeat ID | |
| limit | No | Number of results to return (1–100, default 50) |
Output Schema
| Name | Required | Description |
|---|---|---|
| pings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description contradicts annotations: it describes a read-only listing operation, but annotations indicate readOnlyHint=false and destructiveHint=true. This is a serious inconsistency that could mislead an agent about side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence efficiently conveys the purpose and ordering with no unnecessary words. It is perfectly concise for a tool of this simplicity.
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?
While the purpose and parameters are clear, the contradictory annotations and lack of behavioral context (e.g., no mention of side effects despite destructiveHint=true) leave significant gaps. The presence of an output schema helps, but the overall completeness is compromised by the annotation contradiction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters with clear descriptions. The description adds the ordering hint 'most recent first', which is not in the schema, providing additional useful context beyond the structured metadata.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('list'), the resource ('recent pings for a heartbeat monitor'), and the ordering ('most recent first'), distinguishing it from sibling tools like get_heartbeat or list_heartbeats.
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?
No guidance is provided on when to use this tool versus alternatives such as ping_heartbeat or get_heartbeat. The description only states what it does, not when it is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_heartbeatsBDestructive
List all heartbeat monitors in the account. Each heartbeat has a token used for pinging and a status: active, paused, or failing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| heartbeats | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations set destructiveHint=true, contradicting the 'list' verb which implies read-only. Description does not clarify any side effects, so agent cannot trust whether this tool mutates state.
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, concise, front-loaded with action and resource. Every sentence adds meaningful 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?
Description covers purpose and output fields but lacks details on ordering, pagination, or side effects. With destructiveHint true, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; schema coverage is 100% automatically. Description adds value by mentioning status field in output, though output schema likely documents this.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists all heartbeat monitors and specifies key attributes (token, status). Distinguishes from sibling list tools like list_monitors.
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?
No guidance on when to use this tool versus alternatives (e.g., get_heartbeat for a single monitor, ping_heartbeat for pinging). No exclusions or preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jobsADestructive
List all cron jobs in the account
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'List all cron jobs', implying a read-only operation, but annotations mark 'destructiveHint: true', which contradicts that implication. This contradiction reduces transparency, and the description does not address the discrepancy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no extraneous words. It is maximally concise while conveying the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no parameters and an output schema, so this brief description is sufficient for a simple list operation. The scope 'in the account' is clear, and no additional context is needed despite the annotation contradiction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, and the schema is 100% covered. The description adds no parameter information, which is acceptable since none exist. Baseline for 0 parameters is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List', the resource 'cron jobs', and the scope 'in the account'. It distinguishes from siblings like 'get_job' (single job) and 'list_executions' (execution history), leaving no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as 'get_job' for a specific job or 'list_executions' for job runs. The description lacks any when-to-use or when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_monitor_checksADestructive
List recent check results for an uptime monitor, most recent first. Each check includes: status (up/down/timeout), HTTP status code, response time in ms, error message, SSL certificate expiry date, and timestamp. Use this to diagnose failures or verify that a monitor is healthy.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return (1–100, default 50) | |
| monitor_id | Yes | The monitor ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'List recent check results' implying a read-only operation, conflicting with annotations: readOnlyHint=false and destructiveHint=true. This is a serious contradiction, severely undermining transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the main action and ordering, followed by a concise list of included fields and usage context. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While an output schema exists (reducing need to describe return values), the description contradicts annotations, creating a major gap in understanding the tool's actual behavior (read vs destructive). This incomplete context hurts completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the baseline is 3. The description adds value by explaining the returned fields (status, HTTP code, response time, etc.), which clarifies what the parameters (limit, monitor_id) control beyond the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists recent check results for an uptime monitor, with ordering (most recent first). It distinguishes from siblings like 'list_monitors' (lists monitors) and 'list_jobs' (lists jobs), as it specifically deals with check results for a given monitor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use it to diagnose failures or verify health, providing clear when-to-use guidance. It does not mention alternatives or when not to use, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_monitorsADestructive
List all uptime monitors in the account. Returns each monitor's status (active/paused/failing), URL, check interval, SSL expiry date, and assertion rules.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| monitors | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description says 'list' (read operation) but annotations set destructiveHint=true, which contradicts the read nature. No additional behavioral context provided beyond fundamental purpose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words, efficiently conveying purpose and return data.
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?
Adequate for a simple list tool with output schema; however, fails to address the annotation contradiction or clarify idempotency, slightly reducing completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, schema coverage is 100%, and description correctly implies no parameters are needed. No additional param info 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?
Description clearly states the tool lists all uptime monitors in the account and specifies the returned fields (status, URL, check interval, SSL expiry, assertion rules), distinguishing it from sibling list tools like list_monitor_checks.
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?
No explicit guidance on when to use this tool vs alternatives like get_monitor or list_monitor_checks; usage is implied but not clarified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_verify_historyCDestructive
List past email verification results for the account
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return (1-100, default 20) | |
| offset | No | Offset for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| offset | Yes | |
| verifications | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims a read-like operation ('list'), but annotations indicate destructiveHint=true and readOnlyHint=false, suggesting potential destructive effects. This contradiction is severe and undermines agent decision-making.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with no wasted words. Perfectly concise.
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?
Despite having an output schema, the annotation contradiction creates a major gap. The description fails to explain why destructiveHint is true, nor gives enough context about the results beyond the 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 already covers both parameters (limit, offset) with descriptions, so the description adds no extra 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?
The description clearly states it lists past email verification results, which is a specific verb+resource. It distinguishes from the sibling 'verify_email' (which triggers verification) but could be more precise about the result details.
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?
No guidance on when to use this tool versus alternatives like 'verify_email' or other list tools. No context about prerequisites or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_heartbeatADestructive
Pause a heartbeat monitor. Alerts are suppressed while paused — useful during planned downtime or deployments.
| Name | Required | Description | Default |
|---|---|---|---|
| heartbeat_id | Yes | The heartbeat ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| created_at | Yes | |
| grace_secs | Yes | |
| id | Yes | |
| interval_secs | Yes | |
| last_pinged_at | Yes | |
| name | Yes | |
| next_expected_at | Yes | |
| status | Yes | |
| token | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds value beyond annotations by explaining that alerts are suppressed while paused. This behavioral detail complements the destructiveHint annotation. No contradiction with 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?
Extremely concise (two sentences, 14 words) and front-loaded with the core purpose. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter and the presence of output schema, the description is complete. It explains what the tool does, why it's useful, and implies reversibility via sibling 'resume_heartbeat'.
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 parameter 'heartbeat_id' is self-descriptive. Description does not add additional semantic meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (pause), resource (heartbeat), and effect (alerts suppressed). The verb 'pause' distinguishes it from siblings like 'resume_heartbeat' or 'delete_heartbeat'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides specific context for usage: 'useful during planned downtime or deployments.' However, it does not explicitly state when not to use or mention alternatives like 'resume_heartbeat'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_jobADestructive
Pause a cron job so it no longer fires
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| created_at | Yes | |
| description | No | |
| endpoint | Yes | |
| id | Yes | |
| method | Yes | |
| name | Yes | |
| next_run_at | No | |
| schedule | Yes | |
| status | Yes | |
| timeout_secs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true. Description adds 'no longer fires' but doesn't discuss reversibility or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single concise sentence (9 words) that immediately states purpose. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple tool with one parameter and output schema. Could mention return value or that it can be resumed.
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?
Single parameter job_id is fully described in schema. Description adds no extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb (pause), resource (cron job), and effect (no longer fires). Differentiates from siblings like pause_heartbeat and pause_monitor.
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?
No explicit when-to-use or when-not-to-use guidance. Implies usage context but does not mention alternatives like delete_job or resume_job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_monitorADestructive
Pause an uptime monitor so it stops polling. No alerts will fire while paused. Use resume_monitor to restart.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | The monitor ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| assertions | Yes | |
| created_at | Yes | |
| id | Yes | |
| interval_secs | Yes | |
| name | Yes | |
| next_check_at | No | |
| ssl_expires_at | No | |
| status | Yes | |
| timeout_secs | Yes | |
| updated_at | Yes | |
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that no alerts will fire while paused and polling stops, adding context beyond annotations. Consistent with destructiveHint=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?
Two sentences, no redundant information, front-loaded with action verb. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool is simple with one parameter. Description covers effect and complementary tool. Output schema exists, so return values need no explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage, so baseline is 3. Description does not add extra meaning beyond the parameter name and schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool pauses an uptime monitor, stops polling, and prevents alerts. Distinguishes from sibling tools like resume_monitor.
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 mentions use resume_monitor to restart, providing clear guidance on complementary action. Could be improved by specifying when not to use, but sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ping_heartbeatBDestructive
Ping a heartbeat to signal a successful job run. The token is the credential — no API key needed. Call this at the end of each successful execution.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | The heartbeat ping token (returned when the heartbeat was created) |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description indicates a non-destructive signaling action, but the annotation destructiveHint=true contradicts this behavior. The description fails to resolve this inconsistency or add further behavioral context. No discussion of side effects, auth details beyond token, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words, front-loaded with the purpose and usage instruction. Highly concise and clear.
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?
Despite having an output schema (not shown), the description lacks mention of return values or errors. The contradiction between description and annotations undermines completeness. For a simple tool, the description could suffice, but the contradiction is a critical gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with a clear description for the only parameter 'token'. The description adds that it is a credential, but this is already implied in the schema's description. Baseline score of 3 applies as schema does most of 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 clearly states the action ('Ping a heartbeat'), the resource ('heartbeat'), and the purpose ('signal a successful job run'). It effectively distinguishes from sibling tools like create_heartbeat or delete_heartbeat. The mention that the token is the credential adds clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call this at the end of each successful execution,' which provides clear when-to-use guidance. It also notes that the token is the credential and no API key is needed, but does not explicitly mention when not to use or compare with alternatives. Still, this is sufficient for context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_jobBDestructive
Register a new cron job
| Name | Required | Description | Default |
|---|---|---|---|
| description | No | Optional human-readable note | |
| endpoint | Yes | URL that will be called on each execution | |
| method | No | HTTP method (GET, POST, PUT, PATCH, DELETE). Defaults to POST | |
| name | Yes | Human-readable label for the job | |
| schedule | Yes | Standard 5-field cron expression, e.g. "0 9 * * 1-5" | |
| timeout_secs | No | Request timeout in seconds (1-300). Defaults to 30 |
Output Schema
| Name | Required | Description |
|---|---|---|
| created_at | Yes | |
| description | No | |
| endpoint | Yes | |
| id | Yes | |
| method | Yes | |
| name | Yes | |
| next_run_at | No | |
| schedule | Yes | |
| status | Yes | |
| timeout_secs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose behavioral traits beyond annotations. Annotations already indicate destructiveHint=true, but the description adds no context about side effects, permissions, or irreversible actions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no fluff, front-loaded with purpose. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive operation with 6 parameters and an output schema, the description lacks behavioral context such as what it returns, prerequisites, or side effects beyond the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are well-documented in the schema. The description adds no additional meaning beyond what the schema provides, meeting the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Register a new cron job' uses a specific verb ('register') and specific resource ('cron job'), clearly distinguishing it from sibling tools like create_heartbeat or create_monitor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, no exclusions, and no context about prerequisites or scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_heartbeatADestructive
Resume a paused heartbeat monitor. Alerting restarts immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| heartbeat_id | Yes | The heartbeat ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| created_at | Yes | |
| grace_secs | Yes | |
| id | Yes | |
| interval_secs | Yes | |
| last_pinged_at | Yes | |
| name | Yes | |
| next_expected_at | Yes | |
| status | Yes | |
| token | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that alerting restarts immediately, which supplements the annotations (destructiveHint=true indicates a state change). However, it does not elaborate on safety, idempotency, or reversible effects beyond what annotations already 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?
Two concise sentences, front-loaded with the action and immediate effect. No redundant or extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core purpose and effect, but given the presence of multiple sibling tools, it would benefit from indicating prerequisites (e.g., heartbeat must be paused) or alternative approaches. The output schema is present but not used in the description.
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 parameter description is standard. The tool description adds no additional meaning or usage tips for the heartbeat_id parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the action (resume), the target resource (paused heartbeat monitor), and adds the immediate effect (alerting restarts). It distinctly contrasts with peers like pause_heartbeat and resume_monitor.
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?
Usage context is implied (when a heartbeat is paused), but no explicit instructions are given about alternatives, preconditions (e.g., heartbeat must be paused), or 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.
resume_jobADestructive
Resume a paused or failing cron job
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| created_at | Yes | |
| description | No | |
| endpoint | Yes | |
| id | Yes | |
| method | Yes | |
| name | Yes | |
| next_run_at | No | |
| schedule | Yes | |
| status | Yes | |
| timeout_secs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, indicating a mutation. The description adds that it works on paused or failing jobs, but lacks details on side effects (e.g., immediate execution triggering).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no redundant information, perfectly sized for quick comprehension.
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?
While the tool is simple with one parameter and an output schema exists, the description could elaborate on post-resume behavior or prerequisites given the destructive annotation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers 100% of parameters with a description for job_id. The tool description adds no additional meaning beyond what the schema provides, achieving baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Resume') and the specific resource ('paused or failing cron job'), making it unambiguous and distinct from siblings like pause_job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context on when to use the tool (for paused or failing jobs), but does not mention when not to use it or suggest alternatives like update_job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_monitorADestructive
Resume a paused uptime monitor. Polling and alerting restart immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | The monitor ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| assertions | Yes | |
| created_at | Yes | |
| id | Yes | |
| interval_secs | Yes | |
| name | Yes | |
| next_check_at | No | |
| ssl_expires_at | No | |
| status | Yes | |
| timeout_secs | Yes | |
| updated_at | Yes | |
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide destructiveHint=true and idempotentHint=false. The description adds valuable behavioral detail: 'Polling and alerting restart immediately.' This goes beyond the annotations to clarify the effect of resuming.
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 short sentences, front-loaded with the action and outcome. Every word adds value; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple resume operation with one parameter and an output schema, the description fully covers the purpose, outcome, and immediate effect. No additional context is necessary.
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%; the one parameter 'monitor_id' has a description 'The monitor ID'. The description does not add further meaning, but given high coverage, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Begins with 'Resume a paused uptime monitor', clearly specifying verb and resource. The phrase 'uptime monitor' effectively distinguishes it from sibling resume tools for heartbeats and jobs, as seen 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 description implies use only for paused monitors, but does not explicitly state when not to use (e.g., if monitor is already running) or mention alternative actions. No comparison with siblings like pause_monitor or resume_heartbeat is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_heartbeatADestructive
Update a heartbeat's name, interval, or grace window. Only provided fields are changed.
| Name | Required | Description | Default |
|---|---|---|---|
| grace_secs | No | New grace window in seconds (0–86400) | |
| heartbeat_id | Yes | The heartbeat ID | |
| interval_secs | No | New expected ping interval in seconds (60–86400) | |
| name | No | New human-readable label |
Output Schema
| Name | Required | Description |
|---|---|---|
| created_at | Yes | |
| grace_secs | Yes | |
| id | Yes | |
| interval_secs | Yes | |
| last_pinged_at | Yes | |
| name | Yes | |
| next_expected_at | Yes | |
| status | Yes | |
| token | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint: true. The description adds the partial update behavior but does not disclose additional traits like existence requirements or potential side effects beyond what annotations 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?
The description is a single sentence that directly conveys the tool's purpose and behavior. No extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for a simple update tool given the presence of an output schema and annotations. It could mention that the heartbeat must exist, but overall it provides the essential context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for each parameter. The description does not add significant new meaning beyond the schema; it only reiterates that only provided fields are changed. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Update' and the resource 'heartbeat', specifying the fields that can be updated (name, interval, grace window). It distinguishes itself from sibling tools like create_heartbeat and delete_heartbeat.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states 'Only provided fields are changed', indicating partial update semantics. While it doesn't mention when not to use this tool or alternatives, the context (siblings with create/delete) is clear enough for an agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_jobADestructive
Update an existing cron job. Only provided fields are changed
| Name | Required | Description | Default |
|---|---|---|---|
| description | No | New description | |
| endpoint | No | New endpoint URL | |
| job_id | Yes | The job ID | |
| method | No | New HTTP method | |
| name | No | New name for the job | |
| schedule | No | New cron schedule | |
| timeout_secs | No | New timeout in seconds |
Output Schema
| Name | Required | Description |
|---|---|---|
| created_at | Yes | |
| description | No | |
| endpoint | Yes | |
| id | Yes | |
| method | Yes | |
| name | Yes | |
| next_run_at | No | |
| schedule | Yes | |
| status | Yes | |
| timeout_secs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds transparency about partial updates ('only provided fields are changed') beyond annotations. Annotations already indicate destructiveHint: true, and description does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single concise sentence, front-loaded with key information, no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% schema coverage and output schema present, the description is adequate. All required context (job_id needed, partial update) is provided. Could mention that only job_id is required, but schema covers that.
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 fully documents parameters. The description adds no new semantic meaning beyond the schema, meeting baseline level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'update', resource 'existing cron job', and behavior 'only provided fields are changed'. Distinguishes from sibling tools like create_job, delete_job, etc.
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?
Describes what the tool does but provides no explicit guidance on when to use it versus alternatives (e.g., create_job for new jobs, delete_job for removal). Usage is implied but not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_emailADestructive
Verify an email address: checks syntax, MX records, disposable domain list, and role-based prefixes
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address to verify |
Output Schema
| Name | Required | Description |
|---|---|---|
| created_at | Yes | |
| disposable | Yes | |
| Yes | ||
| id | Yes | |
| mx_found | Yes | |
| reason | Yes | |
| role_based | Yes | |
| user_id | Yes | |
| valid | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations include 'destructiveHint: true', suggesting the tool might have side effects, but the description describes only read-like checks (syntax, MX records, etc.), which are typically non-destructive. This creates a contradiction between the description and the annotation. The description does not clarify the nature of the destruction or any other behavioral traits beyond what annotations already 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 description is a single, concise sentence that efficiently communicates the tool's purpose and the checks it performs. It is front-loaded and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter and the presence of an output schema (not shown but noted in context), the description is fairly complete. It explains what the tool does and the checks involved. However, it could be slightly more complete by noting that it is a read-heavy operation despite the destructive hint, to resolve the annotation mismatch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the single parameter 'email' with a clear description. The description adds value beyond the schema by listing the specific checks performed (syntax, MX records, disposable domain, role-based prefixes), which helps the agent understand what the verification entails.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: verifying an email address by checking syntax, MX records, disposable domain lists, and role-based prefixes. It uses a specific verb ('verify') and resource ('email address'), and it distinguishes itself from sibling tools, which are all related to monitoring and heartbeats, not email verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides the basic context of what the tool does (email verification) but does not explicitly state when to use it vs. alternatives. Among siblings, there are no other email verification tools, so the usage is implied, but the lack of explicit guidance on prerequisites or when not to use it keeps the score at a 3.
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.
26 tool updates
v1.8.1- Changed
create_heartbeat1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "grace_secs": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "interval_secs": { + "type": "integer" + }, + "last_pinged_at": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": "string" + }, + "next_expected_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "token": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "token", + "interval_secs", + "grace_secs", + "status", + "last_pinged_at", + "next_expected_at", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
create_monitor1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "assertions": { + "items": { + "additionalProperties": false, + "properties": { + "comparison": { + "type": "string" + }, + "source": { + "type": "string" + }, + "target": { + "type": "string" + } + }, + "required": [ + "source", + "comparison", + "target" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "created_at": { + "type": "string" + }, + "id": { + "type": "string" + }, + "interval_secs": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "next_check_at": { + "type": [ + "null", + "string" + ] + }, + "ssl_expires_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "timeout_secs": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "url", + "interval_secs", + "timeout_secs", + "status", + "assertions", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
delete_heartbeat1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + } + }, + "required": [ + "message" + ], + "type": "object" +}
- Changed
delete_job1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + } + }, + "required": [ + "message" + ], + "type": "object" +}
- Changed
delete_monitor1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + } + }, + "required": [ + "message" + ], + "type": "object" +}
- Changed
get_heartbeat1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "grace_secs": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "interval_secs": { + "type": "integer" + }, + "last_pinged_at": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": "string" + }, + "next_expected_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "token": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "token", + "interval_secs", + "grace_secs", + "status", + "last_pinged_at", + "next_expected_at", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
get_job1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "description": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "id": { + "type": "string" + }, + "method": { + "type": "string" + }, + "name": { + "type": "string" + }, + "next_run_at": { + "type": [ + "null", + "string" + ] + }, + "schedule": { + "type": "string" + }, + "status": { + "type": "string" + }, + "timeout_secs": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "schedule", + "endpoint", + "method", + "timeout_secs", + "status", + "created_at" + ], + "type": "object" +}
- Changed
get_monitor1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "assertions": { + "items": { + "additionalProperties": false, + "properties": { + "comparison": { + "type": "string" + }, + "source": { + "type": "string" + }, + "target": { + "type": "string" + } + }, + "required": [ + "source", + "comparison", + "target" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "created_at": { + "type": "string" + }, + "id": { + "type": "string" + }, + "interval_secs": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "next_check_at": { + "type": [ + "null", + "string" + ] + }, + "ssl_expires_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "timeout_secs": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "url", + "interval_secs", + "timeout_secs", + "status", + "assertions", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
list_executions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "executions": { + "items": { + "additionalProperties": false, + "properties": { + "duration_ms": { + "type": [ + "null", + "integer" + ] + }, + "error": { + "type": "string" + }, + "finished_at": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "scheduled_at": { + "type": "string" + }, + "started_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "status_code": { + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "id", + "job_id", + "status", + "scheduled_at" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "executions" + ], + "type": "object" +}
- Changed
list_heartbeat_pings1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "pings": { + "items": { + "additionalProperties": false, + "properties": { + "heartbeat_id": { + "type": "string" + }, + "id": { + "type": "string" + }, + "pinged_at": { + "type": "string" + } + }, + "required": [ + "id", + "heartbeat_id", + "pinged_at" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "pings" + ], + "type": "object" +}
- Changed
list_heartbeats1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "heartbeats": { + "items": { + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "grace_secs": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "interval_secs": { + "type": "integer" + }, + "last_pinged_at": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": "string" + }, + "next_expected_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "token": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "token", + "interval_secs", + "grace_secs", + "status", + "last_pinged_at", + "next_expected_at", + "created_at", + "updated_at" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "heartbeats" + ], + "type": "object" +}
- Changed
list_jobs1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "jobs": { + "items": { + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "description": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "id": { + "type": "string" + }, + "method": { + "type": "string" + }, + "name": { + "type": "string" + }, + "next_run_at": { + "type": [ + "null", + "string" + ] + }, + "schedule": { + "type": "string" + }, + "status": { + "type": "string" + }, + "timeout_secs": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "schedule", + "endpoint", + "method", + "timeout_secs", + "status", + "created_at" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "jobs" + ], + "type": "object" +}
- Changed
list_monitor_checks1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "checked_at": { + "type": "string" + }, + "duration_ms": { + "type": "integer" + }, + "error": { + "type": "string" + }, + "id": { + "type": "string" + }, + "monitor_id": { + "type": "string" + }, + "ssl_expires_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "status_code": { + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "id", + "monitor_id", + "status", + "duration_ms", + "checked_at" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "checks" + ], + "type": "object" +}
- Changed
list_monitors1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "monitors": { + "items": { + "additionalProperties": false, + "properties": { + "assertions": { + "items": { + "additionalProperties": false, + "properties": { + "comparison": { + "type": "string" + }, + "source": { + "type": "string" + }, + "target": { + "type": "string" + } + }, + "required": [ + "source", + "comparison", + "target" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "created_at": { + "type": "string" + }, + "id": { + "type": "string" + }, + "interval_secs": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "next_check_at": { + "type": [ + "null", + "string" + ] + }, + "ssl_expires_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "timeout_secs": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "url", + "interval_secs", + "timeout_secs", + "status", + "assertions", + "created_at", + "updated_at" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "monitors" + ], + "type": "object" +}
- Changed
list_verify_history1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "limit": { + "type": "integer" + }, + "offset": { + "type": "integer" + }, + "verifications": { + "items": { + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "disposable": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "id": { + "type": "string" + }, + "mx_found": { + "type": "boolean" + }, + "reason": { + "type": "string" + }, + "role_based": { + "type": "boolean" + }, + "user_id": { + "type": "string" + }, + "valid": { + "type": "boolean" + } + }, + "required": [ + "id", + "user_id", + "email", + "valid", + "mx_found", + "disposable", + "role_based", + "reason", + "created_at" + ], + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "verifications", + "limit", + "offset" + ], + "type": "object" +}
- Changed
pause_heartbeat1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "grace_secs": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "interval_secs": { + "type": "integer" + }, + "last_pinged_at": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": "string" + }, + "next_expected_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "token": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "token", + "interval_secs", + "grace_secs", + "status", + "last_pinged_at", + "next_expected_at", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
pause_job1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "description": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "id": { + "type": "string" + }, + "method": { + "type": "string" + }, + "name": { + "type": "string" + }, + "next_run_at": { + "type": [ + "null", + "string" + ] + }, + "schedule": { + "type": "string" + }, + "status": { + "type": "string" + }, + "timeout_secs": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "schedule", + "endpoint", + "method", + "timeout_secs", + "status", + "created_at" + ], + "type": "object" +}
- Changed
pause_monitor1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "assertions": { + "items": { + "additionalProperties": false, + "properties": { + "comparison": { + "type": "string" + }, + "source": { + "type": "string" + }, + "target": { + "type": "string" + } + }, + "required": [ + "source", + "comparison", + "target" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "created_at": { + "type": "string" + }, + "id": { + "type": "string" + }, + "interval_secs": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "next_check_at": { + "type": [ + "null", + "string" + ] + }, + "ssl_expires_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "timeout_secs": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "url", + "interval_secs", + "timeout_secs", + "status", + "assertions", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
ping_heartbeat1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + } + }, + "required": [ + "message" + ], + "type": "object" +}
- Changed
register_job1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "description": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "id": { + "type": "string" + }, + "method": { + "type": "string" + }, + "name": { + "type": "string" + }, + "next_run_at": { + "type": [ + "null", + "string" + ] + }, + "schedule": { + "type": "string" + }, + "status": { + "type": "string" + }, + "timeout_secs": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "schedule", + "endpoint", + "method", + "timeout_secs", + "status", + "created_at" + ], + "type": "object" +}
- Changed
resume_heartbeat1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "grace_secs": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "interval_secs": { + "type": "integer" + }, + "last_pinged_at": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": "string" + }, + "next_expected_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "token": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "token", + "interval_secs", + "grace_secs", + "status", + "last_pinged_at", + "next_expected_at", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
resume_job1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "description": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "id": { + "type": "string" + }, + "method": { + "type": "string" + }, + "name": { + "type": "string" + }, + "next_run_at": { + "type": [ + "null", + "string" + ] + }, + "schedule": { + "type": "string" + }, + "status": { + "type": "string" + }, + "timeout_secs": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "schedule", + "endpoint", + "method", + "timeout_secs", + "status", + "created_at" + ], + "type": "object" +}
- Changed
resume_monitor1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "assertions": { + "items": { + "additionalProperties": false, + "properties": { + "comparison": { + "type": "string" + }, + "source": { + "type": "string" + }, + "target": { + "type": "string" + } + }, + "required": [ + "source", + "comparison", + "target" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "created_at": { + "type": "string" + }, + "id": { + "type": "string" + }, + "interval_secs": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "next_check_at": { + "type": [ + "null", + "string" + ] + }, + "ssl_expires_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "timeout_secs": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "url", + "interval_secs", + "timeout_secs", + "status", + "assertions", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
update_heartbeat1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "grace_secs": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "interval_secs": { + "type": "integer" + }, + "last_pinged_at": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": "string" + }, + "next_expected_at": { + "type": [ + "null", + "string" + ] + }, + "status": { + "type": "string" + }, + "token": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "token", + "interval_secs", + "grace_secs", + "status", + "last_pinged_at", + "next_expected_at", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
update_job1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "description": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "id": { + "type": "string" + }, + "method": { + "type": "string" + }, + "name": { + "type": "string" + }, + "next_run_at": { + "type": [ + "null", + "string" + ] + }, + "schedule": { + "type": "string" + }, + "status": { + "type": "string" + }, + "timeout_secs": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "schedule", + "endpoint", + "method", + "timeout_secs", + "status", + "created_at" + ], + "type": "object" +}
- Changed
verify_email1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "disposable": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "id": { + "type": "string" + }, + "mx_found": { + "type": "boolean" + }, + "reason": { + "type": "string" + }, + "role_based": { + "type": "boolean" + }, + "user_id": { + "type": "string" + }, + "valid": { + "type": "boolean" + } + }, + "required": [ + "id", + "user_id", + "email", + "valid", + "mx_found", + "disposable", + "role_based", + "reason", + "created_at" + ], + "type": "object" +}
26 tool updates
v1.0.0- First observed
create_heartbeat - First observed
create_monitor - First observed
delete_heartbeat - First observed
delete_job - First observed
delete_monitor - First observed
get_heartbeat - First observed
get_job - First observed
get_monitor - First observed
list_executions - First observed
list_heartbeat_pings - First observed
list_heartbeats - First observed
list_jobs - First observed
list_monitor_checks - First observed
list_monitors - First observed
list_verify_history - First observed
pause_heartbeat - First observed
pause_job - First observed
pause_monitor - First observed
ping_heartbeat - First observed
register_job - First observed
resume_heartbeat - First observed
resume_job - First observed
resume_monitor - First observed
update_heartbeat - First observed
update_job - First observed
verify_email
TDQS
Scored across 26 tools
Each tool is clearly namespaced by resource type (heartbeat, monitor, job, email) and action, so there is no real overlap between create_heartbeat, create_monitor, and register_job. The descriptions for similar lifecycle actions like pause_heartbeat, pause_monitor, and pause_job make their distinct targets obvious.
The vast majority of tools follow a consistent verb_noun pattern with standard verbs like create, get, list, update, delete, pause, resume, and delete. Minor deviations include register_job instead of create_job and list_verify_history not matching the verify_email naming pattern.
26 tools is on the high side, but the server covers four distinct domains: uptime monitors, heartbeats, cron jobs, and email verification. Each tool has a clear purpose, so the count feels slightly over the ideal range rather than bloated or redundant.
Heartbeat and cron job tooling is essentially complete, with full CRUD plus lifecycle operations. However, uptime monitors lack an update_monitor tool, so changing a monitor's URL, interval, or assertions requires deleting and recreating it, which loses history.
Maintenance
Related MCP Connectors
MCP server for e-mail testing: create disposable inboxes, wait for delivery, and extract e-mail content or links - all from your AI agent or test automation workflow. Get a free API key on https://app.zyntra.app/
Build, validate, deploy — HTTP APIs, cron jobs, webhooks and MCP tools — from your AI client.
Shipmail MCP server for AI agent custom-domain email inboxes with REST API and webhooks.
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Related MCP Servers
- AlicenseAqualityDmaintenanceA Model Context Protocol (MCP) server that connects AI assistants to your TickTick tasks, enabling task management through natural language.81MIT
- FlicenseBqualityDmaintenanceMCP server for Loggy that enables AI coding assistants to manage heartbeats, status pages, uptime monitors, feature flags, and logs via natural language.15-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that connects AI assistants to TickTick, enabling project and task management through natural language, including reading projects, finding tasks, creating tasks, and completing work.2MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for integrating TickTick task management with AI applications, enabling task and project operations via natural language.8 npmMIT