Skip to main content
Glama

ourpr.

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 the USGS 3DEP 10 m model sampled along the measured centerline, 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?

Annotations already declare read-only and idempotent behavior; the description goes much further by disclosing the USGS 3DEP 10m data source rather than barometer data, explaining that sampled extremes are always retained, and clarifying that an empty named_sections array does not mean a course is flat. Error handling behavior is also disclosed, and nothing contradicts the annotations.

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?

The definition is well-structured with clear headers, examples, and error handling, and the core purpose is front-loaded. It is slightly padded by an Args section and a Returns block that largely restate the schema, but overall the organization keeps it scannable and purposeful.

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 tool with this parameter count, output schema, and annotations, the description covers all operational context: data source, sampling behavior, edge-case semantics, error handling, and example invocations. Nothing needed to call it correctly 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?

Slug semantics are enriched with provenance ('From ourpr_list_courses') and example queries map directly to concrete slug values. Points and response_format are already thoroughly documented in the schema, so the description adds modest but real value beyond the schema's 100% coverage.

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?

The description opens with a precise statement: it returns the sampled elevation profile of one course plus named climbs and descents. The bold claim 'THIS IS THE TOOL FOR "what are the hills and where"' anchors its unique role and clearly separates it from course-detail or route siblings. Title and description agree and reinforce each other.

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?

The tool is explicitly framed as the one to answer hill-related questions, with natural-language examples mapping queries to slugs and a note to read climb_ft_per_mi for flatness. It does not name sibling tools like ourpr_get_course or ourpr_similar_terrain or state when not to use it, so the guidance is clear but not exhaustive.

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