| title | Comparing Copilot customization features | ||
|---|---|---|---|
| shortTitle | Comparing customizations | ||
| intro | Choose the right way to give {% data variables.product.prodname_copilot_short %} guidance, specialized expertise, and access to tools. | ||
| versions |
|
||
| contentType | concepts | ||
| redirect_from |
|
||
| category |
|
You can customize {% data variables.product.prodname_copilot_short %} to follow your conventions, carry out repeatable workflows, or connect to systems beyond your codebase.
This article explains the difference between:
-
Custom instructions
These tell {% data variables.product.prodname_copilot_short %} how to behave in general. For example, to ensure code it writes follows your coding standards. Find out more.
-
Agent skills
These tell {% data variables.product.prodname_copilot_short %} how to handle a specific kind of task. For example, to follow your team's process when drafting release notes. Find out more.
-
Tools
These provide abilities. For example, for finding and modifying files, or for interacting with parts of {% data variables.product.github %}. Find out more.
-
MCP servers
These add collections of tools that allow {% data variables.product.prodname_copilot_short %} to interact with external services. Find out more.
-
Hooks
These let you run your own logic at specific points in an agent's workflow. For example, you can run a script before the agent uses a tool. Find out more.
-
Subagents
These perform delegated work separately from the main agent. They have their own conversation context, so their intermediate work does not fill the main agent's context window. Find out more.
-
Custom agents
These define specialized roles, with instructions and tools for particular tasks. For example, a custom agent might act as a React reviewer, a docs writer, or a test generator. Find out more.
-
Extensions
These add capabilities implemented in code. For example, a {% data variables.copilot.copilot_cli_short %} extension can add a tool that tracks session activity. Find out more.
-
Plugins
These are packages that can deliver preconfigured customizations such as skills, hooks, custom agents, and MCP servers. Find out more.
Support and configuration differ between surfaces. For a support comparison, see AUTOTITLE.
Custom instructions are supported in the {% data variables.copilot.github_copilot_app %}, {% data variables.copilot.copilot_cli_short %}, {% data variables.copilot.copilot_cloud_agent %}, {% data variables.copilot.copilot_code-review_short %}, {% data variables.copilot.copilot_chat_short %} on {% data variables.product.prodname_dotcom_the_website %}, and supported IDEs. The types of instructions available depend on where you use them.
Custom instructions are persistent guidance that {% data variables.product.prodname_copilot_short %} uses within a defined scope. For example, repository instructions can describe your project's coding conventions and test commands, while personal instructions can describe your communication preferences.
Instructions guide the model, but do not guarantee that it will follow every rule.
Custom instructions help you:
- Keep {% data variables.product.prodname_copilot_short %} aligned with your coding conventions and preferences.
- Apply team or organization standards consistently.
- Avoid including repetitive reminders in every prompt.
Use custom instructions for:
- Style and quality rules. For example: "Prefer small pull requests, write tests, and avoid changing public APIs without discussion."
- Repository conventions. For example: "Use
pnpm, keep changelog entries inCHANGELOG.md, and runpnpm testbefore committing." - Communication preferences. For example: "Explain tradeoffs briefly, then provide the recommended choice."
Keep them minimal when:
- You only want the behavior for one kind of task. Use a skill instead.
- The instructions are so detailed that they distract from the immediate task. Use a skill or a custom agent for specialized guidance.
Agent skills are supported in the {% data variables.copilot.github_copilot_app %}, {% data variables.copilot.copilot_cli_short %}, {% data variables.copilot.copilot_cloud_agent %}, {% data variables.copilot.copilot_code-review_short %}, and agent mode in {% data variables.product.prodname_vscode %}, {% data variables.product.prodname_vs %}, and {% data variables.jetbrains.prodname_jetbrains_ides %}.
A skill is a folder containing a SKILL.md file with instructions for a specific kind of task. Its name and description help {% data variables.product.prodname_copilot_short %} decide when to load those instructions.
Skills can also include supporting resources, such as templates and scripts the agent can run.
Skills help you:
- Standardize how {% data variables.product.prodname_copilot_short %} performs tasks in a specific context, such as a code review.
- Provide instructions when they are relevant, without adding them to every interaction.
- Avoid filling the context window with instructions unrelated to the current task.
Use a skill when you want:
- A repeatable workflow. For example, check that user-facing documentation is updated when frontend code changes.
- A consistent output format. For example, draft release notes using your team's template.
- A workflow you sometimes need, but not always. For example, follow a detailed refactoring process during a migration.
Choose another customization when:
- The guidance should apply broadly to your work. Use custom instructions instead.
- You need access to an external system. Use an MCP server to provide the tools, which a skill can then describe how to use.
- You need a reusable specialist with a particular toolset. Consider a custom agent.
See AUTOTITLE.
Tools are available to agents in the {% data variables.copilot.github_copilot_app %}, {% data variables.copilot.copilot_cli_short %}, {% data variables.copilot.copilot_cloud_agent %}, and supported IDEs. The available tools and permission controls depend on the surface.
A tool is an ability that {% data variables.product.prodname_copilot_short %} uses to get something done, such as searching files, viewing file contents, editing, or running commands. Some tools are built in, and others can be added through MCP servers or extensions.
Tools let an agent:
- Gather context by reading and searching.
- Make changes by editing files.
- Execute commands and validate the results.
You typically do not call tools directly. {% data variables.product.prodname_copilot_short %} chooses tools to carry out your request, subject to the permissions and controls of the surface you are using.
You will see tools used when you:
- Ask an agent to search a repository, update a file, or run tests.
- Ask for work that requires access to an external service through an MCP server.
- Give an agent a task that benefits from delegation to a subagent.
Before adding an integration, check whether the agent's existing tools already meet your needs.
MCP servers are supported in the {% data variables.copilot.github_copilot_app %}, {% data variables.copilot.copilot_cli_short %}, {% data variables.copilot.copilot_cloud_agent %}, {% data variables.copilot.copilot_code-review_short %}, {% data variables.product.prodname_vscode %}, {% data variables.product.prodname_vs %}, {% data variables.jetbrains.prodname_jetbrains_ides %}, Xcode, and Eclipse. Configuration and authentication options depend on the surface.
An MCP server is a service that allows AI applications, such as {% data variables.product.prodname_copilot_short %}, to connect to external data sources and tools.
For example, you could add an MCP server that provides tools for interacting with an online calendar or a support ticketing system.
MCP servers help when the built-in tools are not enough. They can:
- Connect {% data variables.product.prodname_copilot_short %} to external systems.
- Add purpose-built tools for working with APIs, databases, or other services.
- Provide access to information outside your repository.
Use an MCP server when you need:
- Information from an external system. For example: "How many support tickets have been opened this month for Product X?"
- Actions in another service. For example: "Add a comment to the support ticket summarizing this fix."
Avoid adding an MCP server when the built-in tools already cover your needs.
See AUTOTITLE.
Hooks are supported in the {% data variables.copilot.github_copilot_app %}, {% data variables.copilot.copilot_cli_short %}, {% data variables.copilot.copilot_cloud_agent %}, and {% data variables.product.prodname_vscode %}. Supported events and controls depend on the surface.
A hook runs a shell command you define at a particular point in an agent's workflow. For example, a hook can run before a tool is used or when a session ends.
Unlike skills and custom instructions, which guide the model through prompts, hooks execute code at defined events.
Hooks help when you need more control over agent actions, such as:
- Checking a tool request before allowing it to run.
- Logging tool use or session activity.
- Running custom validation at a supported event.
Use hooks when you want:
- Tool checks. For example, check a proposed command against an allowlist before it runs.
- Session automation. For example, record when an agent session starts or ends.
- Custom validation. For example, check whether a tool request would change a protected path.
Use the event and configuration reference for your surface rather than assuming that a hook works unchanged everywhere.
Choose another customization when:
- You just need workflow instructions. Use a skill.
- You want persistent preferences and standards. Use custom instructions.
- You need access to external tools. Use an MCP server.
Subagents are supported in the {% data variables.copilot.github_copilot_app %}, {% data variables.copilot.copilot_cli_short %}, {% data variables.product.prodname_vscode %}, {% data variables.jetbrains.prodname_jetbrains_ides %}, Xcode, and Eclipse.
A subagent is an agent that the main agent delegates a specific piece of work to. It works in its own conversation context and reports its results back to the main agent.
A subagent can use a built-in agent or a custom agent profile. You do not need to define a custom agent for every delegated task.
Subagents help an agent:
- Keep the main conversation focused by handling a subtask in separate context.
- Run independent tasks in parallel where supported.
- Delegate specialist work using a custom agent profile.
Subagents are useful for:
- Codebase exploration. For example, find all endpoints in an API.
- Command execution. For example, run a test suite and summarize failures.
- Reviewing changes. For example, review staged changes while the main agent works on another part of the task.
- Specialist work. For example, delegate a review to a custom documentation agent.
Selecting a custom agent for your main session is different from delegating work to it as a subagent.
Custom agents are supported in the {% data variables.copilot.github_copilot_app %}, {% data variables.copilot.copilot_cli_short %}, {% data variables.copilot.copilot_cloud_agent %}, {% data variables.product.prodname_vscode %}, {% data variables.product.prodname_vs %}, {% data variables.jetbrains.prodname_jetbrains_ides %}, Eclipse, and Xcode. Supported profile properties depend on the surface.
A custom agent defines a specialist role, with instructions and available tools for a particular kind of work. You can think of it as a persona that {% data variables.product.prodname_copilot_short %} can adopt, such as a React reviewer or a docs writer.
You define a custom agent in a Markdown file with YAML frontmatter. Its profile describes its purpose, gives it instructions, and can restrict its available tools. In supported environments, it can also configure MCP servers.
Custom agents help when you need:
- Specialist guidance applied consistently to particular tasks.
- A different set of tools for different kinds of work.
- A reusable role you can select for a session or use for delegated work.
Separate context is a benefit of running an agent as a subagent, not a requirement for using a custom agent.
Use a custom agent when you want:
- A specialized reviewer or helper. For example, a React reviewer that checks your team's component patterns.
- A constrained toolset. For example, a reviewer with tools for reading and searching files, but not editing them.
- A consistent approach. For example, a documentation agent that follows your writing and review standards.
Choose a simpler option when:
- You only need task-specific instructions and resources. A skill may be enough.
- You do not need specialization and the default agent performs the task well.
Extensions are supported in the {% data variables.copilot.github_copilot_app %} and {% data variables.copilot.copilot_cli_short %}. The examples below describe extensions for {% data variables.copilot.copilot_cli_short %}.
An extension adds capabilities implemented in code. In {% data variables.copilot.copilot_cli_short %}, an extension is a JavaScript module that runs alongside an interactive session and can add tools, slash commands, and session-aware behavior.
These are distinct from IDE extensions and the retired {% data variables.product.prodname_github_app %}-based {% data variables.product.prodname_copilot_short %} Extensions integration.
Extensions let you build capabilities that need more than instructions or configuration. For example, a {% data variables.copilot.copilot_cli_short %} extension can keep state across tool calls and make it available through a custom tool.
Use an extension when you need:
- Your own session-aware tools. For example, track tool-call timings across a {% data variables.copilot.copilot_cli_short %} session and expose the totals to the agent.
- A slash command backed by code. For example, add a command that summarizes information collected during a {% data variables.copilot.copilot_cli_short %} session.
Choose another customization when:
- Instructions and resources are enough. Use a skill.
- An existing MCP server provides the external tools you need.
- You only need to run a command at a defined event. Use a hook.
See AUTOTITLE.
Plugins are supported in the {% data variables.copilot.github_copilot_app %}, {% data variables.copilot.copilot_cli_short %}, {% data variables.copilot.copilot_cloud_agent %}, and {% data variables.product.prodname_vscode %}. A plugin's supported components depend on the surface.
A plugin is an installable package that delivers a bundle of capabilities. For example, it can include skills, custom agents, hooks, and MCP server configurations.
A plugin packages customizations, but does not replace their individual purposes.
Plugins help you:
- Add related capabilities without configuring each piece separately.
- Distribute a set of customizations to your team or the public.
- Install and update customizations without manually copying files.
Use a plugin when:
- You want a team-wide bundle. For example, share incident-response skills, a review agent, and MCP server configuration for internal services.
- You want to install and maintain related capabilities together.
Start with individual customizations when:
- You are experimenting locally and do not need distribution.
- You only need a small workflow. A single skill may be simpler.
See AUTOTITLE.
Start with the smallest customization that solves your problem. These features can work together: a skill can describe a workflow that uses MCP tools, and a plugin can distribute both.
| Requirement | Start with |
|---|---|
| I want {% data variables.product.prodname_copilot_short %} to follow our repository conventions. | Custom instructions |
| I want a repeatable workflow for a particular kind of task. | Agent skills |
| I want an agent to search my repository, change files, or run tests. | Its existing tools |
| I need tools provided by an external service. | An MCP server |
| I want checks or automation around tool use and session events. | Hooks |
| I want a focused subtask handled separately from the main conversation. | Subagents |
| I want a reusable specialist with a particular approach and toolset. | A custom agent |
| I need to build my own session-aware tools in {% data variables.copilot.copilot_cli_short %}. | An extension |
| I want to install or share related customizations together. | A plugin |
For configuration locations and surface support, see AUTOTITLE.