Bridges MCP
An MCP server providing access to the FHWA National Bridge Inventory, allowing AI agents to query bridge conditions, load postings, clearances, and summaries for US public-road bridges without requiring an API key.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://bridges.morningbrief.link/mcpWhat you can do with it
- Find bridges in a specific county with poor condition ratings
- Screen a route polyline for clearance and posting failures for trucks
- Get state or county roll-ups of bridge counts and condition splits
- Look up inspection dates and location details for a specific bridge
Source and maintenance
Protocol and capabilities
- Server
- bridges 1.0.0
- MCP protocol
- 2024-11-05
- Tools
- 10 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {}
}Tools
10 advertised
search_bridges
Search US bridges in the FHWA National Bridge Inventory. Scope with state, county (3-digit FIPS code), and/or condition (Good/Fair/Poor); optional filters: posting_status (open/posted/closed/not_yet_open), owner_code, scour_critical, year_min/year_max, min_adt, route, and q (text match on facility carried, feature crossed, location). Returns decoded records with condition rollup, posting status, clearances, and labels. Read-only lookup of the FHWA NBI 2025 annual snapshot; no API key. limit defaults to 100 (max 1000); offset defaults to 0, pass offset in multiples of limit to page. Use find_bridges_nearby instead for radius queries around a point, get_worst_bridges instead for Poor-condition lists, and list_bridges_in_county instead for all bridges in one county.
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Text match: facility carried / feature crossed / location"
},
"limit": {
"type": "number",
"default": 100,
"description": "Max results, default 100, at most 1000"
},
"route": {
"type": "string",
"description": "Route number carried, e.g. '90'"
},
"state": {
"type": "string",
"description": "US state postal code, e.g. 'IL'"
},
"county": {
"type": "string",
"description": "3-digit FIPS county code within the state"
},
"offset": {
"type": "number",
"default": 0,
"description": "Results to skip for paging, default 0"
},
"min_adt": {
"type": "number",
"description": "Minimum average daily traffic"
},
"year_max": {
"type": "number",
"description": "Latest year built"
},
"year_min": {
"type": "number",
"description": "Earliest year built"
},
"condition": {
"enum": [
"Good",
"Fair",
"Poor"
],
"type": "string",
"description": "Condition rating: Good, Fair, or Poor"
},
"owner_code": {
"type": "string",
"description": "Agency code of the bridge owner"
},
"posting_status": {
"enum": [
"open",
"posted",
"closed",
"not_yet_open"
],
"type": "string",
"description": "Posting status: open, posted, closed, or not_yet_open"
},
"scour_critical": {
"type": "boolean",
"description": "Only scour-critical bridges, when true"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_bridge
Get one bridge by its FHWA structure number (Item 8). Structure numbers are unique within a state; pass state to be exact. Returns the full decoded record. Read-only; no API key. If no bridge matches, the call errors; if state is omitted and the number matches in more than one state, the call errors, pass state to be exact. Use search_bridges instead for fuzzy or name-based lookups.
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Structure number, e.g. '016-0032'"
},
"state": {
"type": "string",
"description": "US state postal code, e.g. 'IL'"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_bridges_in_county
List bridges in one county (state + 3-digit FIPS county code), paged. Read-only lookup of the FHWA NBI 2025 annual snapshot; no API key. Results are decoded records ordered by state, county code, then structure number. limit defaults to 100 (max 1000); offset defaults to 0, pass offset in multiples of limit to page. Use search_bridges instead for filtered queries across counties, and get_county_summaries instead for county counts rather than individual bridges.
{
"type": "object",
"required": [
"state",
"county"
],
"properties": {
"limit": {
"type": "number",
"default": 100,
"description": "Max results, default 100, at most 1000"
},
"state": {
"type": "string",
"description": "US state postal code, e.g. 'IL'"
},
"county": {
"type": "string",
"description": "3-digit FIPS county code"
},
"offset": {
"type": "number",
"default": 0,
"description": "Results to skip for paging, default 0"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_worst_bridges
The worst-rated bridges in a state (condition = Poor), ordered by lowest component rating then age. State is required. Use for 'worst bridges in X' questions. Read-only; no API key. limit defaults to 50 (max 500) and controls how many worst bridges are returned. Use list_posted_or_closed_bridges instead for posted/closed bridges, and search_bridges instead for filtered queries.
{
"type": "object",
"required": [
"state"
],
"properties": {
"limit": {
"type": "number",
"default": 50,
"description": "Max results, default 50, at most 500"
},
"state": {
"type": "string",
"description": "US state postal code, e.g. 'IL'"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_posted_or_closed_bridges
Bridges in a state that are load-posted or closed to traffic (NBI Item 41 status P/R/K), worst condition first. Relevant for routing and heavy-haul feasibility, but per FHWA, NBI data must not be used as the sole source for route clearance; inspections can be up to ~24 months old. Read-only; no API key. limit defaults to 100 (max 1000); offset defaults to 0. Use get_worst_bridges instead for Poor-condition bridges regardless of posting status, and search_bridges instead for a narrower filter set.
{
"type": "object",
"required": [
"state"
],
"properties": {
"limit": {
"type": "number",
"default": 100,
"description": "Max results, default 100, at most 1000"
},
"state": {
"type": "string",
"description": "US state postal code, e.g. 'IL'"
},
"offset": {
"type": "number",
"default": 0,
"description": "Results to skip for paging, default 0"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}find_low_clearance_bridges
Bridges in a state whose vertical clearance is at or below max_height_m (or max_height_ft in feet, pass one, not both). Default clearance is over the roadway on the bridge (NBI Item 10); set under=true for the clearance under the bridge (Item 54B), which is what matters for routes passing beneath. Sentinel 'no restriction' values are excluded. Read-only; no API key. limit defaults to 100 (max 500). Use screen_corridor instead when you have a full vehicle profile, not just a height threshold.
{
"type": "object",
"required": [
"state"
],
"properties": {
"limit": {
"type": "number",
"default": 100,
"description": "Max results, default 100, at most 500"
},
"state": {
"type": "string",
"description": "US state postal code, e.g. 'IL'"
},
"under": {
"type": "boolean",
"default": false,
"description": "True for clearance under the bridge (Item 54B); false for clearance over the roadway (Item 10)"
},
"max_height_m": {
"type": "number",
"description": "Clearance threshold in meters, e.g. 4.0"
},
"max_height_ft": {
"type": "number",
"description": "Clearance threshold in feet, e.g. 14 — alternative to max_height_m"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_state_summary
Bridge summary for one state: total bridges, counts by condition (Good/Fair/Poor), posted and closed counts, scour-critical count, average year built, total deck area. Without a state, returns per-state totals with condition counts for all states.
{
"type": "object",
"properties": {
"state": {
"type": "string",
"description": "US state postal code, e.g. 'IL'"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_county_summaries
Per-county bridge counts for a state, with Poor-condition and posted/closed counts per county. Read-only; no API key. Returns one row per county present in the state data. Use get_state_summary instead for a statewide rollup, and list_bridges_in_county instead for individual bridges in one county.
{
"type": "object",
"required": [
"state"
],
"properties": {
"state": {
"type": "string",
"description": "US state postal code, e.g. 'IL'"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}find_bridges_nearby
Bridges near a point, nearest first. Pass lat/lon in decimal degrees; radius_km defaults to 10 (max 500). Each returned bridge carries distance_km. Bridges with no coordinates are excluded. Unlike the state-scoped tools, this one takes no state, the point is the scope. Read-only; no API key. limit defaults to 100 (max 1000).
{
"type": "object",
"required": [
"lat",
"lon"
],
"properties": {
"lat": {
"type": "number",
"description": "Latitude in decimal degrees, -90 to 90"
},
"lon": {
"type": "number",
"description": "Longitude in decimal degrees, -180 to 180"
},
"limit": {
"type": "number",
"default": 100,
"description": "Max results, default 100, at most 1000"
},
"radius_km": {
"type": "number",
"default": 10,
"description": "Search radius in km, greater than 0 and at most 500"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}screen_corridor
Screen a corridor for a vehicle profile: pass a route polyline as points (array of {lat, lon} objects tracing the actual road — submit a real route trace, not city points) plus a vehicle height and weight, and get back every bridge near the corridor that fails the profile, fails first then warnings, each nearest first with distance_km. Read-only: it checks data, it changes nothing. Height: pass one of height_ft or height_m. Weight: pass one of weight_lbs or weight_t (compared against the bridge operating rating in metric tons). buffer_km defaults to 2 (max 25) and sets how far from the polyline a bridge counts. pad_ft/pad_m (default 6 in) is added to the height before the clearance test. Fails: clearance below height plus pad (under-bridge clearance), posted below weight, closed, not yet open. Warnings, not failures: poor condition, unknown rating, unknown clearance. limit defaults to 100 (max 500); fails come first, warnings fill the remainder. Returns fails and warns arrays with fail_count and warn_count totals. Use this instead of find_bridges_nearby when you have a corridor, not a point, and instead of find_low_clearance_bridges when you have a full vehicle profile, not just a height threshold. This is a buffered-polyline screen, not a router: it does not produce directions. Data is the FHWA NBI 2025 annual snapshot, not live status, and bridges with no coordinates are excluded.
{
"type": "object",
"required": [
"points"
],
"properties": {
"limit": {
"type": "number",
"default": 100,
"description": "Max results returned, fails first then warnings, at most 500"
},
"pad_m": {
"type": "number",
"description": "Safety pad added to the height before the clearance test, in meters (default 0.15)"
},
"pad_ft": {
"type": "number",
"description": "Safety pad added to the height before the clearance test, in feet (default 6 in)"
},
"points": {
"type": "array",
"items": {
"type": "object",
"required": [
"lat",
"lon"
],
"properties": {
"lat": {
"type": "number",
"description": "Latitude in decimal degrees, -90 to 90"
},
"lon": {
"type": "number",
"description": "Longitude in decimal degrees, -180 to 180"
}
}
},
"description": "Route polyline tracing the actual road, as {lat, lon} points in decimal degrees (at least 2, at most 50). Submit a real route trace, not city points."
},
"height_m": {
"type": "number",
"description": "Vehicle height in meters, e.g. 4.11 — alternative to height_ft, pass one, not both"
},
"weight_t": {
"type": "number",
"description": "Vehicle gross weight in metric tons — alternative to weight_lbs, pass one, not both"
},
"buffer_km": {
"type": "number",
"default": 2,
"description": "Corridor half-width in km: bridges within this distance of the polyline count, greater than 0 and at most 25"
},
"height_ft": {
"type": "number",
"description": "Vehicle height in feet, e.g. 13.5 — alternative to height_m, pass one, not both"
},
"weight_lbs": {
"type": "number",
"description": "Vehicle gross weight in pounds, e.g. 80000 — alternative to weight_t, pass one, not both"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 326 ms
- 95th percentile latency
- 326 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 326 ms · metadata changed · 10 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http bridges-mcp-morningbrief https://bridges.morningbrief.link/mcpCodex
codex mcp add bridges-mcp-morningbrief --url https://bridges.morningbrief.link/mcpCursor
{
"mcpServers": {
"bridges-mcp-morningbrief": {
"url": "https://bridges.morningbrief.link/mcp"
}
}
}Cline
{
"mcpServers": {
"bridges-mcp-morningbrief": {
"type": "streamableHttp",
"url": "https://bridges.morningbrief.link/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"bridges-mcp-morningbrief": {
"type": "http",
"url": "https://bridges.morningbrief.link/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http bridges-mcp-morningbrief https://bridges.morningbrief.link/mcpClaude Desktop
{
"mcpServers": {
"bridges-mcp-morningbrief": {
"url": "https://bridges.morningbrief.link/mcp"
}
}
}Windsurf
{
"mcpServers": {
"bridges-mcp-morningbrief": {
"serverUrl": "https://bridges.morningbrief.link/mcp"
}
}
}Let your agent find its tools
Find servers like Bridges MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other data and analytics servers
Do you run Bridges MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.