courtlistener-mcp-server について
courtlistener-mcp-server は、法律研究者が MCP 経由で CourtListener の判決文や連邦裁判所の事件記録にアクセスできるようにします。引用関係、裁判官、裁判所、口頭弁論、司法関係者の財務開示も扱います。
主な機能
- 01裁判所の判決文の検索と取得
- 02判例引用の追跡と解決
- 03連邦事件記録と項目の検索
- 04裁判官と裁判所の参照
- 05口頭弁論と財務開示の検索
活用シーン
- 01検索語、裁判所、日付で判決を検索
- 02ある判決を引用する事件の追跡
- 03事件記録の当事者と提出書類の確認
- 04裁判官や口頭弁論の調査
MCP 対応
14 個のツール、参照リソース、法律調査用プロンプトを通じて、MCP クライアントに CourtListener の検索・取得機能を提供します。STDIO と Streamable HTTP に対応します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://courtlistener.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-courtlistener https://courtlistener.caseyjhand.com/mcp{"mcpServers":{"cyanheads-courtlistener":{"type":"http","url":"https://courtlistener.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-courtlistener":{"type":"http","url":"https://courtlistener.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-courtlistener":{"type":"http","url":"https://courtlistener.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-courtlistener":{"serverUrl":"https://courtlistener.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
14| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| q | string | はい | 全文検索クエリ。フィールド構文(caseName:"roe v wade"、court_id:scotus、judge:"Alito")とブール演算子(AND、OR、NOT)に対応します。意味ベースのクエリや法律上の引用には、通常の英語を使用します。 |
| court | string | いいえ | 裁判所 ID(例:"scotus"、"ca9"、"nyed")で特定の裁判所に絞り込みます。裁判所 ID の検索には courtlistener_lookup_courts を使用します。 |
| cursor | string | いいえ | 前のレスポンスの next_cursor フィールドから取得したページネーションカーソルです。最初のページでは省略します。 |
| status | enum | いいえ | 意見の公開ステータス。"Published":先例としての効力があります。"Unpublished":ほとんどの管轄区域で先例として引用できません。"Errata":訂正。"Separate":メインクラスター外で提出された個別意見。"In-chambers":単独の判事による命令。"Relating-to":関連事件または付随事件の命令。省略すると、すべてのステータスを検索します。Published | Unpublished | Errata | Separate | In-chambers | Relating-to | Unknown |
| order_by | enum | いいえ | 結果の並び順。"score desc"(デフォルト)は関連度順です。"citeCount desc" は引用数の多い意見を先に表示します。score desc | dateFiled desc | dateFiled asc | citeCount desc |
| page_size | integer | いいえ | 要求する結果数(デフォルトは20)。渡された値にかかわらず、CourtListener 検索は1ページあたり最低20件を返します。検索1回につき、レート制限のリクエスト数を1件消費します。 |
| filed_after | string | いいえ | 最も早い提出日(ISO 8601、例:"2020-01-01")。この日付以降に提出された意見に検索対象を絞り込みます。 |
| filed_before | string | いいえ | 最も遅い提出日(ISO 8601)。この日付以前に提出された意見に検索対象を絞り込みます。 |
詳細
@cyanheads/courtlistener-mcp-server
MCP 経由で CourtListener の 900 万件以上の判例コーパスから、米国の裁判所の判決、連邦裁判所のドケット、裁判官の記録、引用ネットワーク、口頭弁論を検索・取得できます。STDIO または Streamable HTTP に対応しています。
公開ホスト型サーバー: https://courtlistener.caseyjhand.com/mcp
概要
CourtListener の 900 万件以上の判例コーパスと、PACER の RECAP ミラーから、米国の判例法および連邦裁判所の記録を利用できます。判決やドケットを検索し、引用ネットワークをたどり、引用を特定し、裁判官や裁判所を調べ、口頭弁論の記録や裁判官の財務開示を読むことができます。
ツール
| ツール | 説明 |
|---|---|
courtlistener_search_opinions | 900万件以上の裁判所意見を対象に、フィールド構文、裁判所、日付、ステータスのフィルターを使って全文検索します |
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_parties | RECAP の事件記録に登録された当事者と弁護士を取得します |
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_localURL を含む最大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 のメンバーシップに加入すると上限が引き上げられます。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/courtlistener-mcp-server.git
- ディレクトリに移動します:
cd courtlistener-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します:
cp .env.example .env
# edit .env and set COURTLISTENER_API_TOKEN
設定
| 変数 | 説明 | デフォルト |
|---|---|---|
COURTLISTENER_API_TOKEN | 必須。 CourtListener アカウント設定にある API トークンです。 | — |
COURTLISTENER_BASE_URL | API ベース URL の上書き値です。 | https://www.courtlistener.com/api/rest/v4 |
COURTLISTENER_RATE_LIMIT_PER_MINUTE | 1 分間のローリング期間内にサーバーが開始するリクエスト数です。上限を超えたリクエストはキューに入り、約 45 秒以内に開始できない場合は、リセット時刻を示すエラーで失敗します。トークンのより高いティアに合わせて値を引き上げてください。 | 5 |
COURTLISTENER_RATE_LIMIT_PER_HOUR | 1 時間のローリング期間内にサーバーが開始するリクエスト数です。 | 50 |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http です。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポートです。 | 3010 |
MCP_SESSION_MODE | HTTP セッションモード: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_ENABLED | OpenTelemetry を有効にします。 | 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.ts | createApp() のエントリーポイントです。ツール、リソース、プロンプトを登録し、サービスを初期化します。 |
src/config | サーバー固有の環境変数を Zod で解析・検証します。 |
src/mcp-server/tools | ツール定義(*.tool.ts)です。判例、引用、ドケット、当事者、裁判官、裁判所、口頭弁論、財務開示に関する 14 個のツールがあります。 |
src/mcp-server/resources | リソース定義(*.resource.ts)です。裁判所の参照リソースがあります。 |
src/mcp-server/prompts | プロンプト定義(*.prompt.ts)です。法律調査プロンプトがあります。 |
src/services/courtlistener | CourtListener 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 を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。