Skip to content

Commit 4ca52b1

Browse files
iracic82nicknacnic
andcommitted
feat(core): complete draft-02 flat-FQDN migration across all surfaces
Ships the full draft-mozleywilliams-dnsop-dnsaid-02 wire-format migration as a single 0.24.0 release. The bulk of this work was authored by Nick Williams (@nicknacnic) and is consolidated here from his draft-02 stack so the migration lands as one reviewable, releasable unit instead of a five-deep PR chain. Full credit to Nick for the underlying implementation -- see the Co-authored-by trailer. ## Wire format (-01 -> -02) - Flat primary owner record at {name}.{domain} -- a valid x.509 SAN dNSName. The agent protocol no longer travels in the FQDN; it lives in the SVCB bap SvcParamKey (or alpn when single-protocol). SVCB and companion TXT are written at the flat owner on every publish. - Optional walkable AliasMode at {name}._agents.{domain} pointing at the flat owner. Off by default under -02 to avoid an enumeration handle (see docs/privacy-considerations.md); opt in per-publish via publish_walkable_alias=True, the CLI --walkable flag, or the MCP kwarg. - Per-call legacy -01 fallback via allow_legacy on discover() / discover_at_fqdn(); results stamped legacy_resolved=True. The process-wide DNS_AID_LEGACY_01_FALLBACK=1 env form is preserved and now logs on each use. - Single FQDN parser dns_aid.core.fqdn.parse_dnsaid_fqdn recognising flat, walkable, and legacy shapes; discoverer and telemetry parse paths are thin projections over it. ## SvcParamKeys - New well-known SvcParamKey at the project's interim private-use code point key65409 (final IANA assignment deferred per draft 7.1). Reconstructed as https://<svcb-target>/.well-known/<value> and fetched as the capability descriptor; absolute-path values per Figure 3 are honoured without double-prefixing. validate_well_known_path constrains the value to a traversal- and injection-safe class on both publish and discover. - Scalar bap per draft 5.1: bare (mcp, a2a) or =-versioned (mcp=1.0). A field validator on both models closes a SvcParam quoting break-out (a crafted value such as mcp" key65500="x used to inject a sibling key through to_params()). normalize_bap collapses legacy comma/list inputs onto the canonical scalar across discoverer, SDK, and indexer. ## Trust path - JWS record signature binds to (fqdn, target, port, alpn). A valid signature lifted off one record and pasted onto a spoofed SVCB is rejected at the binding check. The binding comparison is DNS-normalized (case-insensitive, trailing-dot-insensitive) so a legitimately-signed dotted or mixed-case endpoint is not falsely rejected. - cap-sha256 mismatch refuses the record (CapDigestMismatchError) instead of silently downgrading to TXT; cap_sha256_verified marks when the pin was actually applied. - DANE score gates on DNSSEC (RFC 6698 10.1): a TLSA record without a DNSSEC chain no longer credits +15 to security_score. - TargetName underscore validator rejects underscored endpoint labels by default (CA/Browser-Forum BR + RFC 5280 dNSName conformance), with an operator-only bypass requiring both DNS_AID_ALLOW_UNDERSCORE_TARGET=1 and the per-call flag. ## Completion fixes (this consolidation) - validate_fqdn accepts the flat owner {name}.{domain}. It previously required a literal _agents label and rejected every flat FQDN, so the MCP verify_agent_dns tool could not verify a draft-02 agent. It now validates a well-formed multi-label DNS name (flat, walkable, legacy, and index shapes all pass) and remains the sole input guard at the MCP boundary. - CLI and MCP surfaces emit the flat owner name -- delete/search output, the MCP unpublish result, and list_agent_index now show {name}.{domain} instead of the legacy nested name. - index sync enumerates flat primary owners. It previously discovered agents only via the walkable AliasMode or legacy shape, so a flat-only agent (the draft-02 default publish shape) was silently dropped from the index. It now detects flat owners by their companion TXT record, reads the protocol off the SVCB SvcParams, and dedups against any walkable alias for the same agent. - Discovery reconciles the agent protocol from the SVCB record. The protocol lives in the record (bap, or alpn) under draft-02, not the FQDN. The discoverer now stamps the record's true protocol on every path (discover_at_fqdn, the zone-walk, the HTTP index), so a default-published a2a/https agent (alpn, no bap) is no longer mislabeled mcp -- which previously failed the JWS binding check and picked the wrong handler. The zone-walk dedups by (fqdn, protocol). - parse_dnsaid_fqdn accepts a flat owner in a two-label zone (agent.internal) and normalizes case + a trailing dot up front. - Docs, CHANGELOG, CITATION, and the package version (0.23.0 -> 0.24.0) updated to the flat shape. ## Production hardening - SVCB SvcParam injection closed on every free-form field. The bap validator already blocked quote break-out injection; the same guard now applies to cap / cap-sha256 / policy / realm / sig / connect-meta / enroll-uri on both models, so a forged value cannot inject a sibling SvcParamKey into the authoritative record via the presentation-format backends. - JWKS fetch is SSRF-guarded, size-capped (64 KB), redirect-free, and the per-process cache is bounded. JWS verification pins alg=ES256 (rejects none/RSA) and the key to a P-256 EC signing key with 32-byte coordinates -- closing algorithm/curve confusion on the attacker- influenceable JWKS path. - The HTTP agent index fetch is bounded in body size (1 MB) and agent count (500) so a hostile index can't OOM or amplify the per-agent fan-out. ## Verification Full local gate run green: ruff, ruff format, mypy (83 source files), bandit (0 issues), and 1890 unit/integration tests. Verified end to end across the CLI, MCP, and SDK surfaces against live Route53 and a local BIND9/DDNS backend (publish -> discover -> verify -> delete round-trips, flat-owner resolution, protocol reconciliation for a2a/mcp/https, signature binding, index round-trip); NIOS WAPI lifecycle validated on the same code paths. The JWKS hardening was validated live over real TLS sockets and real ES256 crypto: SSRF guard blocks a loopback JWKS, the full sign -> fetch -> verify chain succeeds, the streaming size cap rejects an oversized document, and alg/curve confusion is refused. Breaking changes (strict underscore TargetName validator, scalar bap, and the -01 -> -02 default flip) are documented with migration notes in CHANGELOG [0.24.0]. Co-authored-by: Layer8 <NWillAU900@gmail.com> Signed-off-by: Igor Racic <iracic82@gmail.com>
1 parent 5db084f commit 4ca52b1

75 files changed

Lines changed: 6494 additions & 756 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 322 additions & 1 deletion
Large diffs are not rendered by default.

CITATION.cff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ authors:
1313
given-names: Ingmar
1414
affiliation: Infoblox
1515

16-
version: "0.23.0"
17-
date-released: "2026-05-26"
16+
version: "0.24.0"
17+
date-released: "2026-06-04"
1818

1919
keywords:
2020
- dns

README.md

Lines changed: 85 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,12 @@
99
[![Python](https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13-blue)](https://www.python.org/)
1010
[![PyPI](https://img.shields.io/pypi/v/dns-aid)](https://pypi.org/project/dns-aid/)
1111

12-
<!-- mcp-name: io.github.dns-aid/dns-aid -->
13-
1412
**DNS-based Agent Identification and Discovery**
1513

16-
Reference implementation of the DNS-AID specification, developed at the IETF: https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/.
14+
Reference implementation for [IETF draft-mozleywilliams-dnsop-dnsaid-02](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/).
1715

1816
DNS-AID enables AI agents to discover each other via DNS, using the internet's existing naming infrastructure instead of centralized registries or hardcoded URLs.
1917

20-
## Relationship to IETF
21-
22-
The DNS-AID specification is being developed within the IETF: https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/.
23-
24-
This repository provides a reference implementation.
25-
26-
This project does not define the specification. The IETF draft is authoritative.
27-
28-
## Scope of this Repository
29-
30-
This project focuses on implementation, tooling, and ecosystem activities.
31-
32-
Changes to protocol behavior should be discussed within the IETF.
33-
3418
> **New to DNS-AID?** Start with the [Getting Started Guide](docs/getting-started.md) for install, first agent publication, and backend setup.
3519
3620
## Documentation
@@ -97,7 +81,7 @@ result = await dns_aid.discover(
9781
)
9882

9983
# Verify an agent's DNS records
100-
result = await dns_aid.verify("_my-agent._mcp._agents.example.com")
84+
result = await dns_aid.verify("my-agent.example.com")
10185
print(f"Security Score: {result.security_score}/100")
10286
```
10387

@@ -278,7 +262,7 @@ dns-aid discover example.com --use-http-index
278262
dns-aid discover example.com --json
279263

280264
# Verify DNS records
281-
dns-aid verify _my-agent._mcp._agents.example.com
265+
dns-aid verify my-agent.example.com
282266

283267
# List DNS-AID records in a zone
284268
dns-aid list example.com
@@ -397,7 +381,7 @@ agents = await dns_aid.discover("example.com", use_http_index=True)
397381
| **DNS (default)** | Maximum decentralization, offline caching, minimal round trips |
398382
| **HTTP Index** | Rich metadata upfront, ANS compatibility, model cards, capabilities, direct endpoints |
399383

400-
**FQDN as Source of Truth (v0.4.7):** The HTTP index only needs to provide each agent's FQDN (e.g., `_booking._mcp._agents.example.com`). Agent name and protocol are extracted from the FQDN — no separate `protocols` field needed. DNS SVCB lookup then resolves the authoritative endpoint.
384+
**FQDN as Source of Truth (v0.4.7):** The HTTP index only needs to provide each agent's FQDN (e.g., `booking.example.com`). Agent name and protocol are extracted from the FQDN — no separate `protocols` field needed. DNS SVCB lookup then resolves the authoritative endpoint.
401385

402386
**Discovery Transparency (v0.4.6+):** Each discovered agent includes source fields showing how data was resolved:
403387

@@ -491,14 +475,14 @@ Claude will:
491475
DNS-AID uses SVCB records (RFC 9460) to advertise AI agents:
492476

493477
```
494-
_chat._a2a._agents.example.com. 3600 IN SVCB 1 chat.example.com. alpn="a2a" port=443 mandatory="alpn,port"
495-
_chat._a2a._agents.example.com. 3600 IN TXT "capabilities=chat,assistant" "version=1.0.0"
478+
chat.example.com. 3600 IN SVCB 1 chat.example.com. alpn="a2a" port=443 mandatory="alpn,port"
479+
chat.example.com. 3600 IN TXT "capabilities=chat,assistant" "version=1.0.0"
496480
```
497481

498482
**DNS-AID Custom SVCB Parameters (v0.4.8+):** Per the IETF draft, SVCB records can carry additional custom parameters for richer agent metadata:
499483

500484
```
501-
_booking._mcp._agents.example.com. SVCB 1 mcp.example.com. alpn="mcp" port=443 \
485+
booking.example.com. SVCB 1 mcp.example.com. alpn="mcp" port=443 \
502486
cap="https://mcp.example.com/.well-known/agent-cap.json" \
503487
cap-sha256="dGVzdGhhc2g" bap="mcp/1,a2a/1" \
504488
policy="https://example.com/agent-policy" realm="production"
@@ -526,7 +510,7 @@ This allows any DNS client to discover agents without proprietary protocols or c
526510
│ Step 1: Fetch HTTP Index (primary) │
527511
│ ────────────────────────────────── │
528512
│ GET https://index.aiagents.salesforce.com/index-wellknown │
529-
│ Response: [{"fqdn":"_chat._a2a._agents.salesforce.com",...}] │
513+
│ Response: [{"fqdn":"chat.salesforce.com",...}] │
530514
│ │
531515
│ Fallback: Query TXT Index via DNS │
532516
│ Query: _index._agents.salesforce.com TXT │
@@ -536,7 +520,7 @@ This allows any DNS client to discover agents without proprietary protocols or c
536520
┌──┴──────────────────────────────────────────────────────────────┐
537521
│ Step 2: Query SVCB per agent │
538522
│ ──────────────────────────── │
539-
│ Query: _chat._a2a._agents.salesforce.com SVCB │
523+
│ Query: chat.salesforce.com SVCB │
540524
│ Response: SVCB 1 chat.salesforce.com. alpn="a2a" port=443 │
541525
│ cap="https://chat.salesforce.com/.well-known/cap.json"│
542526
│ (DNSSEC validated) │
@@ -553,7 +537,7 @@ This allows any DNS client to discover agents without proprietary protocols or c
553537
┌──┴──────────────────────────────────────────────────────────────┐
554538
│ Step 3: TXT Capabilities (fallback if no cap document) │
555539
│ ────────────────────────────────────────────────── │
556-
│ Query: _chat._a2a._agents.salesforce.com TXT │
540+
│ Query: chat.salesforce.com TXT │
557541
│ Response: "capabilities=chat,support" "version=1.0.0" │
558542
└──┬──────────────────────────────────────────────────────────────┘
559543
│ │ │
@@ -1025,9 +1009,81 @@ Cloudflare DNS is ideal for demos, workshops, and quick prototyping thanks to it
10251009
- **Simple API**: Well-documented REST API v4
10261010
- **Full DNS-AID compliance**: Supports ServiceMode SVCB with all parameters
10271011

1028-
## Background and Comparison
1012+
## Why DNS-AID?
1013+
1014+
### vs Competing Proposals
1015+
1016+
| Approach | Problem | DNS-AID Advantage |
1017+
|----------|---------|-------------------|
1018+
| **ANS (GoDaddy)** | Centralized registry, KYC required, single gatekeeper | Federated — you control your domain, publish instantly |
1019+
| **Google (A2A + UCP)** | Discovery via Gemini/Search, payments via UCP | Neutral discovery — no platform lock-in or transaction fees |
1020+
| **.agent gTLD** | Requires ICANN approval, ongoing domain fees | Works NOW with domains you already own |
1021+
| **AgentDNS (China Telecom)** | Requires 6G infrastructure, carrier control | Works NOW on existing DNS infrastructure |
1022+
| **NANDA (MIT)** | New P2P overlay network, new ops paradigm | Uses infrastructure your DNS team already operates |
1023+
| **Web3 (ERC-8004)** | Gas fees, crypto wallets, enterprise-hostile | Free DNS queries, no blockchain complexity |
1024+
| **ai.txt / llms.txt** | No integrity verification, free-form JSON | DNSSEC cryptographic verification, structured SVCB |
1025+
1026+
### Feature Comparison
1027+
1028+
| Feature | DNS-AID | Central Registry | ai.txt |
1029+
|---------|---------|------------------|--------|
1030+
| **Decentralized** ||||
1031+
| **Secure (DNSSEC)** || Varies ||
1032+
| **Sovereign** ||||
1033+
| **Standards-based** | ✅ (IETF) |||
1034+
| **Works with existing infra** ||||
1035+
1036+
### The Sovereignty Question
1037+
1038+
> **Who controls agent discovery?**
1039+
> - ANS: GoDaddy (US company as gatekeeper)
1040+
> - AgentDNS: China Telecom (state-owned carrier)
1041+
> - Web3: Ethereum Foundation
1042+
> - **DNS-AID: You control your own domain**
1043+
>
1044+
> DNS-AID preserves sovereignty. Organizations and nations maintain control over their own agent namespaces with no central authority that can block, censor, or surveil agent discovery.
1045+
1046+
### Google's Agent Ecosystem
1047+
1048+
Google is building a full-stack agent platform: **A2A** (communication), **UCP** (payments), and **Gemini/Search** (discovery). While A2A is an open protocol, discovery through Google surfaces means:
1049+
- Google controls visibility (pay-to-rank)
1050+
- Transaction fees via [UCP](https://developers.google.com/merchant/ucp)
1051+
- Platform dependency for reach
1052+
1053+
**DNS-AID complements A2A** by providing neutral, decentralized discovery — find agents anywhere, not just through Google.
1054+
1055+
### Understanding the .agent Domain Approach
1056+
1057+
The [Agent Community](https://agentcommunity.org/) is pursuing a `.agent` top-level domain through ICANN's [new gTLD program](https://newgtlds.icann.org/). Here's how the two approaches compare:
1058+
1059+
**How .agent Domains Would Work:**
1060+
1. Apply to ICANN for `.agent` gTLD (~$185,000 application fee)
1061+
2. Wait 9-20 months for ICANN approval process
1062+
3. Build registry infrastructure (Open Agent Registry, Inc.)
1063+
4. Sell `.agent` domains through accredited registrars
1064+
5. Users pay annual registration fees (~$15-50/year per domain)
1065+
1066+
**How DNS-AID Works:**
1067+
1. Use your existing domain (you already own `yourcompany.com`)
1068+
2. Add DNS-AID records to your zone (`myagent.yourcompany.com`)
1069+
3. Start discovering and being discovered immediately
1070+
1071+
| Factor | .agent gTLD | DNS-AID |
1072+
|--------|-------------|---------|
1073+
| **Cost to publish** | ~$15-50/year domain fee | Free (use existing domain) |
1074+
| **Time to start** | Months (gTLD launch + registration) | Minutes |
1075+
| **Who controls discovery** | Registry operator | You (your domain) |
1076+
| **Works today** | ❌ Pending ICANN approval | ✅ Works now |
1077+
| **Requires new infrastructure** | ✅ Registry, registrars | ❌ Uses existing DNS |
1078+
| **Memorable names** |`myagent.agent` | `myagent.example.com` |
1079+
1080+
**The Friendly Take:**
1081+
1082+
Both approaches share the goal of making AI agents discoverable. The `.agent` gTLD creates a dedicated namespace that's easy to remember (`mycompany.agent`), while DNS-AID leverages existing infrastructure so you can start publishing agents today.
1083+
1084+
DNS-AID doesn't require waiting for ICANN approval or paying for new domains—it works with the DNS infrastructure your organization already operates. If you own `example.com`, you can publish agents to `myagent.example.com` right now.
10291085

1030-
For background on how DNS-AID compares to other agent-discovery approaches (ANS, Google A2A+UCP, `.agent` gTLD, AgentDNS, NANDA, Web3, `ai.txt`) and "The Sovereignty Question", see [docs/positioning.md](docs/positioning.md). That content is non-normative — protocol positioning is determined at the IETF.
1086+
*Fun fact: When `.agent` domains become available, DNS-AID records will work on them too! The approaches are complementary.*
10311087

10321088
## Examples
10331089

@@ -1076,6 +1132,6 @@ Apache 2.0
10761132

10771133
## Contributing
10781134

1079-
Contributions welcome! This project supports an implementation ecosystem with planned hosting in the Linux Foundation. The DNS-AID specification is developed in the IETF.
1135+
Contributions welcome! This project is intended for contribution to the Linux Foundation Agent AI Foundation.
10801136

10811137
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

docs/api-reference.md

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ async def main():
8484
discovery = await discover("example.com", protocol=Protocol.MCP)
8585

8686
# Verify an agent's DNS records
87-
verification = await verify("_my-agent._mcp._agents.example.com")
87+
verification = await verify("my-agent.example.com")
8888

8989
asyncio.run(main())
9090
```
@@ -168,8 +168,9 @@ else:
168168

169169
#### DNS Records Created
170170

171-
- **SVCB**: `_{name}._{protocol}._agents.{domain}` → Service binding record
172-
- **TXT**: `_{name}._{protocol}._agents.{domain}` → Capabilities and metadata
171+
- **SVCB**: `{name}.{domain}` (draft-02 flat primary owner) → Service binding record
172+
- **SVCB (AliasMode, optional)**: `{name}._agents.{domain}` → walkable AliasMode pointer at the flat primary owner (suppressible via `publish_walkable_alias=False`)
173+
- **TXT**: `{name}.{domain}` → Capabilities and metadata (alongside the primary SVCB)
173174

174175
---
175176

@@ -305,7 +306,7 @@ async def verify(fqdn: str) -> VerifyResult
305306

306307
| Parameter | Type | Required | Description |
307308
|-----------|------|----------|-------------|
308-
| `fqdn` | `str` | Yes | Fully qualified domain name (e.g., "_chat._mcp._agents.example.com") |
309+
| `fqdn` | `str` | Yes | Fully qualified domain name (e.g., "chat.example.com") |
309310

310311
#### Returns
311312

@@ -316,7 +317,7 @@ async def verify(fqdn: str) -> VerifyResult
316317
```python
317318
from dns_aid import verify
318319

319-
result = await verify("_chat._mcp._agents.example.com")
320+
result = await verify("chat.example.com")
320321

321322
print(f"Record exists: {result.record_exists}")
322323
print(f"DNSSEC valid: {result.dnssec_valid}")
@@ -332,7 +333,7 @@ DCV is a stateless challenge/verify primitive that lets one party prove control
332333
domain to another using a short-lived TXT record at `_agents-challenge.{domain}`.
333334
It implements [draft-ietf-dnsop-domain-verification-techniques-12](https://datatracker.ietf.org/doc/draft-ietf-dnsop-domain-verification-techniques/)
334335
plus the `bnd-req` binding extension from
335-
[draft-mozleywilliams-dnsop-dnsaid-01](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/).
336+
[draft-mozleywilliams-dnsop-dnsaid-02](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/).
336337

337338
**Role split:**
338339
- *Challenger* — calls `issue()` and `verify()`; no DNS write credentials required.
@@ -580,7 +581,9 @@ agent = AgentRecord(
580581

581582
| Property | Type | Description |
582583
|----------|------|-------------|
583-
| `fqdn` | `str` | Full DNS-AID record name: `_{name}._{protocol}._agents.{domain}` |
584+
| `fqdn` | `str` | Full DNS-AID record name (draft-02 flat primary owner): `{name}.{domain}` |
585+
| `walkable_fqdn` | `str` | Optional walkable AliasMode form: `{name}._agents.{domain}` |
586+
| `legacy_fqdn` | `str` | Legacy -01 form: `_{name}._{protocol}._agents.{domain}` (used only by the back-compat discovery path) |
584587
| `endpoint_url` | `str` | Full URL: `https://{target_host}:{port}` |
585588
| `svcb_target` | `str` | SVCB target with trailing dot |
586589

@@ -767,7 +770,7 @@ async with InfobloxBloxOneBackend() as backend:
767770
| `INFOBLOX_DNS_VIEW` | No | `default` | DNS view name |
768771
| `INFOBLOX_BASE_URL` | No | `https://csp.infoblox.com` | API URL |
769772

770-
**DNS-AID Compliance**: Infoblox UDDI is **not fully compliant** with the [DNS-AID draft](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid-01/). It only supports alias mode SVCB (priority 0) and lacks `alpn`, `port`, and `mandatory` parameters. For full compliance, use Route53Backend, InfobloxNIOSBackend, NS1Backend, or DDNSBackend.
773+
**DNS-AID Compliance**: Infoblox UDDI is **not fully compliant** with the [DNS-AID draft](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid-02/). It only supports alias mode SVCB (priority 0) and lacks `alpn`, `port`, and `mandatory` parameters. For full compliance, use Route53Backend, InfobloxNIOSBackend, NS1Backend, or DDNSBackend.
771774

772775
### InfobloxNIOSBackend
773776

@@ -933,7 +936,7 @@ Sign a DNS record payload with a private key.
933936
from dns_aid.core.jwks import sign_record, RecordPayload
934937

935938
payload = RecordPayload(
936-
fqdn="_payment._mcp._agents.example.com",
939+
fqdn="payment.example.com",
937940
target="payment.example.com",
938941
port=443,
939942
alpn="mcp",
@@ -1052,7 +1055,7 @@ dns-aid discover example.com --protocol mcp
10521055
dns-aid discover example.com --use-http-index
10531056

10541057
# Verify an agent
1055-
dns-aid verify _my-agent._mcp._agents.example.com
1058+
dns-aid verify my-agent.example.com
10561059

10571060
# List all agents in a zone
10581061
dns-aid list example.com
@@ -1076,7 +1079,7 @@ dns-aid index sync example.com # Sync index with actual DNS records
10761079
```bash
10771080
# Send a message to an A2A agent (discover-first: DNS → agent card → invoke)
10781081
dns-aid message --domain ai.infoblox.com --name security-analyzer \
1079-
"Analyze security of _marketing._a2a._agents.ai.infoblox.com"
1082+
"Analyze security of marketing.ai.infoblox.com"
10801083

10811084
# Send a message to an A2A agent (direct endpoint)
10821085
dns-aid message --endpoint https://security-analyzer.ai.infoblox.com \
@@ -1521,7 +1524,7 @@ async with AgentClient(config) as client:
15211524

15221525
# Get rankings for specific agents only
15231526
rankings = await client.fetch_rankings(
1524-
fqdns=["_booking._mcp._agents.example.com"],
1527+
fqdns=["booking.example.com"],
15251528
limit=10
15261529
)
15271530

@@ -1843,6 +1846,6 @@ print(dns_aid.__version__) # "0.6.0"
18431846
## See Also
18441847

18451848
- [Getting Started Guide](getting-started.md)
1846-
- [IETF Draft: DNS-AID](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid-01/)
1849+
- [IETF Draft: DNS-AID](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid-02/)
18471850
- [RFC 9460: SVCB Records](https://www.rfc-editor.org/rfc/rfc9460.html)
18481851
- [GitHub Repository](https://github.com/infobloxopen/dns-aid-core)

0 commit comments

Comments
 (0)