Skip to main content
Glama
GSA-TTS

mcp-server-blm-mlrs

by GSA-TTS

mcp-server-blm-mlrs

An MCP server for the BLM MLRS Geothermal Leases dataset.

It exposes tools that query the U.S. Bureau of Land Management (BLM) Mineral & Land Records System (MLRS) geothermal leases ArcGIS FeatureServer and returns clean, structured lease data to any MCP client (Claude Desktop, etc.).

Data source

BLM National MLRS Geothermal Leases FeatureServer:

https://gis.blm.gov/nlsdb/rest/services/HUB/BLM_Natl_MLRS_Geothermal_Leases/FeatureServer/0

Related MCP server: mcp-arcgis-montana

Tools

get_lease_details(case_number)

Retrieve full details for a single lease by its BLM case serial number.

  • case_number — BLM case serial number, e.g. 'NVNV105806473'.

Returns a dict of lease details (case name, type, status, state, acreage, commodity, formation, production status, effective/expiration/sale dates, data source), or an error message if not found.

search_leases(state, status, effective_date_from, effective_date_to, expiration_date_from, expiration_date_to)

Search leases with optional filters. All parameters are optional; if none are given, all leases are returned (capped at 50 records).

Parameter

Field

Description

state

ADMIN_STATE

Two-letter admin state code, e.g. 'NV'

status

CSE_DISP

Case disposition/status, e.g. 'Authorized'

effective_date_from

EFF_DT

Inclusive lower bound, ISO date 'YYYY-MM-DD'

effective_date_to

EFF_DT

Inclusive upper bound, ISO date 'YYYY-MM-DD'

expiration_date_from

EXP_DT

Inclusive lower bound, ISO date 'YYYY-MM-DD'

expiration_date_to

EXP_DT

Inclusive upper bound, ISO date 'YYYY-MM-DD'

Returns {"count": <int>, "leases": [ {lease summary}, ... ]}, or an error message on failure.

Installation

Requires Python >= 3.11.

uv sync

Running

By default the server runs over stdio, suitable for local MCP clients:

uv run python -m geothermal_leases.app

If a PORT (or DATABRICKS_APP_PORT) environment variable is set, it instead serves over HTTP on that port:

PORT=8000 uv run python -m geothermal_leases.app

A health check is available at GET /health when running over HTTP.

Configuring an MCP client

Example entry for a client that launches MCP servers over stdio:

{
  "mcpServers": {
    "geothermal-leases": {
      "command": "uv",
      "args": ["run", "python", "-m", "geothermal_leases.app"],
      "cwd": "/path/to/mcp-server-blm-mlrs"
    }
  }
}

Project layout

src/geothermal_leases/
├── app.py                       # FastMCP server entrypoint (stdio / HTTP)
├── routes.py                    # Custom HTTP routes (health check)
└── tools/
    ├── __init__.py              # Tool registration
    ├── _blm.py                  # Shared BASE_URL + date helpers
    ├── get_lease_details.py     # get_lease_details tool
    └── search_leases.py         # search_leases tool

Available Tools

2 tools
get_lease_detailsA

Retrieve details for a BLM geothermal lease by its Case Serial Number.

ParametersJSON Schema
NameRequiredDescriptionDefault
case_numberYesThe BLM case serial number, e.g. 'NVNV105806473'

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/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. The verb 'Retrieve' clearly indicates a read-only operation, which is a key behavioral trait. However, the description does not mention potential errors, authentication requirements, or the scope of 'details' beyond what the output schema likely covers. It adds some value but leaves gaps.

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?

A single sentence that is front-loaded with the action and resource. No filler, no redundancy. Every word contributes to the purpose, making it highly concise and well-structured.

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?

This is a simple one-parameter read tool with an output schema, so the description doesn't need to explain return values. It adequately communicates the purpose and key. However, it doesn't mention any edge cases or error behavior, but for a straightforward getter, it is largely 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?

Schema description coverage is 100%, so the schema already fully defines the sole parameter with an example. The description reinforces the meaning by mentioning the case serial number in a lease context, but doesn't add significant new meaning beyond the schema. 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 clearly states a specific action ('Retrieve details') and a specific resource ('BLM geothermal lease') identified by a key ('Case Serial Number'). This directly distinguishes it from the sibling search_leases, which is a search tool, while this is a direct lookup.

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

Usage Guidelines2/5

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

No explicit guidance is given on when to use this tool versus search_leases. The description implies that you need a serial number, but it doesn't state the alternative use case or when to prefer one tool over the other. Without this, the agent may not know that this tool is for direct retrieval and the sibling is for searching.

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

search_leasesA

Search BLM geothermal leases, optionally filtering by state, status, and effective-/expiration-date ranges.

All parameters are optional. If none is provided, all leases are returned (capped at 50 records).

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoTwo-letter admin state code, e.g. 'NV' (matches ADMIN_STATE).
statusNoCase disposition/status, e.g. 'Authorized' (matches CSE_DISP).
effective_date_toNoInclusive upper bound on effective date, as an ISO date string 'YYYY-MM-DD' (matches EFF_DT).
expiration_date_toNoInclusive upper bound on expiration date, as an ISO date string 'YYYY-MM-DD' (matches EXP_DT).
effective_date_fromNoInclusive lower bound on effective date, as an ISO date string 'YYYY-MM-DD' (matches EFF_DT).
expiration_date_fromNoInclusive lower bound on expiration date, as an ISO date string 'YYYY-MM-DD' (matches EXP_DT).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/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 behavioral disclosure burden. It reveals a key behavior: returning all leases (capped at 50) when no filters are provided. It does not state other traits like pagination or sorting, but the cap is critical and the absence of side effects is implied by 'search'.

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 the additional cap note is essential. Every sentence earns its place with no redundancy or filler.

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?

For a search tool with an output schema and fully described parameters, this description covers the necessary behavior: what it searches, the filter options, and the default fifty-record cap when no filters are supplied. The output schema presumably handles return structure, so no further detail is needed.

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 baseline is 3. The description summarizes the filter dimensions (state, status, date ranges) but adds little beyond the schema, which already elaborates each parameter. It does clarify that all parameters are filters, aligning with the schema's optionality.

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 tool searches BLM geothermal leases with optional filters on state, status, and date ranges. This goes beyond a vague verb by specifying both the resource (BLM geothermal leases) and the search/listing nature of the operation, distinguishing it from a sibling tool like get_lease_details which likely retrieves a single lease.

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 notes that all parameters are optional and that omitting them returns all leases (capped at 50), conveying when to use the tool without needing to supply filters. It gives clear context for usage but does not explicitly contrast it with get_lease_details, leaving the distinction somewhat implicit.

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.1.0
    • First observedget_lease_details
    • First observedsearch_leases

TDQS

A3.9/5.0
Disambiguation5/5

get_lease_details and search_leases have clearly distinct purposes: one retrieves a specific lease by serial number, while the other returns a list of leases matching filters. There is no overlap or ambiguity between them.

Naming Consistency4/5

Both tools use verb-led names (get, search), but the object phrasing differs slightly ('lease_details' vs 'leases'). This is a minor deviation from a strict verb_noun pattern, but the naming is still predictable and readable.

Tool Count3/5

The server has only 2 tools, which feels thin for a general-purpose server. However, the domain is narrowly focused on querying BLM geothermal leases, making this a borderline but reasonable count for a read-only lookup service.

Completeness4/5

The two tools cover the core workflow of searching for leases and retrieving full details for a specific lease. There are no obvious gaps for the stated purpose of querying lease information, though additional filters or related data could enhance completeness.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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

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/GSA-TTS/mcp-server-blm-mlrs'

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