Skip to main content
Glama

FEMA NFHL MCP Server

An MCP (Model Context Protocol) server that gives AI assistants direct access to the FEMA National Flood Hazard Layer (NFHL) — the official source for flood zone data in the United States.

Built on the official FEMA ArcGIS REST API.

Built by Revex.agency.


Tools

Tool

Description

get_flood_zone

Look up the FEMA flood zone for a lat/lon. Returns zone code (AE, X, VE, etc.), SFHA status, floodway, BFE, and FIRM source panel.

get_firm_panel

Get the FIRM (Flood Insurance Rate Map) panel number and effective date for a location.

check_nfhl_availability

Check whether FEMA has NFHL flood map coverage for a location.

get_lomrs

Get Letters of Map Revision (LOMRs) affecting a location.

get_lomas

Get Letters of Map Amendment (LOMAs) near a location.

get_base_flood_elevations

Get Base Flood Elevation (BFE) lines near a location.


Related MCP server: civic-library-mcp

Remote Usage (No Setup Required)

The server is deployed at:

https://fema-nfhl-mcp.vercel.app/api/mcp

Claude.ai (Browser)

  1. Go to claude.aiSettingsIntegrations

  2. Click Add custom MCP

  3. Enter the URL: https://fema-nfhl-mcp.vercel.app/api/mcp

  4. All 6 flood tools are immediately available in your conversations

Any MCP-Compatible Client

Add the remote server URL to your client's MCP configuration. No Node.js, no npm install, no build step required.


Local Installation

Quick Start (npm)

npx fema-nfhl-mcp

Cursor

Add to .cursor/config.json:

{
  "mcpServers": {
    "fema-nfhl": {
      "command": "npx",
      "args": ["fema-nfhl-mcp"]
    }
  }
}

Claude Desktop

Add to %AppData%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "fema-nfhl": {
      "command": "npx",
      "args": ["fema-nfhl-mcp"]
    }
  }
}

Development

Requirements

  • Node.js 18+

  • npm

Setup

git clone https://github.com/Revex-Agency/fema-nfhl-mcp.git
cd fema-nfhl-mcp
npm install
npm run build

Run from Source (no build step)

{
  "mcpServers": {
    "fema-nfhl": {
      "command": "npx",
      "args": ["tsx", "src/index.ts"]
    }
  }
}

Run from Build

{
  "mcpServers": {
    "fema-nfhl": {
      "command": "node",
      "args": ["/absolute/path/to/fema-nfhl-mcp/dist/src/index.js"]
    }
  }
}

Data Source

All data is sourced in real time from the official FEMA NFHL ArcGIS REST service:

https://hazards.fema.gov/arcgis/rest/services/public/NFHL/MapServer

No API key required. No data is stored or cached locally.


Flood Zone Reference

Zone

Description

A / AE / AH / AO / AR

High-risk flood zone (SFHA) — mandatory flood insurance for federally-backed mortgages

VE / V

High-risk coastal zone with wave action (SFHA)

X (shaded)

Moderate risk — 0.2% annual chance flood

X (unshaded)

Minimal risk

D

Undetermined risk (area not studied)


License

MIT

Available Tools

6 tools
check_nfhl_availabilityA

Check whether the FEMA National Flood Hazard Layer (NFHL) has official flood map coverage for a given location. Run this first if other tools return no data — it tells you whether FEMA has mapped this area at all.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude in decimal degrees (WGS84)
lonYesLongitude in decimal degrees (WGS84)

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose that the tool is a read-only check and implies a yes/no result, but it doesn't describe the response format, error behavior, or limitations (e.g., locations outside mapped areas).

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 sentences with no waste. The first sentence states the core purpose, and the second adds practical usage guidance. Information is front-loaded and every sentence earns its place.

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?

For a simple two-parameter tool with fully described inputs, the description is largely complete: it explains what it checks, when to run it, and what the result conveys. It doesn't specify the exact return format, but 'tells you whether' sufficiently implies a boolean or coverage-status response.

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%, so the schema already documents both parameters. The description only refers to 'a given location' and adds no further parameter-level detail, matching the baseline for full schema coverage.

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 states a specific verb ('Check whether'), a specific resource (FEMA National Flood Hazard Layer), and a clear outcome (has official flood map coverage). It positions the tool as a preliminary coverage check, setting it apart from sibling data-retrieval tools.

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?

Provides explicit when-to-use guidance: 'Run this first if other tools return no data.' This is a clear condition and sequencing hint. It doesn't name sibling tools explicitly, but 'other tools' is understandable in the context of the sibling list.

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

get_base_flood_elevationsA

Get Base Flood Elevation (BFE) lines near a location from the NFHL. The BFE is the elevation (in feet above datum) that floodwaters are expected to reach during a 1% annual chance (100-year) flood. Critical for construction requirements and insurance rating. Searches within ~100m of the coordinate. BFEs are not present in all flood zones (e.g. Zone X).

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude in decimal degrees (WGS84)
lonYesLongitude in decimal degrees (WGS84)

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the spatial search radius (~100m), the unit/meaning of results (feet above datum, 1% annual chance flood), and an important limitation (BFEs absent in some zones). It does not describe return format or error behavior, but the key operational constraints are clearly surfaced.

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?

Four concise sentences, each contributing essential information: what the tool returns, what BFE means, why it matters, and critical caveats. The description is front-loaded with the main purpose and avoids redundant or filler wording.

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?

For a simple two-parameter geographic lookup, the description covers the tool's purpose, meaning, relevance, search radius, and a key limitation. There is no output schema, so a bit more detail about the exact structure of the returned features could be helpful, but the description is sufficiently complete for an agent to select and invoke the tool correctly.

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%, so the lat/lon parameters are already documented in detail. The description adds the behavioral context that the search happens within ~100m of the coordinate, but does not add much new semantic meaning beyond what the schema provides. Baseline 3 is appropriate.

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 states a specific verb and resource ("Get Base Flood Elevation (BFE) lines near a location from the NFHL") and explains the meaning of BFE. This clearly differentiates it from sibling tools like get_flood_zone and get_firm_panel, which target different NFHL data. An agent can understand exactly what this tool returns without opening the schema.

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 provides clear context for when to use the tool: it is relevant to construction requirements and insurance rating, searches within ~100m of the coordinate, and notes that BFEs are not present in all flood zones. It does not explicitly list alternative tools or say 'use X instead', but the context is strong enough for an agent to infer appropriate usage relative to the siblings.

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

get_firm_panelA

Get the FEMA FIRM (Flood Insurance Rate Map) panel number and metadata for a location. Returns the official panel number, suffix, effective date, and panel type. Use this to identify which flood map covers a location and when it was last updated.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude in decimal degrees (WGS84)
lonYesLongitude in decimal degrees (WGS84)

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden and does disclose the main behavior and return content: panel number, suffix, effective date, and panel type. However, it does not mention potential edge cases such as unmapped locations, coordinate precision requirements, or what happens when no FIRM panel exists for the location.

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 with no filler: the first states what the tool returns, the second states its purpose. Every sentence adds value and the core purpose is front-loaded.

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?

For a simple two-parameter lookup with no output schema, the description adequately explains return values and intended use. It could be slightly more complete by noting behavior for locations without a mapped FIRM panel, but overall the agent has enough information to call the tool correctly.

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?

The schema already provides 100% coverage with clear descriptions for both lat and lon, including WGS84 and valid ranges. The description adds no parameter-specific meaning beyond describing a 'location,' so the baseline of 3 is appropriate.

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 states a specific verb ('Get'), a specific resource ('FEMA FIRM panel number and metadata'), and the exact items returned (panel number, suffix, effective date, panel type). This clearly distinguishes it from siblings like get_flood_zone or get_lomas, which target different flood-related data.

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 explicitly says to use the tool 'to identify which flood map covers a location and when it was last updated,' giving clear context for when to invoke it. It does not explicitly name alternatives or provide when-not-to-use conditions, but the use case is specific enough to guide an agent.

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

get_flood_zoneA

Look up the FEMA flood zone designation for a lat/lon coordinate using the official National Flood Hazard Layer (NFHL). Returns the zone code (e.g. AE, X, VE, AO), whether the location is in a Special Flood Hazard Area (SFHA), floodway status, static BFE, and the FIRM panel citation. This is the primary tool for flood risk lookup.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude in decimal degrees (WGS84)
lonYesLongitude in decimal degrees (WGS84)

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It signals a read-only lookup through the verb 'Look up' and enumerates the returned fields (zone code, SFHA, floodway, BFE, FIRM panel citation). It does not mention edge behaviors like coordinates outside NFHL coverage or error handling, but the core operation and outputs are clearly disclosed.

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 tight sentences with no wasted words. The first sentence announces the action and resource, the second lists outputs and positions the tool; everything earns its place.

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?

The input schema fully documents the only two parameters, and the description lists the key return fields, which is essential since there is no output schema. It also positions the tool as the primary flood-risk lookup. The main gap is the absence of guidance on coverage limitations or failure behavior, but the tool is simple enough that this is not a critical omission.

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%, so lat and lon are already documented with ranges and WGS84 decimal-degree units. The description only references 'lat/lon coordinate' generically and adds no further semantic detail, which meets the baseline but does not exceed it.

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 states a specific operation — 'Look up the FEMA flood zone designation for a lat/lon coordinate' — and identifies the authoritative source (NFHL). It also lists concrete return values, making the tool's purpose very clear. However, it does not explicitly contrast itself with sibling tools like get_base_flood_elevations or get_firm_panel, despite overlapping return fields.

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?

'This is the primary tool for flood risk lookup' provides clear context for when to select this tool. It does not explicitly state when to avoid it or route to alternatives, so the guidance is strong but not fully comprehensive.

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

get_lomasA

Get Letters of Map Amendment (LOMAs) near a location. A LOMA is an official FEMA letter that removes a specific structure or parcel from a Special Flood Hazard Area without physically revising the Flood Insurance Rate Map. Searches within ~100m of the coordinate.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude in decimal degrees (WGS84)
lonYesLongitude in decimal degrees (WGS84)

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses the ~100m search radius and location-based search behavior, which is valuable. But it does not mention response shape, result limits, ordering, or what happens when no LOMAs are found.

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?

Three sentences with no waste: action, domain definition, and search radius. The LOMA definition earns its place by helping differentiate from LOMRs without adding bloat.

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

Completeness3/5

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

The tool is simple and invocation is clear, but there is no output schema and no annotations. The description should ideally state what a successful response contains or how results are ordered/limited; the missing return-value expectations leave the agent partly guessing.

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 coverage is 100%, with descriptions for lat and lon and their ranges, so the schema already handles parameter meaning. The description adds the ~100m radius context, which clarifies the 'near a location' phrasing, but does not add format or syntax details beyond the schema.

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?

States a specific verb and resource: 'Get Letters of Map Amendment (LOMAs) near a location.' It defines a LOMA in a way that inherently distinguishes it from the sibling get_lomrs (a LOMA does not revise the FIRM), so an agent can tell them apart without opening extra context.

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

Usage Guidelines3/5

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

Gives clear context for when to use the tool: searching for LOMAs near a coordinate within ~100m. However, it does not explicitly name alternatives or state when not to use it, leaving the distinction from get_lomrs and other flood-related siblings implicit rather than direct.

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

get_lomrsA

Get Letters of Map Revision (LOMRs) that affect a location. LOMRs are official FEMA revisions to the Flood Insurance Rate Map — they can change flood zone designations. Returns case number, project name, effective date, and status for each revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude in decimal degrees (WGS84)
lonYesLongitude in decimal degrees (WGS84)

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It states the return fields (case number, project name, effective date, status) and explains what LOMRs are, but it does not explicitly state that the operation is read-only or mention any limits, permissions, or edge-case behavior.

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 compact and front-loaded with the core action. The second sentence clarifies the LOMR concept and the third lists the return values; every sentence earns its place with no wasted words.

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?

For a simple two-parameter lookup with no output schema, the description covers purpose, input concept, and return fields. It misses guidance on distinguishing LOMRs from LOMAs or any result limits, but it is otherwise reasonably complete.

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?

The input schema already documents lat/lon with descriptions and 100% coverage, so the description does not need to repeat them. It only refers generically to 'a location' and adds no parameter-specific meaning, placing it at the baseline of 3.

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 opens with a clear verb and resource ('Get Letters of Map Revision (LOMRs) that affect a location') and adds useful context about what LOMRs are and their effect on flood zone designations. However, it does not explicitly contrast this tool with its sibling get_lomas, so it earns a 4 rather than a 5.

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

Usage Guidelines3/5

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

The description implies use whenever LOMRs for a location are needed and explains their significance, but it provides no explicit when-not-to-use guidance or reference to alternatives such as get_lomas. The choice of when to use this tool versus related siblings is left to inference.

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.

  1. 6 tool updatesv1.0.0
    • First observedcheck_nfhl_availability
    • First observedget_base_flood_elevations
    • First observedget_firm_panel
    • First observedget_flood_zone
    • First observedget_lomas
    • First observedget_lomrs

TDQS

A4/5.0

Scored across 6 tools

Disambiguation4/5

Each tool targets a distinct FEMA flood data concern, but get_flood_zone and get_firm_panel overlap slightly since both return panel-related information, and get_lomrs/get_lomas are easy to confuse by name. The descriptions do clearly distinguish them, so ambiguity is limited.

Naming Consistency5/5

Tool names follow a consistent get_* verb-noun pattern, with check_nfhl_availability being the only deviation but still following the same predictable style. All names are lowercase snake_case and clearly indicate their resource or action.

Tool Count5/5

Six tools is a well-scoped set for a FEMA flood hazard lookup server. Each tool provides a meaningful, non-redundant capability and the count is appropriate for the domain.

Completeness4/5

The surface covers the core workflow: checking availability, getting the flood zone, identifying the FIRM panel, finding revisions/amendments, and retrieving BFE data. Minor gaps such as address-based lookup or more detailed NFHL layer queries are possible but not critical to the stated purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A powerful MCP server that connects AI assistants to authoritative natural hazard data sources, enabling monitoring of earthquakes, tsunamis, volcanoes, and solar events with configurable alerts and webhooks.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that gives AI agents grounded access to US natural-hazard data — weather alerts, forecasts, earthquakes, and FEMA flood zones — from free, keyless US government APIs.
    MIT
  • 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.
    -