cern-opendata-mcp-server
An MCP server that allows agents to search the CERN Open Data Portal for datasets, software, and documentation. It supports fetching full metadata, listing data files with XRootD URIs, assembling analysis environments, and retrieving CMS good-run lists and trigger paths.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://cern-opendata.caseyjhand.com/mcpWhat its tools do
7 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Search CERN Open Data datasets and software
- Fetch full metadata and citation for records
- List data files and XRootD URIs
- Retrieve CMS good-run lists
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- cern-opendata-mcp-server 0.3.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 7 advertised
- Resources
- 1 advertised
- Resource templates
- 2 advertised
- Prompts
- 0 advertised
{
"tools": {
"listChanged": true
},
"logging": {},
"prompts": {
"listChanged": true
},
"resources": {
"subscribe": true,
"listChanged": true
},
"extensions": {
"io.modelcontextprotocol/skills": {
"directoryRead": true
}
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
7 advertised
cern_opendata_search_records — Search CERN Open Data Records
Search the CERN Open Data Portal's datasets, software, environments, documentation and supplementary records with exact-vocabulary filters and an optional full-text query. The filters are experiment, record type, physics category, keyword, collision energy and type, file format, data-taking year, event count, availability, collection, and LHCb magnet polarity, stripping stream and stripping version. Returns compact hits with recids plus live facet counts. Each facet ignores its own filter, so its counts show the alternatives under the other filters. Filter values are exact upstream; common spellings are normalized, and cern_opendata_list_reference lists the vocabulary. Paging reaches the first 10,000 matches.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, from 1, counting pages of the limit applied. page × limit may not exceed 10,000."
},
"sort": {
"enum": [
"bestmatch",
"mostrecent",
"title",
"title_desc"
],
"type": "string",
"description": "bestmatch (relevance), mostrecent (by date_published, newest first), title (A-Z) or title_desc (Z-A). Omitted: bestmatch with a query, mostrecent (newest first) without."
},
"type": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One type value."
},
"maxItems": 7,
"description": "Up to 7 types (OR): Dataset, Documentation, Environment, Software, Supplementaries, News, or Primary::Secondary (Dataset::Collision, Dataset::Simulated). Omit for all six primaries; Glossary is excluded."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 10000,
"minimum": 1,
"description": "Hits per page, 1-50. A value above 50 is served at 50."
},
"query": {
"type": "string",
"maxLength": 500,
"description": "Verbatim OpenSearch query_string: AND between terms, double weight for title matches. Supports title:\"…\", recid:(1 OR 2), run_period:(\"Run2012B\"); cern_opendata_list_reference topic query_syntax lists forms. Omit for filters alone."
},
"year_to": {
"type": "integer",
"maximum": 2100,
"minimum": 1900,
"description": "Inclusive latest data-taking year; alone means through this year."
},
"category": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One category value."
},
"maxItems": 20,
"description": "Up to 20 simulated-dataset categories (OR): primary (Exotica, Higgs Physics, Standard Model Physics, Supersymmetry) or Primary::Secondary (Higgs Physics::Standard Model). Case/separator normalized. Commas stay within an item (Exotica::Heavy Fermions, Heavy Righ-Handed Neutrinos). Heavy-Ion Physics also matches its leading-space spelling. cern_opendata_list_reference topic categories lists all values."
},
"keywords": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One keyword, exact and case-sensitive."
},
"maxItems": 10,
"description": "Up to 10 verbatim, case-sensitive keywords (OR); Education differs from education. A comma within a keyword stays in one item."
},
"file_type": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One file_type value."
},
"maxItems": 20,
"description": "Up to 20 formats/data tiers (OR): nanoaod, miniaod, aod, root, DAOD_PHYSLITE, csv, etc. Known-value case normalized."
},
"year_from": {
"type": "integer",
"maximum": 2100,
"minimum": 1900,
"description": "Inclusive earliest data-taking year; alone means onward. For one year, set both year bounds to it."
},
"collection": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One collection name, exact and case-sensitive."
},
"maxItems": 10,
"description": "Up to 10 exact, case-sensitive collections (OR), e.g. CMS-Validated-Runs; copy a record's collections spellings."
},
"experiment": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One experiment value."
},
"maxItems": 9,
"description": "Up to 9 experiments (OR): ALICE, ATLAS, CMS, DELPHI, JADE, LHCb, OPERA, PHENIX, TOTEM. Case normalized."
},
"max_events": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Maximum number of events, inclusive."
},
"min_events": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Minimum number of events, inclusive."
},
"availability": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One availability value."
},
"maxItems": 4,
"description": "Up to 4 availability states (OR): online, partial, ondemand (tape; request before download), requested."
},
"collision_type": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One collision_type value."
},
"maxItems": 6,
"description": "Up to 6 collision types (OR): pp, PbPb, pPb, e+e-, Interfill. PbPb also matches Pb-Pb."
},
"magnet_polarity": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One magnet_polarity value."
},
"maxItems": 2,
"description": "Up to 2 LHCb collision-dataset polarities (OR): MagDown, MagUp. Case normalized."
},
"collision_energy": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One collision_energy value."
},
"maxItems": 15,
"description": "Up to 15 energies (OR), e.g. 7TeV, 8TeV, 13TeV, 5.02TeV. \"13TeV, 13.6TeV\" is one value/item."
},
"stripping_stream": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One stripping_stream value."
},
"maxItems": 11,
"description": "Up to 11 LHCb stripping streams (OR), e.g. BHADRON, CHARM, DIMUON, EW, LEPTONIC; also matches stripping docs. Case normalized. cern_opendata_list_reference topic lhcb lists them."
},
"stripping_version": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"description": "One stripping_version value."
},
"maxItems": 12,
"description": "Up to 12 LHCb stripping versions (OR), e.g. stripping21, stripping21r1p2. Case normalized."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"hits",
"page",
"has_more",
"facets",
"truncated",
"shown",
"cap",
"totalCount",
"applied_filters"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"cap": {
"type": "number",
"description": "The page size (limit) applied to this call."
},
"hits": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"type",
"portal_url"
],
"properties": {
"id": {
"type": "string",
"description": "Portal id: the recid for records, the slug for documentation and news."
},
"doi": {
"type": "string",
"description": "DOI to cite."
},
"slug": {
"type": "string",
"description": "Documentation or news slug; pass it to cern_opendata_get_records."
},
"type": {
"type": "object",
"required": [
"primary",
"secondary"
],
"properties": {
"primary": {
"type": "string",
"description": "Dataset, Software, Environment, Documentation, Supplementaries or News; empty when unstated."
},
"secondary": {
"type": "array",
"items": {
"type": "string",
"description": "One secondary type."
},
"description": "Secondary types (Collision, Simulated, etc.); empty when none."
}
},
"description": "Portal record classification.",
"additionalProperties": false
},
"recid": {
"type": "string",
"description": "Record id; pass it to cern_opendata_get_records or cern_opendata_list_files."
},
"title": {
"type": "string",
"description": "Title as the portal states it."
},
"formats": {
"type": "array",
"items": {
"type": "string",
"description": "One file format or data tier."
},
"description": "File formats and data tiers, such as aod or nanoaod."
},
"experiment": {
"type": "array",
"items": {
"type": "string",
"description": "One experiment name."
},
"description": "Experiments, such as CMS or ATLAS."
},
"portal_url": {
"type": "string",
"description": "The record or documentation page on opendata.cern.ch."
},
"run_period": {
"type": "array",
"items": {
"type": "string",
"description": "One run period."
},
"description": "Run periods, such as Run2012B."
},
"collections": {
"type": "array",
"items": {
"type": "string",
"description": "One collection name."
},
"description": "Portal collections the record belongs to."
},
"availability": {
"type": "string",
"description": "Record-level availability: online, partial, ondemand or requested."
},
"date_created": {
"type": "array",
"items": {
"type": "string",
"description": "One year or date."
},
"description": "Data-taking or creation years."
},
"number_files": {
"type": "number",
"description": "Number of files."
},
"number_events": {
"type": "number",
"description": "Number of events."
},
"size_in_bytes": {
"type": "number",
"description": "Total size in bytes."
},
"collision_type": {
"type": "string",
"description": "Collision type, such as pp or PbPb."
},
"date_published": {
"type": "string",
"description": "Publication date on the portal."
},
"collision_energy": {
"type": "string",
"description": "Collision energy, such as 8TeV."
},
"title_additional": {
"type": "string",
"description": "Descriptive secondary title."
},
"short_description": {
"type": "string",
"description": "Docs and news: the short description, as received."
}
},
"description": "One matching record, compact; cern_opendata_get_records returns the full metadata.",
"additionalProperties": false
},
"description": "Matching records on this page."
},
"page": {
"type": "number",
"description": "The page returned."
},
"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_query",
"query_server_error",
"page_window_exceeded",
"invalid_range",
"rate_limited",
"upstream_unreadable"
],
"description": "Machine-readable failure mode. Declared by this tool: `invalid_query`: query leaves a parenthesis, range bracket or double quote unbalanced, or ends in an escaping backslash (refused before any request); or the portal rejected the query string (invalid query syntax), or answered another 400 the server did not anticipate, whose upstream message is carried. `query_server_error`: Every attempt of a search with query set answered HTTP 500, as the portal does for some malformed queries in place of its 400 syntax rejection. `page_window_exceeded`: page × limit, the limit applied (at most 50), exceeds 10,000, the deepest match the portal pages to. `invalid_range`: year_from is after year_to, or min_events is above max_events. `rate_limited`: The portal's 60-a-minute budget is spent: it answered 429, or the request could not start within the call's deadline. data.retryAfter is set. `upstream_unreadable`: The portal answered with a body the server could not read: not JSON, missing the expected envelope, or over the byte ceiling (then data.retryable is false). Also raised when a search answers 404. 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 items returned on this page."
},
"facets": {
"type": "object",
"required": [
"experiment",
"type",
"collision_energy",
"collision_type",
"file_type",
"availability",
"year",
"number_events",
"category",
"keywords",
"magnet_polarity",
"stripping_stream",
"stripping_version"
],
"properties": {
"type": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
},
"subtypes": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records with it."
},
"value": {
"type": "string",
"description": "Secondary type."
}
},
"description": "One secondary type.",
"additionalProperties": false
},
"description": "Secondary types of this primary type."
},
"subtypes_other_count": {
"type": "number",
"description": "Summed count of the secondary types past the 10 listed, not a record count; absent when the list is whole."
}
},
"description": "One primary type.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by primary type, each with its secondary types.",
"additionalProperties": false
},
"year": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
}
},
"description": "One facet value.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by data-taking year.",
"additionalProperties": false
},
"category": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
},
"subcategories": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records with it."
},
"value": {
"type": "string",
"description": "Secondary category."
}
},
"description": "One secondary category.",
"additionalProperties": false
},
"description": "Secondary categories of this primary category."
},
"subcategories_other_count": {
"type": "number",
"description": "Summed count of the secondary categories past the 10 listed, not a record count; absent when the list is whole."
}
},
"description": "One primary category.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by physics category, each with its secondary categories.",
"additionalProperties": false
},
"keywords": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
}
},
"description": "One facet value.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by keyword.",
"additionalProperties": false
},
"file_type": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
}
},
"description": "One facet value.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by file format or data tier.",
"additionalProperties": false
},
"experiment": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
}
},
"description": "One facet value.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by experiment.",
"additionalProperties": false
},
"availability": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
}
},
"description": "One facet value.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by record availability.",
"additionalProperties": false
},
"number_events": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
}
},
"description": "One facet value.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by event-count range.",
"additionalProperties": false
},
"collision_type": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
}
},
"description": "One facet value.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by collision type.",
"additionalProperties": false
},
"magnet_polarity": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
}
},
"description": "One facet value.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by LHCb magnet polarity.",
"additionalProperties": false
},
"collision_energy": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
}
},
"description": "One facet value.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by collision energy.",
"additionalProperties": false
},
"stripping_stream": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
}
},
"description": "One facet value.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by LHCb stripping stream.",
"additionalProperties": false
},
"stripping_version": {
"type": "object",
"required": [
"buckets",
"other_count"
],
"properties": {
"buckets": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"count"
],
"properties": {
"count": {
"type": "number",
"description": "Records."
},
"value": {
"type": "string",
"description": "As its filter takes it."
}
},
"description": "One facet value.",
"additionalProperties": false
},
"description": "Values with counts."
},
"other_count": {
"type": "number",
"description": "Summed count of the values past the bucket cap, not a record count."
}
},
"description": "Matches by LHCb stripping version.",
"additionalProperties": false
}
},
"description": "Live counts under all other filters: each facet ignores its own filter. Terms list 10 values alphabetically (file_type: 100); type and category buckets list 10 secondary values. Overflow fields sum counts past these caps, counting a record once per value; other_count is 0 for year and number_events. cern_opendata_list_reference topics record_types/categories list all secondary values; a Primary::Secondary filter gives its record count as totalCount.",
"additionalProperties": false
},
"notice": {
"type": "string",
"description": "Continuation, empty-result guidance or result caveats; absent when none."
},
"has_more": {
"type": "boolean",
"description": "Next page has matches within the first 10,000; false at the reachable end even if more exist (see truncated/notice)."
},
"truncated": {
"type": "boolean",
"description": "True when more results remain past this page; notice says how to reach them."
},
"totalCount": {
"type": "number",
"description": "Total matches for the query and filters."
},
"applied_filters": {
"type": "object",
"required": [
"type",
"type_defaulted",
"sort",
"sort_defaulted",
"include_ondemand"
],
"properties": {
"sort": {
"enum": [
"bestmatch",
"mostrecent",
"title",
"title_desc"
],
"type": "string",
"description": "The sort that ran."
},
"type": {
"type": "array",
"items": {
"type": "string",
"description": "One type."
},
"description": "Types sent (OR); the six served primaries when type_defaulted."
},
"year": {
"type": "string",
"description": "Data-taking year range sent: from--to, from-- or --to (inclusive)."
},
"query": {
"type": "string",
"description": "The full-text query, as sent."
},
"category": {
"type": "array",
"items": {
"type": "string",
"description": "One category."
},
"description": "Categories requested (OR)."
},
"expanded": {
"type": "array",
"items": {
"type": "object",
"required": [
"param",
"value",
"sent"
],
"properties": {
"sent": {
"type": "array",
"items": {
"type": "string",
"description": "One upstream spelling."
},
"description": "Upstream spellings sent for it."
},
"param": {
"type": "string",
"description": "Filter parameter."
},
"value": {
"type": "string",
"description": "Requested value."
}
},
"description": "One expanded value.",
"additionalProperties": false
},
"description": "Values sent as several upstream spellings."
},
"keywords": {
"type": "array",
"items": {
"type": "string",
"description": "One keyword."
},
"description": "Keywords sent (OR)."
},
"file_type": {
"type": "array",
"items": {
"type": "string",
"description": "One file type."
},
"description": "File types sent (OR)."
},
"collection": {
"type": "array",
"items": {
"type": "string",
"description": "One collection."
},
"description": "Collections sent (OR)."
},
"experiment": {
"type": "array",
"items": {
"type": "string",
"description": "One experiment."
},
"description": "Experiments sent (OR)."
},
"availability": {
"type": "array",
"items": {
"type": "string",
"description": "One availability state."
},
"description": "Availability states sent (OR)."
},
"number_events": {
"type": "string",
"description": "Event-count range sent: min--max, min-- or --max (inclusive)."
},
"collision_type": {
"type": "array",
"items": {
"type": "string",
"description": "One collision type."
},
"description": "Collision types requested (OR)."
},
"sort_defaulted": {
"type": "boolean",
"description": "True when sort was omitted, so the server chose it: bestmatch with a query, mostrecent (newest first) without."
},
"type_defaulted": {
"type": "boolean",
"description": "True when type was omitted and the six served primaries were sent."
},
"magnet_polarity": {
"type": "array",
"items": {
"type": "string",
"description": "One polarity."
},
"description": "Magnet polarities sent (OR)."
},
"collision_energy": {
"type": "array",
"items": {
"type": "string",
"description": "One energy."
},
"description": "Collision energies sent (OR)."
},
"include_ondemand": {
"type": "boolean",
"const": true,
"description": "Tape-resident (ondemand) records are always included."
},
"stripping_stream": {
"type": "array",
"items": {
"type": "string",
"description": "One stream."
},
"description": "Stripping streams sent (OR)."
},
"stripping_version": {
"type": "array",
"items": {
"type": "string",
"description": "One version."
},
"description": "Stripping versions sent (OR)."
},
"unrecognized_values": {
"type": "array",
"items": {
"type": "object",
"required": [
"param",
"value"
],
"properties": {
"param": {
"enum": [
"type",
"experiment",
"collision_energy",
"collision_type",
"file_type",
"availability",
"category",
"magnet_polarity",
"stripping_stream",
"stripping_version"
],
"type": "string",
"description": "Filter parameter."
},
"value": {
"type": "string",
"description": "The value as sent."
}
},
"description": "One unrecognized value.",
"additionalProperties": false
},
"description": "Values not in the verified vocabulary, sent as given; cern_opendata_list_reference lists the accepted spellings."
}
},
"description": "The filters as the server applied them.",
"additionalProperties": false
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true
}cern_opendata_get_records — Get CERN Open Data Records
Fetch full metadata for 1-20 records in one call, by recid, DOI, CMS dataset path (/Primary/Era/TIER) or documentation slug. Returns the description, run periods, collision and distribution details, related records, a software-environment summary, the license and a ready citation, plus what a record states of its variable dictionary, physics category, pile-up, keywords, and LHCb magnet polarity and stripping. Documentation and news pages include their markdown body in slices of at most 30,000 characters; body_offset with that one id reads on from where a slice stops. Each response holds to 64,000 bytes, except that the first record always comes back whole: records past the budget, and ids past the first 20, are listed under deferred, to pass back as ids. File lists are not included; use cern_opendata_list_files. Identifiers that do not resolve come back under missing with guidance; they do not fail the call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ids"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 500,
"description": "One identifier: a recid (6004 or atlas-160006, recid:6004 or a portal record URL), a DOI (10.7483/OPENDATA.CMS.YLIC.86ZZ, doi:… or a doi.org URL), a CMS dataset path (/DoubleMuParked/Run2012B-22Jan2013-v1/AOD) or a documentation slug (cms-guide-docker or its portal URL)."
},
"maxItems": 100,
"minItems": 1,
"description": "Identifiers to resolve: up to 100, of which the first 20 distinct are looked up and the rest returned under deferred. Forms may be mixed; exact duplicates collapse."
},
"body_offset": {
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"description": "With exactly one documentation or news id: where its body slice starts, in characters (UTF-16 code units), usually the body_next_offset an earlier call returned. 0 (the default) is the body's start and is accepted with any ids; above 0 needs exactly one id."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"records",
"missing",
"deferred"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"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_body_offset",
"rate_limited",
"upstream_unreadable"
],
"description": "Machine-readable failure mode. Declared by this tool: `invalid_body_offset`: body_offset is above 0 beside two or more ids, or at or past the body_length of the record its one id names, or that record has no body. `rate_limited`: The portal's 60-a-minute budget is spent: it answered 429, or the request could not start within the call's deadline. data.retryAfter is set. `upstream_unreadable`: The portal answered with a body the server could not read: not JSON, missing the expected envelope, or over the byte ceiling (then data.retryable is false). Also raised when a search answers 404. 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": {}
},
"notice": {
"type": "string",
"description": "Continuation calls for a cut documentation body, budget-deferred records or ids past the first 20 left unread; absent when none."
},
"missing": {
"type": "array",
"items": {
"type": "object",
"required": [
"input",
"interpreted_as",
"guidance"
],
"properties": {
"input": {
"type": "string",
"description": "The identifier as given."
},
"guidance": {
"type": "string",
"description": "Why it did not resolve and how to find the record."
},
"interpreted_as": {
"enum": [
"recid",
"doi",
"cms_dataset_path",
"doc_slug",
"unrecognized"
],
"type": "string",
"description": "The identifier form it was read as; unrecognized when no form fits."
}
},
"description": "One identifier that did not resolve.",
"additionalProperties": false
},
"description": "Identifiers that resolved to no record; empty when every id resolved."
},
"records": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"kind",
"matched_inputs",
"type",
"links",
"relations",
"license",
"portal_url"
],
"properties": {
"id": {
"type": "string",
"description": "Portal id: recid for records, slug for docs and news."
},
"doi": {
"type": "string",
"description": "DOI to cite, such as 10.7483/OPENDATA.CMS.YLIC.86ZZ."
},
"body": {
"type": "string",
"description": "Docs/news markdown: up to 30,000 characters (UTF-16 code units) from body_offset."
},
"kind": {
"enum": [
"record",
"doc"
],
"type": "string",
"description": "doc for docs and news (slug); record otherwise."
},
"slug": {
"type": "string",
"description": "Documentation or news slug; absent on records."
},
"tags": {
"type": "array",
"items": {
"type": "string",
"description": "One tag."
},
"description": "Docs and news: tags."
},
"type": {
"type": "object",
"required": [
"primary",
"secondary"
],
"properties": {
"primary": {
"type": "string",
"description": "Dataset, Software, Environment, Documentation, Supplementaries or News; empty when unstated."
},
"secondary": {
"type": "array",
"items": {
"type": "string",
"description": "One secondary type."
},
"description": "Secondary types (Collision, Simulated, etc.); empty when none."
}
},
"description": "Portal record classification.",
"additionalProperties": false
},
"links": {
"type": "array",
"items": {
"type": "object",
"required": [
"source"
],
"properties": {
"url": {
"type": "string",
"description": "Linked URL; portal-relative paths start with /."
},
"recid": {
"type": "string",
"description": "Linked record id."
},
"source": {
"enum": [
"abstract",
"note",
"usage",
"validation",
"use_with",
"pileup",
"software"
],
"type": "string",
"description": "The metadata section the link came from."
},
"description": {
"type": "string",
"description": "Link text as the portal states it; for a pile-up link, the pile-up dataset path."
}
},
"description": "One link.",
"additionalProperties": false
},
"description": "Metadata and software links, with origin in source; empty when none."
},
"recid": {
"type": "string",
"description": "Recid: digits (6004) or prefixed digits (atlas-160006); absent on docs and news."
},
"title": {
"type": "string",
"description": "Title as the portal states it."
},
"authors": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Author name."
},
"orcid": {
"type": "string",
"description": "ORCID iD, when the record states one."
}
},
"description": "One author.",
"additionalProperties": false
},
"description": "Authors; a news page author string becomes one entry."
},
"license": {
"type": "object",
"required": [
"basis",
"statement"
],
"properties": {
"id": {
"type": "string",
"description": "SPDX-style license id, such as CC0-1.0."
},
"basis": {
"enum": [
"record",
"cern_terms_default",
"not_stated"
],
"type": "string",
"description": "record: explicit license; cern_terms_default: Dataset without its own license, CC0 under CERN Open Data Terms of Use; not_stated: unstated."
},
"statement": {
"type": "string",
"description": "The license statement to relay."
}
},
"description": "License of the record content.",
"additionalProperties": false
},
"category": {
"type": "object",
"required": [
"primary",
"secondary"
],
"properties": {
"source": {
"type": "string",
"description": "Who assigned the category, when stated."
},
"primary": {
"type": "string",
"description": "Exact physics category for the search category filter (Standard Model Physics, Higgs, etc.)."
},
"secondary": {
"type": "array",
"items": {
"type": "string",
"description": "One subcategory."
},
"description": "Subcategories, such as Top physics; empty when none."
}
},
"description": "Physics category of the dataset.",
"additionalProperties": false
},
"citation": {
"type": "object",
"required": [
"text",
"doi",
"request"
],
"properties": {
"doi": {
"type": "string",
"description": "The DOI to cite."
},
"text": {
"type": "string",
"description": "Ready citation built from the record fields."
},
"request": {
"type": "string",
"description": "CERN's citation request."
}
},
"description": "Citation; present only when the record has a DOI.",
"additionalProperties": false
},
"keywords": {
"type": "array",
"items": {
"type": "string",
"description": "One keyword."
},
"description": "Keywords, case as stored (the search keywords filter)."
},
"note_html": {
"type": "string",
"description": "Notes, HTML as the portal sent it."
},
"relations": {
"type": "array",
"items": {
"type": "object",
"required": [
"type"
],
"properties": {
"doi": {
"type": "string",
"description": "Related record DOI."
},
"type": {
"type": "string",
"description": "Portal relation (isParentOf, isChildOf, isRelatedTo), inconsistently applied upstream."
},
"recid": {
"type": "string",
"description": "Related record id."
},
"title": {
"type": "string",
"description": "Related record title."
},
"description": {
"type": "string",
"description": "Relation description."
}
},
"description": "One related record.",
"additionalProperties": false
},
"description": "Related records, relayed verbatim; empty when none."
},
"stripping": {
"type": "object",
"properties": {
"stream": {
"type": "string",
"description": "Stripping stream, such as DIMUON."
},
"version": {
"type": "string",
"description": "Stripping version, such as stripping21r1."
}
},
"description": "LHCb dataset/stripping-page stream and version.",
"additionalProperties": false
},
"variables": {
"type": "array",
"items": {
"type": "object",
"required": [
"variable"
],
"properties": {
"type": {
"type": "string",
"description": "Data type, such as float or std::vector<float>."
},
"unit": {
"type": "string",
"description": "Unit, when the record states one."
},
"variable": {
"type": "string",
"description": "Variable or branch name, as the portal states it."
},
"description_html": {
"type": "string",
"description": "What the variable holds, HTML as the portal sent it."
}
},
"description": "One variable.",
"additionalProperties": false
},
"description": "Complete variable dictionary of a derived or event-level dataset."
},
"experiment": {
"type": "array",
"items": {
"type": "string",
"description": "One experiment name."
},
"description": "Experiments, such as CMS or ATLAS."
},
"portal_url": {
"type": "string",
"description": "The record or documentation page on opendata.cern.ch."
},
"run_period": {
"type": "array",
"items": {
"type": "string",
"description": "One run period."
},
"description": "Run periods, such as Run2012B."
},
"usage_html": {
"type": "string",
"description": "Usage instructions, HTML as the portal sent it."
},
"body_format": {
"type": "string",
"description": "Docs and news: body format, such as md."
},
"body_length": {
"type": "number",
"description": "Whole docs/news body length in UTF-16 code units."
},
"body_offset": {
"type": "number",
"description": "Docs/news slice start in UTF-16 code units; 0 is the body start."
},
"collections": {
"type": "array",
"items": {
"type": "string",
"description": "One collection name."
},
"description": "Exact, case-sensitive collections for the search collection filter."
},
"pileup_html": {
"type": "string",
"description": "Pile-up mixing, original HTML; pile-up datasets appear in links with source pileup."
},
"run_numbers": {
"type": "array",
"items": {
"type": "string",
"description": "One run number."
},
"description": "Covered run numbers, as strings."
},
"availability": {
"type": "string",
"description": "Record-level availability: online, partial, ondemand or requested."
},
"date_created": {
"type": "array",
"items": {
"type": "string",
"description": "One year or date."
},
"description": "Data-taking or creation years."
},
"distribution": {
"type": "object",
"required": [
"formats"
],
"properties": {
"formats": {
"type": "array",
"items": {
"type": "string",
"description": "One file format or data tier."
},
"description": "File formats and data tiers, such as aod or nanoaod; empty when none."
},
"number_files": {
"type": "number",
"description": "Number of files."
},
"number_events": {
"type": "number",
"description": "Number of events."
},
"size_in_bytes": {
"type": "number",
"description": "Total size in bytes."
}
},
"description": "Formats, event/file counts and byte size.",
"additionalProperties": false
},
"abstract_html": {
"type": "string",
"description": "Abstract, HTML as the portal sent it."
},
"collaboration": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Collaboration name."
},
"recid": {
"type": "string",
"description": "Record id of the collaboration page."
}
},
"description": "The collaboration that released the record.",
"additionalProperties": false
},
"use_with_html": {
"type": "string",
"description": "What the record is used with, HTML as the portal sent it."
},
"body_truncated": {
"type": "boolean",
"description": "More docs/news body follows; continue at body_next_offset."
},
"collision_type": {
"type": "string",
"description": "Collision type, such as pp or PbPb."
},
"date_published": {
"type": "string",
"description": "Publication date on the portal."
},
"matched_inputs": {
"type": "array",
"items": {
"type": "string",
"description": "One input id."
},
"description": "Requested ids resolving here, as given."
},
"system_details": {
"type": "object",
"properties": {
"release": {
"type": "string",
"description": "Software release, such as a CMSSW version."
},
"global_tag": {
"type": "string",
"description": "Conditions global tag."
},
"description": {
"type": "string",
"description": "Environment description, HTML as the portal sent it."
},
"container_images": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Image name."
},
"registry": {
"type": "string",
"description": "Image registry, when stated."
}
},
"description": "One container image.",
"additionalProperties": false
},
"description": "Container images for the analysis environment (separately licensed)."
},
"environment_recid": {
"type": "string",
"description": "Record id of the environment record the portal names."
}
},
"description": "Software environment; cern_opendata_get_analysis_env expands it.",
"additionalProperties": false
},
"magnet_polarity": {
"type": "string",
"description": "LHCb: magnet polarity during data taking, MagDown or MagUp."
},
"validation_html": {
"type": "string",
"description": "Validation notes, HTML as the portal sent it."
},
"body_next_offset": {
"type": "number",
"description": "Next docs/news slice start; absent at end. Pass as body_offset with this id alone to continue."
},
"collision_energy": {
"type": "string",
"description": "Collision energy, such as 8TeV."
},
"date_reprocessed": {
"type": "string",
"description": "Reprocessing date, for reprocessed data."
},
"methodology_html": {
"type": "string",
"description": "Methodology, HTML as the portal sent it."
},
"title_additional": {
"type": "string",
"description": "Secondary title; included in the citation when present."
},
"dataset_semantics": {
"type": "object",
"properties": {
"html_url": {
"type": "string",
"description": "Dataset semantics page (HTML)."
},
"json_url": {
"type": "string",
"description": "Dataset semantics (JSON)."
}
},
"description": "Portal variable-description pages; inline dictionaries appear in variables instead.",
"additionalProperties": false
},
"short_description": {
"type": "string",
"description": "Docs and news: the short description, as received."
},
"availability_details": {
"type": "object",
"properties": {
"online": {
"type": "number",
"description": "Files on disk, downloadable now."
},
"on_demand": {
"type": "number",
"description": "Files on tape, requested on the record's portal page before download."
}
},
"description": "Portal-reported online/on-demand file counts.",
"additionalProperties": false
},
"source_code_repository_url": {
"type": "string",
"description": "Source code repository URL."
}
},
"description": "Record metadata, license and citation; no file lists.",
"additionalProperties": false
},
"description": "Resolved records, in the order of their first matching input."
},
"deferred": {
"type": "array",
"items": {
"type": "string",
"description": "One input, as given."
},
"description": "Continuation ids: budget-omitted records in input order, then ids past the first 20, not looked up. The response budget is 64,000 bytes; the first record is always whole even when larger. Pass as ids to fetch them; empty when none."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true
}cern_opendata_list_files — List CERN Open Data Record Files
List one record's files: its file indexes (groups of up to ~1,500 files) with their XRootD URI-list URLs, and per file the XRootD URI, HTTPS download URL, size, adler32 checksum and availability. Without index, returns the record's indexes and its regular files; with index, reads only that index and pages through its files. Files marked on demand sit on tape and must be requested on the record's portal page before download.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"recid"
],
"properties": {
"index": {
"type": "string",
"maxLength": 300,
"description": "A file index key from the indexes list, matched exactly (a .txt ending is read as .json). Omit to list the record's indexes and regular files."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 10000,
"minimum": 1,
"description": "Files per page, 1-500. A value above 500 is served at 500."
},
"recid": {
"type": "string",
"pattern": "^(?:[a-z]{1,16}-)?\\d{1,12}$",
"description": "Record id: up to 12 digits (6004), optionally after a lowercase experiment prefix (atlas-160006). cern_opendata_search_records and cern_opendata_get_records return it."
},
"cursor": {
"type": "string",
"maxLength": 500,
"description": "next_cursor from the previous page, unchanged, with the same recid and index. Omit for the first page."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"recid",
"scope",
"indexes",
"files",
"children",
"has_more",
"portal_url",
"truncated",
"shown",
"cap",
"totalCount"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"cap": {
"type": "number",
"description": "The page size (limit) applied to this call."
},
"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": [
"record_not_found",
"index_not_found",
"invalid_cursor",
"rate_limited",
"upstream_unreadable"
],
"description": "Machine-readable failure mode. Declared by this tool: `record_not_found`: No record has this recid: the portal answered 404 for the record, or, with index set, for the index while the record search found nothing. `index_not_found`: index names no file index of this record: the portal answered 404 for it while the record exists, the record lists no such key, or the key is ., .. or not well-formed Unicode. `invalid_cursor`: cursor does not decode, was issued for another recid or index, or points past the end. `rate_limited`: The portal's 60-a-minute budget is spent: it answered 429, or the request could not start within the call's deadline. data.retryAfter is set. `upstream_unreadable`: The portal answered with a body the server could not read: not JSON, missing the expected envelope, a file without its XRootD URI or size, a file index whose key is missing or cannot be URL-encoded, or over the byte ceiling (then data.retryable is false); or the record search answered 404. 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": {}
},
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"size_in_bytes",
"xrootd_uri"
],
"properties": {
"key": {
"type": "string",
"description": "Portal file key; index members use <index>.json_<n>. Absent for keyless files, named by filename instead."
},
"checksum": {
"type": "string",
"description": "Checksum, such as adler32:1a2b3c4d."
},
"filename": {
"type": "string",
"description": "Real file name, for index members."
},
"https_url": {
"type": "string",
"description": "HTTPS download URL on the portal: the record's files route for a keyed file, the /eos/opendata/ route for a keyless one. Absent when a keyless file's XRootD URI is not a file path under eospublic.cern.ch/eos/opendata/, or when the key or path holds a lone surrogate or an empty, . or .. segment."
},
"xrootd_uri": {
"type": "string",
"description": "XRootD URI (root://eospublic.cern.ch//eos/opendata/…)."
},
"availability": {
"type": "string",
"description": "online, or on demand (on tape; request it on the record page first)."
},
"size_in_bytes": {
"type": "number",
"description": "File size in bytes."
}
},
"description": "One file.",
"additionalProperties": false
},
"description": "This page: regular files in record scope, index files in index scope."
},
"recid": {
"type": "string",
"description": "The record id."
},
"scope": {
"enum": [
"record",
"index"
],
"type": "string",
"description": "record: the record's indexes and regular files; index: one index's files."
},
"shown": {
"type": "number",
"description": "Number of items returned on this page."
},
"title": {
"type": "string",
"description": "Record title."
},
"notice": {
"type": "string",
"description": "Continuation, empty-result guidance or result caveats; absent when none."
},
"indexes": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"number_files",
"size_in_bytes",
"availability",
"uri_list_url",
"json_url"
],
"properties": {
"key": {
"type": "string",
"description": "Index key (…_file_index.json, training_files.json, etc.); pass as index to page its files."
},
"json_url": {
"type": "string",
"description": "The index entry with its files, as JSON."
},
"description": {
"type": "string",
"description": "Index description as the portal states it."
},
"availability": {
"type": "object",
"properties": {
"online": {
"type": "number",
"description": "Files on disk, downloadable now."
},
"on_demand": {
"type": "number",
"description": "Files on tape, requested on the record's portal page before download."
}
},
"description": "Portal availability counts; {} when unstated.",
"additionalProperties": false
},
"number_files": {
"type": "number",
"description": "Portal file count, else count of listed index files."
},
"uri_list_url": {
"type": "string",
"description": "Plain-text list of every XRootD URI in the index, one per line."
},
"size_in_bytes": {
"type": "number",
"description": "Index size in bytes: portal total, else sum of listed file sizes."
}
},
"description": "One file index (a group of files).",
"additionalProperties": false
},
"description": "Every file index in record scope; only the selected one in index scope."
},
"children": {
"type": "array",
"items": {
"type": "string",
"description": "One child recid."
},
"description": "Child recids of a fileless umbrella record; empty otherwise."
},
"has_more": {
"type": "boolean",
"description": "True when more files remain past this page."
},
"truncated": {
"type": "boolean",
"description": "True when more results remain past this page; notice says how to reach them."
},
"portal_url": {
"type": "string",
"description": "The record page, where on-demand (tape) files are requested."
},
"totalCount": {
"type": "number",
"description": "Files in scope: regular files in record scope, index files in index scope."
},
"next_cursor": {
"type": "string",
"description": "Pass as cursor, with the same recid and index, for the next page."
},
"availability": {
"type": "string",
"description": "Record-level availability: online, partial, ondemand or requested."
},
"availability_details": {
"type": "object",
"properties": {
"online": {
"type": "number",
"description": "Files on disk, downloadable now."
},
"on_demand": {
"type": "number",
"description": "Files on tape, requested on the record's portal page before download."
}
},
"description": "File counts by availability state for the whole record.",
"additionalProperties": false
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true
}cern_opendata_get_analysis_env — Get CERN Open Data Analysis Environment
Assemble what is needed to analyse a record: its container images, CMSSW release and global tag; the condition-data, VM and validated-run records for its run periods; example software that declares it works with the record; and quoted sections of the guides the record links (the first two are fetched). Container images, software and guide code are licensed separately from the CC0 data. Use cern_opendata_list_files for the record's files.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"recid"
],
"properties": {
"recid": {
"type": "string",
"pattern": "^(?:[a-z]{1,16}-)?\\d{1,12}$",
"description": "Record id: up to 12 digits (6004), optionally after a lowercase experiment prefix (cms-93956). cern_opendata_search_records and cern_opendata_get_records return it."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"recid",
"type",
"software",
"environment_records",
"example_software",
"guides",
"other_links",
"separately_licensed",
"license_note"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"type": {
"type": "object",
"required": [
"primary",
"secondary"
],
"properties": {
"primary": {
"type": "string",
"description": "Dataset, Software, Environment, Documentation, Supplementaries or News; empty when unstated."
},
"secondary": {
"type": "array",
"items": {
"type": "string",
"description": "One secondary type."
},
"description": "Secondary types (Collision, Simulated, etc.); empty when none."
}
},
"description": "Portal record classification.",
"additionalProperties": false
},
"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": [
"record_not_found",
"rate_limited",
"upstream_unreadable"
],
"description": "Machine-readable failure mode. Declared by this tool: `record_not_found`: No record has this recid. `rate_limited`: The portal's 60-a-minute budget is spent: it answered 429, or the request could not start within the call's deadline. data.retryAfter is set. `upstream_unreadable`: The portal answered with a body the server could not read: not JSON, missing the expected envelope, or over the byte ceiling (then data.retryable is false). Also raised when a search answers 404. 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": {}
},
"recid": {
"type": "string",
"description": "The record id."
},
"title": {
"type": "string",
"description": "Record title."
},
"guides": {
"type": "array",
"items": {
"type": "object",
"required": [
"slug",
"url",
"fetched"
],
"properties": {
"url": {
"type": "string",
"description": "The guide link, absolute."
},
"slug": {
"type": "string",
"description": "Doc slug: pass as the sole cern_opendata_get_records id for its body; body_offset continues a cut at the offset in notice."
},
"title": {
"type": "string",
"description": "Guide title, when fetched."
},
"anchor": {
"type": "string",
"description": "Section anchor the link points at, when it has one."
},
"fetched": {
"type": "boolean",
"description": "False if unfetched (only the first two are fetched) or not found; notice distinguishes them."
},
"section": {
"type": "string",
"description": "Linked or opening section: original markdown with LF line ends, up to 12,000 characters."
},
"link_description": {
"type": "string",
"description": "The link text the record gives the guide."
},
"section_truncated": {
"type": "boolean",
"description": "Section cut at 12,000 characters; notice gives body_offset where the quote stops."
},
"reference_definitions": {
"type": "array",
"items": {
"type": "string",
"description": "One definition line, verbatim."
},
"description": "External [label]: destination definitions used by [...] spans in section: verbatim, body order, first per label. Includes definitions past a cut. Empty when unused; absent when unfetched."
}
},
"description": "One portal guide the record links in its usage section.",
"additionalProperties": false
},
"description": "Every portal guide linked in the usage section."
},
"notice": {
"type": "string",
"description": "Gaps and next steps: empty environment, unread or excess linked records, unfetched/missing/cut guides or unmatched guide anchors; absent when none."
},
"software": {
"type": "object",
"required": [
"container_images"
],
"properties": {
"release": {
"type": "string",
"description": "Software release, such as CMSSW_5_3_32."
},
"global_tag": {
"type": "string",
"description": "Conditions global tag."
},
"description": {
"type": "string",
"description": "Environment description as the portal sent it (HTML)."
},
"container_images": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Image name."
},
"registry": {
"type": "string",
"description": "Image registry, when stated."
}
},
"description": "One container image.",
"additionalProperties": false
},
"description": "Environment images; empty when none listed."
},
"environment_recid": {
"type": "string",
"description": "Stated VM/container environment recid."
}
},
"description": "The record's own software environment (system_details).",
"additionalProperties": false
},
"experiment": {
"type": "array",
"items": {
"type": "string",
"description": "One experiment."
},
"description": "Experiments the record belongs to."
},
"run_period": {
"type": "array",
"items": {
"type": "string",
"description": "One run period."
},
"description": "Run periods the record covers, such as Run2012B."
},
"other_links": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Link URL, absolute."
},
"description": {
"type": "string",
"description": "Link text."
}
},
"description": "One link.",
"additionalProperties": false
},
"description": "Other usage links, e.g. getting-started pages."
},
"license_note": {
"type": "string",
"description": "How the environment is licensed."
},
"example_software": {
"type": "array",
"items": {
"type": "object",
"required": [
"recid",
"secondary",
"portal_url"
],
"properties": {
"recid": {
"type": "string",
"description": "Recid of the software record."
},
"title": {
"type": "string",
"description": "Record title."
},
"secondary": {
"type": "array",
"items": {
"type": "string",
"description": "One secondary type."
},
"description": "Secondary types, such as Analysis or Validation; empty when none."
},
"license_id": {
"type": "string",
"description": "Stated software license (e.g. GPL-3.0-only); absent when none."
},
"portal_url": {
"type": "string",
"description": "The record page on the portal."
},
"source_code_repository_url": {
"type": "string",
"description": "Source code repository URL, when stated."
}
},
"description": "One Software record that declares it works with this record.",
"additionalProperties": false
},
"description": "Software records that declare they work with this record."
},
"environment_records": {
"type": "array",
"items": {
"type": "object",
"required": [
"recid",
"kind",
"portal_url"
],
"properties": {
"kind": {
"enum": [
"condition",
"vm",
"validation",
"other"
],
"type": "string",
"description": "From the secondary type: condition data, virtual machine, validated-run list, or other."
},
"recid": {
"type": "string",
"description": "Recid of the environment record."
},
"title": {
"type": "string",
"description": "Record title."
},
"portal_url": {
"type": "string",
"description": "The record page on the portal."
},
"run_period": {
"type": "array",
"items": {
"type": "string",
"description": "One run period."
},
"description": "Run periods the record covers."
}
},
"description": "Linked Environment record: condition data, VM or validation.",
"additionalProperties": false
},
"description": "Condition, VM and validation records for the run periods, and others linking here."
},
"separately_licensed": {
"type": "boolean",
"const": true,
"description": "Images, software and guide code have separate licenses from CC0 data."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true
}cern_opendata_get_validated_runs — Get CMS Validated Runs
Get a CMS validated-run (good-run) list, which certifies the luminosity sections that are good for physics in each run. Select it by a CMS collision dataset recid, a validated-run list recid, or a run period such as Run2012B (give exactly one of recid and run_period). Choose the full validation or the muons-only variant, and narrow to a run range; a dataset recid defaults the range to the first and last run the dataset lists. Returns the runs with their luminosity-section ranges and the list file download URL. CMS only.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 200,
"maximum": 10000,
"minimum": 1,
"description": "Runs to return, 1-2000. A value above 2000 is served at 2000."
},
"recid": {
"type": "string",
"pattern": "^(?:[a-z]{1,16}-)?\\d{1,12}$",
"description": "A CMS collision dataset recid (its linked list is used) or a validated-run list recid (used as named): up to 12 digits, optionally after a lowercase experiment prefix (cms-93956). Give this or run_period."
},
"run_max": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Highest run to return, inclusive. Defaults with run_min for a dataset recid."
},
"run_min": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Lowest run to return, inclusive. With a dataset recid and neither bound set, run_min and run_max default to the first and last run the dataset lists; run_bounds echoes the range applied."
},
"variant": {
"enum": [
"full",
"muons_only"
],
"type": "string",
"description": "full (every detector certified) or muons_only (certified for muon physics). Omitted: a list recid is used as named; a dataset recid or run_period selects full."
},
"run_period": {
"type": "string",
"maxLength": 40,
"description": "A CMS run period such as Run2012B, matched case-insensitively; 2012B also matches Run2012B. Give this or recid. cern_opendata_list_reference with topic run_periods lists them."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"matched_lists",
"runs",
"truncated",
"shown",
"cap",
"totalCount"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"cap": {
"type": "number",
"description": "The page size (limit) applied to this call."
},
"list": {
"type": "object",
"required": [
"recid",
"title",
"file_key",
"variant",
"run_periods",
"https_url",
"portal_url"
],
"properties": {
"recid": {
"type": "string",
"description": "Recid of the selected list record."
},
"title": {
"type": "string",
"description": "List title."
},
"variant": {
"enum": [
"full",
"muons_only"
],
"type": "string",
"description": "full or muons_only."
},
"file_key": {
"type": "string",
"description": "File key of the good-run list JSON."
},
"https_url": {
"type": "string",
"description": "HTTPS download URL of the whole list file (JSON)."
},
"portal_url": {
"type": "string",
"description": "The list record page on the portal."
},
"xrootd_uri": {
"type": "string",
"description": "XRootD URI of the list file, when listed."
},
"run_periods": {
"type": "array",
"items": {
"type": "string",
"description": "One run period."
},
"description": "Run periods the list covers."
},
"collision_energy": {
"type": "string",
"description": "Collision energy, when the list states it."
}
},
"description": "The selected list, when exactly one matched.",
"additionalProperties": false
},
"runs": {
"type": "array",
"items": {
"type": "object",
"required": [
"run",
"lumi_sections",
"lumi_ranges"
],
"properties": {
"run": {
"type": "number",
"description": "Run number."
},
"lumi_ranges": {
"type": "array",
"items": {
"type": "object",
"required": [
"first",
"last"
],
"properties": {
"last": {
"type": "number",
"description": "Last luminosity section, inclusive."
},
"first": {
"type": "number",
"description": "First luminosity section, inclusive."
}
},
"description": "One certified luminosity-section range.",
"additionalProperties": false
},
"description": "Certified luminosity-section ranges, as listed."
},
"lumi_sections": {
"type": "number",
"description": "Luminosity sections certified good in this run."
}
},
"description": "One certified run.",
"additionalProperties": false
},
"description": "Certified runs ascending within run_bounds, capped at limit; empty unless one list was selected."
},
"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": [
"missing_selector",
"conflicting_selectors",
"invalid_range",
"record_not_found",
"no_validated_runs",
"rate_limited",
"upstream_unreadable"
],
"description": "Machine-readable failure mode. Declared by this tool: `missing_selector`: Neither recid nor run_period was given. `conflicting_selectors`: Both recid and run_period were given. `invalid_range`: run_min is above run_max. `record_not_found`: recid is not a validated-run list and no record has it. `no_validated_runs`: No list matches: the record links none (a simulated, non-CMS or non-collision record; or CMS collision data whose run period no published list covers, or which links none although the collection holds a list for its period), the run period has no list, or the variant has no list for it. The message names which case applied. `rate_limited`: The portal's 60-a-minute budget is spent: it answered 429, or the request could not start within the call's deadline. data.retryAfter is set. `upstream_unreadable`: The portal answered with a body the server could not read: not JSON, missing the expected envelope, or over the byte ceiling (then data.retryable is false). Also raised when a search answers 404, and when a list file the collection names answers 404. 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 items returned on this page."
},
"notice": {
"type": "string",
"description": "Continuation, empty-result guidance or result caveats; absent when none."
},
"dataset": {
"type": "object",
"required": [
"recid"
],
"properties": {
"recid": {
"type": "string",
"description": "Recid of the dataset."
},
"title": {
"type": "string",
"description": "Dataset title."
},
"run_period": {
"type": "array",
"items": {
"type": "string",
"description": "One run period."
},
"description": "Run periods the dataset covers."
}
},
"description": "The dataset, when recid named a dataset rather than a list.",
"additionalProperties": false
},
"summary": {
"type": "object",
"required": [
"run_count",
"lumi_section_count"
],
"properties": {
"last_run": {
"type": "number",
"description": "Highest run in the list."
},
"first_run": {
"type": "number",
"description": "Lowest run in the list."
},
"run_count": {
"type": "number",
"description": "Runs in the whole list."
},
"lumi_section_count": {
"type": "number",
"description": "Luminosity sections in the whole list."
}
},
"description": "The whole selected list, before run_bounds.",
"additionalProperties": false
},
"truncated": {
"type": "boolean",
"description": "True when more results remain past this page; notice says how to reach them."
},
"run_bounds": {
"type": "object",
"required": [
"source"
],
"properties": {
"source": {
"enum": [
"input",
"dataset"
],
"type": "string",
"description": "input: supplied run_min/run_max; dataset: both default to its first/last listed run."
},
"run_max": {
"type": "number",
"description": "Highest run returned, inclusive; absent when unset."
},
"run_min": {
"type": "number",
"description": "Lowest run returned, inclusive; absent when unset."
}
},
"description": "Run filter range; absent when unbounded.",
"additionalProperties": false
},
"totalCount": {
"type": "number",
"description": "Runs in the selected list inside run_bounds."
},
"matched_lists": {
"type": "array",
"items": {
"type": "object",
"required": [
"recid",
"title",
"variant",
"run_periods"
],
"properties": {
"recid": {
"type": "string",
"description": "Recid of the validated-run list record."
},
"title": {
"type": "string",
"description": "List title; names the reconstruction pass and certification file."
},
"variant": {
"enum": [
"full",
"muons_only"
],
"type": "string",
"description": "full: every detector certified; muons_only: certified for muon physics only."
},
"run_periods": {
"type": "array",
"items": {
"type": "string",
"description": "One run period."
},
"description": "Run periods the list covers, such as Run2012B."
},
"collision_energy": {
"type": "string",
"description": "Collision energy, when the list states it."
}
},
"description": "One validated-run list the selector matched.",
"additionalProperties": false
},
"description": "All selector matches in the requested variant. If several, none was read: call again with one recid."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true
}cern_opendata_search_trigger_paths — Search CMS Trigger Paths
Look up CMS High-Level Trigger paths by exact name (HLT_IsoMu24) or prefix pattern (HLT_IsoMu*), optionally for one data-taking year. Paths outside the HLT_ family, such as AlCa_EcalPi0, DST_ and DQM_ paths, output modules and HLTriggerFinalPath, are found by their own names, in the case given. Each match is a per-year path record parsed into the primary datasets its title names, the first and last run the path was seen online, per-version run ranges, the L1 seed, and links to the HLT menu records. Covers CMS open data from 2011-2016. Prescale factors are not returned: each HLT menu record holds a configuration file (cern_opendata_list_files with a menu_recid) whose PrescaleService block lists the prescale in each column of every path it prescales (a path it leaves out has prescale 1), and the CMS luminosity records (collection CMS-Luminosity-Information) hold prescale files that log which column applied by run and luminosity section.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"path"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, from 1, counting pages of the limit applied. page × limit may not exceed 10,000."
},
"path": {
"type": "string",
"pattern": "^(?:HLT_[A-Za-z0-9_]+|[0-9A-GI-Za-z][A-Za-z0-9_]*|H(?:[A-KM-Za-z0-9_][A-Za-z0-9_]*)?|HL(?:[A-SU-Za-z0-9_][A-Za-z0-9_]*)?|HLT(?:[A-Za-z0-9][A-Za-z0-9_]*)?)\\*?$",
"maxLength": 200,
"description": "Trigger path name (HLT_IsoMu24, AlCa_EcalPi0) or prefix with one trailing wildcard (HLT_IsoMu*): a letter or digit, then letters, digits and underscores. A path starting HLT_ in any case is searched as given, with the prefix case fixed, and matches path names in any case. Any other path is matched against record path names in the case given, the whole name or, with a trailing *, its start (AlCa_EcalPi0, AlCa_*), and is also searched with HLT_ prepended (IsoMu24 finds HLT_IsoMu24, 60Jet10 finds HLT_60Jet10). A trailing version suffix (_v3 or _v*) is dropped, since records list versions as V<n>."
},
"year": {
"type": "integer",
"maximum": 2100,
"minimum": 2000,
"description": "Data-taking year, such as 2012. Trigger records cover 2011-2016."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 10000,
"minimum": 1,
"description": "Records per page, 1-50. A value above 50 is served at 50."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"page",
"has_more",
"triggers",
"truncated",
"shown",
"cap",
"totalCount",
"effectiveQuery"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"cap": {
"type": "number",
"description": "The page size (limit) applied to this call."
},
"page": {
"type": "number",
"description": "The page returned."
},
"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": [
"page_window_exceeded",
"rate_limited",
"upstream_unreadable"
],
"description": "Machine-readable failure mode. Declared by this tool: `page_window_exceeded`: page × limit, the limit applied (at most 50), exceeds 10,000, the deepest match the portal pages to. `rate_limited`: The portal's 60-a-minute budget is spent: it answered 429, or the request could not start within the call's deadline. data.retryAfter is set. `upstream_unreadable`: The portal answered with a body the server could not read: not JSON, missing the expected envelope, or over the byte ceiling (then data.retryable is false). Also raised when a search answers 404. 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 items returned on this page."
},
"notice": {
"type": "string",
"description": "Continuation, empty-result guidance or result caveats; absent when none."
},
"has_more": {
"type": "boolean",
"description": "Next page has matches within the first 10,000; false at the reachable end even if more exist (see truncated/notice)."
},
"triggers": {
"type": "array",
"items": {
"type": "object",
"required": [
"recid",
"portal_url",
"versions",
"parsed"
],
"properties": {
"path": {
"type": "string",
"description": "Path name from the record title, such as HLT_IsoMu24."
},
"year": {
"type": "string",
"description": "Data-taking year the record covers."
},
"recid": {
"type": "string",
"description": "Recid of the trigger path record."
},
"parsed": {
"type": "boolean",
"description": "False when the first-seen line or every version line could not be parsed; read abstract_html then."
},
"dataset": {
"type": "string",
"description": "Title dataset (e.g. SingleMu) only if exactly one is named; absent for several (see datasets)."
},
"datasets": {
"type": "array",
"items": {
"type": "string",
"description": "One primary dataset name."
},
"description": "All title datasets in order (e.g. [\"DoubleMu\", \"DoubleMuParked\"]); absent when none named."
},
"versions": {
"type": "array",
"items": {
"type": "object",
"required": [
"version",
"run_first",
"run_last"
],
"properties": {
"l1_seed": {
"type": "string",
"description": "Level-1 seed as the record states it, such as L1_SingleMu12."
},
"version": {
"type": "number",
"description": "n of V<n>, the path version (the _v<n> suffix of the CMSSW path name)."
},
"run_last": {
"type": "number",
"description": "Last run of this version, inclusive."
},
"run_first": {
"type": "number",
"description": "First run of this version, inclusive."
}
},
"description": "One path version and its run range.",
"additionalProperties": false
},
"description": "Per-version run ranges, as parsed from the record; empty when none parsed."
},
"last_seen": {
"type": "object",
"required": [
"run"
],
"properties": {
"run": {
"type": "number",
"description": "Run number."
},
"menu": {
"type": "string",
"description": "HLT menu name as the record states it, such as /cdaq/physics/Run2011/5e32/v4.2/HLT/V2."
},
"menu_recid": {
"type": "string",
"description": "Linked HLT-menu recid (Supplementaries::Configuration HLT); read with cern_opendata_get_records."
}
},
"description": "Last run the path was seen online.",
"additionalProperties": false
},
"first_seen": {
"type": "object",
"required": [
"run"
],
"properties": {
"run": {
"type": "number",
"description": "Run number."
},
"menu": {
"type": "string",
"description": "HLT menu name as the record states it, such as /cdaq/physics/Run2011/5e32/v4.2/HLT/V2."
},
"menu_recid": {
"type": "string",
"description": "Linked HLT-menu recid (Supplementaries::Configuration HLT); read with cern_opendata_get_records."
}
},
"description": "First run the path was seen online.",
"additionalProperties": false
},
"portal_url": {
"type": "string",
"description": "The record page on the portal."
},
"abstract_html": {
"type": "string",
"description": "The record abstract as the portal sent it (HTML), the source of every parsed field."
},
"trigger_list_recid": {
"type": "string",
"description": "Recid of the year's full CMS trigger-list record, when linked; cern_opendata_get_records reads it."
}
},
"description": "One trigger path record (one path in one data-taking year).",
"additionalProperties": false
},
"description": "Matching trigger path records on this page."
},
"truncated": {
"type": "boolean",
"description": "True when more results remain past this page; notice says how to reach them."
},
"totalCount": {
"type": "number",
"description": "Trigger path records matching the path (and year)."
},
"effectiveQuery": {
"type": "string",
"description": "The query sent, after normalization (version suffix dropped): an HLT_ path as given; any other path as title clauses matching it as a record path name, OR HLT_ plus the path."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true
}cern_opendata_list_reference — List Reference Vocabulary
Decode the vocabulary the other cern_opendata tools accept: experiments, record types, collision energies and types, file formats and data tiers, availability states, physics categories, LHCb magnet polarities and stripping streams and versions, identifier forms, query syntax, licensing, and the CMS run periods that have validated-run lists. Static and offline; omit topic for every table.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"topic": {
"enum": [
"experiments",
"record_types",
"collision_energies",
"collision_types",
"file_types",
"availability",
"categories",
"lhcb",
"identifiers",
"query_syntax",
"licensing",
"run_periods"
],
"type": "string",
"description": "One table to return: experiments, record_types, collision_energies, collision_types, file_types, availability, categories, lhcb, identifiers, query_syntax, licensing or run_periods. Omit for every table."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"topics"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"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": {}
},
"topics": {
"type": "array",
"items": {
"type": "object",
"required": [
"topic",
"summary",
"entries"
],
"properties": {
"topic": {
"enum": [
"experiments",
"record_types",
"collision_energies",
"collision_types",
"file_types",
"availability",
"categories",
"lhcb",
"identifiers",
"query_syntax",
"licensing",
"run_periods"
],
"type": "string",
"description": "Topic name, as accepted by the topic input."
},
"entries": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"meaning"
],
"properties": {
"value": {
"type": "string",
"description": "Exact accepted value/query form; identifiers and licensing instead name identifier forms and licensing rules."
},
"meaning": {
"type": "string",
"description": "What the value means and where it applies."
}
},
"description": "One vocabulary value.",
"additionalProperties": false
},
"description": "The values of this topic."
},
"summary": {
"type": "string",
"description": "What the table covers and how its values are matched or normalized."
}
},
"description": "One reference table.",
"additionalProperties": false
},
"description": "The requested table, or every table when topic is omitted."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true
}Prompts
0 advertised
Resources
1 advertised
cern-opendata-guide
Find CERN Open Data suitable for an analysis with cern_opendata_* tools, follow datasets into file indexes and analysis environments, and resolve CMS certification and trigger evidence. Use when a task requires connecting these records or deciding whether the returned evidence is complete.
skill://cern-opendata-guide/SKILL.mdcern-opendata-record — CERN Open Data record
One CERN Open Data Portal record's metadata by recid: description, run periods, collision and distribution details, related records, software-environment summary, license and citation, plus any variable dictionary, physics category, pile-up, keywords, and LHCb magnet polarity and stripping. File lists are not included. Tool coverage: cern_opendata_get_records.
cern-opendata://record/{recid}io.modelcontextprotocol/skills
skill://{+path}90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 605 ms
- 95th percentile latency
- 605 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 605 ms · metadata changed · 7 tool(s), 1 resource(s), 2 resource template(s), 0 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http cern-opendata-mcp-server https://cern-opendata.caseyjhand.com/mcpCodex
codex mcp add cern-opendata-mcp-server --url https://cern-opendata.caseyjhand.com/mcpCursor
{
"mcpServers": {
"cern-opendata-mcp-server": {
"url": "https://cern-opendata.caseyjhand.com/mcp"
}
}
}Cline
{
"mcpServers": {
"cern-opendata-mcp-server": {
"type": "streamableHttp",
"url": "https://cern-opendata.caseyjhand.com/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"cern-opendata-mcp-server": {
"type": "http",
"url": "https://cern-opendata.caseyjhand.com/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http cern-opendata-mcp-server https://cern-opendata.caseyjhand.com/mcpClaude Desktop
https://cern-opendata.caseyjhand.com/mcpWindsurf
{
"mcpServers": {
"cern-opendata-mcp-server": {
"serverUrl": "https://cern-opendata.caseyjhand.com/mcp"
}
}
}Let your agent find its tools
Find servers like cern-opendata-mcp-server from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.