{"id":5159,"date":"2026-03-02T08:46:27","date_gmt":"2026-03-02T16:46:27","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/semantic-kernel\/?p=5159"},"modified":"2026-04-13T04:21:53","modified_gmt":"2026-04-13T11:21:53","slug":"give-your-agents-domain-expertise-with-agent-skills-in-microsoft-agent-framework","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/agent-framework\/give-your-agents-domain-expertise-with-agent-skills-in-microsoft-agent-framework\/","title":{"rendered":"Give Your Agents Domain Expertise with Agent Skills in Microsoft Agent Framework"},"content":{"rendered":"<p>You can now equip your Microsoft Agent Framework agents with portable, reusable skill packages that provide domain expertise on demand \u2014 without changing a single line of your agent&#8217;s core instructions. With built-in skills providers for both .NET and Python, your agents can discover and load <a href=\"https:\/\/agentskills.io\/\">Agent Skills<\/a> at runtime, pulling in only the context they need, when they need it.<\/p>\n<h2>What Are Agent Skills?<\/h2>\n<p>Agent Skills is a simple, open format for giving agents new capabilities and expertise. At the core of every skill is a <code>SKILL.md<\/code> file \u2014 a markdown document that describes what the skill does and provides step-by-step instructions for how to do it. Skills can also include optional scripts, reference documents, and other resources the agent can fetch on demand.<\/p>\n<p>A skill directory looks like this:<\/p>\n<pre class=\"wp-block-code\"><code>expense-report\/\r\n\u251c\u2500\u2500 SKILL.md                          # Required \u2014 frontmatter + instructions\r\n\u251c\u2500\u2500 scripts\/\r\n\u2502   \u2514\u2500\u2500 validate.py                   # Executable code agents can run\r\n\u251c\u2500\u2500 references\/\r\n\u2502   \u2514\u2500\u2500 POLICY_FAQ.md                 # Reference documents loaded on demand\r\n\u2514\u2500\u2500 assets\/\r\n    \u2514\u2500\u2500 expense-report-template.md    # Templates and static resources<\/code><\/pre>\n<p>The <code>SKILL.md<\/code> file contains YAML frontmatter with metadata followed by the skill&#8217;s instructions in markdown. Only <code>name<\/code> and <code>description<\/code> are required; fields like <code>license<\/code>, <code>compatibility<\/code>, and <code>metadata<\/code> are optional:<\/p>\n<pre class=\"wp-block-code\"><code class=\"language-yaml\">---\r\nname: expense-report\r\ndescription: &gt;-\r\n  File and validate employee expense reports according to company policy.\r\n  Use when asked about expense submissions, reimbursement rules, or spending limits.\r\nlicense: Apache-2.0                   # Optional\r\ncompatibility: Requires python3       # Optional\r\nmetadata:                             # Optional\r\n  author: contoso-finance\r\n  version: \"2.1\"\r\n---\r\n\r\n## Instructions\r\n\r\n1. Ask the employee for their receipt and expense details...\r\n2. Validate against the policy in references\/POLICY_FAQ.md...<\/code><\/pre>\n<p>Skills are useful when you want to:<\/p>\n<ul>\n<li><strong>Package domain expertise<\/strong> \u2014 Capture specialized knowledge (expense policies, legal workflows, data analysis pipelines) as reusable packages.<\/li>\n<li><strong>Extend agent capabilities<\/strong> \u2014 Give agents new abilities without modifying their core instructions.<\/li>\n<li><strong>Ensure consistency<\/strong> \u2014 Turn multi-step tasks into repeatable, auditable workflows.<\/li>\n<li><strong>Enable interoperability<\/strong> \u2014 Reuse the same skill across different Agent Skills-compatible products.<\/li>\n<\/ul>\n<h2>Progressive Disclosure: Context-Efficient by Design<\/h2>\n<p>One of the key design principles behind Agent Skills is progressive disclosure. Rather than loading everything into the agent&#8217;s context upfront, skills are disclosed in three stages:<\/p>\n<ol>\n<li><strong>Advertise<\/strong> (~100 tokens per skill) \u2014 Skill names and descriptions are injected into the system prompt so the agent knows what&#8217;s available.<\/li>\n<li><strong>Load<\/strong> (&lt; 5,000 tokens recommended) \u2014 When a task matches a skill, the agent calls <code>load_skill<\/code> to retrieve the full <code>SKILL.md<\/code> instructions.<\/li>\n<li><strong>Read resources<\/strong> (as needed) \u2014 The agent calls <code>read_skill_resource<\/code> to fetch supplementary files (references, templates, assets) only when required.<\/li>\n<\/ol>\n<p>This pattern keeps the agent&#8217;s context window lean while still giving it access to deep domain knowledge on demand \u2014 important when you&#8217;re working with agents that handle many different domains or when you want to keep token usage under control.<\/p>\n<h2>Creating a Skill<\/h2>\n<p>The simplest skill is just a folder with a <code>SKILL.md<\/code> file. Create a <code>skills<\/code> directory and add a skill folder inside it:<\/p>\n<pre class=\"wp-block-code\"><code>skills\/\r\n\u2514\u2500\u2500 meeting-notes\/\r\n    \u2514\u2500\u2500 SKILL.md<\/code><\/pre>\n<p>The <code>SKILL.md<\/code> file starts with YAML frontmatter (<code>name<\/code> and <code>description<\/code> are required) followed by instructions in markdown:<\/p>\n<pre class=\"wp-block-code\"><code class=\"language-yaml\">---\r\nname: meeting-notes\r\ndescription: &gt;-\r\n  Summarize meeting transcripts into structured notes with action items.\r\n  Use when asked to process or summarize meeting recordings or transcripts.\r\n---\r\n\r\n## Instructions\r\n\r\n1. Extract key discussion points from the transcript.\r\n2. List any decisions that were made.\r\n3. Create a list of action items with owners and due dates.\r\n4. Keep the summary concise \u2014 aim for one page or less.<\/code><\/pre>\n<p>The <code>description<\/code> field is especially important \u2014 the agent uses it to decide when to load the skill, so include both what the skill does and when it should be used.<\/p>\n<p>That&#8217;s it. No scripts, no extra files \u2014 just a folder and a <code>SKILL.md<\/code>. You can always add <code>references\/<\/code>, <code>scripts\/<\/code>, and <code>assets\/<\/code> directories later as your skill grows. You can also use the <a href=\"https:\/\/github.com\/anthropics\/skills\/tree\/main\/skills\/skill-creator\">skill-creator<\/a> skill to help you generate new skills interactively.<\/p>\n<h2>Connecting Skills to an Agent<\/h2>\n<p>The Agent Framework includes a skills provider that discovers skills from filesystem directories and makes them available to your agent as a context provider. It searches configured paths recursively (up to two levels deep) for <code>SKILL.md<\/code> files, validates their format and resources, and injects skill names and descriptions into the system prompt so the agent knows what&#8217;s available. It also exposes two tools to the agent:<\/p>\n<ul>\n<li><code>load_skill<\/code> \u2014 Retrieves the full <code>SKILL.md<\/code> instructions when the agent determines a user&#8217;s request matches a skill&#8217;s domain, giving it detailed step-by-step guidance to address the task.<\/li>\n<li><code>read_skill_resource<\/code> \u2014 Fetches supplementary files (references, templates, assets) bundled with a skill, allowing the agent to pull in additional context only when needed.<\/li>\n<\/ul>\n<h2>Using Skills in .NET<\/h2>\n<p>Install the package:<\/p>\n<pre class=\"wp-block-code\"><code class=\"language-bash\">dotnet add package Microsoft.Agents.AI --prerelease\r\ndotnet add package Microsoft.Agents.AI.OpenAI --prerelease\r\ndotnet add package Azure.AI.OpenAI --prerelease\r\ndotnet add package Azure.Identity<\/code><\/pre>\n<p>Set up the provider and create an agent:<\/p>\n<pre class=\"wp-block-code\"><code class=\"language-csharp\">using Azure.AI.OpenAI;\r\nusing Azure.Identity;\r\nusing Microsoft.Agents.AI;\r\nusing OpenAI.Responses;\r\n\r\n\/\/ Discover skills from the 'skills' directory\r\nvar skillsProvider = new AgentSkillsProvider(\r\n    Path.Combine(AppContext.BaseDirectory, \"skills\"));\r\n\r\n\/\/ Create an agent with the skills provider\r\nAIAgent agent = new AzureOpenAIClient(\r\n    new Uri(endpoint), new DefaultAzureCredential())\r\n    .GetResponsesClient()\r\n    .AsAIAgent(new ChatClientAgentOptions\r\n    {\r\n        Name = \"SkillsAgent\",\r\n        ChatOptions = new()\r\n        {\r\n            Instructions = \"You are a helpful assistant.\",\r\n        },\r\n        AIContextProviders = [skillsProvider],\r\n    },\r\n    model: deploymentName);\r\n\r\n\/\/ The agent discovers and loads matching skills automatically\r\nAgentResponse response = await agent.RunAsync(\r\n    \"Summarize the key points and action items from today's standup meeting.\");\r\nConsole.WriteLine(response.Text);<\/code><\/pre>\n<h2>Using Skills in Python<\/h2>\n<p>Install the package:<\/p>\n<pre class=\"wp-block-code\"><code class=\"language-bash\">pip install agent-framework --pre<\/code><\/pre>\n<p>Set up the provider and create an agent:<\/p>\n<pre class=\"wp-block-code\"><code class=\"language-python\">from pathlib import Path\r\nfrom agent_framework import SkillsProvider\r\nfrom agent_framework.azure import AzureOpenAIChatClient\r\nfrom azure.identity.aio import AzureCliCredential\r\n\r\n# Discover skills from the 'skills' directory\r\nskills_provider = SkillsProvider(\r\n    skill_paths=Path(__file__).parent \/ \"skills\"\r\n)\r\n\r\n# Create an agent with the skills provider\r\nagent = AzureOpenAIChatClient(credential=AzureCliCredential()).as_agent(\r\n    name=\"SkillsAgent\",\r\n    instructions=\"You are a helpful assistant.\",\r\n    context_providers=[skills_provider],\r\n)\r\n\r\n# The agent discovers and loads matching skills automatically\r\nresponse = await agent.run(\r\n    \"Summarize the key points and action items from today's standup meeting.\"\r\n)\r\nprint(response.text)<\/code><\/pre>\n<p>Once configured, the agent automatically discovers available skills and uses them when a user&#8217;s task matches a skill&#8217;s domain. You don&#8217;t need to write any routing logic \u2014 the agent reads the skill descriptions from the system prompt and decides when to load one.<\/p>\n<h2>Use Cases<\/h2>\n<p>Here are a few scenarios where Agent Skills can help:<\/p>\n<h3>Enterprise Policy Compliance<\/h3>\n<p>Package your company&#8217;s HR policies, expense rules, or IT security guidelines as skills. An employee-facing agent can load the relevant policy skill when someone asks &#8220;Can I expense a co-working space?&#8221; and give an accurate, policy-grounded answer \u2014 without needing all policies in context at all times.<\/p>\n<h3>Customer Support Playbooks<\/h3>\n<p>Turn your support team&#8217;s troubleshooting guides into skills. When a customer reports an issue, the agent loads the matching playbook and follows the documented steps, ensuring consistent resolution regardless of which agent instance handles the request.<\/p>\n<h3>Multi-Team Skill Libraries<\/h3>\n<p>Different teams can author and maintain their own skills independently. Point the skills provider at multiple directories to combine them:<\/p>\n<p><strong>.NET<\/strong><\/p>\n<pre class=\"wp-block-code\"><code class=\"language-csharp\">var skillsProvider = new AgentSkillsProvider([\r\n    Path.Combine(AppContext.BaseDirectory, \"company-skills\"),\r\n    Path.Combine(AppContext.BaseDirectory, \"team-skills\"),\r\n]);<\/code><\/pre>\n<p><strong>Python<\/strong><\/p>\n<pre class=\"wp-block-code\"><code class=\"language-python\">skills_provider = SkillsProvider(\r\n    skill_paths=[\r\n        Path(__file__).parent \/ \"company-skills\",\r\n        Path(__file__).parent \/ \"team-skills\",\r\n    ]\r\n)<\/code><\/pre>\n<p>Each path can point to an individual skill folder or a parent folder containing multiple skill subdirectories.<\/p>\n<h2>Security<\/h2>\n<p>Treat skills like open-source dependencies \u2014 only use ones from sources you trust, and review them before adding them to your agent. Skill instructions are injected into the agent&#8217;s context and can influence its behavior, so the same diligence you&#8217;d apply to a new package applies here.<\/p>\n<h2>What&#8217;s Next<\/h2>\n<p>We&#8217;re continuing to build out Agent Skills support in the framework. Here&#8217;s what&#8217;s coming:<\/p>\n<ul>\n<li><strong>Programmatic skills<\/strong> \u2014 Create and register agent skills dynamically via API, enabling scenarios where skills are generated or modified at runtime rather than authored as static files.<\/li>\n<li><strong>Agent skill execution<\/strong> \u2014 Support for agents to execute scripts bundled within skills, extending skills beyond instructions and reference material into active code execution.<\/li>\n<\/ul>\n<h2>Learn More<\/h2>\n<p>To learn more and try it out yourself, check out the documentation and working samples:<\/p>\n<ul>\n<li>\ud83d\udcd6 <a href=\"https:\/\/learn.microsoft.com\/en-us\/agent-framework\/agents\/skills\">Agent Skills documentation on Microsoft Learn<\/a><\/li>\n<li>\ud83d\udcbb <a href=\"https:\/\/github.com\/microsoft\/agent-framework\/tree\/main\/dotnet\/samples\/02-agents\/AgentSkills\">.NET sample<\/a><\/li>\n<li>\ud83d\udc0d <a href=\"https:\/\/github.com\/microsoft\/agent-framework\/tree\/main\/python\/samples\/02-agents\/skills\/basic_skill\">Python sample<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>You can now equip your Microsoft Agent Framework agents with portable, reusable skill packages that provide domain expertise on demand \u2014 without changing a single line of your agent&#8217;s core instructions. With built-in skills providers for both .NET and Python, your agents can discover and load Agent Skills at runtime, pulling in only the context [&hellip;]<\/p>\n","protected":false},"author":157200,"featured_media":5169,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[78,143,145,47,34],"tags":[79,146,49,147,53],"class_list":["post-5159","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-agent-framework","category-agent-skills","category-announcement","category-python-2","tag-net","tag-agent-skills","tag-ai-agents","tag-microsoft-agent-framework","tag-python"],"acf":[],"blog_post_summary":"<p>You can now equip your Microsoft Agent Framework agents with portable, reusable skill packages that provide domain expertise on demand \u2014 without changing a single line of your agent&#8217;s core instructions. With built-in skills providers for both .NET and Python, your agents can discover and load Agent Skills at runtime, pulling in only the context [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts\/5159","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/users\/157200"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/comments?post=5159"}],"version-history":[{"count":2,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts\/5159\/revisions"}],"predecessor-version":[{"id":5288,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts\/5159\/revisions\/5288"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/media\/5169"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/media?parent=5159"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/categories?post=5159"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/tags?post=5159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}