DeepPVMapper
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Open registry of 1.14M+ rooftop-solar detections across France, queryable by natural language.
| Author | io.github.gabrielkasmi |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 439 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"DeepPVMapper": {
"url": "https://zelhliylrlktnasircwp.supabase.co/functions/v1/mcp/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (17)
get_data_quality_referenceReturn the DeepPVMapper/OpenPVMapper registry's documented data-quality characteristics: estimated detection recall, which fields are model-derived estimates vs. structural/observed fields, the source-encoding table, the recommended confidence threshold, confidence signals, and licensing/liability terms. Call this before advising how much to trust a result for a specific use case (e.g. exploratory research vs. a commercial or regulatory decision) — pair it with the quality_summary attached to search_detections / aggregate_detection_capacity results, which reflects the specific query rather than the registry as a whole.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_department_capacity_statsGet installed rooftop-PV capacity (total kWp) and system counts for one or all French départements, from the DeepPVMapper/OpenPVMapper registry. This is a fixed, pre-computed department-wide aggregate with no other filters — use aggregate_detection_capacity instead if you need a filtered subset (e.g. only cross-validated detections). Data quality note: this is a detection dataset, not an exhaustive inventory (estimated recall ~0.6). A missing detection does not mean no PV installation exists there. kwp, surface, tilt and azimuth are model estimates, not surveyed values. In this server, quality_filter=true keeps only detections identified by 2 or more sources (see source_encoding in get_data_quality_reference). Call get_data_quality_reference for the full picture before assessing fitness for a specific use case.
Parameters:
dpt— string — French département code, e.g. "33" for Gironde. Omit for all départements.top_n— integer — If set and dpt is omitted, return only the top N départements by installed capacity.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_department_yearly_statsGet yearly system counts and capacity by département, based on first-seen imagery year. Useful for tracking apparent PV deployment growth over time. Data quality note: this is a detection dataset, not an exhaustive inventory (estimated recall ~0.6). A missing detection does not mean no PV installation exists there. kwp, surface, tilt and azimuth are model estimates, not surveyed values. In this server, quality_filter=true keeps only detections identified by 2 or more sources (see source_encoding in get_data_quality_reference). Call get_data_quality_reference for the full picture before assessing fitness for a specific use case.
Parameters:
dpt— string — French département code, e.g. "33". Omit for all départements.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
search_detectionsSearch individual rooftop-PV detections by département, commune (INSEE code), estimated capacity range, and/or cross-validation confidence (min_vintages, cross_validated). Returns a bounded list of detection records plus a quality_summary for the returned sample (use get_detections_in_bbox instead for map/spatial queries with geometry). Data quality note: this is a detection dataset, not an exhaustive inventory (estimated recall ~0.6). A missing detection does not mean no PV installation exists there. kwp, surface, tilt and azimuth are model estimates, not surveyed values. In this server, quality_filter=true keeps only detections identified by 2 or more sources (see source_encoding in get_data_quality_reference). Call get_data_quality_reference for the full picture before assessing fitness for a specific use case.
Parameters:
quality_filter(required) — boolean — If true, only include detections identified by 2 OR MORE sources(the `sources` field lists at least two codes, e.g. "0,1" = DeepPVMapper pipeline + FRPV reference, "0,2" = pipeline + OpenStreetMap). Default false: all detections are included, including those found by a single source (typically the automated pipeline alone).limit(required) — integer — Maximum number of records to return (max 200).dpt— string — French département code, e.g. "33".insee— string — INSEE commune code.max_kwp— number — Maximum estimated installed capacity, in kWp.min_kwp— number — Minimum estimated installed capacity, in kWp.max_tilt— number — Maximum estimated tilt from horizontal, in degrees.min_tilt— number — Minimum estimated tilt from horizontal, in degrees.has_rnb_id— boolean — true = only detections matched to an RNB building identifier (rnb_id not null); false = only detections without one.max_azimuth— number — Maximum estimated azimuth, degrees clockwise from true north (180 = south).max_surface— number — Maximum estimated PV array area, in m².min_azimuth— number — Minimum estimated azimuth, degrees clockwise from true north (180 = south).min_surface— number — Minimum estimated PV array area, in m².max_vintages— integer — Maximum number of imagery vintages (e.g. 1 = seen in a single year only).min_vintages— integer — Minimum number of distinct imagery vintages (years) the installation was independently detected in. Use 2+ as a persistence/confidence signal, since a one-off detection in a single vintage is more likely to be a transient artifact.max_last_seen— integer — Upper bound on last_seen imagery year.min_last_seen— integer — Lower bound on last_seen imagery year.has_frpv_proba— boolean — true = only detections that have an FRPV comparison (frpv_proba not null); false = only those without one. A null frpv_proba means "no comparison available", not probability 0.max_first_seen— integer — Upper bound on first_seen imagery year.min_first_seen— integer — Earliest imagery year of first detection, lower bound (e.g. 2018). Not an installation date.min_frpv_proba— number — Minimum frpv_proba. The data contract recommends 0.1 as a precision/recall trade-off. Note: detections with a null frpv_proba (no FRPV comparison available) are excluded when this is set; null does not mean probability 0.cross_validated— boolean — Alias of quality_filter, kept for backward compatibility.sources_include— array — Only include detections present in ALL of these sources. Accepts names or codes, case-insensitive: dpvm/deeppvmapper/kasmi (0), frpv/thebault (1), osm/openstreetmap (2), manual/annotation (3), recall (4). Examples: ["osm"] = detections that are in OpenStreetMap; ["dpvm","frpv"] = present in both DeepPVMapper and FRPV. See get_source_reference for what each source is and where it comes from.false_positive_status— string — flagged = false_positive is true; not_flagged = false_positive is false; unrecorded = false_positive is null (no status recorded — NOT a confirmed true positive).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aggregate_detection_capacityCompute the total estimated installed capacity (kWp) and count of detections matching a set of filters — département, commune, capacity range, and cross-validation across sources (cross_validated) or imagery vintages (min_vintages) — plus a quality_summary for the summed sample. Unlike get_department_capacity_stats, which is a fixed pre-computed département-wide aggregate with no other filters, this tool sums a live filtered subset, up to max_rows detections. Example: "installed capacity in Gironde confirmed by at least two sources" -> dpt="33", cross_validated=true. Data quality note: this is a detection dataset, not an exhaustive inventory (estimated recall ~0.6). A missing detection does not mean no PV installation exists there. kwp, surface, tilt and azimuth are model estimates, not surveyed values. In this server, quality_filter=true keeps only detections identified by 2 or more sources (see source_encoding in get_data_quality_reference). Call get_data_quality_reference for the full picture before assessing fitness for a specific use case.
Parameters:
quality_filter(required) — boolean — If true, only include detections identified by 2 OR MORE sources(the `sources` field lists at least two codes, e.g. "0,1" = DeepPVMapper pipeline + FRPV reference, "0,2" = pipeline + OpenStreetMap). Default false: all detections are included, including those found by a single source (typically the automated pipeline alone).max_rows(required) — integer — Cap on the number of matching detection rows fetched to compute the capacity sum. If the true match count exceeds this, total_kwp is a partial lower bound and `truncated` is true — increase max_rows or narrow the filters (e.g. add dpt or insee) for an exact total.dpt— string — French département code, e.g. "33".insee— string — INSEE commune code.max_kwp— number — Maximum estimated installed capacity, in kWp.min_kwp— number — Minimum estimated installed capacity, in kWp.max_tilt— number — Maximum estimated tilt from horizontal, in degrees.min_tilt— number — Minimum estimated tilt from horizontal, in degrees.has_rnb_id— boolean — true = only detections matched to an RNB building identifier (rnb_id not null); false = only detections without one.max_azimuth— number — Maximum estimated azimuth, degrees clockwise from true north (180 = south).max_surface— number — Maximum estimated PV array area, in m².min_azimuth— number — Minimum estimated azimuth, degrees clockwise from true north (180 = south).min_surface— number — Minimum estimated PV array area, in m².max_vintages— integer — Maximum number of imagery vintages (e.g. 1 = seen in a single year only).min_vintages— integer — Minimum number of distinct imagery vintages (years) the installation was independently detected in. Use 2+ as a persistence/confidence signal, since a one-off detection in a single vintage is more likely to be a transient artifact.max_last_seen— integer — Upper bound on last_seen imagery year.min_last_seen— integer — Lower bound on last_seen imagery year.has_frpv_proba— boolean — true = only detections that have an FRPV comparison (frpv_proba not null); false = only those without one. A null frpv_proba means "no comparison available", not probability 0.max_first_seen— integer — Upper bound on first_seen imagery year.min_first_seen— integer — Earliest imagery year of first detection, lower bound (e.g. 2018). Not an installation date.min_frpv_proba— number — Minimum frpv_proba. The data contract recommends 0.1 as a precision/recall trade-off. Note: detections with a null frpv_proba (no FRPV comparison available) are excluded when this is set; null does not mean probability 0.cross_validated— boolean — Alias of quality_filter, kept for backward compatibility.sources_include— array — Only include detections present in ALL of these sources. Accepts names or codes, case-insensitive: dpvm/deeppvmapper/kasmi (0), frpv/thebault (1), osm/openstreetmap (2), manual/annotation (3), recall (4). Examples: ["osm"] = detections that are in OpenStreetMap; ["dpvm","frpv"] = present in both DeepPVMapper and FRPV. See get_source_reference for what each source is and where it comes from.false_positive_status— string — flagged = false_positive is true; not_flagged = false_positive is false; unrecorded = false_positive is null (no status recorded — NOT a confirmed true positive).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_detections_in_bboxGet rooftop-PV detections within a geographic bounding box (WGS84 lon/lat), including footprint geometry. Intended for map-style spatial queries over a small area. Data quality note: this is a detection dataset, not an exhaustive inventory (estimated recall ~0.6). A missing detection does not mean no PV installation exists there. kwp, surface, tilt and azimuth are model estimates, not surveyed values. In this server, quality_filter=true keeps only detections identified by 2 or more sources (see source_encoding in get_data_quality_reference). Call get_data_quality_reference for the full picture before assessing fitness for a specific use case.
Parameters:
min_lon(required) — numbermin_lat(required) — numbermax_lon(required) — numbermax_lat(required) — numbermax_count(required) — integer — Maximum number of detections to return (max 500 here; the underlying API defaults to 2000, capped lower to keep responses manageable for an LLM).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_community_activityGet a snapshot of ongoing community contribution activity on the map: how many corrections are currently pending moderation, their breakdown by action type (add / modify / delete), and the most recent submissions (timestamp, action, target). Submitted free-text comments are intentionally excluded from this tool. This reflects unmoderated, unverified user activity, not the registry itself — do not present it as confirmed detection data.
Parameters:
recent_limit(required) — integer — How many of the most recent pending contributions to list.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_community_activity_in_areaFind pending, unmoderated community contributions relevant to a specific area, to answer "has anyone flagged anything here that is not in the registry yet?" Two independent filters: dpt finds pending edits/deletions (action=modify/delete) targeting existing detections in that département; a full bounding box (min_lon/min_lat/max_lon/max_lat) finds pending new additions (action=add) whose proposed footprint centroid falls inside it. Combine with get_department_capacity_stats / search_detections / get_detections_in_bbox for the confirmed registry picture, and present this separately and clearly as unverified, pending community input — not confirmed detection data. Free-text comments are never included.
Parameters:
scan_limit(required) — integer — How many recent proposed additions (action=add) to scan for a bbox match. Only relevant when all four bbox parameters are given — there is no server-side spatial index on pending items, so matching is done by fetching this many of the most recent ones and checking their centroid against the box.recent_limit(required) — integer — Maximum number of matching items to return per category.dpt— string — Filter pending edits/deletions of EXISTING detections (action=modify or delete) to this département. Does not apply to proposed new additions (action=add), which have no département recorded on the pending item itself — use the bbox parameters for those.max_lat— numbermax_lon— numbermin_lat— numbermin_lon— number
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
count_detectionsCount detections matching a set of filters, exactly, without downloading rows (fast, no row cap). Use this for "how many ..." questions, e.g. "how many installations have an RNB id?" -> has_rnb_id=true; "how many are identified by 2+ sources?" -> quality_filter=true; "how many come from OpenStreetMap?" -> sources_include=[2]. Returns the matching count, the unfiltered registry total and the percentage. Counts are DETECTED systems, not an inventory. Data quality note: this is a detection dataset, not an exhaustive inventory (estimated recall ~0.6). A missing detection does not mean no PV installation exists there. kwp, surface, tilt and azimuth are model estimates, not surveyed values. In this server, quality_filter=true keeps only detections identified by 2 or more sources (see source_encoding in get_data_quality_reference). Call get_data_quality_reference for the full picture before assessing fitness for a specific use case.
Parameters:
quality_filter(required) — boolean — If true, only include detections identified by 2 OR MORE sources(the `sources` field lists at least two codes, e.g. "0,1" = DeepPVMapper pipeline + FRPV reference, "0,2" = pipeline + OpenStreetMap). Default false: all detections are included, including those found by a single source (typically the automated pipeline alone).breakdown_rnb_id(required) — boolean — If true, also return how many of the matching detections do / do not have an rnb_id (ignores has_rnb_id for this breakdown).dpt— string — French département code, e.g. "33".insee— string — INSEE commune code.max_kwp— number — Maximum estimated installed capacity, in kWp.min_kwp— number — Minimum estimated installed capacity, in kWp.max_tilt— number — Maximum estimated tilt from horizontal, in degrees.min_tilt— number — Minimum estimated tilt from horizontal, in degrees.has_rnb_id— boolean — true = only detections matched to an RNB building identifier (rnb_id not null); false = only detections without one.max_azimuth— number — Maximum estimated azimuth, degrees clockwise from true north (180 = south).max_surface— number — Maximum estimated PV array area, in m².min_azimuth— number — Minimum estimated azimuth, degrees clockwise from true north (180 = south).min_surface— number — Minimum estimated PV array area, in m².max_vintages— integer — Maximum number of imagery vintages (e.g. 1 = seen in a single year only).min_vintages— integer — Minimum number of distinct imagery vintages (years) the installation was independently detected in. Use 2+ as a persistence/confidence signal, since a one-off detection in a single vintage is more likely to be a transient artifact.max_last_seen— integer — Upper bound on last_seen imagery year.min_last_seen— integer — Lower bound on last_seen imagery year.has_frpv_proba— boolean — true = only detections that have an FRPV comparison (frpv_proba not null); false = only those without one. A null frpv_proba means "no comparison available", not probability 0.max_first_seen— integer — Upper bound on first_seen imagery year.min_first_seen— integer — Earliest imagery year of first detection, lower bound (e.g. 2018). Not an installation date.min_frpv_proba— number — Minimum frpv_proba. The data contract recommends 0.1 as a precision/recall trade-off. Note: detections with a null frpv_proba (no FRPV comparison available) are excluded when this is set; null does not mean probability 0.cross_validated— boolean — Alias of quality_filter, kept for backward compatibility.sources_include— array — Only include detections present in ALL of these sources. Accepts names or codes, case-insensitive: dpvm/deeppvmapper/kasmi (0), frpv/thebault (1), osm/openstreetmap (2), manual/annotation (3), recall (4). Examples: ["osm"] = detections that are in OpenStreetMap; ["dpvm","frpv"] = present in both DeepPVMapper and FRPV. See get_source_reference for what each source is and where it comes from.false_positive_status— string — flagged = false_positive is true; not_flagged = false_positive is false; unrecorded = false_positive is null (no status recorded — NOT a confirmed true positive).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_source_breakdownBreak down detections by source code (0=DPVM pipeline, 1=FRPV reference, 2=OSM, 3=manual correction, 4=recall sample), for one département or all of France, with human-readable labels. A detection can carry several sources, so per-source counts overlap and do not add up to the total. Also returns how many detections are identified by 2+ sources (the meaning of quality_filter). Data quality note: this is a detection dataset, not an exhaustive inventory (estimated recall ~0.6). A missing detection does not mean no PV installation exists there. kwp, surface, tilt and azimuth are model estimates, not surveyed values. In this server, quality_filter=true keeps only detections identified by 2 or more sources (see source_encoding in get_data_quality_reference). Call get_data_quality_reference for the full picture before assessing fitness for a specific use case.
Parameters:
dpt— string — French département code, e.g. "33". Omit for all of France.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_detection_detailsGet the full record of one detection by id: technical characteristics (surface, kwp, tilt, azimuth — model estimates), imagery years, sources decoded into plain labels, frpv_proba, false-positive flag, rnb_id and location codes, plus simple confidence signals. Data quality note: this is a detection dataset, not an exhaustive inventory (estimated recall ~0.6). A missing detection does not mean no PV installation exists there. kwp, surface, tilt and azimuth are model estimates, not surveyed values. In this server, quality_filter=true keeps only detections identified by 2 or more sources (see source_encoding in get_data_quality_reference). Call get_data_quality_reference for the full picture before assessing fitness for a specific use case.
Parameters:
id(required) — integer — Registry identifier of the detection (the `id` field).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_department_profileOne-call profile of a département: installed capacity and national rank, yearly trend (by first-seen imagery year), source mix, share identified by 2+ sources, and share matched to an RNB building id. Cross-references the pre-computed department statistics with live counts. Data quality note: this is a detection dataset, not an exhaustive inventory (estimated recall ~0.6). A missing detection does not mean no PV installation exists there. kwp, surface, tilt and azimuth are model estimates, not surveyed values. In this server, quality_filter=true keeps only detections identified by 2 or more sources (see source_encoding in get_data_quality_reference). Call get_data_quality_reference for the full picture before assessing fitness for a specific use case.
Parameters:
dpt(required) — string — French département code, e.g. "33".
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_field_coverageCompleteness report: for each optional field of the registry (rnb_id, frpv_proba, false_positive, false_positive_source), how many detections have it filled in and what percentage. Answers "how many installations have an RNB id / an FRPV comparison / a false-positive flag?" in one call, for France or one département. For a single filtered count use count_detections instead. Null means "not available/recorded", never "0" or "confirmed ok". Data quality note: this is a detection dataset, not an exhaustive inventory (estimated recall ~0.6). A missing detection does not mean no PV installation exists there. kwp, surface, tilt and azimuth are model estimates, not surveyed values. In this server, quality_filter=true keeps only detections identified by 2 or more sources (see source_encoding in get_data_quality_reference). Call get_data_quality_reference for the full picture before assessing fitness for a specific use case.
Parameters:
dpt— string — French département code. Omit for all of France.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_field_distributionHistogram of a numeric field (kwp, surface, tilt, azimuth, n_vintages, first_seen, last_seen) with exact counts per bin, for France or one département. Answers "how are installations distributed by size / tilt / orientation / year?". kwp, surface, tilt and azimuth are model estimates. first_seen/last_seen are imagery years, not installation dates. Data quality note: this is a detection dataset, not an exhaustive inventory (estimated recall ~0.6). A missing detection does not mean no PV installation exists there. kwp, surface, tilt and azimuth are model estimates, not surveyed values. In this server, quality_filter=true keeps only detections identified by 2 or more sources (see source_encoding in get_data_quality_reference). Call get_data_quality_reference for the full picture before assessing fitness for a specific use case.
Parameters:
field(required) — string — Numeric field to describe.quality_filter(required) — boolean — If true, restrict to detections identified by 2+ sources.dpt— string — French département code. Omit for all of France.max_year— integer — For first_seen / last_seen: last year to count.min_year— integer — For first_seen / last_seen: first year to count.bin_edges— array — Custom ascending bin edges; each bin is [edge_i, edge_i+1) and the last is closed. Ignored for first_seen / last_seen, which are counted per year (use min_year / max_year).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_field_referenceField-by-field documentation of a detection record: type, unit, nullability, whether it is observed or a model estimate, how to read it, and which tool filters or reports it. Call this when the user asks what a field means or how reliable it is.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_source_referenceExplain the data sources behind the registry's `sources` field: for each source, its code, short key, name, accepted aliases, and where the data comes from (with references: code, thesis, papers). Use it for questions like "what is FRPV?", "where does the OSM data come from?", "what is a manual correction?". The `sources` field answers "where do we have this installation?": each listed code is a dataset or process that contains it. Example: "0,1" = present in both DeepPVMapper (DPVM) and FRPV; "0,2" = present in DeepPVMapper and OpenStreetMap.
Parameters:
source— string — A source name, alias or code (e.g. "frpv", "OpenStreetMap", "kasmi", "3"). Omit to list all.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_startedSTART HERE. Call this first when the user is new, asks what this server can do, or asks a vague question about DeepPVMapper. Returns a plain-language introduction, example questions, which tool answers which kind of question, a glossary and the main caveats. Reply to the user in their own language.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.