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.
https://hotpath.rs/api/v1/mcpWhat its tools do
8 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
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
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
{
"tools": {}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
8 advertised
get_default_policy — Get Default Policy
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.
{
"type": "object",
"properties": {}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_diff — Compare Report With Baseline
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.
{
"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."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_report — Get Report
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.
{
"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."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_benchmarks — List Benchmarks
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.
{
"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."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_reports — List Reports
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.
{
"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."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_repos — List Repositories
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.
{
"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."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}validate_policy — Validate Policy
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.
{
"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."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}whoami — Show Current User
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.
{
"type": "object",
"properties": {}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
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.
Claude Code
claude mcp add --transport http hotpath-cloud-mcp https://hotpath.rs/api/v1/mcpCodex
codex mcp add hotpath-cloud-mcp --url https://hotpath.rs/api/v1/mcpCursor
{
"mcpServers": {
"hotpath-cloud-mcp": {
"url": "https://hotpath.rs/api/v1/mcp"
}
}
}Cline
{
"mcpServers": {
"hotpath-cloud-mcp": {
"type": "streamableHttp",
"url": "https://hotpath.rs/api/v1/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"hotpath-cloud-mcp": {
"type": "http",
"url": "https://hotpath.rs/api/v1/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http hotpath-cloud-mcp https://hotpath.rs/api/v1/mcpClaude Desktop
https://hotpath.rs/api/v1/mcpWindsurf
{
"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.
Other developer tools servers
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.