Skip to main content
Glama

mcp-resilland

AI-powered spatial intelligence for landscape restoration — now in any MCP client.

Built for the World Bank's $256M RESILAND CA+ program covering Uzbekistan, Kazakhstan, Kyrgyzstan, Tajikistan, and Turkmenistan.

PyPI version Python versions License: Apache 2.0 MCP compatible


mcp-resilland is a Model Context Protocol server that makes the full power of the RESILAND Intelligence platform available to Claude Desktop, Cursor, Continue, Windsurf, Zed, and any other MCP-capable client.

Ask your AI assistant questions like:

"Analyze cadastral parcel 1248 in Samarqand for drought-tolerant restoration, cite the Phase 4 policy documents, and generate a feasibility report in Turkish."

…and the model will call the right sequence of tools — pulling cadastral geometry, 12-month Sentinel-2 NDVI, OSM infrastructure proximity, country climate indicators, curated species fit, and pgvector-backed policy RAG — then synthesize the answer with Opus 4.7 on the RESILAND backend.


Features

  • 🗺️ 3,563 cadastral forest parcels (Uzbekistan pilot) + all 5 RESILAND CA+ countries

  • 🌱 Curated species catalog — 64 Central Asia tree/shrub species with climate profile, tolerances, restoration priorities, nursery availability

  • 🛰️ Sentinel-2 NDVI history — 12-month median per parcel from local Cloud-Optimized GeoTIFFs

  • 🌡️ Country climate indicators — ERA5 temperature, CHIRPS precipitation, GWIS FWI fire danger, SPI-3 drought, WRI water stress, Hansen tree-cover loss, MODIS dust

  • 🛣️ OSM infrastructure proximity — nearest road / settlement / water body across ~370K features for all 5 countries

  • 📄 Phase 4 policy RAG — pgvector semantic search across World Bank Phase 4 feasibility and nursery handbooks

  • 🤖 Opus 4.7 feasibility reports — 10-section Phase 4-style markdown with citations and token/cost accounting

  • 🌐 Four-language output — English · Türkçe · Русский · Oʻzbekcha


Related MCP server: Gods Eye Geospatial MCP

Install

pip install mcp-resilland

Or, if your MCP client supports it (recommended for Claude Desktop):

uvx mcp-resilland

Configure

Create an API key on the RESILAND dashboard: https://resilland.com/settings/api-keys

(Keys are free with soft daily/weekly/monthly quotas — no credit card.)

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "resilland": {
      "command": "uvx",
      "args": ["mcp-resilland"],
      "env": {
        "RESILLAND_API_KEY": "rsi_live_..."
      }
    }
  }
}

Cursor / Continue / Windsurf / Zed

Any MCP-capable client. Point the stdio transport at the mcp-resilland binary with the same environment variable.

Self-hosted backend

If you run your own RESILAND Intelligence instance, override the upstream:

export RESILLAND_BASE_URL=http://localhost:8000
export RESILLAND_API_KEY=rsi_live_...
mcp-resilland

Capabilities

Tools (16)

Tool

What it does

get_balance

Current API key quota state + totals

list_models

Available models + supported locales/countries

list_parcels

Cadastral parcel search (country / viloyat / tuman / bbox)

get_parcel

Parcel detail + nearest OSM + nearest nurseries

list_nurseries

Nurseries across the RESILAND region

get_nursery

Single nursery detail

analyze_area

Full spatial context: NDVI · climate · species · infrastructure · RAG

generate_feasibility_report

Opus 4.7 Phase 4-style markdown report with citations

translate_brief

EN ↔ TR ↔ RU ↔ UZ translation, markdown-preserving

get_stats_overview

Platform-wide KPIs (docs, chunks, NDVI, parcels, area, reports) ⭐ v0.2

get_stats_summary

Viewport-scoped counts (bbox filter) ⭐ v0.2

list_reports

List owned feasibility reports (language / scope / status filter) ⭐ v0.2

get_report

Full report detail — sections, siblings, shares, extra_metadata ⭐ v0.2

translate_report

Translate a report to another language (background task) ⭐ v0.2

create_report_share_link

Mint a 7-day public share URL ⭐ v0.2

get_report_pdf_url

Signed PDF URL (no binary streaming, MCP-friendly) ⭐ v0.2

Resources (8)

Resources are URI-addressable, read-only views the host can surface as "attach to chat" items, sidebar references, or autocomplete targets.

URI

Returns

resiland://info

Server version + runtime config

resiland://parcels/{parcel_id}

Parcel detail (same shape as get_parcel)

resiland://nurseries

Full nursery collection

resiland://species/{species_id}

Curated species record (climate profile, tolerances, restoration use-cases)

resiland://climate/{country}

Country-level climate indicators

resiland://reports

List of reports owned by the API-key user ⭐ v0.2

resiland://reports/{report_id}

Full report detail (sections, siblings, shares, extra_metadata) ⭐ v0.2

resiland://stats/overview

Live platform KPIs (same shape as the /stats dashboard) ⭐ v0.2

Prompts (3)

Pre-canned conversation starters the user can pick from their client's prompt picker.

Prompt

Purpose

restoration_brief

Produce a structured restoration recommendation for an area

species_matchmaker

Pick tree species matching given site conditions

report_center_workflow

Generate → translate → share → summarise a full Phase 4 report in one conversation ⭐ v0.2


Example conversations

You:   List all RESILAND-9 nurseries in Kazakhstan.
Claude: [calls list_nurseries(country="KAZ", category="RESILAND-9")]
        Here are the 9 RESILAND program nurseries in Kazakhstan…

You:   For parcel 1248, what are the top three drought-tolerant species?
Claude: [calls analyze_area(parcel_id=1248, query="drought tolerant")]
        Based on the curated species fit and Phase 4 RAG citations,
        the top three are Haloxylon ammodendron, Elaeagnus angustifolia,
        and Ulmus pumila…

You:   Generate a full feasibility report for the Dargom nursery in Turkish.
Claude: [calls generate_feasibility_report(nursery_id="…", locale="tr")]
        I've prepared a 2,300-word Turkish feasibility report.
        Estimated cost: $0.08. Sources cited: 7 Phase 4 chunks…

Architecture

    MCP Client (Claude Desktop / Cursor / Continue / Windsurf / Zed)
                          │  stdio (JSON-RPC)
                          ▼
                    mcp-resilland
              (FastMCP 3.x · Python 3.10+)
                          │  httpx async
                          ▼
              RESILAND Intelligence backend
                  https://resilland.com/v1/public/*
                          │
          ┌───────────────┼────────────────┐
          ▼               ▼                ▼
       PostGIS         pgvector         Opus 4.7
   (parcels · OSM)   (Phase 4 RAG)    Sonnet 4.6
                                       Haiku 4.5

The MCP server is a stateless proxy. It does not compute, store, or cache — all state lives on the RESILAND backend (PostGIS for geometry, pgvector for RAG, MinIO for tiles, Redis for the Anthropic response cache).


Development

git clone https://github.com/ilhankilic/mcp-resilland
cd mcp-resilland
pip install -e ".[dev]"

# Run against a local RESILAND backend:
RESILLAND_BASE_URL=http://localhost:8000 RESILLAND_API_KEY=rsi_live_... \
    python -m mcp_resilland

# Run tests:
pytest

Project layout

mcp-resilland/
├── pyproject.toml           # hatchling · Apache-2.0 · Python 3.10+
├── README.md                # this file
├── LICENSE                  # Apache 2.0
├── src/mcp_resilland/
│   ├── __init__.py          # package metadata
│   ├── __main__.py          # mcp-resilland console script entrypoint
│   ├── server.py            # FastMCP instance + module wiring
│   ├── client.py            # httpx async client (bearer auth)
│   ├── tools.py             # 9 MCP tools
│   ├── resources.py         # 4 MCP resources (URIs)
│   └── prompts.py           # 2 MCP prompts
└── tests/                   # pytest + respx

Authors

  • İlhan Kılıç — lead engineer, architect

  • Enis Kaan Keskin — spatial data, biodiversity modeling

Acknowledgments

We are grateful for the invaluable advisory support of:

  • İsmail Belen — President, United Nations Forum on Forests (UNFF)

  • Doç. Dr. Hülya Hernandez — FAO Türkiye Office (Food and Agriculture Organization of the United Nations, Türkiye Office)

Their guidance on international forest policy frameworks, landscape restoration standards, and Central Asia ecological context was instrumental in shaping this work.

We also thank the World Bank for the RESILAND CA+ Phase 4 feasibility documentation that forms the semantic-search corpus of this platform.



License

Licensed under the Apache License, Version 2.0. See LICENSE.

Copyright © 2026 İlhan Kılıç and Enis Kaan Keskin.

Available Tools

16 tools
analyze_areaA

Build a structured spatial context for this area. Returns a JSON payload containing:

  • subject (parcel / nursery / drawn polygon)

  • cadastral attributes

  • up to 5 nearest-neighbor parcels

  • up to 5 nearest nurseries with distance (km)

  • 12-month NDVI history (if cached)

  • country-level climate snapshot (ERA5 / CHIRPS / SPI / FWI)

  • OSM infrastructure proximity (road / settlement / water)

  • species fit scores from the curated Central Asia catalog

  • top-K semantic Phase 4 / handbook chunks (pgvector RAG)

Exactly one of parcel_id | cadastral_number | nursery_id | geojson must be provided. query focuses the RAG retrieval (e.g. "drought tolerant halophytes"). depth is shallow | standard | deep.

Locales: en | tr | ru | uz.

Inputs: depth, query, locale, geojson, +3 more. Returns: object

generate_feasibility_reportA

Generate a full Phase 4-style feasibility report with Opus 4.7.

Returns markdown body, source citations (with pgvector similarity), token usage, and cost in USD. Typical output is 1,800-2,500 words across 10 standard sections (Executive Summary, Site Context, Ecological Assessment, Species Plan, Nursery Linkages, Risks, Monitoring Plan, Timeline, Budget indication, Sources).

Exactly one area-reference parameter is required. locale: en | tr | ru | uz.

Inputs: locale, geojson, parcel_id, nursery_id, +1 more. Returns: object

get_balanceA

Return the current API key's quota state, totals, and scopes.

Inputs: no named parameters. Returns: object

get_nurseryA

Fetch full detail for a single nursery by UUID.

Inputs: nursery_id (required). Returns: object

get_parcelA

Fetch full detail for a single parcel by integer id: cadastral attributes, geometry, centroid, nearest nurseries, and cached OSM infrastructure proximity (nearest road / settlement / water body).

Inputs: parcel_id (required). Returns: object

get_reportA

Full report detail by UUID:

  • body_markdown (concatenated sections)

  • sections[]: timeline of every section_key with versions

  • siblings[]: other-language variants in the same analysis group

  • shares[]: active / expired share links

  • pdf_available_langs: which languages can produce a PDF

  • extra_metadata.verdict + context_snapshot when present (populated on reports generated after 2026-04-24; older reports fall back to section markdowns only).

Inputs: report_id (required). Returns: object

get_report_pdf_urlA

Generate a 7-day public URL that downloads the report as PDF.

Equivalent to create_report_share_link + the public PDF route, but packaged into one call. MCP-friendly: returns a plain URL that Claude or any HTTP client can fetch — no binary streaming.

Inputs: report_id (required), lang. Returns: object

get_stats_overviewA

Live platform KPIs straight from the production DB.

Returns 8 counters (documents, pgvector chunks, avg chunk tokens, NDVI rasters, Sentinel scenes, active data sources, total area hectares, cadastral parcels, nurseries, finalised reports), plus a data-sources panel, per-country coverage (UZB/KAZ/KGZ/TJK/TKM/ TUR), and a recent ingestion activity feed.

Same payload the resilland.com /stats dashboard renders.

Inputs: no named parameters. Returns: object

get_stats_summaryA

Viewport-scoped stats — counts parcels, total area, distinct viloyats (provinces) and nurseries inside a bbox.

Pass all 4 bbox params together for a filtered read; pass none to get global totals. Tuple order: [west, south, east, north] in EPSG:4326.

Inputs: max_lat, max_lng, min_lat, min_lng. Returns: object

list_modelsA

List available LLM + embedding models and supported locales/countries.

Inputs: no named parameters. Returns: object

list_nurseriesA

List forestry nurseries across the RESILAND region.

Inputs: country, category. Returns: object

list_parcelsC

List cadastral forest parcels.

Inputs: bbox, limit, tuman, country, +1 more. Returns: object

list_reportsA

List feasibility reports owned by this API key's user.

Inputs: limit, offset, language, scope_kind, +1 more. Returns: object

translate_briefB

Translate forestry / policy text across the four supported languages (Sonnet 4.6, markdown-preserving).

Inputs: text (required), target_lang (required), source_lang, preserve_markdown. Returns: object

translate_reportA

Translate an existing report to another language — creates a SIBLING in the same analysis_group. Runs as a background task so this tool returns in <1 s with the sibling as status='draft'.

Poll get_report(sibling_id) until status flips to 'final' (~30–90 s on Sonnet 4.6 depending on length).

Inputs: report_id (required), target_language (required), model. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 16 tools

    Disambiguation4/5

    Most tools have distinct purposes (get vs list, overview vs summary, brief vs report translation). Minor overlap exists between analyze_area and get_parcel, both returning parcel and nursery proximity data, but descriptions clarify scope.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun snake_case pattern (get_*, list_*, analyze_*, generate_*, translate_*, create_*). No mixed conventions or vague verbs.

    Tool Count4/5

    16 tools is slightly above the typical 3–15 well-scoped range, but the server covers multiple subdomains (parcels, nurseries, reports, stats, translation, AI analysis), so each tool earns its place.

    Completeness4/5

    The surface provides solid coverage for the forestry analysis workflow: list/detail for parcels and nurseries, report lifecycle (list, get, generate, translate, share, PDF), and stats. Minor gaps like no update/delete for reports or parcels are not critical for the domain.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Production-ready satellite imagery analysis server that enables natural language queries for Earth observation data, including land cover classification, vegetation monitoring, water detection, change detection, and automated environmental reporting.
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Bridges AI models with 24 years of Global Forest Watch data across 165+ countries, enabling natural language queries for deforestation and carbon emission insights.
      Apache 2.0