{"name":"streethenge-mcp","title":"Streethenge MCP","version":"0.4.0","description":"Read-only Streethenge MCP server for finding geometric sunrise, sunset, moonrise, and moonset street alignments.","endpoint":"https://www.streethenge.com/mcp","transport":"JSON-RPC 2.0 over HTTP POST","protocolVersion":"2025-03-26","docsUrl":"https://www.streethenge.com/mcp-docs","privacyUrl":"https://www.streethenge.com/privacy","supportEmail":"streethenge@gmail.com","rateLimit":"60 requests per minute per client IP on the public endpoint.","instructions":"Use search_place to resolve a place, lookup_roads to inspect nearby street bearings, and calculate_alignment or scan_alignments_nearby for results. If several road candidates share a street name, use lookup_roads to distinguish them before calculating. Results are returned as plain text with structured JSON data and links back to Streethenge.","tools":[{"name":"search_place","title":"Search place","description":"Use this when the user gives a street, address, landmark, or place name and you need candidate coordinates before looking up roads or calculating alignments. Returns Nominatim place candidates; next usually call lookup_roads for the chosen candidate.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Street, address, or place search text."},"locale":{"type":"string","description":"Optional UI/search locale, e.g. en or lt."}},"required":["query"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"places":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"displayName":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"country":{"type":"string"},"region":{"type":"string"},"city":{"type":"string"},"source":{"type":"string","const":"nominatim"}},"required":["id","name","displayName","latitude","longitude","source"],"additionalProperties":false}}},"required":["places"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"lookup_roads","title":"Lookup nearby roads","description":"Use this when latitude and longitude are known and the user needs nearby street candidates or a bearing for a selected point. Returns raw road geometries plus summarized candidate segments with direction labels. If several rows share a name, show their bearings and distances before choosing.","inputSchema":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"radius":{"type":"number","description":"Optional search radius in meters."}},"required":["lat","lon"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"roads":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"geometry":{"type":"array","items":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2}}},"required":["id","geometry"],"additionalProperties":false}},"roadSummaries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"geometry":{"type":"array","items":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2}},"bearing":{"type":"number"},"reverseBearing":{"type":"number"},"lengthMeters":{"type":"number"},"straightnessScore":{"type":"number"},"directionLabel":{"type":"string"}},"required":["id","geometry","bearing","reverseBearing","lengthMeters","straightnessScore","directionLabel"],"additionalProperties":false}},"nearest":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"geometry":{"type":"array","items":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2}},"bearing":{"type":"number"},"reverseBearing":{"type":"number"},"lengthMeters":{"type":"number"},"straightnessScore":{"type":"number"},"directionLabel":{"type":"string"}},"required":["id","geometry","bearing","reverseBearing","lengthMeters","straightnessScore","directionLabel"],"additionalProperties":false},{"type":"null"}]}},"required":["roads","roadSummaries","nearest"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"calculate_alignment","title":"Calculate street alignment","description":"Use this when latitude, longitude, and a street bearing are already known. Returns geometric sunrise/sunset or moonrise/moonset alignment windows, best events, timezone, and map/lite URLs. This does not search streets; call lookup_roads first if the bearing is unknown.","inputSchema":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"bearing":{"type":"number","description":"Street bearing in compass degrees."},"body":{"type":"string","enum":["sun","moon"]},"streetName":{"type":"string"},"placeName":{"type":"string"}},"required":["lat","lon","bearing"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"body":{"type":"string","enum":["sun","moon"]},"timeZone":{"type":"string"},"urls":{"type":"object","properties":{"mapUrl":{"type":"string"},"liteUrl":{"type":"string"}},"required":["mapUrl","liteUrl"],"additionalProperties":false},"best":{"type":"object","properties":{"sunrise":{"type":"object","properties":{"kind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"date":{"type":"string"},"timestamp":{"type":"string"},"localDate":{"type":"string"},"localTime":{"type":"string"},"timeZone":{"type":"string"},"localTimeZoneAbbrev":{"type":"string"},"displayTime":{"type":"string"},"azimuth":{"type":"number"},"streetBearing":{"type":"number"},"matchedBearing":{"type":"number"},"angularDifference":{"type":"number"},"score":{"type":"number"},"quality":{"type":"string"}},"required":["kind","date","timestamp","localDate","localTime","timeZone","localTimeZoneAbbrev","displayTime","azimuth","streetBearing","matchedBearing","angularDifference","score","quality"],"additionalProperties":false},"sunset":{"type":"object","properties":{"kind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"date":{"type":"string"},"timestamp":{"type":"string"},"localDate":{"type":"string"},"localTime":{"type":"string"},"timeZone":{"type":"string"},"localTimeZoneAbbrev":{"type":"string"},"displayTime":{"type":"string"},"azimuth":{"type":"number"},"streetBearing":{"type":"number"},"matchedBearing":{"type":"number"},"angularDifference":{"type":"number"},"score":{"type":"number"},"quality":{"type":"string"}},"required":["kind","date","timestamp","localDate","localTime","timeZone","localTimeZoneAbbrev","displayTime","azimuth","streetBearing","matchedBearing","angularDifference","score","quality"],"additionalProperties":false}},"required":["sunrise","sunset"],"additionalProperties":false},"upcoming":{"type":"object","properties":{"sunrise":{"type":"object","properties":{"kind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"date":{"type":"string"},"timestamp":{"type":"string"},"localDate":{"type":"string"},"localTime":{"type":"string"},"timeZone":{"type":"string"},"localTimeZoneAbbrev":{"type":"string"},"displayTime":{"type":"string"},"azimuth":{"type":"number"},"streetBearing":{"type":"number"},"matchedBearing":{"type":"number"},"angularDifference":{"type":"number"},"score":{"type":"number"},"quality":{"type":"string"}},"required":["kind","date","timestamp","localDate","localTime","timeZone","localTimeZoneAbbrev","displayTime","azimuth","streetBearing","matchedBearing","angularDifference","score","quality"],"additionalProperties":false},"sunset":{"type":"object","properties":{"kind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"date":{"type":"string"},"timestamp":{"type":"string"},"localDate":{"type":"string"},"localTime":{"type":"string"},"timeZone":{"type":"string"},"localTimeZoneAbbrev":{"type":"string"},"displayTime":{"type":"string"},"azimuth":{"type":"number"},"streetBearing":{"type":"number"},"matchedBearing":{"type":"number"},"angularDifference":{"type":"number"},"score":{"type":"number"},"quality":{"type":"string"}},"required":["kind","date","timestamp","localDate","localTime","timeZone","localTimeZoneAbbrev","displayTime","azimuth","streetBearing","matchedBearing","angularDifference","score","quality"],"additionalProperties":false}},"required":["sunrise","sunset"],"additionalProperties":false},"sunriseWindows":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"startDate":{"type":"string"},"endDate":{"type":"string"},"peak":{"type":"object","properties":{"kind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"date":{"type":"string"},"timestamp":{"type":"string"},"localDate":{"type":"string"},"localTime":{"type":"string"},"timeZone":{"type":"string"},"localTimeZoneAbbrev":{"type":"string"},"displayTime":{"type":"string"},"azimuth":{"type":"number"},"streetBearing":{"type":"number"},"matchedBearing":{"type":"number"},"angularDifference":{"type":"number"},"score":{"type":"number"},"quality":{"type":"string"}},"required":["kind","date","timestamp","localDate","localTime","timeZone","localTimeZoneAbbrev","displayTime","azimuth","streetBearing","matchedBearing","angularDifference","score","quality"],"additionalProperties":false},"days":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"date":{"type":"string"},"timestamp":{"type":"string"},"localDate":{"type":"string"},"localTime":{"type":"string"},"timeZone":{"type":"string"},"localTimeZoneAbbrev":{"type":"string"},"displayTime":{"type":"string"},"azimuth":{"type":"number"},"streetBearing":{"type":"number"},"matchedBearing":{"type":"number"},"angularDifference":{"type":"number"},"score":{"type":"number"},"quality":{"type":"string"}},"required":["kind","date","timestamp","localDate","localTime","timeZone","localTimeZoneAbbrev","displayTime","azimuth","streetBearing","matchedBearing","angularDifference","score","quality"],"additionalProperties":false}}},"required":["kind","startDate","endDate","peak","days"],"additionalProperties":false}},"sunsetWindows":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"startDate":{"type":"string"},"endDate":{"type":"string"},"peak":{"type":"object","properties":{"kind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"date":{"type":"string"},"timestamp":{"type":"string"},"localDate":{"type":"string"},"localTime":{"type":"string"},"timeZone":{"type":"string"},"localTimeZoneAbbrev":{"type":"string"},"displayTime":{"type":"string"},"azimuth":{"type":"number"},"streetBearing":{"type":"number"},"matchedBearing":{"type":"number"},"angularDifference":{"type":"number"},"score":{"type":"number"},"quality":{"type":"string"}},"required":["kind","date","timestamp","localDate","localTime","timeZone","localTimeZoneAbbrev","displayTime","azimuth","streetBearing","matchedBearing","angularDifference","score","quality"],"additionalProperties":false},"days":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"date":{"type":"string"},"timestamp":{"type":"string"},"localDate":{"type":"string"},"localTime":{"type":"string"},"timeZone":{"type":"string"},"localTimeZoneAbbrev":{"type":"string"},"displayTime":{"type":"string"},"azimuth":{"type":"number"},"streetBearing":{"type":"number"},"matchedBearing":{"type":"number"},"angularDifference":{"type":"number"},"score":{"type":"number"},"quality":{"type":"string"}},"required":["kind","date","timestamp","localDate","localTime","timeZone","localTimeZoneAbbrev","displayTime","azimuth","streetBearing","matchedBearing","angularDifference","score","quality"],"additionalProperties":false}}},"required":["kind","startDate","endDate","peak","days"],"additionalProperties":false}}},"required":["body","timeZone","urls","best","upcoming","sunriseWindows","sunsetWindows"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"scan_alignments_nearby","title":"Scan nearby alignments","description":"Use this when the user asks for possible alignment opportunities near an area rather than for one known street. This is heavier than calculate_alignment because it calls Overpass to scan named nearby streets; keep radius modest and explain that third-party availability may affect results.","inputSchema":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"radius":{"type":"number","description":"Optional scan radius in meters."},"body":{"type":"string","enum":["sun","moon"]},"placeName":{"type":"string"}},"required":["lat","lon"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"body":{"type":"string","enum":["sun","moon"]},"urls":{"type":"object","properties":{"mapUrl":{"type":"string"},"liteUrl":{"type":"string"}},"required":["mapUrl","liteUrl"],"additionalProperties":false},"events":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"timestamp":{"type":"string"},"kind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"quality":{"type":"string"},"score":{"type":"number"},"direction":{"type":"number"},"streetName":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"bearing":{"type":"number"},"otherStreets":{"type":"array","items":{"type":"string"}},"otherStreetCount":{"type":"number"}},"required":["date","timestamp","kind","quality","score","direction","streetName","latitude","longitude","bearing","otherStreets","otherStreetCount"],"additionalProperties":false}}},"required":["body","urls","events"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"build_alignment_urls","title":"Build alignment URLs","description":"Use this when you already have coordinates and bearing and only need shareable Streethenge URLs. Returns the full map URL and lower-bandwidth lite URL; it does not calculate dates.","inputSchema":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"bearing":{"type":"number"},"streetName":{"type":"string"},"placeName":{"type":"string"},"body":{"type":"string","enum":["sun","moon"]}},"required":["lat","lon","bearing"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"mapUrl":{"type":"string"},"liteUrl":{"type":"string"}},"required":["mapUrl","liteUrl"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"build_scan_urls","title":"Build scan URLs","description":"Use this when you already have area coordinates and only need shareable URLs for the nearby-scan flow. Returns the full map URL and lower-bandwidth lite URL; it does not call Overpass.","inputSchema":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"placeName":{"type":"string"}},"required":["lat","lon"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"mapUrl":{"type":"string"},"liteUrl":{"type":"string"}},"required":["mapUrl","liteUrl"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}],"resources":[{"uri":"site://streethenge/home","name":"Home","mimeType":"text/markdown","description":"Map-first public route summary."},{"uri":"site://streethenge/lite","name":"Lite","mimeType":"text/markdown","description":"Lower-bandwidth no-map route summary."},{"uri":"site://streethenge/about","name":"About","mimeType":"text/markdown","description":"Origin story and project framing."},{"uri":"site://streethenge/privacy","name":"Privacy","mimeType":"text/markdown","description":"Local storage, map services, and analytics note."},{"uri":"site://streethenge/terms","name":"Terms","mimeType":"text/markdown","description":"Short public terms of use."},{"uri":"site://streethenge/send-photo","name":"Send photo","mimeType":"text/markdown","description":"Photo submission instructions and rights note."},{"uri":"site://streethenge/llms","name":"llms.txt","mimeType":"text/plain","description":"Curated LLM-readable summary and route index."}],"note":"POST JSON-RPC requests here for initialize, tools, resources, and tool calls."}