Microsoft Copilot Studio¶
Format id: copilot-studio. Reads two layouts of the same definitions:
- Workspaces that the Copilot Studio extension for Visual Studio Code clones and applies: a folder of
.mcs.ymlfiles. The writer produces this layout. - Solutions exported with
pac solution export, as the zip or unpacked withpac solution unpack. Exporting needs no access to the agent beyond the Power Platform CLI, so a scheduled job can record agents built in the web designer.
Tests validate written files against the Copilot Studio authoring schema, by each file's kind.
$ marshal read path/to/cloned-agent
$ marshal read Contoso_1_0_0_1.zip
$ marshal convert agent.adl.yaml --to copilot-studio --out converted/
Workspace layout¶
| File | Read as |
|---|---|
agent.mcs.yml |
Instructions, conversation starters, model (aISettings.model), capabilities (gptCapabilities) |
settings.mcs.yml |
Schema name (the agent id), display name, access control policy, authentication mode |
actions/*.mcs.yml |
Tools: connectors, MCP connectors, Power Automate flows, connected agents, AI Builder models |
connectionreferences.mcs.yml |
The connector behind each connection reference |
knowledge/*.mcs.yml, knowledge/files/ |
SharePoint, public website and other search sources; uploaded files |
agents/<Name>/agent.mcs.yml |
Sub-agents, each recorded as its own agent |
skills/, topics/, trigger/ |
Bot Framework skills, topic names and triggers, HTTP requests made from topics, autonomous triggers |
Display names come from the files' # Name: comment headers where present. A file wrapped in a Markdown code fence is still read, and so is one with unquoted @ keys such as @odata.type, which Copilot Studio writes but YAML reserves.
Solution layout¶
| Path | Read as |
|---|---|
bots/<schema>/bot.xml |
Schema name (the agent id), display name, access control policy, authentication mode and trigger. These are stored as numbers and read as the names a workspace uses. |
bots/<schema>/configuration.json |
The rest of the settings, which a workspace keeps in settings.mcs.yml |
botcomponents/<schema>/data |
One component's YAML, the same content as the workspace file of the same kind: GptComponentMetadata as agent.mcs.yml, TaskDialog as an action, AgentDialog as a sub-agent, AdaptiveDialog as a topic, KnowledgeSourceConfiguration as knowledge, ExternalTriggerConfiguration as a trigger |
botcomponents/<schema>/botcomponent.xml |
The component's display name and parent agent; file attachments (component type 14) as uploaded knowledge files |
Other/Customizations.xml (customizations.xml in a zip) |
The connector behind each connection reference |
A solution can hold several agents; each component belongs to the agent its parentbotid names. From a zip, only bots/, botcomponents/ and the customizations file are extracted, to a temporary folder, and entries with absolute or parent-directory paths are skipped.
Read mapping¶
| Ledger field | Source | Provenance |
|---|---|---|
| agent id | settings.mcs.yml schemaName (sub-agents: <schema name>/<folder>) |
|
instructions |
agent.mcs.yml instructions (sub-agents: settings.instructions) |
declared |
model.requested, provider |
aISettings.model.modelNameHint and provider; GPT hints → azure-openai, Claude hints → anthropic |
declared / derived |
tools[] |
Connector actions as tool/powerplatform.<connector>.<operation>; MCP connectors as tool/mcp.powerplatform.<connector>; flows as tool/powerplatform.flow.<id>; prompts as tool/powerplatform.ai_plugin.<name>; connected agents and sub-agents as agent/<id>; webBrowsing and codeInterpreter capabilities; HTTP requests, connector operations and flows that topics call |
declared / derived |
tools[].input_schema |
Inputs the model fills in (AutomaticTaskInput) |
declared |
tools[].scope, reversible |
For standard Microsoft connector operations (Office 365 Users and Outlook, Dataverse, Teams, MSN Weather), from Microsoft's connector reference: reads are read and reversible; writes are write; operations that send a message are also irreversible. The table is powerplatform-operations.yaml. Other operations, and ones whose effect depends on their input such as HttpRequest, stay unknown. |
derived |
tools[].requires_confirmation |
An action's confirmation prompt |
declared |
knowledge[] |
Sites as knowledge/<url>, so a SharePoint site shared with another agent is the same entity; uploaded files; scope read |
declared / derived |
permissions.identity |
Derived from the connection mode of every action, topic call and trigger: all Invoker → on_behalf_of_user; all Maker (the schema default) → shared_credential; both → mixed. A flow's connections are defined in the flow, not the agent, so an agent that calls flows is unknown unless its other connections already show both modes. |
derived |
permissions.access[] |
accessControlPolicy; authenticationMode: None adds "unauthenticated users" |
declared |
bindings |
Connection reference names, Dataverse bot id | |
extensions.copilot-studio |
Settings, conversation starters, AI settings, per-action tool, connector and credential mode, topics, the calls topics make and their credential mode, triggers | declared |
A Maker connection uses the credentials the agent's author configured, for every user. An Invoker connection uses each end user's own. The difference is often the most important governance fact about a Copilot Studio agent, so every action records its mode, and the agent's identity summarizes them.
Writing¶
Tested: the golden tests validate each written file that has a kind against Microsoft's published Copilot Studio authoring schema, and check that every loss is explained. Settings and connection reference files have no published schema. The output hasn't yet been applied to a Copilot Studio environment.
The writer produces agent.mcs.yml, settings.mcs.yml, an action file per tool it can express, connectionreferences.mcs.yml for the connectors those actions use, and a knowledge file per website, SharePoint site and uploaded file.
- Connection modes: each action keeps its source connection mode. Without one, an agent that acts on behalf of users gets
Invoker; otherwise it getsMaker. - Access: without an access policy in the source, the agent is limited to users it is shared with, with integrated authentication. The report lists this as defaulted.
- Identity: an agent from another format keeps its ledger identity in a
# io.github.marshal-ledger:comment at the top ofsettings.mcs.yml.
Declared losses¶
| Field | Reason |
|---|---|
tools[] that aren't connectors, MCP connectors, flows or agents |
Copilot Studio needs a custom connector for them |
tools[].scope, reversible, output_schema |
Actions don't declare these |
knowledge[] that isn't a website, SharePoint site or uploaded file |
Not a Copilot Studio knowledge source |
permissions.grants, principal, identity, access |
Permissions come from connection modes and one agent-wide access policy |
model.parameters, model.resolved |
Not exposed by Copilot Studio |
| Topics, triggers, sub-agent content | Recorded by name; not re-created. A connector or flow a topic calls is written as an action. |