{
  "markdown": "<div align=\"center\">\n\n# Neuronto ARD Registry: Agentic Resource Discovery (ARD) Index\n\n**One search across every public ARD registry, plus a verified index of what MCP servers\nactually expose.**\n\n[neuronto.com](https://neuronto.com) · [API](https://neuronto.com/api-docs) · [Submit your server](https://neuronto.com/submit) · [Benchmark](https://neuronto.com/bench) · [Dataset](https://huggingface.co/datasets/AgenticResourceDiscovery/verified-mcp-tools) · [Manifest](https://neuronto.com/.well-known/ard.json)\n\n</div>\n\n---\n\n## What is ARD?\n\n**ARD** is short for **Agentic Resource Discovery**, an open specification for how\nAI agents find the tools, skills, agents and APIs they need, published in June 2026\nby a working group including Google, Microsoft, Hugging Face, AWS, Cisco, GitHub,\nNvidia, Salesforce and Snowflake.\n\nAn *agentic resource* is anything an AI client can call to get work done: an MCP\nserver, an A2A agent, a skill, an API, a workflow.\n\nARD answers one question, **\"what is available for this task?\"**, and then gets out\nof the way. It is not a runtime and does not replace MCP or A2A. It tells an agent\nwhat exists; the agent connects using the resource's own protocol.\n\n## The problem it solves\n\nToday an agent can only use capabilities someone installed for it in advance. Every\ntool has to be wired in by hand, and every tool description has to sit in the context\nwindow, competing for space with the actual work. That model does not survive contact\nwith an ecosystem of thousands of tools, let alone millions.\n\nARD moves the selection problem out of the context window and into a search service, the same shift the early web made when it went from curated link directories to\nsearch engines.\n\nFor that to work, two sides have to exist. **Publishers** describe what they offer at\na well-known location on their own domain. **Registries** index those descriptions and\nanswer queries. Neuronto is both.\n\n## Why a federated index\n\nThe specification defines three federation modes and makes `auto` the default: a\nregistry queries its peers, merges their results, and returns one set.\n\nIn practice each public registry answers only from its own catalogue, so the same\nquestion asked in four places returns four different answers and the client has to\npick a side. That is the problem Neuronto exists to remove.\n\nAsk Neuronto once and the query fans out across every public ARD registry\nconcurrently. Results are fused with reciprocal rank fusion, which combines the\norderings rather than the scores, necessary because each registry calibrates\ndifferently, and importing another service's scoring would import its biases with it.\n\nThe response says which registries answered and which timed out, so a caller always\nknows how much of the federation is behind an answer.\n\n## What it does differently\n\n**Federated by default.** `federation: auto` implemented as specified: concurrent\nfan-out under a hard time budget, fused ranking, per-upstream reporting. A slow peer\ncosts the budget and nothing more.\n\n**Complete conformance.** Passes the specification's official conformance tool as\nboth a registry and a publisher with zero errors and zero warnings, including the\noptional `GET /agents` listing as a properly paginated object.\n\n**Type normalisation.** Three media types for MCP servers are in circulation\n(`application/mcp-server`, `application/mcp-server+json`,\n`application/mcp-server-card+json`) and two URN prefixes appear as discovery\nidentifiers (`urn:air:` and `urn:ai:`). Because filters match exactly, entries get\ndropped silently. Neuronto normalises both on ingest, so a filter for MCP servers\nreturns them however the publisher spelled the type.\n\n**A verified tool index, not just a server index.** Every other registry stores a server\nname and whatever prose its publisher wrote. Neuronto handshakes with each indexed MCP\nendpoint and reads its `tools/list`, so the index holds the real tool names and input\nschemas, the thing an agent actually has to match on. Currently **32,183 verified tools\nacross 2,223 servers**, plus **1,918 endpoints recorded as requiring credentials**, which\nno other registry reports. Introspection is read only: a tool is never called.\n\n**Hybrid retrieval.** Sparse BM25 and dense vectors, fused with the same reciprocal rank\nfusion used for federation, so one query runs lexical, semantic and federated retrieval and\nreturns a single ordering. The dense leg rides inside the federation budget and contributes\nnothing if it is unavailable, so the lexical fast path is never slowed by it.\n\n**Verified liveness.** Indexed endpoints are probed and non-responding ones demoted\nin ranking. Registries built on self-published manifests accumulate dead links\nquickly; serving them is the fastest way to become the index nobody trusts. Entries\nare demoted rather than deleted, because services come back.\n\n**Manifests generated from evidence, not from a form.** Most domains will never author a\nmanifest by hand. They already run an MCP server, or serve an OpenAPI document, or publish\n`llms.txt`, and the manifest is a restatement of things a crawler can already find. Neuronto\nprobes a domain, emits an entry only for each resource that actually answered, records what\nproved it, and hosts the result. Nothing is inferred, because a generated manifest that\nguesses would put a claim on somebody's domain that they never made and cannot defend.\n\n**A private half of the index.** The list of internal services an organisation's own agents\nmay call usually lives in a system prompt, where nothing can search it and nobody can audit\nit. A domain that proves ownership by DNS can register those services, and one query then\nreturns internal and public results together, each labelled with which it is. Private\nentries are held in separate storage from the public index rather than behind a flag, so no\npublic search, count or page can reach them by construction.\n\n**Ranking that separates.** A relevance score is only useful if the gap between the\nfirst and fifth result is legible. Scores are scaled to preserve real separation\ninstead of compressing everything into a narrow band.\n\n## Where it fits\n\n- **Agent builders**, stop hard-coding integrations. Ask for a capability at runtime\n  and connect to whatever currently serves it best.\n- **API and tool vendors**, publish one manifest on your own domain and become\n  discoverable to every ARD client, without applying to a curated marketplace.\n- **Platform teams**, run discovery over internal services so agents inside the\n  organisation find them the same way they find public ones.\n\n## Using it\n\nSearch this index and the whole federation in one call:\n\n```bash\ncurl -s https://neuronto.com/search \\\n  -H 'content-type: application/json' \\\n  -d '{\"query\":{\"text\":\"scrape a website behind cloudflare\"},\"federation\":\"auto\"}'\n```\n\nOr install it as an MCP server, so an agent searches from the interface it already\nspeaks:\n\n```bash\nclaude mcp add --transport http neuronto https://neuronto.com/mcp\n```\n\n### Registry API\n\n| Endpoint | Purpose |\n|---|---|\n| `POST /search` | Ranked results. `federation`: `auto` (default), `referrals`, `none`. |\n| `POST /explore` | Facet counts over the index. |\n| `GET /agents` | Deterministic paginated listing, for browsing rather than ranking. |\n| `POST /mcp` | Search, tool search, index statistics and publishing, as MCP tools. `GET` and `DELETE` answer `405`: there is no server-initiated stream, every tool answers inside the request that asked. |\n| `POST /a2a` | The same index over A2A. `message/send` returns a Message. Card at `/.well-known/agent-card.json` and `/.well-known/agent.json`. |\n| `POST /tools`, `GET /tools?q=` | Tool level search over verified tools rather than servers. |\n| `POST /submit` | Index an MCP endpoint or a manifest-publishing domain. `200` indexed, `202` kept and retried. |\n| `GET /submit/status/{id}` | Where a submission stands, with the last answer its endpoint gave. |\n| `POST /audit` | Publishing report: discovery, conformance, coverage, competition. |\n| `POST /manifest/build` | Generate a manifest for a domain from resources fetched there. |\n| `GET /m/{host}.json` | That generated manifest, hosted. |\n| `GET /agents.md` | What to call and how, for an agent that has already arrived. |\n| `POST /claim`, `POST /claim/verify` | Prove domain ownership by DNS TXT, receive a key. |\n| `POST /private/entries` | Register internal services. Key required. |\n| `GET /bench`, `GET /adoption` | Retrieval measurement, and who publishes a manifest. |\n| `GET /.well-known/ard.json` | Our own publisher manifest. |\n| `GET /openapi.json` | OpenAPI 3.1 for everything above. |\n\n### Knowing when the answer is weak\n\nEvery top result scores near 100. That is deliberate: the score is relative to the best hit\nin its own result set, because BM25 magnitudes are corpus and query dependent, so an\nabsolute scale would mean nothing. It ranks well and, on its own, it misleads. The query\n`zzzz nonexistent capability qqqq` scores 100, because something always comes first.\n\nSo every search response carries one absolute number beside the relative ones:\n\n```json\n\"queryMatch\": {\n  \"coverage\": 0.0,\n  \"confidence\": \"none\",\n  \"matchedTerms\": [],\n  \"queryTerms\": [\"zzzz\", \"nonexistent\", \"capability\", \"qqqq\"],\n  \"note\": \"each result's `score` is relative to the best hit in this response ...\"\n}\n```\n\n`coverage` is the fraction of the query's content words that the top result's own text\naccounts for. It is corpus independent, which is the property the score cannot have, so it\nseparates \"the best of several good answers\" from \"the best of nothing\".\n\n**It measures overlap, not correctness.** A query whose every word appears in an entry that\ndoes the opposite thing still scores 1.0. Treat it as a floor on confidence, never as a\nverdict, and never as a trust or safety rating.\n\nNo key and no signup for anything that reads the public index. A key exists only to admit a\nverified domain's own private entries, and is issued only against a DNS proof of ownership.\n\nRelevance scores are semantic only and are never a trust, compliance or safety rating, the\nspecification is explicit that trust evaluation is decoupled from discovery.\n\n## Searching tools instead of servers\n\nWhen you already know the shape of the call you need, the server hosting it is an\nimplementation detail:\n\n```bash\ncurl -s 'https://neuronto.com/tools?q=extract+text+from+a+pdf&limit=5'\n```\n\nEvery tool returned was read from that server's own `tools/list`. The same search is\navailable to agents as the MCP tool `find_tool`, alongside `find_resource`,\n`registry_stats` and `publish_resource`. Only `publish_resource` writes, and it is the only\none declaring `readOnlyHint: false`, so a client can tell from the tool list alone which\ncall has an effect.\n\n## Measuring whether any of this works\n\n`GET /bench` publishes ARD-Bench, a head to head retrieval measurement across the public\nARD registries. Ground truth is the publishers' own `representativeQueries`, so nothing is\nhand labelled, and the harness is `app/bench.py` in this repository.\n\nThe response separates two things that are easy to confuse: `coverage`, whether a registry\nindexes the target at all, and `recall@k_when_carried`, whether it retrieves the target\nwhen it does hold it. It also states its own known bias, and it reports the results that\ndo not flatter us. In the current run, federated search scores slightly below lexical only\nand costs far more latency.\n\n## Who publishes an ARD manifest\n\n`GET /adoption` tracks adoption of the specification itself: a named watchlist of\norganisations, and the manifest rate across every host the crawler has seen. At the time\nof writing, three of the twenty organisations on the watchlist publish a manifest:\nHugging Face, Vercel and Zapier. All three serve it at `/.well-known/ai-catalog.json`,\nthe path v0.91 renamed. Of 178 publishers our crawler has found, **157 serve the older\n`ai-catalog.json` and only 14 serve `ard.json`**, which is why the tracker checks both:\nmeasuring the path rather than the practice gets the answer wrong.\n\n## The open dataset\n\nThe verified tool corpus is published as an open dataset, CC BY 4.0:\n**[huggingface.co/datasets/AgenticResourceDiscovery/verified-mcp-tools](https://huggingface.co/datasets/AgenticResourceDiscovery/verified-mcp-tools)**\n\n`tools.jsonl` carries all 31,411 verified tools with their input schemas, `servers.jsonl`\ncarries 7,708 introspection results including the auth requirement and failure kind. It\nexists because tool-retrieval research (ToolRet, ACL Findings 2025) has been benchmarked on\nassembled corpora rather than the live ecosystem, and this is the live ecosystem.\n\n## The badge\n\nIf your MCP server is in the index, a badge states what we verified: how many tools your\nserver returned to `tools/list`, and whether the endpoint answers.\n\n```markdown\n[![your.publisher.id on the Neuronto ARD Registry](https://neuronto.com/badge/your.publisher.id.svg)](https://neuronto.com/ard-publishers/your.publisher.id)\n```\n\nThe publisher id is the publisher segment of your URN, or your domain. The badge is a\nstatement about what was observed, never a trust, safety or quality rating. Not indexed\nyet? Publish a manifest and the crawler will find you, or run the\n[console audit](https://neuronto.com/console).\n\n## Publishing your own resources\n\nFour ways in, in ascending order of effort. There is no allowlist and no signup for any\nof them.\n\n**You already run an MCP server.** Submit the endpoint. Neuronto completes an `initialize`\nhandshake and reads the server's own `tools/list`, which is stronger evidence than a\nmanifest claim because the server answered for itself.\n\n```bash\ncurl -X POST https://neuronto.com/submit \\\n  -H 'content-type: application/json' \\\n  -d '{\"endpoint\":\"https://example.com/mcp\"}'\n```\n\n**You are working inside an agent.** The same thing as an MCP tool, so a resource can be\nlisted from inside a conversation without leaving it.\n\n```json\n{\"method\":\"tools/call\",\"params\":{\"name\":\"publish_resource\",\n \"arguments\":{\"endpoint\":\"https://example.com/mcp\"}}}\n```\n\nIt verifies rather than trusts, exactly as the HTTP route does, and calls that route rather\nthan reimplementing it so the two cannot drift apart.\n\n**A submission is never lost.** If the endpoint does not verify at that moment, for any\nreason, the answer is `202` with `\"status\": \"pending\"`, a submission id, and `evidence`:\nthe HTTP status, content type and first bytes of what the endpoint actually returned, or\nthe JSON-RPC error it sent. The registry keeps the submission and retries it on a fixed\nschedule (1 min, 5 min, 15 min, 1 h, 4 h, 12 h, 24 h, 24 h) until it verifies or the\nattempts run out, and `GET /submit/status/{id}` shows where it stands. A refusal caused by\nthe registry itself, such as the index being busy, costs none of those attempts. So a\nserver that was mid-deploy, a DNS record that had not propagated, or a client that gave up\nafter one call still ends up indexed with no second submission from anyone. The queue is\ncounted publicly at `/metrics.json` under `submissions`.\n\n**The other write endpoints answer honestly when the index is busy.** `POST /claim/verify`,\n`POST /private/add` and `POST /private/delete` return `503` with a `Retry-After` header and\n`\"status\": \"busy\"` instead of failing in an unnamed way; the DNS proof or the request is\nnot lost, call again after the stated seconds. `POST /manifest/build` still returns the\ngenerated manifest and reports `\"hosted_at\": null` with a note when only the hosted copy\ncould not be stored.\n\n**You have no manifest and do not want to write one.** Ask for one to be generated from\nwhat your domain already exposes, and either copy it or link it.\n\n```bash\ncurl -X POST https://neuronto.com/manifest/build \\\n  -H 'content-type: application/json' -d '{\"domain\":\"example.com\"}'\n```\n\nOnly resources that actually answered become entries, and each carries the evidence that\nproduced it. The hosted copy at `https://neuronto.com/m/example.com.json` says in its own\nresponse headers that it was generated rather than authored by the domain owner.\n\n**You have a manifest.** Serve it at `/.well-known/ard.json` and submit the domain, or wait\nfor the crawler.\n\n```bash\ncurl -X POST https://neuronto.com/submit \\\n  -H 'content-type: application/json' -d '{\"domain\":\"example.com\"}'\n```\n\nServe it at `/.well-known/ai-catalog.json` as well. Version 0.91 of the specification\nrenamed the file, but the deployed base has not moved: of the ARD publishers verified so\nfar, the large majority still serve only the older path, so a consumer that checks one name\nmisses most of the ecosystem.\n\nInclude `representativeQueries` on every entry. It is the term registries build their\nsemantic index from, and an entry without it is a valid catalogue entry that no\nsearch will ever return.\n\n### Checking whether it worked\n\n```bash\ncurl -X POST https://neuronto.com/audit \\\n  -H 'content-type: application/json' -d '{\"domain\":\"example.com\"}'\n```\n\nReports whether the manifest is reachable on each of the four discovery paths, whether it\nsatisfies the specification entry by entry, **which registries actually return you**, and\n**who is returned instead of you** for the queries you asked to be found for, with what\nthose entries have that you may not. Free, no signup. There is a browser version at\n[/console](https://neuronto.com/console).\n\n**Last step, whichever way you came in: add the badge.** Once a registry returns you, put\nit on your README or site. It states what was observed, the verified tool count and whether\nyour endpoint answered, corrects itself when that changes, is free, and changes nothing\nabout your indexing or ranking. Every response above ends with the same sentence and the\npaste-ready snippet; the [badge page](https://neuronto.com/badge) has the formats.\n\n## Private entries\n\nAn organisation can register the internal services its own agents may call, and search\nacross public and internal resources in one query.\n\n```bash\n# 1. ask for the proof record, publish it as a TXT record at your apex\ncurl -X POST https://neuronto.com/claim \\\n  -H 'content-type: application/json' -d '{\"domain\":\"example.com\"}'\n\n# 2. verify, which returns an API key\ncurl -X POST https://neuronto.com/claim/verify \\\n  -H 'content-type: application/json' -d '{\"domain\":\"example.com\"}'\n\n# 3. register an internal service\ncurl -X POST https://neuronto.com/private/entries \\\n  -H \"authorization: Bearer $KEY\" -H 'content-type: application/json' \\\n  -d '{\"entry\":{\"displayName\":\"Staff Directory\",\"url\":\"https://internal/mcp\",\n       \"description\":\"Look up an employee record by name or badge number.\",\n       \"representativeQueries\":[\"look up an employee record\"]}}'\n\n# 4. the same key on search admits them, alongside public results\ncurl -X POST https://neuronto.com/search \\\n  -H \"authorization: Bearer $KEY\" -H 'content-type: application/json' \\\n  -d '{\"query\":{\"text\":\"look up an employee record\"}}'\n```\n\nThe proof value is derived from the domain and never changes, so asking again does not\ninvalidate a record already published. It is read over DNS over HTTPS, so it verifies as\nsoon as the authoritative zone serves it. Verification is the only thing that issues a key.\n\nEvery result says whether it came from the public index or from your own entries. Private\nentries are never ranked against public ones by corpus statistics, because a single tenant's\nindex is too small for those statistics to mean anything; they are placed by how much of the\nquery their own text accounts for, which means the same thing at any size.\n\n## Specification\n\n- [Agentic Resource Discovery](https://agenticresourcediscovery.org/spec), v0.91\n- [ards-project/ard-spec](https://github.com/ards-project/ard-spec)\n\n## Licence\n\nApache-2.0\n",
  "bytes": 19759,
  "sha": "2503857e2ec1d32274a18e562c628f25ffc5abfc64a46a4a90bf23cef5a84158",
  "repo_slug": "neuronto/agentic-resource-discovery",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_neuronto_agents_tools_search_discove_9b4fdc79/readme"
}