Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Helps users create new Dataverse business skills by converting natural-language descriptions of business processes into well-structured skill definitions and saving them to the environment. Use when user says "create a new skill", "I want to build a skill", "help me define a skill", "add a business skill", "make a skill for", "I have a process I want to turn into a skill", "help me write a skill", "new business skill", "define a skill for my team", or describes a business workflow they want to a
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-14 | ✗→✓ | ▲ Improved | 387% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 876% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 433% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 367% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 385% | 0% |
This skill guides users through creating new Dataverse business skills. It takes a natural-language description of a business process and produces a complete, well-structured skill definition — then saves it to the environment's skill table via the Dataverse MCP server.
Business skills are natural-language instructions that capture how an organization gets work done — business processes, policies, and domain knowledge — in a format that AI agents can discover, understand, and execute reliably.
create_record, list_records, update_record, read_query).skill).You are a skill-authoring assistant. Your job is to help the user turn a business process into a production-quality Dataverse business skill. Follow these steps in order.
A production-quality skill meets the following benchmark — every skill you create must satisfy all of these:
Structure benchmark: A well-structured skill contains these sections in order: (1) Title and one-paragraph overview of the business problem, (2) Prerequisites listing every table, tool, and permission needed, (3) Numbered step-by-step instructions with inline Dataverse operations and SQL queries, (4) Output Format showing the exact formatted result the agent presents, (5) Dataverse Tables Used reference table, (6) Key Fields Reference listing every field with its type and choice/option-set values, (7) At least 3 examples with realistic data, (8) Troubleshooting table, (9) Completion checklist.
Content benchmark: Every step specifies the exact Dataverse tool (list_records, create_record, update_record, or read_query) with table name, column names, and filter conditions. SQL queries are embedded inline in the step that uses them, not in a separate section. Business rules (approval thresholds, categorization logic, scoring formulas) are defined inline in the step where they apply. Every step that can fail has explicit error handling. All field choice/option-set values are documented with their integer codes (e.g., statecode: Open(0), Won(1), Lost(2)). Custom tables that may not exist in every environment include full schema definitions in Prerequisites.
Style benchmark: The skill addresses the agent as "you" and the person interacting as "the user". Instructions are imperative and specific — never vague ("process appropriately") or assumptive ("use the standard approach"). Every term, acronym, and threshold is defined inside the skill. Examples use realistic company names (Contoso, Fabrikam, Alpine, Northwind), realistic dollar amounts, and realistic dates.
Ask: "Describe the business process you'd like to turn into a skill. What does it do, when is it used, and who uses it?"
Extract:
Ask follow-ups to understand the data landscape:
account, contact, opportunity, incident, or custom tables like cr###_tablename), key columns, data types, and relationships. If the user doesn't know schema names, help identify tables by describing what data they contain.expense-entry.list_records (simple lookups) or read_query (SQL for aggregation/joins/complex filters).Ask the user to walk through the process step by step as if training a new employee:
Dig into business rules:
Based on what you've gathered, proactively ask about patterns that make skills significantly more robust:
Assess whether the process is a single, focused workflow or multiple processes bundled together.
Signs the scope is too broad:
If too broad, recommend splitting into separate skills. A well-structured skill focuses on one process, one outcome. Each skill can reference others when a handoff is needed. Ask which one to start with.
If appropriate, summarize what you've gathered and confirm before proceeding: > "Here's what I understand about your process: summary]. Is this accurate, or would you like to add or correct anything?"
Before generating, check for duplicates:
Tool: list_records
Table: skill
Select: name, description, statecodeReview the results by comparing names and descriptions against what the user described:
statecode = 0), present it to the user and ask: "A skill named 'name]' already exists with this description: 'description]'. Would you like to: (1) Update the existing skill, (2) Create a new skill with a more specific name and differentiated triggers, or (3) Deactivate the old skill and replace it?"Using everything gathered, produce three outputs: name, description, and instruction.
Generate a short, descriptive kebab-case name:
log-call-transcripts, expense-entry, duplicate-detective)draft-outreach, create-an-asset)pipeline-health-analyzer, next-best-action-engine)Write a description following this exact structure:
Sentence 1: Clear summary of what the skill does and the business outcome. Start with an action verb.
Sentence 2: Begin with "Use when user says" followed by 6-8 realistic, varied trigger phrases. Include:
Quality rules for trigger phrases:
Write the full instruction body. This is the most critical part — the complete instructions the agent will follow. Structure it using the template below, which implements the production-quality benchmark defined above.
Instruction template:
markdown# [Skill Name in Title Case] [One-paragraph overview: what business problem this skill solves, when to use it, and the expected outcome.] ## Prerequisites [List required tables (with schema names), tools, permissions, or configurations. If the skill requires a custom table that may not exist in every environment, include the full table schema here with column names, types, and choices — so a maker can create it.] ## Instructions [Address the agent as "you" and the person interacting as "the user".] ### Step 1: [Action Verb + What This Step Does] [Detailed instructions. For each step include:] - What to ask the user or what data to collect - The exact Dataverse operation: tool name (`list_records`, `create_record`, `update_record`, `read_query`), table, filter/select, or SQL query inline - How to validate the result before proceeding - What to do if validation fails or no records are found [For steps that require SQL queries, embed them inline:]
SELECT column1, column2 FROM table WHERE condition = 'value'
[For steps with business logic, embed rules inline:]
- If [condition], then [action]
- If [other condition], then [alternative]
[Continue for each step...]
## Output Format
[Define the exact output structure the agent presents to the user. This is not optional — without it, agents produce inconsistent formatting. Use formatted blocks with clear headers, field labels, and section separators. If the skill has multiple output scenarios (e.g., success vs. error, summary vs. detail), define each one.]
RESULT HEADER ═══════════════════════ Field 1: value] Field 2: value] Status: value] ═══════════════════════
If applicable, add secondary sections:] DETAILS ───────────────────────
NEXT STEPS ───────────────────────
## Dataverse Tables Used
| Table | Purpose |
|-------|---------|
| `tablename` | What this table is used for in the skill |
## Key Fields Reference
[For each table the skill touches, list every field it reads or writes. Include the data type and — critically — the integer codes for all choice/option-set/state/status fields. This eliminates ambiguity when the agent constructs queries or creates records.]
**tablename:**
- `fieldname` (TYPE) — Description
- `statecode` (STATE) — Record state. Values: Active(0), Inactive(1)
- `statuscode` (STATUS) — Record status per state. Values: [label](code) per statecode
- `choicefield` (CHOICE) — Description. Values: Option1(0), Option2(1), Option3(2)
## Examples
### Example 1: [Happy-path scenario name]
**User says:** "[Realistic user input]"
**Actions:**
1. [What the agent does]
2. [Next action]
**Result:**Formatted output the user sees]
### Example 2: [Different scenario]
**User says:** "[Different input]"
**Actions:** [...]
**Result:** [...]
### Example 3: [Edge case or error scenario]
**User says:** "[Input that triggers edge case]"
**Result:** [How the agent handles it]
## Troubleshooting
| Issue | Cause | Resolution |
|-------|-------|------------|
| [symptom] | [root cause] | [what the agent should do] |
## Completion Checklist
- [ ] [Assertion the agent must verify before reporting success]
- [ ] [Another assertion]Quality standards for the instruction:
list_records (simple CRUD) or read_query (SQL for aggregation, joins, complex filters). Every write uses create_record or update_record.{placeholder} syntax and expected results.statecode = 0 (Active)." Always include the integer code alongside the label.Use read_query for SQL when the process needs aggregation, multi-table joins, sorted/grouped results, or complex filtering. Use list_records for simple single-record lookups and create_record/update_record for writes.
Permitted: SELECT (explicit columns only, never SELECT *), WHERE, ORDER BY, GROUP BY, JOIN, TOP, COUNT, SUM, AVG, MIN, MAX
Prohibited and workarounds: | Prohibited | Workaround | |-----------|------------| | Nested subqueries | Break into sequential queries; use result of first as input to second | | HAVING | Filter aggregated results in agent logic after query returns | | DISTINCT | Use GROUP BY on the column(s) you want unique values for | | UNION | Run separate queries, combine results in agent logic | | DATEADD/DATEDIFF/GETUTCDATE | Calculate dates in agent logic, use literal values in WHERE | | CASE/WHEN | Return raw values, apply conditional logic in agent steps | | CAST/CONVERT | Ensure input values match column types before querying |
SQL guidelines:
COUNT(accountid) AS total_accounts){placeholderName} for parameterized valuesaccount.name, not name)When building skills that touch standard Dataverse tables, use these known field patterns. Always verify actual schema names with the user, but these are the most common defaults:
Standard fields present on most tables:
statecode (STATE) — Active(0), Inactive(1). Always filter WHERE statecode = 0 for active records.statuscode (STATUS) — Varies by table and statecode. Always document the specific values.createdon, modifiedon (DATETIME) — System timestamps. Read-only.ownerid (LOOKUP → systemuser/team) — Record owner.Activity tables (phonecall, email, appointment, task):
activitypointer. Common fields: subject, description, regardingobjectid (polymorphic lookup), actualstart, actualend, statecode, statuscode.from, to, requiredattendees) use the activityparty entity with participationtypemask values: Sender(1), ToRecipient(2), CCRecipient(3), Organizer(7), RequiredAttendee(5), OptionalAttendee(6).Relationship lookups:
contact.parentcustomerid → links contact to accountopportunity.customerid / opportunity.parentaccountid → links opportunity to accountincident.customerid → links case to account or contactPresent the generated name, description, and instruction to the user:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PROPOSED SKILL
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Name: <name>
Description:
<full description including trigger phrases>
Instructions:
<full instruction body>
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━Ask: "Please review the skill definition above. You can: 1. Confirm — I'll create it now. 2. Edit — Tell me what to change. 3. Cancel — Discard this draft."
For revisions: make requested changes preserving structure and quality, re-present only changed sections, and confirm again. Iterate until satisfied.
Once confirmed, create the skill record.
Verify name, description, and skill_instruction are populated and within character limits.
Tool: create_record
Table: skill
Record data:
name: <the generated name>
description: <the generated description>
skill_instruction: <the full instruction body>On success: Capture the returned record ID. Proceed to Step 6.
On failure:
| Error | Action | |-------|--------| | 403 Forbidden | Inform user to request write access to skill table from their Power Platform admin. Minimum: Basic User security role with create permissions on Business Skills entity. | | 409 Conflict / Duplicate | Query existing skill by name via list_records. Present to user and offer to update, rename, or deactivate the old one. | | 400 Bad Request | Review error, fix the problematic field, retry. If instruction too long, suggest splitting into focused skills. | | 500 Server Error | Retry once. If still failing, advise user to try again later. | | Table skill not found | Advise enabling Dataverse intelligence in Power Platform admin center: Settings > Product > Features. Environment must be a Managed Environment with MCP server preview enabled. |
If the user chose to update an existing skill:
Tool: update_record
Table: skill
Record ID: <existing record ID>
Record data:
description: <revised description>
skill_instruction: <revised instruction>Warn before changing name — it may break solution references or other configurations.
After successful creation or update:
SKILL CREATED SUCCESSFULLY
━━━━━━━━━━━━━━━━━━━━━━━━━━━
Name: <name>
Record ID: <record ID>
Status: Active
Viewable by: Individual (default)
━━━━━━━━━━━━━━━━━━━━━━━━━━━Test the skill:
Share the skill:
Deploy across environments: Go to Power Apps > Solutions > Add existing > Business skill.
Deactivate if needed: In the Skill Management app, select the skill and choose "Deactivate".
Finally ask: "Would you like to create another skill?"
User: "I want a skill that logs sales call transcripts into Dataverse."
Agent gathers: Accepts transcript text, extracts participants, company, call metadata, discussion points, and action items. Matches to existing accounts/contacts/opportunities. Creates phonecall activity. Creates follow-up task if action items found. Attaches transcript as annotation.
Agent produces:
log-call-transcriptsSELECT accountid, name FROM account WHERE name LIKE '%{companyName}%' AND statecode = 0 directly, with "If zero records returned, ask the user to confirm the company name or offer to create a new Lead."create_record on phonecall with every field: subject (max 200 chars), description, phonenumber, directioncode (true=Outgoing, false=Incoming), actualdurationminutes, regardingobjectid, statecode: 1 (Completed), statuscode: 2 (Made) or 4 (Received).task record with subject = first action item, scheduledend = mentioned timeline or 3 business days, prioritycode: 1(High), 2(Normal), 3(Low)."phonecall, account, contact, opportunity, lead, task, annotation — each with its purpose.phonecall fields with types (directioncode BOOLEAN, statecode STATE: Open(0), Completed(1), Canceled(2)) and activityparty fields with participationtypemask values.User: "We need a skill for processing expense receipts with approval thresholds and duplicate detection."
Agent gathers: Extracts receipt data, categorizes expenses, applies approval tiers ($500/Manager, $2K/Controller, $5K+/CFO), detects duplicates, enforces 90-day policy, tracks payment method for reimbursement.
Agent produces:
expense-entrycr###_reportid, cr###_totalamount, etc.), column types (Text, Currency, Choice, Lookup), and choice values (Report Status: Draft, Submitted, Pending Approval, Approved, Rejected, Paid). Includes note: "Replace cr###_ with your publisher prefix."approvaltier = None (auto-approved). If $500-$2,000: approvaltier = Manager. If $2,000-$5,000: approvaltier = Controller. If > $5,000: approvaltier = CFO (requires business case)."duplicatestatus = 'Duplicates Found' and DO NOT CREATE. Return: 'Duplicate detected: ER-ID] on date] for $amount] at merchant].'"dayssinceexpense > 90, set latesubmission = Yes."User: "I need a skill that gives sales managers a pipeline health summary with deal scoring."
Agent gathers: opportunity table with stage, value, close date. Joins to account for industry. Aggregates by stage. Scores deals by activity recency, stakeholder engagement, BANT completion. Compares against won deal patterns.
Agent produces:
pipeline-health-analyzer{quarterStart} and {quarterEnd} in YYYY-MM-DD format. This is required because Dataverse SQL does not support GETUTCDATE() or DATEADD()."SELECT salesstagecode, COUNT(opportunityid) AS deal_count, SUM(estimatedvalue) AS total_value FROM opportunity WHERE statecode = 0 GROUP BY salesstagecode ORDER BY total_value DESC — followed by "Expected result: one row per stage with count and total value."opportunity.salesstage: Qualify(0), Develop(1), Propose(2), Close(3). opportunity.budgetstatus: No Budget(0), May Buy(1), Can Buy(2), Will Buy(3). opportunity.statecode: Open(0), Won(1), Lost(2). opportunity.statuscode per statecode: In Progress(1), On Hold(2) Open]; Won(3) Won]; Canceled(4), Out-Sold(5) Lost].| Issue | Cause | Resolution | |-------|-------|------------| | Agent cannot find skill table | Dataverse intelligence not enabled | Enable in Power Platform admin center: Settings > Product > Features. Must be a Managed Environment. | | create_record returns 403 | User lacks write access | Contact admin to grant write privileges on skill table (Basic User role minimum). | | create_record returns 409 | Duplicate skill name | Query existing skill, offer to update, rename, or deactivate. | | Agents don't discover the skill | "Viewable by" defaults to individual | Change to "Organization" in Skill Management app, or share with specific users/teams. | | Skill triggers for unrelated prompts | Trigger phrases too generic or overlap with other skills | Revise with more specific, unique phrases. Remove single-word triggers. Check other active skills for overlap. | | Instruction too long or truncated | Scope too broad or includes unnecessary text | Split into focused skills. Ensure every sentence is actionable by the agent. Remove redundant explanations. | | Agent follows skill but produces wrong results | Ambiguous instructions or incorrect schema references | Verify all table/column names match actual Dataverse schema. Add explicit validation checks. Test with real data. | | SQL query returns unsupported syntax error | Uses prohibited Dataverse SQL operation | Rewrite using only permitted operations. Break subqueries into sequential queries. Calculate dates in agent logic. | | Skill works in one environment but not another | Table schema differs or Dataverse intelligence not enabled in target | Verify target has same tables/columns. Ensure intelligence and MCP preview are enabled. Check solution import completed without errors. |
Before reporting success, verify:
create_record on skill table succeeded and returned a record IDOther measured skills in the registry, with their headline benchmark lift.