mcpField
C
courtlistener-mcp-server

courtlistener-mcp-server

リモート
github.com/cyanheads法務・行政42 週間前に更新
リポジトリ

courtlistener-mcp-server について

courtlistener-mcp-server は、法律研究者が MCP 経由で CourtListener の判決文や連邦裁判所の事件記録にアクセスできるようにします。引用関係、裁判官、裁判所、口頭弁論、司法関係者の財務開示も扱います。

主な機能

  1. 01裁判所の判決文の検索と取得
  2. 02判例引用の追跡と解決
  3. 03連邦事件記録と項目の検索
  4. 04裁判官と裁判所の参照
  5. 05口頭弁論と財務開示の検索

活用シーン

  1. 01検索語、裁判所、日付で判決を検索
  2. 02ある判決を引用する事件の追跡
  3. 03事件記録の当事者と提出書類の確認
  4. 04裁判官や口頭弁論の調査

MCP 対応

14 個のツール、参照リソース、法律調査用プロンプトを通じて、MCP クライアントに CourtListener の検索・取得機能を提供します。STDIO と Streamable HTTP に対応します。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://courtlistener.caseyjhand.com/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

パッケージ
npm@cyanheads/courtlistener-mcp-server0.8.0

ツール

14
パラメーター型必須説明
qstringはい全文検索クエリ。フィールド構文(caseName:"roe v wade"、court_id:scotus、judge:"Alito")とブール演算子(AND、OR、NOT)に対応します。意味ベースのクエリや法律上の引用には、通常の英語を使用します。
courtstringいいえ裁判所 ID(例:"scotus"、"ca9"、"nyed")で特定の裁判所に絞り込みます。裁判所 ID の検索には courtlistener_lookup_courts を使用します。
cursorstringいいえ前のレスポンスの next_cursor フィールドから取得したページネーションカーソルです。最初のページでは省略します。
statusenumいいえ意見の公開ステータス。"Published":先例としての効力があります。"Unpublished":ほとんどの管轄区域で先例として引用できません。"Errata":訂正。"Separate":メインクラスター外で提出された個別意見。"In-chambers":単独の判事による命令。"Relating-to":関連事件または付随事件の命令。省略すると、すべてのステータスを検索します。Published | Unpublished | Errata | Separate | In-chambers | Relating-to | Unknown
order_byenumいいえ結果の並び順。"score desc"(デフォルト)は関連度順です。"citeCount desc" は引用数の多い意見を先に表示します。score desc | dateFiled desc | dateFiled asc | citeCount desc
page_sizeintegerいいえ要求する結果数(デフォルトは20)。渡された値にかかわらず、CourtListener 検索は1ページあたり最低20件を返します。検索1回につき、レート制限のリクエスト数を1件消費します。
filed_afterstringいいえ最も早い提出日(ISO 8601、例:"2020-01-01")。この日付以降に提出された意見に検索対象を絞り込みます。
filed_beforestringいいえ最も遅い提出日(ISO 8601)。この日付以前に提出された意見に検索対象を絞り込みます。

詳細

@cyanheads/courtlistener-mcp-server

MCP 経由で CourtListener の 900 万件以上の判例コーパスから、米国の裁判所の判決、連邦裁判所のドケット、裁判官の記録、引用ネットワーク、口頭弁論を検索・取得できます。STDIO または Streamable HTTP に対応しています。

14 個のツール • 1 個のリソース • 1 個のプロンプト

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework

公開ホスト型サーバー: https://courtlistener.caseyjhand.com/mcp


概要

CourtListener の 900 万件以上の判例コーパスと、PACER の RECAP ミラーから、米国の判例法および連邦裁判所の記録を利用できます。判決やドケットを検索し、引用ネットワークをたどり、引用を特定し、裁判官や裁判所を調べ、口頭弁論の記録や裁判官の財務開示を読むことができます。

ツール
ツール説明
courtlistener_search_opinions900万件以上の裁判所意見を対象に、フィールド構文、裁判所、日付、ステータスのフィルターを使って全文検索します
courtlistener_get_opinion意見クラスターのメタデータと異なる種類の本文(多数意見、同意意見、反対意見)を、ソースの補完状況とともに取得します
courtlistener_get_citationsクラスターの引用ネットワークをたどり、引用先の意見(citing)またはその意見を引用しているもの(cited_by)を取得します
courtlistener_lookup_citationテキスト内のすべての引用(例:「410 U.S. 113」)をクラスター ID と事件のメタデータに解決します
courtlistener_search_dockets事件名、当事者、弁護士、裁判所、提出日で RECAP の連邦裁判所事件記録を検索します
courtlistener_get_docket連邦裁判所事件記録のメタデータと、文書の利用可否を含むページ分割された記録一覧を取得します
courtlistener_get_partiesRECAP の事件記録に登録された当事者と弁護士を取得します
courtlistener_search_judges裁判官を氏名、任命した大統領、裁判所、政治的所属で検索します
courtlistener_get_judge裁判官の役職、学歴、政治的所属、ABA 評価を取得します
courtlistener_lookup_courts管轄の種類、現役/非現役の状況、スクレイパーの対応状況で裁判所を一覧表示します
courtlistener_search_oral_arguments事件名、書き起こしテキスト、裁判所、弁論日で控訴審の口頭弁論の録音を検索します
courtlistener_get_oral_argument口頭弁論 1 件の合議体、時間、MP3 リンク、音声認識による書き起こしを取得します
courtlistener_search_financial_disclosures裁判官と年を指定して、裁判官の財務開示書類を検索します
courtlistener_get_financial_disclosureコード化された値を金額の範囲に変換して、開示書類 1 件の明細項目を取得します
リソース
リソース説明
courtlistener://reference/courts管轄コード、一般的な裁判所 ID、検索タイプコード、レート制限、メンテナンス時間帯

リソースを表示しないクライアント向けに、管轄コードは courtlistener_lookup_courts の jurisdiction パラメーターにも記載されています。

プロンプト
プロンプト説明
courtlistener_research_topicトピックや質問に対する、構造化された法律調査計画を作成します

機能リファレンス

結果ページのサイズには正の整数を指定できます。これにより送信リクエストの上限が設定されます。検索/引用は 20 件、当事者は 10 件、事件記録の項目は 50 件です。どちらの応答形式にも page_sizing(requested、bounded、actual、upstream)が含まれます。上流の検索/開示ページは 20 行が最小単位で、当事者/項目には固定の 20 行ページが使用されます。また、引用元の検索では検索前に引用先 ID の範囲が絞られます。返されたページはそのまま保持され、空のページや最終ページ、ページ単位のフィルターによって行数が少なくなる場合があります。要求サイズを増やすのではなく、ネイティブカーソルを使って続行してください。

courtlistener_search_opinions tool
  • q は必須で、CourtListener のフィールド構文(caseName:"roe v wade"、court_id:scotus、judge:"Alito")と AND/OR/NOT を使用します。court、filed_after/filed_before、status でフィルターし、order_by で並べ替えます(デフォルトは score desc、ほかに dateFiled desc、dateFiled asc、citeCount desc)。1 ページあたり 20 件で、next_cursor を使って続行します
  • 各結果には cluster_id(courtlistener_get_opinion および courtlistener_get_citations 用)、docket_id、cite_count、snippet、意見 ID、type、author_id、local_path を含む意見の各種本文を示す opinions[] が含まれます。totalCount と effectiveQuery には一致結果が示されます
  • status を省略すると、CourtListener のデフォルトである「Published」が適用されます。または、In-chambers や Relating-to を含む公開ステータスを 1 つ選択できます。
courtlistener_get_opinion tool
  • cluster_id は必須です。概要レスポンスの後、sections: ["opinion_<id>", ...] を指定すると個別のバリアントを取得できます。クラスターに存在しない名前を指定すると、unknown_section エラーになります。
  • クラスターのメタデータ(事件名、court_id、引用、cite_count、precedential_status、概要、訴訟上の位置付け、docket_id)に加え、各バリアントの html_text、plain_text、cites[]、download_url、type_label を返します。type_label は courtlistener_search_opinions が返すラベルと同じです。
  • 小さいレスポンスでは kind: "full" を使用します。サイズの大きいバリアントやメタデータの場合は、上限付きの outline を返した後、retrieval.next_cursor を通じて型付きの page レスポンスを返します。元の ID と選択内容を指定し、カーソルが null になるまで cursor を繰り返し指定してください。
  • 提供された plain_text はそのまま保持されます。マークアップのみのバリアントには、段落、表、リスト、脚注、デコード済みエンティティを含む読みやすいテキストが追加されます。html_text は元のソースを保持し、フェンス付きテキストとして表示されます。検索結果や引用のスニペットにも同じ読みやすい形式の正規化を適用します。
  • variants_completion は、上限付きのソース走査が完了したかどうかと、上流に残っているバリアントのカーソルを示します。docket_enrichment は not_linked、resolved、source_fields_absent、lookup_failed を区別し、サニタイズされた失敗カテゴリを示します。キャンセルは伝播します。

courtlistener_get_citations tool
  • cluster_id は必須です。direction は cited_by(デフォルト。この意見を引用している意見)または citing(この意見が引用している意見)です。任意で court と filed_after のフィルターを指定できます。1ページあたり最大20件で、cursor を指定して続きを取得します。
  • 各行には cluster_id、court_id、date_filed、cite_count、snippet が含まれます。citing の合計数は、フィルター適用前の引用先意見のリストに基づきます。また、next_cursor が設定されたまま、フィルター適用後のページが空になる場合があります。source_variants_completion と total_is_partial は observed_total を補足します。バリアントが不完全な場合、これは下限値となり、正確な totalCount の末尾情報は省略されます。
  • citing の場合、cursor は0以上の安全な10進整数オフセットです(01、+1、1.0、1. はすべて 1 を意味します)。形式が不正なオフセットは、リクエストを行う前に invalid_cursor エラーになります。末尾以降のオフセットを指定すると、ソース名とフィルター適用前の重複を除いた意見の合計数を含む空のページが返され、検索は行われません。cited_by のカーソルは不透明なままです。

courtlistener_lookup_citation tool
  • citation には、1件の引用または最大64,000文字の文章を指定でき、文章内のすべての引用が解決されます。max_court_lookups(デフォルトは4、最大20、0 を指定するとスキップ)は、裁判所名の検索に使用する記録検索リクエスト数を制限します。
  • 引用ごとに1つの matches[] エントリーを返します。status は、200(該当する事件が1件)、300(候補が複数)、400(認識されない判例集)、404(該当なし)、429(1リクエストあたりの引用上限超過)を示し、status_label も返します。各 clusters[] には cluster_id、docket_id、court_id、court_resolution(resolved、no_docket、lookup_failed、over_budget)が含まれます。大きな予算で再試行する価値があるのは最後の値だけです。
  • 解決できない引用はエラーではなくエントリーとして返されます。解析可能な引用が含まれないテキストのみ、not_found で失敗します。CourtListener は、このエンドポイントの使用量を送信された引用ごとに計測し、リクエスト単位の制限とは別に扱います。

courtlistener_search_dockets tool
  • q は必須で、事件名、事件番号、当事者名、弁護士名に一致します。party_name(q と AND 条件で適用)、court、filed_after / filed_before で絞り込めます。1ページあたり20件で、next_cursor を指定して続きを取得します。
  • 各事件記録には docket_id、parties、attorneys、firms、suit_nature、assigned_to / referred_to、および is_available と RECAP の filepath_local URL を含む最大3件の sample_documents が含まれます。すべてのレスポンスに、RECAP における PACER のカバレッジが一部に限られることを示す coverage_note が追加されます。

courtlistener_get_docket ツール
  • docket_id は必須です。エントリは1ページあたり20件です(CourtListener は entries_page_size を無視します)。entries_page でページを順に取得します
  • ドケットのメタデータ、total_entries、next_cursor(次の entries_page の番号)、および documents[] を含む entries[] を返します。documents[] には is_available、page_count、filepath_local が含まれます。is_available: false の文書には PACER が必要で、取得機能は公開されていません
  • CourtListener が数値の総数を提供しない場合、最終ページを含め、total_entries は null になります。表示される総数は unknown となります。返されたエントリ数を代わりに使用することはありません。

courtlistener_get_parties ツール
  • docket_id は必須です。cursor にはページ番号ではなく、不透明な next_cursor トークンを指定します。送信する page_size は10以下に制限されますが、CourtListener がその値を尊重するとは限りません
  • 各当事者には name、ドケット単位の role、および name、contact_raw、role_code / role(コード5~9は、すでに記録上の当事者ではないことを意味します)、date_action を含む attorneys[] が含まれます。total_parties には、上流から総数が提供された場合はその値を使用し、提供されない場合は単一ページの結果を数えます。それ以外は null のままです
  • attorney_resolution は、解決済み、取得上限到達、または上限による打ち切りの検索状況、未解決の ID、残りの上流名簿カーソルを報告します。検索は名簿ページを5ページ取得するか、ローカルのリクエスト予算によって後続ページの取得が阻まれると終了します。すでに取得したレコードは保持されます。弁護士ごとの resolution では、取得済みレコードのソースフィールドが空の場合と、取得上限到達後の not_found、上限による打ち切り後の not_fetched を区別します。上流の名簿カーソルとバリアントカーソルは完全性を示すものであり、これらのツールでは新たな取得入力として受け付けません。

courtlistener_search_judges ツール
  • q は必須です。appointer(大統領の姓)、court、political_affiliation(d、r、i、l、g、u)で絞り込めます。1ページあたり20件で、next_cursor を使って続きを取得します
  • 結果には、person_id(courtlistener_get_judge 用)、コードではなくラベルとしての political_affiliation と aba_rating、および current_position が含まれます。current_position は、終了日がない役職、またはそのような役職が複数あるか存在しない場合は、開始日が最も新しい役職です

courtlistener_get_judge ツール
  • person_id は必須です。役職はページ数の上限まで取得され、長い記録が上限を超えた場合は truncated と positionsShown で報告します
  • 司法職に加え、job_title と organization_name で説明される非司法職、学歴、政治的所属、ABA 評価、fjc_id が含まれます。コード化されたフィールドでは、生のコードとラベル(position_type_label、termination_reason_label、degree_label)が併記されます
  • 日付には、CourtListener が dob_granularity、dod_granularity、date_start_granularity、date_termination_granularity に記録した精度(year、month、day)が反映されます

courtlistener_lookup_courts ツール
  • jurisdiction(F、FD、FB、S、SA など、CourtListener の22種類のコードのいずれか。完全な一覧は courtlistener://reference/courts にあります)、status(デフォルトは active、または inactive、any)、has_opinion_scraper で絞り込めます。ライブレコードは1ページあたり20件で、page を使って順に取得します
  • courts[] には、id(他のすべてのツールで絞り込みに使用する裁判所 ID)、citation_string、jurisdiction、スクレイパーフラグが含まれます。all_matching_court_ids には、バンドルされたスナップショットから取得した、一致するすべての ID がリクエストコストなしで一覧表示されます。一致する数が1,000件を超える場合は空になるため、all_matching_court_ids_complete を確認してください

courtlistener_search_oral_arguments ツール
  • q は必須で、事件名とトランスクリプトのテキストに一致します。court と argued_after / argued_before で絞り込めます。1ページあたり20件で、next_cursor を使って続きを取得します
  • 結果には、audio_id(courtlistener_get_oral_argument 用)、panel_ids(courtlistener_get_judge 用)、duration_seconds、snippet、および2つの MP3 リンクが含まれます。download_url は提供元の裁判所にあるリンク、local_path は CourtListener による永続的なコピーです
courtlistener_get_oral_argument tool
  • id(検索で取得した audio_id)は必須です。sections: ["transcript"] を指定すると、書き起こしが選択されます。選択したレスポンスにも同じバイト数制限が適用されます。
  • panel_ids、duration_seconds、download_url、docket_id、has_transcript、transcript を返します。テキストやメタデータが大きすぎる場合は、outline とカーソルでページを指定する page レスポンスが使用されます。この記録には口頭弁論の日付が含まれていないため、検索結果または訴訟記録から取得してください。

courtlistener_search_financial_disclosures tool
  • judge_id(person_id)と year で絞り込みます。1ページにつき20件の申告書が返され、cursor で続きのページを取得できます。CourtListener にはサーバー側の年フィルターがないため、year による絞り込みは取得したページにのみ適用されます。next_cursor が設定された空のページが返された場合も、ページの取得を続けてください。
  • 各申告書には、disclosure_id、report_type、has_been_extracted、is_amended、pdf_url、カテゴリー別の counts(投資、贈与、負債、役職、払い戻し、契約、投資以外の収入、配偶者の収入)、および項目別の gifts が含まれます。

courtlistener_get_financial_disclosure tool
  • disclosure_id は必須です。categories では、investments、debts、positions、reimbursements、non_investment_incomes、spouse_incomes、agreements、gifts から選択します(すべてを取得する場合は省略します)。
  • 申告書のメタデータ、counts、要求された明細行を返します。コード化された値と収入の列は、ドル範囲にデコードされます(N → $250,001 - $500,000)。選択したデータが大きすぎる場合は、1行が予算を超える場合も含め、outline とカーソルでページを指定する page レスポンスが使用されます。

意見書、音声、申告書の取得では、シリアライズされた各レスポンス(structuredContent と完全な content[])を24,000 UTF-8バイトに制限します。元の ID と変更していない sections/categories の選択を指定し、cursor: retrieval.next_cursor を使って繰り返してください。カタログページからデータページへは自動的に移行します。retrieval.ranges は JSON Pointer パスと、絶対位置に基づく排他的範囲(rows、code_points、sections)を使用します。型付きの行は絶対インデックスで結合し、text_chunks はコードポイント範囲に沿って連結します。一部の行も元のソース識別情報を保持します。省略されたテキストは元のフィールドパスから取得できます。メタデータもページ分割される場合があります。構造化文字列はエスケープされないまま保持され、表示用のエスケープ処理は切り出し後に行われます。正規化されたソースが変更されている場合は stale_cursor が返されます。その場合はカーソルを使わずに最初からやり直してください。ソース取得完了用のカーソルは、これらの取得用カーソルとは別です。


courtlistener://reference/courts resource
  • Markdown のリファレンスです。22の管轄コード(courtlistener_lookup_courts が検証に使用するセットから出力)、一般的な裁判所 ID、検索種別コード、公開されている無料プランのレート制限、週次メンテナンス時間帯(太平洋時間の木曜日21:00~23:59)を掲載しています。
  • 静的コンテンツで、24時間の公開キャッシュが可能です。

courtlistener_research_topic prompt
  • 引数:topic は必須です。jurisdiction は省略可能です(scotus や ca9 などの裁判所 ID)。depth も省略可能で、overview(デフォルト。主要な判例を3~5件)または deep(引用ネットワークの追跡と裁判官の検索を追加)を指定します。
  • 調査ワークフローと調査結果のテンプレート(主要な判例、先例の推移、調査の不足箇所)を示すユーザーメッセージを1件返します。

特長

@cyanheads/mcp-ts-core を基盤としており、stdio および Streamable HTTP トランスポート、切り替え可能な認証(none / jwt / oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングを備えた構造化ログに対応しています。

CourtListener 固有の機能:

  • CourtListener REST API v4:検索、意見書とクラスター、ドケットと記録、当事者と弁護士、人物と役職、裁判所、音声、財務開示、引用の検索
  • プロセス全体で共有する単一のリクエストキューを使用し、COURTLISTENER_RATE_LIMIT_PER_MINUTE と COURTLISTENER_RATE_LIMIT_PER_HOUR に合わせてリクエストを調整します。そのため、集中したリクエストは失敗せずに待機します。429 が返された場合は、待機中のすべての呼び出しについてキューを一時停止し、Retry-After の値は45秒の待機上限内で尊重されます
  • 呼び出しごとのリクエストコスト:ほとんどのツールは1。courtlistener_get_docket は2。courtlistener_get_parties と courtlistener_get_judge は2以上(長い名簿または経歴の追加ページごとに1)。courtlistener_get_opinion と courtlistener_get_citations は3(意見書の別バージョンの追加ページごとに1を加算)。courtlistener_lookup_citation は、引用の検索に加えて最大 max_court_lookups 件のドケットリクエストを消費します
  • 成功しない入力(空の q、不正な日付、64,000文字を超える引用、不明な口頭弁論セクション)は、リクエストを消費する前に拒否されます

エージェントに適した出力:

  • ID の連鎖:cluster_id、docket_id、person_id、audio_id、disclosure_id は、後続の呼び出しで使用する箇所に表示されます。フィールドの説明には、それぞれを受け取るツールが明記されています
  • 型付きレート制限エラー:reason: "rate_limited" と秒単位の retryAfter を返します。CourtListener が429を返した場合も、送信前にキューが断念した場合も対象です。後者では、リクエストを消費していないことがメッセージに記載されます
  • 上限付き取得:意見書、音声、開示の各ツールは、小さいレスポンスをすべて保持し、サイズの大きい選択レコードは、ソーステキストを切り詰めずに、概要と再開可能な型付きページを通じてストリーミングします
  • カバレッジに関する注記をインラインで表示:RECAP の coverage_note、引用検索の court_resolution、役職履歴の truncated、およびページ内フィルターによってページが空になった場合に後続ページがあることを示す通知

はじめに

公開ホストインスタンス

公開インスタンスは https://courtlistener.caseyjhand.com/mcp で利用できます。インストールは不要です。Streamable HTTP を介して任意の MCP クライアントを接続してください:

{
  "mcpServers": {
    "courtlistener-mcp-server": {
      "type": "streamable-http",
      "url": "https://courtlistener.caseyjhand.com/mcp"
    }
  }
}
セルフホスト/ローカル

次の内容を MCP クライアントの設定ファイルに追加してください。CourtListener アカウント設定で無料の API トークンを生成してください。

{
  "mcpServers": {
    "courtlistener-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/courtlistener-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info",
        "COURTLISTENER_API_TOKEN": "your-api-token"
      }
    }
  }
}

または npx を使用する場合(Bun は不要です):

{
  "mcpServers": {
    "courtlistener-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@cyanheads/courtlistener-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info",
        "COURTLISTENER_API_TOKEN": "your-api-token"
      }
    }
  }
}

または Docker を使用する場合:

{
  "mcpServers": {
    "courtlistener-mcp-server": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "MCP_TRANSPORT_TYPE=stdio",
        "-e", "COURTLISTENER_API_TOKEN=your-api-token",
        "ghcr.io/cyanheads/courtlistener-mcp-server:latest"
      ]
    }
  }
}

Streamable HTTP を使用するには、トランスポートを設定してサーバーを起動します:

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 COURTLISTENER_API_TOKEN=... bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
  • Bun v1.4.0 以降(または Node.js v24+)。
  • courtlistener.com の無料アカウントで取得した CourtListener API トークン。公開されている無料プランの上限は、1分あたり5リクエスト、1時間あたり50リクエスト、1日あたり125リクエストです。実際の上限はトークンのプランによって異なり、Free Law Project のメンバーシップに加入すると上限が引き上げられます。
インストール
  1. リポジトリをクローンします:
git clone https://github.com/cyanheads/courtlistener-mcp-server.git
  1. ディレクトリに移動します:
cd courtlistener-mcp-server
  1. 依存関係をインストールします:
bun install
  1. 環境を設定します:
cp .env.example .env
# edit .env and set COURTLISTENER_API_TOKEN

設定

変数説明デフォルト
COURTLISTENER_API_TOKEN必須。 CourtListener アカウント設定にある API トークンです。—
COURTLISTENER_BASE_URLAPI ベース URL の上書き値です。https://www.courtlistener.com/api/rest/v4
COURTLISTENER_RATE_LIMIT_PER_MINUTE1 分間のローリング期間内にサーバーが開始するリクエスト数です。上限を超えたリクエストはキューに入り、約 45 秒以内に開始できない場合は、リセット時刻を示すエラーで失敗します。トークンのより高いティアに合わせて値を引き上げてください。5
COURTLISTENER_RATE_LIMIT_PER_HOUR1 時間のローリング期間内にサーバーが開始するリクエスト数です。50
MCP_TRANSPORT_TYPEトランスポート:stdio または http です。stdio
MCP_HTTP_PORTHTTP サーバーのポートです。3010
MCP_SESSION_MODEHTTP セッションモード:stateless、stateful、または auto です。サーバーは stateless を宣言しており、この設定で上書きできます。stateless
MCP_AUTH_MODE認証:none、jwt、または oauth です。none
MCP_LOG_LEVELログレベル(debug、info、warning、error など)です。info
LOGS_DIRログファイル用のディレクトリです(Node.js のみ)。<project-root>/logs
STORAGE_PROVIDER_TYPEストレージバックエンド:in-memory、filesystem、supabase、cloudflare-kv/r2/d1 です。in-memory
OTEL_ENABLEDOpenTelemetry を有効にします。false
OTEL_EXPORTER_OTLP_ENDPOINTトレースとメトリクスのベースエンドポイントです。/v1/traces と /v1/metrics が追加されます。エンドポイントを指定しない場合、どちらもエクスポートされません。—
OTEL_EXPORTER_OTLP_LOGS_ENDPOINTマスキング済み OTLP ログの明示的なエンドポイントです。ベースエンドポイントを指定しても、ログのエクスポートは有効になりません。—
LOG_TOOL_FAILURE_PAYLOADSキーに基づくマスキングを行い、失敗した呼び出しの入力と結果をログに記録します。false
LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTESログに記録する失敗した呼び出しの各ペイロードのサイズ上限です。16384

オプションの上書き設定の全一覧は、.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 courtlistener-mcp-server .
docker run --rm -e COURTLISTENER_API_TOKEN=your-token -p 3010:3010 courtlistener-mcp-server

Dockerfile では、デフォルトで HTTP トランスポート、ステートレスセッションモードが設定され、ログは /var/log/courtlistener-mcp-server に記録されます。OpenTelemetry のピア依存関係はデフォルトでインストールされます。省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。

プロジェクト構成

ディレクトリ目的
src/index.tscreateApp() のエントリーポイントです。ツール、リソース、プロンプトを登録し、サービスを初期化します。
src/configサーバー固有の環境変数を Zod で解析・検証します。
src/mcp-server/toolsツール定義(*.tool.ts)です。判例、引用、ドケット、当事者、裁判官、裁判所、口頭弁論、財務開示に関する 14 個のツールがあります。
src/mcp-server/resourcesリソース定義(*.resource.ts)です。裁判所の参照リソースがあります。
src/mcp-server/promptsプロンプト定義(*.prompt.ts)です。法律調査プロンプトがあります。
src/services/courtlistenerCourtListener API クライアント(リクエストのペーシング、再試行、エラー分類)、コードテーブル、同梱の裁判所スナップショット(bun run courts:snapshot で再生成)です。
tests/src/ に対応する単体テストと統合テストです。

開発ガイド

開発ガイドラインとアーキテクチャ上の規則については、CLAUDE.md を参照してください。要点は次のとおりです。

  • ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックで try/catch を使わないでください。
  • リクエスト単位のログには ctx.log を、テナント単位のストレージには ctx.state を使用してください。
  • 新しいツール、リソース、プロンプトを登録するには、src/index.ts でインポートし、createApp({ tools, resources, prompts }) の配列に追加してください。
  • CourtListener API の呼び出しはラップしてください。生データを検証し、ドメイン型に正規化してから、出力スキーマに従って返します。不足しているフィールドを決して捏造しないでください。

コントリビューション

課題の報告を歓迎します。提出前にチェックとテストを実行してください。

bun run devcheck
bun run test

ライセンス

Apache-2.0 — 詳細は LICENSE を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。