Skip to main content
Glama
wmmg101

kilter-mcp

kilter-mcp

An unofficial MCP server that lets your AI agent read and analyse your own Kilter Board logbook.

Add it to Kiro (or another MCP client), give it your Kilter login, and then just talk to the agent:

How did my last Kilter session go? What are my current projects at 30°? Compare my climbing at 20° and 40°. Show my grade pyramid. What are my hardest sends? Am I progressing?

Read-only. Nothing is written to your Kilter account.

Add to Kiro + Other Clients (Claude, Codex, Cursor etc.)

Add to Kiro

Click the button (Kiro shows a confirmation dialog first), then jump to step 3. Or do it by hand:

  1. Open your MCP config in Kiro: command palette → Kiro: Open user MCP config (JSON) (or the workspace one, .kiro/settings/mcp.json).

  2. Add the server:

{
  "mcpServers": {
    "kilter": {
      "command": "uvx",
      "args": ["kilter-mcp"],
      "env": {
        "KILTER_USERNAME": "${KILTER_USERNAME}",
        "KILTER_PASSWORD": "${KILTER_PASSWORD}"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}
  1. Provide your Kilter credentials. Either:

    • set KILTER_USERNAME and KILTER_PASSWORD as environment variables (Kiro expands ${VAR} after you approve the variables in Settings → Mcp Approved Env Vars; see how to set them on macOS, Linux and Windows), or

    • replace the ${...} placeholders with the literal values. Only do this in the user config (~/.kiro/settings/mcp.json), never in a workspace config you might commit.

  2. Save. Kiro starts the server and the kilter_* tools appear. Ask away.

Something not working? With the same variables exported in a terminal, run uvx kilter-mcp --check. It logs in, counts your logbook and prints a short report with no secrets or entries in it, which you can paste into an issue.

Requirements: uv installed (uvx comes with it). Python is handled by uv.

Kiro CLI users can do the same with kiro-cli mcp add --name kilter --scope global --command uvx --args kilter-mcp --env KILTER_USERNAME=... --env KILTER_PASSWORD=....

Optional: timezone

Sessions are grouped by calendar day in your timezone, which is detected from the machine running the server. If that is wrong (for example a remote or containerised host), add "KILTER_TIMEZONE": "Europe/Rome" (any IANA name) to the env block. Every response states the timezone it used.

Other clients

kilter-mcp is a standard local MCP server, so it also works in Claude Desktop, Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI and Zed. Copy-paste configs for each are in docs/clients.md. (ChatGPT's chat interface only accepts remote HTTP servers, so it is not supported directly; details in the same document.)

Related MCP server: WHOOP MCP

Example questions

Show my latest Kilter session.
What did I climb last Saturday?
List my sends from this month at 40°.
What are my current projects?
Which projects have I put the most attempts into?
Show my grade pyramid at 30°.
What is my flash rate per grade?
What are my five hardest sends?
Compare my climbing at 20° and 30°.
How has my climbing progressed over the last six months?

Tools the agent gets

Tool

What it returns

kilter_get_logs

Logbook entries (filter by limit, angle, topped, date range)

kilter_get_sends

Topped climbs, newest first

kilter_get_projects

Climbs attempted but never topped at that angle

kilter_get_summary

Totals, angles, date range, hardest send/flash, sends by grade

kilter_get_grade_pyramid

Sends per grade with flash rates

kilter_get_hardest_sends

Hardest unique sends

kilter_get_sessions

Entries grouped by day

kilter_get_progression

Month-by-month or week-by-week trend

kilter_get_angle_stats

Per-angle comparison

All tools are read-only and only ever see the account whose credentials you configured.

How the data is interpreted

  • One logbook entry is one climb at one wall angle on one date, with the number of tries in that entry. Re-logging a climb creates a new entry.

  • status is flash (topped first try), send (topped) or attempt (not topped).

  • A project is a (climb, angle) pair with attempts but no top at that angle.

  • Grades are Kilter's current consensus grade for the climb at that angle. grade is the V-scale and font_grade the Font scale; the raw difficulty_id (1-39) is always included. The grade table is fetched from Kilter at startup with an embedded fallback.

  • If you rated a climb yourself in the app, my_grade and my_rating (1-5 stars) carry your opinion; otherwise they are null.

  • Dates are reported in your timezone (see above). A session is one calendar day.

Security and privacy

  • Your username and password are only used to obtain an OAuth token from Kilter's login server (idp.kiltergrips.com). They never leave your machine otherwise.

  • Tokens are kept in memory for the life of the MCP process and are never written to disk.

  • Credentials and tokens are never included in tool output, logs or error messages.

  • The server makes requests only to idp.kiltergrips.com and portal.kiltergrips.com.

  • Also available in the MCP Registry as io.github.wmmg101/kilter-mcp.

  • Prefer the ${KILTER_PASSWORD} form so the password lives in your shell environment or secret manager rather than in a JSON file.

  • Your logbook is fetched at most once a minute, however many tools the agent calls, and Kilter's rate-limit responses are respected.

Full details and how to report a problem privately: SECURITY.md.

Disclaimer

kilter-mcp is an unofficial community project and is not affiliated with or endorsed by Kilter Grips. It talks to the same endpoints the Kilter app uses; these are not a documented public API and may change or stop working at any time. Kilter's Terms of Use restrict access to their services outside the official apps; use this project at your own discretion, only with your own account, and keep request volume low (the server fetches your logbook once per tool call).

Contributing

Issues and pull requests are welcome. See CONTRIBUTING.md for the development setup (git clone, uv sync, uv run pytest), architecture notes, and how to add a tool.

License

MIT

Available Tools

9 tools
kilter_get_angle_statsA
Read-only

Return per-wall-angle statistics so angles can be compared.

Use when the user asks to compare angles (e.g. 20° vs 40°), which angle they climb hardest or most at, or flash rate by angle. One row per angle with sends, flashes, attempts, sessions, hardest send/flash and sends per grade.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds that it returns one row per angle with specific metrics, which is helpful context. However, it doesn't mention any performance implications, aggregation details, or limitations beyond the output structure. For a simple read-only stats tool this is adequate but not rich; a 3 reflects that the description adds some value but doesn't go beyond what annotations imply.

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 three sentences, each earning its place: the first states the core function, the second gives concrete usage triggers, the third details the output rows. It is front-loaded with the purpose and avoids any filler, making it efficient for an agent to parse.

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 parameterless, read-only statistics tool with an output schema present, the description is complete. It explains what the tool does, when to use it, and what the output contains, without needing to cover params or return format (since output schema handles that). No gaps exist for an agent to call it correctly.

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

Parameters4/5

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

The tool has zero parameters, so the schema trivially covers 100% and there is nothing for the description to explain. The baseline for 0 parameters is 4, and the description appropriately focuses on output semantics rather than params. No additional parameter documentation is needed.

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 clearly states the tool returns per-wall-angle statistics for comparison, with a specific verb ('Return') and resource ('per-wall-angle statistics'). It also lists concrete example queries (comparing angles, hardest/most climbed, flash rate by angle) that distinguish it from sibling stats tools, so an agent can select it unambiguously.

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?

The description explicitly specifies when to use this tool: 'Use when the user asks to compare angles, which angle they climb hardest or most at, or flash rate by angle.' This gives strong contextual triggers, though it doesn't name specific alternative tools or state exclusions. That would push it to 5, but the guidance is clear enough for typical routing.

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

kilter_get_grade_pyramidA
Read-only

Return the user's send pyramid: sends per grade, hardest first, with flash rates.

Use when the user asks about their grade pyramid, distribution of grades, flash rate per grade, or how solid they are at a level. Optional wall-angle filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
angleNoWall angle in degrees (e.g. 20, 30, 40). Omit for all angles.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/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 beyond annotations, notably the ordering 'hardest first' and the inclusion of flash rates, plus the optional wall-angle filter. It does not contradict 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?

Two sentences with no filler: the first states the tool's output, the second gives usage conditions and the optional filter. The most important information is front-loaded.

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?

This is a simple read-only tool with one fully documented optional parameter and an output schema. The description covers selection, expected return content, ordering, and the optional filter, so nothing necessary 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%: the only parameter, 'angle', is fully documented with examples and the default behavior ('Omit for all angles'). The description merely restates 'Optional wall-angle filter', adding little beyond the schema, so the baseline 3 is appropriate.

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 ('Return') and resource ('the user's send pyramid') with concrete output details: sends per grade, hardest first, and flash rates. This clearly distinguishes it from sibling tools like kilter_get_sends or kilter_get_summary by naming the exact grade-level distribution concept.

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?

The description gives explicit when-to-use guidance: 'Use when the user asks about their grade pyramid, distribution of grades, flash rate per grade, or how solid they are at a level.' It does not list when-not-to-use or name alternative tools, but the trigger conditions are clear enough for an agent to route correctly.

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

kilter_get_hardest_sendsA
Read-only

Return the user's hardest sent climbs (unique per climb and angle), hardest first.

Use when the user asks about their hardest sends, best climbs, max grade, or personal bests. Optional wall-angle filter; limit defaults to 10.

ParametersJSON Schema
NameRequiredDescriptionDefault
angleNoWall angle in degrees (e.g. 20, 30, 40). Omit for all angles.
limitNoMaximum number of items to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds useful behavioral detail beyond those: results are unique per climb and angle, sorted hardest first, with an optional wall-angle filter. This gives the agent meaningful expectations about the tool's behavior without contradicting 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 two concise, front-loaded sentences: the first states exactly what the tool returns, and the second gives usage triggers and parameter guidance. There is minimal redundancy, and the key differentiating behavior is presented first.

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 simple read-only tool with two optional parameters and an existing output schema, the description is complete. It covers purpose, usage triggers, deduplication behavior, ordering, and the optional angle filter, and the annotations cover safety, making it sufficient for correct invocation.

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 baseline is 3; the schema already documents angle and limit, including defaults. The description mentions the optional wall-angle filter and the default limit, but this largely duplicates the schema rather than adding new semantic meaning.

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 action ('Return') and a precise resource: the user's hardest sent climbs, with uniqueness per climb and angle, ordered hardest first. This clearly separates it from siblings like kilter_get_sends or kilter_get_grade_pyramid by focusing on 'hardest sends, best climbs, max grade, or personal bests.'

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?

The description explicitly says 'Use when the user asks about their hardest sends, best climbs, max grade, or personal bests,' providing clear context for when this tool should be selected. It does not mention when not to use it or name an alternative, but the use-case guidance is specific enough to route an agent correctly.

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

kilter_get_logsA
Read-only

Return the user's Kilter logbook entries, newest first.

Use when the user asks about recent Kilter climbs, attempts, what they climbed on a date, or wants raw history. Each entry is one climb at one wall angle on one date with the number of tries in that entry. Filters: limit (default 25, max 500), angle (degrees), topped (true=only sends, false=only unsuccessful attempts), start_date/end_date (YYYY-MM-DD, inclusive).

ParametersJSON Schema
NameRequiredDescriptionDefault
angleNoWall angle in degrees (e.g. 20, 30, 40). Omit for all angles.
limitNoMaximum number of items to return.
toppedNotrue = only topped (sent) entries, false = only unsuccessful attempts.
end_dateNoInclusive end date, YYYY-MM-DD, in the user's timezone.
start_dateNoInclusive start date, YYYY-MM-DD, in the user's timezone.

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 indicate a safe read-only operation, and the description adds meaningful behavioral context: ordering ('newest first'), entry granularity, inclusive date filtering, and the meaning of the 'topped' filter. This goes beyond the structured annotations without contradicting them.

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 tight sentences: purpose, usage context, and filter summary. Every sentence earns its place, and the most important information is front-loaded.

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 read-only tool with an output schema and five optional, well-described parameters, this description is complete. It explains when to use it, what it returns at a unit level, and how every filter behaves, so an agent can invoke it correctly without additional inference.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds extra value by stating the limit maximum of 500 (not present in the schema), clarifying angle units in degrees, and compactly summarizing all filter semantics including inclusive date ranges.

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: 'Return the user's Kilter logbook entries, newest first.' It also clarifies the unit of data ('one climb at one wall angle on one date with the number of tries'), which distinguishes it from send lists, projects, summaries, and statistics tools.

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?

The description gives clear trigger conditions: 'Use when the user asks about recent Kilter climbs, attempts, what they climbed on a date, or wants raw history.' It does not explicitly name alternative tools or state when not to use it, but the context is specific enough for an agent to route correctly.

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

kilter_get_progressionA
Read-only

Return climbing progression over time, oldest period first.

Use when the user asks how they have progressed, trends, whether they are improving, or for a month-by-month/week-by-week view. period is 'month' (default) or 'week'. Each period has sessions, sends, unique climbs, flashes, attempts and hardest send/flash. Optional wall-angle filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
angleNoWall angle in degrees (e.g. 20, 30, 40). Omit for all angles.
periodNoBucket size for the progression: calendar month or ISO week.month

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?

Beyond the readOnlyHint and destructiveHint annotations, the description adds meaningful behavior: results are ordered 'oldest period first,' each period contains specific aggregates, and angle filtering is optional. This gives the agent a useful preview of response semantics without contradicting 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 tightly written and well-structured: purpose first, then when-to-use, then parameter clarification, then output contents. Every sentence earns its place with no redundancy.

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?

The tool has only two optional parameters, a full input schema, and an output schema. The description covers purpose, usage triggers, period semantics, output fields, and the optional angle filter. Nothing essential is missing for an agent to select and invoke it correctly.

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%, so the schema already documents both parameters. The description adds marginal value by restating period's default ('month') and calling angle an optional filter, but it does not introduce new semantic detail beyond the schema.

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 and resource: 'Return climbing progression over time, oldest period first.' This clearly identifies the tool's function. It does not explicitly name and distinguish sibling tools, but the time-based progression focus sets it apart from the summary, logs, sends, and pyramid siblings.

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?

The description provides clear usage context: 'Use when the user asks how they have progressed, trends, whether they are improving, or for a month-by-month/week-by-week view.' This is explicit about when to use the tool, though it does not mention when not to use it or name alternatives.

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

kilter_get_projectsA
Read-only

Return the user's projects: climbs attempted but never topped at that wall angle.

Use when the user asks what they are working on, unfinished climbs, or what to try next. A climb is a project per (climb, angle); sending it at another angle does not remove it. Sorted by most recently tried, then most attempts. Optional angle filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
angleNoWall angle in degrees (e.g. 20, 30, 40). Omit for all angles.
limitNoMaximum number of items to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint false, so the safety profile is covered. The description adds valuable behavioral context: the definition of a project per (climb, angle), the sorting order ('most recently tried, then most attempts'), and the optional angle filter. This goes beyond what annotations provide.

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: the first states purpose, the second gives usage, the third adds behavioral nuance and sorting. Everything is front-loaded and every sentence earns its place. No filler or redundancy.

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?

The description covers the tool's definition, usage triggers, sorting behavior, angle scoping, and filter option. With an output schema present and annotations covering safety, nothing essential is missing for an agent to select and call it correctly.

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 already explains the angle and limit parameters, including defaults and semantics. The description adds little beyond restating 'Optional angle filter,' which is redundant. The (climb, angle) definition provides indirect context but does not add parameter-level detail not already in 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 ('Return') and resource ('user's projects') and defines what a project is ('climbs attempted but never topped at that wall angle'), which clearly differentiates it from sibling tools like sends or logs. It also explains the (climb, angle) granularity, removing ambiguity about what constitutes a project.

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?

The description explicitly lists the use cases ('what they are working on, unfinished climbs, or what to try next'), which tells the agent when to invoke this tool. It does not explicitly name alternative tools or exclusions, but the context is clear enough that an agent can route correctly among the siblings.

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

kilter_get_sendsA
Read-only

Return climbs the user has topped (sent), newest first.

Use when the user asks about their sends, ticks, completed climbs or flashes. Entries with status 'flash' were topped on the first try. Filters: limit (default 25, max 500), angle (degrees), start_date/end_date (YYYY-MM-DD).

ParametersJSON Schema
NameRequiredDescriptionDefault
angleNoWall angle in degrees (e.g. 20, 30, 40). Omit for all angles.
limitNoMaximum number of items to return.
end_dateNoInclusive end date, YYYY-MM-DD, in the user's timezone.
start_dateNoInclusive start date, YYYY-MM-DD, in the user's timezone.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond the annotations: it explains the 'flash' status semantics ('topped on the first try'), the ordering ('newest first'), and the date/angle/limit filters. This is useful for an agent deciding whether the tool matches the user's intent.

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 compact and front-loaded: the core purpose is in the first sentence, the usage context in the second, and the filter summary in the third. Every sentence earns its place, and there is no redundant or filler content.

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?

The tool has an output schema, so return values need not be described. The description covers the main behavioral aspects (ordering, flash semantics, filters) and the annotations cover safety. The only minor gap is that it does not explicitly mention pagination or the meaning of 'openWorldHint', but for a read-only list tool with a rich schema, this is sufficient.

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 four parameters. The description adds a small amount of extra meaning by restating the limit default and range and the date format, but it does not go beyond what the schema already provides. Baseline 3 is appropriate because the schema carries the heavy lifting.

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 ('Return climbs the user has topped (sent)'), a clear resource (sends), and an ordering constraint (newest first). It also distinguishes itself from siblings by explicitly mentioning 'sends, ticks, completed climbs or flashes', which maps to the tool's domain and differentiates it from kilter_get_logs, kilter_get_projects, and kilter_get_hardest_sends.

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?

The description gives clear context for when to use the tool ('when the user asks about their sends, ticks, completed climbs or flashes') and includes a useful clarification about flash status. It does not explicitly name alternative tools or state when not to use it, but the sibling list and the domain-specific phrasing make the intended usage clear enough.

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

kilter_get_sessionsA
Read-only

Return recent climbing sessions (entries grouped by calendar day), newest first.

Use when the user asks how their last session went, what they climbed yesterday, or wants to compare sessions. Each session lists angles, sends, flashes, attempts, hardest send and every climb logged that day. limit defaults to 5.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of items to return.

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 mark this as read-only and non-destructive. The description adds useful behavioral detail beyond annotations: sessions are grouped by calendar day, sorted newest first, and include angles, sends, flashes, attempts, hardest send, and all climbs logged that day.

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 deliver the core behavior, use cases, return contents, and default limit without wasted words. The information is front-loaded and easy to parse.

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?

Given the output schema is present, annotations cover safety, and the only parameter is optional with a documented default, the description provides everything needed to select and invoke the tool correctly.

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%, so the schema already documents the lone limit parameter with its default. The description restates the default but adds little semantic value beyond the structured schema.

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 clearly states the tool returns recent climbing sessions grouped by calendar day, newest first. It provides concrete use cases that distinguish it from sibling tools focused on summaries, logs, sends, and projects, though it does not explicitly name an alternative.

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?

The description explicitly says when to use it: when the user asks how their last session went, what they climbed yesterday, or wants to compare sessions. It lacks an explicit 'when not to use' or direct sibling comparison, but the guidance is clear.

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

kilter_get_summaryA
Read-only

Return a compact overview of the user's whole Kilter history.

Use first when the user asks a broad question ("how is my climbing going?", "summarise my Kilter account") or when you need totals: entries, sends, flashes, attempts, angles climbed, date range, session count, hardest send/flash and sends per grade.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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=true, openWorldHint=true, and destructiveHint=false. The description adds useful behavioral context beyond that by defining the result as a compact aggregate of the whole Kilter history and enumerating the totals included, such as sends, flashes, attempts, and hardest send/flash.

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 sentences with the core action and resource front-loaded. The second sentence efficiently adds when to use it and what totals it covers, with relevant example queries that earn their place.

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?

Given zero parameters, annotations confirming a safe read operation, and the presence of an output schema, the description is complete. It tells an agent when to invoke the tool and what kind of information it will receive.

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

Parameters4/5

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

The tool accepts zero parameters and schema description coverage is 100%, so parameter semantics require no additional explanation. Baseline for 0 parameters is 4; the description does not need to compensate for missing parameter docs.

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?

Description names the action ('Return'), the resource ('compact overview of the user's whole Kilter history'), and the scope ('whole Kilter history'). It is clearly distinct from sibling tools that return granular lists or specific statistics.

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?

The description explicitly says 'Use first' and gives concrete triggers: broad questions like 'how is my climbing going?' and needs for totals. It does not explicitly name sibling alternatives or state when not to use it, so it misses the top tier but provides clear 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. 3 tool updatesv0.2.2
    • Changedkilter_get_logs1 field changed
      • changedInput schema / properties / limit / default
        Previous value: -50New value: +25
    • Changedkilter_get_projects1 field changed
      • changedInput schema / properties / limit / default
        Previous value: -50New value: +25
    • Changedkilter_get_sends1 field changed
      • changedInput schema / properties / limit / default
        Previous value: -50New value: +25
  2. 7 tool updatesv0.2.1
    • Changedkilter_get_grade_pyramid1 field changed
      • addedInput schema / properties / angle / description
        Added value: +"Wall angle in degrees (e.g. 20, 30, 40). Omit for all angles."
    • Changedkilter_get_hardest_sends3 fields changed
      • addedInput schema / properties / angle / description
        Added value: +"Wall angle in degrees (e.g. 20, 30, 40). Omit for all angles."
      • changedInput schema / properties / limit / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of items to return."
    • Changedkilter_get_logs6 fields changed
      • addedInput schema / properties / angle / description
        Added value: +"Wall angle in degrees (e.g. 20, 30, 40). Omit for all angles."
      • addedInput schema / properties / end_date / description
        Added value: +"Inclusive end date, YYYY-MM-DD, in the user's timezone."
      • changedInput schema / properties / limit / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of items to return."
      • addedInput schema / properties / start_date / description
        Added value: +"Inclusive start date, YYYY-MM-DD, in the user's timezone."
      • addedInput schema / properties / topped / description
        Added value: +"true = only topped (sent) entries, false = only unsuccessful attempts."
    • Changedkilter_get_progression3 fields changed
      • addedInput schema / properties / angle / description
        Added value: +"Wall angle in degrees (e.g. 20, 30, 40). Omit for all angles."
      • addedInput schema / properties / period / description
        Added value: +"Bucket size for the progression: calendar month or ISO week."
      • addedInput schema / properties / period / enum
        Added value: +[
        +  "month",
        +  "week"
        +]
    • Changedkilter_get_projects3 fields changed
      • addedInput schema / properties / angle / description
        Added value: +"Wall angle in degrees (e.g. 20, 30, 40). Omit for all angles."
      • changedInput schema / properties / limit / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of items to return."
    • Changedkilter_get_sends5 fields changed
      • addedInput schema / properties / angle / description
        Added value: +"Wall angle in degrees (e.g. 20, 30, 40). Omit for all angles."
      • addedInput schema / properties / end_date / description
        Added value: +"Inclusive end date, YYYY-MM-DD, in the user's timezone."
      • changedInput schema / properties / limit / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of items to return."
      • addedInput schema / properties / start_date / description
        Added value: +"Inclusive start date, YYYY-MM-DD, in the user's timezone."
    • Changedkilter_get_sessions2 fields changed
      • changedInput schema / properties / limit / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of items to return."
  3. 9 tool updatesv0.1.0
    • First observedkilter_get_angle_stats
    • First observedkilter_get_grade_pyramid
    • First observedkilter_get_hardest_sends
    • First observedkilter_get_logs
    • First observedkilter_get_progression
    • First observedkilter_get_projects
    • First observedkilter_get_sends
    • First observedkilter_get_sessions
    • First observedkilter_get_summary

TDQS

A4.3/5.0

Scored across 9 tools

Disambiguation4/5

Each tool targets a distinct analytical view (sends vs logs vs projects vs sessions), but sends, logs, and hardest_sends overlap in the 'climbed successfully' space. Descriptions clarify the differences well, so confusion is unlikely but possible for an agent searching for a send list.

Naming Consistency5/5

All tools follow the exact same kilter_get_<noun> pattern, making the naming scheme highly predictable and easy to navigate. No mixed conventions or verb variations exist.

Tool Count5/5

Nine tools is well within the ideal range for a focused analytics server. Each tool covers a distinct query mode without unnecessary bloat or obvious redundancy.

Completeness4/5

The tool surface covers the key analytical queries for a Kilter climbing history: overall summary, per-angle stats, progression, sessions, projects, sends, and hardest sends. Minor gaps exist such as no per-climb detail view or direct grade-based filtering of send lists, but these are workable via existing tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables read-only access to a Nightscout instance for glucose readings, treatments, and deterministic server-side aggregates, allowing users to discuss their diabetes data with an AI assistant without write permissions.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides AI assistants with read-only access to an athlete's Intervals.icu training data, including activities, wellness metrics, zones, and planned events, for use with MCP clients like ChatGPT and Claude.
    15
    MIT