{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_hk3qrwux4phq","handle":"umbra-open-sar-archive","url":"https://wellknown.network/agents/umbra-open-sar-archive","links":{"self":"https://wellknown.network/agents/umbra-open-sar-archive/record.json","html":"https://wellknown.network/agents/umbra-open-sar-archive","markdown":"https://wellknown.network/agents/umbra-open-sar-archive/record.md","api":"https://wellknown.network/api/v1/agents/umbra-open-sar-archive","status":"https://wellknown.network/api/v1/agents/umbra-open-sar-archive/status","claim":"https://wellknown.network/agents/umbra-open-sar-archive/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/umbra-open-sar-archive/claim.json","badge":"https://wellknown.network/agents/umbra-open-sar-archive/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/umbra-open-sar-archive/history","tools":"https://wellknown.network/api/v1/agents/umbra-open-sar-archive/tools"},"ard":{"identifier":"urn:air:api.umbra-py.space:server:umbra-open-sar-archive","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Umbra open SAR archive","summary":"Search, preview, and measure Umbra open SAR from any MCP client. Umbra ships no search API.","description":"Search, preview, and measure Umbra open SAR from any MCP client. Umbra ships no search API.","publisher":{"name":"reesehammer","url":null},"homepage":"https://umbra-py.space/","repository":"https://github.com/reesehammer/umbra-py","version":"0.1.4","license":null,"protocols":["mcp"],"tags":["earth-observation","geospatial","gis","remote-sensing","sar","stac","synthetic-aperture-radar","umbra"],"pricing":null,"endpoints":[{"url":"https://api.umbra-py.space/mcp","type":"mcp_streamable_http","auth":null,"probeable":true},{"url":"pypi:umbra-py","type":"package_pypi","auth":null,"probeable":false}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-10-26T21:44:00.174192Z","publishedAt":"2026-10-26T21:44:00.174192Z","registryName":"io.github.reesehammer/umbra-mcp"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","repoUrl":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"pypi","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"commerce.ecommerce","name":"E-commerce Operations","confidence":1,"provenance":"derived"},{"slug":"dev.monitoring","name":"Monitoring & Observability","confidence":0.554,"provenance":"derived"},{"slug":"content.writing","name":"Writing & Editing","confidence":0.54,"provenance":"derived"}],"categories":["commerce","content","dev"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 6h ago.","lastOkAt":"2026-11-02T07:26:20.508Z","lastProbedAt":"2026-11-02T07:26:20.508Z","statusComputedAt":"2026-11-02T07:28:25.999Z","reliability30d":{"probes":20,"successRate":1,"p50Ms":162,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":20,"ok":20,"authBoundaryOk":0,"serviceOk":20,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-11-02T07:26:20.508Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":162,"error":null,"detail":{"tools":[{"name":"search_catalog","description":"Search Umbra's catalog and return compact context cards.\n\n    Filters (all optional, combine freely): ``bbox`` as\n    ``[min_lon, min_lat, max_lon, max_lat]`` i"},{"name":"find_repeat_sites","description":"Rank the archive's most repeat-imaged sites — where change detection has\n    something to measure.\n\n    The discovery step *before* every analysis verb. ``chang"},{"name":"get_item","description":"Return the full context card for one item.\n\n    ``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other\n    product) filename such as ``2025-"},{"name":"geocode_place","description":"Resolve a free-text place name to a bounding box via Nominatim.\n\n    Returns ``{\"bbox\": [min_lon, min_lat, max_lon, max_lat], \"display_name\":\n    ...}`` so the "},{"name":"index_stats","description":"Report on the local catalog index, if one has been built or fetched.\n\n    Lets a long-running agent decide whether searches will be instant (index\n    present) "},{"name":"quicklook","description":"Return a scene's quicklook PNG as an image block.\n\n    Prefers a baked catalog preview (``preview=\"auto\"``, the default) so a\n    public host can show the radar"},{"name":"change_composite","description":"Composite 2-3 passes of one site into a change image.\n\n    Pass the STAC URLs of two or three acquisitions of the *same* site in time\n    order. Colors encode c"},{"name":"timescan","description":"Summarize a whole time series into one activity image.\n\n    Pass the STAC URLs of a site's passes; the timescan encodes per-pixel\n    temporal statistics so bri"},{"name":"stack_stats","description":"Measure how much a site changed across its passes, as numbers.\n\n    The quantitative counterpart to ``change_composite`` / ``timescan``: those\n    return a pict"},{"name":"stack_provenance","description":"Check whether a site's passes are one measurement, before measuring them.\n\n    ``stack_stats`` refuses a selection whose rasters were made by *different*\n    ``"},{"name":"pick_change_interval","description":"Scan a site's whole series and name the two passes worth narrating.\n\n    The deterministic first half of the \"watch a site over time\" story, and the\n    step th"},{"name":"download_asset","description":"Download one asset of an item to local disk, gated by a size check.\n\n    SAR products can be multiple GB, so this is a two-step handshake: call it\n    first wit"},{"name":"watch_site","description":"Report only the acquisitions **new** since the last check of this site.\n\n    SAR's value for monitoring is its cadence, so the natural workflow is\n    *standing"},{"name":"find_similar","description":"Find archived scenes that **look like** the acquisition at ``url``.\n\n    This is the one search that lives in the pixels, not the metadata: where\n    ``search_c"},{"name":"find_similar_text","description":"Find archived scenes matching a plain-language ``query`` over their imagery.\n\n    Text-to-scene search: embeds ``query`` (\"ships at a berth\", \"a flooded field\")"},{"name":"describe_scene","description":"Return a SAR-literate reading of the scene at ``url``.\n\n    The picture and the metadata card are produced deterministically; a model\n    only interprets them. "},{"name":"narrate_change","description":"Return a grounded reading of *what changed* between passes.\n\n    Sibling of :func:`describe_scene`. The composite and the per-block dB grid\n    are produced det"},{"name":"stamp_description","description":"Validate a client-produced scene reading and stamp provenance.\n\n    This is the interpretation boundary for the no-key kit path: you read the\n    picture ``desc"},{"name":"stamp_narration","description":"Validate a client-produced change narration and stamp provenance.\n\n    Sibling of :func:`stamp_description` for the no-key ``narrate_change``\n    kit. Pass the "}],"toolCount":19,"toolsHash":"ad6220c21c3103a2c9f96302457760c6c40b8450b46ada02e31d06fc19817b35","serverName":"umbra","capabilities":["prompts","resources","tools"],"serverVersion":"0.1.4","protocolVersion":"2025-06-18"}},{"at":"2026-11-01T23:23:40.401Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":161,"error":null,"detail":{"tools":[{"name":"search_catalog","description":"Search Umbra's catalog and return compact context cards.\n\n    Filters (all optional, combine freely): ``bbox`` as\n    ``[min_lon, min_lat, max_lon, max_lat]`` i"},{"name":"find_repeat_sites","description":"Rank the archive's most repeat-imaged sites — where change detection has\n    something to measure.\n\n    The discovery step *before* every analysis verb. ``chang"},{"name":"get_item","description":"Return the full context card for one item.\n\n    ``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other\n    product) filename such as ``2025-"},{"name":"geocode_place","description":"Resolve a free-text place name to a bounding box via Nominatim.\n\n    Returns ``{\"bbox\": [min_lon, min_lat, max_lon, max_lat], \"display_name\":\n    ...}`` so the "},{"name":"index_stats","description":"Report on the local catalog index, if one has been built or fetched.\n\n    Lets a long-running agent decide whether searches will be instant (index\n    present) "},{"name":"quicklook","description":"Return a scene's quicklook PNG as an image block.\n\n    Prefers a baked catalog preview (``preview=\"auto\"``, the default) so a\n    public host can show the radar"},{"name":"change_composite","description":"Composite 2-3 passes of one site into a change image.\n\n    Pass the STAC URLs of two or three acquisitions of the *same* site in time\n    order. Colors encode c"},{"name":"timescan","description":"Summarize a whole time series into one activity image.\n\n    Pass the STAC URLs of a site's passes; the timescan encodes per-pixel\n    temporal statistics so bri"},{"name":"stack_stats","description":"Measure how much a site changed across its passes, as numbers.\n\n    The quantitative counterpart to ``change_composite`` / ``timescan``: those\n    return a pict"},{"name":"stack_provenance","description":"Check whether a site's passes are one measurement, before measuring them.\n\n    ``stack_stats`` refuses a selection whose rasters were made by *different*\n    ``"},{"name":"pick_change_interval","description":"Scan a site's whole series and name the two passes worth narrating.\n\n    The deterministic first half of the \"watch a site over time\" story, and the\n    step th"},{"name":"download_asset","description":"Download one asset of an item to local disk, gated by a size check.\n\n    SAR products can be multiple GB, so this is a two-step handshake: call it\n    first wit"},{"name":"watch_site","description":"Report only the acquisitions **new** since the last check of this site.\n\n    SAR's value for monitoring is its cadence, so the natural workflow is\n    *standing"},{"name":"find_similar","description":"Find archived scenes that **look like** the acquisition at ``url``.\n\n    This is the one search that lives in the pixels, not the metadata: where\n    ``search_c"},{"name":"find_similar_text","description":"Find archived scenes matching a plain-language ``query`` over their imagery.\n\n    Text-to-scene search: embeds ``query`` (\"ships at a berth\", \"a flooded field\")"},{"name":"describe_scene","description":"Return a SAR-literate reading of the scene at ``url``.\n\n    The picture and the metadata card are produced deterministically; a model\n    only interprets them. "},{"name":"narrate_change","description":"Return a grounded reading of *what changed* between passes.\n\n    Sibling of :func:`describe_scene`. The composite and the per-block dB grid\n    are produced det"},{"name":"stamp_description","description":"Validate a client-produced scene reading and stamp provenance.\n\n    This is the interpretation boundary for the no-key kit path: you read the\n    picture ``desc"},{"name":"stamp_narration","description":"Validate a client-produced change narration and stamp provenance.\n\n    Sibling of :func:`stamp_description` for the no-key ``narrate_change``\n    kit. Pass the "}],"toolCount":19,"toolsHash":"ad6220c21c3103a2c9f96302457760c6c40b8450b46ada02e31d06fc19817b35","serverName":"umbra","capabilities":["prompts","resources","tools"],"serverVersion":"0.1.4","protocolVersion":"2025-06-18"}},{"at":"2026-11-01T15:27:37.332Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":158,"error":null,"detail":{"tools":[{"name":"search_catalog","description":"Search Umbra's catalog and return compact context cards.\n\n    Filters (all optional, combine freely): ``bbox`` as\n    ``[min_lon, min_lat, max_lon, max_lat]`` i"},{"name":"find_repeat_sites","description":"Rank the archive's most repeat-imaged sites — where change detection has\n    something to measure.\n\n    The discovery step *before* every analysis verb. ``chang"},{"name":"get_item","description":"Return the full context card for one item.\n\n    ``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other\n    product) filename such as ``2025-"},{"name":"geocode_place","description":"Resolve a free-text place name to a bounding box via Nominatim.\n\n    Returns ``{\"bbox\": [min_lon, min_lat, max_lon, max_lat], \"display_name\":\n    ...}`` so the "},{"name":"index_stats","description":"Report on the local catalog index, if one has been built or fetched.\n\n    Lets a long-running agent decide whether searches will be instant (index\n    present) "},{"name":"quicklook","description":"Return a scene's quicklook PNG as an image block.\n\n    Prefers a baked catalog preview (``preview=\"auto\"``, the default) so a\n    public host can show the radar"},{"name":"change_composite","description":"Composite 2-3 passes of one site into a change image.\n\n    Pass the STAC URLs of two or three acquisitions of the *same* site in time\n    order. Colors encode c"},{"name":"timescan","description":"Summarize a whole time series into one activity image.\n\n    Pass the STAC URLs of a site's passes; the timescan encodes per-pixel\n    temporal statistics so bri"},{"name":"stack_stats","description":"Measure how much a site changed across its passes, as numbers.\n\n    The quantitative counterpart to ``change_composite`` / ``timescan``: those\n    return a pict"},{"name":"stack_provenance","description":"Check whether a site's passes are one measurement, before measuring them.\n\n    ``stack_stats`` refuses a selection whose rasters were made by *different*\n    ``"},{"name":"pick_change_interval","description":"Scan a site's whole series and name the two passes worth narrating.\n\n    The deterministic first half of the \"watch a site over time\" story, and the\n    step th"},{"name":"download_asset","description":"Download one asset of an item to local disk, gated by a size check.\n\n    SAR products can be multiple GB, so this is a two-step handshake: call it\n    first wit"},{"name":"watch_site","description":"Report only the acquisitions **new** since the last check of this site.\n\n    SAR's value for monitoring is its cadence, so the natural workflow is\n    *standing"},{"name":"find_similar","description":"Find archived scenes that **look like** the acquisition at ``url``.\n\n    This is the one search that lives in the pixels, not the metadata: where\n    ``search_c"},{"name":"find_similar_text","description":"Find archived scenes matching a plain-language ``query`` over their imagery.\n\n    Text-to-scene search: embeds ``query`` (\"ships at a berth\", \"a flooded field\")"},{"name":"describe_scene","description":"Return a SAR-literate reading of the scene at ``url``.\n\n    The picture and the metadata card are produced deterministically; a model\n    only interprets them. "},{"name":"narrate_change","description":"Return a grounded reading of *what changed* between passes.\n\n    Sibling of :func:`describe_scene`. The composite and the per-block dB grid\n    are produced det"},{"name":"stamp_description","description":"Validate a client-produced scene reading and stamp provenance.\n\n    This is the interpretation boundary for the no-key kit path: you read the\n    picture ``desc"},{"name":"stamp_narration","description":"Validate a client-produced change narration and stamp provenance.\n\n    Sibling of :func:`stamp_description` for the no-key ``narrate_change``\n    kit. Pass the "}],"toolCount":19,"toolsHash":"ad6220c21c3103a2c9f96302457760c6c40b8450b46ada02e31d06fc19817b35","serverName":"umbra","capabilities":["prompts","resources","tools"],"serverVersion":"0.1.4","protocolVersion":"2025-06-18"}},{"at":"2026-11-01T07:28:53.339Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":156,"error":null,"detail":{"tools":[{"name":"search_catalog","description":"Search Umbra's catalog and return compact context cards.\n\n    Filters (all optional, combine freely): ``bbox`` as\n    ``[min_lon, min_lat, max_lon, max_lat]`` i"},{"name":"find_repeat_sites","description":"Rank the archive's most repeat-imaged sites — where change detection has\n    something to measure.\n\n    The discovery step *before* every analysis verb. ``chang"},{"name":"get_item","description":"Return the full context card for one item.\n\n    ``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other\n    product) filename such as ``2025-"},{"name":"geocode_place","description":"Resolve a free-text place name to a bounding box via Nominatim.\n\n    Returns ``{\"bbox\": [min_lon, min_lat, max_lon, max_lat], \"display_name\":\n    ...}`` so the "},{"name":"index_stats","description":"Report on the local catalog index, if one has been built or fetched.\n\n    Lets a long-running agent decide whether searches will be instant (index\n    present) "},{"name":"quicklook","description":"Return a scene's quicklook PNG as an image block.\n\n    Prefers a baked catalog preview (``preview=\"auto\"``, the default) so a\n    public host can show the radar"},{"name":"change_composite","description":"Composite 2-3 passes of one site into a change image.\n\n    Pass the STAC URLs of two or three acquisitions of the *same* site in time\n    order. Colors encode c"},{"name":"timescan","description":"Summarize a whole time series into one activity image.\n\n    Pass the STAC URLs of a site's passes; the timescan encodes per-pixel\n    temporal statistics so bri"},{"name":"stack_stats","description":"Measure how much a site changed across its passes, as numbers.\n\n    The quantitative counterpart to ``change_composite`` / ``timescan``: those\n    return a pict"},{"name":"stack_provenance","description":"Check whether a site's passes are one measurement, before measuring them.\n\n    ``stack_stats`` refuses a selection whose rasters were made by *different*\n    ``"},{"name":"pick_change_interval","description":"Scan a site's whole series and name the two passes worth narrating.\n\n    The deterministic first half of the \"watch a site over time\" story, and the\n    step th"},{"name":"download_asset","description":"Download one asset of an item to local disk, gated by a size check.\n\n    SAR products can be multiple GB, so this is a two-step handshake: call it\n    first wit"},{"name":"watch_site","description":"Report only the acquisitions **new** since the last check of this site.\n\n    SAR's value for monitoring is its cadence, so the natural workflow is\n    *standing"},{"name":"find_similar","description":"Find archived scenes that **look like** the acquisition at ``url``.\n\n    This is the one search that lives in the pixels, not the metadata: where\n    ``search_c"},{"name":"find_similar_text","description":"Find archived scenes matching a plain-language ``query`` over their imagery.\n\n    Text-to-scene search: embeds ``query`` (\"ships at a berth\", \"a flooded field\")"},{"name":"describe_scene","description":"Return a SAR-literate reading of the scene at ``url``.\n\n    The picture and the metadata card are produced deterministically; a model\n    only interprets them. "},{"name":"narrate_change","description":"Return a grounded reading of *what changed* between passes.\n\n    Sibling of :func:`describe_scene`. The composite and the per-block dB grid\n    are produced det"},{"name":"stamp_description","description":"Validate a client-produced scene reading and stamp provenance.\n\n    This is the interpretation boundary for the no-key kit path: you read the\n    picture ``desc"},{"name":"stamp_narration","description":"Validate a client-produced change narration and stamp provenance.\n\n    Sibling of :func:`stamp_description` for the no-key ``narrate_change``\n    kit. Pass the "}],"toolCount":19,"toolsHash":"ad6220c21c3103a2c9f96302457760c6c40b8450b46ada02e31d06fc19817b35","serverName":"umbra","capabilities":["prompts","resources","tools"],"serverVersion":"0.1.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-31T23:29:21.328Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":175,"error":null,"detail":{"tools":[{"name":"search_catalog","description":"Search Umbra's catalog and return compact context cards.\n\n    Filters (all optional, combine freely): ``bbox`` as\n    ``[min_lon, min_lat, max_lon, max_lat]`` i"},{"name":"find_repeat_sites","description":"Rank the archive's most repeat-imaged sites — where change detection has\n    something to measure.\n\n    The discovery step *before* every analysis verb. ``chang"},{"name":"get_item","description":"Return the full context card for one item.\n\n    ``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other\n    product) filename such as ``2025-"},{"name":"geocode_place","description":"Resolve a free-text place name to a bounding box via Nominatim.\n\n    Returns ``{\"bbox\": [min_lon, min_lat, max_lon, max_lat], \"display_name\":\n    ...}`` so the "},{"name":"index_stats","description":"Report on the local catalog index, if one has been built or fetched.\n\n    Lets a long-running agent decide whether searches will be instant (index\n    present) "},{"name":"quicklook","description":"Return a scene's quicklook PNG as an image block.\n\n    Prefers a baked catalog preview (``preview=\"auto\"``, the default) so a\n    public host can show the radar"},{"name":"change_composite","description":"Composite 2-3 passes of one site into a change image.\n\n    Pass the STAC URLs of two or three acquisitions of the *same* site in time\n    order. Colors encode c"},{"name":"timescan","description":"Summarize a whole time series into one activity image.\n\n    Pass the STAC URLs of a site's passes; the timescan encodes per-pixel\n    temporal statistics so bri"},{"name":"stack_stats","description":"Measure how much a site changed across its passes, as numbers.\n\n    The quantitative counterpart to ``change_composite`` / ``timescan``: those\n    return a pict"},{"name":"stack_provenance","description":"Check whether a site's passes are one measurement, before measuring them.\n\n    ``stack_stats`` refuses a selection whose rasters were made by *different*\n    ``"},{"name":"pick_change_interval","description":"Scan a site's whole series and name the two passes worth narrating.\n\n    The deterministic first half of the \"watch a site over time\" story, and the\n    step th"},{"name":"download_asset","description":"Download one asset of an item to local disk, gated by a size check.\n\n    SAR products can be multiple GB, so this is a two-step handshake: call it\n    first wit"},{"name":"watch_site","description":"Report only the acquisitions **new** since the last check of this site.\n\n    SAR's value for monitoring is its cadence, so the natural workflow is\n    *standing"},{"name":"find_similar","description":"Find archived scenes that **look like** the acquisition at ``url``.\n\n    This is the one search that lives in the pixels, not the metadata: where\n    ``search_c"},{"name":"find_similar_text","description":"Find archived scenes matching a plain-language ``query`` over their imagery.\n\n    Text-to-scene search: embeds ``query`` (\"ships at a berth\", \"a flooded field\")"},{"name":"describe_scene","description":"Return a SAR-literate reading of the scene at ``url``.\n\n    The picture and the metadata card are produced deterministically; a model\n    only interprets them. "},{"name":"narrate_change","description":"Return a grounded reading of *what changed* between passes.\n\n    Sibling of :func:`describe_scene`. The composite and the per-block dB grid\n    are produced det"},{"name":"stamp_description","description":"Validate a client-produced scene reading and stamp provenance.\n\n    This is the interpretation boundary for the no-key kit path: you read the\n    picture ``desc"},{"name":"stamp_narration","description":"Validate a client-produced change narration and stamp provenance.\n\n    Sibling of :func:`stamp_description` for the no-key ``narrate_change``\n    kit. Pass the "}],"toolCount":19,"toolsHash":"ad6220c21c3103a2c9f96302457760c6c40b8450b46ada02e31d06fc19817b35","serverName":"umbra","capabilities":["prompts","resources","tools"],"serverVersion":"0.1.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-31T15:29:07.049Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":185,"error":null,"detail":{"tools":[{"name":"search_catalog","description":"Search Umbra's catalog and return compact context cards.\n\n    Filters (all optional, combine freely): ``bbox`` as\n    ``[min_lon, min_lat, max_lon, max_lat]`` i"},{"name":"find_repeat_sites","description":"Rank the archive's most repeat-imaged sites — where change detection has\n    something to measure.\n\n    The discovery step *before* every analysis verb. ``chang"},{"name":"get_item","description":"Return the full context card for one item.\n\n    ``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other\n    product) filename such as ``2025-"},{"name":"geocode_place","description":"Resolve a free-text place name to a bounding box via Nominatim.\n\n    Returns ``{\"bbox\": [min_lon, min_lat, max_lon, max_lat], \"display_name\":\n    ...}`` so the "},{"name":"index_stats","description":"Report on the local catalog index, if one has been built or fetched.\n\n    Lets a long-running agent decide whether searches will be instant (index\n    present) "},{"name":"quicklook","description":"Return a scene's quicklook PNG as an image block.\n\n    Prefers a baked catalog preview (``preview=\"auto\"``, the default) so a\n    public host can show the radar"},{"name":"change_composite","description":"Composite 2-3 passes of one site into a change image.\n\n    Pass the STAC URLs of two or three acquisitions of the *same* site in time\n    order. Colors encode c"},{"name":"timescan","description":"Summarize a whole time series into one activity image.\n\n    Pass the STAC URLs of a site's passes; the timescan encodes per-pixel\n    temporal statistics so bri"},{"name":"stack_stats","description":"Measure how much a site changed across its passes, as numbers.\n\n    The quantitative counterpart to ``change_composite`` / ``timescan``: those\n    return a pict"},{"name":"stack_provenance","description":"Check whether a site's passes are one measurement, before measuring them.\n\n    ``stack_stats`` refuses a selection whose rasters were made by *different*\n    ``"},{"name":"pick_change_interval","description":"Scan a site's whole series and name the two passes worth narrating.\n\n    The deterministic first half of the \"watch a site over time\" story, and the\n    step th"},{"name":"download_asset","description":"Download one asset of an item to local disk, gated by a size check.\n\n    SAR products can be multiple GB, so this is a two-step handshake: call it\n    first wit"},{"name":"watch_site","description":"Report only the acquisitions **new** since the last check of this site.\n\n    SAR's value for monitoring is its cadence, so the natural workflow is\n    *standing"},{"name":"find_similar","description":"Find archived scenes that **look like** the acquisition at ``url``.\n\n    This is the one search that lives in the pixels, not the metadata: where\n    ``search_c"},{"name":"find_similar_text","description":"Find archived scenes matching a plain-language ``query`` over their imagery.\n\n    Text-to-scene search: embeds ``query`` (\"ships at a berth\", \"a flooded field\")"},{"name":"describe_scene","description":"Return a SAR-literate reading of the scene at ``url``.\n\n    The picture and the metadata card are produced deterministically; a model\n    only interprets them. "},{"name":"narrate_change","description":"Return a grounded reading of *what changed* between passes.\n\n    Sibling of :func:`describe_scene`. The composite and the per-block dB grid\n    are produced det"},{"name":"stamp_description","description":"Validate a client-produced scene reading and stamp provenance.\n\n    This is the interpretation boundary for the no-key kit path: you read the\n    picture ``desc"},{"name":"stamp_narration","description":"Validate a client-produced change narration and stamp provenance.\n\n    Sibling of :func:`stamp_description` for the no-key ``narrate_change``\n    kit. Pass the "}],"toolCount":19,"toolsHash":"ad6220c21c3103a2c9f96302457760c6c40b8450b46ada02e31d06fc19817b35","serverName":"umbra","capabilities":["prompts","resources","tools"],"serverVersion":"0.1.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-31T07:28:02.276Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":161,"error":null,"detail":{"tools":[{"name":"search_catalog","description":"Search Umbra's catalog and return compact context cards.\n\n    Filters (all optional, combine freely): ``bbox`` as\n    ``[min_lon, min_lat, max_lon, max_lat]`` i"},{"name":"find_repeat_sites","description":"Rank the archive's most repeat-imaged sites — where change detection has\n    something to measure.\n\n    The discovery step *before* every analysis verb. ``chang"},{"name":"get_item","description":"Return the full context card for one item.\n\n    ``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other\n    product) filename such as ``2025-"},{"name":"geocode_place","description":"Resolve a free-text place name to a bounding box via Nominatim.\n\n    Returns ``{\"bbox\": [min_lon, min_lat, max_lon, max_lat], \"display_name\":\n    ...}`` so the "},{"name":"index_stats","description":"Report on the local catalog index, if one has been built or fetched.\n\n    Lets a long-running agent decide whether searches will be instant (index\n    present) "},{"name":"quicklook","description":"Return a scene's quicklook PNG as an image block.\n\n    Prefers a baked catalog preview (``preview=\"auto\"``, the default) so a\n    public host can show the radar"},{"name":"change_composite","description":"Composite 2-3 passes of one site into a change image.\n\n    Pass the STAC URLs of two or three acquisitions of the *same* site in time\n    order. Colors encode c"},{"name":"timescan","description":"Summarize a whole time series into one activity image.\n\n    Pass the STAC URLs of a site's passes; the timescan encodes per-pixel\n    temporal statistics so bri"},{"name":"stack_stats","description":"Measure how much a site changed across its passes, as numbers.\n\n    The quantitative counterpart to ``change_composite`` / ``timescan``: those\n    return a pict"},{"name":"stack_provenance","description":"Check whether a site's passes are one measurement, before measuring them.\n\n    ``stack_stats`` refuses a selection whose rasters were made by *different*\n    ``"},{"name":"pick_change_interval","description":"Scan a site's whole series and name the two passes worth narrating.\n\n    The deterministic first half of the \"watch a site over time\" story, and the\n    step th"},{"name":"download_asset","description":"Download one asset of an item to local disk, gated by a size check.\n\n    SAR products can be multiple GB, so this is a two-step handshake: call it\n    first wit"},{"name":"watch_site","description":"Report only the acquisitions **new** since the last check of this site.\n\n    SAR's value for monitoring is its cadence, so the natural workflow is\n    *standing"},{"name":"find_similar","description":"Find archived scenes that **look like** the acquisition at ``url``.\n\n    This is the one search that lives in the pixels, not the metadata: where\n    ``search_c"},{"name":"find_similar_text","description":"Find archived scenes matching a plain-language ``query`` over their imagery.\n\n    Text-to-scene search: embeds ``query`` (\"ships at a berth\", \"a flooded field\")"},{"name":"describe_scene","description":"Return a SAR-literate reading of the scene at ``url``.\n\n    The picture and the metadata card are produced deterministically; a model\n    only interprets them. "},{"name":"narrate_change","description":"Return a grounded reading of *what changed* between passes.\n\n    Sibling of :func:`describe_scene`. The composite and the per-block dB grid\n    are produced det"},{"name":"stamp_description","description":"Validate a client-produced scene reading and stamp provenance.\n\n    This is the interpretation boundary for the no-key kit path: you read the\n    picture ``desc"},{"name":"stamp_narration","description":"Validate a client-produced change narration and stamp provenance.\n\n    Sibling of :func:`stamp_description` for the no-key ``narrate_change``\n    kit. Pass the "}],"toolCount":19,"toolsHash":"ad6220c21c3103a2c9f96302457760c6c40b8450b46ada02e31d06fc19817b35","serverName":"umbra","capabilities":["prompts","resources","tools"],"serverVersion":"0.1.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-30T23:27:19.831Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":163,"error":null,"detail":{"tools":[{"name":"search_catalog","description":"Search Umbra's catalog and return compact context cards.\n\n    Filters (all optional, combine freely): ``bbox`` as\n    ``[min_lon, min_lat, max_lon, max_lat]`` i"},{"name":"find_repeat_sites","description":"Rank the archive's most repeat-imaged sites — where change detection has\n    something to measure.\n\n    The discovery step *before* every analysis verb. ``chang"},{"name":"get_item","description":"Return the full context card for one item.\n\n    ``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other\n    product) filename such as ``2025-"},{"name":"geocode_place","description":"Resolve a free-text place name to a bounding box via Nominatim.\n\n    Returns ``{\"bbox\": [min_lon, min_lat, max_lon, max_lat], \"display_name\":\n    ...}`` so the "},{"name":"index_stats","description":"Report on the local catalog index, if one has been built or fetched.\n\n    Lets a long-running agent decide whether searches will be instant (index\n    present) "},{"name":"quicklook","description":"Return a scene's quicklook PNG as an image block.\n\n    Prefers a baked catalog preview (``preview=\"auto\"``, the default) so a\n    public host can show the radar"},{"name":"change_composite","description":"Composite 2-3 passes of one site into a change image.\n\n    Pass the STAC URLs of two or three acquisitions of the *same* site in time\n    order. Colors encode c"},{"name":"timescan","description":"Summarize a whole time series into one activity image.\n\n    Pass the STAC URLs of a site's passes; the timescan encodes per-pixel\n    temporal statistics so bri"},{"name":"stack_stats","description":"Measure how much a site changed across its passes, as numbers.\n\n    The quantitative counterpart to ``change_composite`` / ``timescan``: those\n    return a pict"},{"name":"stack_provenance","description":"Check whether a site's passes are one measurement, before measuring them.\n\n    ``stack_stats`` refuses a selection whose rasters were made by *different*\n    ``"},{"name":"pick_change_interval","description":"Scan a site's whole series and name the two passes worth narrating.\n\n    The deterministic first half of the \"watch a site over time\" story, and the\n    step th"},{"name":"download_asset","description":"Download one asset of an item to local disk, gated by a size check.\n\n    SAR products can be multiple GB, so this is a two-step handshake: call it\n    first wit"},{"name":"watch_site","description":"Report only the acquisitions **new** since the last check of this site.\n\n    SAR's value for monitoring is its cadence, so the natural workflow is\n    *standing"},{"name":"find_similar","description":"Find archived scenes that **look like** the acquisition at ``url``.\n\n    This is the one search that lives in the pixels, not the metadata: where\n    ``search_c"},{"name":"find_similar_text","description":"Find archived scenes matching a plain-language ``query`` over their imagery.\n\n    Text-to-scene search: embeds ``query`` (\"ships at a berth\", \"a flooded field\")"},{"name":"describe_scene","description":"Return a SAR-literate reading of the scene at ``url``.\n\n    The picture and the metadata card are produced deterministically; a model\n    only interprets them. "},{"name":"narrate_change","description":"Return a grounded reading of *what changed* between passes.\n\n    Sibling of :func:`describe_scene`. The composite and the per-block dB grid\n    are produced det"},{"name":"stamp_description","description":"Validate a client-produced scene reading and stamp provenance.\n\n    This is the interpretation boundary for the no-key kit path: you read the\n    picture ``desc"},{"name":"stamp_narration","description":"Validate a client-produced change narration and stamp provenance.\n\n    Sibling of :func:`stamp_description` for the no-key ``narrate_change``\n    kit. Pass the "}],"toolCount":19,"toolsHash":"ad6220c21c3103a2c9f96302457760c6c40b8450b46ada02e31d06fc19817b35","serverName":"umbra","capabilities":["prompts","resources","tools"],"serverVersion":"0.1.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-30T15:22:37.277Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":160,"error":null,"detail":{"tools":[{"name":"search_catalog","description":"Search Umbra's catalog and return compact context cards.\n\n    Filters (all optional, combine freely): ``bbox`` as\n    ``[min_lon, min_lat, max_lon, max_lat]`` i"},{"name":"find_repeat_sites","description":"Rank the archive's most repeat-imaged sites — where change detection has\n    something to measure.\n\n    The discovery step *before* every analysis verb. ``chang"},{"name":"get_item","description":"Return the full context card for one item.\n\n    ``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other\n    product) filename such as ``2025-"},{"name":"geocode_place","description":"Resolve a free-text place name to a bounding box via Nominatim.\n\n    Returns ``{\"bbox\": [min_lon, min_lat, max_lon, max_lat], \"display_name\":\n    ...}`` so the "},{"name":"index_stats","description":"Report on the local catalog index, if one has been built or fetched.\n\n    Lets a long-running agent decide whether searches will be instant (index\n    present) "},{"name":"quicklook","description":"Return a scene's quicklook PNG as an image block.\n\n    Prefers a baked catalog preview (``preview=\"auto\"``, the default) so a\n    public host can show the radar"},{"name":"change_composite","description":"Composite 2-3 passes of one site into a change image.\n\n    Pass the STAC URLs of two or three acquisitions of the *same* site in time\n    order. Colors encode c"},{"name":"timescan","description":"Summarize a whole time series into one activity image.\n\n    Pass the STAC URLs of a site's passes; the timescan encodes per-pixel\n    temporal statistics so bri"},{"name":"stack_stats","description":"Measure how much a site changed across its passes, as numbers.\n\n    The quantitative counterpart to ``change_composite`` / ``timescan``: those\n    return a pict"},{"name":"stack_provenance","description":"Check whether a site's passes are one measurement, before measuring them.\n\n    ``stack_stats`` refuses a selection whose rasters were made by *different*\n    ``"},{"name":"pick_change_interval","description":"Scan a site's whole series and name the two passes worth narrating.\n\n    The deterministic first half of the \"watch a site over time\" story, and the\n    step th"},{"name":"download_asset","description":"Download one asset of an item to local disk, gated by a size check.\n\n    SAR products can be multiple GB, so this is a two-step handshake: call it\n    first wit"},{"name":"watch_site","description":"Report only the acquisitions **new** since the last check of this site.\n\n    SAR's value for monitoring is its cadence, so the natural workflow is\n    *standing"},{"name":"find_similar","description":"Find archived scenes that **look like** the acquisition at ``url``.\n\n    This is the one search that lives in the pixels, not the metadata: where\n    ``search_c"},{"name":"find_similar_text","description":"Find archived scenes matching a plain-language ``query`` over their imagery.\n\n    Text-to-scene search: embeds ``query`` (\"ships at a berth\", \"a flooded field\")"},{"name":"describe_scene","description":"Return a SAR-literate reading of the scene at ``url``.\n\n    The picture and the metadata card are produced deterministically; a model\n    only interprets them. "},{"name":"narrate_change","description":"Return a grounded reading of *what changed* between passes.\n\n    Sibling of :func:`describe_scene`. The composite and the per-block dB grid\n    are produced det"},{"name":"stamp_description","description":"Validate a client-produced scene reading and stamp provenance.\n\n    This is the interpretation boundary for the no-key kit path: you read the\n    picture ``desc"},{"name":"stamp_narration","description":"Validate a client-produced change narration and stamp provenance.\n\n    Sibling of :func:`stamp_description` for the no-key ``narrate_change``\n    kit. Pass the "}],"toolCount":19,"toolsHash":"ad6220c21c3103a2c9f96302457760c6c40b8450b46ada02e31d06fc19817b35","serverName":"umbra","capabilities":["prompts","resources","tools"],"serverVersion":"0.1.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-30T07:23:37.965Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":180,"error":null,"detail":{"tools":[{"name":"search_catalog","description":"Search Umbra's catalog and return compact context cards.\n\n    Filters (all optional, combine freely): ``bbox`` as\n    ``[min_lon, min_lat, max_lon, max_lat]`` i"},{"name":"find_repeat_sites","description":"Rank the archive's most repeat-imaged sites — where change detection has\n    something to measure.\n\n    The discovery step *before* every analysis verb. ``chang"},{"name":"get_item","description":"Return the full context card for one item.\n\n    ``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other\n    product) filename such as ``2025-"},{"name":"geocode_place","description":"Resolve a free-text place name to a bounding box via Nominatim.\n\n    Returns ``{\"bbox\": [min_lon, min_lat, max_lon, max_lat], \"display_name\":\n    ...}`` so the "},{"name":"index_stats","description":"Report on the local catalog index, if one has been built or fetched.\n\n    Lets a long-running agent decide whether searches will be instant (index\n    present) "},{"name":"quicklook","description":"Return a scene's quicklook PNG as an image block.\n\n    Prefers a baked catalog preview (``preview=\"auto\"``, the default) so a\n    public host can show the radar"},{"name":"change_composite","description":"Composite 2-3 passes of one site into a change image.\n\n    Pass the STAC URLs of two or three acquisitions of the *same* site in time\n    order. Colors encode c"},{"name":"timescan","description":"Summarize a whole time series into one activity image.\n\n    Pass the STAC URLs of a site's passes; the timescan encodes per-pixel\n    temporal statistics so bri"},{"name":"stack_stats","description":"Measure how much a site changed across its passes, as numbers.\n\n    The quantitative counterpart to ``change_composite`` / ``timescan``: those\n    return a pict"},{"name":"stack_provenance","description":"Check whether a site's passes are one measurement, before measuring them.\n\n    ``stack_stats`` refuses a selection whose rasters were made by *different*\n    ``"},{"name":"pick_change_interval","description":"Scan a site's whole series and name the two passes worth narrating.\n\n    The deterministic first half of the \"watch a site over time\" story, and the\n    step th"},{"name":"download_asset","description":"Download one asset of an item to local disk, gated by a size check.\n\n    SAR products can be multiple GB, so this is a two-step handshake: call it\n    first wit"},{"name":"watch_site","description":"Report only the acquisitions **new** since the last check of this site.\n\n    SAR's value for monitoring is its cadence, so the natural workflow is\n    *standing"},{"name":"find_similar","description":"Find archived scenes that **look like** the acquisition at ``url``.\n\n    This is the one search that lives in the pixels, not the metadata: where\n    ``search_c"},{"name":"find_similar_text","description":"Find archived scenes matching a plain-language ``query`` over their imagery.\n\n    Text-to-scene search: embeds ``query`` (\"ships at a berth\", \"a flooded field\")"},{"name":"describe_scene","description":"Return a SAR-literate reading of the scene at ``url``.\n\n    The picture and the metadata card are produced deterministically; a model\n    only interprets them. "},{"name":"narrate_change","description":"Return a grounded reading of *what changed* between passes.\n\n    Sibling of :func:`describe_scene`. The composite and the per-block dB grid\n    are produced det"},{"name":"stamp_description","description":"Validate a client-produced scene reading and stamp provenance.\n\n    This is the interpretation boundary for the no-key kit path: you read the\n    picture ``desc"},{"name":"stamp_narration","description":"Validate a client-produced change narration and stamp provenance.\n\n    Sibling of :func:`stamp_description` for the no-key ``narrate_change``\n    kit. Pass the "}],"toolCount":19,"toolsHash":"ad6220c21c3103a2c9f96302457760c6c40b8450b46ada02e31d06fc19817b35","serverName":"umbra","capabilities":["prompts","resources","tools"],"serverVersion":"0.1.4","protocolVersion":"2025-06-18"}}],"tools":[{"name":"search_catalog","description":"Search Umbra's catalog and return compact context cards.\n\n    Filters (all optional, combine freely): ``bbox`` as\n    ``[min_lon, min_lat, max_lon, max_lat]`` i"},{"name":"find_repeat_sites","description":"Rank the archive's most repeat-imaged sites — where change detection has\n    something to measure.\n\n    The discovery step *before* every analysis verb. ``chang"},{"name":"get_item","description":"Return the full context card for one item.\n\n    ``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other\n    product) filename such as ``2025-"},{"name":"geocode_place","description":"Resolve a free-text place name to a bounding box via Nominatim.\n\n    Returns ``{\"bbox\": [min_lon, min_lat, max_lon, max_lat], \"display_name\":\n    ...}`` so the "},{"name":"index_stats","description":"Report on the local catalog index, if one has been built or fetched.\n\n    Lets a long-running agent decide whether searches will be instant (index\n    present) "},{"name":"quicklook","description":"Return a scene's quicklook PNG as an image block.\n\n    Prefers a baked catalog preview (``preview=\"auto\"``, the default) so a\n    public host can show the radar"},{"name":"change_composite","description":"Composite 2-3 passes of one site into a change image.\n\n    Pass the STAC URLs of two or three acquisitions of the *same* site in time\n    order. Colors encode c"},{"name":"timescan","description":"Summarize a whole time series into one activity image.\n\n    Pass the STAC URLs of a site's passes; the timescan encodes per-pixel\n    temporal statistics so bri"},{"name":"stack_stats","description":"Measure how much a site changed across its passes, as numbers.\n\n    The quantitative counterpart to ``change_composite`` / ``timescan``: those\n    return a pict"},{"name":"stack_provenance","description":"Check whether a site's passes are one measurement, before measuring them.\n\n    ``stack_stats`` refuses a selection whose rasters were made by *different*\n    ``"},{"name":"pick_change_interval","description":"Scan a site's whole series and name the two passes worth narrating.\n\n    The deterministic first half of the \"watch a site over time\" story, and the\n    step th"},{"name":"download_asset","description":"Download one asset of an item to local disk, gated by a size check.\n\n    SAR products can be multiple GB, so this is a two-step handshake: call it\n    first wit"},{"name":"watch_site","description":"Report only the acquisitions **new** since the last check of this site.\n\n    SAR's value for monitoring is its cadence, so the natural workflow is\n    *standing"},{"name":"find_similar","description":"Find archived scenes that **look like** the acquisition at ``url``.\n\n    This is the one search that lives in the pixels, not the metadata: where\n    ``search_c"},{"name":"find_similar_text","description":"Find archived scenes matching a plain-language ``query`` over their imagery.\n\n    Text-to-scene search: embeds ``query`` (\"ships at a berth\", \"a flooded field\")"},{"name":"describe_scene","description":"Return a SAR-literate reading of the scene at ``url``.\n\n    The picture and the metadata card are produced deterministically; a model\n    only interprets them. "},{"name":"narrate_change","description":"Return a grounded reading of *what changed* between passes.\n\n    Sibling of :func:`describe_scene`. The composite and the per-block dB grid\n    are produced det"},{"name":"stamp_description","description":"Validate a client-produced scene reading and stamp provenance.\n\n    This is the interpretation boundary for the no-key kit path: you read the\n    picture ``desc"},{"name":"stamp_narration","description":"Validate a client-produced change narration and stamp provenance.\n\n    Sibling of :func:`stamp_description` for the no-key ``narrate_change``\n    kit. Pass the "}],"package":{"name":"umbra-py","registry":"pypi","observedAt":"2026-11-02T07:29:19.364Z","publishedAt":"2026-10-26T21:43:50.672985Z","latestVersion":"0.1.4"},"toolSurface":{"id":"ts_x49ar45a539g","endpointId":"ep_5ued5s2dhyfn","hash":"ad6220c21c3103a2c9f96302457760c6c40b8450b46ada02e31d06fc19817b35","toolCount":19,"serverName":"umbra","serverVersion":"0.1.4","protocolVersion":"2025-06-18","firstSeenAt":"2026-10-29T16:25:52.146Z","lastSeenAt":"2026-11-02T07:26:20.512Z","observations":12,"toolNames":["search_catalog","find_repeat_sites","get_item","geocode_place","index_stats","quicklook","change_composite","timescan","stack_stats","stack_provenance","pick_change_interval","download_asset","watch_site","find_similar","find_similar_text","describe_scene","narrate_change","stamp_description","stamp_narration"],"distinctSurfaces":2},"endpointFacts":[{"id":"ep_5ued5s2dhyfn","url":"https://api.umbra-py.space/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-30T15:22:37.302Z","auth":{"observedAt":"2026-10-30T15:22:37.460Z","authRequired":false,"scheme":null,"resourceMetadata":null,"authorizationServer":null,"conformance":{"dpop":false,"rfc8414":false,"rfc9728":false,"pkceS256":false,"clientIdMetadataDocument":false,"dynamicClientRegistration":false}},"tls":{"observedAt":"2026-10-30T15:22:37.475Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"api.umbra-py.space","issuer":{"commonName":"YE2","organization":"Let's Encrypt"},"validFrom":"2026-09-02T19:46:18.000Z","validTo":"2026-12-01T19:46:17.000Z","daysToExpiry":29,"sanCount":1,"fingerprint256":"4E:4E:8E:CA:5B:8A:7A:F9:99:85:E2:1D:6B:CE:5A:53:58:EC:CF:EE:9C:7C:CD:18:1E:B0:E8:7F:9F:8D:0D:CF"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"io.github.reesehammer/umbra-mcp","url":"https://registry.modelcontextprotocol.io/v0/servers/io.github.reesehammer%2Fumbra-mcp","firstSeenAt":"2026-09-07T01:23:04.290Z","fetchedAt":"2026-10-30T18:23:19.914Z","normalizedAt":"2026-10-30T18:23:19.914Z"},{"source":"pypi","key":"umbra-py","url":"https://pypi.org/project/umbra-py/","firstSeenAt":"2026-09-07T01:24:21.225Z","fetchedAt":"2026-11-01T17:23:31.190Z","normalizedAt":"2026-11-01T17:23:31.190Z"}]},"firstSeenAt":"2026-09-07T01:23:04.290Z","updatedAt":"2026-11-02T07:29:19.364Z"}