Skip to main content
Glama

I-5 corridor by stretch

dogpolicies_i5_corridor
Read-onlyIdempotent

What is on I-5 between here and there for a dog: the next restroom stops with a pet area, the stops on the Grapevine, between Sacramento and Redding? For the freeway in California only, by one of eleven named stretches (sandiego, orange-la, grapevine, kern-westside, westside, delta, sacramento, valley, tehama, shasta, siskiyou), a mile range, or a window ahead of a point. It covers I-5 only, with no hotel fee arithmetic and no closures or chain controls. Inputs: strip, or from_mile and to_mile (Caltrans odometer), or near={lat, lon} with direction (north or south) and ahead_miles; family=true keeps stops whose official source states restrooms and a pet area or dog park; paired=true adds exits with places for people nearby (counted from OpenStreetMap, never named, not verified for restrooms) matched to the nearest dog-legal place. With none of these it lists the stretches. Each stop carries its mile, s in meters from San Ysidro, the side of the road, distance off the freeway, and restrooms, water, pet area and hours as the source states them, with source URL and verified date. A rest area Caltrans reports fully closed right now carries closed_now (Caltrans' reason and end time); it stays in the list and the text names the first open stop instead.

Examples:

  • "What is between the Grapevine and Kettleman?" -> strip="grapevine" and strip="kern-westside"

  • "The next 5 family stops northbound from Stockton" -> near={lat:37.95, lon:-121.29}, direction="north", family=true, limit=5

  • "Every stop between mile 300 and 340" -> from_mile=300, to_mile=340

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "dogpolicies_i5_corridor"
  }
}

Input Schema

NameRequiredDescriptionDefault
nearNoA point on or near I-5; the window starts at the nearest point of the road
kindsNoKinds of stops to include; all by default
limitNoMaximum stops to return
stripNoA stretch by id (sandiego, orange-la, grapevine, kern-westside, westside, delta, sacramento, valley, tehama, shasta, siskiyou)
familyNoOnly family stops
offsetNoStops to skip
pairedNoAlso list the paired stops in the window
to_mileNoEnd of a mile range
directionNoDirection of travel from near; north means increasing snorth
from_mileNoStart of a mile range (Caltrans odometer)
ahead_milesNoWindow in miles from near in the direction of travel
response_formatNo'markdown' for readable text, 'json' for structured datamarkdown
dog_friendly_onlyNoLeave out stops where dogs are not allowed

Output Schema

NameRequiredDescriptionDefault
codeNoWith an outcome other than ok: not_found, invalid, unavailable
nextNoCalls that would answer the question, in words
as_ofYesDate the data was built (YYYY-MM-DD)
stopsYes
totalYes
stripsYes
windowYes
licenseYes
messageNoWhat happened, in a sentence
nearestNoWhen nothing is inside the radius: the nearest places in the data, with distance_miles
outcomeNoAbsent or ok: a normal answer. no_match: nothing in the data matches, see did_you_mean, nearest and next. bad_input: the arguments cannot be used as given, see next. partial: some of the ids were found, see missing. unavailable: a live source could not be read. None of these is an error.
acceptedNoWith bad_input: each argument that could not be read, with the values it accepts
nearest_i5NoWith a point too far from I-5: the nearest point on I-5 and how far it is
axis_versionYes
did_you_meanNoClose matches to what was asked for: towns, places, slugs or brands, best first
paired_stopsYes
resolved_fromNoSet when a word was read as the value the tool uses: hotel as lodging, NB as north. Each key is the argument; asked is what was sent, used what it was read as
attribution_urlYes
attribution_textYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • addedOutput schema / properties / accepted
      Added value: +{
      +  "additionalProperties": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "description": "With bad_input: each argument that could not be read, with the values it accepts",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / resolved_from
      Added value: +{
      +  "additionalProperties": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "asked": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          }
      +        ]
      +      },
      +      "used": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "asked",
      +      "used"
      +    ],
      +    "type": "object"
      +  },
      +  "description": "Set when a word was read as the value the tool uses: hotel as lodging, NB as north. Each key is the argument; asked is what was sent, used what it was read as",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / stops / items / properties / answer / description
      Added value: +"The one-line answer; while a seasonal rule applies today it leads with it (see today)"
    • addedOutput schema / properties / stops / items / properties / closed_now
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present only when Caltrans reports this rest area fully closed now. Live feed data, not a verified rule: check quickmap.dot.ca.gov",
      +  "properties": {
      +    "fetched_at": {
      +      "description": "When the conditions loop read the feed",
      +      "type": "string"
      +    },
      +    "reason": {
      +      "description": "Caltrans' own reason, as published",
      +      "type": "string"
      +    },
      +    "source": {
      +      "const": "Caltrans",
      +      "type": "string"
      +    },
      +    "until": {
      +      "description": "Caltrans' end time (ISO); null when no end is set",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "reason",
      +    "until",
      +    "source",
      +    "fetched_at"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / stops / items / properties / today
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Only for a place with seasonal dog rules (plover nesting season, summer beach hours): which applies on the server's date, until when, and which starts next, with the source. Repeat sentence with the answer.",
      +  "properties": {
      +    "date": {
      +      "description": "The date this was computed for: the server's date",
      +      "type": "string"
      +    },
      +    "in_effect": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "access": {
      +            "anyOf": [
      +              {
      +                "enum": [
      +                  "yes",
      +                  "yes_restricted",
      +                  "no"
      +                ],
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "area": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "days_left": {
      +            "type": "number"
      +          },
      +          "ends": {
      +            "description": "Last day of this run (YYYY-MM-DD)",
      +            "type": "string"
      +          },
      +          "leash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "rule": {
      +            "description": "The seasonal rule in plain words",
      +            "type": "string"
      +          },
      +          "season": {
      +            "description": "When it runs, in the source's dates: \"July 1 to May 15\"",
      +            "type": "string"
      +          },
      +          "starts": {
      +            "description": "First day of this run (YYYY-MM-DD)",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "rule",
      +          "season",
      +          "area",
      +          "access",
      +          "leash",
      +          "starts",
      +          "ends",
      +          "days_left"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "in_season": {
      +      "description": "true: a seasonal rule is in effect on that date; null: the source gives a season without dates",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "next": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "properties": {
      +            "access": {
      +              "anyOf": [
      +                {
      +                  "enum": [
      +                    "yes",
      +                    "yes_restricted",
      +                    "no"
      +                  ],
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "area": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "ends": {
      +              "description": "Last day of this run (YYYY-MM-DD)",
      +              "type": "string"
      +            },
      +            "in_days": {
      +              "type": "number"
      +            },
      +            "leash": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "rule": {
      +              "description": "The seasonal rule in plain words",
      +              "type": "string"
      +            },
      +            "season": {
      +              "description": "When it runs, in the source's dates: \"July 1 to May 15\"",
      +              "type": "string"
      +            },
      +            "starts": {
      +              "description": "First day of this run (YYYY-MM-DD)",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "rule",
      +            "season",
      +            "area",
      +            "access",
      +            "leash",
      +            "starts",
      +            "ends",
      +            "in_days"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "publisher": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "quote": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "sentence": {
      +      "description": "Leads answer and citation while a seasonal rule applies or starts within 14 days; null otherwise",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "source_url": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "starts_soon": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "access": {
      +            "anyOf": [
      +              {
      +                "enum": [
      +                  "yes",
      +                  "yes_restricted",
      +                  "no"
      +                ],
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "area": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "ends": {
      +            "description": "Last day of this run (YYYY-MM-DD)",
      +            "type": "string"
      +          },
      +          "in_days": {
      +            "type": "number"
      +          },
      +          "leash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "rule": {
      +            "description": "The seasonal rule in plain words",
      +            "type": "string"
      +          },
      +          "season": {
      +            "description": "When it runs, in the source's dates: \"July 1 to May 15\"",
      +            "type": "string"
      +          },
      +          "starts": {
      +            "description": "First day of this run (YYYY-MM-DD)",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "rule",
      +          "season",
      +          "area",
      +          "access",
      +          "leash",
      +          "starts",
      +          "ends",
      +          "in_days"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "undated": {
      +      "description": "Seasons the source states without dates: not known to apply",
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "access": {
      +            "anyOf": [
      +              {
      +                "enum": [
      +                  "yes",
      +                  "yes_restricted",
      +                  "no"
      +                ],
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "area": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "leash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "rule": {
      +            "description": "The seasonal rule in plain words",
      +            "type": "string"
      +          },
      +          "season": {
      +            "description": "When it runs, in the source's dates: \"July 1 to May 15\"",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "rule",
      +          "season",
      +          "area",
      +          "access",
      +          "leash"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "verified_at": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "date",
      +    "in_season",
      +    "sentence",
      +    "in_effect",
      +    "starts_soon",
      +    "next",
      +    "undated",
      +    "source_url",
      +    "publisher",
      +    "quote",
      +    "verified_at"
      +  ],
      +  "type": "object"
      +}
  2. Changed7 schema fields changed
    • addedOutput schema / properties / code
      Added value: +{
      +  "description": "With an outcome other than ok: not_found, invalid, unavailable",
      +  "type": "string"
      +}
    • addedOutput schema / properties / did_you_mean
      Added value: +{
      +  "description": "Close matches to what was asked for: towns, places, slugs or brands, best first",
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {},
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / message
      Added value: +{
      +  "description": "What happened, in a sentence",
      +  "type": "string"
      +}
    • addedOutput schema / properties / nearest
      Added value: +{
      +  "description": "When nothing is inside the radius: the nearest places in the data, with distance_miles",
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {},
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / nearest_i5
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "With a point too far from I-5: the nearest point on I-5 and how far it is",
      +  "properties": {},
      +  "type": "object"
      +}
    • addedOutput schema / properties / next
      Added value: +{
      +  "description": "Calls that would answer the question, in words",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / outcome
      Added value: +{
      +  "description": "Absent or ok: a normal answer. no_match: nothing in the data matches, see did_you_mean, nearest and next. bad_input: the arguments cannot be used as given, see next. partial: some of the ids were found, see missing. unavailable: a live source could not be read. None of these is an error.",
      +  "enum": [
      +    "ok",
      +    "partial",
      +    "no_match",
      +    "bad_input",
      +    "unavailable"
      +  ],
      +  "type": "string"
      +}
  3. Added

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare read-only/idempotent/non-destructive/non-open-world; the description adds the substance: family=true requires the official source to state restrooms plus a pet area or dog park, and paired=true data comes from OpenStreetMap, is counted rather than named, and is unverified for restrooms. It also discloses the closed_now behavior — a closed rest area stays in the list, carries Caltrans' reason and end time, and the text names the first open stop instead.

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?

Structure is strong and front-loaded: what it returns, then scope limits, then input modes, then per-stop fields, then examples. Some sentences are packed with multiple clauses (the strip list and the near/paired sentence), making it dense, but almost nothing is redundant with the schema or annotations.

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 zero-required, 13-parameter tool with nested objects, enums, and an output schema, the description covers every decision an agent must make: which mode, what the flags mean, what happens on no input, and how closed stops are reported. Return-value detail is supplemental rather than load-bearing because an output schema exists.

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, and the description earns more by redefining key flags beyond their terse schema text — family=true's evidence requirement, paired=true's provenance and caveats, and near's rule that the window starts at the nearest point of the road. It leaves several parameters (kinds, limit, offset, response_format, dog_friendly_only) to the schema entirely, which keeps this below a 5.

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 opening sentence states a concrete verb and resource (dog-legal restroom/stop data along I-5) and the second sentence pins the boundaries: eleven named stretches, mile ranges, or a window ahead of a point, I-5 in California only. It also explicitly excludes adjacent concerns (hotel fee arithmetic, closures, chain controls), which separates it from hotel-pricing and road-condition siblings.

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?

It gives three explicit selection modes (strip / from_mile+to_mile / near with direction and ahead_miles) and states the fallback when none are supplied (list the stretches), plus three worked examples that map real questions to arguments. What's missing is routing to a sibling by name for the excluded cases — it says closures aren't here but doesn't say which tool has them.

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.