Skip to main content
Glama

Get a course's hills

ourpr_get_course_terrain
Read-onlyIdempotent

The elevation profile of one course, sampled, plus every climb and descent ourpr. named on it.

THIS IS THE TOOL FOR "what are the hills and where". Each named section carries the street it runs on, the miles it spans, its net rise or fall and its average grade.

The elevation comes from a public terrain model sampled along the measured centerline (elevation_source names it), not from a watch barometer. A barometer drifts; the model is checked against published race figures.

Args:

  • slug (string): From ourpr_list_courses.

  • points (number): Elevation samples to return, 2 to 200. Default 40. The stored profile holds up to 4,873.

  • response_format ('markdown' | 'json'): Default 'markdown'.

Returns: { "slug": string, "name": string, "distance_mi": number, "climb_ft": number | null, "descent_ft": number | null, "min_ft": number | null, "max_ft": number | null, "steepest_pct": number | null, "climb_ft_per_mi": number | null, "elevation_source": string, "profile_points_stored": number, "profile": [{ "mi": number, "ft": number }], "named_sections": [{ "kind": "climb" | "descent", "name": string, "from_mi": number, "to_mi": number, "net_ft": number, "grade_pct": number }], "page_url": string }

The sampled profile always keeps the first point, the last point, the highest and the lowest, so its extremes agree with min_ft and max_ft.

A course with no named sections returns an empty array. That means the seeder found no stretch that qualified, not that the course is flat: read climb_ft.

Examples:

  • "What are the hills on Boston?" -> slug="boston-marathon"

  • "Is Houston flat?" -> slug="houston-marathon", read climb_ft_per_mi

  • "Give me the profile in detail" -> points=200

Error handling:

  • Returns the slug list suggestion when the slug is unknown.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
slugYesThe course's slug.
pointsNoHow many elevation samples to return. The stored profile holds up to 4,873 points, which no agent should read whole. 40 describes the shape; 200 is close to the source.
response_formatNoOutput format. 'markdown' reads well in a chat answer. 'json' carries every field for further computation.markdown

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameYes
slugYes
max_ftYes
min_ftYes
profileYesSampled elevation. The highest and lowest points are kept.
climb_ftYes
page_urlYes
descent_ftYes
distance_miYes
steepest_pctYes
named_sectionsYes
climb_ft_per_miYes
elevation_sourceYes
profile_points_storedYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the read-only/idempotent annotations: it names the data source (public terrain model along measured centerline, not a watch barometer), explains why that matters (barometer drift, checked against published race figures), guarantees extremes are preserved in the sample, and documents the empty-array edge case and unknown-slug error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the routing statement and scoping, then args, returns and examples in scannable blocks. The inline Returns block largely duplicates the output schema, which is slightly wasteful, but each remaining sentence (sampling guarantee, empty-array meaning, error handling) earns its 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?

For a read-only retrieval tool with a full output schema, this covers everything the agent needs: source provenance, sampling behavior, null-field handling, the empty named_sections ambiguity, format tradeoffs, and unknown-slug recovery. Nothing material is missing.

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, but the description adds practical guidance the schema lacks: the rationale for not reading all 4,873 stored points, what 40 vs 200 conveys, and that json is for further computation. It adds real decision value on top of the enum/default constraints.

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?

States a specific verb+resource: the sampled elevation profile of one course plus every named climb and descent, and explicitly claims the 'what are the hills and where' niche. This separates it from ourpr_get_course and ourpr_get_course_route without opening either schema.

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?

Gives concrete query-to-parameter mappings ('What are the hills on Boston?' -> slug, 'Is Houston flat?' -> climb_ft_per_mi, 'profile in detail' -> points=200) and points to ourpr_list_courses for slug discovery. It does not explicitly say when to prefer a sibling such as ourpr_get_course_route, so it falls just short of full routing guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources