MCP 서버

eur-lex-mcp-server

io.github.cyanheads/eur-lex-mcp-server

이 MCP로 할 수 있는 일

Searches and retrieves EU legislation, treaties, and CJEU case law, and traverses legal relationships and EuroVoc subject concepts.

eurlex_browse_subjects
Browse EuroVoc Subjects
Search the EuroVoc thesaurus, resolving a keyword into concept URIs usable in the eurovoc_concept subject filter of eurlex_search_documents. Matches both preferred and alternative (non-preferred) labels, so a common synonym reaches the concept it stands for. Returns each concept URI, its preferred label in the requested language, code, broader (parent) label, and the alternative label that matched when one did. Concepts with an exact label match come first, then those whose label or one of its words starts with the keyword, then other substring matches, each group ordered by preferred label.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['keyword'], 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 50, 'minimum': 1, 'description': 'Maximum number of EuroVoc concepts to return (1â\x80\x9350). Defaults to 20.'}, 'offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Pagination offset â\x80\x94 number of concepts to skip. Defaults to 0.'}, 'keyword': {'type': 'string', 'minLength': 1, 'description': 'Search term matched against EuroVoc preferred and alternative concept labels (e.g. "privacy", "agriculture", "product liability").'}, 'language': {'type': 'string', 'default': 'en', 'pattern': '^[A-Za-z]{2,3}$', 'description': 'Language code for concept labels (e.g. "en", "fr", "de"). Case-insensitive â\x80\x94 "EN" and "en" behave identically. Defaults to English.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['concepts', 'total', 'offset', 'has_more']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The limit that was applied to this response.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'description': 'Machine-readable failure mode.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Number of concepts returned in this response.'}, 'total': {'type': 'number', 'description': 'Number of concepts returned in this response.'}, 'notice': {'type': 'string', 'description': 'Guidance for the next call: on an empty first page, the keyword and language that matched nothing and how to broaden them; on a page with more rows, the offset to continue from.'}, 'offset': {'type': 'number', 'description': 'Pagination offset used for this response.'}, 'concepts': {'type': 'array', 'items': {'type': 'object', 'required': ['concept_uri', 'pref_label'], 'properties': {'pref_label': {'type': 'string', 'description': 'Preferred label for the concept in the requested language.'}, 'concept_uri': {'type': 'string', 'description': 'Full URI for the EuroVoc concept, usable in the eurovoc_concept filter.'}, 'concept_code': {'type': 'string', 'description': 'Numeric EuroVoc concept code.'}, 'broader_label': {'type': 'string', 'description': 'Preferred label of the broader (parent) concept, if available.'}, 'matched_label': {'type': 'string', 'description': 'Alternative (non-preferred) EuroVoc label that matched the keyword, when one did â\x80\x94 the closest match (exact, then word start, then substring), alphabetical among equals. Absent when the keyword matched the preferred label alone.'}}, 'description': 'A single EuroVoc concept with its URI, label, code, and hierarchy context.', 'additionalProperties': False}, 'description': 'Matching EuroVoc concepts, exact label matches first, then word-start matches, then other substring matches, each group ordered by preferred label.'}, 'has_more': {'type': 'boolean', 'description': 'True only when CELLAR returned an additional valid row beyond this page.'}, 'truncated': {'type': 'boolean', 'description': 'True when an additional CELLAR row proves more concepts exist beyond this page.'}, 'next_offset': {'type': 'number', 'description': 'Offset for the next page. Present only when has_more is true.'}}, 'additionalProperties': False}
eurlex_get_cases
Search CJEU/GC Case Law
Search CJEU and General Court case law — judgments, orders, and Advocate General opinions — by case number, court, case type, keyword, and date range. A case number reaches every judgment, order, and AG opinion filed under it. By default only these primary records are returned; derivative judicial information notices, case abstracts, summaries, and corrigenda are excluded so distinct cases fill the page (set include_derivative to include them). Keyword matches English case titles (which carry party names) and CELEX strings; there is no full-text body search. Returns each case with its CELEX number (whose sixth character names the court: C, T, or F), work URI, ECLI, date, and type, plus — parsed from the title where present — the formation, Advocate General, parties, referring court, subject matter, and case reference. The raw CELLAR title is returned only when those fields do not capture all of it.
읽기 전용 외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'court': {'anyOf': [{'type': 'string', 'const': ''}, {'enum': ['CJEU', 'GC'], 'type': 'string', 'description': 'CJEU (C) = Court of Justice of the EU, GC (T) = General Court.'}], 'description': 'Court filter, by the court letter at position 6 of the CELEX: CJEU (C) = Court of Justice of the EU, GC (T) = General Court. It does not narrow by record type: every primary record the court filed matches, and its derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Omit to search every court.'}, 'limit': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Maximum number of results to return (1â\x80\x93100). Defaults to 20.'}, 'offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Pagination offset â\x80\x94 number of results to skip. Defaults to 0.'}, 'date_to': {'anyOf': [{'type': 'string', 'const': ''}, {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'End date in ISO 8601 format (YYYY-MM-DD).'}], 'description': 'End of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no upper bound.'}, 'keyword': {'type': 'string', 'description': 'Keyword matched against English case titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 62023CO0097) matches that record, its numbered siblings (â\x80¦(01) to â\x80¦(20)), its _INF, _RES, _SUM, and _EXT records, and its corrigenda, with notices, abstracts, summaries, and corrigenda still joining only under include_derivative; for every record filed under a case, use case_number. A partial CELEX that opens with the sector and year (62013CJ), the year and type letters (2013CJ0131), or type letters followed by the number (CJ0131, J0131) matches every CELEX that holds it at that position; one opening with letters not followed by a digit (R(01)) tests every CELEX and can take tens of seconds; a bare year (2013) or a fragment opening mid-year or mid-number (013CJ0131, 0131) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected.'}, 'case_type': {'anyOf': [{'type': 'string', 'const': ''}, {'enum': ['judgment', 'order', 'ag_opinion'], 'type': 'string', 'description': 'judgment, order (procedural decision), or ag_opinion (Advocate General opinion).'}], 'description': 'Case type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). Omit to search all.'}, 'date_from': {'anyOf': [{'type': 'string', 'const': ''}, {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Start date in ISO 8601 format (YYYY-MM-DD).'}], 'description': 'Start of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no lower bound.'}, 'case_number': {'type': 'string', 'description': 'Number of a single case: C-{num}/{year} (Court of Justice), T-{num}/{year} (General Court), or F-{num}/{year} (Civil Service Tribunal), e.g. C-131/12. Also accepts the case_reference form ("Case C-97/23 P."), any procedural suffix after the year (P, R, PPU, â\x80¦), and a pre-1989 Court of Justice number with no prefix (26/62). A value naming more than one case ("C-131/12 and C-132/12") is rejected; search each separately. Matches the judgments, orders, AG opinions, and other primary records filed under that number; derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Numbered Opinions and Rulings of the Court of Justice ("Opinion 2/13", "Ruling 1/78") are not reached by a case number; look one up by its CELEX (e.g. 62013CV0002). A value made only of CELEX characters is matched as a CELEX substring instead, case-insensitively: one opening with the sector and year (62014CJ0362), the year and both letters (2013CJ0131), or both letters and the number (CJ0131) is answered from the CELEX index; any other (12CJ0131, 0131) tests every CELEX and can take tens of seconds.'}, 'include_derivative': {'type': 'boolean', 'default': False, 'description': 'Include derivative sector-6 records â\x80\x94 judicial information notices, case abstracts, case summaries, and corrigenda â\x80\x94 alongside primary judgments, orders, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type).'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['cases', 'total', 'offset', 'has_more', 'query_echo']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The limit that was applied to this page.'}, 'cases': {'type': 'array', 'items': {'type': 'object', 'required': ['work_uri', 'celex_number'], 'properties': {'date': {'type': 'string', 'description': 'Judgment/opinion date in ISO 8601 format.'}, 'ecli': {'type': 'string', 'description': 'European Case Law Identifier, the citation form of the record (e.g. "ECLI:EU:C:2014:317"); eurlex_lookup_celex resolves one back to its CELEX. Absent for judicial notices and the few records that carry none.'}, 'title': {'type': 'string', 'description': 'Raw English expression title as stored in CELLAR, a "#"-delimited string (court, formation and date; parties; referral; subject matter; case reference). Present only when the parsed fields do not capture all of it: a segment the parser could not place, a judgment or order published by extracts ("(Extracts)"), a leading date that differs from date, or a title with no "#". Absent when the parse is complete, and for records with no English title.'}, 'parties': {'type': 'string', 'description': 'Parties to the case, parsed from the title (e.g. "WhatsApp Ireland Ltd v European Data Protection Board."). Absent when the title carries no parties segment (e.g. AG opinions).'}, 'work_uri': {'type': 'string', 'description': 'CELLAR work URI.'}, 'formation': {'type': 'string', 'description': 'Formation that decided, from the title\'s leading segment, verbatim (e.g. "Grand Chamber", "Full Court", "Fourth Chamber, Extended Composition"), or "President", "Vice-President", or "President of the Second Chamber" for an order issued by that office. Absent when the title names none, as older "Judgment of the Court of â\x80¦" titles do.'}, 'celex_number': {'type': 'string', 'description': 'CELEX identifier for the case (e.g. 62024CJ0629).'}, 'display_title': {'type': 'string', 'description': 'Clean human-readable title for display â\x80\x94 the parties for a contested case (e.g. "Google Spain SL v AEPD"), or the court/AG descriptor when a case has no named parties. Parsed from the English title; absent when the record has none or its title carries no "#" segments.'}, 'resource_type': {'type': 'string', 'description': 'Human-readable case type label (e.g. "Judgment", "Order", "AG Opinion"). Cases with several resource-types (e.g. corrigenda) list all, comma-separated. Absent for some older cases.'}, 'case_reference': {'type': 'string', 'description': 'Case reference parsed from the title (e.g. "Case C-97/23 P."). Absent when the title carries no case-reference segment.'}, 'subject_matter': {'type': 'string', 'description': 'Subject-matter keyword summary parsed from the title â\x80\x94 the legal topics and provisions at issue. Absent when the title carries no subject-matter segment.'}, 'referring_court': {'type': 'string', 'description': 'National court that referred a preliminary ruling, from the title\'s referral segment (e.g. "Audiencia Nacional", or "Tariefcommissie - Netherlands" in older titles). Absent on direct actions and appeals.'}, 'advocate_general': {'type': 'string', 'description': 'Advocate General who delivered the opinion, from an AG opinion title (e.g. "Jääskinen"). Absent on judgments and orders.'}}, 'description': 'A single CJEU or General Court case law record.', 'additionalProperties': False}, 'description': 'Matching case law records ordered by date descending, then by CELEX number ascending among records sharing a date, so pages are stable across calls.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_date_range', 'invalid_case_number', 'invalid_keyword', 'sparql_error'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `invalid_case_number`: case_number is not a recognizable case number and holds characters no CELEX contains, names more than one case (e.g. "C-131/12 and C-132/12"), or is a prefix-less number dated outside 1953â\x80\x931988. `invalid_keyword`: keyword holds no letters or digits, so no case title and no CELEX can match it. `sparql_error`: Virtuoso returned HTTP 200 with an error body â\x80\x94 query malformed or timed out. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Number of cases returned in this page.'}, 'total': {'type': 'number', 'description': 'Number of cases returned in this page (not a corpus-wide count).'}, 'notice': {'type': 'string', 'description': 'Guidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from.'}, 'offset': {'type': 'number', 'description': 'Pagination offset used for this response.'}, 'has_more': {'type': 'boolean', 'description': 'True only when CELLAR returned an additional valid row beyond this page.'}, 'truncated': {'type': 'boolean', 'description': 'True when an additional CELLAR row proves more cases exist beyond this page.'}, 'query_echo': {'type': 'object', 'required': ['include_derivative'], 'properties': {'court': {'type': 'string', 'description': 'Court filter applied.'}, 'date_to': {'type': 'string', 'description': 'End date filter applied.'}, 'keyword': {'type': 'string', 'description': 'Keyword filter applied.'}, 'case_type': {'type': 'string', 'description': 'Case type filter applied.'}, 'date_from': {'type': 'string', 'description': 'Start date filter applied.'}, 'case_number': {'type': 'string', 'description': 'Case number filter applied.'}, 'celex_fragment': {'type': 'string', 'description': 'CELEX pattern matched for case_number: year, court letter, and zero-padded case number, with * standing for any document letter that court files under a case number (e.g. "2023C*0097" reaches 62023CJ0097, 62023CO0097, and 62023CC0097). Absent when case_number was matched as a raw CELEX substring.'}, 'include_derivative': {'type': 'boolean', 'description': 'Effective include_derivative value after the false default is applied â\x80\x94 whether derivative sector-6 records (notices, abstracts, summaries, corrigenda) were admitted alongside primary cases. Always present, since the default shapes which records can appear.'}}, 'description': 'Echo of filters applied to this search. Useful for diagnosing empty results.', 'additionalProperties': False}, 'next_offset': {'type': 'number', 'description': 'Offset for the next page. Present only when has_more is true.'}}, 'additionalProperties': False}
eurlex_get_document
Get EU Document
Fetch the metadata and full text of an EU act or case-law record by CELEX number, ELI URI, or work URI. Returns structured metadata (title, date, type, author institution, Advocates General, legal basis, EuroVoc subjects, in-force status and, for an act not in force, its repealing acts, end of validity, or pending entry into force; for case law, the ECLI and the formation, referring court, subject matter, and case reference parsed from the title) plus the body as HTML, Markdown, or Formex4 XML, defaulting to English with automatic fallback. Every body returned in one call is capped at 100,000 characters — paged and full windows page onward with offset/limit; use outline: true for a heading map and select to pull specific articles, chapters, recitals, or annexes of an act, or the headed sections and operative part of a judgment or order, reading a selected section on its own from the offset and chars in selected_sections.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'default': 25000, 'maximum': 100000, 'minimum': 1, 'description': 'Maximum characters to return in this window ("paged" mode only; select ignores it). Default 25000, max 100000. Follow has_more and the returned offsets until false to reconstruct the complete body.'}, 'format': {'enum': ['html', 'xml', 'markdown'], 'type': 'string', 'default': 'html', 'description': 'Content format: "html" for the act text as served by EUR-Lex (default), "markdown" for that HTML converted to clean Markdown server-side, or "xml" for Formex4 structured XML.'}, 'offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Character offset into the body where the returned window starts ("paged" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call. Offsets are format-specific: an offset is only valid against the same format it was measured in â\x80\x94 keep format constant when paging.'}, 'select': {'type': 'object', 'properties': {'annexes': {'type': 'string', 'description': 'Comma-separated annex numbers or letters, e.g. "I,II".'}, 'articles': {'type': 'string', 'description': 'Comma-separated article numbers, e.g. "1,5,17".'}, 'chapters': {'type': 'string', 'description': 'Comma-separated chapter numbers, Roman or Arabic, e.g. "I,IV" or "1,4".'}, 'headings': {'type': 'string', 'description': 'Case law: comma-separated positions of section headings, as numbered in the outline, e.g. "2" or "1,4". A section runs to the next heading or the operative part.'}, 'recitals': {'type': 'string', 'description': 'Comma-separated recital numbers, e.g. "1,10".'}, 'operative_part': {'type': 'boolean', 'description': 'Case law: true to return a judgment\'s or order\'s operative part (the ruling) to the end of the body: from its opening words ("On those grounds, â\x80¦") in a modern body, from the "Operative part" section in a legacy one.'}}, 'description': 'Return only the text of specific sections by type and number, instead of a raw character window (Roman and Arabic numbers are equivalent; a number may carry an English kind word or one in the language served, e.g. "Article 5", "Artikel 5", "5. cikk"). For case law, select headed sections by position or the operative part. Sections are located in the body of the requested format, so pair select with the same format used for any outline. A section inside another selected section (an article in a selected chapter) is returned once, within the enclosing one. A section that cannot be located â\x80\x94 including a number that appears only in text an amending act inserts into another act â\x80\x94 is reported in selection.missed with no wrong text returned. offset and limit do not apply: the joined sections are capped at 100000 characters with no continuation, and each section stays readable on its own from its offset and chars in selected_sections. Ignored when outline is true or in content_mode "metadata_only".'}, 'eli_uri': {'type': 'string', 'description': 'Work-level ELI URI of the act to fetch (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number, eli_uri, or work_uri.'}, 'outline': {'type': 'boolean', 'default': False, 'description': 'Return a structural outline of the act â\x80\x94 chapters, sections, articles, annexes, and the preamble\'s recitals as a heading list, each with its character offset â\x80\x94 instead of body text. The recitals appear as one entry spanning the run (e.g. "Recitals 1â\x80\x93173") at the first recital\'s offset unless include_recitals is true. Headings of text an amending act inserts into another act are not listed. For case law, the outline lists each top-level section heading ("Legal context", "Costs") and, for a judgment or order, the operative part (the ruling). Read a section by paging with its offset, keeping the same format: outline offsets are measured in the requested format\'s body and land in the wrong place under any other format. Ignores offset/limit and select; no detectable structure returns an empty outline. Not applied in content_mode "metadata_only".'}, 'resolve': {'enum': ['as_requested', 'current_consolidated'], 'type': 'string', 'default': 'as_requested', 'description': 'Which version to serve. "as_requested" (default) returns the exact CELEX requested; "current_consolidated" serves the newest consolidated version in effect of the requested act â\x80\x94 or, for a consolidated CELEX, of its base act â\x80\x94 echoing the request in requested_celex, and is a no-op when none exists (with a notice when the act\'s only consolidated versions are dated in the future). Either way, is_superseded / current_consolidated_celex / consolidated_as_of describe the text served.'}, 'language': {'type': 'string', 'default': 'EN', 'pattern': '^(?:[Ee][Nn]|[Ff][Rr]|[Dd][Ee]|[Ee][Ss]|[Ii][Tt]|[Pp][Ll]|[Pp][Tt]|[Nn][Ll]|[Cc][Ss]|[Dd][Aa]|[Ee][Ll]|[Ee][Tt]|[Ff][Ii]|[Hh][Uu]|[Ll][Tt]|[Ll][Vv]|[Mm][Tt]|[Rr][Oo]|[Ss][Kk]|[Ss][Ll]|[Ss][Vv]|[Bb][Gg]|[Hh][Rr]|[Gg][Aa])$', 'description': 'One of the 24 supported two-letter EUR-Lex language codes (e.g. EN, FR, DE), accepted case-insensitively and normalized to uppercase. Defaults to EN, and falls back to EN if the requested language is unavailable.'}, 'work_uri': {'type': 'string', 'description': 'CELLAR work resource URI to fetch (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1) â\x80\x94 the form returned by eurlex_lookup_celex, eurlex_get_relations, and eurlex_search_documents. A work carrying several CELEX numbers (a national implementing measure, one per directive it was notified against) is served under its lowest, with a notice giving the count; each names the same document, so pass celex_number to serve a specific one. Provide exactly one of celex_number, eli_uri, or work_uri.'}, 'celex_number': {'anyOf': [{'type': 'string', 'const': ''}, {'type': 'string', 'pattern': '^[0-9A-Z][0-9A-Z()/_-]{5,}$', 'description': 'CELEX number of the act (e.g. 32016R0679 for GDPR). Surrounding whitespace is trimmed and the value is uppercased before validation.'}], 'description': 'CELEX number of the act to fetch (e.g. 32016R0679 for GDPR). Provide exactly one of celex_number, eli_uri, or work_uri.'}, 'content_mode': {'enum': ['metadata_only', 'paged', 'full'], 'type': 'string', 'default': 'paged', 'description': 'How much of the body to return. "paged" (default) returns an offset/limit window; "full" requests from the start and returns at most 100000 characters with continuation metadata when more exists; "metadata_only" skips the content fetch. offset and limit apply only to "paged".'}, 'include_recitals': {'type': 'boolean', 'default': False, 'description': 'List every recital as its own outline entry, with its own offset, instead of one entry for the run. Applies only when outline is true; select reaches a single recital either way.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['celex_number', 'content_mode', 'content_available', 'content_status', 'has_more', 'language', 'content_format']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Maximum body characters allowed in the window.'}, 'date': {'type': 'string', 'description': 'Document date in ISO 8601 format (YYYY-MM-DD).'}, 'ecli': {'type': 'string', 'description': 'European Case Law Identifier of a case-law record (e.g. "ECLI:EU:C:2014:317"), as eurlex_lookup_celex reports it: the work\'s own, or the lowest another work holding the same CELEX records. Absent for legislation.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_identifier_args', 'not_found', 'content_challenge'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_identifier_args`: None of celex_number, eli_uri, or work_uri was provided, or more than one was. `not_found`: The CELEX, ELI, or work URI resolves to no fetchable work â\x80\x94 the work is absent from the corpus, or the CELLAR work carries no CELEX number. `content_challenge`: The primary content response is an AWS WAF bot-challenge interstitial rather than legal text. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Number of body characters returned.'}, 'title': {'type': 'string', 'description': 'Document title in the language the body is served in (see language), or in English when CELLAR records no title in that language. Case law is titled in English whatever the language, parsed from its English CELLAR title: the parties (e.g. "Google Spain SL and Google Inc. v Agencia Española de Protección de Datos (AEPD) and Mario Costeja González."), or the court/AG descriptor when the case names none, with the rest in formation, referring_court, subject_matter, and case_reference, when the parser places the title whole; otherwise the raw "#"-delimited English title, or the served language\'s raw title when there is no English one. Absent for some older works and judgments.'}, 'notice': {'type': 'string', 'description': 'How to retrieve the remaining document content; when a work_uri carries several CELEX numbers, how many it carries and which one was served; and, when no consolidated version is in effect yet, that the consolidated text served does not apply yet, or that resolve "current_consolidated" served the base act.'}, 'content': {'type': 'string', 'description': 'Body content of the act in the requested format and language. In "paged" mode this is the requested window; in "full" mode it starts at zero; under select it is the matched sections joined in document order, each source character once â\x80\x94 a section inside another selected section (an article in a selected chapter) is carried inside the enclosing one. Every one is capped at 100000 characters. Omitted in "metadata_only" mode, when the window is empty, or when content is unavailable.'}, 'outline': {'type': 'array', 'items': {'type': 'object', 'required': ['kind', 'number', 'label', 'offset'], 'properties': {'kind': {'type': 'string', 'description': 'Structural unit kind: "chapter", "section", "article", "annex", or "recital" in an act; "heading" or "operative_part" in case law.'}, 'label': {'type': 'string', 'description': 'Human label in English whatever the language and format, e.g. "Article 17", "CHAPTER IV", "Recitals 1â\x80\x93173" â\x80\x94 the form selection.matched reports; only an xml article with no number to read keeps its own heading text. A case-law heading keeps its text as served (e.g. "Legal context", "Sur les dépens"); the operative part is "Operative part".'}, 'title': {'type': 'string', 'description': 'Descriptive title where the act supplies one.'}, 'number': {'type': 'string', 'description': 'Numbering token, the same in every language (e.g. "17", "6A", "IV" â\x80\x94 Roman numerals in Latin letters, French "premier" as "1"); empty for a lone unnumbered annex. A recital entry covering a run reads as a range, firstâ\x80\x93last (e.g. "1â\x80\x93173"), unless include_recitals is true. A case-law heading is numbered by its 1-based position, the number select.headings takes; empty for the operative part.'}, 'offset': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Character offset of the heading in the full body of the requested format â\x80\x94 pass as offset in a paged call to read from here.'}}, 'description': 'One detected heading, addressable by its character offset into the body.', 'additionalProperties': False}, 'description': 'Structural outline of the act. Present only when outline is true; an empty array means no structure was detected.'}, 'has_more': {'type': 'boolean', 'description': 'True when body content exists beyond the returned contiguous window. Continue in "paged" mode with offset = content_offset + content_chars_returned until false. Always false in "metadata_only" mode, and always false for outline and select responses, where that recipe cannot resume across disjoint slices â\x80\x94 a cut selection is disclosed through the truncated enrichment instead.'}, 'in_force': {'type': 'boolean', 'description': 'Whether the act is currently in force â\x80\x94 for a consolidated text, whether its base act is. When false, repealed_by, entry_into_force, and end_of_validity give the reason where CELLAR records one: an explicit repeal, an entry into force still ahead, or an end of validity â\x80\x94 past for an expired act, possibly still ahead for one not yet in force. Some acts not in force carry none of them.'}, 'language': {'type': 'string', 'description': 'Language code of the returned content.'}, 'work_uri': {'type': 'string', 'description': 'CELLAR work URI.'}, 'formation': {'type': 'string', 'description': 'Case law: the formation that decided, from the title\'s leading segment, verbatim (e.g. "Grand Chamber"), or "President", "Vice-President", or "President of the Second Chamber" for an order issued by that office. Absent when the title names none.'}, 'selection': {'type': 'object', 'required': ['requested', 'matched', 'missed'], 'properties': {'missed': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Requested section descriptors that could not be located.'}, 'matched': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Labels of the sections located in the body, in document order, as in the outline â\x80\x94 in English whatever the language and format, except a case-law heading, which keeps its text as served.'}, 'requested': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Section descriptors requested, in English whatever the language, e.g. ["Article 17", "CHAPTER IV"], or ["Heading 2", "Operative part"] for case law.'}}, 'description': "Outcome of a structural selection. Present only when select was used; content holds the matched sections joined in document order, a nested section's text once inside its enclosing section, capped at 100000 characters. When the cap cuts the join, a trailing matched section may be partly or wholly absent from content â\x80\x94 read selected_sections for each one's own address.", 'additionalProperties': False}, 'truncated': {'type': 'boolean', 'description': 'True when the returned body window was capped.'}, 'legal_basis': {'type': 'array', 'items': {'type': 'object', 'required': ['work_uri'], 'properties': {'work_uri': {'type': 'string', 'description': 'CELLAR work URI of the legal basis act. When celex_number is present, pass either as work_uri or celex_number to eurlex_get_document to fetch that act; a basis with no CELEX is a CELLAR reference that may not resolve to a fetchable work.'}, 'celex_number': {'type': 'string', 'description': 'CELEX number of the legal basis act (e.g. 12012E016 for TFEU Article 16). Absent when CELLAR records no CELEX for the work.'}}, 'description': 'A legal basis act: its CELLAR work URI plus its CELEX number when recorded.', 'additionalProperties': False}, 'description': "Legal basis acts for this work â\x80\x94 for a consolidated text, its base act's. Absent when none are recorded."}, 'repealed_by': {'type': 'array', 'items': {'type': 'string', 'description': 'CELEX number of a repealing act.'}, 'description': "CELEX numbers of the acts that explicitly repeal this one, the relation eurlex_get_relations names repealed_by (implicit repeals are listed there as implicitly_repealed_by). Present only when in_force is false; for a consolidated text, its base act's."}, 'celex_number': {'type': 'string', 'description': 'Confirmed CELEX number for the retrieved work.'}, 'content_mode': {'type': 'string', 'description': 'Content mode applied to this response: "metadata_only", "paged", or "full".'}, 'is_superseded': {'type': 'boolean', 'description': 'Whether a newer consolidated version (an unofficial reading aid merging later amendments) than the text served is in effect, so this text may lack those amendments. False when the text served is the newest consolidated version in effect, or a consolidated version dated after it that does not apply yet. Not a repeal/replacement signal â\x80\x94 the base act remains the law and may still be in force (see in_force). Present whenever the act has a consolidated version in effect; absent otherwise.'}, 'resource_type': {'type': 'string', 'description': 'Human-readable document type label (e.g. "Regulation", "Directive"). Absent for some older works.'}, 'base_act_celex': {'type': 'string', 'description': "CELEX of the base act a consolidated text consolidates (e.g. 32024R1689), linked through CELLAR rather than derived from the consolidated CELEX. Its authors, in-force status, legal basis, and EuroVoc subjects are reported here in place of the consolidation's own. Absent for a base act, and for a consolidated text whose base act is unlinked or carries no CELEX."}, 'case_reference': {'type': 'string', 'description': 'Case law: the case reference from the title (e.g. "Case C-131/12.").'}, 'content_format': {'type': 'string', 'description': 'Format of the returned content: "html", "markdown", or "xml".'}, 'content_offset': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Character offset where the returned contiguous window begins. Present in "paged" and "full" modes. Absent for outline and select responses, whose content is not a contiguous span â\x80\x94 read selected_sections for each matched section\'s own offset.'}, 'content_status': {'enum': ['not_requested', 'available', 'unavailable'], 'type': 'string', 'description': 'Body resolution status: "not_requested" for metadata-only calls, "available" when a body was resolved, or "unavailable" after ordinary resolution attempts returned no usable body.'}, 'subject_matter': {'type': 'string', 'description': 'Case law: the subject-matter keyword list from the title (e.g. "Personal data â\x80\x93 Protection of individuals â\x80¦").'}, 'end_of_validity': {'type': 'string', 'description': "Date (YYYY-MM-DD) the act's validity ends or ended: past for an expired act, and possibly in the future for one not yet in force (read it with entry_into_force), so on its own it does not mean the act expired. Present only when in_force is false and CELLAR records an actual date rather than its open-ended 9999-12-31; for a consolidated text, its base act's."}, 'referring_court': {'type': 'string', 'description': 'Case law: the national court that referred a preliminary ruling, from the title (e.g. "Audiencia Nacional"). Absent on direct actions and appeals.'}, 'requested_celex': {'type': 'string', 'description': 'The originally requested CELEX, echoed when resolve "current_consolidated" served a different consolidated version. celex_number holds the CELEX actually served. Absent when the served work is the one requested.'}, 'entry_into_force': {'type': 'string', 'description': "Earliest entry-into-force date (YYYY-MM-DD) of an act not yet in force. Present only when in_force is false and that date is after today (UTC); for a consolidated text, its base act's."}, 'eurovoc_subjects': {'type': 'array', 'items': {'type': 'object', 'required': ['concept_uri'], 'properties': {'label': {'type': 'string', 'description': 'EuroVoc preferred label in the requested language. Absent when the concept has no label in that language.'}, 'concept_uri': {'type': 'string', 'description': 'EuroVoc concept URI (http://eurovoc.europa.eu/{id}), the exact value the eurovoc_concept filter of eurlex_search_documents accepts.'}}, 'description': 'An EuroVoc subject: its concept URI plus its preferred label when available.', 'additionalProperties': False}, 'description': "EuroVoc subject classifications â\x80\x94 for a consolidated text, its base act's. Absent when none are recorded."}, 'advocates_general': {'type': 'array', 'items': {'type': 'string', 'description': 'Advocate General surname, as CELLAR records it.'}, 'description': 'Advocates General who delivered this case-law record, by surname as CELLAR records it (e.g. ["Jääskinen"]), sorted. A few Opinions of the Court list several. Absent for legislation and for case law with none recorded.'}, 'content_available': {'type': 'boolean', 'description': 'Whether body content was fetched from EUR-Lex. False in "metadata_only" mode (no fetch attempted) â\x80\x94 use content_mode to distinguish "not requested" from "unavailable upstream".'}, 'language_fallback': {'type': 'string', 'description': 'Human-readable note explaining the fallback that occurred (e.g. "Requested FR content unavailable; returned EN"). Present only when a fallback happened.'}, 'selected_sections': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'offset', 'chars'], 'properties': {'chars': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Characters the section spans in the source body â\x80\x94 pass as limit alongside offset to read exactly this section. A section longer than the maximum window is read by paging forward from offset instead.'}, 'label': {'type': 'string', 'description': 'Section label as in the outline, e.g. "Article 17", or a case-law heading\'s served text.'}, 'offset': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Character offset of the section in the full body of the requested format â\x80\x94 pass as offset in a paged call to read it.'}}, 'description': 'One selected section, addressable on its own through the paging floor.', 'additionalProperties': False}, 'description': 'Source address of each distinct section the selection located, in document order. Present only when select was used. A section nested inside another selected section keeps its own entry, though its text appears in content only once, inside the enclosing section. A selection is a set of slices, not a contiguous window, so these addresses â\x80\x94 not content_offset â\x80\x94 are how a caller navigates one; every section stays individually reachable even when the cap cut its text.'}, 'author_institution': {'type': 'string', 'description': 'Primary (first) author, by the English label of its CELLAR authority code: an EU institution or body (e.g. "European Parliament", "Court of Justice", "European Union"), a member state on a national implementing measure (e.g. "Netherlands"), an MEP by surname on a parliamentary question (e.g. "VAN MIERT"), "Provisional data" for a consolidated text with no linked base act, or for a national-court decision the deciding court (e.g. "Supremo Tribunal de Justiça"). A code with no English label shows the last segment of its code. Each label is accepted by the author_institution filter of eurlex_search_documents. For co-legislated acts, prefer author_institutions for the complete set. For a consolidated text, the base act\'s (see base_act_celex). Absent when not recorded, and for an AG opinion whose only recorded author is the Advocate General.'}, 'consolidated_as_of': {'type': 'string', 'description': 'Consolidation date of current_consolidated_celex in ISO 8601 (YYYY-MM-DD). Present whenever is_superseded is.'}, 'requested_language': {'type': 'string', 'description': 'Originally requested language code when English fallback changed the effective language reported in language.'}, 'structure_detected': {'type': 'boolean', 'description': 'Whether any structure was parsed from the body. Present when outline or select was used; false means no detectable chapter/article/annex structure, or for case law no section heading or operative part â\x80\x94 read it via offset/limit or content_mode "full".'}, 'author_institutions': {'type': 'array', 'items': {'type': 'string', 'description': 'Author label, as in author_institution.'}, 'description': 'All authors, labelled as in author_institution and listed once each, for acts adopted by more than one body (e.g. ["European Parliament", "Council of the European Union"]) or signed by several states. Advocates General appear in advocates_general instead. For a consolidated text, the base act\'s. Absent when none recorded.'}, 'content_chars_total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Total character length of the full document body. Present when content was fetched and available; use with content_offset to page through the entire act.'}, 'content_chars_returned': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Number of body characters returned in this response (equals content length). Present when a body was fetched and available.'}, 'current_consolidated_celex': {'type': 'string', 'description': 'CELEX of the act\'s newest consolidated version in effect (e.g. 02014R0833-20260424) â\x80\x94 fetch it with eurlex_get_document, or pass resolve "current_consolidated". A consolidation dated in the future is never this version. Present whenever is_superseded is.'}, 'content_unavailability_reason': {'enum': ['no_representation', 'upstream_failure', 'multipart_incomplete'], 'type': 'string', 'description': 'Why content_status is "unavailable": no representation exists, the upstream request failed, or a multipart Formex body could not be assembled completely.'}}, 'additionalProperties': False}
eurlex_get_relations
Get CELLAR Relationship Graph
Traverse the one-hop CDM relationship graph of an EU act: what it amends or is amended by, what it repeals or is repealed by (explicit and implicit), its consolidated versions, national transposition measures, its legal basis, and works that cite it. Returns direct relations only, paginated per relation type and direction. Requires a CELEX number or CELLAR work URI.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'default': 100, 'maximum': 100, 'minimum': 1, 'description': 'Maximum related works per relation type and direction (1â\x80\x93100, default 100). Incoming edges are ordered newest-first, so the cap keeps the newest â\x80\x94 page with offset for older ones.'}, 'offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Pagination offset applied per relation type and direction â\x80\x94 related works to skip (default 0). Page forward by adding limit; incoming edges are newest-first, so higher offsets reach older works.'}, 'work_uri': {'type': 'string', 'description': 'CELLAR work resource URI to traverse (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1). Used directly as the addressed work; its CELEX identity is resolved for the national_transposition act match, which stands down when the work carries several CELEX numbers â\x80\x94 address such a work by celex_number to name the act you mean. Provide exactly one of celex_number or work_uri.'}, 'celex_number': {'anyOf': [{'type': 'string', 'const': ''}, {'type': 'string', 'pattern': '^[0-9A-Z][0-9A-Z()/_-]{5,}$', 'description': 'CELEX number of the work (e.g. 32016R0679). Surrounding whitespace is trimmed and the value is uppercased before validation.'}], 'description': 'CELEX number of the work to traverse (e.g. 32016R0679). Provide exactly one of celex_number or work_uri.'}, 'relation_types': {'type': 'array', 'items': {'enum': ['cites', 'amends', 'amended_by', 'repeals', 'repealed_by', 'implicitly_repeals', 'implicitly_repealed_by', 'legal_basis', 'consolidated_version', 'national_transposition'], 'type': 'string'}, 'description': 'Subset of relation types to return; omit for all. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis (treaty/article this act rests on), consolidated_version (consolidated texts of this act), national_transposition (member-state implementing measures).'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['work_uri', 'relations', 'total', 'offset', 'has_more', 'requested_relation_types', 'empty_relation_types']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per-direction cap. It bounds each relation type and each direction independently, so it is not an upper bound on shown: a page spanning several types and both directions can return more relations than this number.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_identifier_args', 'not_found'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_identifier_args`: Neither celex_number nor work_uri was provided, or both were. `not_found`: CELEX number not found in CELLAR â\x80\x94 resolve the identifier with eurlex_lookup_celex first. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Number of relations returned in this page, summed across every relation type and direction â\x80\x94 not the count for any single type or direction.'}, 'total': {'type': 'number', 'description': 'Number of relations returned in this page (not a corpus-wide count).'}, 'notice': {'type': 'string', 'description': 'Guidance for the next call: on an empty first page, how to widen the traversal; on a page with more rows, the offset to continue from.'}, 'offset': {'type': 'number', 'description': 'Pagination offset applied to this response (per relation type and direction).'}, 'has_more': {'type': 'boolean', 'description': 'True only when at least one requested relation type/direction returned an additional valid row beyond this page.'}, 'work_uri': {'type': 'string', 'description': 'CELLAR URI of the source work (the work_uri input, or resolved from the CELEX).'}, 'relations': {'type': 'array', 'items': {'type': 'object', 'required': ['relation_type', 'direction', 'related_work_uri'], 'properties': {'direction': {'type': 'string', 'description': 'Direction: "outgoing" (this work â\x86\x92 related) or "incoming" (related â\x86\x92 this work).'}, 'related_date': {'type': 'string', 'description': 'Document date of the related work (YYYY-MM-DD), the date rows are ordered by within each relation type and direction. Absent when CELLAR records none; such rows sort last.'}, 'related_title': {'type': 'string', 'description': "The related work's English title, whole. Absent when the work has no English title â\x80\x94 most national_transposition measures are titled only in their member state's language â\x80\x94 with no other language substituted."}, 'relation_type': {'type': 'string', 'description': 'Type of relation: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis, consolidated_version, national_transposition.'}, 'related_work_uri': {'type': 'string', 'description': 'CELLAR URI of the related work.'}, 'related_celex_number': {'type': 'string', 'description': 'CELEX number of the related work, if available.'}, 'related_member_state': {'type': 'string', 'description': 'ISO 3166-1 alpha-3 code of the member state whose national measure this is (e.g. "CZE"), read from the three letters after the directive number in related_celex_number. Present on national_transposition rows only. The codes are the 27 member states plus "GBR" (the United Kingdom).'}}, 'description': 'A single CDM relation between the source work and a related work.', 'additionalProperties': False}, 'description': 'Direct CDM relations for the requested work.'}, 'truncated': {'type': 'boolean', 'description': 'True when an additional valid row proves at least one relation type/direction has more related works â\x80\x94 page with offset.'}, 'next_offset': {'type': 'number', 'description': 'Offset for the next page. Present only when has_more is true.'}, 'celex_number': {'type': 'string', 'description': 'CELEX number of the source work whose relations were traversed â\x80\x94 the celex_number input, or the CELEX resolved from work_uri when the addressed work carries exactly one. Absent when the addressed work carries none, carries several, or its identity was not resolved because no requested relation type needs it.'}, 'empty_relation_types': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Requested relation types that returned zero relations in THIS page. Page-scoped: a type can appear here because all its edges sit beyond the current offset/limit window, not only because the act genuinely has none of that relation â\x80\x94 so absent-from-here does not prove absent-in-CELLAR. An empty page â\x80\x94 a first page with no edges, or an exhausted later page â\x80\x94 returns all requested types here.'}, 'requested_relation_types': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The relation types this request traversed â\x80\x94 the explicit relation_types list, or all types when it was omitted. Diff against the types present in relations[], or read empty_relation_types, to confirm which requested types returned edges.'}}, 'additionalProperties': False}
eurlex_lookup_celex
Resolve EU Legal Citation
Resolve an EU legal citation — a CELEX number, ELI URI, ECLI, or an OJ citation naming its act type and year (e.g. "Regulation (EU) 2016/679", "Directive 95/46/EC") — to its canonical CELLAR work, confirming it exists before you fetch or traverse it. Returns the work URI, confirmed CELEX number, document type, date, and the ECLI of a case that carries one. A CELEX that CELLAR holds under several works resolves to the one the EUR-Lex content resolver serves. An ECLI shared by several records (a judgment and its abstract or extract, or a joined AG opinion) resolves to the primary record with the lowest CELEX.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['identifier'], 'properties': {'identifier': {'type': 'string', 'minLength': 1, 'description': 'The EU legal citation to resolve: a CELEX number (e.g. 32016R0679), a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix), an ECLI (e.g. ECLI:EU:C:2014:317), or an OJ citation that names its act type and year, resolved to the CELEX it names under identifier_type "auto": 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" before the numbers means number/year, otherwise year/number; a two-digit year is 19YY. A citation without its act type (95/46/EC) or year (Regulation No 17) is not parsed.'}, 'identifier_type': {'enum': ['celex', 'eli', 'ecli', 'auto'], 'type': 'string', 'default': 'auto', 'description': 'Format of the identifier. "auto" detects a CELEX, an ELI URI, an ECLI (by its ECLI: prefix, in any letter case), or an OJ citation; "celex", "eli", or "ecli" forces that lookup. An OJ citation is recognized only under "auto".'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['found']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'date': {'type': 'string', 'description': 'Document date in ISO 8601 format (YYYY-MM-DD).'}, 'ecli': {'type': 'string', 'description': 'European Case Law Identifier of the case (e.g. "ECLI:EU:C:2014:317"), as CELLAR stores it â\x80\x94 the resolved work\'s own, or the one another work holding the same CELEX records. Present for case law that carries one; absent for legislation and judicial notices.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['ambiguous_identifier'], 'description': 'Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is "auto" and the identifier, after trimming, is neither an ECLI (ECLI: prefix), an ELI URI, CELEX-shaped (uppercase), nor an OJ citation naming its act type and year (e.g. "Regulation No 17" names no year), so no lookup branch applies. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'found': {'type': 'boolean', 'description': 'True when the identifier resolves to a CELLAR work; false when a well-formed CELEX, ELI, ECLI, or OJ citation matches no work in the corpus, with a notice naming what was tried. Only an identifier_type "auto" value that, after trimming, is neither an ECLI, an ELI URI, CELEX-shaped (uppercase), nor an OJ citation naming its act type and year raises ambiguous_identifier instead.'}, 'notice': {'type': 'string', 'description': 'Present only when found is false: the CELEX, ELI, or ECLI looked up, the accepted forms, and the search to use instead.'}, 'work_uri': {'type': 'string', 'description': 'CELLAR work URI (stable resource identifier).'}, 'celex_number': {'type': 'string', 'description': 'Confirmed CELEX number for the resolved work.'}, 'resource_type': {'type': 'string', 'description': 'Human-readable document category resolved from the CDM resource type (e.g. "Regulation", "Directive", "Judgment"). An authority value with no known label falls back to its code (e.g. "BUDGET"). Absent for some works.'}}, 'additionalProperties': False}
eurlex_query_sparql
Raw CELLAR SPARQL Query
Run a raw, read-only SPARQL SELECT against the CELLAR Virtuoso endpoint — an escape hatch for CDM ontology traversals the curated tools do not cover. Only SELECT is accepted; update forms and ASK/CONSTRUCT/DESCRIBE are rejected before execution, and results are capped at 100. The cdm:, skos:, and xsd: prefixes are auto-injected.
읽기 전용 외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['sparql_query'], 'properties': {'sparql_query': {'type': 'string', 'minLength': 10, 'description': 'A read-only SPARQL SELECT query. Leading comments and PREFIX/BASE declarations are allowed; the cdm:, skos:, and xsd: prefixes are auto-injected. LIMIT is injected at 100 if absent, or capped to 100. Key CDM predicates: cdm:resource_legal_id_celex (CELEX), cdm:work_date_document (date), cdm:work_has_resource-type (type), cdm:work_is_about_concept_eurovoc (EuroVoc subject), cdm:work_cites_work (citation). CELEX is an xsd:string literal â\x80\x94 match it as a typed triple, ?work cdm:resource_legal_id_celex "32016R0679"^^xsd:string (an untyped literal matches nothing, in a triple or in FILTER(?celex = "â\x80¦"), and a FILTER(STR(â\x80¦)) comparison scans every CELEX). For text, use bif:contains with a single-quoted phrase.'}, 'timeout_hint': {'type': 'integer', 'maximum': 55000, 'minimum': 1000, 'description': 'Optional client-side timeout in milliseconds (1000â\x80\x9355000). Defaults apply when omitted; the endpoint hard limit is 60 seconds.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['bindings', 'variables', 'total']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The server-enforced result ceiling that was applied.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['not_read_only', 'unsupported_query_form', 'sparql_error', 'sparql_timeout'], 'description': 'Machine-readable failure mode. Declared by this tool: `not_read_only`: The query is a SPARQL Update operation (INSERT, DELETE, WITH, LOAD, CLEAR, CREATE, DROP, COPY, MOVE, or ADD). `unsupported_query_form`: The query is not a SELECT: an ASK, CONSTRUCT, or DESCRIBE form, an unrecognized keyword, or no query keyword after the prologue. `sparql_error`: Virtuoso returned a syntax or semantic error â\x80\x94 the query is malformed. `sparql_timeout`: The query exceeded the client-side timeout (timeout_hint, default 55 s) or the 60-second Virtuoso execution limit. Neither is retried: the call fails inside the configured bound. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Number of binding rows returned in this response.'}, 'total': {'type': 'number', 'description': 'Number of binding rows returned (capped at 100 by the server).'}, 'notice': {'type': 'string', 'description': 'On a zero-row result whose query has an untyped string literal as a triple object: how to type or language-tag it, since CELLAR stores identifiers as typed literals that an untyped one never matches.'}, 'bindings': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'A single SPARQL result row. Each key is a SELECT variable name; each value is a SPARQL term object with "type" ("uri", "literal", or "bnode") and "value" (the string value), plus "datatype" (an IRI) on a typed literal or "xml:lang" (a language tag) on a language-tagged literal â\x80\x94 the two are mutually exclusive. A variable left unbound by an OPTIONAL has no key in the row at all.', 'additionalProperties': {}}, 'description': 'Raw SPARQL binding rows. To extract a value from a row: row["varName"]?.value. Use the variables array to iterate in query order.'}, 'truncated': {'type': 'boolean', 'description': 'True when the server-enforced result ceiling capped the rows and more may exist upstream â\x80\x94 narrow the query with FILTERs to see the rest.'}, 'variables': {'type': 'array', 'items': {'type': 'string', 'description': 'A SELECT variable name, in the order declared in the query.'}, 'description': 'Variable names from the SELECT head, in query order.'}}, 'additionalProperties': False}
eurlex_search_documents
Search EU Documents
Search EU legislation, treaties, and preparatory acts across the CELLAR corpus by document type, date range, EuroVoc subject, author institution, and in-force status. Keyword matches English titles and CELEX strings only — there is no full-text body search. Corrigenda are excluded by default so primary acts fill the page (set include_corrigenda to include them). Returns a page of CELEX numbers, work URIs, type labels, dates, and titles, newest first, each flagged with is_consolidated and is_corrigendum. At least one filter is required.
읽기 전용 외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Maximum number of results to return (1â\x80\x93100). Defaults to 20.'}, 'offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Pagination offset â\x80\x94 number of results to skip. Defaults to 0.'}, 'date_to': {'anyOf': [{'type': 'string', 'const': ''}, {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'End date in ISO 8601 format (YYYY-MM-DD).'}], 'description': 'End of date range (YYYY-MM-DD), matched against document date. Omit for no upper bound.'}, 'keyword': {'type': 'string', 'description': 'Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (â\x80¦(01) to â\x80¦(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (â\x80¦R(01) to â\x80¦R(20), and any work recorded as correcting it) when include_corrigenda is set. A partial CELEX that opens with the sector and year (02016R0679), the year and type letters (2016R0679), or type letters followed by the number (R0679, J0131) matches every CELEX that holds it at that position, consolidated versions included; an OJ C fragment of a year, a slash, and at least four characters of the number (2024/01469, C/2024/0146) matches every CELEX holding it; one with a shorter number (2017/111) or opening with letters not followed by a digit (R(01), ROU_2024) tests every CELEX and can take tens of seconds; a bare year (2016) or a fragment opening mid-year or mid-number (016R0679, 0679, 0679R) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected.'}, 'in_force': {'type': 'boolean', 'description': 'Restrict by in-force status: true returns only acts currently in force; false returns acts not in force â\x80\x94 repealed, expired, or not yet in force (eurlex_get_document names which, where CELLAR records one). Either way the act must carry the in-force property, which a minority of works do. Omit to return all regardless of in-force status.'}, 'date_from': {'anyOf': [{'type': 'string', 'const': ''}, {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Start date in ISO 8601 format (YYYY-MM-DD).'}], 'description': 'Start of date range (YYYY-MM-DD), matched against document date. Omit for no lower bound.'}, 'document_type': {'anyOf': [{'type': 'string', 'const': ''}, {'enum': ['REG', 'DIR', 'DEC', 'TREATY', 'JUDG', 'OPIN_AG', 'PROP', 'REC'], 'type': 'string', 'description': 'Document type: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation.'}], 'description': 'Document category: REG=Regulations, DIR=Directives, DEC=Decisions, TREATY=Treaties, JUDG=Judgments, OPIN_AG=AG Opinions, PROP=Proposals, REC=Recommendations. Each category includes its explicit CELLAR authority variants (for example, delegated and implementing regulations). Omit to search all types. Consolidated texts are excluded unless include_consolidated is true.'}, 'eurovoc_concept': {'anyOf': [{'type': 'string', 'const': ''}, {'type': 'string', 'description': 'EuroVoc concept URI (e.g. http://eurovoc.europa.eu/2828).'}], 'description': 'EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828), obtained from eurlex_browse_subjects. Only EuroVoc concept URIs are accepted; https://eurovoc.europa.eu/â\x80¦ and an upper-case host are read as the http://eurovoc.europa.eu/â\x80¦ form CELLAR stores. Omit for no subject filter.'}, 'author_institution': {'type': 'string', 'description': 'Author name (e.g. "European Parliament", "Council", "European Commission"), matched as a phrase against the English labels of each work\'s authors â\x80\x94 the labels eurlex_get_document reports in author_institution(s), member states and MEPs included.'}, 'include_corrigenda': {'type': 'boolean', 'default': False, 'description': 'Include corrigenda â\x80\x94 separate correction works, co-typed CORRIGENDUM alongside the base type of the act they correct, carrying a "â\x80¦R(nn)" CELEX and usually no English title. Default false: they are excluded so primary acts fill the page. Every returned row is tagged is_corrigendum.'}, 'include_consolidated': {'type': 'boolean', 'default': False, 'description': 'When true and document_type is set, also match consolidated texts whose basic act belongs to that document category. No effect when document_type is omitted. Consolidated rows are always tagged is_consolidated: true.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['documents', 'total', 'offset', 'has_more', 'query_echo']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The limit that was applied to this page.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['no_filters', 'invalid_date_range', 'invalid_author_institution', 'invalid_keyword', 'sparql_error'], 'description': 'Machine-readable failure mode. Declared by this tool: `no_filters`: No effective narrowing filter was supplied â\x80\x94 an unfiltered search would scan the entire corpus. `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `invalid_author_institution`: author_institution holds no letters or digits, so it can name no institution. `invalid_keyword`: keyword holds no letters or digits, so no title and no CELEX can match it. `sparql_error`: Virtuoso returned HTTP 200 with an error body â\x80\x94 query malformed or timed out. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Number of documents returned in this page.'}, 'total': {'type': 'number', 'description': 'Number of documents returned in this page (not a corpus-wide count).'}, 'notice': {'type': 'string', 'description': 'Guidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from.'}, 'offset': {'type': 'number', 'description': 'Pagination offset used for this response.'}, 'has_more': {'type': 'boolean', 'description': 'True only when CELLAR returned an additional valid row beyond this page.'}, 'documents': {'type': 'array', 'items': {'type': 'object', 'required': ['work_uri', 'celex_number', 'is_consolidated', 'is_corrigendum'], 'properties': {'date': {'type': 'string', 'description': 'Document date in ISO 8601 format (YYYY-MM-DD).'}, 'title': {'type': 'string', 'description': 'English expression title where available; absent for many older works and judgments.'}, 'work_uri': {'type': 'string', 'description': 'CELLAR work URI (stable resource identifier).'}, 'celex_number': {'type': 'string', 'description': 'CELEX identifier for the work.'}, 'resource_type': {'type': 'string', 'description': 'Human-readable document type label (e.g. "Regulation", "Directive"). Works with several resource-types (e.g. corrigenda) list all, comma-separated. Absent for some older works.'}, 'is_corrigendum': {'type': 'boolean', 'description': 'True when this work carries the CORRIGENDUM resource-type â\x80\x94 a correction to another act rather than a primary act. Only ever true when include_corrigenda is set, since corrigenda are excluded by default.'}, 'is_consolidated': {'type': 'boolean', 'description': 'True when this CELEX is a consolidated version (sector 0, e.g. 02016R0679-20160504) â\x80\x94 a point-in-time text that incorporates amendments â\x80\x94 rather than a base or amending act.'}}, 'description': 'A single EU legislative work with its CELEX number, type, and date.', 'additionalProperties': False}, 'description': 'Matching EU documents ordered by date descending, then by CELEX number ascending among documents sharing a date, so pages are stable across calls.'}, 'truncated': {'type': 'boolean', 'description': 'True when an additional CELLAR row proves more documents exist beyond this page.'}, 'query_echo': {'type': 'object', 'required': ['include_consolidated', 'include_corrigenda'], 'properties': {'date_to': {'type': 'string', 'description': 'End date filter applied.'}, 'keyword': {'type': 'string', 'description': 'Keyword filter applied.'}, 'in_force': {'type': 'boolean', 'description': 'In-force filter applied.'}, 'date_from': {'type': 'string', 'description': 'Start date filter applied.'}, 'document_type': {'type': 'string', 'description': 'Document type filter applied.'}, 'eurovoc_concept': {'type': 'string', 'description': 'EuroVoc concept URI filter applied, in the http://eurovoc.europa.eu/ form it was matched as.'}, 'author_institution': {'type': 'string', 'description': 'Author institution filter applied.'}, 'include_corrigenda': {'type': 'boolean', 'description': 'Effective include_corrigenda value after the false default is applied â\x80\x94 whether corrigenda were admitted alongside primary acts. Always present, since the default shapes which records can appear.'}, 'include_consolidated': {'type': 'boolean', 'description': 'Effective include_consolidated value after the false default is applied â\x80\x94 whether consolidated texts whose basic act belongs to the document_type category were included. Always present, since the default shapes which records can appear; has effect only when document_type is set.'}}, 'description': 'Echo of filters applied to this search. Useful for diagnosing empty results.', 'additionalProperties': False}, 'next_offset': {'type': 'number', 'description': 'Offset for the next page. Present only when has_more is true.'}}, 'additionalProperties': False}
변경됨
eurlex_query_sparql
2026년 9월 27일 2:44 AM
변경됨
eurlex_get_relations
2026년 9월 27일 2:44 AM
변경됨
eurlex_get_document
2026년 9월 27일 2:44 AM
변경됨
eurlex_get_cases
2026년 9월 27일 2:44 AM
변경됨
eurlex_search_documents
2026년 9월 27일 2:44 AM
변경됨
eurlex_browse_subjects
2026년 9월 27일 2:44 AM
변경됨
eurlex_lookup_celex
2026년 9월 27일 2:44 AM
변경됨
eurlex_get_document
2026년 9월 23일 2:42 AM
변경됨
eurlex_search_documents
2026년 9월 23일 2:42 AM
변경됨
eurlex_lookup_celex
2026년 9월 23일 2:42 AM
추가됨
eurlex_query_sparql
2026년 9월 17일 12:41 PM
추가됨
eurlex_get_relations
2026년 9월 17일 12:41 PM
추가됨
eurlex_get_document
2026년 9월 17일 12:41 PM
추가됨
eurlex_get_cases
2026년 9월 17일 12:41 PM
추가됨
eurlex_search_documents
2026년 9월 17일 12:41 PM
추가됨
eurlex_browse_subjects
2026년 9월 17일 12:41 PM
추가됨
eurlex_lookup_celex
2026년 9월 17일 12:41 PM