<?xml version="1.0" encoding="utf-8"?>
<!-- 
     draft-rfcxml-general-template-standard-00
  
     This template includes examples of the most commonly used features of RFCXML with comments 
     explaining how to customise them. This template can be quickly turned into an I-D by editing 
     the examples provided. Look for [REPLACE], [REPLACE/DELETE], [CHECK] and edit accordingly.
     Note - 'DELETE' means delete the element or attribute, not just the contents.
     
     Documentation is at https://authors.ietf.org/en/templates-and-schemas
-->
<?xml-model href="rfc7991bis.rnc"?>  <!-- Required for schema validation and schema-aware editing -->
<!-- <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> -->
<!-- This third-party XSLT can be enabled for direct transformations in XML processors, including most browsers -->


<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<!-- If further character entities are required then they should be added to the DOCTYPE above.
     Use of an external entity file is not recommended. -->

<rfc
  xmlns:xi="http://www.w3.org/2001/XInclude"
  category="std"
  docName="draft-jia-oauth-scope-aggregation-00"
  ipr="trust200902"
  obsoletes=""
  updates=""
  submissionType="IETF"
  consensus="true"
  xml:lang="en"
  version="3">
<!-- [REPLACE] 
       * docName with name of your draft
     [CHECK] 
       * category should be one of std, bcp, info, exp, historic
       * ipr should be one of trust200902, noModificationTrust200902, noDerivativesTrust200902, pre5378Trust200902
       * updates can be an RFC number as NNNN
       * obsoletes can be an RFC number as NNNN 
-->

  <front>
    <title abbrev="OAuth Scope Aggregation">OAuth 2.0 Scope Aggregation for Multi-Step AI Agent Workflows</title>
    <!--  [REPLACE/DELETE] abbrev. The abbreviated title is required if the full title is longer than 39 characters -->

    <seriesInfo name="Internet-Draft" value="draft-jia-oauth-scope-aggregation-00"/>
   
    <author fullname="Yukuan Jia" initials="Y." surname="Jia">
      <!-- [CHECK]
             * initials should not include an initial for the surname
             * role="editor" is optional -->
    <!-- Can have more than one author -->
      
    <!-- all of the following elements are optional -->
      <organization>Huawei</organization>
      <address>
        <postal>
          <!-- Reorder these if your country does things differently -->
          <street>Huawei Bld., No.156 Beiqing Rd.</street>
          <city>Beijing</city>
          <code>100095</code>
          <country>China</country>
          <!-- Uses two letter country code -->
        </postal>        
        <email>jiayukuan@huawei.com</email>  
        <!-- Can have more than one <email> element -->
      </address>
    </author>

    <author fullname="Shuping Peng" initials="S." surname="Peng">
      <!-- [CHECK]
             * initials should not include an initial for the surname
             * role="editor" is optional -->
    <!-- Can have more than one author -->
      
    <!-- all of the following elements are optional -->
      <organization>Huawei</organization>
      <address>
        <postal>
          <!-- Reorder these if your country does things differently -->
          <street>Huawei Bld., No.156 Beiqing Rd.</street>
          <city>Beijing</city>
          <code>100095</code>
          <country>China</country>
          <!-- Uses two letter country code -->
        </postal>        
        <email>pengshuping@huawei.com</email>  
        <!-- Can have more than one <email> element -->
      </address>
    </author>

    <date day="10" month="Feb" year="2026"/> <!--TODO: check date before submission -->

    <!-- On draft submission:
         * If only the current year is specified, the current day and month will be used.
         * If the month and year are both specified and are the current ones, the current day will
           be used
         * If the year is not the current one, it is necessary to specify at least a month and day="1" will be used.
    -->

    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <!-- "Internet Engineering Task Force" is fine for individual submissions.  If this element is 
          not present, the default is "Network Working Group", which is used by the RFC Editor as 
          a nod to the history of the RFC Series. -->

    <keyword>OAuth, Authorization, AI Agent</keyword>
    <!-- [REPLACE/DELETE]. Multiple allowed.  Keywords are incorporated into HTML output files for 
         use by search engines. -->

    <abstract>
      <t>This document describes a scope-aggregated OAuth 2.0 authorization pattern for multi-step AI agent workflows. 
      An AI agent aggregates the scopes required across a workflow and only initiates a single authorization procedure for the aggregated scope. 
      This reduces repeated user consents and multiple authorization round-trips, improving authorization efficiency.</t>
    </abstract>
 
  </front>

  <middle>
    
    <section>
      <name>Introduction</name>
      <t>Recent advances in large language models (LLMs) enable AI agents to plan and execute multi-step workflows for complex tasks. 
      With agent communication protocols, AI agents can call third-party tools and delegate tasks to other AI agents. 
      When an AI agent is acting on behalf of a human user, these interoperations should require authentication and authorization.</t>
      
      <t>The OAuth 2.0 authorization framework <xref target="RFC6749"/> has been a widely preferred method for granting an AI agent access to protected resources in existing agent communication protocols. 
      Acting as an OAuth client, an AI agent must present a valid access token with appropriate scopes for each request to access a protected resource.
      If the token is missing or lacks the required scope, the resource server will reject the request with an HTTP 401/403 error response. 
      The agent is then expected to perform authorization server discovery and initiate an OAuth flow to obtain an access token as shown in <xref target="fig-agent-auth"/>, involving end user authentication and consent.
      This challenge-triggered flow repeats for each scope deficiency when an AI agent workflow spans across multiple protected resources, causing user fatigue and increased end-to-end latency.</t>

      <figure anchor="fig-agent-auth">
        <name>OAuth 2.0 authorization flow for AI agents</name>
        <artset>
        <!-- This <artset> includes two <artwork> elements, each of a different type -->
          <artwork type="ascii-art" name="stream.txt">
          <![CDATA[
                                  .-------------------------.
                                  |  Authorization Domain   |
                                  |                         |
                                  |    +-----------------+  |
  +--------+                      |    |                 |  |
  |        |---(a) Auth request---+--->|                 |  |
  |        |                      |    |                 |  |
  |  End   |---(b) User consent---+--->|  Authorization  |  |
  |  User  |                      |    |     Server      |  |
  |        |<--(c) Auth code------+----|                 |  |
  |        |                      |    |                 |  |
  +--------+                      |    +-----------------+  |
    ^    |                        |          ^      |       |
(a) |    | (c)                    |          |      |       |
Auth|    | Auth                   |          |      |       |
Req |    | Code  .-----(d) Token Exchange----'      |       |
    |    |       |                |                 |       |
    |    v       |                |                 |       |
  +--------+     |  .--(e) Access Token-------------'       |
  |        |-----'  |             |                         |
  |        |        |             |    +-----------------+  |
  |  AI    |<-------'             |    | Resource Server |  |
  | Agent  |                      |    |                 |  |
  |        |---(f) Request w/ Token--->| +-------------+ |  |
  |        |                      |    | |   Resource  | |  |
  |        |<--(g) Response-------+----| |   Metadata  | |  |
  +--------+                      |    | +-------------+ |  |
                                  |    | +-----+ +-----+ |  |
                                  |    | |Tool | |Tool | |  |
                                  |    | | A1  | | A2  | |  |
                                  |    | +-----+ +-----+ |  |
                                  |    +-----------------+  |
                                  '-------------------------'
          ]]>
          </artwork>
        </artset>
      </figure>

      <t>This document defines an authorization domain as a logical grouping of the scopes authorizable by a single trust anchor (e.g., an OAuth 2.0 authorization server). 
      Within this domain, an AI agent can request multiple scopes (e.g., email:read, calendar:write) that share a common user identity and consent context.
      Given a multi-step workflow, an AI agent first computes the minimal aggregation of the required scopes within each authorization domain.
      Subsequently, the agent performs authorization server discovery and initiates a scope-aggregated authorization flow to obtain the access token.
      This approach reduces repeated user consent and multiple authorization round-trips while preserving least privilege.</t>

      <section>
        <name>Requirements Language</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
          "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
          RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
          interpreted as described in BCP 14 <xref target="RFC2119"/>
          <xref target="RFC8174"/> when, and only when, they appear in
          all capitals, as shown here.</t>
      </section>

    </section>
    
    <section>
      <name>Terminology</name>
      <dl newline="true">
        <dt>AI Agent</dt>
        <dd>An entity with built-in intelligence, which can perform actions to accomplish tasks, possibly on behalf of an end-user or another agent.</dd>
        <dt>Agent Communication Protocol</dt>
        <dd>A protocol that defines how an agent discovers and utilizes server-exposed resources (e.g., tools, skills, etc.). 
        For example, Model Context Protocol (MCP) protocol <xref target="MCP"/> defines how to discover and call tools, and Agent-to-Agent (A2A) protocol <xref target="A2A"/> defines how to invoke other AI agents.</dd>
        <dt>Agent Workflow</dt>
        <dd>A sequence of steps to accomplish a task, which may be pre-built by a human or planned by an agent. 
        These steps may include access to one or more resources on remote resource servers.
        An agent workflow may be structured as a chain or a tree with parallel branches.</dd>
        <dt>Resource Server (RS)</dt>
        <dd>An OAuth 2.0 term for the server hosting one or more protected resources that require access token for access.
        The resources are invocable, server-exposed units of functionality.</dd>
        <dt>Authorization Server (AS)</dt>
        <dd>An OAuth 2.0 term for the server that issues access tokens to AI agent after successfully authenticating the resource owner and obtaining consent for authorization.</dd>
        <dt>Authorization Domain (AD)</dt>
        <dd>A logical grouping of scopes authorizable by a single trust anchor. 
        For example, scopes like mail.read and calendar.write within a single ecosystem belong to the same authorization domain.</dd>
      </dl>
    </section>
    
    <section anchor="sect-metadata">
      <name>Security Member in Resource Metadata</name>
      <t>For the purpose of resource discovery, an AI agent obtains resource metadata by invoking a protocol method or by retrieving a description document from a well-known URI. 
      Such resources may be referred to as "tools" or "skills" in different contexts. 
      This document extends the resource metadata object by defining a <tt>security</tt> member that MAY be included to indicate a resource's authorization requirements.</t>
      
      <t>The resource metadata is represented in JSON format. It MUST contain the following members:</t>
      <dl newline="true">
        <dt>name</dt>
        <dd>A string that provides a unique identifier for the resource.</dd>
        <dt>description</dt>
        <dd>A human-readable string that describes the resource.</dd>
        <dt>input_schema</dt>
        <dd>A machine-readable schema (e.g., JSON schema) describing the parameters required to execute the resource.</dd>
      </dl>
      
      <t>This document defines an OPTIONAL <tt>security</tt> member within the resource metadata. 
      When present, the security object indicates the authorization requirements for the resource and contains the following members:</t>
      <dl newline="true">
        <dt>type</dt>
        <dd>REQUIRED. An array of strings specifying one or more supported security schemes. 
        This document defines the value "oauth2" for use with the OAuth 2.0 authorization framework. 
        Other type values, such as "apikey", "basic", and "oidc", may also be used.</dd>
        <dt>scopes</dt>
        <dd>REQUIRED. An array of strings specifying the scope values required to access the resource. 
        If this member is present and "oauth2" is included in the <tt>type</tt> array, the AI agent MUST possess all listed scopes to gain access.</dd>
        <dt>as_metadata</dt>
        <dd>OPTIONAL. A string containing the URL to the OAuth 2.0 Authorization Server (AS) metadata <xref target="RFC8414"/>. 
        This allows the agent to dynamically discover the authorization endpoints.</dd>
      </dl>

      <t><xref target="fig-metadata"/> illustrates the structure of the security member within a resource definition:</t>

      <figure anchor="fig-metadata">
        <name>Structure of Resource Metadata with Security Member</name>
        <sourcecode type="json">
<![CDATA[
{
  "name": "resource_identifier",
  "description": "...",
  "input_schema": { ... },
  "security": {
    "type": ["oauth2"],
    "scopes": ["scope_A"],
    "as_metadata": "https://server.example.com/.well-known/..."
  }
}
]]>
        </sourcecode>
      </figure>

      <t>A comprehensive, non-normative example of a full list of resource metadata is provided in Appendix A.</t>

      <section>
      <name>Comparison to Existing Practice</name>
        <t>This document defines a uniform mechanism for advertising per-resource authorization requirements, drawing inspiration from and addressing gaps in existing protocols.</t>

        <t>Agent-to-Agent (A2A) Protocol <xref target="A2A"/>: The A2A protocol defines security scheme objects based on the OpenAPI 3.2 specification. 
        OpenAPI includes a security object within its schema that serves a purpose analogous to the security member defined here. 
        It allows an API to declare its required security schemes (e.g., OAuth 2.0) and the necessary scopes for each operation. 
        This document aligns with that established principle, offering a potentially simplified version.</t>

        <t>Model Context Protocol (MCP) <xref target="MCP"/>: The MCP protocol specifies OAuth 2.1 as the authorization framework.
        However, MCP does not standardize per-tool scope advertisement in tool metadata.
        This can lead to reactive, challenge-triggered authorization flows when executing an AI agent workflow. 
        The security member defined in this document directly addresses this gap by providing a mechanism for an MCP server to advertise these requirements.</t>
      </section>

      <section>
      <name>Backward Compatibility</name>
        <t>Inclusion of the security member in resource metadata is OPTIONAL.
        A server SHOULD omit the security member for resources that do not require authorization. 
        To allow for implementation flexibility, a server MAY also omit the security member for a protected resource.</t>

        <t>An AI agent MUST ignore a security member if it does not understand the contents. 
        Furthermore, all agents MUST be able to handle authorization reactively (e.g., via a step-up flow) upon receiving an authorization error.</t>

        <t>AI agents that recognize and support the security member SHOULD use the information it contains to perform proactive and aggregated authorization, as described in Section 4.</t>
      </section>
    </section>

    <section>
    <name>Workflow Execution with OAuth Scope Aggregation</name>
      <t>Using the security member in the resource metadata, an AI agent can follow the sequence below to execute a workflow:</t>
      <ol>
        <li>Resource Discovery: 
        The AI agent fetches the resource metadata from the resource server.
        Resource metadata MAY include a security member describing the required authentication scheme, scopes, and AS metadata URL.</li>
        <li>Authorization Domain Identification: 
        Given a pre-defined or planned workflow, the AI agent iterates through each step and fetches the associated AS metadata to learn the authorization domain and authorization endpoints.</li>
        <li>Scope Aggregation: 
        For each authorization domain, the AI agent computes a least-privilege set of scopes required by the workflow, using the OPTIONAL <tt>security</tt> member defined in <xref target="sect-metadata"/>.
        The agent aggregates the required scopes across all resource invocations within the same authorization domain and removes duplicates.
        If, and only if, the authorization domain defines a hierarchical relationship among its scopes (e.g., a broader scope implies one or more narrower scopes), the agent MAY further reduce the requested scope set by removing any scope that is subsumed by another requested scope.
        For example, within a single authorization domain, an agent workflow (1) reads a document from the cloud drive with scope "drive.read", (2) updates the document with scope "drive.write", and (3) creates calendar events with scope "calendar.write".
        If the authorization domain defines that "drive.write" subsumes "drive.read", the aggregated scope set is ["drive.write", "calendar.write"].</li>
        <li>Aggregated Scope Authorization: 
        For each authorization domain, the AI agent initiates an OAuth 2.0 authorization code grant to obtain an access token with the aggregated scopes. 
        During this step, the user is prompted to authorize the requested scopes.</li>
        <li>Workflow Execution: 
        The AI agent executes the multi-step workflow, using the obtained access tokens when accessing resources on resource servers.</li>
      </ol>
    <t>This process is illustrated in <xref target="fig-workflow"/>.</t>
      <figure anchor="fig-workflow">
        <name>Sequence diagram of workflow execution with scope-aggregated authorization</name>
        <artset>
        <!-- This <artset> includes two <artwork> elements, each of a different type -->
          <artwork type="ascii-art" name="stream.txt">
          <![CDATA[
+--------+       +--------+       +---------------+       +-----------+
|End User|       |AI Agent|       |Resource Server|       |Auth Server|
+---+----+       +---+----+       +-------+-------+       +-----+-----+
    |                | (1) Get metadata   |                     |
    |                |------------------->|                     |
    |                |                    |                     |
    |                | (1) Res. metadata  |                     |
    |                |< - - - - - - - - - |                     |
    |                |                    |                     |
    |                | (2) Get AS metadata for each AD          |
    |                |----------------------------------------->|
    |                |                    |                     |
    |                | (2) AS metadata    |                     |
    |                |<- - - - - - - - - - - - - - - - - - - - -|
    |                |                    |                     |
    |                |----\               |                     |
    |                |    | (3) Scope aggregation               |
    |                |<---/  within each AD                     |
    |                |                    |                     |
    | (4a) Init auth |                    |                     |
    |<---------------|                    |                     |
    |                |                    |                     |
    |              (4b) User authentication + consent           |
    |---------------------------------------------------------->|
    |                |                    |                     |
    |              (4c) Redirect back to agent                  |
    |< - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
    |                |                    |                     |
    | (4d) Auth code |                    |                     |
    | - - - - - - - >|                    |                     |
    |                | (4e) Token exchange                      |
    |                |----------------------------------------->|
    |                |                    |                     |
    |                | (4f) Access token w/ aggregated scopes   |
    |                |<- - - - - - - - - - - - - - - - - - - - -|
    |                |                    |                     |
    |     +----------+--------------------+---------------+     |
    |     | LOOP: Repeat for each step w/ resource req.   |     |
    |     |-----------------------------------------------|     |
    |     |          |(5) Request resource w/ token       |     |
    |     |          |------------------->|               |     |
    |     |          |                    |               |     |
    |     |          |(5) Resource responses              |     |
    |     |          |<- - - - - - - - - -|               |     |
    |     +----------+--------------------+---------------+     |
    |                |                    |                     |
+---+----+       +---+----+       +-------+-------+       +-----+-----+
|End User|       |AI Agent|       |Resource Server|       |Auth Server|
+--------+       +--------+       +---------------+       +-----------+

          ]]>
          </artwork>
        </artset>
      </figure>
    </section>

    <section>
    <name>Advantages</name>
      <t>Compared to a reactive, challenge-triggered authorization flow, this scope-aggregated authorization strategy offers several benefits for multi-step AI agent workflows.</t>
      <section>
        <name>Reduced Consent Interactions and End-to-End Latency</name>
        <t>In the absence of aggregated authorization, the end user is required to respond to multiple consent prompts for individual resources associated with distinct scopes. 
        This interaction pattern is illustrated in <xref target="fig-workflow-without"/>. 
        On the contrary, the mechanism defined in this document enables the end user to authorize the AI Agent one single time per authorization domain. 
        This approach mitigates user friction and consent fatigue, while simultaneously reducing the end-to-end latency of task completion.</t>
        <figure anchor="fig-workflow-without">
          <name>Sequence diagram of workflow execution without scope-aggregated authorization</name>
          <artset>
          <!-- This <artset> includes two <artwork> elements, each of a different type -->
            <artwork type="ascii-art" name="stream.txt">
            <![CDATA[
+--------+       +--------+       +---------------+       +-----------+
|End User|       |AI Agent|       |Resource Server|       |Auth Server|
+---+----+       +---+----+       +-------+-------+       +-----+-----+
    |                | (1) Get metadata   |                     |
    |                |------------------->|                     |
    |                |                    |                     |
    |                | (1) Res. metadata  |                     |
    |                |< - - - - - - - - - |                     |
    |                |                    |                     |
 +--+----------------+--------------------+---------------------+----+
 | LOOP: Repeat for each request with scope deficiency               |
 |-------------------------------------------------------------------|
 |  |                | (2) Request resource                     |    |
 |  |                |------------------->|                     |    |
 |  |                |                    |                     |    |
 |  |                | (2) Unauthorized error                   |    |
 |  |                |< - - - - - - - - - |                     |    |
 |  |                |                    |                     |    |
 |  |                | (3) Fetch AS metadata                    |    |
 |  |                |----------------------------------------->|    |
 |  |                |                    |                     |    |
 |  |                | (3) AS metadata    |                     |    |
 |  |                |< - - - - - - - - - - - - - - - - - - - - |    |
 |  |                |                    |                     |    |
 |  | (4a) Init auth |                    |                     |    |
 |  |<---------------|                    |                     |    |
 |  |                |                    |                     |    |
 |  |              (4b) User authentication + consent           |    |
 |  |---------------------------------------------------------->|    |
 |  |                |                    |                     |    |
 |  |              (4c) Redirect back to agent                  |    |
 |  |< - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|    |
 |  |                |                    |                     |    |
 |  | (4d) Auth code |                    |                     |    |
 |  | - - - - - - - >|                    |                     |    |
 |  |                | (4e) Token exchange                      |    |
 |  |                |----------------------------------------->|    |
 |  |                |                    |                     |    |
 |  |                | (4f) Access token w/ requested scopes    |    |
 |  |                |< - - - - - - - - - - - - - - - - - - - - |    |
 |  |                |                    |                     |    |
 |  |                | (5) Request resource w/ access token     |    |
 |  |                |------------------->|                     |    |
 |  |                |                    |                     |    |
 |  |                | (5) Resource responses                   |    |
 |  |                |< - - - - - - - - - |                     |    |
 +--+----------------+--------------------+---------------------+----+
    |                |                    |                     |
+---+----+       +---+----+       +-------+-------+       +-----+-----+
|End User|       |AI Agent|       |Resource Server|       |Auth Server|
+--------+       +--------+       +---------------+       +-----------+
          ]]>
          </artwork>
        </artset>
      </figure>
      </section>
      <section>
        <name>Avoidance of Mid-Flow Failures due to Insufficient Privileges</name>
        <t>By computing the required scopes and obtaining tokens in advance, the AI agent avoids mid-workflow failures caused by missing privileges. 
        This increases the reliability of multi-step workflows, preventing partial completion and handling insufficient-scope conditions proactively rather than reactively.</t>
      </section>
    </section>
    
    <section anchor="IANA">
    <!-- All drafts are required to have an IANA considerations section. See RFC 8126 for a guide.-->
      <name>IANA Considerations</name>
      <t>This document includes no request to IANA.</t>
    </section>
    
    <section anchor="Security">
      <!-- All drafts are required to have a security considerations section. See RFC 3552 for a guide. -->
      <name>Security Considerations</name>
      <t>This section summarizes security risks that arise in scope-aggregated authorization for multi-step AI agent workflows and describes recommended mitigations.
      Implementations are RECOMMENDED to apply the mechanisms below, as appropriate to their threat model and deployment context.</t>
      <section>
        <name>Risk: Residual Privilege</name>
        <t>In a sequential workflow involving Step A, B, and C, the AI agent still holds the permissions for Step A while executing Step B and C. 
        More critically, after Step C is finished, the agent retains full access to Step A, B, and C.</t>
        
        <t>Mitigation:</t>
        <t>Token Downscoping <xref target="RFC8693"/> : 
        Upon completing a step in the workflow, the AI agent SHOULD perform a token exchange request to the authorization server to exchange for a new token with a reduced scope set.
        This reduces the impact of token leakage during later steps.</t>

        <t>Strict Token Revocation <xref target="RFC7009"/> : 
        Upon successful completion or terminal failure of the workflow, the AI agent SHOULD immediately revoke the access token and any associated refresh tokens.
        The authorization server SHOULD limit refresh token lifetimes to reduce residual privilege.
        </t>
        <t>Sender-Constrained Tokens <xref target="RFC9449"/> : 
        It is RECOMMENDED to use sender-constrained access tokens that bind token use to a proof-of-possession (DPoP) key controlled by the AI agent. 
        This reduces the risk that an aggregated token can be intercepted and replayed by a different actor.</t>
      </section>

      <section>
        <name>Risk: User Blind Signing</name>
        <t> When users are presented with a long set of aggregated scopes (e.g., "Read Mail", "Write Files", "Access Calendar", "Post to Slack"), they may approve the request without understanding its implications. 
        This can undermine informed consent and increase the likelihood of over-authorization.</t>

        <t>Mitigation:</t>
        <t>Structured Consent UI: 
        Authorization Servers SHOULD present requested privileges in a structured manner, grouped by workflow step, rather than as a flat list of scopes.
        Authorization Servers MAY additionally require step-level acknowledgment for high-risk privileges.</t>
      </section>
    </section>

    <section anchor="Acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors would like to thank Yiyang Shao and Jinyang Li for useful discussion and ideas.</t>
    </section>

  </middle>

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6749.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7009.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8414.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8693.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9449.xml"/>
        <!-- The recommended and simplest way to include a well known reference -->
        
      </references>
 
      <references>
        <name>Informative References</name>
       
        <reference anchor="A2A" target="https://a2a-protocol.org/latest">
        <!-- [REPLACE/DELETE] Example reference written by an organization not a person -->
          <front>
            <title>Agent2Agent(A2A) Protocol</title>
            <author>
              <organization>Google</organization>
            </author>
            <date year="2025"/>
            <!-- [CHECK] -->
          </front>
        </reference>       

        <reference anchor="MCP" target="https://modelcontextprotocol.io/docs/getting-started/intro">
        <!-- [REPLACE/DELETE] Example reference written by an organization not a person -->
          <front>
            <title>Model Context Protocol (MCP)</title>
            <author>
              <organization>Anthropic</organization>
            </author>
            <date year="2025"/>
            <!-- [CHECK] -->
          </front>
        </reference>
       
      </references>
    </references>
    
    
    <section>
      <name>Example of a Resource List</name>
      <t>This appendix is non-normative. <xref target="fig-calendar"/> shows an example resource list for a calendar server.
      In this example, both resources belong to the same authorization domain.
      For a workflow that accesses both resources, the AI agent can obtain an access token via OAuth 2.0 with the aggregated scope set ["calendar.read", "calendar.write"].
      If the authorization domain defines that "calendar.write" subsumes "calendar.read", the requested scope set can be further reduced to ["calendar.write"].</t>
      <figure anchor="fig-calendar">
        <name>An example of the resource list of a calendar server</name>
        <sourcecode name="" type="json" markers="false">
        <![CDATA[
[
  {
    "name": "CalendarReader",
    "description": "Read events from the user's calendar",
    "input_schema": {
      "type": "object",
      "properties": {
        "start_date": {
          "type": "string",
          "format": "date-time"
        },
        "end_date": {
          "type": "string",
          "format": "date-time"
        }
      },
      "required": ["start_date"]
    },
    "security": {
      "type": ["oauth2"],
      "scopes": ["calendar.read"],
      "as_metadata": "https://auth.calendar.com/.well-known/
      oauth-authorization-server"
    }
  },
  {
    "name": "CalendarWriter",
    "description": "Create events on the user's calendar",
    "input_schema": {
      "type": "object",
      "properties": {
        "summary": { "type": "string" },
        "start": { "type": "string", "format": "date-time" },
        "end": { "type": "string", "format": "date-time" }
      },
      "required": ["summary", "start", "end"]
    },
    "security": {
      "type": ["oauth2"],
      "scopes": ["calendar.write"],
      "as_metadata": "https://auth.calendar.com/.well-known/
      oauth-authorization-server"
    }
  }
]
        ]]>
        </sourcecode>
      </figure>
    </section>

  <section anchor="contributors" numbered="false"><name>Contributors</name>
  <t>The following people contributed significantly to this document:</t>
  <t>
      <contact fullname="Yiyang Shao"/>
      <br/>
      Huawei
      <br/>
      Email: shaoyiyang@huawei.com
  </t>
    
  <t>
      <contact fullname="Jinyang Li"/>
      <br/>
      Huawei
      <br/>
      Email: lijinyang9@huawei.com
  </t>
  </section>
 </back>
</rfc>

