MCP Server Entry Specification

June 24, 2026 ยท View on GitHub

This document defines the specification for MCP server entries in the Docker MCP Gateway catalog system.

Server entries can be defined for an mcp server by writing a yaml file and using it as a CLI flag for profiles or catalogs via --server file://my-server.yaml.

A note about legacy catalogs: Legacy catalogs such as .docker/mcp/catalogs/docker-mcp.yaml or https://desktop.docker.com/mcp/catalog/v3/catalog.yaml use a similar schema for servers under the registry property. However, this spec is intended for defining server configurations for MCP Profiles and OCI Catalogs. Thus, it's expected that this spec will drift from what exists in legacy catalogs.

Example Server Entry YAML

name: duckduckgo
title: DuckDuckGo
type: server
image: mcp/duckduckgo@sha256:68eb20db6109f5c312a695fc5ec3386ad15d93ffb765a0b4eb1baf4328dec14f
description: A Model Context Protocol (MCP) server that provides web search capabilities through DuckDuckGo, with additional features for content fetching and parsing.
allowHosts:
  - html.duckduckgo.com:443

Server Entry Structure

Core Fields

FieldTypeRequiredDescription
namestringYesUnique identifier for the server. Used for referencing and managing the server.
typestringYesServer type. Must be one of: server, remote, or poci.
titlestringYesHuman-readable display name for the server.
descriptionstringYesBrief description of the server's capabilities and purpose.
iconstringNoURL to an icon/logo representing the server.
readmestringNoURL to a README file with detailed documentation for the server.

Container Configuration (for type: "server")

FieldTypeRequiredDescription
imagestringYes*Docker image reference (can be SHA256 digest or tag). Required for server type.
command[]stringNoCommand-line arguments to pass to the container.
volumes[]stringNoVolume mount specifications (format: host:container, host:container:ro, or host:container:rw).
userstringNoUser to run the container as (e.g., 1000:1000).
longLivedbooleanNoWhether the server should remain running (true) or start on-demand (false). Default: false.

Host Bind Mount Safety

Host path bind mounts default to read-only when no mode is specified. Explicit writable host path bind mounts, and no-mode bind mounts that should become writable, are rejected unless the resolved host source exactly matches an entry in MCP_GATEWAY_DOCKER_BIND_ALLOW_WRITABLE_PATHS. Use the OS path-list separator when setting multiple entries.

Setting MCP_GATEWAY_DOCKER_BIND_ALLOW_WRITABLE_PATHS means any catalog or profile you load can request that exact host path as writable. Scope writable entries to dedicated data directories, not source trees or broad project directories.

Remote Configuration (for type: "remote")

FieldTypeRequiredDescription
remoteRemoteYes*Remote server configuration. Required for remote type.
sseEndpointstringNoDeprecated: Legacy SSE endpoint URL. Use remote instead.

Remote Object Structure:

FieldTypeRequiredDescription
urlstringYesURL endpoint for the remote MCP server.
transport_typestringNoTransport protocol type (e.g., sse for Server-Sent Events).
headersmap[string]stringNoCustom HTTP headers to send with requests.

Authentication & Secrets

FieldTypeRequiredDescription
secrets[]SecretNoAPI keys and secrets required by the server.
oauthOAuthNoOAuth configuration for authentication flows.

Secret Object Structure:

FieldTypeRequiredDescription
namestringYesName of the secret. Must be prefixed by unique name of the server (e.g., brave.api_key).
envstringYesEnvironment variable name to inject the secret as (e.g., BRAVE_API_KEY).
examplestringYesAn example value for the key (e.g. your_api_key)

OAuth Object Structure:

FieldTypeRequiredDescription
providers[]OAuthProviderYesList of OAuth providers supported.
scopes[]stringNoOAuth scopes to request.

OAuthProvider Object Structure:

FieldTypeRequiredDescription
providerstringYesOAuth provider identifier (e.g., github, google).
secretstringYesReference to stored OAuth credentials. Must be prefixed by unique name of the server (e.g., asana.personal_access_token)
envstringYesEnvironment variable to inject OAuth token as.

Environment Variables

FieldTypeRequiredDescription
env[]EnvNoStatic environment variables to set in the container.

Env Object Structure:

FieldTypeRequiredDescription
namestringYesEnvironment variable name. (e.g. ASTRA_DB_API_ENDPOINT)
valuestringYesEnvironment variable value. Can reference config fields using template syntax (e.g., {{astra-db.endpoint}}).

Network & Security

FieldTypeRequiredDescription
disableNetworkbooleanNoIf true, disables all network access for the container. Default: false.
allowHosts[]stringNoWhitelist of hosts/domains the server is allowed to access (e.g., ["api.github.com:443", "github.com:443"]).

Tools Definition

FieldTypeRequiredDescription
tools[]ToolNoArray of tools provided by this server. Used for discovery and documentation.

Tool Object Structure:

FieldTypeRequiredDescription
namestringYesTool identifier (unique within the server).
descriptionstringNoHuman-readable description of what the tool does.
arguments[]ToolArgumentNoTool argument definitions (only set for OCI catalogs, not legacy catalogs).
annotationsToolAnnotationsNoTool annotations with hints about behavior (only set for OCI catalogs).

ToolArgument Object Structure:

FieldTypeRequiredDescription
namestringYesArgument name.
typestringNoJSON Schema type (string, number, boolean, array, etc.).
descstringNoDescription of the argument.
itemsItemsNoFor array types, defines the item schema.
optionalbooleanNoWhether the argument is optional. Default: false.

ToolAnnotations Object Structure:

FieldTypeRequiredDescription
titlestringNoHuman-readable title for the tool.
readOnlyHintbooleanNoHint that the tool only reads data and does not modify state.
destructiveHintbooleanNoHint that the tool may perform destructive operations.
idempotentHintbooleanNoHint that the tool is idempotent (repeated calls have the same effect).
openWorldHintbooleanNoHint that the tool interacts with external systems/world.

Configuration Schema

FieldTypeRequiredDescription
config[]ConfigObjectNoArray of configuration objects defining user-configurable settings for the server. Each config object represents a group of related settings that users must provide before using the server.

ConfigObject Structure:

The config field accepts an array of configuration objects. Each object defines a set of user-configurable parameters that can be referenced in environment variables using template syntax (e.g., {{server-name.property-name}}).

FieldTypeRequiredDescription
namestringYesUnique identifier for this config object. Should match the server's unique name (e.g., couchbase, desktop-commander).
descriptionstringYesHuman-readable description explaining what these settings configure.
typestringYesMust be object. Defines this as a configuration object.
propertiesmap[string]PropertySchemaYesMap of property names to their schema definitions. Each key is a field name that users will configure.
required[]stringNoArray of property names that must be provided by the user.
anyOf[]RequirementSetNoAlternative requirement sets - user must satisfy at least one set.
oneOf[]RequirementSetNoExclusive requirement sets - user must satisfy exactly one set.

PropertySchema Structure:

Defines the schema for a single configurable property:

FieldTypeRequiredDescription
typestringYesJSON Schema type: string, number, boolean, array, or object.
descriptionstringNoUser-facing description explaining what this property configures.
itemsItemsSchemaNoFor array types, defines the schema of array elements.
propertiesmap[string]PropertySchemaNoFor object types, defines nested properties.
required[]stringNoFor object types, lists required nested properties.
defaultanyNoDefault value if user doesn't provide one.
enum[]anyNoAllowed values for this property.
patternstringNoRegular expression pattern for string validation.
minimumnumberNoMinimum value for numbers.
maximumnumberNoMaximum value for numbers.

ItemsSchema Structure:

For array-type properties:

FieldTypeRequiredDescription
typestringYesType of array elements (e.g., string, number, object).

RequirementSet Structure:

For anyOf or oneOf conditional requirements:

FieldTypeRequiredDescription
required[]stringYesList of property names that must be provided together.

Config Examples:

Example 1: Simple String Properties

config:
  - name: couchbase
    description: "Configure the connection to Couchbase"
    type: object
    properties:
      cb_connection_string:
        type: string
        description: "Connection string for the Couchbase cluster"
      cb_username:
        type: string
        description: "Username for the Couchbase cluster with access to the bucket"
      cb_bucket_name:
        type: string
        description: "Bucket in the Couchbase cluster to use for the MCP server"
    required:
      - cb_connection_string
      - cb_username
      - cb_bucket_name

Example 2: Array Type Configuration

config:
  - name: desktop-commander
    description: "Configure filesystem access and network permissions"
    type: object
    properties:
      paths:
        type: array
        description: "List of directories that Desktop Commander can access"
        items:
          type: string
    required:
      - paths

Example 3: Nested Object Properties

config:
  - name: atlassian
    description: "The MCP server is allowed to access these paths"
    type: object
    properties:
      confluence:
        type: object
        properties:
          url:
            type: string
            description: "Confluence instance URL"
          username:
            type: string
            description: "Confluence username"
      jira:
        type: object
        properties:
          url:
            type: string
            description: "Jira instance URL"
          username:
            type: string
            description: "Jira username"
    anyOf:
      - required: [confluence]
      - required: [jira]

Referencing Config Values:

Config values can be referenced in environment variables and command arguments using template syntax:

name: astra-db
config:
  - name: astra-db
    description: "Configure Astra DB connection"
    type: object
    properties:
      endpoint:
        type: string
        description: "Astra DB API endpoint URL"
      token:
        type: string
        description: "Astra DB application token"
    required:
      - endpoint
      - token
env:
  - name: ASTRA_DB_API_ENDPOINT
    value: "{{astra-db.endpoint}}"
  - name: ASTRA_DB_APPLICATION_TOKEN
    value: "{{astra-db.token}}"

Metadata

FieldTypeRequiredDescription
metadataMetadataNoAdditional metadata about the server (for display and categorization).

Metadata Object Structure:

FieldTypeRequiredDescription
pullsintegerNoNumber of Docker image pulls.
starsintegerNoNumber of stars/ratings.
githubStarsintegerNoNumber of GitHub stars for the source repository.
categorystringNoCategory classification (e.g., Development, Cloud, AI).
tags[]stringNoTags for searchability and filtering.
licensestringNoSoftware license (e.g., MIT, Apache-2.0).
ownerstringNoOwner/maintainer identifier.

Server Types

Type: "server"

A containerized MCP server that runs as a Docker container managed by the gateway.

Required fields:

  • name
  • type: "server"
  • image

Example:

name: github-official
type: server
title: GitHub Official
description: Official GitHub MCP server for repository management
image: ghcr.io/github/github-mcp-server@sha256:a1d43076a36638ee24520fd6e83c3905ae41bc9850179081df1de2ba3a7afae0
icon: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png
secrets:
  - name: github.personal_access_token
    env: GITHUB_PERSONAL_ACCESS_TOKEN
    example: <YOUR_TOKEN>
    description: You can create a GitHub personal access token [on GitHub](https://github.com/settings/personal-access-tokens/new)
allowHosts:
  - api.github.com:443
  - github.com:443
  - raw.githubusercontent.com:443

Type: "remote"

An MCP server hosted remotely and accessed via HTTP/SSE protocol.

Required fields:

  • name
  • type: "remote"
  • remote.url

Example:

name: cloudflare-docs
description: Access the latest documentation on Cloudflare products such as Workers, Pages, R2, D1, KV.
title: Cloudflare Docs
type: remote
remote:
  transport_type: sse
  url: https://docs.mcp.cloudflare.com/sse
icon: https://www.cloudflare.com/favicon.ico

Best Practices

  1. Naming: Use lowercase, hyphen-separated names (e.g., github-official, aws-core-mcp-server)
  2. Images: Prefer SHA256 digests for production, tags for development. Make sure images exist on a repository that can be accessed by those who can access the server entry (e.g. via code commit or in a private catalog)
  3. Security:
    • Use allowHosts to restrict network access
    • Use disableNetwork: true for tools that don't need network
    • Always use secrets for credentials, never hardcode in env