Standards¶
Tier 1 bodies (NIST, IETF, W3C, ETSI) come with full metadata and optional full-text conversion. Tier 2 bodies (ISO, IEC, IEEE) are synced from Relaton data by scholar-mcp sync-standards; see the standards guide.
resolve_standard_identifier¶
Resolve Standard Identifier. Read-only.
Normalise a messy standard citation string to its canonical form.
Tries local regex first (fast, no network). Falls back to querying source APIs when local patterns don't match. Returns all candidates when the input is ambiguous.
A cold catalogue makes this slow: the first call after a fresh install or
a cleared cache downloads and parses each body's index, which runs well
past the soft deadline. Such a call returns a job handle to poll with
get_job_result rather than the result itself.
A warning beside a null record means the source never answered, so
the standard may well exist and the canonical form is still usable. Only a
null record with no warning means the sources looked and found
nothing.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
raw |
string |
required | Raw citation string as it appears in a paper reference. |
Returns
A mapping with canonical, body, and record when
unambiguous;
{"ambiguous": true, "candidates": [...]} when multiple matches;
{"canonical": null, "body": null, "record": null} when unresolvable.
search_standards¶
Search Standards. Read-only. Reaches outside the server.
Search technical standards by identifier, title, or free text.
Searches NIST, IETF, W3C, and ETSI. Use body to restrict to one
source body.
A cold catalogue makes this slow: the first call after a fresh install or
a cleared cache downloads and parses each body's index, which runs well
past the soft deadline. Such a call returns a job handle to poll with
get_job_result rather than the result itself.
Every answer states its own completeness. partial is always present,
and when it is true failed_bodies names each source that did not
answer and warning describes it. A partial answer is deliberately not
an error: the results that did arrive are usable, and the named bodies
may still hold matches worth asking for again.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
query |
string |
required | Identifier, title, or free text. |
body |
string \| null |
null |
Optional filter: NIST, IETF, W3C or ETSI. |
limit |
integer |
10 |
Maximum results (max 50). |
Returns
{"results": [...]}, the matching StandardRecord entries.
warning gives each failed source's HTTP status and what went wrong, such as ETSI (HTTP 200: answered with a non-JSON body, content-type: text/html): a 200 alone would read as success.
Partial answers are never cached. A later call reaches the failing source again.
get_standard¶
Get Standard. Read-only. Reaches outside the server.
Retrieve a standard by identifier (canonical or fuzzy).
Resolves fuzzy inputs (such as rfc9000 or nist 800-53) to their
canonical form before fetching. With fetch_full_text=True and
docling configured, downloads and converts the full text.
With fetch_full_text=True the docling conversion takes minutes, so
such a call returns a job handle to poll with get_job_result rather
than the record itself. Without it, and on a cache hit, the record comes
back directly.
A conversion that fails still returns the record, with the reason in
full_text_error; full_text_url is there to fetch by hand. No
full_text and no full_text_error means none was on offer, or
docling is not configured; neither is worth retrying.
NIST SP and NISTIR publications are catalogued per revision, so an
identifier with no revision, such as NIST SP 800-53, can come back
not_found even though the publication exists. search_standards
lists the revisions that are published.
not_found means the source answered and holds no such standard: stop
asking about that identifier. A lookup that never got an answer says so
instead, as rate_limited (with retryable) or upstream_error
with the status and what went wrong. Both are worth retrying: the
standard may well exist.
Full text is returned in pages of at most 20,000 characters. When
next_offset is present, call this tool again with that value as
text_offset; the cached conversion makes later pages inexpensive.
Set max_chars to null only when the client can accept the complete
document in one response.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
identifier |
string |
required | Canonical or fuzzy standard identifier. |
fetch_full_text |
boolean |
false |
If True and docling is configured, download and convert the full text PDF/HTML via docling. |
text_offset |
integer |
0 |
Character offset at which the full-text page starts. |
max_chars |
integer \| null |
20000 |
Maximum full-text characters to return, capped at 20,000. Pass null for the complete text. |
Returns
The StandardRecord, or {"error": "not_found"} if unresolvable.
With fetch_full_text=True, either full_text or
full_text_error is present.
The converted text is cached, so a later request for it is not converted again, but a call without fetch_full_text=true returns the metadata record alone, whoever fetched the text before.
When full_text is present, the response also reports text_offset,
text_returned_chars, text_total_chars, and text_truncated.
Error shapes
A lookup that never got an answer reports {"error": "rate_limited", "retryable": true} for a 429, or {"error": "upstream_error", "status": <code or null>, "detail": "..."} for anything else.
Nothing is cached on either path, so the retry is not served the failed answer.
get_sync_status¶
Get Sync Status. Read-only.
Report the last standards sync run for each standards body. Returns {"runs": [...]}, one row per body with body, upstream_ref, added, updated, unchanged, withdrawn, errors (non-fatal error strings from the latest run; empty on success), started_at and finished_at (Unix seconds). runs is empty when no sync has run yet.
Parameters
None.
Returns
The runs payload _SYNC_STATUS_DESCRIPTION describes.