Skip to main content
Glama

Server Details

Find IANA ports, MIME types, HTTP codes/fields, URI schemes, PENs, BCP 47 tags, RFCs, any registry.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.6% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/iana-registries-mcp-server
GitHub Stars
1
Server Listing
@cyanheads/iana-registries-mcp-server

TDQS

A4.3/5.0

Scored across 10 tools

Disambiguation4/5

The seven specialized lookups target clearly distinct identifier spaces (HTTP field, HTTP status, language tag, media type, PEN, port, URI scheme), and search vs. read are complementary. However, iana_get_registry_records is a generic reader that explicitly covers the same registries (http-methods, protocol-numbers, tls-parameters) as the specialized lookups, so an agent must decide between the raw-record tool and a convenience lookup for the same data.

Naming Consistency5/5

Every tool carries the same iana_ prefix and a consistent verb_noun pattern (iana_get_*, iana_lookup_*, iana_search_*). The get/lookup/search verbs are used meaningfully and predictably across the set.

Tool Count5/5

Ten tools is well within the sweet spot and each one maps to a distinct high-value IANA surface plus one generic escape hatch. Nothing feels padded or redundant in count.

Completeness4/5

Search plus a generic registry reader means essentially any IANA registry can be reached, and RFC/draft status is covered, so there are few dead ends. The tradeoff is that many common queries (DNS parameters, AS numbers, TLS parameters) require a two-step search-then-read flow rather than a direct lookup, which is a minor friction rather than a true gap.

Available Tools

10 tools
iana_get_registry_recordsRead IANA registry recordsA
Read-onlyIdempotent
Inspect

Read records from any IANA XML registry by id, e.g. registry "tls-parameters" with subregistry "tls-parameters-4" (TLS Cipher Suites), "protocol-numbers", "http-methods", or "cbor-tags"; an iana.org/assignments URL also works. Filter with value (exact match on the key column, or on the column field names; digits compare by number with a cell of digits ("0443" finds "443") and one 0x token with a one-token 0x cell ("0x5" finds "0x05"), each also matching its own kind of range row ("105-199", "0x11-0xff"); other 0x forms compare their digits as written, in any comma, space, or brace spelling) and contains (words in any field; records with a field equal to the words come first). When a registry has several sub-registries and none is given, the response lists them instead of records; a table that nests tables lists them too. Field names are the registry's XML element names (e.g. "rec" is the Recommended column). Large registries page through cursor. Find ids with iana_search_registries.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldNoColumn for value to match instead of the key column, case-insensitive, one of the names in columns: e.g. "type" for a DNS RR type mnemonic, or "name" for every row of a service name. Ignored without value.
limitNoRequested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25.
valueNoExact match on the key column named by value_field (value, else number, else the first column), or on field when set; case and whitespace are ignored. A value of digits compares exactly with a cell of digits, so "0443" finds "443", and also matches decimal range rows without precision loss, including 64-bit endpoints; it never matches a 0x cell. One 0x token compares by number with a one-token 0x cell, so "0x5" finds "0x05", and also matches range rows such as "0x11-0xff". Any other pair of 0x forms compares the digits as written: "0x1301", "{0x13,0x01}", and "0x13 0x01" all find "0x13,0x01", while "0x13" never finds "0x00,0x13".
cursorNonext_cursor from the previous page; reuse it only with the same registry, subregistry, value, field, and contains.
containsNoWords matched as whole tokens against every field and reference id, e.g. "chacha20". Records with a field equal to the words come first.
registryYesRegistry id, e.g. "tls-parameters", or its https://www.iana.org/assignments/<id> URL (a #fragment selects the sub-registry when subregistry is unset).
subregistryNoSub-registry id, case-insensitive, e.g. "tls-parameters-4". Omit to read the only sub-registry, or to list them when there are several.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied.
errorNoPresent when the call failed. Absent on success.
notesNoNotes of the table read (of the registry, when listing), first page only. With registry_notes: the first 25 and 4,000 characters at most, these first.
shownNoResults returned.
noticeNoGuidance on a miss, a cut list, or another condition.
offsetNoMatching records before this page, on pages after the first.
sourceNoProvenance and freshness of the answer.
columnsNoField (XML element) names seen, first-seen order, the first 50.
recordsNoRecords in registry order (with contains, records with a field equal to the words first), up to limit and a 48,000-character page budget.
truncatedNoTrue when more matches exist than were returned.
referencesNoThe documents that define the table read, the first 25.
totalCountNoMatches before the limit was applied.
descriptionNoDescription of the table read, or of the registry when listing; a YANG module registry names its module file here. At most 2,000 characters.
next_cursorNoPass as cursor, with the same filters, for the next page.
registry_idNoRegistry id.
value_fieldNoThe table's key column: each record's value comes from it, and the value filter matches it unless field names another.
subregistriesNoTables to read next, the first 250: every sub-registry when one must be chosen (records is then empty), or the tables nested directly in the table read, on its first page.
registry_notesNoThe registry root's notes and footnotes, on the first page of a sub-registry read; records cite them by anchor. Shares the notes caps, after notes.
registry_titleNoRegistry title.
subregistry_idNoId of the sub-registry the records come from.
effective_limitNoThe response limit after clamping, present when clamped.
notes_truncatedNoTrue when notes or registry_notes were cut at 4,000 characters.
requested_limitNoThe requested limit, present when clamped.
subregistry_titleNoTitle of that sub-registry.
registration_rangesNoAllocation ranges, when the table defines them: the first 25, each text at most 2,000 characters.
registration_procedureNoRegistration rule of the table read, or of the registry when listing; at most 2,000 characters.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/openWorld, so the bar is lower, yet the description adds real behavior: an ambiguous multi-subregistry request returns a list rather than records, nested tables list rather than expand, and large registries page via cursor. These are non-obvious runtime traits that annotations do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and there is no filler, but the single value-matching sentence is a deeply nested, hard-to-parse parenthetical that duplicates the schema's own exhaustive value semantics, inflating length without adding proportionate value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters, complex filtering semantics, and an existing output schema, the description supplies the key non-schema behavior an agent needs (sub-registry fallback to a list, nesting behavior, pagination). Return-value formatting is rightly left to the output schema, so coverage is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's detailed value-matching rules (digit vs 0x comparison, range rows) largely restate what the schema already documents, and it adds only marginal extras like the 'rec = Recommended column' convention.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read records from any IANA XML registry by id') with concrete examples (tls-parameters, protocol-numbers). It also distinguishes itself from the sibling iana_search_registries by naming it as the id-discovery path, so an agent can tell the two apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative for id discovery ('Find ids with iana_search_registries') and explains the alternative flow when multiple sub-registries exist (listing instead of records). It does not, however, contrast itself against the many iana_lookup_* siblings, so the when-to-use picture is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iana_get_rfc_statusGet RFC, Internet-Draft, and series statusA
Read-onlyIdempotent
Inspect

Get the current status of up to ten distinct RFCs, Internet-Drafts, or BCP/STD/FYI series per page from up to 1,000 input items. Canonical aliases resolve once. When more remain, deferred_ids previews the next ten, deferred_count counts the whole remainder, and next_ids_offset continues the same original ids. Retry failed ids separately. Accepts "RFC 9110", "rfc9110", "9110", draft names with or without a revision suffix ("draft-ietf-httpbis-semantics-19"), series numbers ("BCP 14"), RFC and draft file names ("rfc9110.txt"), the URL of an RFC or draft on datatracker.ietf.org, tools.ietf.org, or ietf.org or of an RFC on rfc-editor.org, and a series URL at rfc-editor.org/info/ or datatracker.ietf.org/doc/ ("https://datatracker.ietf.org/doc/bcp14/"). RFCs return current and as-published status, stream, working group, obsoletes/obsoleted-by and updates/updated-by relations, the series they belong to, and the errata page; drafts return their state, IESG state, intended status, expiry, the document that replaced them, and the RFC they became; a series returns its member RFCs. Unknown ids return found: false. A call makes at most 20 Datatracker requests, retries included (an RFC or a series needs one, plus one per call for the RFCs' series; a draft three, or four with a revision suffix): each id is taken in request order if its requests still fit, and the others come back in failed with reason request_limit, to pass in another call.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesUp to 1,000 normalized nonblank RFC, Internet-Draft, or series items; aliases are canonically deduplicated before selecting ten distinct ids. One comma-, semicolon-, or newline-separated string is also accepted. Resubmit the same ids with next_ids_offset as ids_offset to continue.
ids_offsetNoNumber of canonically distinct ids to skip, default 0. Pass next_ids_offset with the same original ids to continue; retry failed ids separately.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
failedNoIds whose lookup failed upstream or was cut by the call's request limit; the rest of the batch still answered.
noticeNoSet when ids were left unresolved at the call's Datatracker request limit, or when Datatracker fields (stream and group, or series membership) were unavailable for some RFCs.
documentsNoOne entry per distinct requested id, in request order, excluding ids in failed.
total_idsNoTotal canonically distinct ids before ids_offset and the ten-id batch limit.
deferred_idsNoPreview of the next at most ten canonical ids, not the entire remainder; no upstream work started for these ids.
deferred_countNoAll distinct ids remaining after this selected batch, including ids beyond the preview.
deferred_reasonNoMore distinct ids remain beyond the ten-id batch limit.
next_ids_offsetNoPass as ids_offset with the same original ids to resolve the next batch; absent at or past the end.
deferred_guidanceNoHow to continue the original id list and retry selected failed ids separately.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Drops the annotation bar and goes well past it: a hard budget of 20 Datatracker requests per call, per-id request costs (1 for an RFC/series plus one for its series, 3-4 for a draft), the request-order allocation rule, and the request_limit failure reason for the remainder. It also discloses unknown ids return found: false and that canonical aliases resolve once, which an agent needs to predict behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core operation and the pagination trio before the long input-format inventory, and every sentence carries information. It is dense and the accepted-format examples partly duplicate the schema's items description, keeping it short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with pagination, request budgeting, and alias resolution, the description covers continuation, failure semantics, and return shape (RFC vs draft vs series fields). With an output schema present it did not need to explain returns, yet the extra detail is accurate and useful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real semantics: canonical alias deduplication before selecting ten distinct ids, the exact continuation contract between next_ids_offset and ids_offset, and the one-string comma/semicolon/newline form. The accepted-id-format list is largely mirrored in the schema, so it does not push higher.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: get the current status of RFCs, Internet-Drafts, or BCP/STD/FYI series. The scope is far from the sibling lookup tools (registries, media types, ports, HTTP fields), so no ambiguity arises about which tool handles document status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational guidance: how to paginate with deferred_ids/deferred_count/next_ids_offset, and to retry failed ids separately with the same original ids. It does not explicitly name alternatives or exclusions, but no sibling overlaps this resource, so the missing step is minor.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iana_lookup_http_fieldLook up an HTTP field nameA
Read-onlyIdempotent
Inspect

Look up a registered HTTP field (header or trailer) name. Pass exactly one of name (case-insensitive, e.g. "Cache-Status") or keyword (words matched against field names and comments). Returns the registration status — permanent, provisional, deprecated, or obsoleted — the Structured Field type when registered, and the defining reference. Many widely used headers are unregistered; a miss means only that IANA has no entry.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoExact field name, case-insensitive, e.g. "Content-Type" (a trailing ":" is ignored). Pass this or keyword, not both.
limitNoRequested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25.
offsetNoNumber of keyword matches to skip; pass the next_offset of the previous response to get the next page. Default 0.
statusNoKeep only fields with this registration status. Applies to both modes.
keywordNoWords matched as whole tokens against field names and registry comments, e.g. "cache". Pass this or name, not both.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied.
modeNoWhich lookup ran.
errorNoPresent when the call failed. Absent on success.
foundNoTrue when a registered field matched.
shownNoResults returned.
fieldsNoMatching fields: exact name hits first, then registry order.
noticeNoGuidance on a miss, a cut list, or another condition.
sourceNoProvenance and freshness of the answer.
truncatedNoTrue when more matches exist than were returned.
totalCountNoMatches before the limit was applied.
next_offsetNoPass as offset for the next page; absent on the last.
effective_limitNoThe response limit after clamping, present when clamped.
requested_limitNoThe requested limit, present when clamped.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds real behavioral context beyond that: the expected return shape (registration status, Structured Field type, defining reference) and the important negative-result caveat that a miss only means IANA has no entry rather than that the header is invalid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the purpose before the parameter contract, and each sentence carries distinct load: what it does, how to call it, what comes back, and how to read a negative result. Nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't enumerate return fields, yet it still previews them usefully. It covers mode selection, status filtering, and the false-negative caveat; pagination and limit clamping are left entirely to the schema, which is acceptable but leaves the description one notch short of fully self-contained for a multi-mode lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each of the five parameters is already documented in the schema, including the name/keyword mutual exclusion, case-insensitivity, keyword token matching, and the limit clamping behavior. The description largely restates these, adding the concrete example "Cache-Status" but no syntax or semantics not already present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Look up a registered HTTP field name") and scopes it precisely to header/trailer field names, which distinguishes it from siblings like iana_lookup_http_status, iana_lookup_media_type, and iana_lookup_uri_scheme. An agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit invocation guidance ("Pass exactly one of `name` ... or `keyword`") and a clear condition for the keyword mode ("words matched against field names and comments"). It stops short of naming alternate sibling tools for when the caller actually wants status codes, language tags, or registry browsing, so it is clear context without explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iana_lookup_http_statusLook up an HTTP status codeA
Read-onlyIdempotent
Inspect

Look up an HTTP status code in the IANA registry, or search reason phrases. Pass exactly one of code (100–599) or keyword (e.g. "too many"). Returns the registered phrase, its class, defining reference with section, and whether it is temporary, obsoleted, or unused; an unassigned code returns found: false with the unassigned range it falls in.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoStatus code to look up, 100–599 (a digit string such as "429" also works). Pass this or keyword, not both.
limitNoRequested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25.
offsetNoNumber of keyword matches to skip; pass the next_offset of the previous response to get the next page. Default 0.
keywordNoWords matched as whole tokens against registered reason phrases, e.g. "too many" or "gateway". Pass this or code, not both.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied.
modeNoWhich lookup ran.
errorNoPresent when the call failed. Absent on success.
foundNoTrue when a registered status matched.
shownNoResults returned.
noticeNoGuidance on a miss, a cut list, or another condition.
sourceNoProvenance and freshness of the answer.
statusesNoMatching status codes: exact phrase hits first, then registry order.
truncatedNoTrue when more matches exist than were returned.
totalCountNoMatches before the limit was applied.
next_offsetNoPass as offset for the next page; absent on the last.
effective_limitNoThe response limit after clamping, present when clamped.
requested_limitNoThe requested limit, present when clamped.
unassigned_rangeNoFor an unassigned code, the registry range it falls in, e.g. "432-450".

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description adds genuine behavioral context beyond that: the fields returned (phrase, class, reference with section, temporary/obsoleted/unused flags) and the not-found behavior ('found: false with the unassigned range it falls in'). Since an output schema exists, this return detail is partly redundant, capping it at 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense but well-front-loaded sentence: the primary action and mode selection come first, then the return shape. No filler sentences, though the packed return-value clause makes it heavier than strictly necessary given an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-param, no-required-param lookup with a full output schema, the description covers everything an agent needs: the two mutually exclusive input modes, the valid code range, and the not-found semantics. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents the code/keyword mutual exclusivity, ranges, and the limit clamping behavior. The description largely restates this ('Pass exactly one of code or keyword', the 100–599 range, the 'too many' example), adding little the schema does not already carry. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (look up / search) and resource (HTTP status code in the IANA registry, reason phrases), with the dual mode (code vs keyword) made explicit. This clearly distinguishes it from siblings like iana_lookup_http_field, iana_lookup_port, and iana_get_registry_records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear selection rule: 'Pass exactly one of `code` (100–599) or `keyword`'. This tells the agent when each input mode applies. However, it never names a sibling alternative or states when NOT to use this tool (e.g. vs. iana_search_registries), so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iana_lookup_language_tagValidate a BCP 47 language tagA
Read-onlyIdempotent
Inspect

Parse and validate a BCP 47 language tag against the IANA Language Subtag Registry, or search subtags by description. Pass exactly one of tag (e.g. "zh-Hant-TW", "sr-Latn", "en_US") or description (e.g. "Swiss German"). A tag is split into language, extlang, script, region, variant, extension, and private-use parts; deprecated subtags report their preferred value, and a canonical tag is returned when valid. Extension singleton allocation and defining RFCs are optional metadata; allocation never validates extension content or changes base validity. A single subtag registered under several types (e.g. "TW") lists the other types.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoA language tag to validate, e.g. "zh-Hant-TW", "sr-Latn", "i-klingon". Underscores are read as hyphens ("en_US" → "en-US"); matching ignores case. Pass this or description, not both.
limitNoRequested description matches, 1–1,000,000, clamped to 100 with requested_limit and effective_limit disclosed. Default 25. Tag mode always returns every part of the tag.
offsetNoNumber of description matches to skip; pass the next_offset of the previous response to get the next page. Default 0.
descriptionNoWords matched as whole tokens against subtag descriptions, e.g. "Swiss German" or "Cyrillic". Pass this or tag, not both.
subtag_typeNoDescription mode only: return only records of this Type.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied.
modeNoWhich lookup ran.
errorNoPresent when the call failed. Absent on success.
shownNoResults returned.
validNoTag mode: true when well-formed, every subtag is registered and correctly placed, and no variant or singleton repeats.
issuesNoTag mode: findings; empty for a clean tag.
noticeNoGuidance on a miss, a cut list, or another condition.
sourceNoProvenance and freshness of the answer.
matchesNoDescription mode: matching records, exact description matches first, then registry order.
subtagsNoTag mode: the parts in order, after any whole-tag record; parsing stops at the first part the syntax cannot place.
tag_inputNoTag mode: the tag as read, after underscores became hyphens.
truncatedNoTrue when more matches exist than were returned.
totalCountNoMatches before the limit was applied.
next_offsetNoPass as offset for the next page; absent on the last.
well_formedNoTag mode: true when the tag follows RFC 5646 syntax or is grandfathered.
canonical_tagNoTag mode, valid tags only: canonical form (preferred values applied, variant collisions deduplicated, registered heploc context normalized, extlang reduced, case normalized).
effective_limitNoThe response limit after clamping, present when clamped.
requested_limitNoThe requested limit, present when clamped.
extension_sourceNoProvenance of the allocation registry copy; absent when unavailable or no extensions were read.
also_registered_asNoTag mode, single-subtag input: records of other types under the same subtag, e.g. region "TW" beside language "tw".

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnlyHint/openWorldHint/idempotentHint) by disclosing result behavior: tag is decomposed into language/extlang/script/region/variant/extension/private-use parts, deprecated subtags report a preferred value, a canonical tag is returned when valid, and extension singleton allocation "never validates extension content or changes base validity." It also notes that a subtag registered under several types (e.g. "TW") lists the other types, which is genuinely useful runtime context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and mode split, then layered with progressively finer behavioral detail. The later sentences are dense and pack several facts each (allocation semantics, multi-type subtags), which is efficient but slightly heavy for a description of this length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't document returns, yet it still explains the shape of the result (canonical tag, decomposed parts, deprecated preferred-value) and the nuance that extension metadata is optional and non-validating. Combined with annotations covering the safety profile and a fully documented schema, nothing needed to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description still adds framing beyond the schema by tying each parameter to a mode and clarifying that tag mode always returns every part of the tag while description mode is the searchable/paginatable path. It does not add new syntax or format detail not already present in the parameter descriptions, so it stays short of 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb pair and resource: "Parse and validate a BCP 47 language tag against the IANA Language Subtag Registry, or search subtags by description." The dual mode (validate a tag vs. search by description) is explicit, and the tool name plus scope make it immediately distinguishable from sibling lookup tools such as iana_lookup_media_type or iana_lookup_uri_scheme.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Pass exactly one of `tag` ... or `description`" gives unambiguous mode-selection guidance and is reinforced by examples for each mode. It does not, however, name alternatives or any when-not condition relative to sibling lookup tools, so an agent gets clear context but no explicit routing exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iana_lookup_media_typeLook up a media typeA
Read-onlyIdempotent
Inspect

Look up registered media (MIME) types. Pass exactly one of type (a full name such as "application/json"; parameters after ";" are ignored) or keyword (words matched against registered type names and status annotations, e.g. "geo json"; never against file extensions). An exact type lookup also reads the registration template and returns its file-extension, intended-usage, and deprecated-alias statements as written, each only when the template has it. Some registered types have no registration template (template.available: false); their references are the defining documents. Deprecated and obsoleted types are reported with their replacement when the registry names one. Unregistered "x-" types are not in the registry.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFull media type, case-insensitive, e.g. "application/json" ("; charset=utf-8" and other parameters are dropped). Pass this or keyword, not both.
limitNoRequested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25.
offsetNoNumber of keyword matches to skip; pass the next_offset of the previous response to get the next page. Default 0.
keywordNoWords matched as whole tokens against registered type names and status annotations, e.g. "geo json". File extensions are not searched: look up the expected type with type to read its template's file-extension statement, when the template has one. Pass this or type, not both.
top_levelNoKeep only types under this top-level type, e.g. "image". Keyword mode only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied.
modeNoWhich lookup ran.
errorNoPresent when the call failed. Absent on success.
foundNoTrue when a registered media type matched.
shownNoResults returned.
noticeNoGuidance on a miss, a cut list, or another condition.
sourceNoProvenance and freshness of the answer.
truncatedNoTrue when more matches exist than were returned.
totalCountNoMatches before the limit was applied.
media_typesNoMatching media types: exact name hits first, then registry order.
next_offsetNoPass as offset for the next page; absent on the last.
effective_limitNoThe response limit after clamping, present when clamped.
normalized_typeNoType mode: the type looked up, lowercased, parameters removed.
requested_limitNoThe requested limit, present when clamped.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld/idempotent, so the safety profile is covered. The description adds genuine behavioral context beyond them: exact `type` lookups read the registration template, some types lack templates (`template.available: false`), and deprecated/obsoleted types are reported with replacements. This is substantive disclosure, not restatement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the verb and the mode choice, and every sentence carries information (template behavior, deprecation reporting, x- exclusion). It is dense and slightly long, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A read-only lookup with an output schema and full annotation coverage needs less from the description, and this one still covers template availability, deprecated replacements, and keyword matching limits. Nothing essential for correct invocation appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description reinforces the mutually-exclusive type/keyword semantics and the ';'-suffix stripping rule, but these points are already stated in the schema property descriptions, so it adds little new parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Look up registered media (MIME) types') and is clearly distinguishable from siblings like iana_lookup_http_field or iana_lookup_uri_scheme. An agent can identify the target registry without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit mode selection ('Pass exactly one of type or keyword'), describes what keyword does and does not match ('never against file extensions'), and states a when-not case (unregistered 'x-' types are not in the registry). It stops short of naming a sibling as an alternative, so it does not reach a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iana_lookup_penLook up a Private Enterprise NumberA
Read-onlyIdempotent
Inspect

Look up a Private Enterprise Number (PEN). Pass exactly one of pen (a number such as 32473, or an OID under 1.3.6.1.4.1 such as 1.3.6.1.4.1.32473.1.2) or organization (words matched against organization names). Returns the organization and its OID prefix. Arcs below the enterprise number are assigned by the enterprise, not IANA. Contact details are not returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
penNoEnterprise number, e.g. "32473", or an OID under 1.3.6.1.4.1 naming it, e.g. "1.3.6.1.4.1.32473.1.2" (a leading dot and the iso.org.dod.internet.private.enterprise prefix are accepted). Pass this or organization, not both.
limitNoRequested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25.
offsetNoNumber of organization matches to skip; pass the next_offset of the previous response to get the next page. Default 0.
organizationNoWords matched as whole tokens against the names of assigned entries, e.g. "cisco systems"; look up a number with pen to see a reserved or unassigned one. Pass this or pen, not both.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied.
modeNoWhich lookup ran.
errorNoPresent when the call failed. Absent on success.
foundNoTrue when a returned number is assigned to an organization.
shownNoResults returned.
noticeNoGuidance on a miss, a cut list, or another condition.
sourceNoProvenance and freshness of the answer.
sub_arcsNoArcs below the enterprise number, e.g. "1.2"; the enterprise assigns these.
truncatedNoTrue when more matches exist than were returned.
totalCountNoMatches before the limit was applied.
enterprisesNoMatching entries: exact organization-name hits first, then number order.
next_offsetNoPass as offset for the next page; absent on the last.
requested_oidNoThe OID as requested, when it named arcs below the enterprise number.
effective_limitNoThe response limit after clamping, present when clamped.
requested_limitNoThe requested limit, present when clamped.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description still adds real behavior beyond them: what is returned (organization and OID prefix), what is explicitly not returned (contact details), and the scope boundary that sub-arcs are enterprise-assigned rather than IANA-assigned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and resource, then the input constraint, then return semantics and caveats in a compact block. The input-selection sentence partially duplicates the schema's own "Pass this or organization, not both" wording, which is the only real slack.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description does not need to enumerate return fields, and annotations carry the safety profile. What remains — how to supply the identifier, mutual exclusivity, the scope caveat about enterprise-assigned arcs, and the absence of contact data — is exactly the residual an agent needs to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the pen pattern, the OID example, the mutual exclusivity, and the limit clamping behavior in more detail than the description. The description's restatement of the either/or constraint and the OID example adds no meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (look up) and a precisely named resource (Private Enterprise Number), with the canonical form and both accepted input shapes. It is immediately distinguishable from siblings such as iana_lookup_port, iana_lookup_media_type, or iana_lookup_uri_scheme, which target entirely different registries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Pass exactly one of pen ... or organization" gives explicit selection guidance between the two input modes, and the note that arcs below the enterprise number are assigned by the enterprise rather than IANA implicitly warns against using this tool to resolve sub-arcs. It stops short of naming an alternative tool for those cases, so it is clear context without full when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iana_lookup_portLook up a port assignmentA
Read-onlyIdempotent
Inspect

Look up IANA service name and transport protocol port assignments. Pass exactly one of port (a number, 0–65535), service (an exact service name such as "postgresql"), or keyword (words matched against service names and descriptions). Results list every transport (tcp, udp, sctp, dccp) separately, report the registry range row containing an unassigned port, and classify the port as System (0–1023), User (1024–49151), or Dynamic/Private (49152–65535). Service names registered without a port (DNS-SD names) appear with no port.

ParametersJSON Schema
NameRequiredDescriptionDefault
portNoPort number, 0–65535 (a digit string such as "443" also works). Returns every row for that port plus the range row containing it. Pass exactly one of port, service, or keyword.
limitNoRequested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25.
offsetNoNumber of keyword matches to skip; pass the next_offset of the previous response to get the next page. Default 0.
keywordNoWords matched as whole tokens against service names and descriptions, e.g. "network time". Pass exactly one of port, service, or keyword.
serviceNoExact service name, case-insensitive, up to 15 characters, e.g. "postgresql" or "whois++". Pass exactly one of port, service, or keyword.
transportNoKeep only rows for this transport protocol. Rows without a transport (most range rows and every service name without a port) are always kept. Applies to every mode.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied.
modeNoWhich lookup ran.
errorNoPresent when the call failed. Absent on success.
foundNoTrue when a returned row has a registered service name.
shownNoResults returned.
noticeNoGuidance on a miss, a cut list, or another condition.
sourceNoProvenance and freshness of the answer.
truncatedNoTrue when more matches exist than were returned.
port_classNoPort mode: the requested port's class.
totalCountNoMatches before the limit was applied.
assignmentsNoMatching rows. Port mode: exact rows, then range rows containing the port. Other modes: ascending by port, port-less rows last.
next_offsetNoPass as offset for the next page; absent on the last.
effective_limitNoThe response limit after clamping, present when clamped.
requested_limitNoThe requested limit, present when clamped.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), so the bar is lower, and the description adds genuine behavioral context: results are split per transport, unassigned ports return the containing registry range row, ports are bucketed into System/User/Dynamic ranges, and DNS-SD names appear portless. Some of this overlaps the output schema, which limits it to a 4 rather than a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, then the mutually exclusive inputs, then result semantics. No filler, no restatement of the title, and the edge cases (unassigned ports, DNS-SD) are compressed into single clauses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema, 100% schema coverage, and full annotations, the description only needs to carry selection and scoping information, which it does: three modes, transport behavior, and the port-classification semantics. Nothing an agent needs in order to choose and call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter already documents its own constraints (limit clamping, offset paging, transport filtering, mutual exclusivity). The description's restatement of the 'exactly one of' rule and keyword matching adds nothing the schema does not already say, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with a specific verb+resource ('Look up IANA service name and transport protocol port assignments'), which is immediately distinguishable from siblings that look up media types, http fields, language tags, or PENs. The three lookup modes and the result shape are stated up front, so an agent can identify the tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear invocation routing: exactly one of `port`, `service`, or `keyword`, with an example value for each mode ('postgresql', 'network time'). It does not, however, state when to prefer this tool over siblings such as iana_search_registries or explain what happens if zero or multiple mode parameters are supplied, so it falls short of explicit when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iana_lookup_uri_schemeLook up a URI schemeA
Read-onlyIdempotent
Inspect

Look up a registered URI scheme. Pass exactly one of scheme (e.g. "mailto"; a trailing ":" or "://" is ignored) or keyword (words matched against scheme names and descriptions). Returns the status — permanent, provisional, or historical — description, references, and well-known URI support.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRequested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25.
offsetNoNumber of keyword matches to skip; pass the next_offset of the previous response to get the next page. Default 0.
schemeNoExact scheme name, case-insensitive, e.g. "https" (a trailing ":" or "://" is ignored). Pass this or keyword, not both.
statusNoKeep only schemes with this registration status. Applies to both modes.
keywordNoWords matched as whole tokens against scheme names and descriptions, e.g. "websocket". Pass this or scheme, not both.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied.
modeNoWhich lookup ran.
errorNoPresent when the call failed. Absent on success.
foundNoTrue when a registered scheme matched.
shownNoResults returned.
noticeNoGuidance on a miss, a cut list, or another condition.
sourceNoProvenance and freshness of the answer.
schemesNoMatching schemes: exact scheme hits first, then registry order.
truncatedNoTrue when more matches exist than were returned.
totalCountNoMatches before the limit was applied.
next_offsetNoPass as offset for the next page; absent on the last.
effective_limitNoThe response limit after clamping, present when clamped.
requested_limitNoThe requested limit, present when clamped.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/openWorld, so the bar is lower, and the description usefully adds the input-normalization behavior (a trailing ":" or "://" is ignored) and previews the returned fields. It doesn't discuss pagination limits or result-count behavior, which would have pushed it higher.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the purpose, then the invocation rule, then the return context. No filler and nothing important buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained in depth, and the annotations cover the safety profile. Combined with a 100%-documented parameter schema, the description supplies everything else an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit, offset, status, scheme and keyword are all already documented with ranges, defaults and mutual-exclusion notes; baseline 3 applies. The description restates the scheme/keyword exclusivity and the normalization rule but adds nothing the schema does not already carry.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Look up a registered URI scheme") that immediately separates it from the other iana_lookup_* siblings by resource type. It also names both lookup modes (exact scheme vs keyword), so an agent knows what the tool covers without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete selection rule — "Pass exactly one of `scheme` ... or `keyword`" — which tells the agent how to choose the mode. It does not, however, say when to prefer this over iana_search_registries for broader queries, so the alternative-routing is left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iana_search_registriesSearch IANA registriesA
Read-onlyIdempotent
Inspect

Find IANA protocol registries and sub-registries by keyword over their titles and protocol categories, e.g. "tls cipher", "dns resource record", "protocol numbers". Returns the registry and sub-registry ids that iana_get_registry_records reads, with registration procedure and defining documents. Covers every registry linked from the IANA protocol registries index.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRequested maximum results, 1–1,000,000; values above 50 are clamped to 50 and disclosed as requested_limit and effective_limit. Default 15.
queryYesWords matched as whole tokens, singular or plural, against registry titles, categories, and ids, e.g. "tls cipher". An exact registry or sub-registry id ranks first, then the closest titles.
offsetNoNumber of matches to skip; pass the next_offset of the previous response to get the next page. Default 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied.
errorNoPresent when the call failed. Absent on success.
shownNoResults returned.
noticeNoGuidance on a miss, a cut list, or another condition.
sourceNoProvenance and freshness of the answer.
truncatedNoTrue when more matches exist than were returned.
registriesNoMatching index entries: exact id hits first, then the closest titles.
totalCountNoMatches before the limit was applied.
next_offsetNoPass as offset for the next page; absent on the last.
effective_limitNoThe response limit after clamping, present when clamped.
requested_limitNoThe requested limit, present when clamped.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly, idempotent, and openWorld, so the safety profile is handled. The description adds genuinely useful behavioral context beyond the annotations: it states the output includes registry/sub-registry ids plus registration procedure and defining documents, and asserts full coverage of the IANA protocol registries index.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences that are front-loaded with the core action and resource, then scope, then output/workflow. Every sentence contributes, though the keyword examples and coverage claim make it slightly longer than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and 100% parameter coverage, the description need not explain return values. It supplies the scope and the relationship to iana_get_registry_records, which is the remaining value-add; only explicit sibling differentiation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters (query, limit, offset) are already documented, including token matching and pagination behavior. The description's example queries reinforce the schema but add no syntax or format detail beyond it, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Find') and resource ('IANA protocol registries and sub-registries'), and explicitly scopes the search to titles and protocol categories with concrete examples. It also distinguishes itself from the sibling iana_get_registry_records by explaining that this tool produces the ids that tool consumes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly names the downstream consumer iana_get_registry_records, implying a search-then-fetch workflow so an agent knows why to call it. However, it does not explicitly contrast itself with the many lookup siblings (e.g. iana_lookup_port), leaving some routing inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updates
    • Changediana_get_registry_records5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return, 1–100. Default 25."New value: +"Requested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +1000000
      • changedInput schema / properties / value / description
        Previous value: -"Exact match on the key column named by value_field (value, else number, else the first column), or on field when set; case and whitespace are ignored. A value of digits compares by number with a cell of digits, so \"0443\" finds \"443\", and also matches range rows such as \"105-199\"; it never matches a 0x cell. One 0x token compares by number with a one-token 0x cell, so \"0x5\" finds \"0x05\", and also matches range rows such as \"0x11-0xff\". Any other pair of 0x forms compares the digits as written: \"0x1301\", \"{0x13,0x01}\", and \"0x13 0x01\" all find \"0x13,0x01\", while \"0x13\" never finds \"0x00,0x13\"."New value: +"Exact match on the key column named by value_field (value, else number, else the first column), or on field when set; case and whitespace are ignored. A value of digits compares exactly with a cell of digits, so \"0443\" finds \"443\", and also matches decimal range rows without precision loss, including 64-bit endpoints; it never matches a 0x cell. One 0x token compares by number with a one-token 0x cell, so \"0x5\" finds \"0x05\", and also matches range rows such as \"0x11-0xff\". Any other pair of 0x forms compares the digits as written: \"0x1301\", \"{0x13,0x01}\", and \"0x13 0x01\" all find \"0x13,0x01\", while \"0x13\" never finds \"0x00,0x13\"."
      • addedOutput schema / properties / effective_limit
        Added value: +{
        +  "description": "The response limit after clamping, present when clamped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / requested_limit
        Added value: +{
        +  "description": "The requested limit, present when clamped.",
        +  "type": "number"
        +}
    • Changediana_get_rfc_status10 fields changed
      • changedInput schema / properties / ids / description
        Previous value: -"Up to 10 RFCs, Internet-Drafts, or series, e.g. [\"RFC 9110\", \"BCP 14\", \"draft-ietf-httpbis-semantics-19\"]. One comma-, semicolon-, or newline-separated string is also accepted."New value: +"Up to 1,000 normalized nonblank RFC, Internet-Draft, or series items; aliases are canonically deduplicated before selecting ten distinct ids. One comma-, semicolon-, or newline-separated string is also accepted. Resubmit the same ids with next_ids_offset as ids_offset to continue."
      • changedInput schema / properties / ids / maxItems
        Previous value: -10New value: +1000
      • addedInput schema / properties / ids_offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of canonically distinct ids to skip, default 0. Pass next_ids_offset with the same original ids to continue; retry failed ids separately.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "documents",
        -      "failed"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "total_ids",
        +      "deferred_ids",
        +      "deferred_count",
        +      "documents",
        +      "failed"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / deferred_count
        Added value: +{
        +  "description": "All distinct ids remaining after this selected batch, including ids beyond the preview.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / deferred_guidance
        Added value: +{
        +  "description": "How to continue the original id list and retry selected failed ids separately.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / deferred_ids
        Added value: +{
        +  "description": "Preview of the next at most ten canonical ids, not the entire remainder; no upstream work started for these ids.",
        +  "items": {
        +    "description": "One canonical id.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / deferred_reason
        Added value: +{
        +  "const": "batch_limit",
        +  "description": "More distinct ids remain beyond the ten-id batch limit.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_ids_offset
        Added value: +{
        +  "description": "Pass as ids_offset with the same original ids to resolve the next batch; absent at or past the end.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / total_ids
        Added value: +{
        +  "description": "Total canonically distinct ids before ids_offset and the ten-id batch limit.",
        +  "type": "number"
        +}
    • Changediana_lookup_http_field4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return, 1–100. Default 25."New value: +"Requested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +1000000
      • addedOutput schema / properties / effective_limit
        Added value: +{
        +  "description": "The response limit after clamping, present when clamped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / requested_limit
        Added value: +{
        +  "description": "The requested limit, present when clamped.",
        +  "type": "number"
        +}
    • Changediana_lookup_http_status4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return, 1–100. Default 25."New value: +"Requested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +1000000
      • addedOutput schema / properties / effective_limit
        Added value: +{
        +  "description": "The response limit after clamping, present when clamped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / requested_limit
        Added value: +{
        +  "description": "The requested limit, present when clamped.",
        +  "type": "number"
        +}
    • Changediana_lookup_language_tag7 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of description matches to return, 1–100. Default 25. Tag mode always returns every part of the tag."New value: +"Requested description matches, 1–1,000,000, clamped to 100 with requested_limit and effective_limit disclosed. Default 25. Tag mode always returns every part of the tag."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +1000000
      • changedOutput schema / properties / canonical_tag / description
        Previous value: -"Tag mode, valid tags only: canonical form (preferred values applied, extlang reduced, case normalized)."New value: +"Tag mode, valid tags only: canonical form (preferred values applied, variant collisions deduplicated, registered heploc context normalized, extlang reduced, case normalized)."
      • addedOutput schema / properties / effective_limit
        Added value: +{
        +  "description": "The response limit after clamping, present when clamped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / extension_source
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Provenance of the allocation registry copy; absent when unavailable or no extensions were read.",
        +  "properties": {
        +    "fetched_at": {
        +      "description": "ISO 8601 time of the last successful fetch or revalidation.",
        +      "type": "string"
        +    },
        +    "registry_id": {
        +      "description": "Id of the registry file that answered.",
        +      "type": "string"
        +    },
        +    "registry_updated": {
        +      "description": "The registry's own last-updated date; absent for the protocol index.",
        +      "type": "string"
        +    },
        +    "stale": {
        +      "description": "True when a refresh failed and a cached copy up to 7 days old answered.",
        +      "type": "boolean"
        +    },
        +    "url": {
        +      "description": "The file fetched from iana.org.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "registry_id",
        +    "url",
        +    "fetched_at",
        +    "stale"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / requested_limit
        Added value: +{
        +  "description": "The requested limit, present when clamped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / subtags / items / properties / extension
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional extension allocation metadata, independent of base tag validity.",
        +  "properties": {
        +    "allocation": {
        +      "description": "Singleton allocation only; never validation of extension content.",
        +      "enum": [
        +        "allocated",
        +        "unallocated",
        +        "unavailable"
        +      ],
        +      "type": "string"
        +    },
        +    "authority": {
        +      "description": "The registry authority organization; no contacts.",
        +      "type": "string"
        +    },
        +    "descriptions": {
        +      "description": "Allocated extension descriptions, empty otherwise.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "guidance": {
        +      "description": "How to interpret allocation and validate extension content, or retry unavailable metadata.",
        +      "type": "string"
        +    },
        +    "references": {
        +      "description": "Defining RFCs, empty when allocation is unknown or unallocated.",
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "A defining reference.",
        +        "properties": {
        +          "id": {
        +            "description": "E.g. \"RFC 9110\", a draft name, a registry id, or a URL.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "Label text, when it adds to id and section.",
        +            "type": "string"
        +          },
        +          "section": {
        +            "description": "Section, e.g. \"15.5.5\".",
        +            "type": "string"
        +          },
        +          "type": {
        +            "description": "Reference kind.",
        +            "enum": [
        +              "rfc",
        +              "draft",
        +              "uri",
        +              "registry",
        +              "rfc-errata",
        +              "note",
        +              "text"
        +            ],
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "URL of the reference.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "type",
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "singleton": {
        +      "description": "The extension singleton, e.g. u or t.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "singleton",
        +    "allocation",
        +    "descriptions",
        +    "references",
        +    "guidance"
        +  ],
        +  "type": "object"
        +}
    • Changediana_lookup_media_type4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return, 1–100. Default 25."New value: +"Requested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +1000000
      • addedOutput schema / properties / effective_limit
        Added value: +{
        +  "description": "The response limit after clamping, present when clamped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / requested_limit
        Added value: +{
        +  "description": "The requested limit, present when clamped.",
        +  "type": "number"
        +}
    • Changediana_lookup_pen4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return, 1–100. Default 25."New value: +"Requested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +1000000
      • addedOutput schema / properties / effective_limit
        Added value: +{
        +  "description": "The response limit after clamping, present when clamped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / requested_limit
        Added value: +{
        +  "description": "The requested limit, present when clamped.",
        +  "type": "number"
        +}
    • Changediana_lookup_port4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return, 1–100. Default 25."New value: +"Requested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +1000000
      • addedOutput schema / properties / effective_limit
        Added value: +{
        +  "description": "The response limit after clamping, present when clamped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / requested_limit
        Added value: +{
        +  "description": "The requested limit, present when clamped.",
        +  "type": "number"
        +}
    • Changediana_lookup_uri_scheme4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return, 1–100. Default 25."New value: +"Requested maximum results, 1–1,000,000; values above 100 are clamped to 100 and disclosed as requested_limit and effective_limit. Default 25."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +1000000
      • addedOutput schema / properties / effective_limit
        Added value: +{
        +  "description": "The response limit after clamping, present when clamped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / requested_limit
        Added value: +{
        +  "description": "The requested limit, present when clamped.",
        +  "type": "number"
        +}
    • Changediana_search_registries4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return, 1–50. Default 15."New value: +"Requested maximum results, 1–1,000,000; values above 50 are clamped to 50 and disclosed as requested_limit and effective_limit. Default 15."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +1000000
      • addedOutput schema / properties / effective_limit
        Added value: +{
        +  "description": "The response limit after clamping, present when clamped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / requested_limit
        Added value: +{
        +  "description": "The requested limit, present when clamped.",
        +  "type": "number"
        +}
  2. 10 tool updates
    • First observediana_get_registry_records
    • First observediana_get_rfc_status
    • First observediana_lookup_http_field
    • First observediana_lookup_http_status
    • First observediana_lookup_language_tag
    • First observediana_lookup_media_type
    • First observediana_lookup_pen
    • First observediana_lookup_port
    • First observediana_lookup_uri_scheme
    • First observediana_search_registries

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables retrieval of full RFC text, metadata, errata, and BCP/STD mappings from rfc-editor.org, plus substring search across the RFC index.
    21 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to query registry RDAP services for domain, IP, ASN, entity, and nameserver registration records — including ccTLDs that IANA's bootstrap omits — with unregistered domains returned as answers rather than errors. Requires no authentication or API key.
    13 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.