Skip to main content
Glama

kener-mcp

PyPI CI

An MCP server for Kener v4 status pages. It lets an AI agent (Claude Code, Claude Desktop, or any MCP client) read monitors and incidents, and create, update, and resolve incidents.

Tested against Kener 4.1.7.

Tools

Tool

What it does

Writes?

list_monitors

Lists monitors: tag, name, status, type, category. Monitor config (type_data) is never returned, because it can hold target URLs and request headers.

No

list_incidents

Lists incidents, newest first. Only open incidents unless include_resolved is true.

No

get_incident

Gets one incident with its update timeline.

No

create_incident

Creates an incident that starts now. It can attach monitors and post a first update.

Yes

post_incident_update

Posts an update and sets the state (INVESTIGATING, IDENTIFIED, MONITORING, RESOLVED).

Yes

resolve_incident

Posts a RESOLVED update, which closes the incident and sets its end time.

Yes

There is no delete tool. Delete incidents in the Kener dashboard.

The read tools have the MCP readOnlyHint annotation, so clients can allow them without a prompt and still ask before a write.

Related MCP server: PagerDuty MCP Server

Configuration

One server serves one Kener instance. To use more than one instance, register one server per instance, each with its own URL and key.

Variable

Required

Description

KENER_URL

Yes

Base URL of the Kener instance, for example https://status.example.com.

KENER_API_KEY

One of these two

A Kener API key. Create one in the Kener dashboard under Manage > API Keys.

KENER_API_KEY_CMD

One of these two

A command that prints the API key on stdout, for example op read op://Vault/Item/api_key. See API key command.

KENER_API_KEY_CMD_TIMEOUT

No

Seconds to wait for the key command. Default 30.

KENER_NAME

No

A short name for the instance. It is used in the server name and in error messages.

KENER_INSTRUCTIONS

No

Extra text for the agent, for example "This page is client-facing; updates also post to the client's Slack."

The --url, --api-key-cmd, and --name flags override the matching variables. There is no --api-key flag, because process lists show command-line arguments.

API key command

Use KENER_API_KEY_CMD (or --api-key-cmd) to get the key from a secret manager, so that the key is not in your MCP config:

  • The command runs on the first tool call, not at server start. A slow or locked secret manager does not block the MCP handshake.

  • The key is kept in memory. If Kener rejects it (HTTP 401), the next tool call runs the command again, so a rotated key is picked up.

  • The command is split like a shell command line (shlex) but does not run in a shell. Pipes, $VARS, and ~ are not expanded. For those, point it at a script.

  • The command must print only the key. If it fails, the error shows its exit code and stderr, never its stdout.

Examples:

# 1Password
KENER_API_KEY_CMD='op read "op://Infra/Kener API key/api_key"'
# macOS Keychain
KENER_API_KEY_CMD='security find-generic-password -s kener -w'
# pass
KENER_API_KEY_CMD='pass show kener/api-key'

Install

uv tool install kener-mcp

Or run it without installing: uvx kener-mcp. With pip: pip install kener-mcp.

Then check the URL and key:

KENER_URL=https://status.example.com KENER_API_KEY=... kener-mcp check

Register with Claude Code

claude mcp add kener -s user \
  -e KENER_URL=https://status.example.com \
  -e KENER_API_KEY=your-key \
  -- kener-mcp

For two instances, add two servers:

claude mcp add kener-prod -s user -e KENER_URL=https://status.example.com -e KENER_API_KEY=... -- kener-mcp
claude mcp add kener-staging -s user -e KENER_URL=https://status-staging.example.com -e KENER_API_KEY=... -- kener-mcp

With a key command instead of a stored key:

claude mcp add kener -s user -- kener-mcp \
  --url https://status.example.com \
  --api-key-cmd 'op read "op://Infra/Kener API key/api_key"'

Register with Claude Desktop (or another MCP client)

{
  "mcpServers": {
    "kener": {
      "command": "kener-mcp",
      "env": {
        "KENER_URL": "https://status.example.com",
        "KENER_API_KEY": "your-key"
      }
    }
  }
}

Kener API notes

These notes describe Kener 4.1.7 as read from its source:

  • An update is POST /api/v4/incidents/{id}/comments with {"comment": "...", "state": "..."}. The Kener docs show message and status. The server rejects those names.

  • There is no resolve endpoint. A comment with state RESOLVED sets the incident state and its end time. PATCH /api/v4/incidents/{id} cannot change the state.

  • API-created incidents start in state INVESTIGATING.

  • Updates posted through the API do not email subscribers (rajnandan1/kener#886). Updates made in the dashboard do.

Development

uv sync
uv run pytest
uv run ruff check . && uv run ruff format --check .

The tests use respx to check the HTTP request shapes. They call no real Kener instance.

Releasing

  1. Bump the version: uv version --bump patch (or minor / major).

  2. Move the Unreleased notes in CHANGELOG.md under the new version.

  3. Commit, push, and wait for CI to pass.

  4. Publish a GitHub release with the tag v<version>, for example gh release create v0.1.1 --generate-notes.

The Release workflow then checks that the tag matches the version in pyproject.toml, runs the tests, builds the package, and publishes it to PyPI with Trusted Publishing.

License

MIT. See LICENSE.

Available Tools

6 tools
create_incidentCreate IncidentA

Create a public incident, starting now, in state INVESTIGATING. Optionally attach monitors (tags from list_monitors) and post a first update. On Kener 4.1.7 and earlier, updates posted through the API do not email subscribers (rajnandan1/kener#886).

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoState for the first update.INVESTIGATING
titleYesIncident title.
impactNoImpact on each listed monitor.DOWN
first_updateNoOptional first update text.
monitor_tagsNoMonitor tags the incident affects.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare write (readOnlyHint=false), safe (destructiveHint=false) and open-world behavior, and the description adds meaningful context beyond that: the incident is public, it starts immediately in INVESTIGATING, and a version-specific caveat (Kener 4.1.7 and earlier do not email subscribers, #886) warns of a surprising side effect.

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

Conciseness4/5

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

Three sentences, front-loaded with the primary action and only the optional attachments and the caveat following. Nothing is wasted, though the issue-reference aside is slightly tangential to invocation.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and the description covers purpose, optional inputs, and a notable behavioral quirk. For a single required-parameter creation tool it is nearly complete, lacking only explicit permission/visibility details.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all five parameters, establishing a baseline of 3. The description adds only a small pointer (tags come from list_monitors) and otherwise repeats schema-level facts like the default INVESTIGATING state and optional first update.

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 gives a specific verb and resource ('Create a public incident') plus scope ('starting now, in state INVESTIGATING'), which clearly differentiates it from the read-oriented siblings (list_incidents, get_incident) and resolve_incident. It also names list_monitors as the source of monitor tags.

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?

Usage is implied rather than spelled out: optional behaviors (attach monitors, post a first update) and the direction to get tags from list_monitors give some context, but there is no explicit when-to-use guidance relative to post_incident_update or resolve_incident, and no exclusions.

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

get_incidentGet IncidentA
Read-only

Get one incident with its update timeline (oldest first).

ParametersJSON Schema
NameRequiredDescriptionDefault
incident_idYesKener incident ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context by specifying that the incident's update timeline is included and ordered oldest first, which is not stated by the annotations.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no wasted words. It efficiently communicates the core action and the notable return ordering detail.

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

Completeness5/5

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

For a low-complexity, single-parameter read-only tool with full schema coverage, annotations, and an output schema, the description provides enough context for correct invocation. It states what is fetched and adds the timeline ordering, with no critical gaps for this tool's complexity.

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

Parameters3/5

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

Schema description coverage is 100%, and the single incident_id parameter is fully documented in the schema as a Kener incident ID. The description adds no further parameter semantics, so the baseline score of 3 applies.

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 states a specific verb ('Get') and resource ('incident'), and explicitly scopes it to one incident rather than a list. This distinguishes it from list_incidents, create_incident, resolve_incident, and post_incident_update without ambiguity.

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?

Usage is implied: retrieve a single incident by ID, as opposed to listing incidents. However, the description does not explicitly state when to use this tool versus alternatives or any prerequisites, leaving the agent to infer the selection context.

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

list_incidentsList IncidentsA
Read-only

List incidents, newest first. By default only open (not RESOLVED) incidents.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum incidents to return.
include_resolvedNoAlso return RESOLVED incidents.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=true), so the description only needs to add query behavior — and it does, disclosing the newest-first ordering and the non-obvious default of hiding RESOLVED incidents, which an agent could otherwise get wrong. It says nothing about pagination or result volume, keeping it short of a 5.

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

Conciseness5/5

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

Two short sentences with zero filler; the scope constraint and the default filter are front-loaded in the order an agent needs them. Every clause earns its place.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and annotations cover safety; with only two fully documented parameters, the description supplies the remaining needed context (ordering and default filtering). It is close to complete, though it omits any note on result-set size or paging behavior.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters carry defaults and descriptions, so the schema does the heavy lifting. The description's 'by default only open (not RESOLVED)' largely restates include_resolved's schema description rather than adding new semantics, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb+resource ('List incidents') plus two scope facts: ordering ('newest first') and the default filter ('only open (not RESOLVED)'). The plural 'list' form is inherently distinct from get_incident/resolve_incident, but no sibling is named, so it falls short of the explicit differentiation a 5 requires.

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 default-filter sentence implies when the tool is appropriate (browsing open incidents) and hints that include_resolved is the escape hatch, but it never states when to reach for get_incident, list_monitors, or any other sibling, and gives no exclusions or prerequisites.

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

list_monitorsList MonitorsA
Read-only

List the monitors on this Kener instance (tag, name, status, type, category).

Use the tags with create_incident.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_hiddenNoInclude hidden monitors.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the returned field set and the cross-tool purpose, but says nothing about the hidden-monitor behavior or result volume, which is a modest but not severe gap.

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

Conciseness4/5

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

Two short sentences with the core purpose front-loaded and no filler. The second sentence is terse but earns its place by pointing at a sibling workflow.

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

Completeness4/5

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

An output schema exists, so return values needn't be spelled out, and annotations carry the read-only safety signal. For a zero-required-parameter lister, the definition is adequate, with only the include_hidden semantics left entirely to the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so include_hidden is already documented with its default in the schema. The parenthetical field list describes output, not the parameter, so the description adds no meaning beyond the structured field; baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb ('List') and resource ('the monitors on this Kener instance') and even enumerates the fields returned (tag, name, status, type, category). It partially differentiates from siblings by tying the output to create_incident, though it doesn't explicitly contrast itself with list_incidents.

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 line 'Use the tags with create_incident' gives one concrete downstream use case, implying when an agent would call this tool. However, it offers no when-not guidance and doesn't compare against sibling tools like list_incidents, leaving selection largely to inference.

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

post_incident_updatePost Incident UpdateA

Post a public update on an incident and set its state. The state becomes the incident's current state. To close an incident, use resolve_incident. On Kener 4.1.7 and earlier, updates posted through the API do not email subscribers (rajnandan1/kener#886).

ParametersJSON Schema
NameRequiredDescriptionDefault
stateYesNew incident state.
commentYesUpdate text shown on the status page.
incident_idYesKener incident ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so the mutation safety profile is covered. The description adds real value beyond them: the supplied state becomes the incident's current state, and the version-specific caveat that API updates do not email subscribers on Kener 4.1.7 and earlier (with issue reference). It does not cover auth/permission requirements or reversibility, so it falls short of a 5.

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

Conciseness5/5

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

Three short sentences, zero filler, and the core action is front-loaded ahead of the sibling pointer and the version caveat. Every sentence carries information an agent needs.

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

Completeness5/5

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

With an output schema present, return values need not be explained, and the description covers the action, its state side effect, the closing alternative, and a notable behavioral caveat. Nothing essential for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, including the enum for state, so the schema already documents all three parameters; baseline 3 applies. The description only adds the semantic point that the state value becomes the incident's current state, which is minor beyond the schema.

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 states a specific verb and resource ('Post a public update on an incident and set its state'), explicitly names the sibling it is not for ('To close an incident, use resolve_incident'), and clarifies the side effect that the supplied state becomes the incident's current state.

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

Usage Guidelines5/5

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

It gives explicit when-not guidance plus the alternative tool by name ('To close an incident, use resolve_incident'), so an agent can route between post_incident_update and resolve_incident without inspecting either schema.

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

resolve_incidentResolve IncidentA

Resolve an incident. Kener has no separate resolve call: this posts an update with state RESOLVED, which closes the incident and sets its end time. On Kener 4.1.7 and earlier, updates posted through the API do not email subscribers (rajnandan1/kener#886).

ParametersJSON Schema
NameRequiredDescriptionDefault
commentNoClosing update text.This incident has been resolved.
incident_idYesKener incident ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations cover safety (not readOnly, non-destructive) but the description adds valuable beyond-annotation detail: that it closes the incident and sets end time, and a versioned caveat about subscribers not being emailed on 4.1.7 and earlier (with issue reference). That's strong behavioral context.

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?

Three sentences, front-loaded with the action, then mechanism, then a caveat. Zero waste.

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

Completeness5/5

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

Output schema exists so return values needn't be explained; annotations carry the safety profile and the description fills the remaining gaps (side effects, end time, notification caveat). Complete for a two-param tool.

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

Parameters3/5

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

Schema coverage is 100%, and the schema documents both comment and incident_id well. The description adds no parameter-level syntax beyond noting the default comment exists implicitly; baseline 3 is appropriate.

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

Purpose4/5

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

States a specific verb+resource and disambiguates from the sibling post_incident_update by explaining that resolution is implemented as a state RESOLVED update. The mechanism is clear, though it doesn't explicitly say 'not post_incident_update' as a routing hint.

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

Usage Guidelines4/5

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

Clearly implies use when closing an incident versus post_incident_update, and explains the implementation equivalence with Kener's semantics. No explicit when-not statement, but the mechanism note gives solid context.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observedcreate_incident
    • First observedget_incident
    • First observedlist_incidents
    • First observedlist_monitors
    • First observedpost_incident_update
    • First observedresolve_incident

TDQS

A4/5.0

Scored across 6 tools

Disambiguation4/5

Most tools target distinct actions (list, get, create, update, resolve), but resolve_incident and post_incident_update overlap since both post updates and set state. The descriptions explicitly clarify ('To close an incident, use resolve_incident'), which mitigates the confusion but the boundary is not fully clean.

Naming Consistency5/5

All six tools use consistent snake_case verb-first naming (resolve_incident, list_monitors, list_incidents, get_incident, post_incident_update, create_incident). The pattern is predictable and readable throughout.

Tool Count5/5

Six tools is well-scoped for an incident-management server, covering the core read/write lifecycle without redundancy. Each tool earns its place.

Completeness4/5

Incident lifecycle is well covered (create, list, get, update, resolve), but there is no delete incident and monitors are read-only (only list_monitors, no create/update/delete monitor). Minor gaps an agent can live with, depending on intent.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to check real-time status, uptime, and incidents for 200+ popular APIs (Stripe, OpenAI, AWS, GitHub, Twilio, etc.) through read-only, no-authentication tools.
    MIT