Skip to main content
Glama
devhelmhq

DevHelm MCP Server

Official
by devhelmhq

create_monitor

Create a new uptime monitor for HTTP, DNS, TCP, ICMP, MCP, or heartbeat checks. Configure frequency, regions, assertions, and alert channels to detect downtime.

Instructions

Create a new uptime monitor.

Required fields: name, type (HTTP/DNS/TCP/ICMP/MCP/HEARTBEAT), config (type-specific), frequencySeconds (30-86400).

managedBy is set automatically to MCP server-side; callers cannot override it. Use the SDK or CLI directly if you need a different attribution.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bodyYes``CreateMonitorRequest`` with ``managed_by`` hidden from MCP callers. The MCP server *always* sets ``managedBy="MCP"`` on the API call so the dashboard can attribute the monitor to its real origin (an AI agent), rather than letting the LLM thread an arbitrary value through. This subclass: 1. Re-declares ``managed_by`` as optional (``default=None``) so a body that omits it passes Pydantic validation — the parent class makes the field required, which would force the LLM to set it. 2. Marks the field with ``exclude=True`` so any value the LLM does smuggle in via a permissive client never reaches ``model_dump()``. The server-side ``managedBy`` injection in :func:`create_monitor` is the only writer that survives the boundary. The field is also stripped from the JSON Schema FastMCP advertises (see ``server.py`` post-registration step), so well-behaved LLMs never see ``managedBy`` as a callable parameter at all.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed5 schema fields changedv1.7.0
    • changedInput schema / properties / body / properties / assertions / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "config": {
      -          "oneOf": [
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "substring": {
      -                  "description": "Substring that must appear in the response body",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "body_contains",
      -                  "default": "body_contains",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "substring"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "dns_expected_cname",
      -                  "default": "dns_expected_cname",
      -                  "type": "string"
      -                },
      -                "value": {
      -                  "description": "Expected CNAME target the resolution must include",
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "value"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "ips": {
      -                  "description": "Allowed IP addresses; at least one resolved address must match",
      -                  "items": {
      -                    "type": "string"
      -                  },
      -                  "minItems": 1,
      -                  "type": "array"
      -                },
      -                "type": {
      -                  "const": "dns_expected_ips",
      -                  "default": "dns_expected_ips",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "ips"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "max": {
      -                  "description": "Maximum number of answers allowed for that record type",
      -                  "type": "integer"
      -                },
      -                "recordType": {
      -                  "description": "DNS record type whose answer count is checked",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "dns_max_answers",
      -                  "default": "dns_max_answers",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "recordType",
      -                "max"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "min": {
      -                  "description": "Minimum number of answers required for that record type",
      -                  "type": "integer"
      -                },
      -                "recordType": {
      -                  "description": "DNS record type whose answer count is checked",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "dns_min_answers",
      -                  "default": "dns_min_answers",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "recordType",
      -                "min"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "recordType": {
      -                  "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "substring": {
      -                  "description": "Substring that must appear in a matching record value",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "dns_record_contains",
      -                  "default": "dns_record_contains",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "recordType",
      -                "substring"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "recordType": {
      -                  "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "dns_record_equals",
      -                  "default": "dns_record_equals",
      -                  "type": "string"
      -                },
      -                "value": {
      -                  "description": "Expected DNS record value for an exact match",
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "recordType",
      -                "value"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "dns_resolves",
      -                  "default": "dns_resolves",
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "maxMs": {
      -                  "description": "Maximum allowed DNS resolution time in milliseconds",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "dns_response_time",
      -                  "default": "dns_response_time",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "maxMs"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "dns_response_time_warn",
      -                  "default": "dns_response_time_warn",
      -                  "type": "string"
      -                },
      -                "warnMs": {
      -                  "description": "DNS resolution time in milliseconds that triggers a warning only",
      -                  "type": "integer"
      -                }
      -              },
      -              "required": [
      -                "warnMs"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "maxTtl": {
      -                  "description": "Maximum TTL in seconds before a high-TTL warning is raised",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "dns_ttl_high",
      -                  "default": "dns_ttl_high",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "maxTtl"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "minTtl": {
      -                  "description": "Minimum acceptable TTL in seconds before a warning is raised",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "dns_ttl_low",
      -                  "default": "dns_ttl_low",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "minTtl"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "substring": {
      -                  "description": "Substring that must appear in at least one TXT record",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "dns_txt_contains",
      -                  "default": "dns_txt_contains",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "substring"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "expected": {
      -                  "description": "Expected value to compare against",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "headerName": {
      -                  "description": "HTTP header name to assert on",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "operator": {
      -                  "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)",
      -                  "enum": [
      -                    "equals",
      -                    "contains",
      -                    "less_than",
      -                    "greater_than",
      -                    "matches",
      -                    "range"
      -                  ],
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "header_value",
      -                  "default": "header_value",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "headerName",
      -                "expected",
      -                "operator"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "maxDeviationPercent": {
      -                  "description": "Max percent drift from expected ping interval before warning (non-fatal)",
      -                  "maximum": 100,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "heartbeat_interval_drift",
      -                  "default": "heartbeat_interval_drift",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "maxDeviationPercent"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "maxSeconds": {
      -                  "description": "Maximum allowed gap in seconds between consecutive heartbeat pings",
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "heartbeat_max_interval",
      -                  "default": "heartbeat_max_interval",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "maxSeconds"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "path": {
      -                  "description": "JSONPath expression into the heartbeat ping JSON payload",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "heartbeat_payload_contains",
      -                  "default": "heartbeat_payload_contains",
      -                  "type": "string"
      -                },
      -                "value": {
      -                  "description": "Expected value to compare against at that path",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "path",
      -                "value"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "heartbeat_received",
      -                  "default": "heartbeat_received",
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "maxPercent": {
      -                  "description": "Maximum allowed packet loss percentage before the check fails (0–100)",
      -                  "maximum": 100,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                "type": {
      -                  "const": "icmp_packet_loss",
      -                  "default": "icmp_packet_loss",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "maxPercent"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "icmp_reachable",
      -                  "default": "icmp_reachable",
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "maxMs": {
      -                  "description": "Maximum average ICMP round-trip time in milliseconds",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "icmp_response_time",
      -                  "default": "icmp_response_time",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "maxMs"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "icmp_response_time_warn",
      -                  "default": "icmp_response_time_warn",
      -                  "type": "string"
      -                },
      -                "warnMs": {
      -                  "description": "ICMP round-trip time in milliseconds that triggers a warning only",
      -                  "type": "integer"
      -                }
      -              },
      -              "required": [
      -                "warnMs"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "expected": {
      -                  "description": "Expected value to compare against",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "operator": {
      -                  "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)",
      -                  "enum": [
      -                    "equals",
      -                    "contains",
      -                    "less_than",
      -                    "greater_than",
      -                    "matches",
      -                    "range"
      -                  ],
      -                  "type": "string"
      -                },
      -                "path": {
      -                  "description": "JSONPath expression to extract a value from the response body",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "json_path",
      -                  "default": "json_path",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "path",
      -                "expected",
      -                "operator"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "mcp_connects",
      -                  "default": "mcp_connects",
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "capability": {
      -                  "description": "Capability name the server must advertise, e.g. tools or resources",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "mcp_has_capability",
      -                  "default": "mcp_has_capability",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "capability"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "min": {
      -                  "description": "Minimum number of tools the server must expose",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "mcp_min_tools",
      -                  "default": "mcp_min_tools",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "min"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "mcp_protocol_version",
      -                  "default": "mcp_protocol_version",
      -                  "type": "string"
      -                },
      -                "version": {
      -                  "description": "Expected MCP protocol version string from the server handshake",
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "version"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "maxMs": {
      -                  "description": "Maximum allowed MCP check duration in milliseconds",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "mcp_response_time",
      -                  "default": "mcp_response_time",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "maxMs"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "mcp_response_time_warn",
      -                  "default": "mcp_response_time_warn",
      -                  "type": "string"
      -                },
      -                "warnMs": {
      -                  "description": "MCP check duration in milliseconds that triggers a warning only",
      -                  "type": "integer"
      -                }
      -              },
      -              "required": [
      -                "warnMs"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "toolName": {
      -                  "description": "MCP tool name that must appear in the server's tool list",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "mcp_tool_available",
      -                  "default": "mcp_tool_available",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "toolName"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "expectedCount": {
      -                  "description": "Expected tool count; warns when the live count differs",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "mcp_tool_count_changed",
      -                  "default": "mcp_tool_count_changed",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "expectedCount"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "maxCount": {
      -                  "description": "Maximum number of HTTP redirects allowed before the check fails",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "redirect_count",
      -                  "default": "redirect_count",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "maxCount"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "expected": {
      -                  "description": "Expected final URL after following redirects",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "operator": {
      -                  "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)",
      -                  "enum": [
      -                    "equals",
      -                    "contains",
      -                    "less_than",
      -                    "greater_than",
      -                    "matches",
      -                    "range"
      -                  ],
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "redirect_target",
      -                  "default": "redirect_target",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "expected",
      -                "operator"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "pattern": {
      -                  "description": "Regular expression the response body must match",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "regex_body",
      -                  "default": "regex_body",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "pattern"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "maxBytes": {
      -                  "description": "Maximum response body size in bytes before the check fails",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "response_size",
      -                  "default": "response_size",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "maxBytes"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "thresholdMs": {
      -                  "description": "Maximum allowed response time in milliseconds before the check fails",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "response_time",
      -                  "default": "response_time",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "thresholdMs"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "response_time_warn",
      -                  "default": "response_time_warn",
      -                  "type": "string"
      -                },
      -                "warnMs": {
      -                  "description": "HTTP response time in milliseconds that triggers a warning only",
      -                  "type": "integer"
      -                }
      -              },
      -              "required": [
      -                "warnMs"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "minDaysRemaining": {
      -                  "description": "Minimum days before TLS certificate expiry; fails or warns below this threshold",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "ssl_expiry",
      -                  "default": "ssl_expiry",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "minDaysRemaining"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "expected": {
      -                  "description": "Expected status code, range pattern, or wildcard such as 2xx",
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "operator": {
      -                  "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)",
      -                  "enum": [
      -                    "equals",
      -                    "contains",
      -                    "less_than",
      -                    "greater_than",
      -                    "matches",
      -                    "range"
      -                  ],
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "const": "status_code",
      -                  "default": "status_code",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "expected",
      -                "operator"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "tcp_connects",
      -                  "default": "tcp_connects",
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "maxMs": {
      -                  "description": "Maximum TCP connect time in milliseconds before the check fails",
      -                  "type": "integer"
      -                },
      -                "type": {
      -                  "const": "tcp_response_time",
      -                  "default": "tcp_response_time",
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "maxMs"
      -              ],
      -              "type": "object"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "type": {
      -                  "const": "tcp_response_time_warn",
      -                  "default": "tcp_response_time_warn",
      -                  "type": "string"
      -                },
      -                "warnMs": {
      -                  "description": "TCP connect time in milliseconds that triggers a warning only",
      -                  "type": "integer"
      -                }
      -              },
      -              "required": [
      -                "warnMs"
      -              ],
      -              "type": "object"
      -            }
      -          ]
      -        },
      -        "severity": {
      -          "anyOf": [
      -            {
      -              "enum": [
      -                "fail",
      -                "warn"
      -              ],
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "Outcome severity: FAIL (fails the check) or WARN (warns without failing, default: FAIL)"
      -        }
      -      },
      -      "required": [
      -        "config"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "config": {
      +          "oneOf": [
      +            {
      +              "properties": {
      +                "substring": {
      +                  "description": "Substring that must appear in the response body",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "body_contains",
      +                  "default": "body_contains",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "substring"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "dns_expected_cname",
      +                  "default": "dns_expected_cname",
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Expected CNAME target the resolution must include",
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "value"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "ips": {
      +                  "description": "Allowed IP addresses; at least one resolved address must match",
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "minItems": 1,
      +                  "type": "array"
      +                },
      +                "type": {
      +                  "const": "dns_expected_ips",
      +                  "default": "dns_expected_ips",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "ips"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "max": {
      +                  "description": "Maximum number of answers allowed for that record type",
      +                  "type": "integer"
      +                },
      +                "recordType": {
      +                  "description": "DNS record type whose answer count is checked",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "dns_max_answers",
      +                  "default": "dns_max_answers",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "recordType",
      +                "max"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "min": {
      +                  "description": "Minimum number of answers required for that record type",
      +                  "type": "integer"
      +                },
      +                "recordType": {
      +                  "description": "DNS record type whose answer count is checked",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "dns_min_answers",
      +                  "default": "dns_min_answers",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "recordType",
      +                "min"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "recordType": {
      +                  "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "substring": {
      +                  "description": "Substring that must appear in a matching record value",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "dns_record_contains",
      +                  "default": "dns_record_contains",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "recordType",
      +                "substring"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "recordType": {
      +                  "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "dns_record_equals",
      +                  "default": "dns_record_equals",
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Expected DNS record value for an exact match",
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "recordType",
      +                "value"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "dns_resolves",
      +                  "default": "dns_resolves",
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "maxMs": {
      +                  "description": "Maximum allowed DNS resolution time in milliseconds",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "dns_response_time",
      +                  "default": "dns_response_time",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "maxMs"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "dns_response_time_warn",
      +                  "default": "dns_response_time_warn",
      +                  "type": "string"
      +                },
      +                "warnMs": {
      +                  "description": "DNS resolution time in milliseconds that triggers a warning only",
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "warnMs"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "maxTtl": {
      +                  "description": "Maximum TTL in seconds before a high-TTL warning is raised",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "dns_ttl_high",
      +                  "default": "dns_ttl_high",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "maxTtl"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "minTtl": {
      +                  "description": "Minimum acceptable TTL in seconds before a warning is raised",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "dns_ttl_low",
      +                  "default": "dns_ttl_low",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "minTtl"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "substring": {
      +                  "description": "Substring that must appear in at least one TXT record",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "dns_txt_contains",
      +                  "default": "dns_txt_contains",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "substring"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "expected": {
      +                  "description": "Expected value to compare against",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "headerName": {
      +                  "description": "HTTP header name to assert on",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "operator": {
      +                  "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)",
      +                  "enum": [
      +                    "equals",
      +                    "contains",
      +                    "less_than",
      +                    "greater_than",
      +                    "matches",
      +                    "range"
      +                  ],
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "header_value",
      +                  "default": "header_value",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "headerName",
      +                "expected",
      +                "operator"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "maxDeviationPercent": {
      +                  "description": "Max percent drift from expected ping interval before warning (non-fatal)",
      +                  "maximum": 100,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "heartbeat_interval_drift",
      +                  "default": "heartbeat_interval_drift",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "maxDeviationPercent"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "maxSeconds": {
      +                  "description": "Maximum allowed gap in seconds between consecutive heartbeat pings",
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "heartbeat_max_interval",
      +                  "default": "heartbeat_max_interval",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "maxSeconds"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "path": {
      +                  "description": "JSONPath expression into the heartbeat ping JSON payload",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "heartbeat_payload_contains",
      +                  "default": "heartbeat_payload_contains",
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Expected value to compare against at that path",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "path",
      +                "value"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "heartbeat_received",
      +                  "default": "heartbeat_received",
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "maxPercent": {
      +                  "description": "Maximum allowed packet loss percentage before the check fails (0–100)",
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                "type": {
      +                  "const": "icmp_packet_loss",
      +                  "default": "icmp_packet_loss",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "maxPercent"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "icmp_reachable",
      +                  "default": "icmp_reachable",
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "maxMs": {
      +                  "description": "Maximum average ICMP round-trip time in milliseconds",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "icmp_response_time",
      +                  "default": "icmp_response_time",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "maxMs"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "icmp_response_time_warn",
      +                  "default": "icmp_response_time_warn",
      +                  "type": "string"
      +                },
      +                "warnMs": {
      +                  "description": "ICMP round-trip time in milliseconds that triggers a warning only",
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "warnMs"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "expected": {
      +                  "description": "Expected value to compare against",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "operator": {
      +                  "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)",
      +                  "enum": [
      +                    "equals",
      +                    "contains",
      +                    "less_than",
      +                    "greater_than",
      +                    "matches",
      +                    "range"
      +                  ],
      +                  "type": "string"
      +                },
      +                "path": {
      +                  "description": "JSONPath expression to extract a value from the response body",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "json_path",
      +                  "default": "json_path",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "path",
      +                "expected",
      +                "operator"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "mcp_connects",
      +                  "default": "mcp_connects",
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "capability": {
      +                  "description": "Capability name the server must advertise, e.g. tools or resources",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "mcp_has_capability",
      +                  "default": "mcp_has_capability",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "capability"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "min": {
      +                  "description": "Minimum number of tools the server must expose",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "mcp_min_tools",
      +                  "default": "mcp_min_tools",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "min"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "mcp_protocol_version",
      +                  "default": "mcp_protocol_version",
      +                  "type": "string"
      +                },
      +                "version": {
      +                  "description": "Expected MCP protocol version string from the server handshake",
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "version"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "maxMs": {
      +                  "description": "Maximum allowed MCP check duration in milliseconds",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "mcp_response_time",
      +                  "default": "mcp_response_time",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "maxMs"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "mcp_response_time_warn",
      +                  "default": "mcp_response_time_warn",
      +                  "type": "string"
      +                },
      +                "warnMs": {
      +                  "description": "MCP check duration in milliseconds that triggers a warning only",
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "warnMs"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "toolName": {
      +                  "description": "MCP tool name that must appear in the server's tool list",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "mcp_tool_available",
      +                  "default": "mcp_tool_available",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "toolName"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "expectedCount": {
      +                  "description": "Expected tool count; warns when the live count differs",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "mcp_tool_count_changed",
      +                  "default": "mcp_tool_count_changed",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "expectedCount"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "maxCount": {
      +                  "description": "Maximum number of HTTP redirects allowed before the check fails",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "redirect_count",
      +                  "default": "redirect_count",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "maxCount"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "expected": {
      +                  "description": "Expected final URL after following redirects",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "operator": {
      +                  "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)",
      +                  "enum": [
      +                    "equals",
      +                    "contains",
      +                    "less_than",
      +                    "greater_than",
      +                    "matches",
      +                    "range"
      +                  ],
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "redirect_target",
      +                  "default": "redirect_target",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "expected",
      +                "operator"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "pattern": {
      +                  "description": "Regular expression the response body must match",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "regex_body",
      +                  "default": "regex_body",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "pattern"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "maxBytes": {
      +                  "description": "Maximum response body size in bytes before the check fails",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "response_size",
      +                  "default": "response_size",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "maxBytes"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "thresholdMs": {
      +                  "description": "Maximum allowed response time in milliseconds before the check fails",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "response_time",
      +                  "default": "response_time",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "thresholdMs"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "response_time_warn",
      +                  "default": "response_time_warn",
      +                  "type": "string"
      +                },
      +                "warnMs": {
      +                  "description": "HTTP response time in milliseconds that triggers a warning only",
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "warnMs"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "minDaysRemaining": {
      +                  "description": "Minimum days before TLS certificate expiry; fails or warns below this threshold",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "ssl_expiry",
      +                  "default": "ssl_expiry",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "minDaysRemaining"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "expected": {
      +                  "description": "Expected status code, range pattern, or wildcard such as 2xx",
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "operator": {
      +                  "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)",
      +                  "enum": [
      +                    "equals",
      +                    "contains",
      +                    "less_than",
      +                    "greater_than",
      +                    "matches",
      +                    "range"
      +                  ],
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "const": "status_code",
      +                  "default": "status_code",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "expected",
      +                "operator"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "tcp_connects",
      +                  "default": "tcp_connects",
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "maxMs": {
      +                  "description": "Maximum TCP connect time in milliseconds before the check fails",
      +                  "type": "integer"
      +                },
      +                "type": {
      +                  "const": "tcp_response_time",
      +                  "default": "tcp_response_time",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "maxMs"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "properties": {
      +                "type": {
      +                  "const": "tcp_response_time_warn",
      +                  "default": "tcp_response_time_warn",
      +                  "type": "string"
      +                },
      +                "warnMs": {
      +                  "description": "TCP connect time in milliseconds that triggers a warning only",
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "warnMs"
      +              ],
      +              "type": "object"
      +            }
      +          ]
      +        },
      +        "severity": {
      +          "anyOf": [
      +            {
      +              "enum": [
      +                "fail",
      +                "warn"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "Outcome severity: FAIL (fails the check) or WARN (warns without failing, default: FAIL)"
      +        }
      +      },
      +      "required": [
      +        "config"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / body / properties / auth / anyOf
      Previous value: -[
      -  {
      -    "description": "New authentication configuration (full replacement)",
      -    "oneOf": [
      -      {
      -        "additionalProperties": false,
      -        "properties": {
      -          "type": {
      -            "const": "bearer",
      -            "default": "bearer",
      -            "type": "string"
      -          },
      -          "vaultSecretId": {
      -            "anyOf": [
      -              {
      -                "format": "uuid",
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "default": null,
      -            "description": "Vault secret ID holding the bearer token value"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      {
      -        "additionalProperties": false,
      -        "properties": {
      -          "type": {
      -            "const": "basic",
      -            "default": "basic",
      -            "type": "string"
      -          },
      -          "vaultSecretId": {
      -            "anyOf": [
      -              {
      -                "format": "uuid",
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "default": null,
      -            "description": "Vault secret ID holding Basic auth username and password"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      {
      -        "additionalProperties": false,
      -        "properties": {
      -          "headerName": {
      -            "description": "Custom HTTP header name for the secret value",
      -            "minLength": 1,
      -            "pattern": "^[A-Za-z0-9\\-_]+$",
      -            "type": "string"
      -          },
      -          "type": {
      -            "const": "header",
      -            "default": "header",
      -            "type": "string"
      -          },
      -          "vaultSecretId": {
      -            "anyOf": [
      -              {
      -                "format": "uuid",
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "default": null,
      -            "description": "Vault secret ID for the header value"
      -          }
      -        },
      -        "required": [
      -          "headerName"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "additionalProperties": false,
      -        "properties": {
      -          "headerName": {
      -            "description": "HTTP header name that carries the API key",
      -            "minLength": 1,
      -            "pattern": "^[A-Za-z0-9\\-_]+$",
      -            "type": "string"
      -          },
      -          "type": {
      -            "const": "api_key",
      -            "default": "api_key",
      -            "type": "string"
      -          },
      -          "vaultSecretId": {
      -            "anyOf": [
      -              {
      -                "format": "uuid",
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "default": null,
      -            "description": "Vault secret ID for the API key value"
      -          }
      -        },
      -        "required": [
      -          "headerName"
      -        ],
      -        "type": "object"
      -      }
      -    ]
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "New authentication configuration (full replacement)",
      +    "oneOf": [
      +      {
      +        "properties": {
      +          "type": {
      +            "const": "bearer",
      +            "default": "bearer",
      +            "type": "string"
      +          },
      +          "vaultSecretId": {
      +            "anyOf": [
      +              {
      +                "format": "uuid",
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "default": null,
      +            "description": "Vault secret ID holding the bearer token value"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "type": {
      +            "const": "basic",
      +            "default": "basic",
      +            "type": "string"
      +          },
      +          "vaultSecretId": {
      +            "anyOf": [
      +              {
      +                "format": "uuid",
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "default": null,
      +            "description": "Vault secret ID holding Basic auth username and password"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "headerName": {
      +            "description": "Custom HTTP header name for the secret value",
      +            "minLength": 1,
      +            "pattern": "^[A-Za-z0-9\\-_]+$",
      +            "type": "string"
      +          },
      +          "type": {
      +            "const": "header",
      +            "default": "header",
      +            "type": "string"
      +          },
      +          "vaultSecretId": {
      +            "anyOf": [
      +              {
      +                "format": "uuid",
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "default": null,
      +            "description": "Vault secret ID for the header value"
      +          }
      +        },
      +        "required": [
      +          "headerName"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "headerName": {
      +            "description": "HTTP header name that carries the API key",
      +            "minLength": 1,
      +            "pattern": "^[A-Za-z0-9\\-_]+$",
      +            "type": "string"
      +          },
      +          "type": {
      +            "const": "api_key",
      +            "default": "api_key",
      +            "type": "string"
      +          },
      +          "vaultSecretId": {
      +            "anyOf": [
      +              {
      +                "format": "uuid",
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "default": null,
      +            "description": "Vault secret ID for the API key value"
      +          }
      +        },
      +        "required": [
      +          "headerName"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / body / properties / config / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "hostname": {
      -        "description": "Domain name to resolve",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "nameservers": {
      -        "anyOf": [
      -          {
      -            "items": {
      -              "type": "string"
      -            },
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Custom nameservers to query (uses system defaults if omitted)"
      -      },
      -      "recordTypes": {
      -        "anyOf": [
      -          {
      -            "items": {
      -              "enum": [
      -                "A",
      -                "AAAA",
      -                "CNAME",
      -                "MX",
      -                "NS",
      -                "TXT",
      -                "SRV",
      -                "SOA",
      -                "CAA",
      -                "PTR"
      -              ],
      -              "type": "string"
      -            },
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR"
      -      },
      -      "timeoutMs": {
      -        "anyOf": [
      -          {
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Per-query timeout in milliseconds"
      -      },
      -      "totalTimeoutMs": {
      -        "anyOf": [
      -          {
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Total timeout for all queries in milliseconds"
      -      }
      -    },
      -    "required": [
      -      "hostname"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "expectedInterval": {
      -        "description": "Expected heartbeat interval in seconds",
      -        "maximum": 86400,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "gracePeriod": {
      -        "description": "Grace period in seconds before marking as down",
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "expectedInterval",
      -      "gracePeriod"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "contentType": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Content-Type header value for the request body"
      -      },
      -      "customHeaders": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": {
      -              "type": "string"
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Additional HTTP headers to include in requests"
      -      },
      -      "method": {
      -        "description": "HTTP method: GET, POST, PUT, PATCH, DELETE, or HEAD",
      -        "enum": [
      -          "GET",
      -          "POST",
      -          "PUT",
      -          "PATCH",
      -          "DELETE",
      -          "HEAD"
      -        ],
      -        "type": "string"
      -      },
      -      "requestBody": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Request body content for POST/PUT/PATCH methods"
      -      },
      -      "url": {
      -        "description": "Target URL to send requests to",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "verifyTls": {
      -        "anyOf": [
      -          {
      -            "type": "boolean"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Whether to verify TLS certificates (default: true)"
      -      }
      -    },
      -    "required": [
      -      "url",
      -      "method"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "host": {
      -        "description": "Target hostname or IP address to ping",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "packetCount": {
      -        "anyOf": [
      -          {
      -            "maximum": 20,
      -            "minimum": 1,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Number of ICMP packets to send"
      -      },
      -      "timeoutMs": {
      -        "anyOf": [
      -          {
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Ping timeout in milliseconds"
      -      }
      -    },
      -    "required": [
      -      "host"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "args": {
      -        "anyOf": [
      -          {
      -            "items": {
      -              "type": "string"
      -            },
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Command-line arguments for the MCP server process"
      -      },
      -      "command": {
      -        "description": "Command to execute to start the MCP server",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "env": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": {
      -              "type": "string"
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Environment variables to pass to the MCP server process"
      -      }
      -    },
      -    "required": [
      -      "command"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "host": {
      -        "description": "Target hostname or IP address",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "port": {
      -        "description": "TCP port to connect to",
      -        "maximum": 65535,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "timeoutMs": {
      -        "anyOf": [
      -          {
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Connection timeout in milliseconds"
      -      }
      -    },
      -    "required": [
      -      "host",
      -      "port"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "hostname": {
      +        "description": "Domain name to resolve",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "nameservers": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Custom nameservers to query (uses system defaults if omitted)"
      +      },
      +      "recordTypes": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "enum": [
      +                "A",
      +                "AAAA",
      +                "CNAME",
      +                "MX",
      +                "NS",
      +                "TXT",
      +                "SRV",
      +                "SOA",
      +                "CAA",
      +                "PTR"
      +              ],
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR"
      +      },
      +      "timeoutMs": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Per-query timeout in milliseconds"
      +      },
      +      "totalTimeoutMs": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Total timeout for all queries in milliseconds"
      +      }
      +    },
      +    "required": [
      +      "hostname"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "expectedInterval": {
      +        "description": "Expected heartbeat interval in seconds",
      +        "maximum": 86400,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "gracePeriod": {
      +        "description": "Grace period in seconds before marking as down",
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "expectedInterval",
      +      "gracePeriod"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "contentType": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Content-Type header value for the request body"
      +      },
      +      "customHeaders": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": {
      +              "type": "string"
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Additional HTTP headers to include in requests"
      +      },
      +      "method": {
      +        "description": "HTTP method: GET, POST, PUT, PATCH, DELETE, or HEAD",
      +        "enum": [
      +          "GET",
      +          "POST",
      +          "PUT",
      +          "PATCH",
      +          "DELETE",
      +          "HEAD"
      +        ],
      +        "type": "string"
      +      },
      +      "requestBody": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Request body content for POST/PUT/PATCH methods"
      +      },
      +      "url": {
      +        "description": "Target URL to send requests to",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "verifyTls": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Whether to verify TLS certificates (default: true)"
      +      }
      +    },
      +    "required": [
      +      "url",
      +      "method"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "host": {
      +        "description": "Target hostname or IP address to ping",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "packetCount": {
      +        "anyOf": [
      +          {
      +            "maximum": 20,
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Number of ICMP packets to send"
      +      },
      +      "timeoutMs": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Ping timeout in milliseconds"
      +      }
      +    },
      +    "required": [
      +      "host"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "args": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Command-line arguments for the MCP server process"
      +      },
      +      "command": {
      +        "description": "Command to execute to start the MCP server",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "env": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": {
      +              "type": "string"
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Environment variables to pass to the MCP server process"
      +      }
      +    },
      +    "required": [
      +      "command"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "script": {
      +        "description": "Playwright test script source code",
      +        "maxLength": 65536,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "timeoutSeconds": {
      +        "anyOf": [
      +          {
      +            "maximum": 120,
      +            "minimum": 5,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Maximum execution time in seconds (5–120)"
      +      }
      +    },
      +    "required": [
      +      "script"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "host": {
      +        "description": "Target hostname or IP address",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "port": {
      +        "description": "TCP port to connect to",
      +        "maximum": 65535,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "timeoutMs": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Connection timeout in milliseconds"
      +      }
      +    },
      +    "required": [
      +      "host",
      +      "port"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / body / properties / incidentPolicy / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "confirmation": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "maxWaitSeconds": {
      -            "description": "Maximum seconds to wait for enough regions to fail after first trigger",
      -            "type": "integer"
      -          },
      -          "minRegionsFailing": {
      -            "description": "Minimum failing regions required to confirm an incident",
      -            "type": "integer"
      -          },
      -          "type": {
      -            "const": "multi_region",
      -            "default": "multi_region",
      -            "description": "How incident confirmation is coordinated across regions",
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "minRegionsFailing",
      -          "maxWaitSeconds"
      -        ],
      -        "type": "object"
      -      },
      -      "recovery": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "consecutiveSuccesses": {
      -            "description": "Consecutive passing checks required to auto-resolve the incident",
      -            "type": "integer"
      -          },
      -          "cooldownMinutes": {
      -            "description": "Minutes after resolve before a new incident may open on the same monitor",
      -            "type": "integer"
      -          },
      -          "minRegionsPassing": {
      -            "description": "Minimum regions that must be passing before recovery can complete",
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "consecutiveSuccesses",
      -          "minRegionsPassing",
      -          "cooldownMinutes"
      -        ],
      -        "type": "object"
      -      },
      -      "triggerRules": {
      -        "description": "Array of trigger rules; at least one required",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "aggregationType": {
      -              "anyOf": [
      -                {
      -                  "enum": [
      -                    "all_exceed",
      -                    "average",
      -                    "p95",
      -                    "max"
      -                  ],
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null,
      -              "description": "How response times are aggregated for response-time rules"
      -            },
      -            "count": {
      -              "anyOf": [
      -                {
      -                  "type": "integer"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null,
      -              "description": "Failure count for consecutive or windowed failure rules"
      -            },
      -            "scope": {
      -              "description": "Whether the rule applies per region or across regions",
      -              "enum": [
      -                "per_region",
      -                "any_region"
      -              ],
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Incident severity when this rule fires",
      -              "enum": [
      -                "down",
      -                "degraded"
      -              ],
      -              "type": "string"
      -            },
      -            "thresholdMs": {
      -              "anyOf": [
      -                {
      -                  "type": "integer"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null,
      -              "description": "Response time threshold in milliseconds for response-time rules"
      -            },
      -            "type": {
      -              "description": "Condition that opens or escalates an incident from check results",
      -              "enum": [
      -                "consecutive_failures",
      -                "failures_in_window",
      -                "response_time"
      -              ],
      -              "type": "string"
      -            },
      -            "windowMinutes": {
      -              "anyOf": [
      -                {
      -                  "type": "integer"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null,
      -              "description": "Window length in minutes for failures-in-window rules"
      -            }
      -          },
      -          "required": [
      -            "type",
      -            "scope",
      -            "severity"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "triggerRules",
      -      "confirmation",
      -      "recovery"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "confirmation": {
      +        "properties": {
      +          "maxWaitSeconds": {
      +            "description": "Maximum seconds to wait for enough regions to fail after first trigger",
      +            "type": "integer"
      +          },
      +          "minRegionsFailing": {
      +            "description": "Minimum failing regions required to confirm an incident",
      +            "type": "integer"
      +          },
      +          "type": {
      +            "const": "multi_region",
      +            "default": "multi_region",
      +            "description": "How incident confirmation is coordinated across regions",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "minRegionsFailing",
      +          "maxWaitSeconds"
      +        ],
      +        "type": "object"
      +      },
      +      "recovery": {
      +        "properties": {
      +          "consecutiveSuccesses": {
      +            "description": "Consecutive passing checks required to auto-resolve the incident",
      +            "type": "integer"
      +          },
      +          "cooldownMinutes": {
      +            "description": "Minutes after resolve before a new incident may open on the same monitor",
      +            "type": "integer"
      +          },
      +          "minRegionsPassing": {
      +            "description": "Minimum regions that must be passing before recovery can complete",
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "consecutiveSuccesses",
      +          "minRegionsPassing",
      +          "cooldownMinutes"
      +        ],
      +        "type": "object"
      +      },
      +      "triggerRules": {
      +        "description": "Array of trigger rules; at least one required",
      +        "items": {
      +          "properties": {
      +            "aggregationType": {
      +              "anyOf": [
      +                {
      +                  "enum": [
      +                    "all_exceed",
      +                    "average",
      +                    "p95",
      +                    "max"
      +                  ],
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null,
      +              "description": "How response times are aggregated for response-time rules"
      +            },
      +            "count": {
      +              "anyOf": [
      +                {
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null,
      +              "description": "Failure count for consecutive or windowed failure rules"
      +            },
      +            "scope": {
      +              "description": "Whether the rule applies per region or across regions",
      +              "enum": [
      +                "per_region",
      +                "any_region"
      +              ],
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Incident severity when this rule fires",
      +              "enum": [
      +                "down",
      +                "degraded"
      +              ],
      +              "type": "string"
      +            },
      +            "thresholdMs": {
      +              "anyOf": [
      +                {
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null,
      +              "description": "Response time threshold in milliseconds for response-time rules"
      +            },
      +            "type": {
      +              "description": "Condition that opens or escalates an incident from check results",
      +              "enum": [
      +                "consecutive_failures",
      +                "failures_in_window",
      +                "response_time"
      +              ],
      +              "type": "string"
      +            },
      +            "windowMinutes": {
      +              "anyOf": [
      +                {
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null,
      +              "description": "Window length in minutes for failures-in-window rules"
      +            }
      +          },
      +          "required": [
      +            "type",
      +            "scope",
      +            "severity"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "triggerRules",
      +      "confirmation",
      +      "recovery"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / body / properties / type / enum
      Previous value: -[
      -  "HTTP",
      -  "DNS",
      -  "MCP_SERVER",
      -  "TCP",
      -  "ICMP",
      -  "HEARTBEAT"
      -]New value: +[
      +  "HTTP",
      +  "DNS",
      +  "MCP_SERVER",
      +  "TCP",
      +  "ICMP",
      +  "HEARTBEAT",
      +  "BROWSER",
      +  "MULTI_STEP_API"
      +]
  2. First observedv1.0.2

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden, and it does the most important job: it reveals that managedBy is silently forced to 'MCP' server-side and cannot be overridden, plus it names the escape hatch (SDK/CLI). This is genuinely non-obvious behavior an agent must know before calling. It stops short of mentioning other side effects (e.g., a new monitor begins checking immediately), but the override disclosure is the critical trait.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short lines, front-loaded with the primary purpose, then required fields, then the behavioral caveat. Every sentence earns its place and nothing is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is extremely complex (8 monitor types, dozens of assertion variants, incident policies, auth configs), but the input schema carries that weight with 100% parameter coverage and an output schema exists. The description adds the essential managedBy context. However, its inaccurate type enum and erroneous 'required' claim for frequencySeconds leave an agent with an incomplete and partly wrong mental model of valid inputs, which is a meaningful gap for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description introduces active misinformation that the schema contradicts: frequencySeconds is listed as required although the schema marks it optional with a null default, the stated range (30-86400) conflicts with the schema's 10-86400, and the type list (HTTP/DNS/TCP/ICMP/MCP/HEARTBEAT) omits BROWSER and MULTI_STEP_API while using 'MCP' instead of the schema's 'MCP_SERVER' enum value. All three errors could cause a failed or invalid call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource pair ('Create a new uptime monitor'), which cleanly distinguishes it from the monitor siblings (update_monitor, delete_monitor, pause_monitor, list_monitors, get_monitor). The required-fields summary reinforces the scope and tells the agent exactly what creating a monitor entails.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a useful prerequisite checklist (name, type, config, frequencySeconds) and one explicit when-not: use the SDK or CLI directly if a different managedBy attribution is needed. However, it offers no guidance on the more common decision points—when to create versus update an existing monitor, or being able to use test_monitor first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/devhelmhq/mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server