Copilot Studio Agent Documentor
To generate documentation in a single file, follow this process, using the sections below to analyse and structure the agents within the /Agents/ folder in this repo.
When to Use This Skill
- User requests documentation for an agent in
Agents/<AgentName>/ - Analyzing agent capabilities, topics, and integrations
- Creating markdown documentation output in
Docs/Agents/folder
Step-by-Step Workflows
1. Identify Agent Structure
# Locate the agent solution
ls Agents/<AgentName>/src/bots/
# List all bot components
ls Agents/<AgentName>/src/botcomponents/
2. Extract Agent Metadata
Read key files in this order:
Agents/<AgentName>/src/Other/Solution.xml- Publisher, version, solution nameAgents/<AgentName>/src/bots/<prefix>_<agentname>/bot.xml- Agent metadataAgents/<AgentName>/src/bots/<prefix>_<agentname>/configuration.json- Agent configuration
3. Document Agent Components
Topics (Conversation Flows)
- Pattern:
botcomponents/<prefix>_<agent>.topic.<TopicName>/ - Read
botcomponent.xmlfor topic name and state - Check
datafile for conversation logic (if present) - Document standard topics: ConversationStart, Greeting, Fallback, Escalate, OnError
- Highlight custom topics (non-standard names)
GPT Instructions
- Pattern:
botcomponents/<prefix>_<agent>.gpt.default/ - Extract AI instructions from
datafile - Document the agent's generative capabilities and system prompt
Connector Actions
- Pattern:
botcomponents/<prefix>_<agent>.action.<Connector-Operation>/ - Example:
.action.ServiceNow-GetRecord,.action.ServiceNow-Orderitem - List all external actions the agent can perform
- Cross-reference with
Assets/botcomponent_connectionreferenceset.xml
Multi-Agent Orchestration
- Pattern:
botcomponents/<prefix>_<agent>.InvokeConnectedAgentTaskAction.<ChildAgent>/ - Document agent-to-agent handoffs
- Map parent agents to their specialized sub-agents
- Orchestration uses
InvokeConnectedAgentTaskActioncomponents to route conversations.
Test Phrases (Evaluation Sets)
- Pattern:
botcomponents/mspva_<GUID>/botcomponent.xmlwith<category>Testing</category> - Component type:
<componenttype>19</componenttype> - Extract test phrases from
<description>or<name>elements - These are sample questions/prompts used to evaluate agent responses
- Group test phrases by parent agent (
<parentbotid>) - Document which agent or topic each test phrase targets
4. Document Components and External Integrations
File Structure (per component)
botcomponents/<componentschema>/
├── botcomponent.xml # Metadata (name, parent, state)
└── data # Optional binary/additional data
Solution Metadata
Other/Solution.xml- Publisher, version, localization settingsAssets/botcomponent_*.xml- Cross-cutting configuration sets- Schema name → physical folder name mapping is 1:1
Connection References
Read Agents/<AgentName>/src/Other/Customizations.xml:
- Extract
<connectionreference>elements - Document
connectorid(e.g.,/providers/Microsoft.PowerApps/apis/shared_service-now) - Note connection display names
Knowledge Sources
Read Agents/<AgentName>/src/unstructuredfilesearchentities/*.meta.xml:
- Extract
<sourceurl>values (external API endpoints) - Document knowledge source types (
<knowledgesource>codes)
Dataverse Tables and Entities
Agents may include Dataverse table search capabilities for querying business data. These are found in:
Agents/<AgentName>/src/dvtablesearchs/- Search configurationsAgents/<AgentName>/src/dvtablesearchentities/- Entity/table mappings
Relationship Structure:
- Each
dvtablesearch.xmldefines a search configuration with a unique<dvtablesearchid> - Each
dvtablesearchentity.xmllinks to a search via<dvtablesearchid>and specifies the<entitylogicalname>(table) - Multiple entities can be associated with a single search configuration
Analysis Process:
To find Dataverse table searches:
# Find all Dataverse table searches
ls Agents/<AgentName>/src/dvtablesearchs/
# Find all entity mappings
ls Agents/<AgentName>/src/dvtablesearchentities/
For each dvtablesearch:
- Read
dvtablesearchs/<guid>/dvtablesearch.xml- Extract search name and ID - Find related entities by searching for the
dvtablesearchidin dvtablesearchentities - Read each
dvtablesearchentities/<guid>/dvtablesearchentity.xml- Extract entity logical name and display name
Generate ERD Diagram: Create a Mermaid entity-relationship diagram showing:
- Tables/entities involved in the search
- Relationships between search configurations and entities
- Entity attributes when available
erDiagram
DvTableSearch ||--o{ DvTableSearchEntity : "configures"
DvTableSearchEntity ||--|| DataverseTable : "queries"
DvTableSearch {
guid dvtablesearchid PK
string name
int searchtype
}
DvTableSearchEntity {
guid dvtablesearchentityid PK
guid dvtablesearchid FK
string entitylogicalname
string name
}
DataverseTable {
string entitylogicalname PK
string displayname
}
Example Mapping:
- Search:
PeopleonAccount_Account_sKtInwp9Jyd91zLl63PSV(ID: c5010e77-c900-4bf1-898d-c4c0ab9eed30) - Entity:
account(Account table)
5. Extract Test Phrases for Evaluation
Search for bot components with <category>Testing</category>:
grep -r "<category>Testing</category>" Agents/<AgentName>/src/botcomponents/ -l
For each testing component:
- Read
botcomponents/<guid>/botcomponent.xml - Extract
<description>and<name>fields - these contain the test phrases - Note the
<parentbotid>to identify which agent the test is for - Group test phrases by agent for documentation
Test phrases are used for:
- Evaluating agent responses to common queries
- Regression testing after agent updates
- Demonstrating agent capabilities with sample questions
6. Generate Documentation Output
Create markdown file in Docs/<AgentName>.md with sections:
# <Agent Display Name>
**Solution Name:** <from Solution.xml>
**Version:** <from Solution.xml>
**Publisher:** <from Solution.xml>
## Overview
<Brief description of agent purpose>
## Agent Architecture
<Multi-agent diagram if applicable>
## Topics
### Standard Topics
- List ConversationStart, Greeting, Fallback, etc.
### Custom Topics
- Document business-specific conversation flows
## GPT Instructions
<System prompt summary>
## External Integrations
### Connectors
- **ServiceNow**: <list actions>
- **<OtherConnector>**: <list actions>
### Knowledge Sources
- URL: <sourceurl>
- Type: <description>
### Dataverse Tables
<If dvtablesearch components exist>
The agent has access to the following Dataverse tables for data queries:
#### Entity Relationship Diagram
```mermaid
erDiagram
<SearchName> ||--o{ <EntityName> : "searches"
<EntityName> {
string entitylogicalname
string displayname
}
Configured Searches
| Search Name | Search ID | Entity | Description |
|---|---|---|---|
Component Inventory
- Total Topics:
- Total Actions:
- Child Agents:
- Dataverse Table Searches:
- Dataverse Entities:
Test Phrases & Evaluation Sets
- "<test phrase 1>"
- "<test phrase 2>"
- "<test phrase 3>"
- "<test phrase 1>"
- "<test phrase 2>"
### Naming Conventions to Recognize
#### Component Schema Names
- Format: `<customizationprefix>_<logicalname>.<componenttype>.<descriptor>`
- Example: `cr667_primaryPortalAgent.InvokeConnectedAgentTaskAction.ClientExplorer`
- The prefix (e.g., `cr667`, `pkb`) comes from the Dataverse publisher
#### Topic Naming Patterns
- Standard: `.topic.Greeting`, `.topic.Fallback`, `.topic.OnError`
- Custom: `.topic.<Intent>_<GUID>` or `.topic.<FriendlyName>`
#### Action Naming Pattern
- Format: `.action.<ConnectorName>-<OperationName>`
- Example: `.action.ServiceNow-Getcatalogitems`
### Common Analysis Commands
```bash
# Count topics for an agent
ls Agents/<AgentName>/src/botcomponents/ | grep "\.topic\." | wc -l
# Find all connector actions
ls Agents/<AgentName>/src/botcomponents/ | grep "\.action\."
# Check for multi-agent orchestration
ls Agents/<AgentName>/src/botcomponents/ | grep "InvokeConnectedAgentTaskAction"
# Find external service URLs
grep -r "sourceurl\|connectorid" Agents/<AgentName>/src/
# List all agents in solution
ls Agents/<AgentName>/src/bots/
# Find all test phrases/evaluation sets
grep -r "<category>Testing</category>" Agents/<AgentName>/src/botcomponents/ -A 3
# Check for Dataverse table searches
ls Agents/<AgentName>/src/dvtablesearchs/ 2>/dev/null || echo "No Dataverse searches"
# List Dataverse entities
ls Agents/<AgentName>/src/dvtablesearchentities/ 2>/dev/null || echo "No Dataverse entities"
# Find entity-to-search mappings
grep -r "dvtablesearchid" Agents/<AgentName>/src/dvtablesearchentities/
Output Best Practices
- Always output to
Docs/- Never create documentation in other folders - Use agent name as filename -
Docs/<AgentName>.md - Include file references - Link back to source files when describing components
- Configuration - List out in a table the configuration of each othe bots.
- Document multi-agent relationships - Show parent-child agent hierarchies in a mermaid diagram. Group all the documentation by the agent, showing documentation topics underneath each group.
- Highlight integrations - External APIs and connectors are critical for understanding agent capabilities
- Count components - Provide metrics (# topics, # actions, # child agents)
- Include test phrases - Document evaluation test phrases grouped by agent to demonstrate capabilities and provide testing examples
- Other documentation - Remove references to other documentation in the repository. This file should be standalone.
- Technical depth - Include some explainations of components, assuming that the audience less technical and may not know what these components mean - unless the request asks for highly technical output.
Example: multiagentdemo Analysis
The multiagentdemo solution contains 5 agents:
- primaryPortalAgent (orchestrator)
- getSkillName (People Skills Finder)
- myServices (ServiceNow integration with 3 actions)
- serviceNowKnowledgeAgent (knowledge base queries)
- whoWhat (account lookups)
ServiceNow integration found:
- Connector:
shared_service-now - Actions: GetRecord, Getcatalogitems, Orderitem
- Knowledge URL:
https://<instance-name>.service-now.com/
Key Files Reference
Solution.xml- Version, publisher, solution metadataCustomizations.xml- Connection references to external servicesbotcomponent_connectionreferenceset.xml- Bot-to-connector mappingsunstructuredfilesearchentities/*.meta.xml- Knowledge source URLsbotcomponents/*/botcomponent.xml- Individual component metadatabotcomponents/*/data- Individual component data filesbots/*/bot.xml- Top-level bot definitionsbots/*/configuration.json- Bot configuration settingsdvtablesearchs/*/dvtablesearch.xml- Dataverse table search configurationsdvtablesearchentities/*/dvtablesearchentity.xml- Dataverse entity/table mappings
When you are building references to files, navigate from the repo root, as the generated document can existing under a subfolder when generated.