Koskamo

hotpath-cloud MCP

Read-only access to Rust profiling reports from CI, allowing AI assistants to analyze benchmark history, investigate performance regressions, compare runs with baselines, and validate regression policies.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

hotpath-cloud MCP logo, by hotpath-cloudVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by hotpath-cloud
You need:OAuth sign-inPersonal API token
MCP endpoint (Streamable HTTP)
https://hotpath.rs/api/v1/mcp
Vendor documentation

What its tools do

8 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

8 of 8 have a description · 8 of 8 declare behavior hints · 6 of 6 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to hotpath.rs ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Analyze stored profiling and benchmark reports
  • Investigate a performance regression in a pull request
  • Compare a CI benchmark run with its baseline
  • Find functions that broke a performance budget

Source and maintenance

Vendor evidenceRegistry 1.0.1

Protocol and capabilities

Server
rs.hotpath/hotpath-cloud 1.0.1
MCP protocol negotiated in check
2025-11-25
Tools
8 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

hotpath-cloud: Rust profiling reports from CI, their diffs against the baseline and the policies that judge them; not the live profiler of a running process. Every tool is read-only. list_repos lists the repositories of the user's own GitHub App installations; a repository with public reports can be named directly as owner/name without appearing there. list_reports finds a benchmark's report history, get_report fetches one report, get_diff explains its regressions and improvements against the baseline.

Tools

8 advertised

get_default_policy — Get Default Policy
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the default policy document (its keys at their defaults, comments included), as `source`. Every uploaded report must carry a policy file of its repository: write it as hotpath/policy.toml (or hotpath/<benchmark>-policy.toml), edit it, then check it with validate_policy.

get_default_policy input schema
{
  "type": "object",
  "properties": {}
}
get_default_policy annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_diff — Compare Report With Baseline
Advertised by the server during the last successful anonymous check.
Advertised read-only

Explain what changed in a benchmark: compare a stored report with the baseline recorded for it at upload (the report the PR comment compared), judged under the policy the report carried. The head is picked as in get_report. Values are strings formatted as the PR comment shows them, with a `unit`; `change_percent` is the exact number. Compared, no baseline and an unreadable side all answer successfully: read the top-level `verdict`. `verdict.judged` and not `verdict.regressed` means judged and fine. `regressed` means a judged family regressed or a budget is broken (see rows whose `outcome` is `regression` and their `crossed` cells, and `budgets.findings`). Not `judged` means nothing was judged: no baseline and no budgets, an unreadable head, or a policy of unjudged families only.

get_diff input schema
{
  "type": "object",
  "$defs": {
    "Rows": {
      "enum": [
        "findings",
        "advisory",
        "all"
      ],
      "type": "string"
    },
    "Event": {
      "enum": [
        "push",
        "pull_request"
      ],
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "repo",
    "benchmark"
  ],
  "properties": {
    "id": {
      "type": [
        "string",
        "null"
      ],
      "description": "A report id as the head."
    },
    "pr": {
      "type": [
        "integer",
        "null"
      ],
      "format": "uint32",
      "minimum": 0,
      "description": "Pull request number: the PR's newest report is the head. One of `pr`,\n`commit`, `id`."
    },
    "repo": {
      "type": "string",
      "description": "The repository as `owner/name`, as `list_repos` prints it."
    },
    "rows": {
      "$ref": "#/$defs/Rows",
      "description": "`findings` (default): the rows the PR comment lists. `advisory`: plus\nthe findings of unjudged families. `all`: every row, cell and total."
    },
    "event": {
      "anyOf": [
        {
          "$ref": "#/$defs/Event"
        },
        {
          "type": "null"
        }
      ],
      "description": "Narrows `pr` / `commit` to one event; not with `id`."
    },
    "commit": {
      "type": [
        "string",
        "null"
      ],
      "description": "Full 40-character commit sha: the newest report measuring it or headed\nat it is the head."
    },
    "benchmark": {
      "type": "string",
      "description": "The benchmark name, as `list_benchmarks` prints it."
    }
  }
}
get_diff annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_report — Get Report
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch one stored report by pull request, commit or id (exactly one). `pr` and `commit` answer the newest matching upload; `commit` matches the measured commit or a PR's head commit, so the local HEAD sha of a PR branch finds the PR's report. The summary names the policy file the report was judged under (`policy_path`, `policy_url`), its verdict, its run `totals` and its dashboard URL. `include_payload` adds the uploaded hotpath JSON report. `select` adds a `metrics` object per report with the values of named entities: per resource, exact `keys` (no patterns). Each entity comes with every section (timing, alloc, icount, ...) and every value the report has of it; an entity, section or value it lacks is left out, never zeroed; `metrics` is null for a report too old to read. Values are display strings like get_diff's; a functions `alloc` entry has `mode` (`bytes` or `count`). Instruction counts (`icount`) compare only between reports whose `metrics.callgrind` (tool, rustc, os) are equal. Keys are the `key` of get_diff rows. No report yet answers not_found: poll with `commit` to wait for CI's upload. For what changed against the baseline (regressions, improvements), use get_diff. To find reports without knowing a PR or commit, use list_reports.

get_report input schema
{
  "type": "object",
  "$defs": {
    "Event": {
      "enum": [
        "push",
        "pull_request"
      ],
      "type": "string"
    },
    "Select": {
      "type": "object",
      "properties": {
        "io": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "I/O keys: `label | operation | -`."
        },
        "sql": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "SQL keys: `query | route | source`, `-` for a part the entry lacks."
        },
        "http": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "HTTP call keys: `name | route | source`, `-` for a part the entry lacks."
        },
        "server": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "Route keys: the route (`GET /users/{id}`)."
        },
        "mutexes": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "Mutex keys: the label."
        },
        "threads": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "Thread keys: the thread name (threads sharing one are summed)."
        },
        "channels": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "Channel keys: the label."
        },
        "rw_locks": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "RwLock keys: the label."
        },
        "functions": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "Function keys: the function name (`crate::module::fn`)."
        }
      },
      "description": "`select=` as sent: per resource, exact entity keys.\nShared by the REST query and the MCP tools, whose schema it is.",
      "additionalProperties": false
    },
    "ResourceSelect": {
      "type": "object",
      "required": [
        "keys"
      ],
      "properties": {
        "keys": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Exact, case-sensitive entity keys, as the diff's rows name them."
        }
      },
      "description": "One resource of a `Select`: the entities to read, each with every\nsection and value the report has of it.",
      "additionalProperties": false
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "repo",
    "benchmark"
  ],
  "properties": {
    "id": {
      "type": [
        "string",
        "null"
      ],
      "description": "A report id."
    },
    "pr": {
      "type": [
        "integer",
        "null"
      ],
      "format": "uint32",
      "minimum": 0,
      "description": "Pull request number: the PR's newest report. One of `pr`, `commit`, `id`."
    },
    "repo": {
      "type": "string",
      "description": "The repository as `owner/name`, as `list_repos` prints it."
    },
    "event": {
      "anyOf": [
        {
          "$ref": "#/$defs/Event"
        },
        {
          "type": "null"
        }
      ],
      "description": "Narrows `pr` / `commit` to one event; not with `id`."
    },
    "commit": {
      "type": [
        "string",
        "null"
      ],
      "description": "Full 40-character commit sha: the newest report measuring it or headed\nat it (a PR branch's `git rev-parse HEAD` finds the PR's report)."
    },
    "select": {
      "anyOf": [
        {
          "$ref": "#/$defs/Select"
        },
        {
          "type": "null"
        }
      ],
      "description": "Metrics of named entities, read from each report: per resource\n(`functions`, `sql`, `http`, `server`, `mutexes`, `rw_locks`, `channels`,\n`io`, `threads`) exact, case-sensitive `keys` (function name; sql and\nhttp `name | route | source` with `-` for a missing part; io\n`label | op | -`; server the route; locks and channels the label;\nthreads the thread name). Each selected entity comes with every\nsection and value the report has of it. Up to 20 keys."
    },
    "benchmark": {
      "type": "string",
      "description": "The benchmark name, as `list_benchmarks` prints it."
    },
    "include_payload": {
      "type": "boolean",
      "default": false,
      "description": "Include the uploaded hotpath JSON report. Default false: the summary only."
    }
  }
}
get_report annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_benchmarks — List Benchmarks
Advertised by the server during the last successful anonymous check.
Advertised read-only

List one repository's benchmarks. A repository that does not exist, that the user cannot see or that has no App installed all answer not_found. list_repos already includes every repository's benchmarks; use this one when the repository is known.

list_benchmarks input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "repo"
  ],
  "properties": {
    "repo": {
      "type": "string",
      "description": "The repository as `owner/name`, as `list_repos` prints it."
    }
  }
}
list_benchmarks annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_reports — List Reports
Advertised by the server during the last successful anonymous check.
Advertised read-only

List a repository's stored reports, newest first, as summaries without payloads: id, benchmark, commit, PR, event, verdict, dashboard URL and the run's `totals` (wall time, allocated bytes or allocation count, peak RSS, Callgrind instructions and Callgrind wall time, as display strings; null when the report has none). Use it to discover report history (recent runs of one or all benchmarks, a PR's or a commit's reports, regressions in a time window) and to follow a benchmark's totals across runs without fetching each payload. Filters combine; `benchmark` narrows to one series. `metadata` narrows to runs with given user_metadata pairs, e.g. one runner or CPU. 20 per page by default, up to 50 (10 and 20 with `select`); pass `next_cursor` back as `cursor` for the next page, with the same filters and `select`. `select` adds a `metrics` object per report with the values of named entities: per resource, exact `keys` (no patterns). Each entity comes with every section (timing, alloc, icount, ...) and every value the report has of it; an entity, section or value it lacks is left out, never zeroed; `metrics` is null for a report too old to read. Values are display strings like get_diff's; a functions `alloc` entry has `mode` (`bytes` or `count`). Instruction counts (`icount`) compare only between reports whose `metrics.callgrind` (tool, rustc, os) are equal. Keys are the `key` of get_diff rows. Use get_report with an `id` from here for one report's payload, and get_diff for what changed against its baseline.

list_reports input schema
{
  "type": "object",
  "$defs": {
    "Event": {
      "enum": [
        "push",
        "pull_request"
      ],
      "type": "string"
    },
    "Select": {
      "type": "object",
      "properties": {
        "io": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "I/O keys: `label | operation | -`."
        },
        "sql": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "SQL keys: `query | route | source`, `-` for a part the entry lacks."
        },
        "http": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "HTTP call keys: `name | route | source`, `-` for a part the entry lacks."
        },
        "server": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "Route keys: the route (`GET /users/{id}`)."
        },
        "mutexes": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "Mutex keys: the label."
        },
        "threads": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "Thread keys: the thread name (threads sharing one are summed)."
        },
        "channels": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "Channel keys: the label."
        },
        "rw_locks": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "RwLock keys: the label."
        },
        "functions": {
          "anyOf": [
            {
              "$ref": "#/$defs/ResourceSelect"
            },
            {
              "type": "null"
            }
          ],
          "description": "Function keys: the function name (`crate::module::fn`)."
        }
      },
      "description": "`select=` as sent: per resource, exact entity keys.\nShared by the REST query and the MCP tools, whose schema it is.",
      "additionalProperties": false
    },
    "Verdict": {
      "enum": [
        "passed",
        "regressed",
        "failed",
        "not_judged"
      ],
      "type": "string"
    },
    "ResourceSelect": {
      "type": "object",
      "required": [
        "keys"
      ],
      "properties": {
        "keys": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Exact, case-sensitive entity keys, as the diff's rows name them."
        }
      },
      "description": "One resource of a `Select`: the entities to read, each with every\nsection and value the report has of it.",
      "additionalProperties": false
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "repo"
  ],
  "properties": {
    "pr": {
      "type": [
        "integer",
        "null"
      ],
      "format": "uint32",
      "minimum": 0,
      "description": "Only this pull request's reports."
    },
    "repo": {
      "type": "string",
      "description": "The repository as `owner/name`, as `list_repos` prints it."
    },
    "event": {
      "anyOf": [
        {
          "$ref": "#/$defs/Event"
        },
        {
          "type": "null"
        }
      ],
      "description": "Only reports of one event."
    },
    "limit": {
      "type": [
        "integer",
        "null"
      ],
      "format": "uint32",
      "minimum": 0,
      "description": "Reports per page, 1 to 50, default 20; with `select` 1 to 20,\ndefault 10."
    },
    "since": {
      "type": [
        "string",
        "null"
      ],
      "description": "Uploaded at or after this time: RFC 3339, or `YYYY-MM-DD` (UTC midnight)."
    },
    "until": {
      "type": [
        "string",
        "null"
      ],
      "description": "Uploaded before this time, same format as `since`."
    },
    "branch": {
      "type": [
        "string",
        "null"
      ],
      "description": "Bare branch name (`main`): reports that measured that branch's ref,\nin practice its push reports; pair with `event: push` for the\nbaseline series. For a PR's own reports use `pr`."
    },
    "commit": {
      "type": [
        "string",
        "null"
      ],
      "description": "Full 40-character commit sha: reports measuring it or headed at it."
    },
    "cursor": {
      "type": [
        "string",
        "null"
      ],
      "description": "`next_cursor` of the previous page, with the same filters."
    },
    "select": {
      "anyOf": [
        {
          "$ref": "#/$defs/Select"
        },
        {
          "type": "null"
        }
      ],
      "description": "Metrics of named entities, read from each report: per resource\n(`functions`, `sql`, `http`, `server`, `mutexes`, `rw_locks`, `channels`,\n`io`, `threads`) exact, case-sensitive `keys` (function name; sql and\nhttp `name | route | source` with `-` for a missing part; io\n`label | op | -`; server the route; locks and channels the label;\nthreads the thread name). Each selected entity comes with every\nsection and value the report has of it. Up to 20 keys."
    },
    "verdict": {
      "anyOf": [
        {
          "$ref": "#/$defs/Verdict"
        },
        {
          "type": "null"
        }
      ],
      "description": "`passed`, `regressed` (failed reports included), `failed`, or\n`not_judged` (nothing was judged)."
    },
    "metadata": {
      "type": [
        "object",
        "null"
      ],
      "description": "Only reports whose user_metadata has all of these keys with exactly\nthese values (e.g. {\"runner\": \"Linux-ARM64\"}); up to 8 pairs. Reports\nwithout metadata never match.",
      "additionalProperties": {
        "type": "string"
      }
    },
    "benchmark": {
      "type": [
        "string",
        "null"
      ],
      "description": "Only this benchmark's reports, by name as `list_benchmarks` prints it.\nDefault: every benchmark of the repository."
    }
  }
}
list_reports annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_repos — List Repositories
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the repositories the token's user can see with the hotpath GitHub App installed, ordered by full name, each with its benchmarks (name, stored reports, time of the newest report). Start here: `full_name` is the `repo` argument of the other tools. A user in a large organization may see hundreds of repositories, most without benchmarks: pass `with_benchmarks: true` to list only the profiled ones, or `query` to find one by name.

list_repos input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "query": {
      "type": [
        "string",
        "null"
      ],
      "description": "Only repositories whose `owner/name` contains this text, ignoring case."
    },
    "with_benchmarks": {
      "type": "boolean",
      "default": false,
      "description": "Only repositories with at least one benchmark. Default false."
    }
  }
}
list_repos annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
validate_policy — Validate Policy
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check that a policy TOML document parses as a hotpath policy, with the parser that judges uploaded reports. Stores nothing. A document with a problem is an error naming it. Use it after editing a policy file, before committing it.

validate_policy input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "source"
  ],
  "properties": {
    "source": {
      "type": "string",
      "description": "The whole policy TOML document, as written."
    }
  }
}
validate_policy annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
whoami — Show Current User
Advertised by the server during the last successful anonymous check.
Advertised read-only

Show which user and API token this connection acts as: the GitHub login, the token's name and expiry. Use it to confirm the connection works, or after a call answers invalid_token.

whoami input schema
{
  "type": "object",
  "properties": {}
}
whoami annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
613 ms
95th percentile latency
613 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 613 ms · metadata changed · 8 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http hotpath-cloud-mcp https://hotpath.rs/api/v1/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add hotpath-cloud-mcp --url https://hotpath.rs/api/v1/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable hotpath-cloud-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "hotpath-cloud-mcp": {
      "url": "https://hotpath.rs/api/v1/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "hotpath-cloud-mcp": {
      "type": "streamableHttp",
      "url": "https://hotpath.rs/api/v1/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start hotpath-cloud-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "hotpath-cloud-mcp": {
      "type": "http",
      "url": "https://hotpath.rs/api/v1/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http hotpath-cloud-mcp https://hotpath.rs/api/v1/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://hotpath.rs/api/v1/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "hotpath-cloud-mcp": {
      "serverUrl": "https://hotpath.rs/api/v1/mcp"
    }
  }
}

Let your agent find its tools

Find servers like hotpath-cloud MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run hotpath-cloud MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing