Read-only access to Rust profiling reports from CI: benchmark history, diffs and policies
Maintained by@hotpath-rs(verified)Also a maintainer?
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
This tool takes no arguments.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http hotpath-cloud https://hotpath.rs/api/v1/mcp
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.
No arguments.
{
"type": "object",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| id | string | null | A report id as the head. |
| pr | integer | null | Pull request number: the PR's newest report is the head. One of `pr`, `commit`, `id`. |
| repo* | string | The repository as `owner/name`, as `list_repos` prints it. |
| rows | any | `findings` (default): the rows the PR comment lists. `advisory`: plus the findings of unjudged families. `all`: every row, cell and total. |
| event | any | Narrows `pr` / `commit` to one event; not with `id`. |
| commit | string | null | Full 40-character commit sha: the newest report measuring it or headed at it is the head. |
| benchmark* | string | The benchmark name, as `list_benchmarks` prints it. |
{
"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."
}
}
}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 and its dashboard URL. `include_payload` adds the uploaded hotpath JSON report. 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.
| Argument | Type | Description |
|---|---|---|
| id | string | null | A report id. |
| pr | integer | null | Pull request number: the PR's newest report. One of `pr`, `commit`, `id`. |
| repo* | string | The repository as `owner/name`, as `list_repos` prints it. |
| event | any | Narrows `pr` / `commit` to one event; not with `id`. |
| commit | string | null | Full 40-character commit sha: the newest report measuring it or headed at it (a PR branch's `git rev-parse HEAD` finds the PR's report). |
| benchmark* | string | The benchmark name, as `list_benchmarks` prints it. |
| include_payload | boolean | Include the uploaded hotpath JSON report. Default false: the summary only. |
{
"type": "object",
"$defs": {
"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."
},
"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)."
},
"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."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| repo* | string | The repository as `owner/name`, as `list_repos` prints it. |
{
"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 a repository's stored reports, newest first, as summaries without payloads: id, benchmark, commit, PR, event, verdict, dashboard URL. 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). 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; pass `next_cursor` back as `cursor` for the next page, with the same filters. Use get_report with an `id` from here for one report's payload, and get_diff for what changed against its baseline.
| Argument | Type | Description |
|---|---|---|
| pr | integer | null | Only this pull request's reports. |
| repo* | string | The repository as `owner/name`, as `list_repos` prints it. |
| event | any | Only reports of one event. |
| limit | integer | null | Reports per page, 1 to 50. Default 20. |
| since | string | null | Uploaded at or after this time: RFC 3339, or `YYYY-MM-DD` (UTC midnight). |
| until | string | null | Uploaded before this time, same format as `since`. |
| branch | string | null | Bare branch name (`main`): reports that measured that branch's ref, in practice its push reports; pair with `event: push` for the baseline series. For a PR's own reports use `pr`. |
| commit | string | null | Full 40-character commit sha: reports measuring it or headed at it. |
| cursor | string | null | `next_cursor` of the previous page, with the same filters. |
| verdict | any | `passed`, `regressed` (failed reports included), `failed`, or `not_judged` (nothing was judged). |
| metadata | object | null | Only reports whose user_metadata has all of these keys with exactly these values (e.g. {"runner": "Linux-ARM64"}); up to 8 pairs. Reports without metadata never match. |
| benchmark | string | null | Only this benchmark's reports, by name as `list_benchmarks` prints it. Default: every benchmark of the repository. |
{
"type": "object",
"$defs": {
"Event": {
"enum": [
"push",
"pull_request"
],
"type": "string"
},
"Verdict": {
"enum": [
"passed",
"regressed",
"failed",
"not_judged"
],
"type": "string"
}
},
"$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."
},
"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."
},
"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 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.
| Argument | Type | Description |
|---|---|---|
| query | string | null | Only repositories whose `owner/name` contains this text, ignoring case. |
| with_benchmarks | boolean | Only repositories with at least one benchmark. Default false. |
{
"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."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| source* | string | The whole policy TOML document, as written. |
{
"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."
}
}
}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.
No arguments.
{
"type": "object",
"properties": {}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 7, 2026.