Skip to main content
Glama
Wickemu

well-data-mcp

by Wickemu

well-data-mcp

MCP server for oil & gas / geothermal well data, pulled live from state regulator ArcGIS REST services. No API keys, no scraping — these are the same endpoints the states' own map viewers use.

Coverage (verified 2026-08-28)

Key

Source

Agency

Notes

CA-OG

California oil & gas wells

CalGEM (WellSTAR)

Full headers: operator, status, type, field, county, spud

CA-GEO

California geothermal wells

CalGEM (WellSTAR)

Separate layer, incl. completion/abandon dates

UT

Utah oil & gas wells

Utah DOGM via SITLA GIS

Rich: incl. cumulative oil/gas/water production. O&G only — Utah geothermal is DWRi-regulated with no registry; use search_geothermal_datasets for Cape Station

NM

New Mexico oil & gas wells

NM OCD (EMNRD)

Rich: depths, spud/plug/last-production dates

CO

Colorado wells

ECMC via CO DNR GIS

API, name, operator, status, county, field, well class, spud/status dates, MD/TVD, basin, lat/lon (re-verified 2026-09-15 after the ECMC cutover)

ND

North Dakota oil & gas wells

ND DMR O&G Division

Updated hourly; incl. TD, NDIC file no

TX

Texas well locations

Texas RRC public GIS

Location + API only — RRC's GIS has no operator/status; that detail lives in their non-GIS systems

NV-GEO

Nevada geothermal wells

NBMG (UNR) / NGDS

Academic mirror; thermal class, permit no; lags recent drilling

NZ-PET

New Zealand petroleum wells

NZP&M

UWI, operator, TD, dates, prospect/field; server 500s on empty results (handled) and on outSR (handled)

GP-BSS

Guadeloupe / France boreholes

BRGM (BSS via WFS)

All borehole types; no operator/status; each record links its InfoTerre detail sheet

Related MCP server: mcp-arcgis-albuquerque

Tools

  • list_sources — what's queryable, per-source filters and caveats

  • search_wells — by operator / well name / county / field / status / type, any state or all; count_only to size first

  • get_well — full raw record by API number in any format (dashes, prefixes handled); searches all states if state unknown

  • wells_near — radius search around lat/lon (wells on a pad or project site)

  • list_operators — discover the exact operator strings a state uses before searching

  • raw_query — raw SQL-92 where against any source layer (dates, depths, cum production…)

  • search_geothermal_datasets — DOE geothermal project datasets via the keyless OSTI Data Explorer API (indexes the GDR): well logs, stimulation, flow tests, microseismic. This is the Fervo Cape Station channel (search cape egs or fervo) and Utah FORGE.

  • search_gem_projects — bundled Global Energy Monitor data (local, offline): 835 geothermal power units worldwide + 7,673 upstream O&G fields. Covers Kenya (Olkaria: 24 units), NZ, Guadeloupe (Bouillante), Guatemala, Namibia (Orange Basin: Graff, Mopane, Venus...), and Fervo's whole pipeline (Cape Station phases, Corsac, Project Red). Filter by country/name/operator/status or lat/lon radius. Refresh: download a new release from globalenergymonitor.org/download-data, pip install -r scripts/requirements.txt (just openpyxl), then python scripts/convert-gem.py <dir>. CC BY 4.0 — see data/ATTRIBUTION.md.

Run / register

Requires Node 18+ (native fetch, top-level await); developed and run on Node 22.

npm install
npm run smoke          # live test, one query per source
claude mcp add --scope user well-data -- node <abs-path>/src/index.js

claude mcp add bakes that absolute <abs-path> into ~/.claude.json at registration time — moving or renaming this project folder breaks the registration until you re-run claude mcp add (or hand-edit the path in ~/.claude.json).

If this package is ever published to npm, npx -y well-data-mcp will work in place of the absolute-path node invocation above — package.json's bin/engines fields are already set up for it. It isn't published today (no registry, no git remote), so use the absolute-path form above.

Adding a state

One entry in src/states.js: layer URL + field map + normalizer. Find the layer by probing the state's ArcGIS server (…/rest/services?f=json), then a layer's schema via …/MapServer/<id>?f=json. Most state O&G regulators run ArcGIS; the query grammar is identical everywhere.

Geothermal + international coverage truth (researched 2026-08-28)

  • Utah geothermal (Fervo Cape Station): regulated by the Utah Division of Water Rights (Geothermal Resource Conservation Act), NOT DOGM — and DWRi publishes no machine-readable registry (their "historic data" is Google Drive folders of scans). DOGM's database has zero geothermal well types. Cape Station well-level data flows through BLM (federal GDPs, no public API) and Fervo's DOE-funded publications on the GDR — which search_geothermal_datasets covers (e.g. Frisco 2-P stimulation microseismic, Frisco pad flow tests).

  • NZ geothermal: regulated regionally (RMA), not by NZP&M. GNS Science's GGW database holds it but requires a signed data agreement.

  • No public well registry (verified nothing machine-readable exists): Guatemala (MEM), Belize (Geology & Petroleum Dept), Kenya (KenGen/GDC private), Namibia (NAMCOR). list_sources reports these so searches fail honestly. Project-level coverage exists in Global Energy Monitor's trackers (form-gated download).

Known follow-ups:

  • Colorado: resolved. ECMC's legacy map retired Sept 4, 2026 as planned; the gisdnr.state.co.us ECMC_Public services (DNR-hosted) are the live replacement, and the field map was re-verified against them 2026-09-15, post-cutover (see the Coverage table above).

  • Wyoming / Oklahoma / Kansas: not yet mapped; same pattern should apply.

  • FracFocus: bulk CSV + API for completion chemistry, could join on API-14.

  • GEM trackers: bundled in data/ — both the geothermal and oil & gas extracts are the March 2026 release (see data/ATTRIBUTION.md for the full license/attribution notice). Re-run scripts/convert-gem.py on future downloads. Belize has zero GEM O&G coverage (Spanish Lookout too small) — still no machine-readable source for Belize.

Source

https://github.com/Wickemu/well-data-mcp — MIT licensed; bundled Global Energy Monitor data is CC BY 4.0 (see data/ATTRIBUTION.md).

Available Tools

8 tools
get_wellGet well by API numberA

Look up a specific well by API number and return its FULL raw record from the state source plus the normalized summary. Handles formatting differences (dashes, state prefixes): tries an exact match first, then the bare digits, then a dash-tolerant contains-match on the county + sequence digits — so undashed input still finds wells in sources that store dashed APIs (NM, ND, CO, NV). If state is omitted, tries every state.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiYesAPI well number in any common format (e.g. 04-029-12345, 0402912345, 33-053-04652, 4300712345).
stateNoTwo-letter state code if known (much faster).

TDQS

A4.6/5.0
Behavior4/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 discloses the behavior of handling different API formats (dashes, state prefixes) and the fallback matching strategy. It also reveals that if state is omitted, it iterates over all states, which implies potential performance implications. This is good coverage beyond what the schema provides.

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

Conciseness4/5

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

The description is two sentences, which is concise and front-loaded with the main purpose. The first sentence defines the function and output. The second sentence adds important behavioral details about formatting tolerance and multi-state search. Some redundancy with the schema examples is present, but the description as a whole is tightly written without fluff.

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 tool's moderate complexity (two parameters, one optional enum), the description covers everything an agent needs: the output format (raw + summary), the handling of input variations, the matching algorithm, and the behavior when state is omitted. No additional context is necessary for correct invocation.

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

Parameters4/5

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

The schema already provides a clear description of the api parameter (with examples) and the state parameter (with enum). The description adds nuance that the api parameter tolerates formatting differences and that state is optional but speeds up the lookup. This meaningfully enhances what the schema states, so a 4 is warranted.

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 the specific verb ('Look up') and resource ('a specific well by API number'), and clearly defines the output as the full raw record plus the normalized summary. It distinguishes itself from siblings like search_wells and wells_near by focusing on exact API lookup rather than broad search or proximity.

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

Usage Guidelines5/5

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

Explicitly explains when to use this tool: to retrieve a specific well by API number, and even notes that omitting the state will try every state (slower, but still functional). While it doesn't name alternatives, it implies that for broader search one would use search_wells or wells_near, and for raw queries raw_query. The description of the matching fallbacks (exact, bare digits, contains-match) also guides usage in edge cases.

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

list_operatorsList operators matching a nameA

Find the exact operator name strings a state uses (they rarely match what you would guess — 'Fervo Energy Company', 'CALIFORNIA RESOURCES PRODUCTION CORPORATION'). Returns distinct operator names containing the search text, per source. Use before search_wells when an operator search returns nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesPartial operator name, case-insensitive.
stateNo

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden. It usefully reveals that results are exact, case-insensitive name strings, distinct, 'containing the search text', and grouped 'per source'. However, it does not clarify what 'per source' means, whether state is required, or what the response shape looks like.

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

Conciseness4/5

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

The description is compact and front-loaded: purpose first, then behavior, then usage guidance. The quoted examples are slightly long but earn their place by illustrating the tool's core warning that operator strings rarely match guesses.

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 description covers purpose, basic behavior, and a usage trigger, which is good for a simple lookup tool. However, without annotations or an output schema, the vague 'per source' wording and unaddressed state parameter leave meaningful gaps for an agent deciding how to call it correctly.

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

Parameters2/5

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

Schema description coverage is only 50%; the description does not meaningfully explain the 'state' parameter beyond 'a state uses' and 'per source'. The 'name' parameter is already described in the schema, but the optional state parameter's role and default behavior remain unclear.

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 ('Find') and resource ('exact operator name strings a state uses') and makes the domain concrete with real examples. It clearly differentiates this tool from sibling search_wells by focusing on operator name strings rather than well records.

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 gives a usage context: 'Use before search_wells when an operator search returns nothing.' It names an alternative and the condition for choosing this tool, though it does not discuss exclusions for other sibling tools.

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

list_sourcesList well-data sourcesA

List the state regulator well-data sources this server can query: coverage, agency, searchable filters, and caveats. Call this first to see what is available.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description must carry the behavioral disclosure burden. The description explains it returns coverage, agency, searchable filters, and caveats, and frames the operation as non-mutating discovery. It does not detail error behavior or performance, but for a zero-parameter list operation this is acceptable.

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, zero filler, with the most useful instruction ('Call this first') included. Every word earns its place and the key content is 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?

For a simple, zero-parameter discovery tool, the description completely covers what an agent needs to know: what it will receive, why it should call it, and that it is the initial discovery step. No output schema or annotation gaps need compensation here.

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

Parameters4/5

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

There are no parameters Except for the schema's empty object, and schema coverage is 100%. The description adds no parameter details, but none are needed. Baseline for a zero-parameter tool is 4.

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 ('List'), a clear resource ('state regulator well-data sources'), and a scope ('this server can query'). It clearly distinguishes itself from search_tools and other list-like tools because it describes a catalog/discovery function, not a data query.

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?

Explicitly says 'Call this first to see what is available,' giving clear when-to-use guidance for discovery before querying. It does not explicitly mention alternatives or exclusions, but the context strongly implies this is the correct initial tool among the siblings.

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

raw_queryRaw ArcGIS queryA

Escape hatch: run a raw SQL-92 WHERE clause against one source's ArcGIS layer and get raw attributes back. Use list_sources for source keys; field names are the layer's own (see the searchableFilters mapping, or query with where='1=1' limit=1 to inspect a record). Useful for filters the normalized search does not cover (dates, depths, cumulative production).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
whereYesArcGIS SQL-92 where clause, e.g. "totcum_oil > 1000000 AND county = 'BEAVER'"
offsetNo
sourceYesSource key, e.g. UT or CA-OG.
out_fieldsNoComma-separated field list, or * for all.*

TDQS

A4.6/5.0
Behavior4/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 discloses that field names are the layer's own rather than normalized, and recommends querying where='1=1' limit=1 to inspect a record, which sets expectations about raw output. It could say more about read-only guarantees or error modes, but the main behavioral quirk is covered.

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 pack the tool's purpose, usage context, and field-name caveat without redundancy. The inline example 'where='1=1' limit=1' is a compact, actionable illustration.

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 an escape-hatch tool with no output schema and no annotations, it gives an agent enough to call it correctly: how to choose source keys, how to discover valid fields, and what kind of filters it supports. Minor gaps remain around exact response shape and behavior when SQL is invalid, but the critical invocation steps are present.

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

Parameters4/5

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

Schema covers 60% of parameters with descriptions (where, source, out_fields). The description adds beyond the schema by advising list_sources for source keys and explaining that where-clause field names are raw and can be discovered via a probe query. It doesn't elaborate on limit/offset, but those are constrained with defaults in 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: 'run a raw SQL-92 WHERE clause against one source's ArcGIS layer and get raw attributes back.' The 'Escape hatch' framing differentiates it from sibling search tools, making its role in the family immediately clear.

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

Usage Guidelines5/5

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

Explicitly positions itself as a fallback: 'filters the normalized search does not cover (dates, depths, cumulative production).' It also directs the agent to list_sources for valid source keys and suggests a field-inspection technique, so when to use it and what to do first are clear.

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

search_gem_projectsSearch global energy projects (GEM)A

Search bundled Global Energy Monitor tracker data: geothermal power units worldwide (Geothermal Power Tracker - covers Kenya/Olkaria, New Zealand, Guadeloupe/Bouillante, Guatemala, US) and upstream oil & gas fields/discoveries (Oil & Gas Extraction Tracker - covers Namibia Orange Basin, Guatemala, NZ). Project/field level, NOT well level. Filters are ANDed, case-insensitive substrings. Local data - fast, works offline. Cite 'Global Energy Monitor' when publishing results.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoProject/unit/field name (also matches other names and blocks), e.g. 'Olkaria', 'Venus', 'Bouillante'.
limitNo
statusNoStatus substring: operating, construction, announced, discovered, producing, shelved, cancelled, retired...
countryNoCountry/area name, e.g. 'Kenya', 'Namibia', 'New Zealand'.
datasetNoboth
latitudeNoWith longitude + radius_km: only projects within the radius, sorted by distance.
operatorNoOperator or owner name, e.g. 'KenGen', 'Ormat', 'TotalEnergies'.
longitudeNo
radius_kmNo

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it does well: it discloses that filters are ANDed case-insensitive substrings, that data is local and offline, and that results are project/field level rather than well level. It does not describe response format or any limits, but the core query behavior is transparent.

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 dense but every clause earns its place: data source, tracker coverage, scope, filter behavior, performance characteristics, and citation requirement. The core purpose and exclusion are front-loaded before the supporting details.

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 9-parameter tool with no annotations and no output schema, the description provides substantial context: data provenance, geographic coverage, project-level scope, match semantics, offline behavior, and citation obligations. It stops short of explaining result fields or how limit/radius parameters shape output, but it is detailed enough 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?

The schema already documents five of nine parameters with useful examples, and the description adds general filter semantics with 'Filters are ANDed, case-insensitive substrings'. Still, the main description does little to clarify limit, longitude, or radius_km on its own, so it only partially compensates for the 56% 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 action and resource: 'Search bundled Global Energy Monitor tracker data' and enumerates the exact trackers and coverage areas. It explicitly distinguishes itself from the well-level sibling tools by saying 'Project/field level, NOT well level', so an agent can tell it apart from search_wells and wells_near.

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 clear context on when this tool is appropriate: for project/field-level searches over bundled GEM geothermal and oil & gas data, and it explicitly excludes well-level use. However, it never names sibling alternatives such as search_wells or raw_query, so the when-not guidance is implied rather than fully explicit.

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

search_geothermal_datasetsSearch DOE geothermal datasets (GDR)A

Search U.S. DOE-funded geothermal project datasets via OSTI Data Explorer - this indexes the Geothermal Data Repository (gdr.openei.org): well logs, stimulation and flow-test data, microseismic, DTS, geologic models. THE source for Fervo Cape Station (search 'cape egs' or 'fervo' - note 'cape station' also matches Cape Grim air station), Utah FORGE, and some international geothermal studies. Terms are ANDed. Returns titles, DOIs, dates, and links to the data.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNo
queryYesSearch terms, e.g. 'cape station', 'utah forge stimulation', 'olkaria kenya'.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it does well: it explains that terms are ANDed, that results return titles/DOIs/dates/links, and even warns about a false-match case ('cape station' also matching Cape Grim air station). It does not mention pagination, sorting, or auth/rate limits, but the disclosed search semantics are materially useful.

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 dense but every sentence earns its place: scope, content types, key corpus examples, a query ambiguity warning, AND semantics, and return fields. It is front-loaded with the resource name and keeps all guidance relevant without repetition or filler.

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 search tool with no output schema and no annotations, the description covers the essential invocation context: what is indexed, how to phrase queries, what results look like, and notable edge cases. Minor gaps such as row-count behavior and pagination are not likely to prevent an agent from calling the tool successfully.

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

Parameters4/5

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

Schema coverage is 50%: the query parameter has examples, but rows has only schema constraints with no description. The tool description compensates by explaining AND semantics and giving realistic query patterns, which adds meaning beyond the schema. It doesn't elaborate on rows behavior, but the schema's default/min/max plus the name make it reasonably self-evident.

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 opens with a specific verb and resource: searching U.S. DOE-funded geothermal datasets via OSTI Data Explorer/GDR. It names the content types (well logs, stimulation data, microseismic) and cites concrete projects like Fervo Cape Station and Utah FORGE, which clearly separates it from sibling tools such as search_wells or search_gem_projects.

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 clear context for when to use the tool: it is the source for GDR/Fervo/FORGE and international geothermal datasets, and it offers concrete query examples such as 'cape egs' or 'fervo'. It does not explicitly rule out alternatives or name when_not scenarios, but the domain-specific examples and scope make the intended use fairly unambiguous.

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

search_wellsSearch wellsA

Search state regulator well databases by operator, well/lease name, county, field, status, or type. Returns normalized records (API number, name, operator, status, type, field, county, lat/lon, dates, depths where available) plus source-specific extras. All *Date fields are normalized to ISO 'YYYY-MM-DD' strings (or null) regardless of how the source stores them, so they sort and compare across states. Filters combine with AND. Set count_only=true to size a query before pulling records.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiNoAPI well number exactly as the state formats it. For cross-state API lookup use get_well instead.
fieldNoField name, partial match.
limitNoMax records per source (default 25).
stateNoTwo-letter state code to search. Omit to search ALL states (slower; prefer setting it).
countyNoCounty name, partial match.
offsetNoPagination offset within each source.
sourceNoExact source key (e.g. CA-GEO for California geothermal only). Overrides state.
statusNoWell status, partial match (vocabulary varies by state: 'Active', 'Plugged', 'New', ...).
operatorNoOperator/company name, partial match, case-insensitive (e.g. 'Fervo', 'California Resources').
well_nameNoWell or lease name, partial match.
well_typeNoWell type, partial match (e.g. 'OG', 'Geothermal', 'Water Disposal'; vocabulary varies by state).
count_onlyNoIf true, return only match counts per source — cheap way to size a query first.

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations supplied, the description carries the full behavioral burden and largely delivers: it discloses date normalization to ISO YYYY-MM-DD (or null), states that filters combine with AND, describes the returned record shape, and flags the performance cost of omitting state. It stops short of covering error behavior, rate limits, or what 'source-specific extras' concretely contain, so it's strong but not exhaustive.

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

Conciseness4/5

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

The description is a single front-loaded paragraph that leads with purpose, then normalization, then filter semantics, then the count_only usage tip. Each sentence carries distinct information and nothing is redundant with the schema. It is dense, but that density is justified for a 12-parameter tool.

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 tool with 12 parameters, no output schema, and no annotations, the description covers the essential ground: return format, date normalization, filter combination, and query sizing. Gaps include pagination semantics across multiple sources (offset/limit are only defined 'per source' in the schema) and the precise shape of multi-source results, which an agent would want when aggregating.

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% with inline examples (e.g. 'Fervo', 'California Resources', 'CA-GEO'), so the schema already documents every parameter well. The description adds global semantics that enrich parameter understanding — AND-combination of filters and date normalization across returned fields — but does not extend per-parameter 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 opens with a specific verb and resource ('Search state regulator well databases') and enumerates the exact search dimensions (operator, well/lease name, county, field, status, type). It further differentiates from get_well via the api parameter note ('For cross-state API lookup use get_well instead'), which explicitly carves out the sibling's territory. An agent can immediately tell what this tool does and how it relates to get_well.

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 concrete usage direction: the api param steers exact API lookups to get_well, the state param advises preferring a state code to avoid slower all-state searches, and count_only is positioned as a way to size a query before pulling records. It does not, however, address when to reach for spatial sibling wells_near or raw_query over this tool, leaving part of the alternative routing implicit.

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

wells_nearFind wells near a pointA

Find wells within a radius of a lat/lon point — e.g. all wells on or around a pad, lease, or project site. Searches the geographically relevant sources unless state/source is given.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
stateNo
sourceNo
latitudeYes
longitudeYes
radius_kmNoSearch radius in kilometers (default 3).

TDQS

A4.4/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 behavioral burden. It adds important non-obvious behavior: 'Searches the geographically relevant sources unless state/source is given.' This explains default source selection and how optional filters change behavior, which is valuable beyond the schema. It does not describe response format, but the core behavior is 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?

Two sentences with no filler. The core action and use case are front-loaded, and the source-selection behavior is stated compactly. Every clause contributes to an agent's understanding of when and how to call the tool.

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 tool with six parameters and no output schema or annotations, the description covers the essential invocation context: what it finds, how it selects sources, and when to use it. It does not describe return shape or result limits, but those are less critical for correct invocation given the detailed schema and defaults.

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

Parameters4/5

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

Schema description coverage is only 17%, so the description must compensate. It does clarify the central parameters: lat/lon as the search point, radius_km as the search radius, and state/source as optional filters. The limit parameter is not mentioned, but its name and default make it inferable; the description still adds meaning for the most important 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 states a specific verb ('Find'), a precise resource ('wells'), and a clear spatial criterion ('within a radius of a lat/lon point'). This distinguishes it from siblings like search_wells or get_well, and the example of pads/leases/project sites reinforces its intended scope.

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 a clear use case ('all wells on or around a pad, lease, or project site') and explains when to narrow by state/source ('unless state/source is given'). It does not explicitly name alternatives or state when not to use this tool, but the context is clear enough for an agent to select it appropriately.

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. 8 tool updatesv0.1.0
    • First observedget_well
    • First observedlist_operators
    • First observedlist_sources
    • First observedraw_query
    • First observedsearch_gem_projects
    • First observedsearch_geothermal_datasets
    • First observedsearch_wells
    • First observedwells_near

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation4/5

Tools are largely distinct: search_wells, raw_query, and wells_near differ by query mode, while search_gem_projects and search_geothermal_datasets target separate datasets. The only mild ambiguity is between the three 'search_*' tools, but descriptions clearly specify data source and query style.

Naming Consistency4/5

Most tools follow a clear list_/search_/get_ verb_noun pattern, making the set predictable. raw_query and wells_near break that pattern, but they are still readable and not confusing.

Tool Count5/5

8 tools is well-scoped for the domain: source discovery, operator lookup, normalized search, spatial proximity, raw SQL escape hatch, and specialized project/dataset searches. Each tool earns its place without redundancy.

Completeness5/5

The surface covers the full read-only workflow: discover sources, inspect operators, query wells by attributes or location, retrieve full records by API, and fall back to raw SQL when needed. The specialized GEM and OSTI searches add meaningful coverage beyond state well data.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers