{"name":"streethenge-mcp","title":"Streethenge MCP","version":"0.3.0","description":"Read-only Streethenge MCP server for finding geometric sunrise, sunset, moonrise, and moonset street alignments.","endpoint":"https://www.saulegatvis.lt/mcp","transport":"JSON-RPC 2.0 over HTTP POST","protocolVersion":"2025-03-26","docsUrl":"https://www.saulegatvis.lt/mcp-docs","privacyUrl":"https://www.saulegatvis.lt/privacy","supportEmail":"streethenge@gmail.com","rateLimit":"60 requests per minute per client IP on the public endpoint.","instructions":"Use data tools before render tools. Call render_alignment_card, render_road_choice_panel, or render_nearby_scan_panel only after the relevant data tool has returned complete real data. Do not render widgets with placeholder or partial payloads. If several road candidates share a street name, use lookup_roads to distinguish them before rendering.","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}},{"name":"render_alignment_card","title":"Render alignment card","description":"Use this only after calculate_alignment when you already have one selected street alignment with complete display fields. Pass schemaVersion: 1, card, and urls. Do not call it with partial data or placeholders.","inputSchema":{"type":"object","properties":{"schemaVersion":{"type":"number","const":1},"card":{"type":"object","properties":{"streetName":{"type":"string"},"placeName":{"type":"string"},"body":{"type":"string","enum":["sun","moon"]},"eventKind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"date":{"type":"string"},"localTime":{"type":"string"},"timeZone":{"type":"string"},"localTimeZoneAbbrev":{"type":"string"},"displayTime":{"type":"string"},"directionLabel":{"type":"string"},"azimuth":{"type":"number"},"bearing":{"type":"number"},"streetAxisDegrees":{"type":"number"},"lookDirectionDegrees":{"type":"number"},"angularDifference":{"type":"number"},"score":{"type":"number"},"quality":{"type":"string"},"caveat":{"type":"string"}},"required":["streetName","body","eventKind","date","localTime","directionLabel"],"additionalProperties":false},"urls":{"type":"object","properties":{"mapUrl":{"type":"string"},"liteUrl":{"type":"string"}},"required":["mapUrl","liteUrl"],"additionalProperties":false}},"required":["schemaVersion","card","urls"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"schemaVersion":{"type":"number","const":1},"card":{"type":"object","properties":{"streetName":{"type":"string"},"placeName":{"type":"string"},"body":{"type":"string","enum":["sun","moon"]},"eventKind":{"type":"string","enum":["sunrise","sunset","moonrise","moonset"]},"date":{"type":"string"},"localTime":{"type":"string"},"timeZone":{"type":"string"},"localTimeZoneAbbrev":{"type":"string"},"displayTime":{"type":"string"},"directionLabel":{"type":"string"},"azimuth":{"type":"number"},"bearing":{"type":"number"},"streetAxisDegrees":{"type":"number"},"lookDirectionDegrees":{"type":"number"},"angularDifference":{"type":"number"},"score":{"type":"number"},"quality":{"type":"string"},"caveat":{"type":"string"}},"required":["streetName","body","eventKind","date","localTime","directionLabel"],"additionalProperties":false},"urls":{"type":"object","properties":{"mapUrl":{"type":"string"},"liteUrl":{"type":"string"}},"required":["mapUrl","liteUrl"],"additionalProperties":false}},"required":["schemaVersion","card","urls"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"openai/outputTemplate":"ui://streethenge/alignment-card/v3","openai/toolInvocation/invoking":"Preparing alignment card","openai/toolInvocation/invoked":"Alignment card ready","ui":{"resourceUri":"ui://streethenge/alignment-card/v3"}}},{"name":"render_road_choice_panel","title":"Render road choice panel","description":"Use this only after lookup_roads when several candidate segments share a street name or the geometry is curved. Do not call it until you have the real road list to show.","inputSchema":{"type":"object","properties":{"placeName":{"type":"string"},"mapUrl":{"type":"string"},"liteUrl":{"type":"string"},"roads":{"type":"array","items":{"type":"object","properties":{"streetName":{"type":"string"},"name":{"type":"string"},"bearing":{"type":"number"},"directionLabel":{"type":"string"},"distanceMeters":{"type":"number"},"lengthMeters":{"type":"number"},"straightnessScore":{"type":"number"}},"required":["streetName","bearing","directionLabel","distanceMeters","lengthMeters","straightnessScore"],"additionalProperties":true}}},"required":["placeName","mapUrl","liteUrl","roads"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"placeName":{"type":"string"},"mapUrl":{"type":"string"},"liteUrl":{"type":"string"},"roads":{"type":"array","items":{"type":"object","properties":{"streetName":{"type":"string"},"name":{"type":"string"},"bearing":{"type":"number"},"directionLabel":{"type":"string"},"distanceMeters":{"type":"number"},"lengthMeters":{"type":"number"},"straightnessScore":{"type":"number"}},"required":["streetName","bearing","directionLabel","distanceMeters","lengthMeters","straightnessScore"],"additionalProperties":true}}},"required":["placeName","mapUrl","liteUrl","roads"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"openai/outputTemplate":"ui://streethenge/road-choice-panel/v3","openai/toolInvocation/invoking":"Preparing road choices","openai/toolInvocation/invoked":"Road choices ready","ui":{"resourceUri":"ui://streethenge/road-choice-panel/v3"}}},{"name":"render_nearby_scan_panel","title":"Render nearby scan panel","description":"Use this only after scan_alignments_nearby when you already have the real ranked event list. Do not call it with placeholders or before the scan result is available.","inputSchema":{"type":"object","properties":{"placeName":{"type":"string"},"body":{"type":"string","enum":["sun","moon"]},"mapUrl":{"type":"string"},"liteUrl":{"type":"string"},"events":{"type":"array","items":{"type":"object","properties":{"streetName":{"type":"string"},"kind":{"type":"string"},"date":{"type":"string"},"directionLabel":{"type":"string"},"score":{"type":"number"},"quality":{"type":"string"},"mapUrl":{"type":"string"}},"required":["streetName","kind","date","directionLabel","score","quality","mapUrl"],"additionalProperties":true}}},"required":["placeName","body","mapUrl","liteUrl","events"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"placeName":{"type":"string"},"body":{"type":"string","enum":["sun","moon"]},"mapUrl":{"type":"string"},"liteUrl":{"type":"string"},"events":{"type":"array","items":{"type":"object","properties":{"streetName":{"type":"string"},"kind":{"type":"string"},"date":{"type":"string"},"directionLabel":{"type":"string"},"score":{"type":"number"},"quality":{"type":"string"},"mapUrl":{"type":"string"}},"required":["streetName","kind","date","directionLabel","score","quality","mapUrl"],"additionalProperties":true}}},"required":["placeName","body","mapUrl","liteUrl","events"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"openai/outputTemplate":"ui://streethenge/nearby-scan-panel/v3","openai/toolInvocation/invoking":"Preparing nearby scan","openai/toolInvocation/invoked":"Nearby scan ready","ui":{"resourceUri":"ui://streethenge/nearby-scan-panel/v3"}}}],"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."},{"uri":"ui://streethenge/alignment-card/v3","name":"Streethenge alignment card","mimeType":"text/html;profile=mcp-app","description":"Compact visual card for one street alignment result.","_meta":{"openai/widgetDescription":"Compact visual card for one street alignment result.","ui":{"prefersBorder":true,"domain":"https://www.streethenge.com","csp":{"connectDomains":["https://streethenge.com","https://www.streethenge.com"],"resourceDomains":["https://streethenge.com","https://www.streethenge.com"]}}}},{"uri":"ui://streethenge/road-choice-panel/v3","name":"Streethenge road choice panel","mimeType":"text/html;profile=mcp-app","description":"Visual panel for distinguishing repeated or curved street candidates.","_meta":{"openai/widgetDescription":"Visual panel for distinguishing repeated or curved street candidates.","ui":{"prefersBorder":true,"domain":"https://www.streethenge.com","csp":{"connectDomains":["https://streethenge.com","https://www.streethenge.com"],"resourceDomains":["https://streethenge.com","https://www.streethenge.com"]}}}},{"uri":"ui://streethenge/nearby-scan-panel/v3","name":"Streethenge nearby scan panel","mimeType":"text/html;profile=mcp-app","description":"Visual panel for ranked nearby street-alignment opportunities.","_meta":{"openai/widgetDescription":"Visual panel for ranked nearby street-alignment opportunities.","ui":{"prefersBorder":true,"domain":"https://www.streethenge.com","csp":{"connectDomains":["https://streethenge.com","https://www.streethenge.com"],"resourceDomains":["https://streethenge.com","https://www.streethenge.com"]}}}}]}