Koskamo

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.

Bridges MCP logo, by Morning BriefVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Morning Brief
MCP endpoint (Streamable HTTP)
https://bridges.morningbrief.link/mcp
Vendor documentation

What 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

Vendor evidenceRegistry 1.1.0

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
Server-advertised capabilities
{
  "tools": {}
}

Tools

10 advertised

search_bridges
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_bridges input schema
{
  "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"
    }
  }
}
search_bridges annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_bridge
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_bridge input schema
{
  "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'"
    }
  }
}
get_bridge annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_bridges_in_county
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

list_bridges_in_county input schema
{
  "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"
    }
  }
}
list_bridges_in_county annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_worst_bridges
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_worst_bridges input schema
{
  "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'"
    }
  }
}
get_worst_bridges annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_posted_or_closed_bridges
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

list_posted_or_closed_bridges input schema
{
  "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"
    }
  }
}
list_posted_or_closed_bridges annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_low_clearance_bridges
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

find_low_clearance_bridges input schema
{
  "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"
    }
  }
}
find_low_clearance_bridges annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_state_summary
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_state_summary input schema
{
  "type": "object",
  "properties": {
    "state": {
      "type": "string",
      "description": "US state postal code, e.g. 'IL'"
    }
  }
}
get_state_summary annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_county_summaries
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_county_summaries input schema
{
  "type": "object",
  "required": [
    "state"
  ],
  "properties": {
    "state": {
      "type": "string",
      "description": "US state postal code, e.g. 'IL'"
    }
  }
}
get_county_summaries annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_bridges_nearby
Advertised by the server during the last successful anonymous check.
Advertised read-only

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).

find_bridges_nearby input schema
{
  "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"
    }
  }
}
find_bridges_nearby annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
screen_corridor
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

screen_corridor input schema
{
  "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"
    }
  }
}
screen_corridor annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http bridges-mcp-morningbrief https://bridges.morningbrief.link/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add bridges-mcp-morningbrief --url https://bridges.morningbrief.link/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable bridges-mcp-morningbrief in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "bridges-mcp-morningbrief": {
      "url": "https://bridges.morningbrief.link/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "bridges-mcp-morningbrief": {
      "type": "streamableHttp",
      "url": "https://bridges.morningbrief.link/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start bridges-mcp-morningbrief and inspect its tools.
VS Code configuration
{
  "servers": {
    "bridges-mcp-morningbrief": {
      "type": "http",
      "url": "https://bridges.morningbrief.link/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http bridges-mcp-morningbrief https://bridges.morningbrief.link/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "bridges-mcp-morningbrief": {
      "url": "https://bridges.morningbrief.link/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.

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.

Claim this listing