API plugin manifest schema for Microsoft 365 Copilot

Important

API plugins are only supported as actions within declarative agents. They are not enabled in Microsoft 365 Copilot.

API plugins enable Microsoft 365 Copilot to interact with REST APIs described by an OpenAPI description. The OpenAPI description in an API plugin describes the REST APIs that Copilot can interact with. In addition, an API plugin includes a plugin manifest file that provides metadata about the plugin, such as the plugin's name, description, and version. The plugin manifest also includes information about the plugin's capabilities, such as the APIs it supports and the operations it can perform.

The following article describes the schema used by API plugin manifest files. For more information about API plugins, see API plugins for Microsoft 365 Copilot.

JSON schema

The schema described in this document can be found in JSON Schema format here.

Conventions

Relative references in URLs

Unless specified otherwise, all properties that are URLs MAY be relative references. Relative references in the manifest document are relative the location of the manifest document.

String length

Unless specified otherwise, all string properties SHOULD be limited to 4K characters. This string length doesn't confer any acceptable size for the entire document. Implementations a free to impose their own practical limits on manifest length.

Unrecognized properties

JSON objects defined in this document support only the described properties. Unrecognized properties in any JSON object SHOULD make the entire document invalid.

String localization

Localizable strings can use a localization key instead of a literal value. The syntax is [[key_name]], where key_name is the key name in the localizationKeys property in your localization files. For details on localization, see Localize your agent.

Localized string example

{
    "schema_version": "v2.1",
    "name_for_human": "[[plugin_name]]",
    "description_for_human": "[[plugin_description]]"
}

Plugin manifest object

The root of the plugin manifest document is a JSON object that contains properties that describe the plugin.

The plugin manifest object contains the following properties.

Property Type Description
schema_version String Required. The schema version. Previous versions are v1 and v2. Must be set to v2.1.
name_for_human String Required. A short, human-readable name for the plugin. It MUST contain at least one nonwhitespace character. Characters beyond 20 MAY be ignored. This property is localizable.
namespace String Deprecated. Optional.
description_for_model String Optional. The description for the plugin that is provided to the model. This description should describe what the plugin is for, and in what circumstances its functions are relevant. Characters beyond 2048 MAY be ignored. This property is localizable.
description_for_human String Required. A human-readable description of the plugin. Characters beyond 100 MAY be ignored. This property is localizable.
logo_url String Optional. A URL used to fetch a logo that MAY be used by the orchestrator. Implementations MAY provide alternative methods to provide logos that meet their visual requirements. This property is localizable.
contact_email String Optional. An email address of a contact for safety/moderation, support, and deactivation.
legal_info_url String Optional. An absolute URL that locates a document containing the terms of service for the plugin. This property is localizable.
privacy_policy_url String Optional. An absolute URL that locates a document containing the privacy policy for the plugin. This property is localizable.
functions Array of Function object Optional. A set of function objects describing the functions available to the plugin. Each function object name MUST be unique within the array. The order of the array isn't significant. If the functions property isn't present and there's an OpenAPI runtime, the functions are inferred from the OpenAPI operations.
runtimes Array of OpenAPI runtime object Optional. A set of runtime objects describing the runtimes used by the plugin.
capabilities Plugin capabilities object Optional. Describes capabilities of the plugin.

Function object

Information related to how the model should interact with a function.

The function object contains the following properties.

Property Type Description
id String Optional.
name String Required. A string that uniquely identifies this function. Runtime objects MAY reference this identifier to bind the runtime to the function. When the function is bound to an OpenAPI runtime, the value must match an operationId value in the OpenAPI description. Value must match the ^[A-Za-z0-9_]+$ regular expression.
description String Optional. A description better tailored to the model, such as token context length considerations or keyword usage for improved plugin prompting.
parameters Function parameters object Optional. An object that contains properties that describe the parameters of a function in a runtime agnostic way. It mirrors the shape of json-schema but only supports a small subset of the JSON schema capabilities. If the parameters property isn't present, functions described by a runtime object of type OpenApi use the OpenAPI description to determine the parameters. Each member in the JSON object is a function parameter object that describes the semantics of the parameter.
returns Return object OR Rich return object Optional. Describes the semantics of the value returned from the function.
states Function states object Optional. Defines state objects for orchestrator states.
capabilities Function capabilities object Optional. Contains a collection of data used to configure optional capabilities of the orchestrator while invoking the function.

Function object example

{
  "functions": [
    {
      "name": "add_todo",
      "description": "Adds a new Todo",
      "parameters": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string"
          }
        },
        "required": [
          "description"
        ]
      },
      "returns": {
        "type": "string"
      }
    }
  ]
}

Function parameters object

An object that is used to identify the set of parameters that can be passed to the function. This object is structured to mirror the shape of a JSON Schema object but it only supports a subset of JSON Schema keywords.

The function parameters object contains the following properties.

Property Type Description
type String Optional. The JSON Schema type. Must be set to object.
properties Function parameters properties object Required. An object that maps parameter names to their definitions.
required Array of String Optional. The names of properties that are required parameters. Unlike in JSON Schema, the values in this array MUST match the names listed in the properties property.
Function parameters object example
{
  "type": "object",
  "properties": {
    "param1": {
      "type": "string"
    },
    "param2": {
      "type": "number"
    }
  },
  "required": [
    "param1"
  ]
}

Function parameters properties object

An object that maps parameter names to their definitions.

The function parameters properties object contains the following properties.

Property Type Description
Name matching ^[A-Za-z0-9_]+$ Function parameter object Optional. The parameter definition that corresponds to the parameter that matches the property name.

Function parameter object

An object that describes the semantics of a function parameter.

The function parameter object contains the following properties.

Property Type Description
type String Required. Specifies the parameter's type. Possible values are: string, array, boolean, integer, number.
items Function parameter object Optional. A function parameter object that describes a single element in an array. MUST only be present when type is array.
enum Array of String Optional. An array of valid values for this parameter. MUST only be present when type is string.
description String Optional. A description of the parameter.
default Array, Boolean, String, Number, Integer Optional. A value of the type specified by the type property that indicates the value the API uses when a value for an optional parameter isn't provided.
Function parameter example
{
  "type": "string",
  "description": "The color of the item",
  "enum": [
    "green",
    "blue",
    "orange"
  ]
}

Return object

Contains the semantics of the value returned from the function.

The return object contains the following properties.

Property Type Description
type String Required. Specifies the type of the value returned by the API. Possible values are: string.
description String Optional. A description of the value returned by the API.

Rich return object

Indicates that the function returns a response that is compatible with the Rich Responses protocol.

The rich return object contains the following properties.

Property Type Description
$ref String Required. Must be set to https://copilot.microsoft.com/schemas/rich-response-v1.0.json.

Function states object

Defines state objects for orchestrator states.

The function states object contains the following properties.

Property Type Description
reasoning State object Optional. The state in which the model can call functions and do computations.
responding State object Optional. The state in which the model can generate text that is shown to the user. The model can't invoke functions in the responding state.
disengaging State object Optional.

State object

Contains specific instructions for when a function is invoked in a specific orchestrator state.

The state object contains the following properties.

Property Type Description
description String Optional. Describes the purpose of a function when used in a specific orchestrator state.
instructions Array, String Optional. A string or an array of strings that are used to provide instructions to the orchestrator on how to use this function while in a specific orchestrator state. Providing a single string indicates the intent to provide a complete set of instructions that would override any built-in function prompts. Providing an array of strings indicates the intent to augment the built-in function prompting mechanism.
examples Array, String Optional. A string or an array of strings that are used to provide examples to the orchestrator on how this function can be invoked.
State object example
{
  "functions": [
    {
      "name": "searchEmails",
      "description": "search for Emails from using 3S search Service",
      "states": {
        "reasoning": {
          "description": "\n# `searchEmails(**params) -> str` returns the emails from user's inbox based on search query.",
          "instructions": [
            "Examine the output of `searchEmails(**params) -> str`.",
            "Do not include any information that is not present in the JSON results.",
            "Exclude any irrelevant data from the JSON results",
            "Determine if the response contains an error field.",
            "If an error is present, provide the error code and error message extracted from the response JSON.",
            "If there is no error, extract and include as much relevant information as possible from the JSON result to meet the user's needs."
          ],
          "examples": []
        }
      }
    }
  ]
}

Function capabilities object

Contains a collection of data used to configure optional capabilities of the orchestrator while invoking the function.

The function capabilities object contains the following properties.

Property Type Description
confirmation Confirmation object Optional. Describes a confirmation dialog that SHOULD be presented to the user before invoking the function.
response_semantics Response semantics object Optional. Describes how the orchestrator can interpret the response payload and provide a visual rendering.

Confirmation object

Describes how the orchestrator asks the user to confirm before calling a function.

The confirmation object contains the following properties.

Property Type Description
type String Optional. Specifies the type of confirmation. Possible values are: None, AdaptiveCard.
title String Optional. The title of the confirmation dialog. This property is localizable.
body String Optional. The text of the confirmation dialog. This property is localizable.

Response semantics object

Contains information to identify semantics of response payload and enable rendering that information in a rich visual experience using adaptive cards.

The response semantics object contains the following properties.

Property Type Description
data_path String Required. A JSONPath RFC9535 query that identifies a set of elements from the function response to be rendered using the template specified in each item.
properties Response semantics properties object Optional. Allows mapping of JSONPath queries to well-known data elements. Each JSONPath query is relative to a result value.
static_template Object Optional. A JSON object that conforms with the Adaptive Card Schema and templating language. This Adaptive Card instance is used to render a result from the plugin response. This value is used if the template_selector isn't present or fails to resolve to an adaptive card.
oauth_card_path String Optional.
Static template example
{
  "functions": {
    "capabilities": {
      "response_semantics": {
        "data_path": "$.resources",
        "properties": {
          "title": "$.name",
          "subtitle": "$.location",
          "url": "$.href",
          "information_protection_label": "$.ipLabel"
        },
        "static_template": {
          "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
          "type": "AdaptiveCard",
          "version": "1.5",
          "body": [
            {
              "type": "TextBlock",
              "text": "${name}",
              "weight": "Bolder"
            },
            {
              "type": "TextBlock",
              "text": "${description}"
            }
          ],
          "action": [
            {
              "type": "Action.OpenUrl",
              "title": "View",
              "text": "${href}"
            }
          ]
        }
      }
    }
  }
}
Dynamic template example
{
  "functions": {
    "capabilities": {
      "response_semantics": {
        "data_path": "$.attachments",
        "properties": {
          "title": "$.title",
          "subtitle": "$.subtitle",
          "url": "$.url",
          "thumbnail_url": "$.thumbnailUrl",
          "template_selector": "$.template"
        }
      }
    }
  }
}

Response semantics properties object

Allows mapping of JSONPath queries to well-known data elements. Each JSONPath query is relative to a result value.

The response semantics properties object contains the following properties.

Property Type Description
title String Optional. Title of a citation for the result.
subtitle String Optional. Subtitle of a citation for the result.
url String Optional. URL of a citation for the result.
thumbnail_url String Optional. URL of a thumbnail image for the result.
information_protection_label String Optional. Data sensitivity indicator of the result contents.
template_selector String Optional. A JSONPath expression to an Adaptive Card instance to be used for rendering the result.

OpenAPI runtime object

Describes how the plugin invokes OpenAPI functions.

The OpenAPI runtime object contains the following properties.

Property Type Description
type String Required. Identifies this runtime as an OpenAPI runtime. Must be set to OpenApi.
auth Runtime authentication object Required. Authentication information required to invoke the runtime.
run_for_functions Array of String Optional. The names of the functions that are available in this runtime. If this property is omitted, all functions described by the runtime are available. Provided string values can contain wildcards. More than one runtime MUST NOT declare support for the same function either implicitly or explicitly.
spec OpenAPI specification object Required. Contains the OpenAPI information required to invoke the runtime.

OpenAPI specification object

Contains the OpenAPI information required to invoke the runtime.

The OpenAPI specification object contains the following properties.

Property Type Description
url String Optional. The URL to fetch the OpenAPI specification, called with a GET request. This member is required unless api_description is present.
api_description String Optional. A string that contains an OpenAPI description. If this member is present, url isn't required and is ignored if present.
progress_style String Optional. The progress style that is used to display the progress of the function. Possible values are: None, ShowUsage, ShowUsageWithInput, ShowUsageWithInputAndOutput.
OpenAPI specification object example
{
  "runtimes":
  [
    {  
      "type": "OpenApi",
      "auth": {
        "type": "None"
      },
      "spec": {
        "url": "https://example.org/api/openapi.yaml",  
      }
    }
  ]
}  

Runtime authentication object

Contains information used by the plugin to authenticate to the runtime.

The runtime authentication object contains the following properties.

Property Type Description
type String Optional. Specifies the type of authentication required to invoke a function. Possible values are: None, OAuthPluginVault, ApiKeyPluginVault.
reference_id String Optional. A value used when type is OAuthPluginVault or ApiKeyPluginVault. The reference_id value is acquired independently when providing the necessary authentication configuration values. This mechanism exists to prevent the need for storing secret values in the plugin manifest.
Runtime authentication object example
{
  "type": "OAuthPluginVault",
  "reference_id": "0123456-abcdef"
}

Plugin capabilities object

Describes capabilities of the plugin.

The plugin capabilities object contains the following properties.

Property Type Description
conversation_starters Array of Conversation starter object Optional. Conversation starters that can be displayed to the user for suggestions on how to invoke the plugin.

Conversation starter object

An example of a question that the plugin can answer.

The conversation starter object contains the following properties.

Property Type Description
text String Required. The text of the conversation starter. This property is localizable.
title String Optional. The title of the conversation starter. This property is localizable.
Conversation starter object example
{
  "conversation_starters": [
    {
      "title": "Developer tasks",
      "text": "What issues are assigned to me?"
    }
  ]
}

Manifest example

Here's an example of a plugin manifest file that uses most of the manifest properties and object properties described in the article:

{
  "schema_version": "v2",
  "name_for_human": "{{ 'nameForHuman' | localize: 'en-us' }}",
  "description_for_human": "{{ 'descriptionForHuman' | localize: 'en-us' }}",
  "description_for_model": "Plugin for finding properties for sale. Use it whenever a user asks about real estate properties for sale on the market. This plugin can be used to search for properties in a particular city, and with a given number of bedrooms, bathrooms, and amenities.",
  "capabilities": {
    "localization": {
      "en-us": {
        "nameForHuman": {
          "message": "Contoso Real Estate",
          "description": "Name for human, in English"
        },
        "descriptionForHuman": {
          "message": "Find up-to-date, detailed real estate properties for sale on the market",
          "description": "Description for human, in English"
        }
      },
      "fr-fr": {
        "nameForHuman": {
          "message": "Contoso Immobilier",
          "description": "Name for human, in French"
        },
        "descriptionForHuman": {
          "message": "Trouvez des propriétés immobilières à vendre sur le marché",
          "description": "Description for human, in French"
        }
      }
    }
  },
  "functions": [
    {
      "name": "getListings",
      "description": "Get a list of properties matching the specified criteria",
      "parameters": {
        "type": "object",
        "properties": {
          "city": {
            "type": "string",
            "description": "The city to search properties in"
          },
          "bedrooms": {
            "type": "number",
            "description": "The number of bedrooms the property should have"
          },
          "bathrooms": {
            "type": "number",
            "description": "The number of bathrooms the property should have"
          },
          "amenities": {
            "type": "array",
            "description": "The list of amenities the property should have",
            "items": {
              "type": "string",
              "description": "One amenity the property should have",
              "enum": [
                "air conditioning",
                "balcony",
                "dishwasher",
                "elevator",
                "fireplace",
                "furniture",
                "garden",
                "gym",
                "heating",
                "jacuzzi",
                "laundry room",
                "microwave",
                "no furniture",
                "parking",
                "patio",
                "sauna",
                "swimming pool",
                "terrace",
                "wi-fi"
              ]
            }
          }
        }
      },
      "returns": {
        "type": "string",
        "description": "A list of properties"
      },
      "states": {
        "reasoning": {
          "description": "`getListings` returns a list of real estate properties for sale based on the specified criteria.",
          "instructions": [
            "If the user mentions a city in their question, only search in that city by using the city parameter.",
            "If the user asks for properties with things like parking space, heating, jacuzzi, or similar amenities, use the amenities parameter to filter the results.",
            "Only use the list of amenities provided in the amenities parameter enum. If the user asked for an amenity that is not in the list, find the closest match from the list, or ignore it if no match can be found.",
            "Determine if the response contains an error field.",
            "If an error is present, provide the error code and error message from the JSON response to the user.",
            "If there is no error, extract and include as much relevant information as possible from the JSON response to meet the users needs."
          ]
        }
      }
    },
    {
      "name": "saveSearch",
      "description": "Save a search for properties for sale",
      "parameters": {
        "type" : "object",
        "properties": {
          "city": {
            "type": "string",
            "description": "The city to search in"
          },
          "bedrooms": {
            "type": "number",
            "description": "The number of bedrooms"
          }
        },
        "required": [ "city" ]
      },
      "returns": {
        "type": "string",
        "description": "The unique ID for the saved search"
      },
      "states": {
        "responding": {
          "description": "`saveSearch` returns a unique ID that identifies the newly saved search.",
          "instructions": [
            "Examine the output of the `saveSearch` function.",
            "Extract the unique ID integer from the output and include it in your response to the user."
          ]
        }
      }
    },
    {
      "name": "deleteSavedSearch",
      "description": "Delete a previously saved search",
      "parameters": {
        "type" : "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "The unique ID of the saved search"
          }
        },
        "required": [ "id" ]
      },
      "returns": {
        "type": "string",
        "description": "True if the saved search was deleted, false otherwise"
      }
    }
  ],
  "runtimes": [
    {
      "type": "OpenApi",
      "auth": { "type": "none" },
      "run_for_functions": [ "getListings", "saveSearch", "deleteSavedSearch" ],
      "spec": { "url": "http://contoso.com/openapi.yaml" }
    }
  ],
  "logo_url": "http://contoso.com/logo.png",
  "contact_email": "contact@contoso.com",
  "legal_info_url": "https://contoso.com/legal/",
}

See also