---
schema_version: "1"
id: 7d3bca04af95b3680c0c8e1c62f6e61287543dace57d43c2cddf02c486f6453a
title: Creating an Asset
collection: mulesoft
version: current
locale: en-us
portal_url: https://docs.salesforce.com/mulesoft/current/en-us/exchange/to-create-an-asset.md
canonical_url: https://docs.mulesoft.com/exchange/to-create-an-asset
source_site: docs.mulesoft.com
content_type: documentation
content_hash: 82276f2c739e6d171bccbac5e3442c8fd9c1d26022cf36237383c1e774bbbc22
description: MuleSoft Documentation Site
latest: true
---
---
product: Exchange
---

# Creating an Asset

> For the full documentation index, see: https://docs.mulesoft.com/llms.txt

To share assets in an Anypoint Exchange private instance or the Exchange public portal, create an
asset of that type.

The method for creating an asset depends on its type. Once the asset type is defined, it is
permanent and can’t be changed.

<table><colgroup><col> <col></colgroup><thead><tr><th>Asset Type</th><th>Creation Method</th></tr></thead><tbody><tr><td><p>OAS, RAML, RAML fragments, AsyncAPI, HTTP, WSDL, agents, LLMs, MCP servers, rulesets, custom</p></td><td><p>Exchange <strong>Publish new asset</strong> dialog</p></td></tr><tr><td><p>REST APIs, API spec fragments</p></td><td><p>Anypoint Code Builder, Design Center, or the <a href="https://dev-portal.mulesoft.com/apis/exchange-experience.html#overview" target="_blank" rel="noopener">Exchange Experience API</a></p></td></tr><tr><td><p>RAML, OAS API specifications</p></td><td><p><a href="https://docs.mulesoft.com/anypoint-cli/latest/">Anypoint Platform CLI</a>. For example: <code>exchange asset upload --classifier raml --apiVersion v1 --name HelloWorld --mainFile helloworld.raml helloworld/1.0.0 /Users/nmouso/Downloads/helloworld.raml.zip</code></p></td></tr><tr><td><p>Examples, templates</p></td><td><p>Mavenize feature in Anypoint Studio</p></td></tr><tr><td><p>Connectors, policies, examples, templates</p></td><td><p><a href="https://docs.mulesoft.com/exchange/to-publish-assets-maven">Maven</a></p></td></tr><tr><td><p>API groups</p></td><td><p>Anypoint API Manager</p></td></tr><tr><td><p>Mule applications</p></td><td><p>Anypoint Runtime Fabric (not visible in the Exchange UI)</p></td></tr><tr><td><p>External libraries</p></td><td><p><a href="https://docs.mulesoft.com/exchange/to-publish-assets-maven">Exchange Maven Facade API</a> (not visible in the Exchange UI)</p></td></tr></tbody></table>

Exchange fully supports RAML fragments. Currently, Exchange does not support importing and managing
OAS 3.x components as Exchange dependencies inside a specification.

> [!NOTE] Exchange does not resolve dynamic references (`$dynamicRef` and `$dynamicAnchor`) in OAS
> 3.1 API specifications and does not apply custom `$schema` dialects.

## Create an Agent

Agents are programs that perform tasks autonomously or semiautonomously. AI agents can use the
Agent2Agent (A2A) protocol to communicate and collaborate with each other to perform tasks.

Agent schema files must be in JSON format. They define the structure and capabilities of the agent
asset. When creating an agent asset, upload the schema file you want to use.

The required objects for an A2A spec are defined in the
[A2A spec](https://a2a-protocol.org/dev/specification/).

### Protocol Types

When you create an agent asset, select a protocol type:

- **A2A v1.0 card**: Publishes the agent card with the `a2a_v1` protocol value and the `a2a-v1-card`
  classifier. Use this for agents that comply with A2A Protocol v1.0.0.

- **A2A v0.3 card**: Publishes the agent card with the `a2a` protocol value and the `a2a-card`
  classifier. Use this for agents that comply with A2A Protocol v0.3.0.

- **Other card**: Publishes the agent card as a generic JSON file. The file must be valid JSON but
  does not require specific A2A properties.

> [!NOTE] The **A2A v1.0 card** and **A2A v0.3 card** labels are visible when the feature flag is
> enabled. With the flag off, the options are **A2A card** and **Other card**.

A single asset version can carry both an A2A v0.3 card and an A2A v1.0 card. Each card is published
separately under its own classifier. Exchange does not auto-convert between v0.3 and v1.0.

### A2A v1.0 Agent Card

An A2A v1.0 agent card declares the agent’s identity, capabilities, supported transports, security
requirements, and skills. The v1.0 card uses the `supportedInterfaces` array to declare transport
bindings.

Each entry in `supportedInterfaces` contains:

- `url`: The endpoint URL for this transport.

- `protocolBinding`: The transport protocol (for example, `JSONRPC`, `HTTP+JSON`, or `GRPC`).

- `protocolVersion`: The A2A protocol version supported at this endpoint.

- `tenant`: The tenant identifier for multi-tenant deployments.

Example A2A v1.0 card

```json
{
  "name": "Weather Agent",
  "description": "Provides current weather conditions and forecasts for any location.",
  "url": "https://weather-agent.example.com/a2a",
  "version": "1.0.0",
  "provider": {
    "organization": "Example Corp",
    "url": "https://example.com"
  },
  "supportedInterfaces": [
    {
      "url": "https://weather-agent.example.com/a2a",
      "protocolBinding": "JSONRPC",
      "protocolVersion": "1.0.0",
      "tenant": "example-org"
    },
    {
      "url": "https://weather-agent.example.com/a2a/rest",
      "protocolBinding": "HTTP+JSON",
      "protocolVersion": "1.0.0",
      "tenant": "example-org"
    }
  ],
  "capabilities": {
    "streaming": true,
    "pushNotifications": false,
    "stateTransitionHistory": false
  },
  "securitySchemes": {
    "oauth2": {
      "type": "oauth2",
      "description": "OAuth 2.0 client credentials for Anypoint Platform authentication."
    }
  },
  "skills": [
    {
      "id": "get-weather",
      "name": "Get Weather",
      "description": "Get the current weather conditions for a specified location.",
      "examples": [
        "What is the weather like in New York?",
        "Is it going to rain in San Francisco today?"
      ],
      "inputModes": ["application/json", "text/plain"],
      "outputModes": ["application/json"],
      "tags": ["weather", "geolocation"]
    }
  ]
}
```

### A2A v0.3 Agent Card

An A2A v0.3 agent card uses the original A2A protocol structure with JSON-RPC as the only transport.
The v0.3 card uses `preferredTransport` and `additionalInterfaces` to declare transport bindings.

Example A2A v0.3 card

```json
{
  "protocolVersion": "0.2.9",
  "name": "Some Company Agent",
  "description": "Some Company Agent provides all the capabilities that can offer to its customers.",
  "url": "${registry.url}/company-agent",
  "capabilities": {},
  "version": "1.0.0",
  "provider": {
    "organization": "Some Company Inc.",
    "url": "https://weather-agent.ch.anypoint.com"
  },
  "securitySchemes": {
    "anypointClientCredentials": {
      "type": "apiKey",
      "in": "header",
      "name": "clientSecret",
      "description": "The client secret for Anypoint Platform authentication."
    }
  },
  "defaultInputModes": ["application/json", "text/plain"],
  "defaultOutputModes": ["application/json", "image/png"],
  "skills": [
    {
      "id": "weather",
      "name": "Returns the weather for a given location",
      "description": "Get the current weather conditions for a specified location.",
      "examples": [
        "What is the weather like in New York?",
        "Is it going to rain in San Francisco today?"
      ],
      "inputModes": ["application/json", "text/plain"],
      "outputModes": ["application/json", "application/vnd.geo+json", "text/html"],
      "tags": ["weather", "geolocation"]
    }
  ]
}
```

### Card Details

After you publish an agent card, the Card Details page in Exchange displays different fields
depending on the protocol version.

#### A2A v1.0 Card Details

- Name

- Description

- URL

- Protocol version

- Supported interfaces (protocol binding, URL, protocol version, and tenant for each)

- Signature (shown only for signed cards)

- Provider

- Security schemes

- Capabilities (streaming, push notifications, state transition history)

- Skills (with descriptions, input/output modes, and examples)

#### A2A v0.3 Card Details

- Name

- Description

- URL

- Protocol version

- Preferred transport

- Additional interfaces

- Provider

- Security schemes

- Capabilities

- Skills

### Create an Agent Asset

1.  In Exchange, select **Publish new asset**.

2.  Enter a name for the asset.

3.  Select the **Agent** asset type from the dropdown list.

4.  Select a protocol type:

    - **A2A v1.0 card**: For agents using A2A Protocol v1.0.0.

    - **A2A v0.3 card**: For agents using A2A Protocol v0.3.0.

    - **Other card**: For agent cards that do not follow a specific A2A protocol version.

5.  Click **Choose file** to upload a `.json` file for the agent card.

6.  Click **Publish**.

## Create an API Asset

An API asset specifies an interface completely, including its functions, descriptions, how to handle
return codes, and dependencies.

Creating an asset sets the asset type, which cannot be changed. All versions of an asset always have
the same type.

To create an API asset:

1.  In Exchange, select **Publish new asset**.

2.  Enter a name for the asset.

3.  Select the asset type from the drop-down list:

    - REST API - RAML: Provide a RAML API specification file. RAML specifications must be a RAML
      file (`.raml`).

    - REST API - OAS: Provide an OAS API specification file. OAS specifications can be either a YAML
      (`.yaml`) or JSON (`.json`) file. Exchange supports OAS 2.0, OAS 3.0, and OAS 3.1
      specifications.

    - SOAP API - WSDL: Provide a WSDL API specification file. SOAP specifications file can be either
      a WSDL (`.wsdl`) or XML (`.xml`) file.

    - AsyncAPI: Provide an AsyncAPI specification file in a YAML (`.yaml`) or JSON (`.json`) file.

    - AsyncAPI with Avro schemas: Provide an Avro fragment in an AVSC (`.avsc`) file.

    - API Spec Fragment - RAML: Provide an API Fragment RAML specification file. Fragment
      specifications must be a RAML file (`.raml`).

    - API Spec Fragment - JSON: Provide an API Fragment JSON specification (`.json`) file.

    - API Spec Fragment - OAS: Provide an API Fragment OpenAPI specification file either JSON or
      YAML.

    - gRPC API: Provide a gRPC API specification file in a .proto file.

    - HTTP API: This asset does not require a file. This asset type provides an API endpoint that is
      defined by API Manager.

4.  For assets that require a file:

    1.  Select **Choose File** to locate the API specification file.

    2.  Select the main file of the API.

        If the file is a ZIP, the selected main file must be in the root directory of the ZIP file.
        If the file is not a ZIP or if the file is a ZIP file with only one main file, then the main
        file is selected automatically.

5.  If you want to edit the **GroupId**, **AssetId**, **Version**, and **API version** (GAV), click
    **Advanced**.

    Exchange generates the group ID, asset ID, and version (GAV) for you, and you can change these
    values as needed. You can change an API’s asset version and version separately. Use the advanced
    settings to change the asset version.

6.  Select an option for **Lifecycle state**. The default is **Stable**.

7.  Click **Publish**.

To create a ZIP file and put the items in a folder into the root directory of the ZIP file, use a
command like this. Replace `myfolder` with the name of your folder and `name.zip` with the name for
the new ZIP file.

```none
cd myfolder; zip -r name.zip.
```

Do not use a command such as `zip -r name.zip myfolder`, which puts the folder into the root
directory of the ZIP file. This causes an error message such as
`The zip file does not contain a .raml file in the root directory`.

## Create an API Group Asset

An API Group is an asset that enables organizations to publish a group of API instances as a single
unit, so that developer client applications can access the APIs as a group, using one client ID and,
optionally, client secret.

API Groups are created in Anypoint API Manager and published to Exchange.

API Groups have major versions, such as 1.0.0, 2.0.0, or 3.0.0, but no minor or patch versions.
Every version of an API Group has one or more API Group instances. Each API Group instance is a
group of API instances that all have the same identity provider and the same environment type,
either production or sandbox. An API Group instance can contain API instances from multiple business
groups.

Creating an API Group requires having the Group Administrator permission, as well as the Asset
Administrator permission for each of the APIs in the group. This ensures that a group creator can
change the underlying APIs between private and public visibility levels.

If an API Group has any private APIs, you see a warning when publishing the API Group to your public
portal. The public portal never shows private content. To ensure that all content in the API Group
is published to the public portal, go to each API’s page in Exchange and make the API public, and
then publish the API Group.

Warnings are also shown when publishing an API Group to your public portal if all of its API Group
instances are private, and when making an API Group instance public if all of its API instances are
private.

## Create a Custom Asset

A custom asset lets you share information about any aspect of your organization such as
announcements, documentation, videos, and sharing files. You can add an optional file to your Custom
asset that users can download. The file is stored in Exchange.

Exchange only permits the following file types as the optional file in a custom asset:

Images: `.jpg, .jpeg, .png, .gif, .svg`  
Documents: `.docx, .pdf, .pptx, .rtf, .vsdx, .vssx`  
Compressed files: `.zip, .tgz, .jar, .gz, .7z`  
Text files: `.txt, .json, .raml, .yaml, .yml, .md, .csv, .xml, .xsd, .wsdl, .html, .pom, .log, .sql`

A file without a file type is not allowed. All file types are case insensitive.

SVG files are limited to 100 KB or less.

MuleSoft recommends deleting all old Custom assets containing files of types that are not permitted.
For any Custom asset containing a non-supported file, delete the asset to remove the file.

To create a custom asset:

1.  In Exchange, select **Publish new asset**.

2.  Enter a name for the asset.

3.  Select the asset type **Custom** from the drop-down list.

4.  To upload a file, click **Choose file**.

5.  To edit the **GroupId**, **AssetId**, and **Version** (GAV), click **Advanced**.

    Exchange generates the group ID, asset ID, and version for you, and you can change these values
    as needed. Use the advanced settings to change the asset version.

6.  Select an option for **Lifecycle state**. The default is **Stable**.

7.  Click **Publish**.

## Create Custom Policy Definition Asset

Policies enforce regulations to help manage security, control traffic, and improve API adoption. For
example, a policy can control authentication, access, and service level agreement (SLA). You can
create a policy definition based on your specific business requirements. Develop custom policy
definitions and apply them to APIs to extend existing functionality or define new ones.

To publish a custom policy definition:

1.  In Exchange, click **Publish new asset**.

2.  Enter a name for the asset.

3.  Select the **Policy** asset type from the drop-down list.

4.  Click **Choose File** to select a JSON schema or YAML file.

5.  To edit the **GroupId**, **AssetId**, **Version**, and API version (GAV), click **Advanced**.

    Exchange generates the group ID, asset ID, and version (GAV). You can change these values. You
    can also change an API asset’s version and API version separately. The advanced settings are
    most often used to change the asset version.

6.  From Lifecycle state, select **Stable**.

    The policy must be in the Stable state to upload the implementation file in a later step.

7.  Click **Publish**.

    **Pending** status appears next to **Implementations** in the left navigation bar.

To implement the policy so that it is available at runtime, follow the steps in
[Add Policy Implementation Files to Published Policy Definition](https://docs.mulesoft.com/exchange/add-policy-implementation-files-to-published-policy-definition).

## Create a GraphQL API

A GraphQL API schema is a collection of operations and object types that are composed of fields. A
GraphQL API allows a client to fetch only the object types and fields needed instead of fetching a
fixed response like in a REST API.

There are two types of schemas that you can upload:

- GraphQL API schema

- GraphQL Apollo API schema

  A GraphQL API schema designed with Apollo GraphQL specific directives and structure, also known as
  the schema definition language (SDL).

To create a GraphQL API:

1.  In Exchange, select **Publish new asset**.

2.  Enter a name for the asset.

3.  From the drop-down list, select the asset type **GraphQL API**.

4.  Select which GraphQL API schema to upload, GraphQL API schema or GraphQL Apollo API schema.

5.  To select a file to upload, click **Choose file**.

6.  To edit the advanced settings, **GroupId**, **AssetId**, and **Version** (GAV), click
    **Advanced**.

    Exchange generates the group ID, asset ID, and version for you, and you can change these values
    as needed. Use the advanced settings to change the asset version.

7.  Select an option for **Lifecycle state**. The default is **Stable**.

8.  Click **Publish**.

## Create a Large Language Model

Only OpenAI and Gemini are supported. To use an OpenAI or Gemini LLM in your broker, you must have
OpenAI or Gemini LLM access in your organization. Configure the LLM asset using one of these
methods:

- Automatic Publication: Define the LLM directly within the YAML configuration file in Anypoint Code
  Builder to automatically publish the LLM asset to Exchange.

- Manual Creation: Manually create the LLM asset in Exchange, and then reference it in the YAML
  configuration file within Anypoint Code Builder.

It’s possible to have more than one LLM asset in your organization.

1.  In Exchange, select **Publish new asset**.

2.  Enter a name for the asset.

3.  Select the **LLM** asset type from the dropdown list.

4.  Enter the name of the platform and select it from the list.

5.  Click **Publish**.

## Create an MCP Server

MCP servers provide the protocols and specifications for seamless integration between different AI
systems and tools.

MCP server schema files are in JSON format. They define the tools, data structures, and
authentication. Upload the schema file to use when creating an MCP server asset or use the MCP
server’s URL to fetch the schema information.

The minimum required property for an MCP server schema file is `transport` over HTTP. If you declare
`capabilities`, you must have all four capability flags: `tools`, `resources`, `prompts`, and
`logging`. If you provide `tools`, `resources`, or `prompts`, each element must include the fields
that the MCP specification requires for its type:

- Each tool requires `name` and `inputSchema`.

- Each resource requires `name` and `uri`.

- Each prompt requires `name`.

This is a sample JSON file with the minimum required `transport` property.

```json
{
  "transport": {
    "kind": "streamableHttp",
    "path": "/events"
  }
}
```

Example MCP server schema file

```json
{
  "protocolVersion": "2025-03-26",
  "transport": {
    "kind": "streamableHttp",
    "path": "/mcp/path"
  },
  "provider": {
    "organization": "Some company AI",
    "url": "https://company.com"
  },
  "capabilities": {
    "tools": true,
    "resources": true,
    "prompts": true,
    "logging": true
  },
  "logging": {
    "level": "info"
  },
  "tools": [
    {
      "name": "searchDocuments",
      "description": "Searches documents by keyword and returns matched snippets.",
      "annotations": {
        "title": "Search Documents",
        "readOnlyHint": true,
        "openWorldHint": true,
        "idempotentHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": { "type": "string", "description": "Search query text" },
          "limit": { "type": "integer", "description": "Maximum number of results" }
        },
        "required": ["query"]
      }
    },
    {
      "name": "updateRecord",
      "description": "Updates a record by ID.",
      "annotations": {
        "title": "Update Record",
        "destructiveHint": true,
        "readOnlyHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "description": "Record identifier" },
          "payload": { "type": "object", "description": "Fields to update" }
        },
        "required": ["id", "payload"]
      }
    }
  ],
  "resources": [
    {
      "name": "Project README",
      "uri": "file:///workspace/README.md",
      "description": "Primary project documentation.",
      "mimeType": "text/markdown",
      "size": 2048,
      "annotations": {
        "audience": ["assistant", "user"],
        "priority": 0.9
      }
    }
  ],
  "prompts": [
    {
      "name": "summarize",
      "description": "Summarize a given text.",
      "arguments": [
        { "name": "text", "description": "Text to summarize", "required": true },
        {
          "name": "tone",
          "description": "Desired tone (e.g., concise, friendly)",
          "required": false
        }
      ]
    }
  ]
}
```

MuleSoft uses a customized, UTF‑8–compatible version of the official MCP schema. It reuses select
standard definitions from the official specification but it’s not identical to it.

MuleSoft MCP server schema file

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "MCP Asset Schema",
  "$ref": "#/definitions/MCPServer",
  "definitions": {
    "MCPServer": {
      "@context": {
        "@type": ["http://anypoint.com/vocabs/mcp#Server"]
      },
      "type": "object",
      "required": ["transport"],
      "additionalProperties": false,
      "properties": {
        "protocolVersion": {
          "type": "string",
          "enum": ["2024-11-05", "2025-03-26", "2025-06-18"],
          "description": "The version of the protocol being used. This is used to determine the structure and capabilities of the data."
        },
        "transport": {
          "$ref": "#/definitions/MCPTransport",
          "description": "The transport protocol used for communication. This defines how the data is transmitted between the client and server."
        },
        "provider": {
          "$ref": "#/definitions/MCPProvider",
          "description": "The service provider of the MCP server."
        },
        "capabilities": {
          "$ref": "#/definitions/ServerCapabilities"
        },
        "logging": {
          "type": "object",
          "properties": {},
          "description": "Present if the server supports sending log messages to the client.",
          "additionalProperties": true
        },
        "tools": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Tool"
          },
          "description": "A list of tools available in the mcp api. Each tool has a name, description, and input schema that defines the expected input format."
        },
        "resources": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Resource"
          },
          "description": "A list of resources available in the mcp api. Each resource has a URI, name, description, MIME type, and annotations that provide additional metadata."
        },
        "resourceTemplates": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/ResourceTemplate"
          },
          "description": "A list of resources available in the mcp api. Each resource has a URI, name, description, MIME type, and annotations that provide additional metadata."
        },
        "prompts": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Prompt"
          },
          "description": "A list of prompts available in the mcp api. Each prompt has a name, description, and arguments that define the expected input format for the prompt."
        },
        "platform": {
          "type": "string",
          "description": "The platform the mcp server is running"
        },
        "securitySchemes": {
          "additionalProperties": {
            "$ref": "a2a.json#/definitions/SecurityScheme"
          },
          "description": "Security scheme details used for authenticating with this agent.",
          "type": "object"
        }
      }
    },
    "ServerCapabilities": {
      "type": "object",
      "description": "Capabilities that a server may support. Known capabilities are defined here, in this schema, but this is not a closed set: any server can define its own, additional capabilities.",
      "properties": {
        "completions": {
          "additionalProperties": true,
          "description": "Present if the server supports argument autocompletion suggestions.",
          "properties": {},
          "type": "object"
        },
        "experimental": {
          "additionalProperties": {
            "additionalProperties": true,
            "properties": {},
            "type": "object"
          },
          "description": "Experimental, non-standard capabilities that the server supports.",
          "type": "object"
        },
        "logging": {
          "anyOf": [
            {
              "additionalProperties": true,
              "description": "Present if the server supports sending log messages to the client.",
              "properties": {},
              "type": "object"
            },
            {
              "type": "boolean",
              "description": "Deprecated: True if the server supports sending log messages to the client."
            }
          ]
        },
        "prompts": {
          "anyOf": [
            {
              "description": "Present if the server offers any prompt templates.",
              "properties": {
                "listChanged": {
                  "description": "Whether this server supports notifications for changes to the prompt list.",
                  "type": "boolean"
                }
              },
              "type": "object"
            },
            {
              "type": "boolean",
              "description": "Deprecated: True if the server offers any prompt templates. "
            }
          ]
        },
        "resources": {
          "anyOf": [
            {
              "description": "Present if the server offers any resources to read.",
              "properties": {
                "listChanged": {
                  "description": "Whether this server supports notifications for changes to the resource list.",
                  "type": "boolean"
                },
                "subscribe": {
                  "description": "Whether this server supports subscribing to resource updates.",
                  "type": "boolean"
                }
              },
              "type": "object"
            },
            {
              "type": "boolean",
              "description": "Deprecated: True if the server offers any resources to read. "
            }
          ]
        },
        "tools": {
          "anyOf": [
            {
              "description": "Present if the server offers any tools to call.",
              "properties": {
                "listChanged": {
                  "description": "Whether this server supports notifications for changes to the tool list.",
                  "type": "boolean"
                }
              },
              "type": "object"
            },
            {
              "type": "boolean",
              "description": "Deprecated: True if the server offers any tools to call."
            }
          ]
        }
      }
    },
    "ResourceTemplate": {
      "@context": {
        "@type": ["http://anypoint.com/vocabs/mcp#ResourceTemplate"]
      },
      "description": "A template description for resources available on the server.",
      "properties": {
        "_meta": {
          "additionalProperties": {},
          "description": "See [General fields: `_meta`](/specification/2025-06-18/basic/index#meta) for notes on `_meta` usage.",
          "type": "object"
        },
        "annotations": {
          "$ref": "#/definitions/Annotations",
          "description": "Optional annotations for the client."
        },
        "description": {
          "description": "A description of what this template is for.\n\nThis can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a \"hint\" to the model.",
          "type": "string"
        },
        "mimeType": {
          "description": "The MIME type for all resources that match this template. This should only be included if all resources matching this template have the same type.",
          "type": "string"
        },
        "name": {
          "description": "Intended for programmatic or logical use, but used as a display name in past specs or fallback (if title isn't present).",
          "type": "string"
        },
        "title": {
          "description": "Intended for UI and end-user contexts — optimized to be human-readable and easily understood,\neven by those unfamiliar with domain-specific terminology.\n\nIf not provided, the name should be used for display (except for Tool,\nwhere `annotations.title` should be given precedence over using `name`,\nif present).",
          "type": "string"
        },
        "uriTemplate": {
          "description": "A URI template (according to RFC 6570) that can be used to construct resource URIs.",
          "format": "uri-template",
          "type": "string"
        }
      },
      "required": ["name", "uriTemplate"],
      "type": "object"
    },
    "MCPProvider": {
      "description": "Represents the service provider of an MCP server.",
      "examples": [
        {
          "organization": "Google",
          "url": "https://ai.google.dev"
        }
      ],
      "properties": {
        "organization": {
          "description": "MCP provider's organization name.",
          "type": "string"
        },
        "url": {
          "description": "MCP provider's URL.",
          "type": "string"
        }
      },
      "required": ["organization", "url"],
      "type": "object"
    },
    "SseTransport": {
      "@context": {
        "@type": [
          "http://anypoint.com/vocabs/mcp#Transport",
          "http://anypoint.com/vocabs/mcp#SseTransport"
        ],
        "@base": "http://anypoint.com/vocabs/mcp#"
      },
      "required": ["kind", "ssePath"],
      "properties": {
        "kind": {
          "type": "string",
          "const": "sse"
        },
        "ssePath": {
          "type": "string",
          "description": "Path to the SSE endpoint"
        },
        "messagesPath": {
          "type": "string",
          "description": "Path to the messages endpoint"
        }
      },
      "additionalProperties": false
    },
    "StdioTransport": {
      "@context": {
        "@type": [
          "http://anypoint.com/vocabs/mcp#Transport",
          "http://anypoint.com/vocabs/mcp#StdioTransport"
        ],
        "@base": "http://anypoint.com/vocabs/mcp#"
      },
      "required": ["kind"],
      "properties": {
        "kind": {
          "type": "string",
          "const": "stdio"
        },
        "instructions": {
          "type": "string",
          "description": "The instructions to run the mcp server"
        }
      },
      "additionalProperties": false
    },
    "StreamableHttpTransport": {
      "@context": {
        "@type": [
          "http://anypoint.com/vocabs/mcp#Transport",
          "http://anypoint.com/vocabs/mcp#StreamableHttpTransport"
        ],
        "@base": "http://anypoint.com/vocabs/mcp#"
      },
      "required": ["kind"],
      "properties": {
        "kind": {
          "type": "string",
          "const": "streamableHttp"
        },
        "path": {
          "type": "string",
          "description": "Path to the mcp endpoint"
        }
      },
      "additionalProperties": false
    },
    "MCPTransport": {
      "type": "object",
      "oneOf": [
        {
          "$ref": "#/definitions/SseTransport"
        },
        {
          "$ref": "#/definitions/StreamableHttpTransport"
        },
        {
          "$ref": "#/definitions/StdioTransport"
        }
      ]
    },
    "Tool": {
      "@context": {
        "@type": ["http://anypoint.com/vocabs/mcp#Tool"]
      },
      "description": "Definition for a tool the client can call.",
      "properties": {
        "_meta": {
          "additionalProperties": {},
          "description": "See [General fields: `_meta`](/specification/2025-06-18/basic/index#meta) for notes on `_meta` usage.",
          "type": "object"
        },
        "annotations": {
          "$ref": "#/definitions/ToolAnnotations",
          "description": "Optional additional tool information.\n\nDisplay name precedence order is: title, annotations.title, then name."
        },
        "description": {
          "description": "A human-readable description of the tool.\n\nThis can be used by clients to improve the LLM's understanding of available tools. It can be thought of like a \"hint\" to the model.",
          "type": "string"
        },
        "inputSchema": {
          "@context": {
            "@type": ["http://anypoint.com/vocabs/mcp#ToolInputSchema"]
          },
          "description": "A JSON Schema object defining the expected parameters for the tool.",
          "properties": {
            "properties": {
              "additionalProperties": {
                "additionalProperties": true,
                "properties": {},
                "type": "object"
              },
              "type": "object"
            },
            "required": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "type": {
              "const": "object",
              "type": "string"
            }
          },
          "required": ["type"],
          "type": "object"
        },
        "name": {
          "description": "Intended for programmatic or logical use, but used as a display name in past specs or fallback (if title isn't present).",
          "type": "string"
        },
        "outputSchema": {
          "@context": {
            "@type": ["http://anypoint.com/vocabs/mcp#ToolOutputSchema"]
          },
          "description": "An optional JSON Schema object defining the structure of the tool's output returned in\nthe structuredContent field of a CallToolResult.",
          "properties": {
            "properties": {
              "additionalProperties": {
                "additionalProperties": true,
                "properties": {},
                "type": "object"
              },
              "type": "object"
            },
            "required": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "type": {
              "const": "object",
              "type": "string"
            }
          },
          "required": ["type"],
          "type": "object"
        },
        "title": {
          "description": "Intended for UI and end-user contexts — optimized to be human-readable and easily understood,\neven by those unfamiliar with domain-specific terminology.\n\nIf not provided, the name should be used for display (except for Tool,\nwhere `annotations.title` should be given precedence over using `name`,\nif present).",
          "type": "string"
        }
      },
      "required": ["inputSchema", "name"],
      "type": "object"
    },
    "ToolAnnotations": {
      "@context": {
        "@type": ["http://anypoint.com/vocabs/mcp#ToolAnnotations"]
      },
      "description": "Additional properties describing a Tool to clients.\n\nNOTE: all properties in ToolAnnotations are **hints**.\nThey are not guaranteed to provide a faithful description of\ntool behavior (including descriptive properties like `title`).\n\nClients should never make tool use decisions based on ToolAnnotations\nreceived from untrusted servers.",
      "properties": {
        "destructiveHint": {
          "description": "If true, the tool may perform destructive updates to its environment.\nIf false, the tool performs only additive updates.\n\n(This property is meaningful only when `readOnlyHint == false`)\n\nDefault: true",
          "type": "boolean"
        },
        "idempotentHint": {
          "description": "If true, calling the tool repeatedly with the same arguments\nwill have no additional effect on its environment.\n\n(This property is meaningful only when `readOnlyHint == false`)\n\nDefault: false",
          "type": "boolean"
        },
        "openWorldHint": {
          "description": "If true, this tool may interact with an \"open world\" of external\nentities. If false, the tool's domain of interaction is closed.\nFor example, the world of a web search tool is open, whereas that\nof a memory tool is not.\n\nDefault: true",
          "type": "boolean"
        },
        "readOnlyHint": {
          "description": "If true, the tool does not modify its environment.\n\nDefault: false",
          "type": "boolean"
        },
        "title": {
          "description": "A human-readable title for the tool.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "Prompt": {
      "@context": {
        "@type": ["http://anypoint.com/vocabs/mcp#Prompt"]
      },
      "description": "A prompt or prompt template that the server offers.",
      "properties": {
        "_meta": {
          "additionalProperties": {},
          "description": "See [General fields: `_meta`](/specification/2025-06-18/basic/index#meta) for notes on `_meta` usage.",
          "type": "object"
        },
        "arguments": {
          "description": "A list of arguments to use for templating the prompt.",
          "items": {
            "$ref": "#/definitions/PromptArgument"
          },
          "type": "array"
        },
        "description": {
          "description": "An optional description of what this prompt provides",
          "type": "string"
        },
        "name": {
          "description": "Intended for programmatic or logical use, but used as a display name in past specs or fallback (if title isn't present).",
          "type": "string"
        },
        "title": {
          "description": "Intended for UI and end-user contexts — optimized to be human-readable and easily understood,\neven by those unfamiliar with domain-specific terminology.\n\nIf not provided, the name should be used for display (except for Tool,\nwhere `annotations.title` should be given precedence over using `name`,\nif present).",
          "type": "string"
        }
      },
      "required": ["name"],
      "type": "object"
    },
    "PromptArgument": {
      "@context": {
        "@type": ["http://anypoint.com/vocabs/mcp#PromptArgument"]
      },
      "description": "Describes an argument that a prompt can accept.",
      "properties": {
        "description": {
          "description": "A human-readable description of the argument.",
          "type": "string"
        },
        "name": {
          "description": "Intended for programmatic or logical use, but used as a display name in past specs or fallback (if title isn't present).",
          "type": "string"
        },
        "required": {
          "description": "Whether this argument must be provided.",
          "type": "boolean"
        },
        "title": {
          "description": "Intended for UI and end-user contexts — optimized to be human-readable and easily understood,\neven by those unfamiliar with domain-specific terminology.\n\nIf not provided, the name should be used for display (except for Tool,\nwhere `annotations.title` should be given precedence over using `name`,\nif present).",
          "type": "string"
        }
      },
      "required": ["name"],
      "type": "object"
    },
    "Resource": {
      "@context": {
        "@type": ["http://anypoint.com/vocabs/mcp#Resource"]
      },
      "description": "A known resource that the server is capable of reading.",
      "properties": {
        "_meta": {
          "additionalProperties": {},
          "description": "See [General fields: `_meta`](/specification/2025-06-18/basic/index#meta) for notes on `_meta` usage.",
          "type": "object"
        },
        "annotations": {
          "$ref": "#/definitions/Annotations",
          "description": "Optional annotations for the client."
        },
        "description": {
          "description": "A description of what this resource represents.\n\nThis can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a \"hint\" to the model.",
          "type": "string"
        },
        "mimeType": {
          "description": "The MIME type of this resource, if known.",
          "type": "string"
        },
        "name": {
          "description": "Intended for programmatic or logical use, but used as a display name in past specs or fallback (if title isn't present).",
          "type": "string"
        },
        "size": {
          "description": "The size of the raw resource content, in bytes (i.e., before base64 encoding or any tokenization), if known.\n\nThis can be used by Hosts to display file sizes and estimate context window usage.",
          "type": "integer"
        },
        "title": {
          "description": "Intended for UI and end-user contexts — optimized to be human-readable and easily understood,\neven by those unfamiliar with domain-specific terminology.\n\nIf not provided, the name should be used for display (except for Tool,\nwhere `annotations.title` should be given precedence over using `name`,\nif present).",
          "type": "string"
        },
        "uri": {
          "description": "The URI of this resource.",
          "format": "uri",
          "type": "string"
        }
      },
      "required": ["name", "uri"],
      "type": "object"
    },
    "Annotations": {
      "@context": {
        "@type": ["http://anypoint.com/vocabs/mcp#Annotations"]
      },
      "description": "Optional annotations for the client. The client can use annotations to inform how objects are used or displayed",
      "properties": {
        "audience": {
          "description": "Describes who the intended customer of this object or data is.\n\nIt can include multiple entries to indicate content useful for multiple audiences (e.g., `[\"user\", \"assistant\"]`).",
          "items": {
            "$ref": "#/definitions/Role"
          },
          "type": "array"
        },
        "priority": {
          "description": "Describes how important this data is for operating the server.\n\nA value of 1 means \"most important,\" and indicates that the data is\neffectively required, while 0 means \"least important,\" and indicates that\nthe data is entirely optional.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        }
      },
      "type": "object"
    },
    "Role": {
      "@context": {
        "@type": ["http://anypoint.com/vocabs/mcp#Role"]
      },
      "description": "The sender or recipient of messages and data in a conversation.",
      "enum": ["assistant", "user"],
      "type": "string"
    }
  }
}
```

To create an MCP server asset:

1.  In Exchange, select **Publish new asset**.

2.  Enter a name for the asset.

3.  Select the **MCP** asset type from the dropdown list.

4.  To upload a schema file:

    1.  From **Method**, select **Upload MCP file**.

    2.  Click **Choose file** to upload a schema file in JSON format.

5.  To use a URL to retrieve MCP schema information:

    1.  From **Method**, select **Fetch MCP URL**.

    2.  Enter the URL of the MCP server.

    3.  If needed, enter the asset credentials.

    4.  To test the connection, click **Test Connection**.

    5.  To view the schema, click **Preview**.

6.  Enter the name of the platform and then select it from the list.

7.  Click **Publish**.

8.  To create an instance of this asset, click **Instances** in the sidebar and click **Go to API
    Manager**.

## Create an RPA Activity Template Asset

Activity templates are reusable code within RPA that standardize the most used activity steps and
make them available to other developers in the organization. These templates are `.cawl` files that
are imported in the RPA Activity library for developers to use as part of their RPA processes.

To create an RPA activity template asset:

1.  In Exchange, select **Publish new asset**.

2.  Enter a name for the asset.

3.  From the drop-down list, select the asset type **RPA Activity Template**.

4.  To select a `.cawl` file to upload, click **Choose file**.

5.  To edit the advanced settings, **GroupId**, **AssetId**, and **Version** (GAV), click
    **Advanced**.

    Exchange generates the group ID, asset ID, and version for you, and you can change these values
    as needed. Use the advanced settings to change the asset version.

6.  Select an option for **Lifecycle state**. The default is **Stable**.

7.  Click **Publish**.

## Create an RPA Process Template Asset

Templates for RPA processes are imported into RPA Builder as projects and are customizable before
deploying to RPA bots. Process templates are built on common patterns for RPA to build automation
faster. These templates are `.crpa` files that are exported from RPA Builder to share with other
developers.

To create an RPA activity template asset:

1.  In Exchange, select **Publish new asset**.

2.  Enter a name for the asset.

3.  From the drop-down list, select the asset type **RPA Process Template**.

4.  To select a `.crpa` file to upload, click **Choose file**.

5.  To edit the advanced settings, **GroupId**, **AssetId**, and **Version** (GAV), click
    **Advanced**.

    Exchange generates the group ID, asset ID, and version for you, and you can change these values
    as needed. Use the advanced settings to change the asset version.

6.  Select an option for **Lifecycle state**. The default is **Stable**.

7.  Click **Publish**.

## Create a Ruleset Asset

Rulesets are a group of rules or guidelines that define an application, for example best practices
or industry-specific standards. Add a zip file with multiple YAML files that describe the new
ruleset.

To create a ruleset asset:

1.  In Exchange, select **Publish new asset**.

2.  Enter a name for the asset.

3.  From the drop-down list, select the asset type **Ruleset**.

4.  To upload, click **Choose file**.

5.  To edit the advanced settings, **GroupId**, **AssetId**, and **Version** (GAV), click
    **Advanced**.

    Exchange generates the group ID, asset ID, and version for you, and you can change these values
    as needed. Use the advanced settings to change the asset version.

6.  Select an option for **Lifecycle state**. The default is **Stable**.

7.  Click **Publish**.

## Create an AsyncAPI Asset

An AsyncAPI is an AsyncAPI specification file that specifies an event-driven API. You can create
AsyncAPIs with Avro schemas. The file type for Avro schemas is AVSC (.avsc).

To create an AsyncAPI:

1.  In Exchange, select **Publish new asset**.

2.  Enter a name for the asset.

3.  From the drop-down list, select the asset type **AsyncAPI**.

4.  To select a file to upload, click **Choose file**.

5.  To edit the advanced settings, **GroupId**, **AssetId**, and **Version** (GAV), click
    **Advanced**.

    Exchange generates the group ID, asset ID, and version for you, and you can change these values
    as needed. Use the advanced settings to change the asset version.

6.  Select an option for **Lifecycle state**. The default is **Stable**.

7.  Click **Publish**.

## Asset Name, Icon, and Description Properties

You can create assets in Anypoint Code Builder, API Designer, or Exchange. After the asset is
created, the name, icon, and description properties can only be changed in the Exchange asset
details page as described in [Editing an Asset](https://docs.mulesoft.com/exchange/to-describe-an-asset).

### Properties of Assets Created in Anypoint Code Builder

When an asset is published from Anypoint Code Builder to Exchange, the asset name is the one used in
the exchange.json file.

The name, icon, and description properties can only be changed in the Exchange asset details page.

### Properties of Assets Created in API Designer

API Designer reads and uses the name of the asset from the RAML specification.

Before the asset is published in Exchange, you can edit the name in API Designer.

After the asset is published in Exchange, the name is used as the asset portal name. Any publication
from API Designer to update the version of an asset in Exchange has the name field disabled, and
shows the name from Exchange. The name, icon, and description properties can only be changed in the
Exchange asset details page.

### Properties of Assets Created in Exchange

When you create an asset in Exchange, you enter the name.

The name can’t be changed when adding a new version in Exchange.

The name, icon, and description properties can only be changed in the Exchange asset details page.

## Create a New Version of an Existing Asset

If you have contributor or admin access to an asset, you can add a new version for an existing
asset:

1.  In Exchange, open the asset list and select the asset.

2.  Click **Add version**.

3.  For API assets, follow the steps for the corresponding API asset type:

    - REST API - RAML: Provide a RAML API specification file. RAML specifications must be a RAML
      file (.raml).

    - REST API - OAS: Provide an OAS API specification file. OAS specifications can be either a YAML
      (.yaml) or JSON (.json) file. Exchange supports OAS 2.0, OAS 3.0, and OAS 3.1 specifications.

    - SOAP API - WSDL: Provide a WSDL API specification file. SOAP specifications file can be either
      a WSDL (.wsdl) or XML (.xml) file.

    - API Spec Fragment - RAML: Provide an API Fragment RAML specification file. Fragment
      specifications must be a RAML file (.raml).

    - AsyncAPI: Provide a JSON (.json) or YAML (.yml) file.

    - AsyncAPI spec with Avro schema: Provide an Avro fragment spec. Fragment specification must be
      an AVSC (.avsc) file.

    - HTTP API - This asset does not require a file. This type of asset provides an API endpoint
      that is defined by API Manager.

4.  For RAML, API Spec Fragment, OAS, and WSDL assets:

    - Select **Choose File** to locate the API specification file.

    - Select the main file of the API.

5.  If you want to select a file to upload, click **Choose file**.

6.  Enter the version for the asset.

7.  Select an option for **Lifecycle state**. The default is **Stable**.

8.  Click **Publish**.

The new version of the asset has the same name, icon, and description as the previous version. Any
changes to these properties apply to all versions of the asset.

## See Also

- [Publishing API Projects to Exchange](https://docs.mulesoft.com/anypoint-code-builder/des-publish-api-spec-to-exchange)

- [Publishing API Specifications From API Designer to Exchange](https://docs.mulesoft.com/design-center/design-publish)

- [Publishing Assets Using Maven](https://docs.mulesoft.com/exchange/to-publish-assets-maven)

- [Asset Details](https://docs.mulesoft.com/exchange/asset-details)

- [Editing an Asset](https://docs.mulesoft.com/exchange/to-describe-an-asset)
