Skip to main content

GitHub Copilot CLI plugin reference

Find commands and configuration details for CLI plugins.

Hinweis

You can find help on using plugins by entering copilot plugin [SUBCOMMAND] --help in the terminal.

CLI commands

You can use the following commands in the terminal to manage plugins for Copilot-CLI.

CommandDescription
copilot plugin install SPECIFICATIONInstall a plugin. See Plugin specification for install command below.
copilot plugin uninstall NAMERemove a plugin
copilot plugin listList installed plugins
copilot plugin update NAMEUpdate a plugin
copilot plugin marketplace add SPECIFICATIONRegister a marketplace
copilot plugin marketplace listList registered marketplaces
copilot plugin marketplace browse NAMEBrowse marketplace plugins
copilot plugin marketplace remove NAMEUnregister a marketplace

Plugin specification for install command

FormatExampleDescription
Marketplaceplugin@marketplacePlugin from a registered marketplace
GitHubOWNER/REPORoot of a GitHub repository
GitHub subdirOWNER/REPO:PATH/TO/PLUGINSubdirectory in a repository
Git URLhttps://github.com/o/r.gitAny Git URL
Local path./my-plugin or /abs/pathLocal directory

plugin.json

All plugins consist of a plugin directory containing, at minimum, a manifest file named plugin.json located at the root of the plugin directory. See Creating a plugin for GitHub Copilot-CLI.

Required field

FieldTypeDescription
namestringKebab-case plugin name (letters, numbers, hyphens only). Max 64 chars.

Optional metadata fields

FieldTypeDescription
descriptionstringBrief description. Max 1024 chars.
versionstringSemantic version (e.g., 1.0.0).
authorobjectname (required), email (optional), url (optional).
homepagestringPlugin homepage URL.
repositorystringSource repository URL.
licensestringLicense identifier (e.g., MIT).
keywordsstring[]Search keywords.
categorystringPlugin category.
tagsstring[]Additional tags.

Component path fields

These tell the CLI where to find your plugin's components. All are optional. The CLI uses default conventions if omitted.

FieldTypeDefaultDescription
agentsstring | string[]agents/Path(s) to agent directories (.agent.md files).
skillsstring | string[]skills/Path(s) to skill directories (SKILL.md files).
commandsstring | string[]Path(s) to command directories.
hooksstring | objectPath to a hooks config file, or an inline hooks object.
mcpServersstring | objectPath to an MCP config file (e.g., .mcp.json), or inline server definitions.
lspServersstring | objectPath to an LSP config file, or inline server definitions.

Example plugin.json file

JSON
{
  "name": "my-dev-tools",
  "description": "React development utilities",
  "version": "1.2.0",
  "author": {
    "name": "Jane Doe",
    "email": "jane@example.com"
  },
  "license": "MIT",
  "keywords": ["react", "frontend"],
  "agents": "agents/",
  "skills": ["skills/", "extra-skills/"],
  "hooks": "hooks.json",
  "mcpServers": ".mcp.json"
}

marketplace.json

You can create a plugin marketplace—which people can use to discover and install your plugins—by creating a marketplace.json file and saving it to the .github/plugin/ directory of the repository. You can also store the marketplace.json file in your local file system. For example, saving the file as /PATH/TO/my-marketplace/.github/plugin/marketplace.json allows you to add it to the CLI using the following command:

copilot plugin marketplace add /PATH/TO/my-marketplace

Hinweis

Copilot-CLI also looks for the marketplace.json file in the .claude-plugin/ directory.

For more information, see Creating a plugin marketplace for GitHub Copilot-CLI.

Example marketplace.json file

JSON
{
  "name": "my-marketplace",
  "owner": {
    "name": "Your Organization",
    "email": "plugins@example.com"
  },
  "metadata": {
    "description": "Curated plugins for our team",
    "version": "1.0.0"
  },
  "plugins": [
    {
      "name": "frontend-design",
      "description": "Create a professional-looking GUI ...",
      "version": "2.1.0",
      "source": "./plugins/frontend-design"
    },
    {
      "name": "security-checks",
      "description": "Check for potential security vulnerabilities ...",
      "version": "1.3.0",
      "source": "./plugins/security-checks"
    }
  ]
}

Hinweis

The value of the source field for each plugin is the path to the plugin's directory, relative to the root of the repository. It is not necessary to use ./ at the start of the path. For example, "./plugins/plugin-name" and "plugins/plugin-name" resolve to the same directory.

marketplace.json fields

Top-level fields

FieldTypeRequiredDescription
namestringYesKebab-case marketplace name. Max 64 chars.
ownerobjectYes{ name, email? } — marketplace owner info.
pluginsarrayYesList of plugin entries (see the table below).
metadataobjectNo{ description?, version?, pluginRoot? }

Plugin entry fields (objects within the plugins array)

FieldTypeRequiredDescription
namestringYesKebab-case plugin name. Max 64 chars.
sourcestring | objectYesWhere to fetch the plugin (relative path, GitHub, or URL).
descriptionstringNoPlugin description. Max 1024 chars.
versionstringNoPlugin version.
authorobjectNo{ name, email?, url? }
homepagestringNoPlugin homepage URL.
repositorystringNoSource repository URL.
licensestringNoLicense identifier.
keywordsstring[]NoSearch keywords.
categorystringNoPlugin category.
tagsstring[]NoAdditional tags.
commandsstring | string[]NoPath(s) to command directories.
agentsstring | string[]NoPath(s) to agent directories.
skillsstring | string[]NoPath(s) to skill directories.
hooksstring | objectNoPath to hooks config or inline hooks object.
mcpServersstring | objectNoPath to MCP config or inline server definitions.
lspServersstring | objectNoPath to LSP config or inline server definitions.
strictbooleanNoIf false, plugin doesn't need its own plugin.json. Default: true.

File locations

ItemPath
Installed plugins~/.copilot/installed-plugins/ and ~/.copilot/installed-plugins/_direct
Marketplace cache~/.copilot/state/marketplace-cache/
Plugin manifestplugin.json, .github/plugin/plugin.json, or .claude-plugin/plugin.json
Marketplace manifest.github/plugin/marketplace.json or .claude-plugin/marketplace.json
Agentsagents/ (default, overridable in manifest)
Skillsskills/ (default, overridable in manifest)
Hooks confighooks.json or hooks/hooks.json
MCP config.mcp.json or .github/mcp.json
LSP configlsp.json or .github/lsp.json

Loading order and precedence

If you install multiple plugins it's possible that some custom agents, skills, MCP servers, or tools supplied via MCP servers have duplicate names. In this situation, the CLI determines which component to use based on a precedence order.

  • Agents and skills use first-found-wins precedence.

    If you have a project-level custom agent or skill with the same name or ID as one in a plugin you install, the agent or skill in the plugin is silently ignored. The plugin cannot override project-level or personal configurations. Custom agents are deduplicated using their ID, which is derived from its file name (for example, if the file is named reviewer.agent.md, the agent ID is reviewer). Skills are deduplicated by their name field inside the SKILL.md file.

  • MCP servers use last-wins precedence.

    If you install a plugin that defines an MCP server with the same server name as an MCP server you have already installed, the plugin's definition takes precedence. You can use the --additional-mcp-config command-line option to override an MCP server configuration with the same name, installed using a plugin.

  • Built-in tools and agents are always present and cannot be overridden by user-defined components.

The following diagram illustrates the loading order and precedence rules.

┌─────────────────────────────────────────────────────────┐
│  BUILT-IN - HARDCODED, ALWAYS PRESENT                   │
│  • tools: bash, view, apply_patch, glob, rg, task, ...  │
│  • agents: explore, task, code-review, general-purpose  │
└────────────────────────┬────────────────────────────────┘
                         │
  ┌──────────────────────▼──────────────────────────────────────────────┐
  │  CUSTOM AGENTS - FIRST LOADED IS USED (dedup by ID)                 │
  │  1. ~/.copilot/agents/           (user, .github convention)         │
  │  2. <project>/.github/agents/    (project)                          │
  │  3. <parents>/.github/agents/    (inherited, monorepo)              │
  │  4. ~/.claude/agents/            (user, .claude convention)         │
  │  5. <project>/.claude/agents/    (project)                          │
  │  6. <parents>/.claude/agents/    (inherited, monorepo)              │
  │  7. PLUGIN: agents/ dirs         (plugin, by install order)         │
  │  8. Remote org/enterprise agents (remote, via API)                  │
  └──────────────────────┬──────────────────────────────────────────────┘
                         │
  ┌──────────────────────▼──────────────────────────────────────────────┐
  │  AGENT SKILLS - FIRST LOADED IS USED (dedup by name)                │
  │  1. <project>/.github/skills/        (project)                      │
  │  2. <project>/.agents/skills/        (project)                      │
  │  3. <project>/.claude/skills/        (project)                      │
  │  4. <parents>/.github/skills/ etc.   (inherited)                    │
  │  5. ~/.copilot/skills/               (personal-copilot)             │
  │  6. ~/.claude/skills/                (personal-claude)              │
  │  7. PLUGIN: skills/ dirs             (plugin)                       │
  │  8. COPILOT_SKILLS_DIRS env + config (custom)                       │
  │  --- then commands (.claude/commands/), skills override commands ---│
  └──────────────────────┬──────────────────────────────────────────────┘
                         │
  ┌──────────────────────▼──────────────────────────────────────────────┐
  │  MCP SERVERS - LAST LOADED IS USED (dedup by server name)           │
  │  1. ~/.copilot/mcp-config.json       (lowest priority)              │
  │  2. .vscode/mcp.json                 (workspace)                    │
  │  3. PLUGIN: MCP configs              (plugins)                      │
  │  4. --additional-mcp-config flag     (highest priority)             │
  └─────────────────────────────────────────────────────────────────────┘