Skip to main content
Glama

Create monitor

create_monitor

Create a monitor for an http, tcp, ping, dns, tls_cert, domain_expiry, heartbeat or manual check. A manual monitor has nothing to probe; set its state afterwards with set_monitor_state. The check is run once before anything is saved and the result is shown to the user along with every setting it would apply; where the client can show a prompt, nothing is created unless they approve; otherwise the monitor is created on the token's scope and the trial result comes back with it. Bind it to alerts as you create it: pass channel_ids from list_notification_channels (this needs the channels:read scope), and if the org has no channel yet, say so rather than leaving a monitor that pages nobody. Leave regions unset unless the user named where they want the check to run from — omitted, it probes from the operator's default set, which is already the intended coverage; naming more regions than the plan allows is refused outright. Request headers and a request body can be set, but a credential must be referenced rather than pasted: write Bearer {{ my_key }} and call list_variables for the keys this org has. A URL carrying a username or password is refused, and browser flows cannot be created here — add those in the app. Not read-only.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameYesWhat the operator will see in lists and alerts.
tagsNoAt most 50, each at most 50 characters.
checkYes
regionsNoProbe regions to run the check from, as ids from `list_regions`. Omit unless the user named the places they want covered: omitting takes the regions `list_regions` flags `default_selected`, which is the coverage the operator chose, capped at the plan's region cap and falling back to the control plane's own region when nothing is flagged. A vantage point can be offered without being on by default, so the full catalog is not the thorough answer. Rejected for a heartbeat, which is pinged rather than probed, and a set larger than a `max_regions` `list_regions` reports is refused outright, not trimmed to fit.
group_nameNoOperator-side grouping label.
channel_idsNoChannel ids from `list_notification_channels` to alert. Omitting them creates a monitor that pages nobody, which is worth saying out loud rather than leaving for an outage to reveal. The channels themselves are set up in the app, since they hold the tokens and addresses.
interval_secsNoSeconds between checks, held to the plan's floor and the check kind's own floor. Omit it to get the cadence the app's own picker opens this kind at, which is well above the hard minimum for the slow-moving kinds: a certificate is checked twice a day, a domain registration daily.
region_policyNoDetection quorum across probe regions.
notify_recoveryNoWhether recovery is announced. Defaults to true.
alert_confirmationsNoConsecutive failing checks before the monitor alerts. Minimum 1, defaults to 2.
recovery_period_secsNoSeconds a recovered monitor must stay healthy before its incident closes; a failure confirmed inside the window keeps the incident open, so a flapping service reads as one outage. 0 to 1800; 0 closes on the confirming checks alone. Defaults to 180 on an HTTP, TCP, ping, DNS or flow monitor and 0 on the rest. Not for a manual monitor.
renotify_interval_secsNoSeconds before the first reminder while an outage stays unacknowledged; each further reminder waits twice as long, up to a day. 0 turns reminders off; otherwise at least 60. Defaults to 3600.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYes
nameYes
probeNoThe trial run's outcome, which the operator saw before approving. Absent for a heartbeat, which has nothing to probe.
alertsYesThe channels this monitor will alert, by name, or `nobody` when nothing reaches it. One covered by a channel's tag rule rather than a binding is marked `by tag`. A channel that cannot deliver says so here.
addressYesWhat the check watches, as stored.
regionsYesProbe regions the monitor was assigned, which is the operator's default set when `regions` was omitted. Empty for a heartbeat.
interval_secsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / recovery_period_secs
      Added value: +{
      +  "description": "Seconds a recovered monitor must stay healthy before its incident\ncloses; a failure confirmed inside the window keeps the incident open,\nso a flapping service reads as one outage. 0 to 1800; 0 closes on the\nconfirming checks alone. Defaults to 180 on an HTTP, TCP, ping, DNS or\nflow monitor and 0 on the rest. Not for a manual monitor.",
      +  "format": "uint32",
      +  "minimum": 0,
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
  2. Changed1 schema field changed
    • changedInput schema / $defs / NewCheck / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "An HTTP(S) endpoint.",
      -    "properties": {
      -      "body": {
      -        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "expected_body_contains": {
      -        "description": "Text the response body must contain for the check to pass.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "expected_status": {
      -        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "follow_redirects": {
      -        "description": "Defaults to true, following at most 5 hops.",
      -        "type": [
      -          "boolean",
      -          "null"
      -        ]
      -      },
      -      "headers": {
      -        "additionalProperties": {
      -          "type": "string"
      -        },
      -        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "method": {
      -        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "timeout_ms": {
      -        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
      -        "format": "uint64",
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "type": {
      -        "const": "http",
      -        "type": "string"
      -      },
      -      "url": {
      -        "type": "string"
      -      },
      -      "verify_tls": {
      -        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
      -        "type": [
      -          "boolean",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "url"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "A TCP port accepting connections.",
      -    "properties": {
      -      "host": {
      -        "type": "string"
      -      },
      -      "port": {
      -        "format": "uint16",
      -        "maximum": 65535,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "timeout_ms": {
      -        "format": "uint64",
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "type": {
      -        "const": "tcp",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "host",
      -      "port"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "ICMP reachability.",
      -    "properties": {
      -      "host": {
      -        "type": "string"
      -      },
      -      "timeout_ms": {
      -        "format": "uint64",
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "type": {
      -        "const": "ping",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "host"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "A DNS record resolving, optionally to an expected value.",
      -    "properties": {
      -      "domain": {
      -        "type": "string"
      -      },
      -      "expected_contains": {
      -        "description": "Text the answer must contain.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "record_type": {
      -        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "resolver": {
      -        "description": "Resolver to ask. Defaults to the agent's own.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "timeout_ms": {
      -        "format": "uint64",
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "type": {
      -        "const": "dns",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "domain"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "A TLS certificate's remaining validity.",
      -    "properties": {
      -      "critical_days": {
      -        "description": "Days of remaining validity that fail it. Default 7.",
      -        "format": "uint32",
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "host": {
      -        "type": "string"
      -      },
      -      "port": {
      -        "description": "Defaults to 443.",
      -        "format": "uint16",
      -        "maximum": 65535,
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "timeout_ms": {
      -        "format": "uint64",
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "type": {
      -        "const": "tls_cert",
      -        "type": "string"
      -      },
      -      "warn_days": {
      -        "description": "Days of remaining validity that degrade the check. Default 30.",
      -        "format": "uint32",
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "host"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "A domain registration's remaining validity.",
      -    "properties": {
      -      "critical_days": {
      -        "description": "Default 7.",
      -        "format": "uint32",
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "domain": {
      -        "type": "string"
      -      },
      -      "timeout_ms": {
      -        "format": "uint64",
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "type": {
      -        "const": "domain_expiry",
      -        "type": "string"
      -      },
      -      "warn_days": {
      -        "description": "Default 30.",
      -        "format": "uint32",
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "domain"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
      -    "properties": {
      -      "grace_secs": {
      -        "description": "Lateness tolerated before the monitor fails.",
      -        "format": "uint64",
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "max_runtime_secs": {
      -        "description": "Fail a run that starts and does not finish within this.",
      -        "format": "uint64",
      -        "minimum": 0,
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "period_secs": {
      -        "description": "How often the job is expected to report.",
      -        "format": "uint64",
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "heartbeat",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "period_secs",
      -      "grace_secs"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "An HTTP(S) endpoint.",
      +    "properties": {
      +      "body": {
      +        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "expected_body_contains": {
      +        "description": "Text the response body must contain for the check to pass.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "expected_status": {
      +        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "follow_redirects": {
      +        "description": "Defaults to true, following at most 5 hops.",
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      },
      +      "headers": {
      +        "additionalProperties": {
      +          "type": "string"
      +        },
      +        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "method": {
      +        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "timeout_ms": {
      +        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
      +        "format": "uint64",
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "const": "http",
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      },
      +      "verify_tls": {
      +        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "A TCP port accepting connections.",
      +    "properties": {
      +      "host": {
      +        "type": "string"
      +      },
      +      "port": {
      +        "format": "uint16",
      +        "maximum": 65535,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "timeout_ms": {
      +        "format": "uint64",
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "const": "tcp",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "host",
      +      "port"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "ICMP reachability.",
      +    "properties": {
      +      "host": {
      +        "type": "string"
      +      },
      +      "timeout_ms": {
      +        "format": "uint64",
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "const": "ping",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "host"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "A DNS record resolving, optionally to an expected value.",
      +    "properties": {
      +      "domain": {
      +        "type": "string"
      +      },
      +      "expected_contains": {
      +        "description": "Text the answer must contain.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "record_type": {
      +        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "resolver": {
      +        "description": "Resolver to ask. Defaults to the agent's own.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "timeout_ms": {
      +        "format": "uint64",
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "const": "dns",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "domain"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "A TLS certificate's remaining validity.",
      +    "properties": {
      +      "critical_days": {
      +        "description": "Days of remaining validity that fail it. Default 7.",
      +        "format": "uint32",
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "host": {
      +        "type": "string"
      +      },
      +      "port": {
      +        "description": "Defaults to 443.",
      +        "format": "uint16",
      +        "maximum": 65535,
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "timeout_ms": {
      +        "format": "uint64",
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "const": "tls_cert",
      +        "type": "string"
      +      },
      +      "warn_days": {
      +        "description": "Days of remaining validity that degrade the check. Default 30.",
      +        "format": "uint32",
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "host"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "A domain registration's remaining validity.",
      +    "properties": {
      +      "critical_days": {
      +        "description": "Default 7.",
      +        "format": "uint32",
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "domain": {
      +        "type": "string"
      +      },
      +      "timeout_ms": {
      +        "format": "uint64",
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "const": "domain_expiry",
      +        "type": "string"
      +      },
      +      "warn_days": {
      +        "description": "Default 30.",
      +        "format": "uint32",
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "domain"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
      +    "properties": {
      +      "grace_secs": {
      +        "description": "Lateness tolerated before the monitor fails.",
      +        "format": "uint64",
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "max_runtime_secs": {
      +        "description": "Fail a run that starts and does not finish within this.",
      +        "format": "uint64",
      +        "minimum": 0,
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "period_secs": {
      +        "description": "How often the job is expected to report.",
      +        "format": "uint64",
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "heartbeat",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "period_secs",
      +      "grace_secs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
      +    "properties": {
      +      "type": {
      +        "const": "manual",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Added

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.