Koskamo

SafeStreets MCP

An MCP server that provides walkability and pedestrian safety intelligence for any US address. It returns composite walkability scores (0-10), compares neighborhoods, ranks areas, lists roads with pedestrian fatalities using NHTSA FARS data, and searches SafeStreets research. It supports agent tasks like assessing neighborhood safety, evaluating 15-minute city access, and analyzing transit reach.

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.

SafeStreets MCP logo, by Streets & CommonsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Streets & Commons
You need:A free API key gives your own allowance of 10,000 calls a month.
MCP endpoint (Streamable HTTP)
https://safestreets.streetsandcommons.com/mcp
Vendor documentation

What you can do with it

  • Score walkability for a specific US address
  • Compare walkability between two neighborhoods
  • List roads where pedestrians were killed
  • Search SafeStreets research data

Source and maintenance

Community listingRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
safestreets 1.0.0
MCP protocol
2025-06-18
Tools
8 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Tools

8 advertised

get_walkability_score
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Score a US location on how good and how safe it is to walk, from a street address or from latitude/longitude. Call this when someone asks whether a place is walkable, how safe it is to walk, whether they could live somewhere without a car, how a neighborhood compares to another on foot, or when evaluating a specific address or property for walkability or pedestrian risk. The server geocodes an address itself. Coordinates estimated from memory can land on a different place, which then gets a confident score of its own. When an address is given, the reply carries resolvedFrom with the address that was matched. Returns a JSON object: overallScore 0-100 composite displayScore the same score as 0-10, which is how SafeStreets presents it grade A to F tier plain label, e.g. "Very walkable", "Car-dependent" confidence 0-100, how much underlying data was available for this point reportUrl the full SafeStreets report for this point: map, metrics, PDF dataSources the sources that fed this specific result components four scored sub-dimensions, each with a 0-100 score and the individual metrics behind it: dailyReach errands reachable on foot streetSafety street design and pedestrian crash risk transitReach usable transit access walkingComfort shade, heat, air quality, surface plus networkDesign, which carries its metrics (network density, intersection density, block length, dead-end ratio) but reports score 0 at weight 0, so it does not contribute to the composite. Read its metrics, not its score. The keys safety, environmentalComfort and densityContext are backward-compatibility aliases of streetSafety, walkingComfort and dailyReach. They duplicate those objects rather than adding signal. The per-component metrics are the point: you can re-weight or rebuild the composite yourself instead of trusting one number. Coverage and limits: United States only. Pedestrian crash inputs are county-level, so two nearby points can share crash figures. Where the underlying crash record is missing, the safety component is reported as unavailable rather than guessed, and confidence drops accordingly. This does not return driving directions, transit timetables, crime statistics, or property listings.

get_walkability_score input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "lat": {
      "type": "number",
      "maximum": 90,
      "minimum": -90,
      "description": "Latitude in decimal degrees, WGS84. US locations only. Required unless address is given."
    },
    "lon": {
      "type": "number",
      "maximum": 180,
      "minimum": -180,
      "description": "Longitude in decimal degrees, WGS84. Negative for the US. Required unless address is given."
    },
    "address": {
      "type": "string",
      "description": "A US street address, intersection or place name, e.g. \"1200 W Foster Ave, Chicago\". Give this or lat/lon. The server geocodes it, so it is the reliable input when exact coordinates are not known."
    }
  }
}
get_walkability_score annotations
{
  "title": "Score an address for walkability",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_locations
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Score 2 to 10 US locations and say how they differ. Use this for "which of these is the most walkable", choosing between addresses, or any question that puts places side by side. Give addresses or coordinates, and a label for each if you want the results matched back to your own names. Returns every location ranked, the best and worst, the spread between them, and the gap on each component. The per-component gap is usually the answer: two places can reach the same composite for opposite reasons, one with errands close by and dangerous streets, the other the reverse. A location that cannot be resolved is reported in errors and the rest are still scored. Each location counts as one call against your allowance.

compare_locations input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "locations"
  ],
  "properties": {
    "locations": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "maximum": 90,
            "minimum": -90
          },
          "lon": {
            "type": "number",
            "maximum": 180,
            "minimum": -180
          },
          "label": {
            "type": "string",
            "description": "Your name for this location, echoed back so you can match results to inputs."
          },
          "address": {
            "type": "string",
            "description": "A US address. Give this or lat/lon."
          }
        }
      },
      "maxItems": 10,
      "minItems": 1,
      "description": "The places to compare."
    }
  }
}
compare_locations annotations
{
  "title": "Compare locations for walkability",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
score_many
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Score up to 10 US locations in one request. Use this for a list: properties, branches, listings, sites. Each location counts as one call against your allowance, so a list of ten costs ten. A location that cannot be resolved is reported in errors rather than failing the request.

score_many input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "locations"
  ],
  "properties": {
    "locations": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "maximum": 90,
            "minimum": -90
          },
          "lon": {
            "type": "number",
            "maximum": 180,
            "minimum": -180
          },
          "label": {
            "type": "string",
            "description": "Your name for this location, echoed back so you can match results to inputs."
          },
          "address": {
            "type": "string",
            "description": "A US address. Give this or lat/lon."
          }
        }
      },
      "maxItems": 10,
      "minItems": 1,
      "description": "The places to score."
    }
  }
}
score_many annotations
{
  "title": "Score a list of locations",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_city_walkability
Advertised by the server during the last successful anonymous check.
Advertised read-only

Walkability score for a whole US city, precomputed. Instant, no analysis. Use this for "how walkable is Houston" rather than scoring a point inside it. Returns the 0-100 composite, the same score as 0-10, the tier, and the four components. Covers 203 cities; a city not in the set returns null, which means not covered rather than not walkable.

get_city_walkability input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "city"
  ],
  "properties": {
    "city": {
      "type": "string",
      "description": "City name or slug, e.g. \"Houston\", \"fort worth\", \"chicago\"."
    }
  }
}
get_city_walkability annotations
{
  "title": "City walkability score",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_walkable_neighborhoods
Advertised by the server during the last successful anonymous check.
Advertised read-only

Neighborhoods inside a US city, ranked most walkable first, precomputed. Use this for "which part of Chicago should I live in without a car". Returns up to 25 neighborhoods, each with its 0-10 score, tier and components. Covers 749 neighborhoods across the cities analysed so far, so an empty list means that city has not been broken down yet, not that it has no walkable areas.

find_walkable_neighborhoods input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "city"
  ],
  "properties": {
    "city": {
      "type": "string",
      "description": "City name or slug, e.g. \"Chicago\"."
    },
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1,
      "description": "How many to return, default 25."
    }
  }
}
find_walkable_neighborhoods annotations
{
  "title": "Most walkable neighborhoods in a city",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_neighborhoods
Advertised by the server during the last successful anonymous check.
Advertised read-only

Ranked neighborhood search across every US neighborhood (202,000+), for "where should I move" questions. Use this when someone is relocating and has not picked a town yet: filter to a county set, a metro, a state, a home-price ceiling or a walkability floor, then rank by walkability, transit, zero-car share, demand or home value. Each row carries median home value, median income, price-to-income ratio, commute mode shares, zero-car household share, and where available year-over-year home value growth and property tax rate — so walkability can be read alongside what living there costs. Counties are addressed by 5-digit state+county FIPS codes because county names repeat across states (there are Delaware Counties in PA, OH, NY and IN). Example: Chester PA 42029, Delaware PA 42045, Montgomery PA 42091, New Castle DE 10003. walkabilityIndex is the EPA National Walkability Index on its 1-20 scale, with a national percentile beside it, and sort_by "walk" ranks on it. It is a different scale from the 0-100 SafeStreets score, which comes from scoring one address.

search_neighborhoods input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Rows to return, default 25, max 100."
    },
    "metro": {
      "type": "string",
      "description": "Metro name substring, e.g. \"Philadelphia\". Give any of county, metro or state."
    },
    "state": {
      "type": "string",
      "description": "Two-letter state code, e.g. \"PA\"."
    },
    "county": {
      "type": "string",
      "description": "Comma-separated 5-digit state+county FIPS codes, e.g. \"42029,42045,42091,10003\". The precise way to scope a county set."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Pagination offset."
    },
    "sort_by": {
      "enum": [
        "demand",
        "walk",
        "home",
        "transit",
        "zero_car",
        "afford",
        "wfh",
        "pi_ratio"
      ],
      "type": "string",
      "description": "Ranking field, default \"demand\"."
    },
    "sort_dir": {
      "enum": [
        "asc",
        "desc"
      ],
      "type": "string",
      "description": "Default \"desc\"."
    },
    "walk_min": {
      "type": "number",
      "description": "Minimum EPA walkability index (1-20 scale)."
    },
    "budget_max": {
      "type": "number",
      "description": "Maximum median home value in USD; neighborhoods above it are dropped."
    },
    "transit_min": {
      "type": "number",
      "description": "Minimum transit percentile (0-100)."
    }
  }
}
search_neighborhoods annotations
{
  "title": "Search US neighborhoods",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_dangerous_corridors
Advertised by the server during the last successful anonymous check.
Advertised read-only

Road corridors where pedestrians were actually killed, from federal crash records. Source: NHTSA FARS 2022-2024 (PER_TYP=5, INJ_SEV in 4,6). Each corridor carries the road name, the city, the total pedestrian deaths and a per-year breakdown, so a claim can be checked rather than taken on trust. Give either a city, or a lat/lon with an optional radius. Use this when someone asks which roads are dangerous, where crashes happen, or wants evidence for a specific street. These are recorded deaths, not a model or a prediction: a road absent from the list had no recorded pedestrian fatality in the period, which is not the same as being safe.

get_dangerous_corridors input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "lat": {
      "type": "number",
      "maximum": 90,
      "minimum": -90,
      "description": "Latitude, to search around a point."
    },
    "lon": {
      "type": "number",
      "maximum": 180,
      "minimum": -180,
      "description": "Longitude, to search around a point."
    },
    "city": {
      "type": "string",
      "description": "City name or slug. Give this or lat/lon."
    },
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1,
      "description": "How many to return, default 25."
    },
    "radiusKm": {
      "type": "number",
      "maximum": 50,
      "minimum": 0.1,
      "description": "Search radius in km around lat/lon, default 10."
    }
  }
}
get_dangerous_corridors annotations
{
  "title": "Roads where pedestrians were killed",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_insights
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search SafeStreets' published research on walkability, street design and pedestrian safety. Returns the article title, summary, URL and its published questions and answers, so a finding can be quoted and linked rather than paraphrased from memory. 32 articles, each built on named public sources. Use this when someone asks what the evidence says, wants a figure they can cite, or asks a general question about walkability that is not about one specific location.

search_insights input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 10,
      "minimum": 1,
      "description": "How many articles, default 5."
    },
    "query": {
      "type": "string",
      "description": "What to look for, e.g. \"car free cities\", \"arterial roads\", \"kids walking to school\"."
    }
  }
}
search_insights annotations
{
  "title": "Search SafeStreets research",
  "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
360 ms
95th percentile latency
360 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 360 ms · metadata changed · 8 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 safestreets-mcp https://safestreets.streetsandcommons.com/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 safestreets-mcp --url https://safestreets.streetsandcommons.com/mcp

Cursor

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

Cline

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

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start safestreets-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "safestreets-mcp": {
      "type": "http",
      "url": "https://safestreets.streetsandcommons.com/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 safestreets-mcp https://safestreets.streetsandcommons.com/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": {
    "safestreets-mcp": {
      "url": "https://safestreets.streetsandcommons.com/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": {
    "safestreets-mcp": {
      "serverUrl": "https://safestreets.streetsandcommons.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like SafeStreets MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.