← Back to latest Writing

How to Migrate Classic Copilot Studio Agents: Two Paths

The new agent experience changes the underlying architecture enough that the longer you wait, the more you’re managing a topic tree by hand instead of letting a modern component model do the work. At some point migration stops being optional and starts being the realistic move. Here are two paths to get there.

Path one: the CLI method — purposeful, the enterprise standard

The Microsoft Copilot Studio plugin for AI coding agents (Claude Code and GitHub Copilot CLI) is the developer route. It clones a classic agent locally, analyzes its structure, proposes a modern architecture, and generates a migrated agent you can test, all from natural language in your terminal. This is the method built for teams that need repeatability, review, and an audit trail on what actually changed, the enterprise standard when the migration needs to hold up to scrutiny.

The Power CAT team built this, and I will def give credit where it’s due. Giorgio Ughini’s original demo showed the plugin authoring a complex agent from scratch.

Path two: the faster method through the Copilot Studio UI

You can also migrate using Chat within Copilot Studio, straight through the portal, topic by topic, rebuilding each one as a Skill and wiring up workflows for anything that needs deterministic execution. No terminal, no plugin, nothing to install. It’s the faster on-ramp when you just need one or two agents moved and don’t need the CLI’s review trail, and it forces you to actually understand every piece of logic you’re carrying forward instead of trusting a tool to interpret it.

The actual starter prompt for Pathway 1

Straight from the CAT team’s own post, this is the real command, not a generic clone-and-figure-it-out flow:

Starter prompt for migration

/mcs-assistant:migrate Migrate this agent to modern orchestration: https://copilotstudio.microsoft.com/environments/<ENV_ID>/bots/<BOT_ID> from tenant <TENANT_ID>. Use a capable AI model.

The key word is propose. It analyzes the classic agent and generates a first draft of a modern one, it doesn’t guarantee that draft is the architecture you’d have chosen. Don’t let it turn every topic into a Skill and every variable into memory just because they existed in the old agent, that’s just porting old decisions forward with new labels. Run it, inspect what it built, compare it against how the old agent actually behaved, then decide what’s good enough to keep.

Every command, in order

Install the Copilot CLI (Node.js 22+ required)

npm install -g @github/copilot

Launch it in your project folder

copilot

Log in with your GitHub account

/login

Add the plugin marketplace

/plugin marketplace add microsoft/copilot-studio-plugin

Install the plugin

/plugin install mcs-assistant@copilot-studio-plugin

Run the migration on a real classic agent

/mcs-assistant:migrate Migrate this agent to modern orchestration: https://copilotstudio.microsoft.com/environments/6987bf87-5ca2-edbd-87a2-924fe06ad116/bots/aa75760b-257d-f111-ab0e-0022480b3618 from tenant <TENANT_ID>. Use a capable AI model.

Troubleshooting, if things look inconsistent

Confirm what’s actually loaded in the session, plugins, hooks, and MCP servers, the most reliable check there is

/env

Force a reload if something looks stale

/plugin update mcs-assistant@copilot-studio-plugin

If that update fails with “Access is denied (os error 5)” on Windows, close VS Code entirely first, it holds a file lock on the plugins folder, then run these from a plain terminal outside VS Code

mkdir "C:\Users\MichaelHeath\copilot-agents\IT Request Assistant Classic"
cd "C:\Users\MichaelHeath\copilot-agents\IT Request Assistant Classic"
copilot

Asking the CLI a generic question like “what can you help me do” is unreliable, since it sometimes surfaces the plugin’s own docs and sometimes falls back to general CLI knowledge. Calling the migrate command directly, like above, sidesteps that inconsistency entirely.

What actually changes underneath

The CAT team’s component model is the clearest way to think about where logic should live once it’s migrated: instructions carry what’s always true, knowledge holds the searchable facts, tools handle system actions, memory carries persistent context, Skills own situational procedures, and connected agents cover real specialist domains. A modern agent shouldn’t be one instruction blob with dozens of tools bolted on and a hope it routes correctly. Whichever path you take, manual or plugin-assisted, that’s the target shape you’re migrating toward.

Watch the video

Resources