US ultramarathons: dates, places, distances, elevation, prices. Every value cited.
Maintain this server? Claim it
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.
What Ultrapedia holds: the queryable views, every column and what it means, the allowed values of category columns, and how many races there are. Read this before writing SQL for `query`.
This tool takes no arguments.
What Ultrapedia holds: the queryable views, every column and what it means, the allowed values of category columns, and how many races there are. Read this before writing SQL for `query`.
No arguments.
{
"type": "object",
"title": "describeArguments",
"properties": {}
}Everything about one race: its values, its editions, and for every value the page it was read from and the verbatim quote.
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"title": "get_raceArguments",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
}
}
}Send a value for one field of one race, read from a web page — a correction or a value the index is missing. `field` is a column name from `describe`; `value` is in that column's form and units (gain_m in metres, dates yyyy-mm-dd, start_time HH:MM 24h, price_usd a number). `quote` must be copied verbatim from `source_url` and must show the value. For date, start time, price, aid stations, drop bags and runners, `year` is the edition year. The server checks the quote on the page; the result says whether the value was applied, held for a maintainer, or rejected and why.
| Argument | Type | Description |
|---|---|---|
| slug* | string | |
| year | any | |
| field* | string | |
| quote* | string | |
| value* | any | |
| source_url* | string |
{
"type": "object",
"title": "propose_correctionArguments",
"required": [
"slug",
"field",
"value",
"source_url",
"quote"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
},
"year": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Year",
"default": null
},
"field": {
"type": "string",
"title": "Field"
},
"quote": {
"type": "string",
"title": "Quote"
},
"value": {
"title": "Value"
},
"source_url": {
"type": "string",
"title": "Source Url"
}
}
}Send a US ultramarathon the index does not have yet. Check with search_races first. `quote` is copied verbatim from `source_url` and names the race. One call for each distance (a 50K and a 100M at the same event are two races).
| Argument | Type | Description |
|---|---|---|
| city | any | |
| name* | string | |
| quote* | string | |
| state | any | |
| source_url* | string | |
| website_url | any | |
| distance_category* | string |
{
"type": "object",
"title": "propose_raceArguments",
"required": [
"name",
"distance_category",
"source_url",
"quote"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "City",
"default": null
},
"name": {
"type": "string",
"title": "Name"
},
"quote": {
"type": "string",
"title": "Quote"
},
"state": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "State",
"default": null
},
"source_url": {
"type": "string",
"title": "Source Url"
},
"website_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Website Url",
"default": null
},
"distance_category": {
"type": "string",
"title": "Distance Category"
}
}
}Run one read-only SQL SELECT (SQLite) over the views `races`, `editions` and `sources`. Returns columns and rows; `truncated` is true when more rows exist than `limit` (max 500). Example: SELECT slug, name, date, city FROM races WHERE state='CO' AND distance_category='100M' AND date >= date('now') ORDER BY date
| Argument | Type | Description |
|---|---|---|
| sql* | string | |
| limit | integer |
{
"type": "object",
"title": "queryArguments",
"required": [
"sql"
],
"properties": {
"sql": {
"type": "string",
"title": "Sql"
},
"limit": {
"type": "integer",
"title": "Limit",
"default": 100
}
}
}Report something a single value cannot fix: a cancelled or discontinued race, two rows for the same race, a race filed under the wrong distance. Include a source and quote when you have one.
| Argument | Type | Description |
|---|---|---|
| note* | string | |
| slug* | string | |
| quote | any | |
| source_url | any |
{
"type": "object",
"title": "report_problemArguments",
"required": [
"slug",
"note"
],
"properties": {
"note": {
"type": "string",
"title": "Note"
},
"slug": {
"type": "string",
"title": "Slug"
},
"quote": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Quote",
"default": null
},
"source_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Source Url",
"default": null
}
}
}Find races. `text` matches the name, city or start location; `state` is a two-letter code; `distance_category` is one of the values in `describe`; dates are yyyy-mm-dd and filter the current edition's date. Returns the main columns; use `get_race` for everything about one race.
| Argument | Type | Description |
|---|---|---|
| text | any | |
| limit | integer | |
| state | any | |
| date_to | any | |
| date_from | any | |
| distance_category | any |
{
"type": "object",
"title": "search_racesArguments",
"properties": {
"text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Text",
"default": null
},
"limit": {
"type": "integer",
"title": "Limit",
"default": 25
},
"state": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "State",
"default": null
},
"date_to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Date To",
"default": null
},
"date_from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Date From",
"default": null
},
"distance_category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Distance Category",
"default": null
}
}
}