Discovery and Registry — v0.2 draft
On this page
- Status: draft proposal, 2026-10-21. Extends v0.1; nothing in v0.1 changes.
- Editors: AutoIsto s. r. o.
- Licence: CC BY 4.0 (this text, the schemas and the examples)
The key words MUST, MUST NOT, SHOULD, SHOULD NOT and MAY are to be interpreted as described in RFC 2119 and RFC 8174 when, and only when, they appear in capitals.
1. Purpose#
A person tells an agent what they want: a used estate car in Žilina, a two-room flat in Brno. The agent needs to know which intent holders serve that country and category, and where their servers are. This chapter defines three things:
- the holder descriptor, which every holder publishes on its own domain (§2);
- the registry, a public list of holders built from their descriptors and checked automatically (§3–§6);
- how agents use the registry (§7).
The registry lists who serves what. It does not hold intents, does not route them and does not rank holders.
2. Holder descriptor#
A holder describes itself in one file on its own host:
https://<host>/.well-known/isto-intents.json
Schema: holder-descriptor. Example:
holder-descriptor-sk.
| field | required | meaning |
|---|---|---|
specVersion, type, id, created |
yes | envelope (spec §3.1); type is holder-descriptor, id is the descriptor's own URL |
updated |
no | when the descriptor last changed |
operator |
yes | { name, url, contact, country } — the organisation responsible for the servers; contact is a mailto: or https: URI |
servers |
yes | the holder's intent servers (below), at most 10 |
registry |
no | { listing, terms } — listing: "requested" asks to be listed; terms is the URL of the registry terms the operator accepts |
jwksUri |
no | where the holder publishes its signing keys (spec §11) |
Each entry of servers:
| field | required | meaning |
|---|---|---|
url |
yes | the server's endpoint |
binding |
yes | mcp |
transport |
yes | streamable-http |
profiles |
yes | binding profiles the server implements: consent-link, or an x- value. A profile is checked by the registry (§5) only once this chapter defines its check; v0.2 defines it for consent-link |
specVersions |
yes | protocol versions the server speaks, e.g. ["0.1"] |
categories, countries, languages |
yes | what the server serves (spec §3.2–§3.3) |
title |
no | a short human name |
mcpRegistryName |
no | the server's name in the MCP Registry (§8) |
deprecated |
no | true when the operator is retiring the server; successor MAY name the server that replaces it |
Rules:
- The descriptor MUST be served over HTTPS on port 443 with status 200, with a JSON content type,
at most 64 KB, without a redirect. Server
urls in one descriptor MUST be distinct. - Every server
urlMUST use HTTPS and MUST be on<host>or on a subdomain of<host>with a leadingwww.removed. A server on another domain is listed by that domain's own descriptor. - The descriptor MUST NOT contain personal data other than the operator's contact, which SHOULD be
a role address (for example
info@), not a person's.
3. Registry#
The reference registry is operated by the editors of this specification at:
https://istointents.org/registry.json
Schema: registry. Example:
registry-sk-cz. It is served with
Access-Control-Allow-Origin: *, so that any agent or web page can read it.
Each entry is one host. It carries two kinds of fields, kept apart:
- declared — copied from the holder's descriptor:
operatorand each server's description. The operator is responsible for them. - observed — what the registry itself saw:
status,checkedAt,lastOkAt, the tools the server listed and its MCP server name. Only these are the registry's statement.
| entry field | meaning |
|---|---|
id |
the host, e.g. www.autoisto.sk |
descriptor |
URL of the descriptor the entry is built from |
operator |
declared, from the descriptor |
servers[] |
declared server fields plus observed: { status, checkedAt, lastOkAt, protocolVersion, serverName, tools, mcpRegistry } |
listedAt |
when the entry was first listed |
descriptorCheckedAt |
when the descriptor was last fetched successfully |
Entries are ordered by id. The order is not a recommendation, and the registry gives no score,
rank or preference to any holder, including those of its own operator.
4. Getting listed#
Publish the descriptor (§2) with
"registry": { "listing": "requested", "terms": "<terms URL>" }. Publishing it on your host is the proof that you control the host, in the same way as an ACME HTTP challenge; no token, account or e-mail is needed.Ask the registry to read it:
POST https://istointents.org/registry/v0/submit Content-Type: application/json { "host": "www.example.com" }The registry fetches the descriptor, validates it against its schema and checks every server (§5). The response says whether the entry is listed and, if not, what failed. A new entry is listed when at least one of its servers passes the check (a passing
deprecatedserver counts).
The registry terms are at registry/terms.
After that, the registry re-reads the descriptor at every check: a change to the descriptor appears in the registry without a new submission. Listing is free.
5. Automated check#
For every server with binding: "mcp" the registry, about every 6 hours (each entry is due 6 hours
after its last check; with many entries the interval can grow):
- calls
initializeover Streamable HTTP; it MUST succeed within 10 seconds; - calls
tools/list; the list MUST contain the tools of every declared profile. Forconsent-link:intent_publish_intent,intent_get_intent,intent_list_matchesandintent_withdraw_intent; - for
consent-link, reads the input schema ofintent_publish_intent; it MUST NOT have a top-level property for contact data (email,e-mail,phone,telephone,name,address,contact, compared case-insensitively) — profile rule 1 of the MCP binding.
The check never calls a tool, so it creates nothing at the holder. Requests carry the user agent
IstoIntentsRegistry/0.2 (+https://istointents.org/registry/).
The check covers the interface only. It is not a certification: it does not show that a holder follows the other rules of this specification, keeps its promises to people, or obeys the law.
6. Status#
| status | when |
|---|---|
active |
the last check passed |
unreachable |
the last check could not reach the server or its descriptor (network error, timeout, HTTP 5xx; for the descriptor also 401, 403, 404 or 429) |
non-conformant |
the last check reached it but it failed §5 (missing tools, contact field, server not on the host, no profile this chapter can check), or the descriptor redirects, is not JSON, no longer validates or no longer asks to be listed |
inactive |
no check has passed for 30 days |
deprecated |
the operator marked the server deprecated in the descriptor |
- A failure never deletes an entry. An entry keeps
lastOkAt, and returns toactiveat the first check that passes. - If the descriptor cannot be fetched or can no longer be used, the entry keeps its last valid
content and its servers get
unreachableornon-conformantas above, with the reason inobserved.problem. - An entry is removed only when its operator withdraws it —
"listing": "withdrawn"in the descriptor (honoured even if the rest of the descriptor does not validate), the descriptor answering410 Gone, or a request to the contact address of the registry — or under the registry terms.
7. Agents#
- An agent that has no holder configured for a person's country and category SHOULD read the
registry and use servers whose status is
activeand whosecountries,categoriesandlanguagesfit. - When several fit, the agent SHOULD let the person choose, naming the operator and the host, or follow the person's stated preference. The registry order is not a choice.
- An agent SHOULD cache
registry.jsonno longer than 24 hours. - The registry is also available as an MCP server at
https://istointents.org/mcpwith one read-only tool,registry_find_holders(country,category, optionallanguage), which returns theactiveservers that fit, each with its operator, host, URL, what it serves and when it was checked. - A listed holder's MCP server SHOULD, in its server instructions, point agents to
https://istointents.org/registry.jsonfor countries or categories it does not serve.
8. Relation to the MCP Registry#
The MCP Registry lists MCP servers of every kind and tells clients how to connect to them. This registry lists only Isto Intents holders: what they serve and whether their servers answered the last check. The two refer to each other and neither replaces the other:
A server in a descriptor MAY name its MCP Registry entry in
mcpRegistryName. The registry looks the name up and reportsobserved.mcpRegistryasmatch(same remote URL),mismatchorabsent. This does not affectstatus.A holder that publishes its server to the MCP Registry SHOULD add to its
server.json:"_meta": { "io.modelcontextprotocol.registry/publisher-provided": { "org.istointents": { "descriptor": "https://<host>/.well-known/isto-intents.json", "registry": "https://istointents.org/registry.json" } } }
9. Privacy and security#
- The registry holds no data about buyers or intents, and a descriptor MUST NOT carry any.
- The registry fetches only
https://URLs on port 443 whose host is a domain name (never an IP address), follows no redirects, stops after 10 seconds, and reads at most 64 KB of a descriptor and 256 KB of a server response. - A submission needs no identity and the registry stores none. It is limited to one per host every 10 minutes, and to 300 submissions of hosts not yet listed per day in total; a listed host may always resubmit.
10. Data licence#
registry.json is published under CC BY 4.0. Attribution: "Isto Intents Registry,
istointents.org".