Skip to main content
Glama

Passage Data — cited environmental limits

Screen a state's US NPDES permits by industry

list_permits
Read-onlyIdempotent

Which facilities in a US state hold a discharge permit, which of them are in one industry (paper mills, meat packing, sewage treatment), which went over a limit lately or face a renewal, and which must meet a new or tighter limit already written into their permit? The state's individual NPDES permits with limits, as EPA's national file (ECHO / ICIS-NPDES) lists them, in one call: each permit's number, facility name, whether EPA rates it major, its primary SIC code and the words EPA prints for it, its 12-month record (times over a limit, on which parameters, required values not reported; null when EPA's file holds no reports), its expiry and renewal, EPA's facility type and design flow, the limits taking effect later (each with its begin date and the plant's median reported value today), and the addresses of its page and of get_permit's answer. screen counts the industry's record, renewals and later limits in one sentence, and screen.narrow gives the address of each narrower list. industry keeps the permits whose SIC description has a word starting with each word given; sic the codes that start with the digits given; facility_type and min_flow_mgd the sewage plants or industrial facilities, and those of at least that design flow; over_limit, parameter, renewal and upcoming keep those that went over a limit, over one on that parameter, whose renewal is due or past, or that have a limit taking effect later. A permit EPA's file gives no SIC never matches an industry filter (without_industry says how many), nor one with no design flow min_flow_mgd (without_flow). get_permit gives one permit's limits.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "state": "<state>"
    },
    "name": "list_permits"
  }
}

Input Schema

NameRequiredDescriptionDefault
sicNoA SIC code or its first digits, e.g. 26 or 2621. Optional.
stateYesThe state or territory's two-letter code, e.g. WI.
offsetNoWhere the page starts when more than 1000 match. Optional.
renewalNoexpired: the permit has expired; due: its renewal application is due within 18 months or overdue; any: either. Optional.
industryNoWords of EPA's SIC description, e.g. paper, pulp, sausages, sewerage. Optional.
upcomingNotrue: only the permits with a new or tighter enforceable limit taking effect after today. Optional.
parameterNoOnly the permits that went over a limit on a parameter EPA names with every word given, or that a DMR's usual name stands for, e.g. phosphorus, pH, ammonia, TSS, CBOD5. Optional.
over_limitNotrue: only the permits that went over a limit in the record's 12 months. Optional.
min_flow_mgdNoOnly the permits whose design flow in EPA's file is at least this many million gallons a day, e.g. 1. Optional.
facility_typeNopotw: publicly owned sewage treatment plants; industrial: every other facility type EPA's file gives as NON-POTW. Optional.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • addedInput schema / properties / facility_type
      Added value: +{
      +  "description": "potw: publicly owned sewage treatment plants; industrial: every other facility type EPA's file gives as NON-POTW. Optional.",
      +  "enum": [
      +    "potw",
      +    "industrial"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / min_flow_mgd
      Added value: +{
      +  "description": "Only the permits whose design flow in EPA's file is at least this many million gallons a day, e.g. 1. Optional.",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • changedInput schema / properties / parameter / description
      Previous value: -"Only the permits that went over a limit on a parameter EPA names with every word given, e.g. phosphorus, pH, ammonia. Optional."New value: +"Only the permits that went over a limit on a parameter EPA names with every word given, or that a DMR's usual name stands for, e.g. phosphorus, pH, ammonia, TSS, CBOD5. Optional."
    • addedInput schema / properties / upcoming
      Added value: +{
      +  "description": "true: only the permits with a new or tighter enforceable limit taking effect after today. Optional.",
      +  "type": "boolean"
      +}
  2. Changed3 schema fields changed
    • addedInput schema / properties / over_limit
      Added value: +{
      +  "description": "true: only the permits that went over a limit in the record's 12 months. Optional.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / parameter
      Added value: +{
      +  "description": "Only the permits that went over a limit on a parameter EPA names with every word given, e.g. phosphorus, pH, ammonia. Optional.",
      +  "type": "string"
      +}
    • addedInput schema / properties / renewal
      Added value: +{
      +  "description": "expired: the permit has expired; due: its renewal application is due within 18 months or overdue; any: either. Optional.",
      +  "enum": [
      +    "expired",
      +    "due",
      +    "any"
      +  ],
      +  "type": "string"
      +}
  3. Added

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description adds real behavioral context the annotations do not: records return null when EPA's file holds no reports, permits lacking a SIC can never match an industry filter, and 'screen'/'screen.narrow' summarize results in the response. It stops short of describing pagination or truncation limits.

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

Conciseness3/5

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

The purpose is front-loaded in the opening sentence, and nearly every clause carries substantive information, but the whole thing is delivered as one very long, dash-chained paragraph mixing return fields, filter behavior, and edge cases. It is appropriate in size but poor in structure, making it hard to scan for a specific filter or field.

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?

With 10 parameters, no output schema, and a non-obvious ECHO data model, the description does the heavy lifting: it enumerates returned fields, explains the 'screen'/'screen.narrow' summary objects, and documents filter edge cases (without_industry, without_flow). Pagination via offset exists only in the schema, so the description leaves that operational detail implicit.

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?

With 100% schema coverage the baseline is 3, but the description earns an extra point by clarifying matching semantics the schema only hints at: 'industry' matches words with prefix semantics ('a word starting with each word given'), 'sic' matches codes starting with the digits, and the no-SIC / no-flow exclusion rules are spelled out. These semantics go beyond the property descriptions.

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 first sentence states a precise verb-and-resource scope — screening a state's individual NPDES permits with limits from EPA's ECHO/ICIS-NPDES file — and the closing sentence names the sibling it is not: 'get_permit gives one permit's limits.' An agent can separate this from get_permit without opening either schema.

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

Usage Guidelines4/5

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

The description gives clear usage context: it routes single-permit lookups to get_permit and explains each filter's discriminating power ('industry keeps the permits whose SIC description has a word starting with each word given'). It states when filters apply and their edge behavior, but never gives an explicit 'use this when you need X, not for Y' exclusion beyond the get_permit contrast.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.