<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-pro-adp-agent-discovery-00" submissionType="IETF" category="info" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true">

<front>
<title abbrev="adp-agent-discovery">Agent Discovery Protocol (ADP)</title><seriesInfo value="draft-pro-adp-agent-discovery-00" stream="IETF" status="informational" name="Internet-Draft"></seriesInfo>
<author initials="H." surname="Lian" fullname="Harry Lian"><organization>AI Pair</organization><address><postal><street></street>
</postal><email>harrylian8766@gmail.com</email>
</address></author><date/>
<area>Applications</area>
<workgroup>Independent Submission</workgroup>
<keyword>agent</keyword>
<keyword>discovery</keyword>
<keyword>dns</keyword>
<keyword>well-known</keyword>
<keyword>srv</keyword>
<keyword>ed25519</keyword>

<abstract>
<t>This document specifies the Agent Discovery Protocol (ADP), a three-layer
discovery mechanism for AI Agents that leverages existing Internet
infrastructure: DNS TXT and SRV records for lightweight service discovery
(Layer 1), Well-Known URIs for machine-readable metadata (Layer 2), and
HTML landing pages with WebSocket channels for human interaction and
inter-agent communication (Layer 3). ADP enables any domain owner to make
their AI Agent discoverable without relying on centralized registries,
using the Domain Name System as the decentralized trust anchor.</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>

<section anchor="background"><name>Background</name>
<t>AI Agents are rapidly evolving from chatbot plugins into autonomous
internet-native entities. Yet the ecosystem lacks a universal discovery
mechanism: agents are locked inside proprietary platforms (OpenAI, Dify,
Coze), each with its own directory and identity system. An agent on one
platform cannot natively discover an agent on another.</t>
<t>The Web solved an analogous problem 40 years ago: any resource can be
discovered through a combination of DNS names, well-known ports, and HTML
document interlinking. This specification applies the same principle to
Agents.</t>
</section>

<section anchor="design-goals"><name>Design Goals</name>

<ul spacing="compact">
<li><strong>Decentralized</strong>: No central registry required; domain ownership is the
root of identity.</li>
<li><strong>Incremental discovery</strong>: Solve at the lowest possible layer; only
escalate to heavier mechanisms when needed.</li>
<li><strong>Web-native</strong>: Build on existing IETF standards (DNS, TLS, Well-Known
URIs, WebSocket) rather than invent new protocols.</li>
<li><strong>Human-and-machine readable</strong>: The same endpoint serves both a browser
user and an automated agent.</li>
<li><strong>Secure by default</strong>: Public key fingerprint bound to the DNS record
provides first-meeting trust without pre-shared keys or PKI.</li>
</ul>
</section>
</section>

<section anchor="terminology"><name>Terminology</name>
<t>{::boilerplate bcp14-tagged}</t>

<dl spacing="compact">
<dt>Agent:</dt>
<dd>An autonomous or semi-autonomous software entity identified by a domain
name, capable of being discovered through ADP and interacting via
standard Web protocols.</dd>
<dt>Agent Domain:</dt>
<dd>A fully qualified domain name (FQDN) that serves as the canonical
identifier for an Agent. The agent URI scheme is <tt>agent:{domain}</tt>.</dd>
<dt>Discovery Client:</dt>
<dd>Software that performs ADP discovery to locate and verify an Agent's
identity, capabilities, and endpoints.</dd>
<dt>Fingerprint:</dt>
<dd>The SHA-256 hash of an Ed25519 public key, encoded in base64url and
prefixed with <tt>ed25519:</tt>.</dd>
</dl>
</section>

<section anchor="protocol-overview"><name>Protocol Overview</name>
<t>The Agent Discovery Protocol defines a three-layer discovery and
interaction stack:</t>

<ol>
<li><t><strong>Layer 1 — DNS Discovery:</strong> A TXT record at <tt>_agent.{domain}</tt> carries the
protocol version, a public key fingerprint, and the Well-Known URI. An
optional SRV record at <tt>_agent._tcp.{domain}</tt> locates the Agent's
service endpoints.</t>
</li>
<li><t><strong>Layer 2 — Well-Known Metadata:</strong> <tt>GET /.well-known/agent.json</tt> returns a
JSON document containing the Agent's full identity, capabilities,
relationship graph, security policies, and endpoint map.</t>
</li>
<li><t><strong>Layer 3 — Interaction Endpoints:</strong> An HTML landing page at the domain
root provides human-readable discovery with embedded JSON-LD
structured data. WebSocket endpoints enable real-time inter-agent
communication with Ed25519 signature authentication.</t>
</li>
</ol>
<t><strong>Core principle</strong>: Solve at the lowest possible layer. If DNS records
suffice, do not issue an HTTP request. If Well-Known metadata suffices, do
not open a WebSocket.</t>
</section>

<section anchor="layer-1-dns-discovery"><name>Layer 1: DNS Discovery</name>

<section anchor="txt-record-required"><name>TXT Record (REQUIRED)</name>
<t>Every ADP-compliant Agent MUST publish a DNS TXT record at
<tt>_agent.{domain}</tt> containing semicolon-delimited key-value pairs.</t>

<section anchor="record-format"><name>Record Format</name>

<artwork><![CDATA[_agent.{domain}.  IN  TXT  "v=ADP1; pk=<fingerprint>; wk=<well-known-uri>"
]]></artwork>
</section>

<section anchor="fields"><name>Fields</name>

<dl spacing="compact">
<dt>v:</dt>
<dd>Protocol version. Current value: <tt>ADP1</tt>. REQUIRED.</dd>
<dt>pk:</dt>
<dd>Public key fingerprint in the format <tt>ed25519:&lt;base64url-sha256&gt;</tt>.
Computed as the SHA-256 hash of the raw 32-byte Ed25519 public key,
encoded in base64url without padding (Section 5 of {{!RFC4648}}).
REQUIRED.</dd>
<dt>wk:</dt>
<dd>Full URL to the Well-Known agent metadata endpoint. MUST use HTTPS.
REQUIRED.</dd>
<dt>rel:</dt>
<dd>Optional comma-separated list of relationship tags. Defined values
include <tt>self</tt>, <tt>parent</tt>, and <tt>cluster:{name}</tt>.</dd>
<dt>note:</dt>
<dd>Optional human-readable description, maximum 64 octets.</dd>
</dl>
</section>

<section anchor="multi-record-txt"><name>Multi-Record TXT</name>
<t>When the combined key-value string exceeds 255 octets (a single TXT
resource record limit), it SHOULD be split across multiple TXT records at
the same owner name. Reassembly is performed by concatenating the RDATA
value of each TXT record in the order returned by the DNS resolver.</t>
</section>

<section anchor="discovery-procedure"><name>Discovery Procedure</name>

<ol spacing="compact">
<li>Query <tt>IN TXT _agent.{domain}</tt> using a DNSSEC-validating resolver.</li>
<li>Parse semicolon-delimited fields from the concatenated TXT data.</li>
<li>Verify <tt>v=ADP1</tt> is present.</li>
<li>Extract the <tt>pk</tt> fingerprint and <tt>wk</tt> Well-Known URL.</li>
<li>Optionally cache the fingerprint for subsequent signature verification.</li>
</ol>
</section>
</section>

<section anchor="srv-record-recommended"><name>SRV Record (RECOMMENDED)</name>
<t>Agents that operate their own service endpoints SHOULD publish a DNS SRV
record {{!RFC2782}}:</t>

<artwork><![CDATA[_agent._tcp.{domain}.  IN  SRV  <priority> <weight> <port> <target>
]]></artwork>
<t>The <tt>target</tt> field MUST resolve to a host providing ADP-compliant service
endpoints. If no SRV record is published, Discovery Clients SHOULD fall
back to connecting to <tt>{domain}</tt> on TCP port 443 (HTTPS).</t>
</section>
</section>

<section anchor="layer-2-well-known-metadata"><name>Layer 2: Well-Known Metadata</name>

<section anchor="endpoint"><name>Endpoint</name>
<t>Every ADP-compliant Agent MUST serve a JSON document at:</t>

<artwork><![CDATA[/.well-known/agent.json
]]></artwork>
<t>As defined in {{!RFC8615}}, this URI suffix is registered under the
<tt>/.well-known/</tt> namespace.</t>
</section>

<section anchor="content-type"><name>Content Type</name>
<t>The response MUST include <tt>Content-Type: application/json</tt>. The document
MUST be valid JSON {{!RFC8259}}.</t>
</section>

<section anchor="schema"><name>Schema</name>
<t>The root object contains the following top-level members:</t>

<dl>
<dt>protocol (string, REQUIRED):</dt>
<dd>Protocol version string, e.g. <tt>&quot;ADP/1.0&quot;</tt>.</dd>
<dt>identity (object, REQUIRED):</dt>
<dd><t>Agent identity block.</t>

<ul spacing="compact">
<li><tt>id</tt> (string): Agent URI in the format <tt>agent:{domain}</tt>.</li>
<li><tt>domain</tt> (string): Canonical FQDN.</li>
<li><tt>name</tt> (string): Human-readable Agent name.</li>
<li><tt>owner</tt> (string): Display name of the entity operating the Agent.</li>
<li><tt>created</tt> (string): ISO 8601 creation timestamp.</li>
<li><tt>publicKey</tt> (object): Contains <tt>algorithm</tt> (<tt>&quot;ed25519&quot;</tt>), <tt>fingerprint</tt>
(string), and optional <tt>full</tt> (base64url-encoded full public key).</li>
</ul></dd>
<dt>endpoints (object, REQUIRED):</dt>
<dd><t>Map of logical endpoint names to absolute URLs.</t>

<ul spacing="compact">
<li><tt>discovery</tt>: Landing page URL.</li>
<li><tt>wellKnown</tt>: Canonical Well-Known URL.</li>
<li><tt>chat</tt>: WebSocket Secure URL for real-time chat.</li>
<li><tt>tasks</tt>: HTTPS URL for asynchronous task submission.</li>
<li><tt>swarm</tt>: HTTPS URL for multi-agent coordination.</li>
</ul></dd>
<dt>capabilities (array, REQUIRED):</dt>
<dd><t>Array of capability objects, each describing a skill the Agent offers:
<tt>id</tt>, <tt>name</tt>, <tt>description</tt>, <tt>input</tt> (array of MIME types), <tt>output</tt>
(array of MIME types), <tt>interfaces</tt> (array of <tt>chat</tt>/<tt>api</tt>/<tt>webhook</tt>),
<tt>languages</tt> (array of BCP 47 tags), and <tt>pricing</tt> (object with <tt>model</tt>
and optional <tt>details</tt>).</t>
</dd>
<dt>interfaces (object, OPTIONAL):</dt>
<dd><t>Map of interface type to URL.</t>
</dd>
<dt>relationships (array, OPTIONAL):</dt>
<dd><t>Known peer Agents. Each entry contains <tt>type</tt> (<tt>peer</tt>/<tt>child</tt>/<tt>parent</tt>),
<tt>id</tt> (Agent URI), <tt>name</tt>, optional <tt>trust</tt> level, and optional <tt>since</tt>
timestamp.</t>
</dd>
<dt>security (object, REQUIRED):</dt>
<dd><t>Security configuration. Contains <tt>tlsRequired</tt> (boolean), <tt>minProtocolVersion</tt>,
<tt>authMethods</tt> (array, e.g. <tt>[&quot;pubkey&quot;]</tt>), and optional <tt>rateLimit</tt> object.</t>
</dd>
<dt>policies (object, OPTIONAL):</dt>
<dd><t>Links to privacy policy, terms of service, data retention policy, and
third-party data sharing declaration.</t>
</dd>
<dt>availability (object, REQUIRED):</dt>
<dd><t>Current status (<tt>online</tt>/<tt>offline</tt>/<tt>maintenance</tt>), uptime commitment,
optional maintenance window.</t>
</dd>
<dt>meta (object, OPTIONAL):</dt>
<dd><t>Document metadata: <tt>updated</tt> timestamp, <tt>version</tt>, <tt>generator</tt> string.</t>
</dd>
</dl>

<section anchor="example"><name>Example</name>

<artwork><![CDATA[{
  "protocol": "ADP/1.0",
  "identity": {
    "id": "agent:alice.agent",
    "domain": "alice.agent",
    "name": "Alice's Agent",
    "owner": "Alice",
    "created": "2026-01-01T00:00:00Z",
    "publicKey": {
      "algorithm": "ed25519",
      "fingerprint": "ed25519:abc123..."
    }
  },
  "endpoints": {
    "discovery": "https://alice.agent/",
    "wellKnown": "https://alice.agent/.well-known/agent.json",
    "chat": "wss://alice.agent/agent/chat",
    "tasks": "https://alice.agent/agent/tasks"
  },
  "capabilities": [
    {
      "id": "chat",
      "name": "Conversation",
      "description": "General-purpose conversational AI",
      "input": ["text", "image"],
      "output": ["text", "html"],
      "interfaces": ["chat", "api"],
      "languages": ["en", "zh"],
      "pricing": { "model": "free" }
    }
  ],
  "security": {
    "tlsRequired": true,
    "minProtocolVersion": "ADP/1.0",
    "authMethods": ["pubkey"],
    "rateLimit": { "requestsPerMinute": 60 }
  },
  "availability": {
    "status": "online"
  }
}
]]></artwork>
</section>
</section>
</section>

<section anchor="layer-3-interaction-endpoints"><name>Layer 3: Interaction Endpoints</name>

<section anchor="html-landing-page"><name>HTML Landing Page</name>
<t>The domain root (<tt>/</tt>) SHOULD return an HTML document suitable for browser
rendering. The page serves as the human-facing Agent card and MUST embed
structured data for machine consumption.</t>

<section anchor="json-ld-embedding"><name>JSON-LD Embedding</name>
<t>The page MUST include a <tt>&lt;script type=&quot;application/ld+json&quot;&gt;</tt> block
containing the complete Agent metadata as a JSON-LD document. This allows
automated discovery from a single HTTP GET request.</t>
</section>

<section anchor="html-meta-tags"><name>HTML Meta Tags</name>
<t>The page SHOULD include the following <tt>&lt;meta&gt;</tt> elements in the document
<tt>&lt;head&gt;</tt>:</t>

<ul spacing="compact">
<li><tt>&lt;meta name=&quot;agent-id&quot; content=&quot;agent:{domain}&quot;&gt;</tt></li>
<li><tt>&lt;meta name=&quot;agent-protocol&quot; content=&quot;ADP/1.0&quot;&gt;</tt></li>
<li><tt>&lt;meta name=&quot;agent-fingerprint&quot; content=&quot;ed25519:...&quot;&gt;</tt></li>
</ul>
</section>
</section>

<section anchor="websocket-communication"><name>WebSocket Communication</name>

<section anchor="endpoint-1"><name>Endpoint</name>
<t>The Agent's WebSocket endpoint (published in the Well-Known JSON under
<tt>endpoints.chat</tt>) provides a real-time, bidirectional communication
channel between Agents.</t>
</section>

<section anchor="connection-handshake"><name>Connection Handshake</name>
<t>Upon connection, the client MUST send an <tt>adp_handshake</tt> message
containing:</t>

<artwork><![CDATA[{
  "type": "adp_handshake",
  "protocol": "ADP/1.0",
  "agent_id": "agent:caller.domain",
  "public_key": "<base64url-encoded Ed25519 public key>",
  "nonce": "<random hex string>"
}
]]></artwork>
<t>The server responds with its own handshake message, and subsequent
messages are authenticated with Ed25519 signatures.</t>
</section>

<section anchor="message-format"><name>Message Format</name>
<t>All messages after handshake MUST be JSON objects with <tt>type</tt>, <tt>id</tt>,
<tt>timestamp</tt>, and <tt>signature</tt> fields:</t>

<artwork><![CDATA[{
  "type": "message",
  "id": "<uuid>",
  "timestamp": "<ISO 8601>",
  "from": "agent:caller.domain",
  "to": "agent:target.domain",
  "payload": { ... },
  "signature": "<base64url Ed25519 signature>"
}
]]></artwork>
<t>The signature covers the concatenation of <tt>type</tt>, <tt>id</tt>, <tt>timestamp</tt>,
<tt>from</tt>, <tt>to</tt>, and the canonical JSON serialization of <tt>payload</tt>.</t>
</section>
</section>
</section>

<section anchor="security-model"><name>Security Model</name>

<section anchor="trust-chain"><name>Trust Chain</name>
<t>ADP establishes a trust chain anchored in DNSSEC and the domain
registration system:</t>

<artwork><![CDATA[DNSSEC-validated TXT record
  → fingerprint (embed in DNS)
    → Well-Known agent.json (verify fingerprint matches)
      → full public key (publish in JSON)
        → Ed25519 signatures (verify every message)
]]></artwork>
</section>

<section anchor="trust-levels"><name>Trust Levels</name>
<t>Discovery Clients assign one of four trust levels:</t>

<ol spacing="compact">
<li><strong>unverified</strong> — DNS resolved but no verification performed.</li>
<li><strong>dns-verified</strong> — TXT record was validated via DNSSEC.</li>
<li><strong>key-verified</strong> — Public key fingerprint from DNS matches the Agent's
Well-Known document and the Agent successfully signed a challenge.</li>
<li><strong>peer-verified</strong> — Mutual verification between known peers, tracked
in the <tt>relationships</tt> array with a <tt>trust</tt> value of <tt>verified</tt>.</li>
</ol>
</section>

<section anchor="threat-mitigations"><name>Threat Mitigations</name>
<t><strong>Domain hijacking</strong>: DNSSEC validation prevents DNS cache poisoning.
Even without DNSSEC, the fingerprint comparison between DNS TXT and
Well-Known JSON provides a second factor.</t>
<t><strong>Man-in-the-middle</strong>: TLS 1.3 is REQUIRED for all HTTP and WebSocket
endpoints. The DNS-anchored fingerprint allows detection of TLS
termination attacks.</t>
<t><strong>Impersonation</strong>: An attacker who controls a different domain cannot
claim another Agent's identity because the domain IS the identity. No
certificate authority can issue a valid certificate for another domain
without compromising that domain's DNS or the CA itself.</t>
<t><strong>Key rotation</strong>: Agents SHOULD publish a <tt>previousFingerprint</tt> field in
their Well-Known document during key rotation. Discovery Clients SHOULD
accept the new key if it can be validated through the old key's signature
over a key rotation message.</t>
</section>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="well-known-uri-registration"><name>Well-Known URI Registration</name>
<t>This document requests registration of the &quot;agent&quot; Well-Known URI in the
&quot;Well-Known URIs&quot; registry established by {{!RFC8615}}.</t>

<ul spacing="compact">
<li>URI suffix: agent</li>
<li>Change controller: IETF</li>
<li>Specification document(s): This document</li>
<li>Related information: Agent metadata is served in JSON format at
<tt>/.well-known/agent.json</tt></li>
</ul>
</section>

<section anchor="srv-service-name-registration"><name>SRV Service Name Registration</name>
<t>This document requests registration of the &quot;_agent&quot; service name in the
&quot;Service Name and Transport Protocol Port Number Registry&quot; for TCP.</t>

<ul spacing="compact">
<li>Service Name: agent</li>
<li>Transport Protocol: TCP</li>
<li>Assignee: IETF (IESG)</li>
<li>Contact: Harry Lian <eref target="mailto:harry@aipair.ai">harry@aipair.ai</eref></li>
<li>Description: AI Agent Discovery Protocol service endpoint</li>
<li>Reference: This document</li>
<li>Port Number: None (uses SRV-defined port)</li>
</ul>
</section>

<section anchor="media-type-registration"><name>Media Type Registration</name>
<t>This document requests registration of the media type
<tt>application/adp+json</tt> in the &quot;Media Types&quot; registry.</t>

<ul spacing="compact">
<li>Type name: application</li>
<li>Subtype name: adp+json</li>
<li>Required parameters: N/A</li>
<li>Optional parameters: N/A</li>
<li>Encoding considerations: binary (UTF-8 JSON)</li>
<li>Security considerations: See Security Considerations of this document</li>
<li>Interoperability considerations: N/A</li>
<li>Published specification: This document</li>
<li>Applications that use this media type: ADP-compliant Agent hosts and
discovery clients</li>
<li><t>Additional information:</t>

<ul spacing="compact">
<li>Deprecated alias names for this type: N/A</li>
<li>Magic number(s): N/A</li>
<li>File extension(s): N/A</li>
<li>Macintosh file type code(s): N/A</li>
</ul></li>
</ul>
</section>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="dnssec-dependency"><name>DNSSEC Dependency</name>
<t>The security of the trust chain depends on DNSSEC validation. Discovery
Clients SHOULD use DNSSEC-validating resolvers and MUST treat
non-validated DNS responses as <tt>unverified</tt> trust level. In environments
where DNSSEC is unavailable, the fingerprint comparison between DNS TXT
and Well-Known JSON provides defense-in-depth but does not constitute full
verification.</t>
</section>

<section anchor="key-management"><name>Key Management</name>
<t>Agents MUST protect their Ed25519 private key with the same care as a TLS
private key. Compromise of the private key allows an attacker to
impersonate the Agent across all communication channels. Key rotation
SHOULD be performed by publishing a new fingerprint in DNS TXT, updating
the Well-Known document, and (optionally) signing a rotation message with
the previous key.</t>
</section>

<section anchor="denial-of-service"><name>Denial of Service</name>
<t>The Well-Known endpoint is a JSON document typically under 16 KiB and is
cacheable. Rate limiting at the application layer (published in
<tt>security.rateLimit</tt>) and standard HTTP caching headers SHOULD be
employed to prevent abuse.</t>
</section>

<section anchor="privacy-considerations"><name>Privacy Considerations</name>
<t>Agent discovery is inherently public: any party that knows a domain name
can discover the associated Agent's capabilities and endpoints. Agents
SHOULD NOT include personally identifiable information in their
Well-Known documents. The <tt>policies.privacy</tt> URL provides a mechanism for
Agents to declare their data handling practices.</t>
</section>
</section>

<section anchor="operational-considerations"><name>Operational Considerations</name>

<section anchor="dns-caching"><name>DNS Caching</name>
<t>Discovery Clients SHOULD cache DNS TXT and SRV query results for the TTL
specified in the DNS response, up to a maximum of 3600 seconds.</t>
</section>

<section anchor="well-known-caching"><name>Well-Known Caching</name>
<t>The Well-Known JSON document SHOULD be served with appropriate HTTP
caching headers (<tt>Cache-Control</tt>, <tt>ETag</tt>). Discovery Clients SHOULD
honor these headers and MAY use conditional requests.</t>
</section>

<section anchor="version-negotiation"><name>Version Negotiation</name>
<t>The protocol version is carried in DNS TXT (<tt>v</tt> field) and echoed in the
Well-Known JSON (<tt>protocol</tt> field). If a Discovery Client encounters a
version it does not support, it SHOULD abort discovery and report the
incompatibility. New protocol versions MUST increment the version string
(e.g., <tt>ADP2</tt>).</t>
</section>

<section anchor="backwards-compatibility"><name>Backwards Compatibility</name>
<t>ADP/1.0 is the initial protocol version. Future versions SHOULD be
backwards-compatible in their discovery layers (TXT record format,
Well-Known schema additions are non-breaking if unknown fields are
ignored).</t>
<t>--- back</t>
</section>
</section>

<section anchor="acknowledgments"><name>Acknowledgments</name>
<t>This protocol was conceived through discussions between Harry Lian and Pro
on the nature of the Agent Internet, with the shared conviction that
Agents should inherit the Web's proven infrastructure rather than
reinventing it.</t>
</section>

<section anchor="sample-txt-record"><name>Sample TXT Record</name>

<artwork><![CDATA[_agent.alice.agent.  3600  IN  TXT  "v=ADP1; pk=ed25519:dGhpcyBpcyBhIHRlc3Q; wk=https://alice.agent/.well-known/agent.json"
]]></artwork>
</section>

<section anchor="sample-srv-record"><name>Sample SRV Record</name>

<artwork><![CDATA[_agent._tcp.alice.agent.  3600  IN  SRV  10 5 443 alice.agent.
]]></artwork>
</section>

<section anchor="reference-implementations"><name>Reference Implementations</name>

<ul spacing="compact">
<li>Node.js SDK: <eref target="https://github.com/harrylian8766/adp-protocol">https://github.com/harrylian8766/adp-protocol</eref></li>
<li>Protocol registry: <eref target="https://agent-discovery.org">https://agent-discovery.org</eref></li>
</ul>
</section>

</middle>

<back>

</back>

</rfc>
