San Diego City GIS MCP

San Diego City GIS MCP

Enables querying and spatial analysis of City of San Diego GIS layers (zoning, habitats, land use, etc.) via ArcGIS REST services, with tools for search, metadata, and spatial queries.

Category
访问服务器

README

OpenContext

<p align="center"> <img src="docs/opencontext_logo.png" alt="OpenContext Logo" width="400"> </p>

License: MIT Python 3.11+ MCP Compatible


Audubon IBA MCP — a National Audubon Society Important Bird Areas fork of OpenContext (forked from the San Diego City GIS fork). It serves Audubon's public IBA feature service through the audubon_iba plugin.

Where the sibling GIS forks front a whole portal or services directory, this one fronts one fixed FeatureServer with a known schema. There is nothing to crawl, so the catalog-discovery machinery is gone: no search_datasets, no get_aggregations, no catalog manifest, no dataset-id resolution. What carries over is the ArcGIS REST plumbing — WGS84 handling, coded-value domain decoding, pagination, and error surfacing.

An IBA is a conservation priority, not a legal status. IBA designation is science-based (BirdLife/Audubon criteria, ranked Global / Continental / State). It carries no legal or regulatory force: it does not protect land, restrict its use, or trigger permitting, and the boundaries are advisory rather than authoritative property lines. This server states that in its MCP instructions, in its tool descriptions, and in a footer on its output.


The data source

https://services1.arcgis.com/lDFzr3JyGEn5Eymu/arcgis/rest/services/iba_polygons_public/FeatureServer

  layer 0   iba_polygons_public  -- the main IBA polygon record
  tables    3 criteria_site    4 criteria_species   5 habitat   6 landuse
            7 observation      8 ownership          9 site_description
           10 species         11 threat

Public and key-less. Layer 0's fields, coded-value domains, record cap (2000), and relationship ids are read from the service at runtime (?f=json) and cached — nothing is hardcoded beyond the fields the tools actually name.

Sites are addressed by site_id (e.g. 1004 = Anchorage Coastal), which you get from search_ibas or find_ibas_near_point.

The WGS84 contract

The polygons are authored in EPSG:3857 (Web Mercator). Every query sets inSR=4326 and outSR=4326, so all tools take and return WGS84 lat/lng and the service reprojects server-side. Without inSR, a WGS84 point would be read as Web Mercator metres and silently match nothing. find_ibas_near_point adds a server-side buffer (distance + units=esriSRUnit_Kilometer) rather than computing geometry client-side.

Pagination is metadata-driven: maxRecordCount is read from the service, and both /query and /queryRelatedRecords page with resultOffset/resultRecordCount.

Tools exposed

Tool Purpose
audubon_iba__find_ibas_near_point "Which IBAs are near here?" — buffers a WGS84 lat/lng by radius_km and returns every IBA polygon it intersects
audubon_iba__search_ibas Attribute search: state (name or two-letter code), priority (Global/Continental/State), flyway, name (case-insensitive substring). Output leads with TOTAL MATCHING, so "how many IBAs in X?" needs no paging
audubon_iba__get_iba_details The full polygon record for one site_id, leading with ebird_link
audubon_iba__get_iba_related_records The tables behind a site, by category: species, criteria, criteria_species, habitat, landuse, ownership, threat, observation, description
audubon_iba__list_distinct_values Cheap enum discovery for a field (flyway, iba_priority, iba_eba, iba_status, …) so you can filter on an exact value instead of guessing

Workflow: fetch the polygon record first, then pull a related table only when the question needs one — species/criteria for why it was designated, threat/ownership/landuse for stewardship context, habitat for ecosystem, observation for history.

ebird_link is the integration point. It pre-joins each IBA to its eBird hotspot/region. For recent or live sightings, surface that link (or chain to an eBird MCP server) rather than reporting the stale observation table.

Connect to the server

Add it as a custom connector in Claude (same steps on Claude.ai and Claude Desktop):

  1. Settings → Connectors (or Customize → Connectors on claude.ai)
  2. Add custom connector
  3. Name it e.g. Audubon IBA and paste your deployment's /mcp URL.

Quick health check from a terminal:

curl -sS -X POST http://localhost:8000/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"ping"}'
# → {"jsonrpc":"2.0","id":1,"result":{"status":"ok"}}

Raw JSON-RPC example:

curl -sS -X POST http://localhost:8000/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"audubon_iba__find_ibas_near_point",
                 "arguments":{"lat":61.17,"lng":-149.9,"radius_km":40}}}'

Verified end-to-end

The definition-of-done is a two-step chain around Anchorage (61.17, -149.9): a 40 km buffer search, then a related-record traversal on a site it returns. Together they prove the WGS84 buffer contract and the site_id → objectid → queryRelatedRecords chain (the relationship id is not the related table's id, and queryRelatedRecords keys on objectid, not site_id).

// audubon_iba__find_ibas_near_point
{ "lat": 61.17, "lng": -149.9, "radius_km": 40 }

returns six Alaska IBAs — Anchorage Coastal, Campbell Creek, Goose Bay, Palmer Hay Flats, Susitna Flats, Swanson Lakes — each with its priority rank and ebird_link. Traversing one of them:

// audubon_iba__get_iba_related_records
{ "site_id": 1004, "category": "species" }

returns the birds Anchorage Coastal was designated for (Short-billed Dowitcher, Snow Goose, Hudsonian Godwit, Sandhill Crane).

scripts/smoke_prod.py runs both plus eight more checks against any deployment:

python scripts/smoke_prod.py                             # production
python scripts/smoke_prod.py http://localhost:8000/mcp   # local

Data use

The endpoint is public, but Audubon routes formal reuse of the spatial data through a request process. Ad-hoc display and analysis in conversation is fine; anything beyond that should go through Audubon.

Local development

uv sync                              # or: pip install -r requirements.txt
python scripts/local_server.py       # serves http://localhost:8000/mcp
python -m pytest tests/ -q           # tests

On Windows, set PYTHONIOENCODING=utf-8 before local_server.py (it prints emoji).

See CLAUDE.md and docs/ for architecture, deployment, and plugin development.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选