eur-lex-mcp-server について
eur-lex-mcp-serverは、法律・政策調査向けにEUR-LexのEU法令、CJEU判例、条約を提供します。引用の解決、文書間の関係の追跡、EuroVoc概念の参照も行えます。
主な機能
- 01法令、条約、立法準備文書の検索
- 02文書のメタデータと全文の取得
- 03CELEX、ELI、ECLI、OJ引用の解決
- 04CJEUと一般裁判所の事件検索
- 05CELLAR文書間の関係の追跡
- 06EuroVoc概念の参照
活用シーン
- 01日付、種類、主題でEU法令を検索
- 02引用文書から条文や判決を取得
- 03改正、廃止、法的引用のつながりを追跡
- 04裁判所や事件番号でEU判例を調査
MCP 対応
MCPクライアントに7つのツール、2つのリソース、比較分析用プロンプトを提供します。stdioとStreamable HTTPに対応し、Skills拡張を通じてスキルも提供します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://eur-lex.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-eur-lex https://eur-lex.caseyjhand.com/mcp{"mcpServers":{"cyanheads-eur-lex":{"type":"http","url":"https://eur-lex.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-eur-lex":{"type":"http","url":"https://eur-lex.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-eur-lex":{"type":"http","url":"https://eur-lex.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-eur-lex":{"serverUrl":"https://eur-lex.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
7| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| identifier | string | はい | 解決する EU 法令引用:CELEX 番号(例:32016R0679)、文書レベルの ELI URI(例:http://data.europa.eu/eli/reg/2016/679。/oj サフィックスの有無は問いません)、ECLI(例:ECLI:EU:C:2014:317)、または法令の種類と年を示す OJ 引用。identifier_type "auto" では、次の引用が示す CELEX に解決されます:Regulation (EU) 2016/679、Regulation (EC) No 1049/2001、Directive 95/46/EC、Decision No 1313/2013/EU、Council Framework Decision 2002/584/JHA、Council Joint Action 2008/124/CFSP、Common Position 2003/444/CFSP。数字の前に "No" がある場合は番号/年、ない場合は年/番号です。2 桁の年は 19YY とみなします。法令の種類(95/46/EC)または年(Regulation No 17)がない引用は解析されません。CELEX は小文字でも認識され、CELEX: プレフィックスの後、uri=CELEX:… を含む EUR-Lex ページ URL(例:https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32016R0679)、または publications.europa.eu/resource/celex/ URI からも読み取られます。ELI は https、eur-lex.europa.eu ホスト上、スキームなし、末尾スラッシュ付き、または /oj の後に言語セグメント(…/oj/eng)や日付が続く形式にも対応します。事件番号(C-131/12)は単一の文書ではなく複数のレコードを示すため、found false と eurlex_get_cases への参照を返します。 |
| identifier_type | enum | いいえ | 識別子の形式です。"auto" は CELEX、ELI URI、ECLI(大文字・小文字を問わず ECLI: プレフィックスで判定)、または OJ 引用を検出します。"celex"、"eli"、"ecli" はそれぞれの検索を強制します。OJ 引用は "auto" の場合にのみ認識されます。celex | eli | ecli | auto |
詳細
@cyanheads/eur-lex-mcp-server
EU 法令、CJEU の判例法、条約を検索し、CELLAR の関係グラフをたどり、MCP 経由で EuroVoc の概念を解決します。STDIO または Streamable HTTP に対応しています。
公開ホスト型サーバー: https://eur-lex.caseyjhand.com/mcp
概要
EUR-Lex の EU 法令、CJEU の判例法、条約を扱います。文書や判例法の検索、全文の取得、引用の解決、法令間の改正・引用関係の追跡、EuroVoc 件名シソーラスの閲覧ができます。
ツール
| ツール | 説明 |
|---|---|
eurlex_search_documents | 種類、日付、EuroVoc の件名、作成機関、施行状況で EU 法令、条約、準備行為を検索します |
eurlex_get_document | CELEX、ELI、または work URI を指定して、法令または判例のメタデータ(ELI、官報参照、発効日を含む)と全文(HTML、Markdown、または Formex4 XML)を取得します。いずれの場合も、セクションの概要を確認できます |
eurlex_lookup_celex | CELEX 番号、ELI URI、ECLI、官報引用(Regulation (EU) 2016/679)、または官報参照(OJ L 119, 4.5.2016, p. 1)を正規の CELLAR work に解決します |
eurlex_get_cases | 事件番号、裁判所、事件の種類、日付範囲で CJEU および一般裁判所の判例法を検索します |
eurlex_get_relations | CELLAR の関係グラフをたどります。改正、廃止、統合、法的根拠とその下で採択された work、法令が採択する提案、解釈判決(条文別)、引用、国内法化を確認できます |
eurlex_browse_subjects | EuroVoc シソーラスを検索し、用語を概念 URI に解決します |
eurlex_query_sparql | CELLAR エンドポイントに対して、読み取り専用の生の SPARQL SELECT を実行します |
リソース
| リソース | 説明 |
|---|---|
eurlex://document/{celexNumber} | CELLAR の文書のメタデータスナップショット |
eurlex://document/{celexNumber}/relations | CELLAR の文書の1ホップの関係性の概要 |
リソースのデータはすべて、ツールからも取得できます。
プロンプト
| プロンプト | 説明 |
|---|---|
eurlex_comparative_analysis | 政策分野に関するEUと米国の法的分析の枠組みを作成します |
スキル
| スキル | 説明 |
|---|---|
eur-lex-guide | ツールを呼び出すエージェント向け:各種CELEX、ELI、ECLI、事件番号の形式の由来、ある法律が施行中、廃止済み、未解釈、または確定済みと結論付ける前に行うべき確認、および eurlex_query_sparql 用のCELLAR SPARQLとCDMのリファレンス |
スキルは skills/ にあります。プラグインのインストール、.mcpb バンドル、npm パッケージ、Docker イメージに含まれており、サーバーはSkills拡張機能(skills/list、skill:// リソース)を通じてMCPクライアントに提供します。
機能リファレンス
eurlex_search_documents ツール
- 次のフィルターから少なくとも1つを指定します:
keyword(英語のタイトル、CELEX番号または2016R0679などの一部。R(01)のように数字を含まない文字列を指定すると、すべてのCELEXを検索するため数十秒かかる場合があります。本文は検索しません)、document_type(REG、DIR、DEC、TREATY、JUDG、OPIN_AG、PROP、REC)、date_from/date_to、eurovoc_concept(eurlex_browse_subjectsから取得)、author_institution、またはin_force(true/false。falseは廃止済み、失効済み、未施行の法律を対象とします) offset/limitで最大100件ずつページングします(limitが100を超える場合は100件で処理され、limit_clampに報告されます)。新しい順に並び、各行にはis_consolidatedとis_corrigendumのフラグが付きます。正誤表と統合版の文書は、それぞれinclude_corrigendaとinclude_consolidatedを指定した場合にのみ表示されます。ページングは10,000行で終了します。最終ページにはnext_offsetがなく、その先に続くdate_from/date_toの期間を示すnoticeが含まれます- 該当なしの場合は、フィルターを広げる方法を示す
noticeを含む空のページが返されます。型付きエラー:no_filters、invalid_date_range、invalid_author_institution、invalid_keyword(文字または数字を含まない)、offset_past_window(offsetが10,000以上) author_institutionは、eurlex_get_documentが返す英語の当局名ラベルや国内裁判所名(European Parliament、Supremo Tribunal de Justiçaなど)に一致します。日付範囲を指定してもしなくても検索できます
eurlex_get_document ツール
celex_number、eli_uri、work_uriのいずれか1つだけを指定します(CELEX:プレフィックスやEUR-Lex URLなど、貼り付けた形式も受け付けます)。本文は、24のEUR-Lex言語のいずれかでhtml(デフォルト)、markdown、またはxml(Formex4)として取得でき、該当言語がない場合は英語にフォールバックします。判例にはecli、formation、referring_court、subject_matter、case_referenceも含まれます。統合版のテキストでは、基本法令がbase_act_celexとして示されますcontent_modeは"paged"(デフォルト)、"full"、または"metadata_only"です。呼び出しあたりの上限は100,000文字で、より大きなlimitを指定した場合はlimit_clampに示されます。content_chars_total/has_moreを使ってページを続けられます。outline: trueはオフセット付きの見出しを一覧表示し、select(例:{ articles: "1,5,17" })を指定すると該当するセクションのみを返します。判決と法務官意見では、アウトラインにセクション見出しが一覧表示され、select: { operative_part: true }を指定すると主文のみが返されますis_supersededは、より新しい統合版があることを示します(current_consolidated_celex、consolidated_as_of)。resolve: "current_consolidated"を指定すると、その統合版が返されます。in_force: falseの場合、CELLARに記録があればrepealed_by、end_of_validity、またはentry_into_forceが含まれます。型付きエラー:invalid_identifier_args、not_found、content_challenge(テキストの代わりにWAFのボットチャレンジが返された場合)- 引用情報。CELLARに記録がない項目は含まれません。
eli(統合版のテキストには、その時点の固有のELIが保持されます)。oj_referenceは官報の参照情報です(OJ L 119, 4.5.2016, p. 1–88。1968年より前はシリーズ記号なし、OJ L 42Iのようにクラス記号付きの場合あり、法令ごとに公表される場合はOJ L, 2024/1689, 12.7.2024)。ページ番号は英語版から取得され、1973年より前は原語版から取得されます。再版された法令については、最も早い号が示されます。dates_of_effectは、記録されているすべての日付を{ date, type? }として示し、typeはentry_into_force、application、partial_application、provisional_application、takes_effect、takes_partial_effectのいずれかです。未施行の法令で施行日が将来の場合も、entry_into_forceはその意味を保ちます。統合版のテキストでは、基本法令のoj_reference、dates_of_effect、transposition_deadlinesが示されます。transposition_deadlinesは指令に適用されます - 利用可能な従来形式のHTML/Markdown本文には、
content_omissions: { tables }が含まれることがあります。これは、返された範囲外も含むソース全体を対象に、欠落した表のマーカーを数えたものです。ページを続けても、これらの表は取得できません。alternative_representationsは、探索に成功した場合、提供された文書と言語について告知されているPDFストリームを一覧表示します。XMLの利用可否はこれとは独立しています。メタデータのみを取得する呼び出しでは、ソースの欠落箇所は確認されません - 国内実施措置には、引用情報の項目が限られた
national_measureが含まれます。項目はjournal、number、pages、publication_date、notification_dateで、メタデータのみを取得する呼び出しでも含まれます。番号とページはソースの表記を維持します。公表日、通知日、文書の日付はそれぞれ異なります。本文が利用できない場合は、官報の引用情報を使って取得してください。国内ポータルのURLは推定されず、通知があっても完全な国内法化を証明するものではありません
eurlex_lookup_celex ツール
- CELEX 番号、ELI URI、ECLI、または法令の種類と年を示す官報引用(
Regulation (EU) 2016/679、Directive 95/46/EC、任意で括弧内の官報参照を続けたもの(Directive 95/46/EC (OJ L 281, 23.11.1995, p. 31))を指定します。貼り付けられた形式(CELEX:プレフィックス、EUR-Lex ページ URL、スキームや言語セグメントの有無を問わない ELI)は正規化され、celex_numberに返されます。法令の種類を含まない引用(95/46/EC)や年を含まない引用(Regulation No 17)は解析されません - 官報参照から、引用されたページで始まる法令を特定します。号、発行日、最初のページ(
OJ L 281, 23.11.1995, p. 31、of 23.11.1995、ページ範囲、OJ L 42IやOJ Cのようなクラス記号、および1968年より前のシリーズ記号のない形式OJ 13, 21.2.1962, p. 204/62)に対応します。また、年を先に記す形式のOJ 1995 L 281, p. 31とOJ 1995 L 281/31、法令ごとの形式のOJ L, 2024/1689, 12.7.2024とOJ C, C/2024/2664, 29.4.2024にも対応します。指定された日付は号の発行日と一致する必要があります。ページは英語版で照合されます。ただし、号に英語のページがない場合、1973年より前は任意の言語で照合されます。年または最初のページを含まない参照(OJ L 281、OJ L 119/1)は解析されません。autoの場合のみ認識されます identifier_typeは形式を自動検出するか、形式を指定します。自動検出で入力を分類できない場合(年または最初のページを含まない官報参照など)はambiguous_identifierが発生します。事件番号(C-131/12)を指定すると、found: falseと、eurlex_get_casesを案内するnoticeが返されます- 法令 URI、確認済みの CELEX 番号、リソースの種類、日付、および事件の ECLI を返します。適切な形式の識別子に一致する法令がない場合、官報参照の日付またはページに一致するものがない場合、および最初のページで複数の法令が始まる場合は、
found: falseとnoticeが返されます(noticeには各 CELEX が示されます)
eurlex_get_cases ツール
- フィルター:
case_number(C-131/12、T-22/20、F-12/05、または1989年より前の26/62。その番号で登録されたすべての判決、命令、法務官意見を取得します)、court(CJEUまたはGC)、case_type(judgment、order、ag_opinion)、keyword(英語のタイトル、CELEX 番号、または2013CJ0131のような一部の文字列)、およびdate_from/date_to。include_derivativeを指定して通知、抄録、要約、正誤表を追加しない限り、一次記録のみを対象とします offset/limitを使って最大100件ずつページを取得します(limitが100を超える場合は100件で返され、limit_clampにその旨が示されます)。新しい順に並びます。各事件には、記録されている場合は ECLI が含まれ、さらにformation、advocate_general、display_title、parties、referring_court、subject_matter、case_referenceが含まれます。これらのフィールドでタイトルの一部が欠ける場合に限り、元のtitleも含まれます。ページ取得は10,000行で終了します。最終ページにはnext_offsetは含まれず、その先まで続くdate_from/date_toの期間を示すnoticeが含まれます- 該当なしの場合は、フィルターを広げる方法を示す
noticeとともに空のページが返されます。型指定エラー:invalid_case_number、invalid_date_range、invalid_keyword(文字または数字が含まれていない)、offset_past_window(offsetが10,000以上) case_type: "ag_opinion"には法務官意見(OPIN_AG)と見解(VIEW_AG)が含まれます。resource_typeによってAG OpinionとAG Viewが区別されます
eurlex_get_relations ツール
celex_numberまたはwork_uriのいずれか一方のみを指定します。relation_typesでcites、amends、amended_by、repeals、repealed_by、implicitly_repeals、implicitly_repealed_by、legal_basis、basis_for、interprets、interpreted_by、consolidated_version、national_transposition、adopts、adopted_byのいずれかに絞り込めます(省略すると全15種類が対象です)basis_forは、その法令を法的根拠として挙げる文書を一覧表示します。interpreted_byは、その法令を解釈するCJEUおよび一般裁判所の判決を、interpretsは判決が解釈する対象を一覧表示します。adoptsは、法令が採択する文書(通常は欧州委員会の提案)を、adopted_byは文書を採択した法令を一覧表示します。member_statesを指定すると、national_transpositionを指定した加盟国(ISO 3166-1 alpha-3または2文字コード。alpha-3として返されます)に絞り込めます。national_transpositionなしで使用すると、member_states_not_applicableエラーになりますarticleを指定すると、法令の1つの記事に記録された規定がある判決にinterpreted_byを絞り込みます(17、6a、Article 17、Art. 17など、大文字・小文字は問いません。空欄は省略され、段落、範囲、ローマ数字は拒否されます)。階層の深さを問わず照合し、先頭のゼロは無視します。また、文字を指定すると対応するラテン語の序数にも一致します(28cはArticle 28 quaterにも一致します)。CELLARに規定が記録されていない判決は除外され、その旨はnoticeに記載されます。返されるarticleは正規化された形式です。interpreted_byなしで使用すると、article_not_applicableエラーになります- 改正、廃止、解釈、採択の各行には、CELLARが関係の対象として記録した規定を
provisionsとして含みます。規定はコンパクトコード(A17P1LCはArticle 17(1)(c))または権限トークンコード(AR 43 PA 4)で表されます。規定のない行は、規定が記録されていないことを示すものであり、関係が法令全体に及ぶことを意味するものではありません。深さ1でも予算内に収まらないページでは、規定を全件まとめて、サイズの大きい順に省略し、各行の省略件数をprovisions_withheldとして報告します。規定の取得に失敗した場合、CELLARは規定を除いた行を返し、その内容はnoticeに記載されます - 関係の種類と方向ごとに
offset/limitを使用してページ分割される1ホップの関係です(最大100、デフォルト100。より大きなlimitはlimit_clampで報告されます)。新しいものから順に並びます。種類と方向ごとのページは行数10,000件までで、それ以降の古い文書については、実行可能なクエリとともにnoticeでeurlex_query_sparqlに案内します - 各レスポンスの全体は、JSONとエンリッチメントを含め、UTF-8で64,000バイトを上限として個別に予算管理されます。ページが上限を超える場合、収まる範囲で種類と方向ごとに共通の最大深度まで保持し、行とタイトルは全体を含めます。
noticeには要求された上限、適用された上限、省略された行数が記載されます。next_offset(現在のoffsetに適用された深度を加えた値)から続けてください。深度1のページは上限を超えていても全件返され、その旨が明示されます。上限内に収まるページは変更されません。relation_typesを省略することは、全15種類を列挙することと同じです - 各関係には
relation_type、direction(outgoing/incoming)、related_work_uriが含まれます。判明している場合は、related_celex_number、related_date、related_title(英語のみ)、およびnational_transpositionの行にはrelated_member_stateも含まれます。empty_relation_typesにより、「この種類の関係がない」場合と「ページ分割で除外された」場合を区別できます。型付きエラー:invalid_identifier_args、member_states_not_applicable、article_not_applicable、not_found、offset_past_window
eurlex_browse_subjects ツール
- 優先ラベルと代替ラベルの両方を照合するため、一般的な同義語からも該当する概念を解決できます。EUの公用語のいずれかを
languageで指定します(デフォルトは英語)。offset/limitによるページ分割に対応します(最大50。より大きなlimitは50で処理され、limit_clampに報告されます)。行数は10,000件までです(それを超えるoffsetではoffset_past_window) - 概念URI、優先ラベル、コード、上位(親)ラベル、および一致した場合は一致した代替ラベルを返します。一致がない場合は、
notice付きの空のページを返します - 完全一致のラベルが最初に表示され、次にラベルまたは単語の先頭での一致、その後にその他の部分一致が表示されるため、
"AI"では人工知能が先頭になります
eurlex_query_sparql ツール
- 読み取り専用の SELECT のみ対応しています(更新形式および ASK/CONSTRUCT/DESCRIBE は拒否されます)。
cdm:、skos:、xsd:のプレフィックスは自動的に挿入されます。timeout_hintは任意で指定できます(1000~55000 ms)。 - 結果は
MAX_SPARQL_RESULTS(デフォルトは 100)で上限が設定されています。結果が切り詰められた場合、noticeにはORDER BYを追加し、OFFSETを大きくして繰り返すよう記載されます(最大 10,000 行)。型指定されていない文字列リテラルで結果が 0 件の場合、型を指定(^^xsd:string、ELI には^^xsd:anyURI)するか、言語タグを付けるようnoticeに記載されます。 - 型付きエラー:
not_read_only(SPARQL Update)、unsupported_query_form(ASK、CONSTRUCT、DESCRIBE、または SELECT がない場合)、sparql_error、sparql_timeout
eurlex://document/{celexNumber} リソース
application/json形式のメタデータスナップショット — 文書種別、著者機関(eurlex_get_documentによるラベル)、法務官、日付、英語のタイトル、現行法かどうかを示すフラグ、eli、oj_reference、dates_of_effect、transposition_deadlines、法的根拠、EuroVoc の主題(引用に関する 4 つのフィールドはeurlex_get_documentと同じ)。統合版のテキストは独自のeliを保持し、base_act_celexを追加します。著者、現行法かどうかを示すフラグ、oj_reference、dates_of_effect、transposition_deadlines、法的根拠、主題は、その基礎となる法令から取得されます。celexNumberはeurlex_search_documents、eurlex_get_cases、またはeurlex_lookup_celexから取得します。
eurlex://document/{celexNumber}/relations リソース
eurlex_get_relationsの 15 種類すべての関係を対象とした、1 階層分の関係概要です。provisionsは含まれません。関連する各文書には、存在する場合、related_dateと英語のrelated_titleが含まれます。関係の種類および方向ごとに最大 25 件(新しいものを優先)です。- 関係がさらに存在する場合は、
truncatedとeurlex_get_relationsへの継続ポインターが含まれます。
eurlex_comparative_analysis プロンプト
- 引数:
domainは必須です。focusは任意で、該当する分析軸に組み込まれるか、独立したセクションとして追加されます。 - EU 法の用語(「antitrust」→「competition law」など)で分野を言い換えた調査計画を返します。EU 側では
eurlex_browse_subjects→eurlex_search_documents→eurlex_get_document→eurlex_get_relationsの順に呼び出し、米国側ではcourtlistener_search_opinionsを呼び出します。さらに、6 つの分析軸からなるフレームワークを提示します。
特長
@cyanheads/mcp-ts-core を基盤としており、stdio および Streamable HTTP トランスポート、プラグイン可能な認証(none/jwt/oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングに対応した構造化ログを備えています。
EUR-Lex 固有の機能:
- API キーは不要です。CELLAR SPARQL と EUR-Lex REST コンテンツエンドポイントはいずれも一般公開されています
- SPARQL は CDM プレフィックス宣言を組み込んで POST されます。サーバー側で LIMIT(最大 100)を適用し、Virtuoso のタイムアウトを防ぎます
- 法令本文は CELLAR のコンテンツネゴシエーションで取得します。HTML は提供された状態のまま返され、複数パートの Formex4 XML は 1 つのドキュメントにまとめられ、Markdown はサーバー側で変換されます
- 構文、コンパイル、ソートウィンドウのエラーは即座に
sparql_errorとして失敗します(ソートウィンドウエラーSR353は、OFFSETを下げるかクエリの範囲を絞るよう示唆します)。タイムアウトはsparql_timeoutとして失敗し、どちらも再試行されません。ゲートウェイページなどの一時的な障害は、呼び出し全体で共有されるクエリ予算(SPARQL_QUERY_TIMEOUT_MS)の範囲内で再試行されます。予算によって打ち切られた再試行ラダーでは、最後の試行自体のエラーが報告されます - 要求された翻訳が利用できない場合は英語に自動フォールバックし、要求された言語と実際に使用された言語を報告します
エージェントに使いやすい出力:
- サーバーレベルの指示に EuroVoc の前提条件に関する案内が含まれています。エージェントは概念で絞り込んだ検索の前に
eurlex_browse_subjectsを実行するよう指示されます eurlex_lookup_celexは CELEX/ELI/ECLI の存在を事前に確認し、後続の文書取得や関連情報取得でのエラーを防ぎますcontent_status、content_unavailability_reason、要求された言語と実際に使用された言語のフィールドにより、文字列の解析をせずに、スキップ済み、取得可能、存在しない、上流で失敗、不完全なコンテンツを区別できます- すべてのツールのエラーコントラクトに型付きの
reasonコードがあり、エージェントは結果に応じてプログラムから分岐できます
はじめに
インストールせずに、ホスト型インスタンスに接続します。
claude mcp add --transport http eur-lex-mcp-server https://eur-lex.caseyjhand.com/mcp
または、ローカルで実行します。
claude mcp add eur-lex-mcp-server -- npx -y @cyanheads/eur-lex-mcp-server
ほかのクライアントでは、MCP 設定ファイルに次を追加します。
{
"mcpServers": {
"eur-lex-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/eur-lex-mcp-server"]
}
}
}
API キーは不要です。Docker またはソースからのビルドについては、サーバーの実行を参照してください。
設定
すべての設定は、src/config/server-config.ts の Zod スキーマによって起動時に検証されます。
| 変数 | 説明 | デフォルト |
|---|---|---|
CELLAR_SPARQL_ENDPOINT | CELLAR SPARQL エンドポイント URL の上書き(例:ローカルの Virtuoso ミラーを使用する場合)。 | http://publications.europa.eu/webapi/rdf/sparql |
EURLEX_CONTENT_BASE_URL | EU Publications Office CELLAR コンテンツリゾルバーのベース URL の上書き。 | http://publications.europa.eu |
SPARQL_QUERY_TIMEOUT_MS | ミリ秒単位のクライアント側タイムアウト。1 から 2147483647 までの整数です。1 回の呼び出しで共有される CELLAR クエリの予算(クエリを連鎖させる呼び出しでは、クエリごとではなく 1 回だけ消費されます)であり、個々のクエリに対する上限でもあります。EUR-Lex コンテンツの取得には、この長さのタイムアウトが別途適用され、共有予算の対象外です。 | 55000 |
MAX_SPARQL_RESULTS | 生成されるすべての SPARQL クエリの LIMIT に適用される上限。 | 100 |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポート。 | 3010 |
MCP_AUTH_MODE | 認証モード:none、jwt、oauth のいずれか。 | none |
MCP_SESSION_MODE | セッション処理:stateful、stateless、auto のいずれか(auto は stateful に解決されます)。 | stateless |
MCP_LOG_LEVEL | ログレベル(RFC 5424)。 | info |
LOGS_DIR | ログファイルのディレクトリ(Node.js のみ)。 | <project-root>/logs |
LOG_TOOL_FAILURE_PAYLOADS | 失敗したツール呼び出しの引数と結果を、キー名で機密情報を伏せて記録します(自由形式の値は対象外です)。LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES(デフォルト 16384)までに制限されます。 | false |
OTEL_ENABLED | OpenTelemetry インストルメンテーションを有効にします。 | false |
オプションの上書き設定の一覧は .env.example を参照してください。
サーバーの実行
ローカル開発
Bun v1.4.0 以上(または Node.js v24+)が必要です。
-
クローンしてインストールする:
git clone https://github.com/cyanheads/eur-lex-mcp-server.git cd eur-lex-mcp-server && bun install cp .env.example .env # optional: every variable has a default -
ビルドして実行する:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http # listens at http://localhost:3010/mcp -
チェックとテストを実行する:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker run --rm -p 3010:3010 ghcr.io/cyanheads/eur-lex-mcp-server:latest
イメージのデフォルト設定は、HTTP トランスポート、ステートレスセッションモードで、ログは /var/log/eur-lex-mcp-server に記録されます。MCP クライアントから stdio 経由で実行するには、"command": "docker" と "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/eur-lex-mcp-server:latest"] を使用します。ローカルでビルドするには、docker build -t eur-lex-mcp-server . を実行してから docker run --rm -p 3010:3010 eur-lex-mcp-server を実行します。OpenTelemetry のピア依存関係はデフォルトでインストールされます。省略するには、--build-arg OTEL_ENABLED=false を指定してビルドします。
プロジェクト構成
| ディレクトリ | 用途 |
|---|---|
src/index.ts | createApp() のエントリーポイントです。ツール、リソース、プロンプト、公開済みスキルを登録し、サービスを初期化します。 |
src/config | サーバー固有の環境変数の解析と、Zod による検証を行います。 |
src/services/cellar-sparql | CELLAR SPARQL サービスです。POST クライアント、バインディングマッパー、LIMIT の適用、CDM PREFIX 宣言を含みます。 |
src/services/eurlex-content | CELLAR コンテンツサービスです。英語へのフォールバックに対応した、/resource/celex/{CELEX} 用のコンテンツネゴシエーション GET クライアント(Accept / Accept-Language)と、ページ分割で法令を取得する際に一度だけ取得するための、配信済み本文のプロセス内キャッシュを含みます。 |
src/mcp-server/tools | ツール定義(*.tool.ts)です。文書検索、取得、解決、判例法、関係、EuroVoc、未加工の SPARQL にまたがる 7 つのツールがあります。 |
src/mcp-server/resources | リソース定義(*.resource.ts)です。メタデータリソースと関係リソースがあります。 |
src/mcp-server/prompts | プロンプト定義(*.prompt.ts)です。比較分析プロンプトがあります。 |
skills/ | ツールを呼び出すエージェントに公開されるエージェントスキル(eur-lex-guide)です。 |
tests/ | src/ の構成に対応する単体テストと統合テストです。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックに
try/catchは使用しません - リクエスト単位のログ記録には
ctx.logを、テナント単位のストレージにはctx.stateを使用します src/mcp-server/*/definitions/index.tsのバレル経由で新しいツールとリソースを登録します- 外部 API 呼び出しはラップします。生データを検証し、ドメイン型に正規化してから、出力スキーマを返します。不足しているフィールドを捏造してはいけません
コントリビューション
Issue を歓迎します。提出する前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。