Skip to main content
Glama
Mireye-Labs

mireye-mcp

Official
by Mireye-Labs

mireye-mcp

Developed in a private monorepo. This repository (Mireye-Labs/mireye-earth-mcp) is the published source of the mireye-mcp PyPI package, snapshot-synced on every release. Issues and PRs are welcome here (changes are applied upstream and re-synced; the test suite runs in the monorepo); releases land via PyPI.

Expose Mireye Earth's /v1/ask and /v1/fetch endpoints to MCP clients that need a local stdio adapter (Claude Desktop, Cursor, custom agents built on the mcp Python SDK) as native tools — no HTTP wiring required.

This is a standalone PyPI package (mireye-mcp) with only two runtime dependencies — httpx and mcp. It does not pull in the geospatial backend, so there's no GDAL / rasterio / DuckDB build step.

The server is a local stdio adapter with no geospatial business logic: tool handlers POST to the deployed Mireye HTTP API, while read-only MCP resources fetch and cache the public field catalog.

Mireye also exposes a hosted remote MCP endpoint at https://api.mireye.com/mcp for clients that support Streamable HTTP and native OAuth. Use that hosted endpoint for Claude Code so /mcp opens the browser sign-in flow. This package remains the local stdio path; it uses mireye-mcp login or MIREYE_BEARER_TOKEN for credentials.


What the agent gets

Six tools, all prefixed mireye_ so they sort together and don't collide with generic ask / fetch tools from other MCP servers:

Tool

When the agent should call it

mireye_ask

The caller asked a question about a US place ("is this in a flood zone?", "wildfire risk?").

mireye_fetch

The caller wants specific named fields ("elevation and slope here") or is powering a workflow.

mireye_geocode

The caller gave an address and just wants the coordinate + its quality, nothing else.

mireye_lookup

The input might be ambiguous, isn't a clean address (a coordinate or an APN), or a parcel is wanted.

mireye_request_field

The catalog doesn't have the field the caller needs — describe it in plain language plus example locations and either get a live match now or a request_id to build it.

mireye_field_request_status

Poll a request_id from mireye_request_field for status, queue position, ETA, and (once live) the resume call.

Catalog context is exposed as MCP resources instead of extra tools:

Resource

What it returns

mireye://catalog/fields

Full field catalog.

mireye://catalog/presets

Preset names and field expansions.

mireye://catalog/us-envelope

Supported coordinate bounds.

mireye://field/{name}

One field definition.

mireye://preset/{name}

One preset expansion.

Workflow prompts are also registered — 22 in total. Claude Code surfaces MCP prompts as slash commands under the form /mcp__<server>__<prompt>.

Prompt

What it does

mireye_ask

Call mireye_ask with a lat/lng and question.

mireye_fetch

Call mireye_fetch with a lat/lng and optional fields/preset.

mireye_lookup

Call mireye_lookup with an address/lat,lng/APN, noting the disposition handling.

mireye_request_field

File a field request with mireye_request_field, noting the disposition handling.

mireye_field_request_status

Poll a field request's status with mireye_field_request_status.

mireye_fields

Browse or search the field catalog.

mireye_pick_fields

Choose the smallest useful field set for a free-text question.

mireye_site_report

Site report via the site_selection preset.

mireye_flood_check

Flood-relevant signals via the flood_risk preset.

mireye_wildfire_underwrite

Wildfire underwriting signals via the wildfire_underwrite preset.

mireye_terrain_report

Terrain signals via the terrain preset.

mireye_land_cover_report

Land cover signals via the land_cover preset.

mireye_building_lookup_report

Primary building details via the building_lookup preset.

mireye_points_of_interest_report

Nearby amenities via the points_of_interest preset.

mireye_utilities_report

Utility infrastructure via the utilities preset.

mireye_boundaries_report

Political/census boundaries via the boundaries preset.

mireye_solar_siting_report

Solar siting signals via the solar_siting preset.

mireye_wind_siting_report

Wind siting signals via the wind_siting preset.

mireye_storage_siting_report

Battery storage siting signals via the storage_siting preset.

mireye_data_center_siting_report

Data center siting signals via the data_center_siting preset.

mireye_grid_interconnect_report

Interconnection signals via the grid_interconnect preset.

mireye_natural_hazard_report

Natural hazard signals via the natural_hazard preset.

There is no third list_fields tool. Agents that need the catalog should read the MCP resources above; the stdio adapter backs them with GET /v1/meta/fields and a 1-hour ETag-aware cache.


Related MCP server: geo-agent

Install local stdio — one command with uvx

uvx mireye-mcp

That's it. uvx (bundled with uv) downloads the package into a managed cache, runs the entry point, and the next invocation is instant. No venv to manage, no pip install, no native builds.

If you don't have uv:

curl -LsSf https://astral.sh/uv/install.sh | sh

Plain pip also works:

pip install mireye-mcp
mireye-mcp  # entry point

Official MCP Registry

This server is published to the Official MCP Registry as com.mireye/earth — the entry is live (the publish job ships from release.yml), and mireye-mcp 0.2.0 is on PyPI. The registry entry carries both distributions:

  • the PyPI package mireye-mcp (local stdio, run via uvx), and

  • the hosted remote https://api.mireye.com/mcp (Streamable HTTP + OAuth) for clients that prefer a remote server.

Because the entry is live, registry-aware clients (VS Code, the GitHub MCP Registry, and anything else that reads the official registry) can discover and install it from there — no manual config required.


Wire it into Claude Desktop

First authenticate the local adapter:

mireye-mcp login

For non-interactive hosts, set MIREYE_BEARER_TOKEN instead.

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

{
  "mcpServers": {
    "mireye-earth": {
      "command": "uvx",
      "args": ["mireye-mcp"]
    }
  }
}

Restart Claude Desktop. The six tools (mireye_ask, mireye_fetch, mireye_geocode, mireye_lookup, mireye_request_field, mireye_field_request_status) appear under the 🔌 menu, with catalog resources and prompts available to clients that surface those MCP primitives.

To point at a self-hosted deployment instead of the default Fly URL:

{
  "mcpServers": {
    "mireye-earth": {
      "command": "uvx",
      "args": ["mireye-mcp"],
      "env": {
        "MIREYE_BASE_URL": "https://your-deploy.example.com"
      }
    }
  }
}

Wire it into Claude Code

Use the hosted HTTP MCP endpoint instead of this local stdio package:

claude mcp remove mireye-earth -s user   # only needed if an old stdio entry exists
claude mcp add --transport http --scope user mireye-earth https://api.mireye.com/mcp

Restart Claude Code, run /mcp, and follow the browser OAuth flow. Slash commands appear as:

  • /mcp__mireye-earth__mireye_ask <lat> <lng> <question>

  • /mcp__mireye-earth__mireye_fetch <lat> <lng> [fields] [preset]

Or just chat naturally — Claude Code will call the tool when relevant.


Wire it into Cursor

Cursor's MCP config lives at ~/.cursor/mcp.json (global) or <repo>/.cursor/mcp.json (workspace). Same shape as Claude Desktop:

{
  "mcpServers": {
    "mireye-earth": {
      "command": "uvx",
      "args": ["mireye-mcp"]
    }
  }
}

Open Cursor → Settings → MCP and confirm mireye-earth shows the two green tools. Catalog resources and prompts appear when the client supports those MCP primitives.


Wire it into a custom agent

If you're building an MCP client with the mcp Python SDK, point its StdioServerParameters at the installed entry point:

from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

params = StdioServerParameters(command="uvx", args=["mireye-mcp"])

async with stdio_client(params) as (read, write):
    async with ClientSession(read, write) as session:
        await session.initialize()
        tools = await session.list_tools()
        # tools.tools is [mireye_ask, mireye_fetch]
        resources = await session.list_resources()
        prompts = await session.list_prompts()

        result = await session.call_tool(
            "mireye_ask",
            {"lat": 40.7128, "lng": -74.0060, "question": "elevation?"},
        )

Configuration

Env var

Default

Purpose

MIREYE_BASE_URL

https://api.mireye.com

HTTP base URL the tools POST to. Stored login credentials only attach when they were created against this same URL.

MIREYE_TIMEOUT_S

120

Per-request timeout in seconds (must exceed the ~110 s /v1/ask deadline).

MIREYE_BEARER_TOKEN

unset

Optional Mireye bearer token. Overrides stored credentials for tool calls; status reports on the stored login first.

MIREYE_MCP_CREDENTIALS_FILE

~/.config/mireye-mcp/credentials.json

Stored token path used by login / status / logout.

Authentication

The local stdio adapter does not perform native MCP OAuth discovery. The HTTP API requires bearer auth for /v1/ask and /v1/fetch, so run the device login helper once:

mireye-mcp login

The command prints a verification URL and code, waits for approval in the Mireye account page, and stores a Mireye API token locally. You can also provide a token directly:

{
  "mcpServers": {
    "mireye-earth": {
      "command": "uvx",
      "args": ["mireye-mcp"],
      "env": {
        "MIREYE_BEARER_TOKEN": "eyJ..."
      }
    }
  }
}

Check or remove local credentials:

mireye-mcp status
mireye-mcp logout
mireye-mcp logout --revoke

Credentials are bound to their base URL

login records the MIREYE_BASE_URL it ran against, and the stored token is only ever sent to that same URL. If MIREYE_BASE_URL later points somewhere else, tool calls behave as logged out and the error names both URLs — re-run mireye-mcp login against the new URL, or set MIREYE_BEARER_TOKEN explicitly. Credentials files without a recorded base_url (e.g. hand-written) are treated as bound to the default https://api.mireye.com.

Two more guardrails:

  • Tokens of any kind are never sent over plain http://, except to loopback hosts (localhost / 127.0.0.1 / [::1]) for local development.

  • status and logout --revoke operate on the stored base URL, so you can always inspect or revoke a stored login even while MIREYE_BASE_URL points elsewhere.

For native MCP OAuth, configure your client to use the hosted remote MCP URL https://api.mireye.com/mcp instead of launching this stdio binary. The remote endpoint advertises OAuth metadata and uses browser OAuth 2.1 + PKCE.


Troubleshooting

Server doesn't appear in Claude Desktop. Check that uvx resolves on the PATH used by the GUI app (macOS launches GUI apps with a minimal PATH). Test from a terminal: which uvx. If empty, install uv: curl -LsSf https://astral.sh/uv/install.sh | sh. If uvx lives at /Users/you/.local/bin/uvx, use the absolute path in command.

Tools not appearing under the 🔌 menu after restart. Watch ~/Library/Logs/Claude/mcp-server-mireye-earth.log. The server logs to stderr on startup; you should see [mireye-mcp] starting base_url=…. If there's no log, uvx isn't being invoked — usually a PATH issue.

ConnectError / ReadTimeout on the first tool call. The hosted API keeps its machines running, but calls right after a backend deploy can be slow while geospatial sources warm in the background, and some fields depend on slow upstream federal services. The default MIREYE_TIMEOUT_S (120 s) already exceeds the ~110 s /v1/ask deadline, so a cold start fits; only raise it further (never below 120) if you still time out.

HTTP 400 coord_out_of_bounds. Mireye is US-only in V1. The accepted envelope is lat ∈ [18, 72], lng ∈ [-180, -65] — covering the lower 48, Alaska, Hawaii, and US territories.

HTTP 400 fields_unknown. The field name is not in the catalog. Hit https://api.mireye.com/v1/meta/fields to see the canonical list. Common surprises: elevation_m is elevation, floodplain is within_floodplain_polygon.

HTTP 4xx/5xx in general. Tool errors include actionable JSON fields such as code, message, http_status, request_id, tool, and retryable. Agents should retry only when retryable is true.

Auth errors. 401 means the MCP server has no token, the token expired, or the token was revoked. Run mireye-mcp login again, or set MIREYE_BEARER_TOKEN. 403 means the signed-in account is not allowed by the backend account policy.


What this server does NOT do

  • No data-result caching. The HTTP API has its own response cache (local disk, plus a shared Redis tier in production). The stdio adapter only caches the public field catalog resource.

  • No geospatial business logic. The adapter validates obvious MCP input bounds and field-count limits, but source orchestration stays in the API.

  • No streaming. MCP streaming responses are V1.5.

  • No Firebase validation in MCP. The MCP package forwards bearer tokens; the HTTP API owns token verification and account policy.

  • No in-process imports of mireye_earth. The server talks to the API over HTTP only, so it ships as a separate slim PyPI package (mireye-mcp) and can be installed without the data backend.


Releasing

This package is published from this directory on every v* tag on the main repo. To release locally:

cd mcp_server
python -m build
twine upload dist/*

Available Tools

2 tools
mireye_askAsk MireyeA
Read-onlyIdempotent
Inspect

Answer a natural-language question about a US coordinate, with citations to authoritative federal data sources. Returns the answer plus per-citation provenance (source, source URL, fetched_at, confidence). Use this when the caller has a specific question about a place (e.g. 'is this in a flood zone?', 'what's the wildfire risk here?', 'what kind of building is at this address?').

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude in decimal degrees inside the supported US envelope.
lngYesLongitude in decimal degrees inside the supported US envelope.
questionYesNatural-language question about the coordinate.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, non-destructive, idempotent, and open-world behavior. The description adds valuable context about the return format (answer plus per-citation provenance with source, URL, fetched_at, confidence) and confirms the tool uses authoritative federal data. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: the first explains what the tool does and what it returns, the second provides usage guidance with examples. Every sentence adds value, and the structure is well front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (mentioned in context), the description appropriately focuses on the tool's purpose and return structure. It covers all necessary aspects: what it does, when to use it, and the key output elements. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema provides clear descriptions for lat, lng, and question (including bounds and length constraints). The tool description adds that the question is 'natural-language' but does not provide additional meaning beyond what the schema already conveys. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool answers natural-language questions about US coordinates with citations. Examples like 'is this in a flood zone?' help convey the purpose. However, it does not explicitly differentiate from the sibling tool mireye_fetch, so clarity is high but not maximal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises when to use the tool ('when the caller has a specific question about a place') with concrete examples. It does not mention when not to use it or provide alternatives (e.g., mireye_fetch for raw data), but the guidance is still actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mireye_fetchFetch Mireye FieldsA
Read-onlyIdempotent
Inspect

Fetch specific data fields at a US coordinate with full provenance per field. Use this when the caller knows exactly which fields they need (e.g. 'elevation and slope at this point') or wants to power a custom workflow. Each field includes its value, source, source URL, fetched_at timestamp, and confidence.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude in decimal degrees inside the supported US envelope.
lngYesLongitude in decimal degrees inside the supported US envelope.
fieldsNo
presetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare safe, read-only behavior. The description adds valuable behavioral details: each field includes its value, source, source URL, fetched_at timestamp, and confidence. This goes beyond annotations by explaining the provenance structure, though it does not cover all edge cases like rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose and usage guidance. Every sentence is necessary and adds value without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 4 parameters with 2 required, no enums, an output schema, and sibling tools, the description covers the main purpose, usage context, and return format. It lacks explicit mention of the 'preset' parameter and how it relates to 'fields'. However, the output schema likely covers return values, so completeness is high but not perfect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50% (lat, lng, fields have descriptions; preset only has enum list). The description mentions fetching 'specific data fields' and 'each field includes...', which partly explains the 'fields' parameter, but does not explicitly describe 'lat', 'lng', or 'preset'. The description adds some value but does not fully compensate for the schema's lack of explanation for some parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Fetch', the resource 'specific data fields at a US coordinate', and adds detail about provenance. It differentiates from the sibling 'mireye_ask' by specifying this tool is for when the caller knows exactly which fields they need.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Use this when the caller knows exactly which fields they need...or wants to power a custom workflow.' It provides an example and implies that for less specific needs, the sibling 'mireye_ask' might be more appropriate, but does not explicitly state when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 2 tool updatesv0.2.0
    • First observedmireye_ask
    • First observedmireye_fetch

TDQS

A4.4/5.0
Disambiguation5/5

The two tools have clearly distinct purposes: mireye_ask handles natural-language questions with implicit field selection, while mireye_fetch retrieves explicitly specified data fields. There is no overlap or ambiguity.

Naming Consistency5/5

Both tools follow the same 'mireye_<verb>' pattern with snake_case, using descriptive verbs ('ask' and 'fetch'). The naming is consistent and predictable.

Tool Count4/5

With only two tools, the server is minimal but scoped appropriately for its purpose of US coordinate data queries. It could potentially benefit from a metadata tool, but the count is not unreasonable for the stated domain.

Completeness4/5

The server covers the two primary interaction modes: asking questions and fetching specific fields. It may lack a discovery or listing tool, but the existing tools provide a full workflow for obtaining data with provenance.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    B
    maintenance
    Exposes live earth-science data (e.g., earthquakes from USGS) as tools for MCP-compatible AI agents, enabling them to fetch and reason about real-time geophysical events.
    1
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Remote MCP server exposing US Census (ACS 5-year) and FEMA flood data. Works as a connector in both Claude and ChatGPT.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Mireye-Labs/mireye-earth-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server