{"id":5579,"date":"2026-07-09T06:23:11","date_gmt":"2026-07-09T13:23:11","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/agent-framework\/?p=5579"},"modified":"2026-07-09T07:11:50","modified_gmt":"2026-07-09T14:11:50","slug":"agent-harness-scaling-the-claw-or-harness-capabilities","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/agent-framework\/agent-harness-scaling-the-claw-or-harness-capabilities\/","title":{"rendered":"Agent Harness: Scaling the claw or harness capabilities"},"content":{"rendered":"<p><em>Part 3 of <a href=\"https:\/\/devblogs.microsoft.com\/agent-framework\/build-your-own-claw-and-agent-harness-with-microsoft-agent-framework\/\">Build your own claw and harness with Microsoft Agent Framework<\/a>.<\/em><\/p>\n<p>In <a href=\"https:\/\/devblogs.microsoft.com\/agent-framework\/agent-harness-working-with-your-data-safely\/\">Part 2<\/a> our personal finance assistant learned to work with <em>your<\/em> data safely: it reads your portfolio, asks before it trades, and remembers what matters across sessions. It&#8217;s useful &#8211; but everything it knows is baked into one prompt, it does its work one step at a time, and it can&#8217;t reach past the file-access tools to actually <em>reorganize<\/em> anything.<\/p>\n<p>This part makes the claw <em>more capable<\/em> along four axes:<\/p>\n<ol>\n<li><strong>Skills<\/strong> &#8211; package know-how (valuation, risk-scoring) as discoverable files the agent loads on demand, including centrally-managed <strong>Foundry skills<\/strong>.<\/li>\n<li><strong>Shell<\/strong> &#8211; shell tools, to tidy and restructure files.<\/li>\n<li><strong>CodeAct<\/strong> &#8211; let the agent write and run code to compute answers it can&#8217;t just look up.<\/li>\n<li><strong>Background agents<\/strong> &#8211; fan work out to sub-agents that run <em>concurrently<\/em>, then aggregate.<\/li>\n<\/ol>\n<p>As before, we only supply <em>what makes our agent ours<\/em>; the harness provides the machinery. Let&#8217;s take them in turn.<\/p>\n<h2 id=\"teach-it-on-demand-skills\">Teach it on demand: skills<\/h2>\n<p>Stuffing every instruction the assistant might ever need into its system prompt doesn&#8217;t scale &#8211; it bloats the context and dilutes its focus. <strong>Skills<\/strong> solve this: each skill is a small <code>SKILL.md<\/code> file with a name, a one-line description, and instructions (plus optional reference docs and scripts). The agent sees only the <em>names and descriptions<\/em> up front, and <strong>progressively loads<\/strong> a skill&#8217;s full content only when a request matches it.<\/p>\n<p>Our claw gets two file-based skills under the <code>skills\/<\/code> folder. The skills instruct the agent in how to do risk scoring and valuations.<\/p>\n<blockquote><p>For more information on skills see <a href=\"https:\/\/devblogs.microsoft.com\/agent-framework\/give-your-agents-domain-expertise-with-agent-skills-in-microsoft-agent-framework\/\">Give Your Agents Domain Expertise with Agent Skills in Microsoft Agent Framework<\/a> and <a href=\"https:\/\/devblogs.microsoft.com\/agent-framework\/whats-new-in-agent-skills-code-skills-script-execution-and-approval-for-python\/\">What\u2019s New in Agent Skills: Code Skills, Script Execution, and Approval for Python<\/a><\/p><\/blockquote>\n<h2 id=\"usage\">Usage<\/h2>\n<p>The harness turns a skills provider <strong>on by default<\/strong> (it discovers <code>SKILL.md<\/code> files from the working directory). Here we build our <em>own<\/em> provider so we can point it at this sample&#8217;s <code>skills\/<\/code> folder and run the skills&#8217; scripts.<\/p>\n<p>In <strong>.NET<\/strong>, compose a provider with <code>AgentSkillsProviderBuilder<\/code> and turn the default one off:<\/p>\n<pre><code class=\"language-csharp\">var skillsProvider = new AgentSkillsProviderBuilder()\r\n    \/\/ File-based skills; SubprocessScriptRunner runs their Python scripts.\r\n    .UseFileSkills([skillsDir], scriptRunner: SubprocessScriptRunner.RunAsync)\r\n    .Build();\r\n\r\nAIAgent agent = chatClient.AsHarnessAgent(new HarnessAgentOptions\r\n{\r\n    DisableAgentSkillsProvider = true,         \/\/ we supply our own\r\n    AIContextProviders = [skillsProvider],\r\n    \/\/ \u2026 file access, tools \u2026\r\n});<\/code><\/pre>\n<p>In <strong>Python<\/strong>, build a <code>SkillsProvider<\/code> from the same folder and pass it in:<\/p>\n<pre><code class=\"language-python\">from agent_framework import SkillsProvider\r\n\r\nskills_provider = SkillsProvider.from_paths(\r\n    skill_paths=[str(skills_dir)],\r\n    script_runner=subprocess_script_runner,  # lets the skills' scripts run\r\n)\r\n\r\nagent = create_harness_agent(\r\n    client=client,\r\n    skills_provider=skills_provider,\r\n    # \u2026 file access, tools \u2026\r\n)<\/code><\/pre>\n<p>Now <em>&#8220;Value MSFT for me&#8221;<\/em> makes the agent load the <code>valuation<\/code> skill, read its guide, run its script, and report a fair-value estimate &#8211; and <em>&#8220;How risky is my portfolio?&#8221;<\/em> pulls in <code>risk-scoring<\/code> instead. Nothing about valuation or risk was in the system prompt.<\/p>\n<h3 id=\"skills-you-manage-centrally-foundry-skills\">Skills you manage centrally: Foundry skills<\/h3>\n<p>File-based skills ship <em>with<\/em> the agent &#8211; to change one, you redeploy. <strong>Foundry skills<\/strong> flip that around: skills are published and updated centrally in your Foundry project, and the agent picks them up at runtime. The valuation method can evolve without anyone touching the claw.<\/p>\n<p>Because it needs a Foundry endpoint, we make it <strong>opt-in<\/strong> &#8211; the sample runs fine on the local skills alone.<\/p>\n<blockquote><p>For how to publish and manage Foundry skills, see the <a href=\"https:\/\/learn.microsoft.com\/azure\/foundry\/agents\/how-to\/tools\/skills?pivots=dotnet\">Foundry skills docs<\/a>.<\/p><\/blockquote>\n<p>In <strong>.NET<\/strong>, Foundry skills are discovered live from a Foundry <strong>Toolbox MCP<\/strong> endpoint; just add an MCP source to the same builder:<\/p>\n<pre><code class=\"language-csharp\">\/\/ Opt-in: only when a Toolbox endpoint is configured.\r\nif (!string.IsNullOrWhiteSpace(toolboxUrl))\r\n{\r\n    var (mcpClient, _) = await FoundrySkills.ConnectAsync(toolboxUrl, credential);\r\n    skillsBuilder.UseMcpSkills(mcpClient);   \/\/ fold them into the same provider\r\n}<\/code><\/pre>\n<p>In <strong>Python<\/strong>, it&#8217;s the same story: connect to the Foundry <strong>Toolbox MCP<\/strong> endpoint and add an <code>MCPSkillsSource<\/code> alongside the local <code>FileSkillsSource<\/code>:<\/p>\n<pre><code class=\"language-python\">from agent_framework import (\r\n    AggregatingSkillsSource, DeduplicatingSkillsSource,\r\n    FileSkillsSource, MCPSkillsSource, SkillsProvider,\r\n)\r\n\r\nsources = [FileSkillsSource(str(skills_dir), script_runner=subprocess_script_runner)]\r\n\r\n# Opt-in: only when a Toolbox endpoint is configured.\r\nif toolbox_url:\r\n    session = await _connect_foundry_toolbox(stack, toolbox_url)\r\n    sources.append(MCPSkillsSource(client=session))\r\n\r\nsource = sources[0] if len(sources) == 1 else AggregatingSkillsSource(sources)\r\nskills_provider = SkillsProvider(DeduplicatingSkillsSource(source))<\/code><\/pre>\n<p>Either way the agent sees one unified set of skills; it neither knows nor cares which ones came from disk and which were managed in Foundry.<\/p>\n<p>Skills aren&#8217;t only for domain <em>how-tos<\/em> &#8211; a skill can just as easily carry <strong>general rules<\/strong> about how the agent should behave. Because Foundry skills update centrally, governance rules like this are exactly the kind of thing you&#8217;d manage there: tighten the policy once and every running claw picks it up, no redeploy. To try it, publish a skill named <code>financial-agent-rules<\/code> to your Foundry toolbox:<\/p>\n<pre><code class=\"language-text\">---\r\nname: financial-agent-rules\r\ndescription: General rules about how you should behave as a financial agent. Use this skill for all requests.\r\n---\r\n\r\nYou should politely refuse to answer any questions unrelated to finance, managing portfolios or managing confirmations.<\/code><\/pre>\n<p>Because its description says <em>&#8220;Use this skill for all requests&#8221;<\/em>, the agent loads it on every turn. Once it&#8217;s published and Foundry skills are enabled (set <code>FOUNDRY_TOOLBOX_MCP_SERVER_URL<\/code>), ask the claw something off-topic like <em>&#8220;What&#8217;s the capital of France?&#8221;<\/em> and it will politely decline and steer you back to finance.<\/p>\n<h2 id=\"reach-into-the-file-system-shell\">Reach into the file system: shell<\/h2>\n<p>File access lets the claw read and write individual files, but <em>reorganizing<\/em> a messy folder &#8211; moving, renaming, batching &#8211; is exactly what a shell is for. The user&#8217;s trade confirmations pile up as a flat heap of inconsistently-named files:<\/p>\n<pre><code class=\"language-text\">working\/confirmations\/\r\n  trade confirmation 1.txt\r\n  conf_AAPL.txt\r\n  copy of trade 3.txt\r\n  SPY sell.txt\r\n  \u2026<\/code><\/pre>\n<p>The harness can expose a <strong>shell<\/strong> as an (approval-gated) <code>run_shell<\/code> tool. Letting an agent run shell commands is powerful and <em>dangerous<\/em>, so we hem it in two ways: a <strong>confined working directory<\/strong> (every command is re-anchored to the confirmations vault and can&#8217;t escape it) and a <strong>deny-list policy<\/strong> that pre-filters obviously destructive commands.<\/p>\n<p>In <strong>.NET<\/strong>, configure a <code>LocalShellExecutor<\/code> and pass it as the <code>ShellExecutor<\/code>:<\/p>\n<pre><code class=\"language-csharp\">await using var shell = new LocalShellExecutor(new LocalShellExecutorOptions\r\n{\r\n    WorkingDirectory = vaultDir,\r\n    ConfineWorkingDirectory = true,                 \/\/ can't escape the vault\r\n    Policy = new ShellPolicy(denyList:\r\n    [\r\n        @\"\\brm\\s+-rf\\b\", @\"\\bsudo\\b\", @\":\\(\\)\\s*\\{\", @\"\\bmkfs\\b\", @\"&gt;\\s*\/dev\/sd\",\r\n    ]),\r\n    Timeout = TimeSpan.FromSeconds(15),\r\n});\r\n\r\nAIAgent agent = chatClient.AsHarnessAgent(new HarnessAgentOptions\r\n{\r\n    ShellExecutor = shell,   \/\/ exposed as the approval-gated run_shell tool\r\n    \/\/ \u2026 skills, file access, tools \u2026\r\n});<\/code><\/pre>\n<p>In <strong>Python<\/strong>, a <code>LocalShellTool<\/code> plays the same role:<\/p>\n<pre><code class=\"language-python\">from agent_framework_tools.shell import LocalShellTool, ShellPolicy\r\n\r\nshell = LocalShellTool(\r\n    workdir=str(vault_dir),\r\n    confine_workdir=True,                            # can't escape the vault\r\n    policy=ShellPolicy(denylist=[\r\n        r\"\\brm\\s+-rf\\b\", r\"\\bsudo\\b\", r\":\\(\\)\\s*\\{\", r\"\\bmkfs\\b\", r\"&gt;\\s*\/dev\/sd\",\r\n    ]),\r\n    timeout=15,\r\n)\r\n\r\nagent = create_harness_agent(\r\n    client=client,\r\n    shell_executor=shell,   # exposed as the approval-gated run_shell tool\r\n    # \u2026 skills, file access, tools \u2026\r\n)<\/code><\/pre>\n<blockquote><p><strong>The policy is a UX guardrail, not a security boundary.<\/strong> A deny-list catches <em>obvious<\/em> mistakes, but it won&#8217;t stop a determined or cleverly-worded command. Real isolation comes from the confined working directory and the approval prompt &#8211; and for untrusted input, a sandboxed executor like <code>DockerShellExecutor<\/code> (.NET) or <code>DockerShellTool<\/code> (Python).<\/p><\/blockquote>\n<p>Now <em>&#8220;Tidy up my trade confirmations&#8221;<\/em> lets the agent inspect the folder, propose a plan, and (with your approval on each command) move the files into a <code>year\/month<\/code> layout renamed to <code>YYYY-MM-DD_TICKER_BUY|SELL.txt<\/code>.<\/p>\n<h2 id=\"let-it-compute-codeact\">Let it compute: CodeAct<\/h2>\n<p>Some questions aren&#8217;t a lookup &#8211; they&#8217;re a <em>calculation<\/em>. &#8220;What&#8217;s my portfolio worth?&#8221; or &#8220;what was my return on this position?&#8221; are better answered by <em>running a little code<\/em> than by asking the model to do arithmetic in its head. <strong>CodeAct<\/strong> gives the agent a sandboxed interpreter it can write and run code in.<\/p>\n<p>CodeAct runs model-authored code in a sandbox, and we wire it in as a context provider in both languages.<\/p>\n<p>In <strong>.NET<\/strong>, CodeAct uses <strong>Hyperlight<\/strong> (a micro-VM, so it needs hardware virtualization). The guest module path is resolved automatically from the <code>Hyperlight.HyperlightSandbox.Guest.Python<\/code> NuGet package:<\/p>\n<pre><code class=\"language-csharp\">using HyperlightSandbox.Guest.Python;\r\nusing Microsoft.Agents.AI.Hyperlight;\r\n\r\nvar codeAct = new HyperlightCodeActProvider(\r\n    HyperlightCodeActProviderOptions.CreateForWasm(PythonGuestModule.GetModulePath()));\r\n\r\nAIAgent agent = chatClient.AsHarnessAgent(new HarnessAgentOptions\r\n{\r\n    AIContextProviders = [skillsProvider, codeAct],\r\n    \/\/ \u2026 shell, file access, tools \u2026\r\n});<\/code><\/pre>\n<p>In <strong>Python<\/strong>, <strong>Monty<\/strong> is a pure, cross-platform interpreter &#8211; no hypervisor required &#8211; added as a context provider:<\/p>\n<pre><code class=\"language-python\">from agent_framework_monty import MontyCodeActProvider\r\n\r\ncontext_providers = [skills_provider, MontyCodeActProvider(approval_mode=\"never_require\")]\r\n\r\nagent = create_harness_agent(\r\n    client=client,\r\n    context_providers=context_providers,\r\n    # \u2026 shell, file access, tools \u2026\r\n)<\/code><\/pre>\n<p>With CodeAct on, <em>&#8220;Work out the total value of my portfolio&#8221;<\/em> lets the agent read the holdings, write a few lines of Python to multiply shares by price and sum them, run it, and report the result &#8211; arithmetic it can <em>show its working<\/em> for, rather than guess.<\/p>\n<blockquote><p>For more ideas on how to use CodeAct, read <a href=\"https:\/\/devblogs.microsoft.com\/agent-framework\/codeact-with-hyperlight\/\">CodeAct in Agent Framework: Faster Agents with Fewer Model Turns<\/a><\/p><\/blockquote>\n<h2 id=\"do-many-things-at-once-background-agents\">Do many things at once: background agents<\/h2>\n<p>Asking <em>&#8220;Research MSFT, NVDA and SPY&#8221;<\/em> one ticker at a time is slow, and folding all that web searching into the main agent muddies its context. The harness supports <strong>background agents<\/strong>: sub-agents you hand to the claw so it can <strong>delegate<\/strong> units of work that run <em>concurrently<\/em> and report back.<\/p>\n<p>We build a lean, web-search-only research agent &#8211; a plain chat-client agent with just the web search tool (no harness machinery needed):<\/p>\n<pre><code class=\"language-csharp\">\/\/ ResearchAgent.Create(...)\r\nAIAgent research = chatClient.AsAIAgent(\r\n    name: \"TickerResearchAgent\",\r\n    description: \"Searches the web for recent news about a single stock ticker.\",\r\n    instructions: \"You research a single ticker and return 3-4 factual bullet points.\",\r\n    tools: [new HostedWebSearchTool()]);   \/\/ the only tool it needs<\/code><\/pre>\n<p>Then we hand it to the main claw via <code>BackgroundAgents<\/code>:<\/p>\n<pre><code class=\"language-csharp\">AIAgent agent = chatClient.AsHarnessAgent(new HarnessAgentOptions\r\n{\r\n    BackgroundAgents = [research],   \/\/ exposes the background_agents_* tools\r\n    \/\/ \u2026 skills, shell, file access, tools \u2026\r\n});<\/code><\/pre>\n<p>In <strong>Python<\/strong> it&#8217;s the <code>background_agents<\/code> argument:<\/p>\n<pre><code class=\"language-python\">research_agent = Agent(\r\n    client,\r\n    name=\"TickerResearchAgent\",\r\n    description=\"Searches the web for recent news about a single stock ticker.\",\r\n    instructions=\"You research a single ticker and return 3-4 factual bullet points.\",\r\n    tools=[client.get_web_search_tool()],   # the only tool it needs\r\n)\r\n\r\nagent = create_harness_agent(\r\n    client=client,\r\n    background_agents=[research_agent],   # exposes the background_agents_* tools\r\n    # \u2026 skills, shell, file access, tools \u2026\r\n)<\/code><\/pre>\n<p>This gives the main agent a set of <code>background_agents_*<\/code> tools: it can <strong>start<\/strong> a research task per ticker, let them run in parallel, <strong>check<\/strong> on them, and <strong>collect<\/strong> the results &#8211; then summarize all three together. The fan-out is the agent&#8217;s decision; the harness handles the plumbing.<\/p>\n<h2 id=\"run-it\">Run it<\/h2>\n<p><strong>.NET<\/strong><\/p>\n<pre><code class=\"language-bash\">cd dotnet\r\ndotnet run --project samples\/02-agents\/Harness\/BuildYourOwnClaw\/Claw_Step03_ScalingCapabilities<\/code><\/pre>\n<p><strong>Python<\/strong><\/p>\n<pre><code class=\"language-bash\">uv run python\/samples\/02-agents\/harness\/build_your_own_claw\/claw_step03_scaling_capabilities.py<\/code><\/pre>\n<p>Then try these in order (the sample starts in <strong>execute<\/strong> mode &#8211; quick lookups don&#8217;t need a plan):<\/p>\n<ol>\n<li><code>Value MSFT for me.<\/code> &#8211; the agent loads the <code>valuation<\/code> skill, runs its script, and reports a<\/li>\n<\/ol>\n<p>fair-value estimate.<\/p>\n<ol>\n<li><code>How risky is my portfolio?<\/code> &#8211; it reads <code>portfolio.csv<\/code> and loads the <code>risk-scoring<\/code> skill.<\/li>\n<li><code>\/mode plan<\/code>, then <code>Tidy up my trade confirmations.<\/code> &#8211; switching to plan mode first makes the agent inspect <code>working\/confirmations\/<\/code> and propose a reorganization plan before touching anything; once you approve it switches to execute and uses the shell to move and rename the files, <strong>prompting you to approve<\/strong> each command.<\/li>\n<\/ol>\n<ol>\n<li><code>Work out the total value of my portfolio.<\/code> &#8211; it writes and runs Python to compute the answer.<\/li>\n<\/ol>\n<ol>\n<li><code>Research MSFT, NVDA and SPY and summarize the latest news.<\/code> &#8211; it fans the tickers out to the background research agent and aggregates the findings.<\/li>\n<\/ol>\n<ol>\n<li><code>What's the capital of France?<\/code> &#8211; with the <code>financial-agent-rules<\/code> Foundry skill published and enabled (see below), the agent loads it, recognizes the question is off-topic, and politely declines, steering you back to finance.<\/li>\n<\/ol>\n<p>To enable the opt-in Foundry skills: set <code>FOUNDRY_TOOLBOX_MCP_SERVER_URL<\/code>.<\/p>\n<h2 id=\"the-runnable-samples\">The runnable samples<\/h2>\n<ul>\n<li><strong>.NET:<\/strong> <a href=\"https:\/\/github.com\/microsoft\/agent-framework\/tree\/main\/dotnet\/samples\/02-agents\/Harness\/BuildYourOwnClaw\/Claw_Step03_ScalingCapabilities\"><code>dotnet\/samples\/02-agents\/Harness\/BuildYourOwnClaw\/Claw_Step03_ScalingCapabilities<\/code><\/a><\/li>\n<li><strong>Python:<\/strong> <a href=\"https:\/\/github.com\/microsoft\/agent-framework\/blob\/main\/python\/samples\/02-agents\/harness\/build_your_own_claw\/claw_step03_scaling_capabilities.py\"><code>python\/samples\/02-agents\/harness\/build_your_own_claw<\/code><\/a><\/li>\n<\/ul>\n<h2 id=\"use-these-building-blocks-in-your-own-agent\">Use these building blocks in your own agent<\/h2>\n<p>As always, none of this is locked inside the harness. Each capability is a plain <strong>context provider<\/strong> or an <strong>executor\/tool<\/strong> you can pick up on its own. Here&#8217;s where to find them:<\/p>\n<table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>.NET (type \u2014 namespace)<\/th>\n<th>Python (import)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Skills<\/strong><\/td>\n<td><code>AgentSkillsProvider<\/code> \/ <code>AgentSkillsProviderBuilder<\/code> \u2014 <code>Microsoft.Agents.AI<\/code> (MCP skills via <code>Microsoft.Agents.AI.Mcp<\/code>)<\/td>\n<td><code>from agent_framework import SkillsProvider, MCPSkillsSource<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Shell<\/strong><\/td>\n<td><code>LocalShellExecutor<\/code> \/ <code>ShellPolicy<\/code> \u2014 <code>Microsoft.Agents.AI.Tools.Shell<\/code><\/td>\n<td><code>from agent_framework_tools.shell import LocalShellTool, ShellPolicy<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>CodeAct<\/strong><\/td>\n<td><code>HyperlightCodeActProvider<\/code> \u2014 <code>Microsoft.Agents.AI.Hyperlight<\/code><\/td>\n<td><code>from agent_framework_monty import MontyCodeActProvider<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Background agents<\/strong><\/td>\n<td><code>BackgroundAgentsProvider<\/code> \u2014 <code>Microsoft.Agents.AI<\/code><\/td>\n<td><code>from agent_framework import BackgroundAgentsProvider<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>In <strong>.NET<\/strong>, skills and background agents ship in the <code>Microsoft.Agents.AI<\/code> package, the shell in <code>Microsoft.Agents.AI.Tools.Shell<\/code>, and Hyperlight CodeAct in <code>Microsoft.Agents.AI.Hyperlight<\/code>. In <strong>Python<\/strong>, skills and background agents come from <code>agent-framework<\/code>, the shell from <code>agent-framework-tools<\/code>, and Monty CodeAct from <code>agent-framework-monty<\/code>. The providers plug in through an agent&#8217;s context providers (and the shell as an executor) &#8211; the same wiring the harness does on your behalf.<\/p>\n<h2 id=\"whats-next\">What&#8217;s next<\/h2>\n<p>Our claw can now teach itself new skills, restructure files, compute answers it writes itself, and work in parallel. In the final part we make it <strong>production-ready<\/strong>: observability with traces and logs, governance and data protection, evaluation, and deployment as a hosted Foundry agent.<\/p>\n<h2 id=\"the-series\">\ud83d\udcda The series<\/h2>\n<p>Part of <strong>Build your own claw with Microsoft Agent Framework<\/strong>:<\/p>\n<ul>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/agent-framework\/build-your-own-claw-and-agent-harness-with-microsoft-agent-framework\">Overview: Build your own claw and agent harness with Microsoft Agent Framework<\/a><\/li>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/agent-framework\/meet-your-agent-harness-and-claw\/\">Part 1 &#8211; Meet your agent harness and claw<\/a><\/li>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/agent-framework\/agent-harness-working-with-your-data-safely\/\">Part 2 &#8211; Working with your data, safely<\/a><\/li>\n<li><strong>Part 3 &#8211; Scaling the harness capabilities<\/strong> <em>(you are here)<\/em><\/li>\n<li>Part 4 &#8211; Production-ready <em>(coming soon)<\/em><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Part 3 of Build your own claw and harness with Microsoft Agent Framework. In Part 2 our personal finance assistant learned to work with your data safely: it reads your portfolio, asks before it trades, and remembers what matters across sessions. It&#8217;s useful &#8211; but everything it knows is baked into one prompt, it does [&hellip;]<\/p>\n","protected":false},"author":162052,"featured_media":5602,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[143],"tags":[],"class_list":["post-5579","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-agent-framework"],"acf":[],"blog_post_summary":"<p>Part 3 of Build your own claw and harness with Microsoft Agent Framework. In Part 2 our personal finance assistant learned to work with your data safely: it reads your portfolio, asks before it trades, and remembers what matters across sessions. It&#8217;s useful &#8211; but everything it knows is baked into one prompt, it does [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts\/5579","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\/162052"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/comments?post=5579"}],"version-history":[{"count":2,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts\/5579\/revisions"}],"predecessor-version":[{"id":5639,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts\/5579\/revisions\/5639"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/media\/5602"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/media?parent=5579"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/categories?post=5579"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/tags?post=5579"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}