# io.github.mapsmith-ai/mapsmith (pypi · mapsmith)

Deterministic GIS geoprocessing for AI agents, with verifiable provenance on every output

- Trust score: 37/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-22

## Components

- oci · `ghcr.io/mapsmith-ai/mapsmith:0.2.2`: 38/100, [markdown](https://verifymcp.io/servers/mapsmith-ai-mapsmith/ghcr-io-mapsmith-ai-mapsmith-0-2-2.md), [page](https://verifymcp.io/servers/mapsmith-ai-mapsmith/ghcr-io-mapsmith-ai-mapsmith-0-2-2)
- pypi · `mapsmith`: 37/100 (this document), [markdown](https://verifymcp.io/servers/mapsmith-ai-mapsmith/mapsmith.md), [page](https://verifymcp.io/servers/mapsmith-ai-mapsmith/mapsmith)

## Channel facts

- Registry: `pypi`
- Package: `mapsmith`
- Version: `0.2.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-22.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it.
  - 2 of 42 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 35/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: no license is declared.
  - Actively maintained (last published 0 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 0/100
  - Schema quality not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- **Tool Coverage**: 0/100
  - Tool coverage not yet verified: we do not have a sandbox capture of the tool definitions this version of the package serves yet.
- **Capabilities**: 0/100
  - Protocol version not yet verified: we do not have a sandbox capture of the MCP handshake this version of the package performs yet.

**Unverified: 4 categories.** Categories scored 0 because our sandbox run of this package has not given us the schema these checks need to read. That is a gap on our side rather than a finding about the package, and we only credit what we can confirm, so the score stands at 0 until the capture succeeds. We are working through the fleet, so this normally clears without any action from you.

## Install

### How do I install the io.github.mapsmith-ai/mapsmith MCP server?

io.github.mapsmith-ai/mapsmith runs locally as a PyPI package, launched with uvx mapsmith. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add mapsmith-ai-mapsmith -- uvx mapsmith
```

### Cursor

```json
{
  "mcpServers": {
    "mapsmith-ai-mapsmith": {
      "command": "uvx",
      "args": [
        "mapsmith"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "mapsmith-ai-mapsmith": {
      "command": "uvx",
      "args": [
        "mapsmith"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add mapsmith-ai-mapsmith -- uvx mapsmith
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mapsmith-ai-mapsmith": {
      "type": "local",
      "command": [
        "uvx",
        "mapsmith"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add mapsmith-ai-mapsmith --command uvx --arg mapsmith
```

### Hermes

```yaml
mcp_servers:
  mapsmith-ai-mapsmith:
    command: "uvx"
    args: ["mapsmith"]
```

### Netclaw

```json
{
  "McpServers": {
    "mapsmith-ai-mapsmith": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "mapsmith"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add mapsmith-ai-mapsmith -t stdio -c uvx -a mapsmith
```

### Other

```json
{
  "mcpServers": {
    "mapsmith-ai-mapsmith": {
      "command": "uvx",
      "args": [
        "mapsmith"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-22 (score 37, −28)

- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional] Package version: 0.2.1 → 0.2.2

### 2026-08-20 (score 65)

First indexed and scored.

## MCP tools (16)

### `describe_dataset` (~46 tokens)

Inspect a vector dataset: CRS, geometry types, schema, extent, feature count.

Call this before any analysis on a dataset you have not inspected yet.

Input parameters:

- `path` (string, required)

### `buffer_layer` (~107 tokens)

Buffer all features by a distance in meters.

Geographic-CRS inputs are reprojected to an estimated UTM zone for the metric
operation and back; the decision is recorded in the provenance manifest.
A `warnings` key in the result flags a suspicious-but-valid outcome with a
hint — e.g. a negative distance that eroded every geometry away.

Input parameters:

- `distance_meters` (number, required)
- `input_path` (string, required)
- `output_path` (string, required)

### `clip_layer` (~97 tokens)

Clip a layer to the area of a mask layer. CRS are aligned automatically.

A `warnings` key in the result means the analysis ran but something is worth
your attention (typically an empty result, or inputs whose extents do not
overlap); each entry carries a hint. Inputs without a CRS are refused.

Input parameters:

- `input_path` (string, required)
- `mask_path` (string, required)
- `output_path` (string, required)

### `reproject_layer` (~111 tokens)

Reproject a layer to a target CRS, e.g. 'EPSG:32632' or a WKT string.

Inputs without a CRS are refused. Geometry passes through unchanged, so an
invalid input yields an invalid output: mechanically broken geometry is
repaired deterministically and reported in a `repairs` key — read it, the
geometry type may have changed.

Input parameters:

- `input_path` (string, required)
- `output_path` (string, required)
- `target_crs` (string, required)

### `spatial_join` (~134 tokens)

Join by spatial predicate (intersects/within/contains).

engine='auto' routes to the fastest available engine for the inputs:
SedonaDB (heavy joins, 10-180x) > DuckDB (GeoParquet fast path) > GeoPandas.
A `warnings` key in the result flags an empty join or inputs whose extents
do not overlap, each with a hint. Inputs without a CRS are refused.

Input parameters:

- `engine` (string)
- `left_path` (string, required)
- `output_path` (string, required)
- `predicate` (string)
- `right_path` (string, required)

### `run_sql` (~76 tokens)

Run spatial SQL (DuckDB dialect, ST_* functions, read_parquet/ST_Read for files).

Without output_path: returns up to 50 preview rows. With output_path (.parquet):
materializes the full result as GeoParquet with a provenance manifest.

Input parameters:

- `output_path` (string)
- `query` (string, required)

### `zonal_statistics` (~148 tokens)

Statistics of a raster within each vector zone (exact fractional pixel coverage).

stats: subset of count/sum/mean/median/min/max/stdev/variance/majority/minority/
variety (default: count, mean, min, max). Zones are aligned to the raster CRS
automatically; the decision is recorded in the provenance manifest.
Zones without a CRS are refused; `warnings` and `repairs` keys in the result
flag a suspicious outcome or geometry MapSmith had to repair.
Requires the [raster] extra.

Input parameters:

- `output_path` (string, required)
- `raster_path` (string, required)
- `stats`
- `zones_path` (string, required)

### `hillshade` (~115 tokens)

Shaded relief from a DEM: GeoTIFF in, GeoTIFF out (values scaled 0-32767).

azimuth = sun direction in degrees (default 315, NW); altitude = sun angle
above the horizon (default 30). DEMs without a CRS are rejected.
Requires the [whitebox] extra.

Input parameters:

- `altitude` (number)
- `azimuth` (number)
- `dem_path` (string, required)
- `output_path` (string, required)
- `z_factor` (number)

### `flow_accumulation` (~107 tokens)

D8 flow accumulation from a DEM (GeoTIFF in/out). Depressions are filled first.

out_type: 'cells' (upslope cell count, includes the cell itself) or 'sca'
(specific catchment area). log_transform=True for visualization-friendly
values. Requires the [whitebox] extra.

Input parameters:

- `dem_path` (string, required)
- `log_transform` (boolean)
- `out_type` (string)
- `output_path` (string, required)

### `watershed` (~100 tokens)

Watershed of each pour point: DEM + points in, basin raster out (GeoTIFF).

Basins get 1-based IDs following the pour-point feature order; cells not
draining to any point stay nodata. Points are aligned to the DEM CRS
automatically (decision recorded). Requires the [whitebox] extra.

Input parameters:

- `dem_path` (string, required)
- `output_path` (string, required)
- `pour_points_path` (string, required)

### `validate_plan` (~259 tokens)

Statically validate a multi-step geoprocessing plan BEFORE running anything.

Write the plan as steps in execution order; each step has a unique id, an
operation name from list_operations, and its arguments. Use "$step_id" as an
argument value to consume the output dataset of an earlier step. Checks:
operations exist and are installed, arguments complete and well-typed,
references resolve backwards (mis-ordered steps are rejected), input files
exist, outputs don't collide, and CRS flow is simulated end-to-end from the
real input files. Returns machine-actionable errors/warnings/notes plus the
simulated output CRS per step. Nothing is executed and nothing is written.

Example plan: {"goal": "wells at risk", "steps": [
  {"id": "buf", "operation": "buffer_layer", "arguments":
    {"input_path": "wells.gpkg", "distance_meters": 300, "output_path": "buf.parquet"}},
  {"id": "cut", "operation": "clip_layer", "arguments":
    {"input_path": "$buf", "mask_path": "zone.gpkg", "output_path": "risk.parquet"}}]}

Input parameters:

- `plan` (required)

### `execute_plan` (~176 tokens)

Validate, then execute a geoprocessing plan step by step.

The plan is re-validated first (an invalid plan runs nothing). Steps run in
order; "$step_id" references resolve to the outputs of earlier steps. Every
step writes its own provenance manifest, and a plan-level manifest
(<last output>.plan.json, with the plan sha256 and per-step outcomes) ties
them together. Execution stops at the first failing step; outputs already
produced stay on disk with their manifests. Same plan format as
validate_plan — validate first, then execute.

A `step_warnings` key in the response means the plan ran but some step
produced a suspicious result (an empty output, non-overlapping inputs):
read it before treating a completed plan as a correct one.

Input parameters:

- `plan` (required)

### `get_provenance` (~30 tokens)

Return the full lineage manifest of a MapSmith output dataset.

Input parameters:

- `output_path` (string, required)

### `preview_map` (~125 tokens)

Show datasets on the interactive in-chat map panel (MCP Apps).

Pass the paths of one or more MapSmith outputs or source datasets (vector
or GeoTIFF). Layers are previewed in EPSG:4326 with simplified geometry and
capped feature counts sized to fit client limits; each layer card shows its
provenance summary and verification status. Read-only: the datasets of
record stay on disk. On clients without MCP Apps support the same payload
is returned as structured data.

Input parameters:

- `max_features` (integer)
- `paths` (array, required)

### `list_operations` (~119 tokens)

Search the catalog of available and planned operations (progressive discovery).

Describe what you need in plain words (e.g. 'statistics of a raster inside
polygons') and results come back ranked by relevance (BM25). Compact entries
by default; detail=True adds parameters and worked example calls — use it on
the exact operation name before calling an unfamiliar tool. Empty query
lists the whole catalog including planned (not yet available) operations.

Input parameters:

- `detail` (boolean)
- `limit` (integer)
- `query` (string)

Output parameters:

- `result` (array)

### `server_info` (~18 tokens)

MapSmith version, licensing, and available engines.

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/mapsmith-ai-mapsmith/mapsmith#diagnostics

## Score history

- 2026-08-22: 37
- 2026-08-21: 65
- 2026-08-20: 65

## Common questions

### What is the io.github.mapsmith-ai/mapsmith MCP server?

io.github.mapsmith-ai/mapsmith is an MCP server listed in the public MCP registry as io.github.mapsmith-ai/mapsmith. Deterministic GIS geoprocessing for AI agents, with verifiable provenance on every output. This page covers its PyPI package (mapsmith).

### Is the io.github.mapsmith-ai/mapsmith MCP server safe to use?

io.github.mapsmith-ai/mapsmith scores 37 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 22 August 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.mapsmith-ai/mapsmith MCP server expose?

io.github.mapsmith-ai/mapsmith exposes 16 tools: describe_dataset, buffer_layer, clip_layer, reproject_layer, spatial_join, and 11 more. Their descriptions and schemas cost roughly 1,768 tokens of context every time the server is loaded.

### Is the io.github.mapsmith-ai/mapsmith MCP server still maintained?

io.github.mapsmith-ai/mapsmith is still listed as active in the MCP registry. We last reached this channel on 22 August 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- PyPI project: https://pypi.org/project/mapsmith/
- Socket report: https://socket.dev/pypi/package/mapsmith
- Repository: https://github.com/mapsmith-ai/MapSmith
- Changelog RSS feed: https://verifymcp.io/servers/mapsmith-ai-mapsmith/mapsmith.xml
- Changelog JSON feed: https://verifymcp.io/servers/mapsmith-ai-mapsmith/mapsmith.json
- HTML version of this page: https://verifymcp.io/servers/mapsmith-ai-mapsmith/mapsmith
