UptimeEye MCP server

Connect Claude, Cursor or any other MCP client and manage your monitoring by describing it: “check our checkout API every 30 seconds from Europe and the US and alert the on-call channel”, or ask what your services logged when a monitor went down. Same API, same permissions as the app, and no server to run: most clients connect to the endpoint directly, and clients without remote MCP support (such as Claude Desktop) connect through the mcp-remote bridge, which needs Node.js.

Quick start

1. Create a management key

In the app open API Keys → New API Key, choose the type “Management” and copy the key. It starts with ue_live_ and is shown once. Log ingest keys (ue_ingest_) do not work here.

2. Add the server to your client

Endpoint: https://api.uptimeeye.com/mcp (streamable HTTP), authenticated with Authorization: Bearer ue_live_…. With Claude Code it is one command:

shell
claude mcp add --transport http uptimeeye https://api.uptimeeye.com/mcp \
  --header "Authorization: Bearer ue_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

3. Ask

Try “List my UptimeEye monitors” — then describe what you want monitored. The assistant looks up your notification channels first, because every monitor needs one.

Connect your client

Claude Code

The quick start command adds the server for you alone. Add --scope project to share it with your team via .mcp.json, and keep the key out of that file: in single quotes, ${UPTIMEEYE_API_KEY} goes into the file as it is, and Claude Code reads the key from that environment variable when it starts.

shell
claude mcp add --transport http --scope project uptimeeye https://api.uptimeeye.com/mcp \
  --header 'Authorization: Bearer ${UPTIMEEYE_API_KEY}'

Cursor

Global in ~/.cursor/mcp.json, or per project in .cursor/mcp.json:

.cursor/mcp.json
{
  "mcpServers": {
    "uptimeeye": {
      "url": "https://api.uptimeeye.com/mcp",
      "headers": { "Authorization": "Bearer ue_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }
    }
  }
}

VS Code (GitHub Copilot agent mode)

VS Code prompts for the key once and stores it securely:

.vscode/mcp.json
{
  "inputs": [
    { "type": "promptString", "id": "uptimeeye-key", "description": "UptimeEye API key (ue_live_…)", "password": true }
  ],
  "servers": {
    "uptimeeye": {
      "type": "http",
      "url": "https://api.uptimeeye.com/mcp",
      "headers": { "Authorization": "Bearer ${input:uptimeeye-key}" }
    }
  }
}

Claude Desktop

Claude Desktop starts local servers only, so it connects through the mcp-remote bridge (needs Node.js). Add this to claude_desktop_config.json and restart the app:

claude_desktop_config.json
{
  "mcpServers": {
    "uptimeeye": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.uptimeeye.com/mcp", "--header", "Authorization:${UPTIMEEYE_AUTH}"],
      "env": { "UPTIMEEYE_AUTH": "Bearer ue_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }
    }
  }
}

Other clients: anything that supports remote MCP servers over streamable HTTP with a custom header works with the endpoint and header above.

Available tools

Tools carry MCP annotations: read-only tools are marked as such, delete tools as destructive, so well-behaved clients ask before running them.

ToolWhat it does
list_monitorsAll uptime monitors with id, name, URL, status and check interval.
get_monitorFull configuration of one monitor, with its steps and assertions.
list_locationsRegions a monitor can check from, e.g. eu-central-1, and whether each is served right now.
create_monitorHTTP, TCP port (host:port), DNS or ICMP check with interval, timeout, assertions (status code, response time, body keyword, header, JSON path, certificate expiry, DNS record), request headers and body, regions and tags; or a flow of several steps.
update_monitorChange any of the fields above; fields you leave out stay as they are.
add_monitor_step / update_monitor_stepAdd a step to a monitor (which makes it a flow) or change one step by its position; a later step can use a value an earlier one extracts.
remove_monitor_stepRemove one step of a flow. Destructive.
pause_monitor / resume_monitorStop and restart checks and alerts.
delete_monitorDestructive — the assistant asks before calling it.
list_monitor_executionsA monitor's recent checks, newest first, per region whether they succeeded and how long they took, optionally only the failed ones.
get_monitor_executionOne check (the latest by default) with the result of every region and step: status code, error, timings, certificate or DNS records, and each assertion with its outcome. With a link to it in the app.
get_monitor_statisticsUptime percentage, average response time and number of checks and incidents over a range, as the monitor's overview shows them.
run_monitorRun a check now, e.g. to confirm a fix.
list_scheduled_tasksAll scheduled tasks: the cron jobs and workers that report to UptimeEye with heartbeats.
get_scheduled_taskDetails of one task, including the URL your job calls.
get_scheduled_task_runsA task's status, last and next expected heartbeat and its heartbeats (start, success, fail) over a range.
create_scheduled_taskTask with a simple interval (every 5 minutes) or a cron expression with time zone, plus grace period.
update_scheduled_taskChange schedule, grace period, channel or tags.
pause_scheduled_task / resume_scheduled_taskNo alerts while paused.
delete_scheduled_taskDestructive — the assistant asks before calling it.
list_notification_channelsAlert targets. Monitors and tasks reference a channel by id.
get_notification_channel_detailsA channel with its integrations, the monitors and tasks that use it and its recent notifications with their deliveries, to find out why an alert did not arrive.
create_notification_channelChannel with email, webhook, Teams, Discord or PagerDuty integrations. Slack and Telegram need your own sign-in in the app; the tool answers with the page to do it.
update_notification_channelRename or retag a channel.
add_integration / update_integrationAdd an integration to a channel or change its target.
remove_integrationRemove one integration from a channel. Destructive.
send_test_notificationSend a test to every integration of a channel.
delete_notification_channelDestructive; fails while monitors still use the channel.
list_status_pagesYour status pages.
get_status_pageA status page with its settings, sections, components and public URL.
create_status_pageStatus page with sections of monitors and scheduled tasks. It is public at once, so the assistant shows it to you first.
update_status_pageChange name, slug, language, theme, sections, subscriptions or white-label branding.
delete_status_pageDestructive; the public URL stops working.
add_status_page_domain / list_status_page_domainsConnect a custom domain (a subdomain such as status.acme.com) and see its state; the result gives the CNAME record to set.
delete_status_page_domainRemove a custom domain. Destructive.
list_status_page_subscribers / delete_status_page_subscriberThe confirmed subscribers of a status page; removing one is destructive.
get_status_page_report_schedule / set_status_page_report_scheduleThe uptime report of a status page, emailed weekly or monthly to its recipients.
list_incidentsIncidents, optionally filtered by status.
get_incidentOne incident with its updates, affected monitors and tasks and status pages.
create_incident / create_incident_updateOpen an incident on status pages or post an update to its history. Subscribers get an email, so the assistant shows you the text first.
update_incident / update_incident_updateCorrect an incident or one of its updates; visitors see the change.
delete_incident / delete_incident_updateDestructive — the assistant asks before calling them.
list_variablesYour variables; a secure variable's value is never returned.
create_variable / update_variableSet a variable monitors use as {{KEY}}; mark secrets as secure.
delete_variableDestructive; monitors that still use the variable stop resolving it.
list_log_alerts / get_log_alertYour log alerts with their condition, channel and state.
create_log_alert / update_log_alertAlert when more or fewer log lines than a threshold match a LogsQL query within a window.
pause_log_alert / resume_log_alertNot checked and no alerts while paused.
delete_log_alertDestructive — the assistant asks before calling it.
preview_log_alertMeasure a log alert condition now: matching lines and whether it would fire.
list_log_alert_eventsA log alert's recent state changes with the counted value and the reason.

Scheduled tasks are pinged by your job: GET https://api.uptimeeye.com/v1/beat/{taskId} on success. Optional: /start when the run begins and /fail to report a failed run and alert immediately. GET, POST and HEAD are all accepted.

Logs tools

Five read-only tools search the logs your services send to UptimeEye Logs. Queries are LogsQL, e.g. service:api level:error. The time range is set with start and end (RFC 3339) and defaults to the last hour; every result states the range actually searched, which your plan's retention can shorten.

ToolWhat it does
query_logsSearch the logs with a LogsQL query, newest first. Optional start, end and limit (default 50, at most 200). Long values are cut, and the result says whether rows or values were cut.
logs_histogramLog volume over time for a query (about 48 buckets), to see when errors started or spiked.
logs_fieldsWhich fields exist in the matching logs and how many entries carry each, so queries use field names that exist.
logs_facetsThe most frequent values of one field (e.g. service, level, host), optionally restricted by a query. limit default 10, at most 50.
get_log_contextContext of one entry from a query_logs result: its error signature, how often it occurred in the last 24 hours, and related entries (same trace or request, or the preceding lines of the same service).
Note: The logs tools need a plan that includes Logs. If the plan has no Logs or no logs have been received yet, the tool says so and what to do. A management key can read all of the organization's logs: whoever holds the key can search every service's logs within your plan's retention.

Example prompts

  • “Monitor https://shop.example.com every minute from eu-central-1 and us-east-1, alert me by email at ops@example.com if it's down or slower than 2 seconds.”
  • “Create a heartbeat for our nightly backup at 02:30 Europe/Berlin with 30 minutes grace and give me the curl line for the crontab.”
  • “Alert me if our Postgres at db.example.com:5432 stops accepting connections — check every minute.”
  • “Which monitors are currently down, and are there open incidents?”
  • “The checkout monitor went down at 14:05. What did the checkout service log around then, and is that error new?”
  • “Tag every monitor whose URL contains staging with staging and pause them.”
  • “Move all monitors from the ‘Old alerts’ channel to ‘On-call’, then delete ‘Old alerts’.”

Set up a project with an AI agent

Coding agents (Claude Code, Cursor, Copilot) can read your repository and the UptimeEye docs at the same time. Paste one of these prompts into the agent in your project; it finds the endpoints, jobs and stack by itself.

Monitor every public endpoint

Read https://uptimeeye.com/llms.txt. Find the public URLs and health endpoints of this project (routes, deployment config, README). Using the UptimeEye MCP server, create one monitor per endpoint: 30 s interval if my plan allows it, expected status 200, attached to the notification channel I pick. Show me the list before you create anything.

Add heartbeats to cron jobs

Find every cron job, scheduled worker and CI schedule in this repository. For each one, create an UptimeEye scheduled task via MCP with the matching schedule and a sensible grace period. Then change the job so it calls https://api.uptimeeye.com/v1/beat/<taskId> on success and https://api.uptimeeye.com/v1/beat/<taskId>/fail on error.

Ship logs

Add UptimeEye log shipping to this project. Follow https://uptimeeye.com/docs/logs/ingest and pick the integration guide that matches our stack (Kubernetes, Docker, OpenTelemetry, Node.js, Python, Go, Spring Boot, .NET, …). Read the ingest key from the environment variable UPTIMEEYE_INGEST_KEY and use service and env as stream fields.
Note: The log ingest key (ue_ingest_…) is created in the app under API Keys — the MCP server cannot create keys.

Permissions & safety

  • A management key acts on one organization with the same rights as the REST API. Create one key per client so you can revoke them separately.
  • A management key can read all of the organization's logs, within your plan's retention, through the logs tools and the REST API. There is no narrower log permission, so treat the key like the logs themselves.
  • Delete tools are annotated as destructive and the server instructs the assistant to ask for explicit confirmation first.
  • Plan limits apply exactly as in the app — the assistant cannot exceed your monitor count or minimum interval.
  • Keys are stored hashed; the plain key is shown once at creation. Requests are processed in the EU (Germany).

Prefer infrastructure as code? The same operations are available through the Terraform provider.

FAQ

What is the UptimeEye MCP server?

A Model Context Protocol endpoint at https://api.uptimeeye.com/mcp (streamable HTTP). AI assistants that speak MCP can list, create and change monitors and flows, cron job heartbeats, notification channels, status pages, incidents, log alerts and variables of your organization — the same operations as the REST API and the Terraform provider — and search the organization's logs.

Which plan do I need?

Any plan, including Free. The assistant works within your plan's limits: if you ask for more monitors or a shorter interval than the plan allows, the tool returns the limit and the assistant tells you. The logs tools need a plan that includes Logs.

Which clients work?

Every MCP client that can send an Authorization header over streamable HTTP: Claude Code, Cursor, VS Code, Windsurf and others. Clients that only support local stdio servers (such as Claude Desktop) connect through the mcp-remote bridge, which needs Node.js. Web connectors that require OAuth are not supported yet.

Can the assistant set up Slack, Teams or PagerDuty alerts?

Email, webhook, Teams, Discord and PagerDuty integrations, yes: the assistant creates the channel or adds the integration over MCP. Slack and Telegram need your own sign-in in the app; for them the tool answers with the page where you connect them. Once the channel exists, the assistant can attach any monitor to it by id.

Can the assistant read my logs?

Yes, if your plan includes Logs. The read-only tools query_logs, logs_histogram, logs_fields, logs_facets and get_log_context search your logs with LogsQL, show their volume over time and put a single error entry into context. A management key can read all of the organization's logs. To ship logs first, follow the Logs docs — a coding agent can do that setup for you (see the prompts above).

How do I revoke access?

Delete the key under API Keys in the app. Every client using it loses access immediately.