well-data-mcp
Queries live oil & gas and geothermal well data from state regulator ArcGIS REST services, enabling well searches by operator/name/county/field/status/type, retrieval by API number, radius searches, operator lists, and raw SQL-92 queries against source layers.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@well-data-mcpfind producing wells in Kern County, CA"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| California oil & gas wells | CalGEM (WellSTAR) | Full headers: operator, status, type, field, county, spud |
| California geothermal wells | CalGEM (WellSTAR) | Separate layer, incl. completion/abandon dates |
| 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 |
| New Mexico oil & gas wells | NM OCD (EMNRD) | Rich: depths, spud/plug/last-production dates |
| 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) |
| North Dakota oil & gas wells | ND DMR O&G Division | Updated hourly; incl. TD, NDIC file no |
| 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 |
| Nevada geothermal wells | NBMG (UNR) / NGDS | Academic mirror; thermal class, permit no; lags recent drilling |
| New Zealand petroleum wells | NZP&M | UWI, operator, TD, dates, prospect/field; server 500s on empty results (handled) and on outSR (handled) |
| 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 caveatssearch_wells— by operator / well name / county / field / status / type, any state or all;count_onlyto size firstget_well— full raw record by API number in any format (dashes, prefixes handled); searches all states if state unknownwells_near— radius search around lat/lon (wells on a pad or project site)list_operators— discover the exact operator strings a state uses before searchingraw_query— raw SQL-92whereagainst 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 (searchcape egsorfervo) 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(justopenpyxl), thenpython scripts/convert-gem.py <dir>. CC BY 4.0 — seedata/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.jsclaude 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_datasetscovers (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_sourcesreports 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.usECMC_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 (seedata/ATTRIBUTION.mdfor the full license/attribution notice). Re-runscripts/convert-gem.pyon 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 toolsget_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.
| Name | Required | Description | Default |
|---|---|---|---|
| api | Yes | API well number in any common format (e.g. 04-029-12345, 0402912345, 33-053-04652, 4300712345). | |
| state | No | Two-letter state code if known (much faster). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Partial operator name, case-insensitive. | |
| state | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| where | Yes | ArcGIS SQL-92 where clause, e.g. "totcum_oil > 1000000 AND county = 'BEAVER'" | |
| offset | No | ||
| source | Yes | Source key, e.g. UT or CA-OG. | |
| out_fields | No | Comma-separated field list, or * for all. | * |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Project/unit/field name (also matches other names and blocks), e.g. 'Olkaria', 'Venus', 'Bouillante'. | |
| limit | No | ||
| status | No | Status substring: operating, construction, announced, discovered, producing, shelved, cancelled, retired... | |
| country | No | Country/area name, e.g. 'Kenya', 'Namibia', 'New Zealand'. | |
| dataset | No | both | |
| latitude | No | With longitude + radius_km: only projects within the radius, sorted by distance. | |
| operator | No | Operator or owner name, e.g. 'KenGen', 'Ormat', 'TotalEnergies'. | |
| longitude | No | ||
| radius_km | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | ||
| query | Yes | Search terms, e.g. 'cape station', 'utah forge stimulation', 'olkaria kenya'. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | API well number exactly as the state formats it. For cross-state API lookup use get_well instead. | |
| field | No | Field name, partial match. | |
| limit | No | Max records per source (default 25). | |
| state | No | Two-letter state code to search. Omit to search ALL states (slower; prefer setting it). | |
| county | No | County name, partial match. | |
| offset | No | Pagination offset within each source. | |
| source | No | Exact source key (e.g. CA-GEO for California geothermal only). Overrides state. | |
| status | No | Well status, partial match (vocabulary varies by state: 'Active', 'Plugged', 'New', ...). | |
| operator | No | Operator/company name, partial match, case-insensitive (e.g. 'Fervo', 'California Resources'). | |
| well_name | No | Well or lease name, partial match. | |
| well_type | No | Well type, partial match (e.g. 'OG', 'Geothermal', 'Water Disposal'; vocabulary varies by state). | |
| count_only | No | If true, return only match counts per source — cheap way to size a query first. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| state | No | ||
| source | No | ||
| latitude | Yes | ||
| longitude | Yes | ||
| radius_km | No | Search radius in kilometers (default 3). |
TDQS
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.
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.
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.
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.
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.
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.
8 tool updates
v0.1.0- First observed
get_well - First observed
list_operators - First observed
list_sources - First observed
raw_query - First observed
search_gem_projects - First observed
search_geothermal_datasets - First observed
search_wells - First observed
wells_near
TDQS
Scored across 8 tools
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.
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.
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.
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
Related MCP Connectors
Read-only Texas oil & gas data: operator directory, county production, and dataset catalog.
Query real-time and historical USGS water data from ~8,000 stream gages and groundwater wells.
Geocode, reverse geocode, and run Overpass spatial queries on OpenStreetMap data.
Geocode, reverse geocode, and run Overpass spatial queries on OpenStreetMap data.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to search and query Los Angeles County open geospatial datasets (parcels, parks, etc.) via ArcGIS Feature Services.15 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables searching and querying City of Albuquerque open geospatial datasets (parcels, zoning, public works) via ArcGIS Feature Services, allowing natural language access to GIS data.5 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables searching and querying City of Tulsa GIS open geospatial datasets (parcels, zoning, public works) via ArcGIS Feature Services through natural language or direct MCP tool calls.5 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables searching and querying Stanislaus County GIS open geospatial datasets (parcels, addresses, zoning, public works) via ArcGIS Feature Services. Supports natural language access through Pipeworx gateway.6 npmMIT