epa-mcp-server について
epa-mcp-serverは、施設のコンプライアンス、有害物質排出、Superfund、飲料水、EJScreen、AirNowなどのEPA環境データをMCPクライアントに提供します。施設、地域、環境状況の調査に向いています。
主な機能
- 01規制対象施設と違反事例の検索
- 02施設コンプライアンス情報の取得
- 03TRIとSuperfund記録の検索
- 04飲料水システムの検索
- 05EJScreen指標の取得
- 06AirNowの状況と予報の取得
活用シーン
- 01施設の検査や執行履歴を確認
- 02州や郡ごとの有害物質排出を比較
- 03近隣のSuperfundサイトや飲料水システムを検索
- 04場所の環境・人口指標をスクリーニング
MCP 対応
STDIOまたはStreamable HTTP経由で、9つのツールと2つのリソースをMCPクライアントに提供します。セルフホスト環境でAirNow状況ツールを使うにはAPIキーが必要です。公開インスタンスではこのツールは利用できません。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://epa.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-epa https://epa.caseyjhand.com/mcp{"mcpServers":{"cyanheads-epa":{"type":"http","url":"https://epa.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-epa":{"type":"http","url":"https://epa.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-epa":{"type":"http","url":"https://epa.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-epa":{"serverUrl":"https://epa.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
9| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| city | string | いいえ | 市区町村名。大文字と小文字は区別せず、指定した文字列で始まる市区町村に一致します(例:"TACOMA"、または "SEAT" で SEATTLE と SEATAC)。state と組み合わせて指定してください。 |
| limit | integer | いいえ | 返す施設の最大数(1~100) |
| state | string | いいえ | 米国の州を表す 2 文字の略称(例:"WA"、"CA") |
| latitude | number | いいえ | 10進度での緯度。近接検索では longitude および radius_miles と組み合わせてください。 |
| programs | array | いいえ | 結果を、1つの環境プログラムに登録された施設に限定します。ECHO では検索ごとに1つのプログラムのみで絞り込めるため、値を1つ指定してください。CAA=大気、CWA=水、RCRA=有害廃棄物、TRI=有害物質の排出、SDWA=飲料水。 |
| zip_code | string | いいえ | 検索対象の 5 桁の ZIP コード |
| longitude | number | いいえ | 10進度での経度。近接検索では latitude および radius_miles と組み合わせてください。 |
| active_only | boolean | いいえ | true の場合、有効な許可を持つ施設のみを返します |
| radius_miles | number | いいえ | 指定した緯度/経度を中心とする検索半径(マイル、最大 100)。latitude と longitude が必要です。 |
| has_violation | boolean | いいえ | true の場合、少なくとも1つのプログラムで重大な不遵守状態にある施設のみを返します(complianceStatus "Significant Violation") |
詳細
@cyanheads/epa-mcp-server
EPAの環境データを検索・取得します。施設のコンプライアンス(ECHO)、有害物質の排出(TRI)、スーパーファンドサイト、飲料水システム、環境正義スクリーニング(EJScreen)、リアルタイムの大気質(AirNow)に対応しています。STDIOまたはStreamable HTTP。
公開ホスト型サーバー: https://epa.caseyjhand.com/mcp
概要
5つの連邦プログラムにわたるEPAの環境データを提供します。施設のコンプライアンス(ECHO)、有害物質の排出(TRI)、スーパーファンドサイト、飲料水システム(SDWIS)、環境正義スクリーニング(EJScreen)に加え、AirNowのリアルタイム大気質データにも対応しています。施設の検査・執行履歴の取得、地域全体における有害物質の排出状況の追跡、任意の地点における環境正義リスクのスクリーニングができます。
ツール
| ツール | 説明 |
|---|---|
epa_echo_search_facilities | CAA、CWA、RCRA、TRI、SDWAにおける所在地、環境プログラム、コンプライアンス状況でEPA規制対象施設を検索します |
epa_echo_get_facility | EPA Registry IDを指定して、1施設のコンプライアンス状況、検査、執行措置、罰金、TRI IDを含む詳細なプロファイルを取得します |
epa_echo_search_violations | 州、プログラム、期間を指定して、EPAの民事・刑事執行案件を検索します |
epa_airnow_get_conditions | AirNowから現在のAQI観測値または発表済みのAQI予報を取得します |
epa_tri_get_facility_releases | 単一施設の化学物質別Toxic Release Inventoryデータを取得します |
epa_tri_search_releases | 州または郡内の施設を対象に、Toxic Release Inventoryの記録を検索します |
epa_superfund_search_sites | 所在地またはNPL登録状況でスーパーファンド(CERCLA/SEMS)サイトを検索します |
epa_water_search_systems | 州またはZIPコードで飲料水システム(SDWIS)を検索します |
epa_ejscreen_get_scores | 地点およびバッファー範囲のEJScreen環境正義指標を取得します |
リソース
| リソース | 説明 |
|---|---|
epa://facility/{registry_id} | EPA Registry IDで指定した施設の完全なコンプライアンスプロファイル(epa_echo_get_facilityと同じデータ) |
epa://superfund/{site_id} | SEMSサイトIDで指定したスーパーファンドのサイト記録 |
すべてのリソースデータはツールからも取得できます。ツールのみを利用するMCPクライアントからプログラムでアクセスするには、epa_echo_get_facilityとepa_superfund_search_sitesを使用してください。
機能リファレンス
epa_echo_search_facilities ツール
- ZIPコード、州、市(前方一致。州を指定することを推奨)、または緯度+経度+radius_miles(最大100マイル)を指定します。最大100件(デフォルトは50件)を返します
epa_echo_get_facilityで使用するregistryId、郡とfipsCode、座標、プログラムごとのフラグ、過去5年間の検査数と罰金額の合計を返しますprogramsにはCAA、CWA、RCRA、TRI、SDWAのいずれかを指定します。has_violationを指定すると、重大な違反状態にある施設に絞り込まれます。active_onlyを指定すると、有効な許可証を持つ施設に絞り込まれます
epa_echo_get_facility ツール
registry_idはepa_echo_search_facilitiesから取得しますcomplianceStatus、法令ごとのprogramComplianceの概要、過去5年間の最新100件の検査(inspectionsTotalは全件数を示します)、罰金を伴う過去5年間の執行措置、最新のTRI合計とtriReleasesTransfersYear、およびepa_tri_get_facility_releasesで使用するtriFacilityIdsを返します- ステータスの照会に失敗した場合、プロファイルには
complianceStatusが含まれず、その旨を示すnoticeが返されます。不明なIDの場合はfacility_not_foundエラーになります
epa_echo_search_violations ツール
stateまたはzip_codeが必要です。最大100件(デフォルトは50件)を返しますprogramではCAA、CWA、RCRA、SDWA、CERCLA、FIFRA、TSCAのいずれかで絞り込みます。事件が引用する法律のいずれかに一致します。case_typeはcivil、criminal、またはall(デフォルト)ですdate_filed_start/date_filed_end(YYYY-MM-DD、指定日を含む)で申立日を指定します。申立日があるのは民事事件のみです。そのため、日付を指定してallを選ぶと、noticeとともに民事事件が返され、criminalは指定できません
epa_airnow_get_conditions ツール
zip_code、またはlatitudeとlongitudeの両方を指定します。modeはcurrent(デフォルト)またはforecastです- currentモードでは、50マイル以内で最も近いモニターから、各汚染物質の最新の1時間ごとのNowCast AQIを返します。forecastモードでは、発行された各日について
dateValid、actionDay、discussionを返します。forecast_date(YYYY-MM-DD)を指定すると、1日分に絞り込まれます - 測定値には
categoryNameとcategoryNumber(1 Good~6 Hazardous)が含まれます。attributionは、データが暫定的なものであり、規制上または執行上の判断には適さないことを示します AIRNOW_API_KEYが設定されている場合にのみ登録されます。レスポンスは約1時間キャッシュされます
epa_tri_get_facility_releases ツール
facility_idには、epa_tri_search_releasesまたはepa_echo_get_facilityのtriFacilityIdsから取得したTRIのfacilityIdを指定します。year(1987~2030)と部分一致のchemical_nameは任意です- 化学物質ごとの大気、水域、土地、地下圧入への排出量と、単発・非定常の合計を返します。
yearを省略すると、報告年の新しいものから返されます。報告書が500件に達すると、どちらのレスポンス形式でも、さらに報告書が存在する可能性があることが示されます。yearまたはchemical_nameで絞り込んでください - 数量の単位はポンドです。グラムで報告されたダイオキシンの記録は換算され、
reportedUnit: "grams"が付与されます
epa_tri_search_releases ツール
- 2文字の
stateが必要です。county(部分一致、大文字・小文字を区別しない)、部分一致のchemical_name、yearは任意です。最大200件(デフォルトは50件)を返します。yearを省略すると、報告年の新しいものから返されます epa_tri_get_facility_releasesで使用するfacilityIdと、各記録の単発・非定常の合計を返します。include_release_breakdown: trueを指定すると、大気、水域、土地、地下圧入への排出量が追加されますが、上流へのリクエストが1回増えます(EPA側でキャッシュされていない場合は最大約20秒かかります)- グラムで報告されたダイオキシンの記録はポンドに換算され、
reportedUnit: "grams"が付与されます
epa_superfund_search_sites ツール
state/city/zip_code、またはlatitude+longitude+radius_miles(0.1~500)を指定します。最大200件のサイトを返します(デフォルトは50件)。- サイト識別子、所在地、NPL、浄化状況を返します。
npl_statusでは、登録済み、未登録、提案中、またはすべて(デフォルト)で絞り込めます。 - 近接検索では、緯度/経度の候補を最後までページ取得し、正確な距離を適用して、最寄りのサイトから返します。結果の上限により除外された一致サイトの件数は、
noticeに記載されます。座標のないサイトは位置を特定できません。すべての候補ページで50秒の制限時間を共有するため、タイムアウトする場合は半径を狭めるか、フィルターを追加してください。
epa_water_search_systems ツール
stateまたはzip_codeが必要です。最大200件のシステムを返します(デフォルトは50件)。zip_codeは各システムの登録住所に一致し、給水区域には一致しません。has_violationを指定すると、SDWIS の未解決違反があるシステムに絞り込めます。pws_typeは community、non-transient、transient のいずれかで、typeではそれぞれ CWS/NTNCWS/TNCWS として返されます。has_violationでは最大1,000件のレコードを読み取ります。この上限に達した場合、違反のあるシステムを見落としている可能性があることがnoticeに記載されます。
epa_ejscreen_get_scores ツール
latitudeとlongitudeが必要です。distanceのデフォルトは1、unitのデフォルトはマイルです(キロメートルも指定できます)。バッファーは最大15マイルです。- 環境指標13項目と人口統計指標6項目について、全国および州のパーセンタイルと人口統計インデックスを返します。対象範囲外の場合は、
coverage.valid: falseとともに注記が返されます。 - EJScreen v2.2(2022)は、コミュニティが保守する EJAM API(Public Environmental Data Partners)から提供されます。
epa://facility/{registry_id} リソース
registry_idはepa_echo_search_facilitiesから取得します。epa_echo_get_facilityのコンプライアンスプロファイルを返します。施設が見つからない場合はエラーになります。
epa://superfund/{site_id} リソース
site_idはepa_superfund_search_sitesから取得します。- Superfund のサイトレコードを返します。SEMS レコードが見つからない場合はエラーになります。
機能
@cyanheads/mcp-ts-core を基盤としており、stdio および Streamable HTTP トランスポート、プラグイン可能な認証(none/jwt/oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングに対応した構造化ログを提供します。
EPA 固有の機能:
- ECHO(施設のコンプライアンス)、Envirofacts DMAP(TRI、Superfund、SDWIS)、AirNow(大気質)、コミュニティが保守する EJAM API(EJScreen v2.2、2022)を対象とする、
epa_で始まるツール群 - AirNow のレスポンスは、API キーごとのレート制限内に収めるため、約1時間キャッシュされます。
- TRI の報告には約18か月の遅れがあり、最新の報告年は通常、現在より2年遅れています。
エージェント向けの出力:
- 検索結果には、次のツールで必要となる ID(
registryId、fipsCode、facilityId、triFacilityIds)が含まれます。 - ステータスの照会に失敗した場合、
epa_echo_get_facilityはnoticeを含む部分的なプロファイルを返します。 - 検索結果がない場合は、適用されたフィルターを示し、検索範囲を広げる方法を提案する
messageを返します。
はじめに
公開ホストインスタンス
公開インスタンス https://epa.caseyjhand.com/mcp を利用できます。インストールは不要です。AirNow キーなしで動作するため、epa_airnow_get_conditions は利用できませんが、その他の8つのツールは利用できます。Streamable HTTP を介して、任意の MCP クライアントから接続してください。
{
"mcpServers": {
"epa-mcp-server": {
"type": "streamable-http",
"url": "https://epa.caseyjhand.com/mcp"
}
}
}
セルフホスト/ローカル
以下を MCP クライアントの設定ファイルに追加してください。AirNow API キーは任意です。epa_airnow_get_conditions を有効にするには、AIRNOW_API_KEY を設定してください(docs.airnowapi.org で無料登録できます)。キーがない場合でも、他の8つのツールを使ってサーバーを起動できます。ECHO、DMAP、EJScreen のツールは認証なしで利用できます。
{
"mcpServers": {
"epa-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/epa-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"AIRNOW_API_KEY": "your-airnow-key"
}
}
}
}
または npx を使用します(Bun は不要です)。
{
"mcpServers": {
"epa-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/epa-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"AIRNOW_API_KEY": "your-airnow-key"
}
}
}
}
または Docker を使用します。
{
"mcpServers": {
"epa-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "AIRNOW_API_KEY=your-airnow-key",
"ghcr.io/cyanheads/epa-mcp-server:latest"
]
}
}
}
Streamable HTTP を使用するには、トランスポートを設定してサーバーを起動してください。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 AIRNOW_API_KEY=... bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 以降(または Node.js v24 以降)。開発と Docker では Bun v1.4.4 を使用します。
- (任意)
epa_airnow_get_conditionsを有効にするには、AirNow API キーが必要です。docs.airnowapi.org/account/request で無料登録できます。キーがなくても、ほかの 8 つのツールは動作します。ECHO、DMAP、EJScreen のツールには API キーは必要ありません。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/epa-mcp-server.git
- ディレクトリに移動します:
cd epa-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します:
cp .env.example .env
# optionally set AIRNOW_API_KEY to enable the air quality tool
設定
すべての設定は、起動時に src/config/ の Zod スキーマを使って検証されます。主な環境変数は次のとおりです。
| 変数 | 説明 | デフォルト |
|---|---|---|
AIRNOW_API_KEY | 任意。 epa_airnow_get_conditions を有効にします。 | — |
EPA_ECHO_BASE_URL | ECHO API のベース URL | https://echodata.epa.gov/echo |
EPA_DMAP_BASE_URL | Envirofacts DMAP API のベース URL | https://data.epa.gov/dmapservice |
EPA_AIRNOW_BASE_URL | AirNow API のベース URL | https://www.airnowapi.org/aq |
EJSCREEN_API_BASE_URL | EJScreen(EJAM)API のベース URL | https://api.ejanalysis.com |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http | stdio |
MCP_HTTP_PORT | HTTP サーバーのポート | 3010 |
MCP_HTTP_ENDPOINT_PATH | HTTP エンドポイントのパス | /mcp |
MCP_SESSION_MODE | HTTP セッション:auto、stateful、または stateless | stateless |
MCP_AUTH_MODE | 認証モード:none、jwt、または oauth | none |
MCP_LOG_LEVEL | ログレベル(RFC 5424) | info |
LOG_TOOL_FAILURE_PAYLOADS | キー名をマスキングして、失敗した呼び出しの引数と結果を記録します。自由形式の値に含まれるシークレットは表示されたままです。 | false |
LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES | ログに記録するペイロードのバイト数上限 | 16384 |
LOGS_DIR | ログファイルのディレクトリ(Node.js のみ) | <project-root>/logs |
STORAGE_PROVIDER_TYPE | ストレージバックエンド:in-memory、filesystem、supabase、cloudflare-kv/r2/d1 | in-memory |
OTEL_ENABLED | OpenTelemetry のトレースとメトリクスを有効にします | false |
OTEL_EXPORTER_OTLP_ENDPOINT | OTLP のベース URL | — |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT / OTEL_EXPORTER_OTLP_METRICS_ENDPOINT | シグナルごとのエンドポイント上書き設定 | — |
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | OTLP ログのエクスポートを有効にします | — |
任意の上書き設定の全一覧は .env.example を参照してください。
サーバーの実行
ローカル開発
-
ビルドして実行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
チェックとテストを実行:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t epa-mcp-server .
docker run --rm -e AIRNOW_API_KEY=your-key -p 3010:3010 epa-mcp-server
Dockerfile のデフォルトは HTTP トランスポート、ステートレスセッションモードで、ログは /var/log/epa-mcp-server に記録されます。OpenTelemetry のピア依存関係はデフォルトでインストールされます。これらを省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 目的 |
|---|---|
src/index.ts | createApp() のエントリーポイント。ツールとリソースを登録し、サービスを初期化します。 |
src/config | Zod を使った、サーバー固有の環境変数の解析と検証。 |
src/mcp-server/tools | ツール定義(*.tool.ts)。ECHO、DMAP、EJAM、AirNow にわたる 9 つのツール。 |
src/mcp-server/resources | リソース定義(*.resource.ts)。施設とスーパーファンドの URI ハンドラー。 |
src/services/echo | ECHO REST API サービス層。施設検索、施設詳細、執行事例。 |
src/services/dmap | Envirofacts DMAP サービス層。TRI の排出量、スーパーファンドのサイト、飲料水システム。 |
src/services/airnow | AirNow サービス層。現在および予測の AQI 観測値。 |
src/services/ejscreen | EJScreen(EJAM)サービス層。地点とバッファーに関する環境正義の指標。 |
tests/ | src/ の構成に対応する単体テストと統合テスト。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックに
try/catchは使用しません - リクエスト単位のロギングには
ctx.logを、テナント単位のストレージにはctx.stateを使用します - 新しいツールとリソースは、
src/mcp-server/*/definitions/index.tsのバレル経由で登録します - 外部 API 呼び出しはラップします。生データを検証し、ドメイン型に正規化してから出力スキーマを返します。欠落しているフィールドを捏造してはいけません
- ECHO 検索では、少なくとも 1 つの地理的パラメーターを指定する必要があります。対象範囲を指定しないクエリは、稼働中の API でタイムアウトします
貢献
Issue を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0。詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。