{"id":497,"date":"2026-10-16T11:55:40","date_gmt":"2026-10-16T09:55:40","guid":{"rendered":"https:\/\/dataguide.tech\/?p=497"},"modified":"2026-11-12T23:17:44","modified_gmt":"2026-11-12T22:17:44","slug":"one-prompt-one-workspace-agentic-microsoft-fabric-admin","status":"publish","type":"post","link":"https:\/\/dataguide.tech\/index.php\/2026\/10\/16\/one-prompt-one-workspace-agentic-microsoft-fabric-admin\/","title":{"rendered":"One Prompt, One Workspace: Agentic Microsoft Fabric Admin"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-style-dg-status is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Status check, verified October 2026.<\/strong> The Fabric Core MCP Server is out of preview: Microsoft listed it as generally available in the September 2026 Fabric update. The tool set is still growing, though. At the time of writing it has no tools for capacity assignment, Git or Spark settings, which is why <code>fab<\/code> and <code>az<\/code> show up below, and the Fabric skills and the Fabric CLI ship updates often. If something here doesn&#8217;t behave the way I describe, check the <a href=\"https:\/\/learn.microsoft.com\/en-us\/rest\/api\/fabric\/articles\/mcp-servers\/what-is-fabric-mcp-server\" target=\"_blank\" rel=\"noopener\">Microsoft Learn docs<\/a> before assuming your setup is broken. I date-stamp every post in this series and update them when things move.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re a Fabric admin, you know this message by heart: &#8220;Hey, can I get a new workspace?&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the person asking, it&#8217;s one workspace. For you, it&#8217;s a workspace, a repository, a capacity assignment, the Git connection, security groups, sometimes a custom Spark pool, and quite often a lakehouse and an environment on top. All the stuff nobody else cares about. They just want it ready by tomorrow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this post I&#8217;ll show how to hand that whole routine over to an LLM, with Claude Code doing the work through the Fabric MCP, the Fabric CLI and the Azure CLI. By the end, the full sequence is a single prompt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One prerequisite: the tool setup from my previous post, <a href=\"https:\/\/dataguide.tech\/index.php\/2026\/08\/12\/agentic-development-in-microsoft-fabric-part-1\/\">Agentic Development in Microsoft Fabric, Part 1: The Setup<\/a>. If you haven&#8217;t configured it yet, go there first. Everything below builds on it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Before you start<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On top of the setup from part one, this post needs a few more things:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Azure CLI (<code>az<\/code>).<\/strong> Used by the second auth option below, by the Fabric skills, which call the Fabric REST API through <code>az rest<\/code>, and for anything outside Fabric itself, like looking up a security group in Entra. Install steps are in the AZ CLI approach section.<\/li>\n\n\n\n<li><strong>Fabric CLI (<code>fab<\/code>).<\/strong> The MCP can&#8217;t assign a capacity or create a Spark pool yet, so the agent falls back to <code>fab<\/code> for those steps. The Git skill uses it under the hood too. It&#8217;s a Python package and needs Python 3.10 or newer:<br><pre><code class=\"language-bash\">pip install ms-fabric-cli<br>fab auth login<\/code><\/pre><p>Confirm it landed with <code>fab --version<\/code>.<\/p><\/li>\n\n\n\n<li><strong>A Git repository<\/strong> in Azure DevOps or GitHub that you can push to. More on that in the repository part.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Then permissions. The agent acts as you, so it can only do what your account can do. Miss one of these and the agent will look broken when it isn&#8217;t:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Creating workspaces<\/strong> needs the <em>Create workspaces<\/em> tenant setting to include you (Admin portal \u2192 Tenant settings \u2192 Workspace settings). Many organisations restrict it to a security group.<\/li>\n\n\n\n<li><strong>Assigning a capacity<\/strong> needs Contributor permissions on that capacity, or capacity admin. Being admin of the workspace isn&#8217;t enough.<\/li>\n\n\n\n<li><strong>Adding groups to a workspace and connecting Git<\/strong> need the Admin role on the workspace. You get that automatically on anything you create yourself.<\/li>\n\n\n\n<li><strong>Registering an Entra app<\/strong> (only for the first auth option below) needs either the <em>Users can register applications<\/em> setting or the Application Developer role. Some tenants also require an Entra admin to grant consent for the permissions you add.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Signing in to the Fabric MCP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First things first: the agent needs to log in to the Fabric MCP. That sounds trivial. It isn&#8217;t, at least not when OAuth is enforced and your LLM isn&#8217;t GitHub Copilot.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">GitHub Copilot<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">With GitHub Copilot in VS Code it&#8217;s painless. The first time the LLM tries to reach the Fabric MCP, it asks you to authorize and opens the browser. Log in to your account and you&#8217;ll see this:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"819\" height=\"187\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261001233845-1-1.png\" alt=\"Pasted image 20261001233845.png\" class=\"wp-image-551\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261001233845-1-1.png 819w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261001233845-1-1-300x68.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261001233845-1-1-768x175.png 768w\" sizes=\"auto, (max-width: 819px) 100vw, 819px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Claude Code and other LLMs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">External LLMs like Anthropic&#8217;s Claude are a different story. Claude asks you to authorize the same way, but the attempt ends with this error:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>SDK auth failed: Incompatible auth server: does not support dynamic client registration\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #91B4D5\">SDK<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">auth<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">failed:<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Incompatible<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">auth<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">server:<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">does<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">not<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">support<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">dynamic<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">client<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">registration<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s what&#8217;s going on. Entra only lets an app sign in on your behalf if it knows that app, and Claude Code isn&#8217;t one of them. There are two ways around it. The first one, and the one Microsoft suggests, is to register your own app in Entra and pass its client ID to the Fabric MCP in Claude Code. The second is to let the Azure CLI hand the MCP a token.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">App approach<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Go to portal.azure.com, navigate to Microsoft Entra ID \u2192 App registrations and click <strong>New registration<\/strong>. Then fill in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Name<\/strong> &#8211; whatever fits your naming conventions<\/li>\n\n\n\n<li><strong>Supported account types<\/strong> &#8211; keep single tenant only<\/li>\n\n\n\n<li><strong>Redirect URI<\/strong> &#8211; select <em>Public client\/native (mobile &amp; desktop)<\/em> and type <code>http:\/\/localhost:8080\/callback<\/code><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1816\" height=\"960\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233034-1-1.png\" alt=\"Pasted image 20261003233034.png\" class=\"wp-image-552\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233034-1-1.png 1816w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233034-1-1-300x159.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233034-1-1-1024x541.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233034-1-1-768x406.png 768w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233034-1-1-1536x812.png 1536w\" sizes=\"auto, (max-width: 1816px) 100vw, 1816px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Click <strong>Register<\/strong>, then open <strong>API permissions<\/strong> from the left sidebar and go Add a permission \u2192 Microsoft APIs \u2192 Power BI Service \u2192 Delegated permissions. Which permissions you pick is up to you. The usual rule applies: least privilege. I added quite a few, but that&#8217;s my demo workspace with nothing sensitive in it:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"2148\" height=\"962\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233724-1-2.png\" alt=\"Pasted image 20261003233724.png\" class=\"wp-image-579\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233724-1-2.png 2148w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233724-1-2-300x134.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233724-1-2-1024x459.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233724-1-2-768x344.png 768w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233724-1-2-1536x688.png 1536w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003233724-1-2-2048x917.png 2048w\" sizes=\"auto, (max-width: 2148px) 100vw, 2148px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If you want a starting point, this is the minimum for what we do in this post (all under Power BI Service \u2192 Delegated permissions):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Workspace.ReadWrite.All<\/code> &#8211; create workspaces, manage role assignments, connect Git<\/li>\n\n\n\n<li><code>Capacity.Read.All<\/code> &#8211; list capacities (the assignment itself goes through <code>fab<\/code>, which has its own login)<\/li>\n\n\n\n<li><code>Connection.Read.All<\/code> &#8211; find the GitHub connection we create later<\/li>\n\n\n\n<li><code>Item.ReadWrite.All<\/code> &#8211; create items such as lakehouses or environments<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Every page of the Fabric REST API reference lists the scope that call needs under <em>Required Delegated Scopes<\/em>. So if the agent gets a 401 or 403 back, that&#8217;s the first place to look. Also check the Status column after adding the permissions: <em>Not granted<\/em> means your tenant requires admin consent, and you&#8217;ll need your Entra admin to click <em>Grant admin consent<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With the permissions in place, the MCP needs to know which app to use for sign-in. Copy the Client ID from the app&#8217;s Overview page:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1256\" height=\"455\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003234520-1-1.png\" alt=\"Pasted image 20261003234520.png\" class=\"wp-image-548\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003234520-1-1.png 1256w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003234520-1-1-300x109.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003234520-1-1-1024x371.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261003234520-1-1-768x278.png 768w\" sizes=\"auto, (max-width: 1256px) 100vw, 1256px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You have three ways to add it. The quickest is a single command in the terminal:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>claude mcp add --transport http --client-id &lt;YOUR-ENTRA-APP-CLIENT-ID> --callback-port 8080 -s user fabric https:\/\/api.fabric.microsoft.com\/v1\/mcp\/core\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #91B4D5\">claude<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">mcp<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">add<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">--transport<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">http<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">--client-id<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #91B4D5\">&lt;<\/span><span style=\"color: #ADD7FF\">YOUR-ENTRA-APP-CLIENT-I<\/span><span style=\"color: #A6ACCD\">D<\/span><span style=\"color: #91B4D5\">&gt;<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">--callback-port<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #5DE4C7\">8080<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">-s<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">user<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">fabric<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">https:\/\/api.fabric.microsoft.com\/v1\/mcp\/core<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">No client secret needed. It&#8217;s a public client app, and the sign-in happens in your browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prefer not to type it yourself? Ask Claude to add it with this prompt:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Add the Microsoft Fabric Core MCP server to my Claude Code configuration at user scope,\nso it's available in every project.\n\n- Server name: fabric\n- Transport: HTTP\n- URL: https:\/\/api.fabric.microsoft.com\/v1\/mcp\/core\n- OAuth client ID: &lt;YOUR-ENTRA-APP-CLIENT-ID>\n- OAuth callback port: 8080\n\nUse `claude mcp add` instead of editing ~\/.claude.json by hand. Don't add a client secret;\nthis is a public client app. Once it's added, run `claude mcp list` and show me the entry.\nThen tell me to run \/mcp and choose Authenticate to finish the Entra ID sign-in.\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #91B4D5\">Add<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">the<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Microsoft<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Fabric<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Core<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">MCP<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">server<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">to<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">my<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Claude<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Code<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">configuration<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">at<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">user<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">scope,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #91B4D5\">so<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">it<\/span><span style=\"color: #A6ACCD\">&#39;<\/span><span style=\"color: #5DE4C7\">s available in every project.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #5DE4C7\">- Server name: fabric<\/span><\/span>\n<span class=\"line\"><span style=\"color: #5DE4C7\">- Transport: HTTP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #5DE4C7\">- URL: https:\/\/api.fabric.microsoft.com\/v1\/mcp\/core<\/span><\/span>\n<span class=\"line\"><span style=\"color: #5DE4C7\">- OAuth client ID: &lt;YOUR-ENTRA-APP-CLIENT-ID&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #5DE4C7\">- OAuth callback port: 8080<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #5DE4C7\">Use `claude mcp add` instead of editing ~\/.claude.json by hand. Don<\/span><span style=\"color: #A6ACCD\">&#39;<\/span><span style=\"color: #ADD7FF\">t<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">add<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">a<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">client<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">secret<\/span><span style=\"color: #A6ACCD\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #91B4D5\">this<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">is<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">a<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">public<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">client<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">app.<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Once<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">it<\/span><span style=\"color: #A6ACCD\">&#39;<\/span><span style=\"color: #5DE4C7\">s added, run `claude mcp list` and show me the entry.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #5DE4C7\">Then tell me to run \/mcp and choose Authenticate to finish the Entra ID sign-in.<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Or open the <code>.claude.json<\/code> file and add the configuration by hand:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">JSON<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\"mcpServers\": {\n  \"fabric\": {\n    \"type\": \"http\",\n    \"url\": \"https:\/\/api.fabric.microsoft.com\/v1\/mcp\/core\",\n    \"oauth\": {\n      \"clientId\": \"&lt;YOUR-ENTRA-APP-CLIENT-ID>\",\n      \"callbackPort\": 8080\n    }\n  }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">mcpServers<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">  <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #E4F0FB\">fabric<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">    <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #ADD7FF\">type<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">http<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">    <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #ADD7FF\">url<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">https:\/\/api.fabric.microsoft.com\/v1\/mcp\/core<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">    <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #ADD7FF\">oauth<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">      <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #91B4D5\">clientId<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">&lt;YOUR-ENTRA-APP-CLIENT-ID&gt;<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">      <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #91B4D5\">callbackPort<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: <\/span><span style=\"color: #5DE4C7\">8080<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Whichever way you go, do it at user level, not folder level. Unless, of course, you only want the MCP available inside one folder.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s also a second Fabric MCP server worth knowing about: <code>https:\/\/api.fabric.microsoft.com\/v1\/mcp\/dataPlane\/sqlEndpoint<\/code>, which lets the agent run queries against lakehouse SQL endpoints and warehouses. We don&#8217;t need it for infrastructure work. If you want it anyway, add it the same way under its own name (I use <code>fabric-sql<\/code>), with the same client ID and callback port.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once it&#8217;s added, type <code>\/mcp<\/code>, pick the fabric MCP from the list and click <strong>Authenticate<\/strong>. A browser window opens and asks you to sign in with your Microsoft account:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1120\" height=\"370\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000215-1-2.png\" alt=\"Pasted image 20261004000215.png\" class=\"wp-image-578\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000215-1-2.png 1120w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000215-1-2-300x99.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000215-1-2-1024x338.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000215-1-2-768x254.png 768w\" sizes=\"auto, (max-width: 1120px) 100vw, 1120px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">and you should get this message:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"938\" height=\"106\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000236-1-1.png\" alt=\"Pasted image 20261004000236.png\" class=\"wp-image-549\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000236-1-1.png 938w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000236-1-1-300x34.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000236-1-1-768x87.png 768w\" sizes=\"auto, (max-width: 938px) 100vw, 938px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A quick test prompt to confirm it works:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1524\" height=\"282\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000410-1-1.png\" alt=\"Pasted image 20261004000410.png\" class=\"wp-image-553\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000410-1-1.png 1524w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000410-1-1-300x56.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000410-1-1-1024x189.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261004000410-1-1-768x142.png 768w\" sizes=\"auto, (max-width: 1524px) 100vw, 1524px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">AZ CLI approach<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The other option is to give Claude the OAuth token. More precisely, you tell the MCP how to get one, and it gets it from the Azure CLI. So you&#8217;ll need <code>az<\/code> installed. If you don&#8217;t have it yet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Windows:<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>winget install -e --id Microsoft.AzureCLI\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #91B4D5\">winget<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">install<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">-e<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">--id<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Microsoft.AzureCLI<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>macOS:<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly> brew install azure-cli \n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #91B4D5\">brew<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">install<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">azure-cli<\/span><span style=\"color: #A6ACCD\"> <\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Next, sign in to your tenant:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>az login --tenant &lt;your_tenant_id>\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #91B4D5\">az<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">login<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">--tenant<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #91B4D5\">&lt;<\/span><span style=\"color: #ADD7FF\">your_tenant_i<\/span><span style=\"color: #A6ACCD\">d<\/span><span style=\"color: #91B4D5\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">You can grab the tenant ID from the Fabric UI. Click the help icon in the top right corner, then <em>About Fabric<\/em> at the bottom of the pane, and you&#8217;ll get this screen:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"674\" height=\"669\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261008230849-1-1.png\" alt=\"Pasted image 20261008230849.png\" class=\"wp-image-554\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261008230849-1-1.png 674w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261008230849-1-1-300x298.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261008230849-1-1-150x150.png 150w\" sizes=\"auto, (max-width: 674px) 100vw, 674px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In the tenant URL, the GUID after <code>ctid=<\/code> is your tenant ID. Or skip the UI entirely: run <code>az login<\/code> without the tenant flag, pick your account, and <code>az account show --query tenantId -o tsv<\/code> prints the GUID.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now check that <code>az<\/code> can actually get a token:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>az account get-access-token --resource https:\/\/api.fabric.microsoft.com --query expiresOn -o tsv\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #91B4D5\">az<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">account<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">get-access-token<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">--resource<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">https:\/\/api.fabric.microsoft.com<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">--query<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">expiresOn<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">-o<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">tsv<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">You should get the token&#8217;s expiration date back:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"2002\" height=\"102\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261008231339-1-1.png\" alt=\"Pasted image 20261008231339.png\" class=\"wp-image-550\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261008231339-1-1.png 2002w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261008231339-1-1-300x15.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261008231339-1-1-1024x52.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261008231339-1-1-768x39.png 768w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261008231339-1-1-1536x78.png 1536w\" sizes=\"auto, (max-width: 2002px) 100vw, 2002px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Last step: add it to the MCP configuration. Open <code>.claude.json<\/code>, which usually lives here:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Windows: <code>%USERPROFILE%\\.claude.json<\/code> (e.g. <code>C:\\Users\\&lt;you&gt;\\.claude.json<\/code>)<\/li>\n\n\n\n<li>macOS: <code>~\/.claude.json<\/code> (open it with <code>open -e ~\/.claude.json<\/code>)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Inside the top-level <code>\"mcpServers\"<\/code> block, add the following. The JSON is the same on both systems; create the block if it isn&#8217;t there:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">JSON<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\"fabric\": {\n  \"type\": \"http\",\n  \"url\": \"https:\/\/api.fabric.microsoft.com\/v1\/mcp\/core\",\n  \"headersHelper\": \"az account get-access-token --resource https:\/\/api.fabric.microsoft.com --query \\\"{Authorization: join(' ', &#91;'Bearer', accessToken&#93;)}\\\" --output json --only-show-errors\"\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">fabric<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">  <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #E4F0FB\">type<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">http<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">  <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #E4F0FB\">url<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">https:\/\/api.fabric.microsoft.com\/v1\/mcp\/core<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">  <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #E4F0FB\">headersHelper<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">az account get-access-token --resource https:\/\/api.fabric.microsoft.com --query <\/span><span style=\"color: #5FB3A1\">\\&quot;<\/span><span style=\"color: #5DE4C7\">{Authorization: join(&#39; &#39;, &#91;&#39;Bearer&#39;, accessToken&#93;)}<\/span><span style=\"color: #5FB3A1\">\\&quot;<\/span><span style=\"color: #5DE4C7\"> --output json --only-show-errors<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Same as before, Claude can do it for you:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Add the Microsoft Fabric MCP server to my user-scope Claude Code config using `claude mcp add-json` (do not hand-edit ~\/.claude.json).\n\n- Server name: fabric\n- Scope: user (-s user)\n- JSON config:\n  {\n    \"type\": \"http\",\n    \"url\": \"https:\/\/api.fabric.microsoft.com\/v1\/mcp\/core\",\n    \"headersHelper\": \"az account get-access-token --resource https:\/\/api.fabric.microsoft.com --query \\\"{Authorization: join(' ', &#91;'Bearer', accessToken&#93;)}\\\" --output json --only-show-errors\"\n  }\n\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #91B4D5\">Add<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">the<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Microsoft<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Fabric<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">MCP<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">server<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">to<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">my<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">user-scope<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Claude<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Code<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">config<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">using<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #A6ACCD\">`<\/span><span style=\"color: #91B4D5\">claude<\/span><span style=\"color: #5DE4C7\"> <\/span><span style=\"color: #ADD7FF\">mcp<\/span><span style=\"color: #5DE4C7\"> <\/span><span style=\"color: #ADD7FF\">add-json<\/span><span style=\"color: #A6ACCD\">`<\/span><span style=\"color: #A6ACCD\"> (do not hand-edit <\/span><span style=\"color: #91B4D5\">~<\/span><span style=\"color: #A6ACCD\">\/.claude.json)<\/span><span style=\"color: #91B4D5\">.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #91B4D5\">-<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Server<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">name:<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">fabric<\/span><\/span>\n<span class=\"line\"><span style=\"color: #91B4D5\">-<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">Scope:<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">user<\/span><span style=\"color: #A6ACCD\"> (-s <\/span><span style=\"color: #ADD7FF\">user<\/span><span style=\"color: #A6ACCD\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #91B4D5\">-<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">JSON<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #ADD7FF\">config:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">    <\/span><span style=\"color: #91B4D5\">&quot;type&quot;<\/span><span style=\"color: #91B4D5\">:<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">http<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #ADD7FF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">    <\/span><span style=\"color: #91B4D5\">&quot;url&quot;<\/span><span style=\"color: #91B4D5\">:<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">https:\/\/api.fabric.microsoft.com\/v1\/mcp\/core<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #ADD7FF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">    <\/span><span style=\"color: #91B4D5\">&quot;headersHelper&quot;<\/span><span style=\"color: #91B4D5\">:<\/span><span style=\"color: #A6ACCD\"> <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">az account get-access-token --resource https:\/\/api.fabric.microsoft.com --query <\/span><span style=\"color: #5FB3A1\">\\&quot;<\/span><span style=\"color: #5DE4C7\">{Authorization: join(&#39; &#39;, &#91;&#39;Bearer&#39;, accessToken&#93;)}<\/span><span style=\"color: #5FB3A1\">\\&quot;<\/span><span style=\"color: #5DE4C7\"> --output json --only-show-errors<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Heads up:<\/strong> know what expires and when. Claude Code runs the <code>headersHelper<\/code> command when it connects to the server, and the token it gets back is valid for about an hour. If a long session outlives it, type <code>\/mcp<\/code> and reconnect <code>fabric<\/code>. <code>az<\/code> refreshes tokens silently, so that&#8217;s usually all it takes. What eventually expires is your <code>az login<\/code> session itself, after a period of inactivity, or sooner if your organisation has a conditional access policy that forces you to sign in again. When that happens the helper fails and the server shows as failed in <code>\/mcp<\/code>. Run <code>az login --tenant &lt;your_tenant_id&gt;<\/code> again, then reconnect from <code>\/mcp<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MCP, fab or az: who does what<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One more thing before the actual work. The agent switches between three tools, and from the outside it&#8217;s not obvious why.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Fabric MCP<\/strong> is the first choice. It gives the agent ready-made tools like <em>create workspace<\/em> or <em>add role<\/em>, so there&#8217;s no shell command to build, no JSON to guess, and every call runs as you through Entra ID. The catch: it covers only part of what Fabric can do. No capacity assignment, no Git, no Spark settings.<\/li>\n\n\n\n<li><strong>Fabric CLI (<code>fab<\/code>)<\/strong> fills those gaps. It covers far more of the Fabric API and treats your tenant like a filesystem (<code>ws.Workspace\/item.Lakehouse<\/code>). Its own login (<code>fab auth login<\/code>) also supports service principals, which makes it the tool for anything you&#8217;ll later want to script or run in a pipeline. There&#8217;s <code>fab api<\/code> for raw REST calls too, and that&#8217;s what the Git skill uses.<\/li>\n\n\n\n<li><strong>Azure CLI (<code>az<\/code>)<\/strong> does two jobs. It can hand the MCP a token (the second auth option above), and it&#8217;s the generic way to call any REST API with <code>az rest<\/code>, which is why most of the Microsoft Fabric skills rely on it. It&#8217;s also the only one of the three that reaches outside Fabric. Entra groups live in Microsoft Graph, not in Fabric, so a group lookup goes through <code>az ad group show<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You don&#8217;t pick the tool yourself. The agent tries the MCP first and falls back when it has to. Here&#8217;s what to expect in this post:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Step<\/th><th>Tool<\/th><th>Why this one<\/th><\/tr><\/thead><tbody><tr><td>Create workspace, list capacities<\/td><td>Fabric MCP<\/td><td>Built-in tools, plain prompt<\/td><\/tr><tr><td>Assign capacity<\/td><td><code>fab assign<\/code><\/td><td>No MCP tool for it yet<\/td><\/tr><tr><td>Add a group to the workspace<\/td><td>Fabric MCP<\/td><td>Built-in role tool<\/td><\/tr><tr><td>Look up a group&#8217;s object ID<\/td><td><code>az ad group show<\/code><\/td><td>Entra is Microsoft Graph, not Fabric<\/td><\/tr><tr><td>Create the repo (optional)<\/td><td><code>az repos<\/code> \/ <code>gh<\/code><\/td><td>It&#8217;s Azure DevOps or GitHub, not Fabric<\/td><\/tr><tr><td>Connect, disconnect, list Git connections<\/td><td><code>git-integration-operations-cli<\/code> skill \u2192 <code>fab api<\/code> (falls back to <code>az rest<\/code>)<\/td><td>No Git tools in the MCP<\/td><\/tr><tr><td>Create a lakehouse, environment<\/td><td>Fabric MCP<\/td><td>Generic <em>create item<\/em> tool<\/td><\/tr><tr><td>Create a Spark pool, set defaults<\/td><td><code>fab<\/code><\/td><td>Spark settings aren&#8217;t in the MCP<\/td><\/tr><tr><td>Publish an environment<\/td><td><code>az rest<\/code> \/ <code>fab api<\/code><\/td><td>Staging and publish are separate API calls<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Since the agent decides on its own, your run may take a different route for one step or another. If you care which tool it uses, say so in the prompt (&#8220;using fab, &#8230;&#8221;).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Building the workspace<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ok, configuration done. Now for the fun part. We&#8217;ll set up the whole workspace, with capacity, security and a repository, using nothing but prompts.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Workspace and capacity<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Start with the workspace itself. Just prompt the agent, for example:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Markdown<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>using Fabric MCP create a workspace named Blog - Agentic Workflow #1&lt;br><\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E4F0FBD0\">using Fabric MCP create a workspace named Blog - Agentic Workflow #1&lt;br&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd27 <strong>Fabric MCP<\/strong> (<code>create_workspace<\/code>). A built-in tool, so this is a plain prompt and nothing else.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s what you should get back:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"680\" height=\"165\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014225809-1.png\" alt=\"Pasted image 20261014225809.png\" class=\"wp-image-556\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014225809-1.png 680w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014225809-1-300x73.png 300w\" sizes=\"auto, (max-width: 680px) 100vw, 680px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Next, the capacity. You&#8217;ll need its ID, and you don&#8217;t have to go looking for it: ask the LLM to list the capacities and it shows everything available to you:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"652\" height=\"344\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230034-1.png\" alt=\"Pasted image 20261014230034.png\" class=\"wp-image-559\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230034-1.png 652w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230034-1-300x158.png 300w\" sizes=\"auto, (max-width: 652px) 100vw, 652px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd27 <strong>Fabric MCP<\/strong> (<code>list_capacities<\/code>). It only shows capacities your account has access to.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Assigning the capacity is where the first caveat shows up. As of now, the MCP doesn&#8217;t support capacity assignment, so the Fabric CLI steps in. You don&#8217;t even have to tell the LLM. It figures that out on its own:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"668\" height=\"141\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230404-1.png\" alt=\"Pasted image 20261014230404.png\" class=\"wp-image-558\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230404-1.png 668w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230404-1-300x63.png 300w\" sizes=\"auto, (max-width: 668px) 100vw, 668px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd27 <strong>Fabric CLI<\/strong>: <code>fab assign .capacities\/&lt;capacity&gt;.Capacity -W \"&lt;workspace&gt;.Workspace\"<\/code>. The MCP has no capacity assignment tool, and <code>fab<\/code> does, so the agent falls back to it. It uses your <code>fab auth login<\/code> session, not the MCP&#8217;s.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Over on the Fabric side:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1523\" height=\"392\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230548-1.png\" alt=\"Pasted image 20261014230548.png\" class=\"wp-image-557\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230548-1.png 1523w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230548-1-300x77.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230548-1-1024x264.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230548-1-768x198.png 768w\" sizes=\"auto, (max-width: 1523px) 100vw, 1523px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Exactly what we expected. Workspace created, Fabric Trial capacity assigned. And since everything ran under my account, I&#8217;m the owner and the one assigned to the workspace:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"334\" height=\"281\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230701-1.png\" alt=\"Pasted image 20261014230701.png\" class=\"wp-image-555\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230701-1.png 334w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014230701-1-300x252.png 300w\" sizes=\"auto, (max-width: 334px) 100vw, 334px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Security groups<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Adding a security group is one prompt too. Name the user or group and the role you want:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Markdown<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>add Sec-Fabric-Developers (&lt;group-object-id>) security group to Blog - Agentic Workflow #1 workspace as a contributor\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E4F0FBD0\">add Sec-Fabric-Developers (&lt;group-object-id&gt;) security group to Blog - Agentic Workflow #1 workspace as a contributor<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Please note:<\/strong> the agent needs the group&#8217;s object ID. Either give it in the prompt or let the agent look it up in Entra on its own. Either way, the job gets done:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"322\" height=\"319\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014231428-1.png\" alt=\"Pasted image 20261014231428.png\" class=\"wp-image-576\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014231428-1.png 322w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014231428-1-300x297.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014231428-1-150x150.png 150w\" sizes=\"auto, (max-width: 322px) 100vw, 322px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd27 <strong>Fabric MCP<\/strong> (<code>add_workspace_role<\/code>) for the assignment. If you give only the group name, the agent looks up the ID with <strong>Azure CLI<\/strong> (<code>az ad group show --group Sec-Fabric-Developers<\/code>). Groups live in Entra, which is Microsoft Graph, not Fabric, so neither the MCP nor <code>fab<\/code> can find them.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Connecting Azure DevOps<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now the part I always miss when someone else sets up a workspace: the repository. Azure Repos is the easier of the two options, because the connection can authorize through SSO instead of the PAT (Personal Access Token) GitHub requires.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The repository has to exist before you start. If it doesn&#8217;t, the agent can create it too, just ask. For Azure DevOps it uses <strong>Azure CLI<\/strong> (<code>az repos create<\/code>, from the <code>azure-devops<\/code> extension). For GitHub it uses the GitHub CLI (<code>gh repo create<\/code>). Neither is a Fabric operation, which is why the Fabric tools can&#8217;t do it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What you need to provide:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Workspace<\/li>\n\n\n\n<li>Azure DevOps organization name<\/li>\n\n\n\n<li>Azure DevOps project name<\/li>\n\n\n\n<li>Azure DevOps repo name<\/li>\n\n\n\n<li>Branch name<\/li>\n\n\n\n<li>Folder name (optional)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">So your prompt might look like this:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Markdown<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Connect Blog - Agentic Workflow #1 to Azure DevOps: org data-guide, project Blog, repo Blog-AgenticWorkflow, branch main, folder \/agentic-workflow-1\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E4F0FBD0\">Connect Blog - Agentic Workflow #1 to Azure DevOps: org data-guide, project Blog, repo Blog-AgenticWorkflow, branch main, folder \/agentic-workflow-1<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">If you configured everything from my previous post, the agent picks up the <code>git-integration-operations-cli<\/code> skill here, so it has exact instructions for what to do:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1145\" height=\"517\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014234057-1.png\" alt=\"Pasted image 20261014234057.png\" class=\"wp-image-577\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014234057-1.png 1145w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014234057-1-300x135.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014234057-1-1024x462.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014234057-1-768x347.png 768w\" sizes=\"auto, (max-width: 1145px) 100vw, 1145px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd27 <strong>Skill \u2192 Fabric CLI<\/strong> (<code>fab api<\/code>, falling back to <code>az rest<\/code>). The MCP has no Git tools, so the skill calls the Git REST endpoints directly. The same applies to every Git step below: listing connections, disconnecting, connecting to GitHub.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And the proof, in the Source control tab:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"618\" height=\"421\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014234901-1.png\" alt=\"Pasted image 20261014234901.png\" class=\"wp-image-564\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014234901-1.png 618w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261014234901-1-300x204.png 300w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Connecting GitHub<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub works almost the same way, with one big difference: no SSO. Fabric can&#8217;t reuse your Microsoft login, so you have to give it a Personal Access Token. The token isn&#8217;t passed in the request directly. It&#8217;s kept in a Fabric connection, and the workspace points to that connection. Quick comparison:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-dg-comparison\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>Azure DevOps<\/th><th>GitHub<\/th><\/tr><\/thead><tbody><tr><td>Authentication<\/td><td>SSO (automatic) or a connection<\/td><td>PAT stored in a Fabric connection, always required<\/td><\/tr><tr><td>Repo identified by<\/td><td>organization + project + repo<\/td><td>owner + repo<\/td><\/tr><tr><td>Tenant setting<\/td><td>on by default<\/td><td>off by default<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Step 1: Check the tenant setting<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">This one catches a lot of people. In the Fabric Admin portal \u2192 Tenant settings \u2192 Git integration, the <em>Users can sync workspace items with GitHub repositories<\/em> setting is disabled by default. If you aren&#8217;t a Fabric admin, ask yours to enable it before you start. Otherwise the connection fails, and the error won&#8217;t tell you why.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 2: Prepare the repository<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Same as with Azure DevOps, the repository and branch have to exist already. Create the folder you want to connect to as well, for example by adding a simple README.md to it. Oddly enough, the Fabric UI creates a missing folder for you, but the API (and so the LLM) doesn&#8217;t. You&#8217;ll get <code>404 GitProviderResourceNotFound<\/code> instead.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 3: Create a Personal Access Token<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">In GitHub, go to Settings \u2192 Developer settings \u2192 Personal access tokens \u2192 Fine-grained tokens \u2192 Generate new token, then:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">a. Under <strong>Repository access<\/strong>, select <em>Only select repositories<\/em> and pick your repo.<br>\nb. Under <strong>Repository permissions \u2192 Contents<\/strong>, set <em>Read and write<\/em>. Read is enough to update the workspace from Git, but committing from Fabric needs write.<br>\nc. Set an expiration date you&#8217;re comfortable with. When it expires, the sync stops working.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prefer a classic token? It needs the <code>repo<\/code> scope.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 4: Store the token in a Fabric connection<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">You could paste the PAT into the chat and let the LLM create the connection through the API. I don&#8217;t recommend it. The token would end up in your chat history and logs. Create the connection in the UI instead: Settings (gear icon) \u2192 Manage connections and gateways \u2192 New \u2192 Cloud, choose <em>GitHub &#8211; Source control<\/em>, provide the repository URL (e.g. <code>https:\/\/github.com\/&lt;owner&gt;\/&lt;repo&gt;<\/code>) and paste your PAT.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"461\" height=\"985\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015221631-1.png\" alt=\"Pasted image 20261015221631.png\" class=\"wp-image-568\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015221631-1.png 461w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015221631-1-140x300.png 140w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Heads up:<\/strong> if you put a repo URL in the connection, it works for that one repo only. Skip the URL and the connection works for every repo the token can access. Choose based on how many workspaces you&#8217;ll connect.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Already have a connection? Skip this step and ask the LLM to find it:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Markdown<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>List my Fabric connections of type GitHub source control\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E4F0FBD0\">List my Fabric connections of type GitHub source control<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Step 5: Disconnect the existing connection (if there is one)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">A workspace can be connected to only one repository at a time. If you followed the Azure DevOps part above, disconnect it first. Your workspace items stay as they are:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Markdown<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Disconnect Blog - Agentic Workflow #1 from Git\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E4F0FBD0\">Disconnect Blog - Agentic Workflow #1 from Git<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Step 6: Prompt the agent<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Now the actual connection. What you need to provide:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Workspace<\/li>\n\n\n\n<li>GitHub owner (your user or organization)<\/li>\n\n\n\n<li>Repository name<\/li>\n\n\n\n<li>Branch name<\/li>\n\n\n\n<li>Folder name (optional)<\/li>\n\n\n\n<li>Fabric connection name<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Your prompt might look like this:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Markdown<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Connect Blog - Agentic Workflow #1 to GitHub: owner LukaszLubinaDataGuide, repo DataGuide-Blog, branch main, folder Fabric_Agentic_Workflow. Use the Fabric connection named GH_Blog-AgenticWorkflow for credentials.<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E4F0FBD0\">Connect Blog - Agentic Workflow #1 to GitHub: owner LukaszLubinaDataGuide, repo DataGuide-Blog, branch main, folder Fabric_Agentic_Workflow. Use the Fabric connection named GH_Blog-AgenticWorkflow for credentials.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Behind the scenes, the skill:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>finds the workspace ID and the connection ID,<\/li>\n\n\n\n<li>calls the git\/connect API with gitProviderType: GitHub, ownerName, and myGitCredentials pointing to your connection,<\/li>\n\n\n\n<li>initializes the connection and decides which side wins. For an empty workspace, Git is the source,<\/li>\n\n\n\n<li>checks git\/status to confirm the workspace and the branch are on the same commit.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1094\" height=\"531\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015221953-1.png\" alt=\"Pasted image 20261015221953.png\" class=\"wp-image-566\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015221953-1.png 1094w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015221953-1-300x146.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015221953-1-1024x497.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015221953-1-768x373.png 768w\" sizes=\"auto, (max-width: 1094px) 100vw, 1094px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 7: Verify<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Same as before: open the workspace \u2192 Source control, or Workspace settings \u2192 Git integration. Your GitHub repo, branch and folder should be there.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"591\" height=\"512\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015222524-1.png\" alt=\"Pasted image 20261015222524.png\" class=\"wp-image-570\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015222524-1.png 591w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015222524-1-300x260.png 300w\" sizes=\"auto, (max-width: 591px) 100vw, 591px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"638\" height=\"889\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015222542-1.png\" alt=\"Pasted image 20261015222542.png\" class=\"wp-image-560\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015222542-1.png 638w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015222542-1-215x300.png 215w\" sizes=\"auto, (max-width: 638px) 100vw, 638px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lakehouse, Spark pool and environment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An empty workspace with Git connected is where most admins stop. But from what I&#8217;ve seen, the first thing a data engineering team asks for in a new workspace is a lakehouse, a Spark pool sized for their jobs, and an environment with their libraries. The agent can do all three. Each one uses a different tool, which makes it a nice live example of the table above.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Lakehouse<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Markdown<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Create a lakehouse named LH_AgenticWorkflow with schemas enabled in Blog - Agentic Workflow #1\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E4F0FBD0\">Create a lakehouse named LH_AgenticWorkflow with schemas enabled in Blog - Agentic Workflow #1<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"848\" height=\"198\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232000-1.png\" alt=\"Pasted image 20261015232000.png\" class=\"wp-image-563\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232000-1.png 848w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232000-1-300x70.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232000-1-768x179.png 768w\" sizes=\"auto, (max-width: 848px) 100vw, 848px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1099\" height=\"572\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232057-3.png\" alt=\"Pasted image 20261015232057.png\" class=\"wp-image-580\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232057-3.png 1099w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232057-3-300x156.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232057-3-1024x533.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232057-3-768x400.png 768w\" sizes=\"auto, (max-width: 1099px) 100vw, 1099px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd27 <strong>Fabric MCP<\/strong> (<code>create_item<\/code>). A lakehouse is just another Fabric item, so the generic create tool handles it. Check that the result has schemas enabled: that option is set only at creation and can&#8217;t be switched on later. If the MCP can&#8217;t pass it, the agent falls back to <code>az rest<\/code> through the <code>spark-authoring-cli<\/code> skill, which covers schema-enabled lakehouses explicitly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Custom Spark pool<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The starter pool is fine for experiments. For real jobs you usually want a pool sized for them:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Markdown<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Create a custom Spark pool named SP_Small in Blog - Agentic Workflow #1: node size Small, autoscale 1 to 3 nodes, dynamic executor allocation on. Then make it the default pool for the workspace.\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E4F0FBD0\">Create a custom Spark pool named SP_Small in Blog - Agentic Workflow #1: node size Small, autoscale 1 to 3 nodes, dynamic executor allocation on. Then make it the default pool for the workspace.<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"837\" height=\"394\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232322-1.png\" alt=\"Pasted image 20261015232322.png\" class=\"wp-image-573\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232322-1.png 837w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232322-1-300x141.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232322-1-768x362.png 768w\" sizes=\"auto, (max-width: 837px) 100vw, 837px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"883\" height=\"861\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232429-1.png\" alt=\"Pasted image 20261015232429.png\" class=\"wp-image-567\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232429-1.png 883w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232429-1-300x293.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015232429-1-768x749.png 768w\" sizes=\"auto, (max-width: 883px) 100vw, 883px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd27 <strong>Fabric CLI<\/strong>. Spark settings aren&#8217;t in the MCP at all. In <code>fab<\/code>, custom pools sit in a hidden <code>.sparkpools<\/code> folder inside the workspace, and the default pool is a workspace setting (<code>fab set ... -q sparkSettings.pool.defaultPool<\/code>). How many nodes you can give a pool depends on your capacity SKU, so if the agent reports a limit error, that&#8217;s why.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Environment<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Markdown<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Create an environment named ENV_AgenticWorkflow in Blog - Agentic Workflow #1, attach the SP_Small pool, add the holidays library from PyPI, publish it and wait until publishing finishes.\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E4F0FBD0\">Create an environment named ENV_AgenticWorkflow in Blog - Agentic Workflow #1, attach the SP_Small pool, add the holidays library from PyPI, publish it and wait until publishing finishes.<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"852\" height=\"507\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233257-1.png\" alt=\"Pasted image 20261015233257.png\" class=\"wp-image-562\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233257-1.png 852w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233257-1-300x179.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233257-1-768x457.png 768w\" sizes=\"auto, (max-width: 852px) 100vw, 852px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"772\" height=\"418\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233353-1.png\" alt=\"Pasted image 20261015233353.png\" class=\"wp-image-572\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233353-1.png 772w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233353-1-300x162.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233353-1-768x416.png 768w\" sizes=\"auto, (max-width: 772px) 100vw, 772px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"783\" height=\"469\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233412-1.png\" alt=\"Pasted image 20261015233412.png\" class=\"wp-image-565\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233412-1.png 783w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233412-1-300x180.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261015233412-1-768x460.png 768w\" sizes=\"auto, (max-width: 783px) 100vw, 783px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd27 <strong>Fabric MCP<\/strong> creates the empty item. Adding a library and publishing goes through <strong><code>az rest<\/code><\/strong> or <strong><code>fab api<\/code><\/strong>. An environment has a staging state and a published state, and those are separate API calls the MCP doesn&#8217;t have. Publishing takes a few minutes, which is why the prompt says <em>wait<\/em>. Without it, the agent reports success while the environment is still publishing, and the first notebook that uses it can&#8217;t find the library.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now the workspace is actually ready for the team. Keep that lakehouse in mind, we&#8217;ll use it in the next post.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">One request, one skill<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each step above was one prompt. That&#8217;s already faster than clicking through the portal. But you&#8217;re still the one remembering the order, the naming convention, which groups get which role, and which capacity goes with which environment. The real win comes when the whole sequence becomes one request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s what a custom skill is for. Same idea as the Microsoft skills from part one, a markdown file with instructions, except you write it and it holds <em>your<\/em> rules. Create <code>~\/.claude\/skills\/provision-fabric-workspace\/SKILL.md<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Markdown<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>---\nname: provision-fabric-workspace\ndescription: Provision a new Microsoft Fabric workspace end to end - create it, assign capacity, add security groups, connect Git. Use when asked to create, set up or provision a Fabric workspace for a team or project.\n---\n\n# Provision a Fabric workspace\n\nBefore starting, ask for anything missing: project name, environment\n(DEV \/ TEST \/ PROD), Git provider and repository.\n\n## Naming\nThe project name is written three ways. Derive all three from the name the\nuser gives, e.g. `Sales Analytics`:\n\n| Form | Rule | Example |\n|---|---|---|\n| `&lt;Project>` | as given, spaces kept | `Sales Analytics` |\n| `&lt;project-kebab>` | lowercase, spaces \u2192 hyphens | `sales-analytics` |\n| `&lt;ProjectPascal>` | spaces removed, each word capitalised | `SalesAnalytics` |\n\n- Workspace: `&lt;Project> &#91;&lt;ENV>&#93;`, e.g. `Sales Analytics &#91;DEV&#93;`\n- Git folder: `\/&lt;project-kebab>`, e.g. `\/sales-analytics`\n- Security groups: `Sec-Fabric-&lt;ProjectPascal>-&lt;Role>`, e.g.\n  `Sec-Fabric-SalesAnalytics-Developers`. Hyphens separate the parts, so the\n  project part never contains a hyphen or a space.\n- Lakehouse: `LH_&lt;ProjectPascal>`, e.g. `LH_SalesAnalytics` (lakehouse names\n  can't contain spaces)\n\n## Steps\n1. Check the workspace doesn't already exist. If it does, stop and ask.\n2. Create the workspace with the Fabric MCP.\n3. Assign the capacity with `fab`: DEV and TEST go to &lt;dev-capacity-name>,\n   PROD goes to &lt;prod-capacity-name>.\n4. Add access, groups only, never individual users:\n   - Sec-Fabric-&lt;ProjectPascal>-Admins \u2192 Admin\n   - Sec-Fabric-&lt;ProjectPascal>-Developers \u2192 Contributor\n   - Sec-Fabric-&lt;ProjectPascal>-Readers \u2192 Viewer\n   Look up each group's object ID with `az ad group show --group &lt;name>`.\n   Never guess an ID.\n5. Connect Git with the git-integration-operations-cli skill. Azure DevOps\n   uses SSO. GitHub uses the Fabric connection named in the request.\n   Never ask for a PAT in chat.\n6. Create the lakehouse `LH_&lt;ProjectPascal>` with schemas enabled (Fabric MCP).\n7. Report back: workspace ID, capacity, role assignments, Git status, lakehouse.\n\n## Rules\n- Never delete, unassign or overwrite anything. If a step fails, report it and stop.\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E4F0FB\">---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #5DE4C7\">name<\/span><span style=\"color: #A6ACCD\">:<\/span><span style=\"color: #E4F0FB\"> <\/span><span style=\"color: #ADD7FF\">provision-fabric-workspace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #5DE4C7\">description<\/span><span style=\"color: #A6ACCD\">:<\/span><span style=\"color: #E4F0FB\"> <\/span><span style=\"color: #ADD7FF\">Provision a new Microsoft Fabric workspace end to end - create it, assign capacity, add security groups, connect Git. Use when asked to create, set up or provision a Fabric workspace for a team or project.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">---<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">#<\/span><span style=\"color: #5DE4C7\"> <\/span><span style=\"color: #E4F0FB; font-weight: bold\">Provision a Fabric workspace<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FBD0\">Before starting, ask for anything missing: project name, environment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FBD0\">(DEV \/ TEST \/ PROD), Git provider and repository.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">##<\/span><span style=\"color: #5DE4C7\"> <\/span><span style=\"color: #E4F0FB; font-weight: bold\">Naming<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FBD0\">The project name is written three ways. Derive all three from the name the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FBD0\">user gives, e.g. <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">Sales Analytics<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #E4F0FBD0\">:<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> Form <\/span><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> Rule <\/span><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> Example <\/span><span style=\"color: #A6ACCD\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">|---|---|---|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">&lt;Project&gt;<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> as given, spaces kept <\/span><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">Sales Analytics<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #A6ACCD\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">&lt;project-kebab&gt;<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> lowercase, spaces \u2192 hyphens <\/span><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">sales-analytics<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #A6ACCD\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">&lt;ProjectPascal&gt;<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> spaces removed, each word capitalised <\/span><span style=\"color: #A6ACCD\">|<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">SalesAnalytics<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #ADD7FF\"> <\/span><span style=\"color: #A6ACCD\">|<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">- <\/span><span style=\"color: #E4F0FBD0\">Workspace: <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">&lt;Project&gt; &#91;&lt;ENV&gt;&#93;<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #E4F0FBD0\">, e.g. <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">Sales Analytics &#91;DEV&#93;<\/span><span style=\"color: #ADD7FF\">`<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">- <\/span><span style=\"color: #E4F0FBD0\">Git folder: <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">\/&lt;project-kebab&gt;<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #E4F0FBD0\">, e.g. <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">\/sales-analytics<\/span><span style=\"color: #ADD7FF\">`<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">- <\/span><span style=\"color: #E4F0FBD0\">Security groups: <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">Sec-Fabric-&lt;ProjectPascal&gt;-&lt;Role&gt;<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #E4F0FBD0\">, e.g.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">  <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">Sec-Fabric-SalesAnalytics-Developers<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #E4F0FBD0\">. Hyphens separate the parts, so the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">  <\/span><span style=\"color: #E4F0FBD0\">project part never contains a hyphen or a space.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">- <\/span><span style=\"color: #E4F0FBD0\">Lakehouse: <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">LH_&lt;ProjectPascal&gt;<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #E4F0FBD0\">, e.g. <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">LH_SalesAnalytics<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #E4F0FBD0\"> (lakehouse names<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">  <\/span><span style=\"color: #E4F0FBD0\">can&#39;t contain spaces)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">##<\/span><span style=\"color: #5DE4C7\"> <\/span><span style=\"color: #E4F0FB; font-weight: bold\">Steps<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">1.<\/span><span style=\"color: #E4F0FB\"> <\/span><span style=\"color: #E4F0FBD0\">Check the workspace doesn&#39;t already exist. If it does, stop and ask.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">2.<\/span><span style=\"color: #E4F0FB\"> <\/span><span style=\"color: #E4F0FBD0\">Create the workspace with the Fabric MCP.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">3.<\/span><span style=\"color: #E4F0FB\"> <\/span><span style=\"color: #E4F0FBD0\">Assign the capacity with <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">fab<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #E4F0FBD0\">: DEV and TEST go to &lt;dev-capacity-name&gt;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">   <\/span><span style=\"color: #E4F0FBD0\">PROD goes to &lt;prod-capacity-name&gt;.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">4.<\/span><span style=\"color: #E4F0FB\"> <\/span><span style=\"color: #E4F0FBD0\">Add access, groups only, never individual users:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">   <\/span><span style=\"color: #ADD7FF\">- <\/span><span style=\"color: #E4F0FBD0\">Sec-Fabric-&lt;ProjectPascal&gt;-Admins \u2192 Admin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">   <\/span><span style=\"color: #ADD7FF\">- <\/span><span style=\"color: #E4F0FBD0\">Sec-Fabric-&lt;ProjectPascal&gt;-Developers \u2192 Contributor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">   <\/span><span style=\"color: #ADD7FF\">- <\/span><span style=\"color: #E4F0FBD0\">Sec-Fabric-&lt;ProjectPascal&gt;-Readers \u2192 Viewer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">   <\/span><span style=\"color: #E4F0FBD0\">Look up each group&#39;s object ID with <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">az ad group show --group &lt;name&gt;<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #E4F0FBD0\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">   <\/span><span style=\"color: #E4F0FBD0\">Never guess an ID.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">5.<\/span><span style=\"color: #E4F0FB\"> <\/span><span style=\"color: #E4F0FBD0\">Connect Git with the git-integration-operations-cli skill. Azure DevOps<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">   <\/span><span style=\"color: #E4F0FBD0\">uses SSO. GitHub uses the Fabric connection named in the request.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">   <\/span><span style=\"color: #E4F0FBD0\">Never ask for a PAT in chat.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">6.<\/span><span style=\"color: #E4F0FB\"> <\/span><span style=\"color: #E4F0FBD0\">Create the lakehouse <\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #7390AA\">LH_&lt;ProjectPascal&gt;<\/span><span style=\"color: #ADD7FF\">`<\/span><span style=\"color: #E4F0FBD0\"> with schemas enabled (Fabric MCP).<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">7.<\/span><span style=\"color: #E4F0FB\"> <\/span><span style=\"color: #E4F0FBD0\">Report back: workspace ID, capacity, role assignments, Git status, lakehouse.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E4F0FB\">##<\/span><span style=\"color: #5DE4C7\"> <\/span><span style=\"color: #E4F0FB; font-weight: bold\">Rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADD7FF\">- <\/span><span style=\"color: #E4F0FBD0\">Never delete, unassign or overwrite anything. If a step fails, report it and stop.<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The next &#8220;can I get a new workspace?&#8221; message now costs you one line:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">Markdown<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/provision-fabric-workspace Sales Analytics, DEV, GitHub repo DataGuide-Blog, connection GH_Blog-AgenticWorkflow\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E4F0FBD0\">\/provision-fabric-workspace Sales Analytics, DEV, GitHub repo DataGuide-Blog, connection GH_Blog-AgenticWorkflow<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The skill doesn&#8217;t just run blindly. It asks for whatever is missing before it touches anything:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><p>Pre-check one &#8211; the skill asks for the capacity<br><br><img decoding=\"async\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016091257.png\" alt=\"Pasted image 20261016091257.png\"><\/p><br><\/li>\n\n\n\n<li><p>Pre-check two &#8211; the skill asks for the repository owner<br><br><img decoding=\"async\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016091355.png\" alt=\"Pasted image 20261016091355.png\"><\/p><br><\/li>\n\n\n\n<li><p>Pre-check three &#8211; the skill asks about the branch<br><br><img decoding=\"async\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016091434.png\" alt=\"Pasted image 20261016091434.png\"><\/p><br><\/li>\n\n\n\n<li><p>Final response<br><br><img decoding=\"async\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016095215.png\" alt=\"Pasted image 20261016095215.png\"><\/p><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">And the result in Fabric:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1127\" height=\"587\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016095312-1.png\" alt=\"Pasted image 20261016095312.png\" class=\"wp-image-569\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016095312-1.png 1127w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016095312-1-300x156.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016095312-1-1024x533.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016095312-1-768x400.png 768w\" sizes=\"auto, (max-width: 1127px) 100vw, 1127px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"527\" height=\"550\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016095323-1.png\" alt=\"Pasted image 20261016095323.png\" class=\"wp-image-571\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016095323-1.png 527w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/Pasted-image-20261016095323-1-287x300.png 287w\" sizes=\"auto, (max-width: 527px) 100vw, 527px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Two things I like about this beyond the speed. The naming convention no longer depends on who handled the request. And the skill file is plain text, so you can put it in a repo, review changes to it like code, and share it with the rest of the admin team. I&#8217;d also tag release versions of the skill, so you always know which version someone has installed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A word on destructive tools<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Fabric MCP doesn&#8217;t only create things. It also has <code>delete_workspace<\/code>, <code>delete_item<\/code> and a tool for removing role assignments, and <code>fab<\/code> has <code>fab rm<\/code>. By default Claude asks before calling any of them. Keep it that way. And if you ever click &#8220;don&#8217;t ask again&#8221; on a create tool, double-check it wasn&#8217;t one of these.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Want a hard stop instead of a prompt? Deny them outright in <code>~\/.claude\/settings.json<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#a6accd;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#252937;color:#969dc4\">JSON<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#a6accd;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>{\n  \"permissions\": {\n    \"deny\": &#91;\n      \"mcp__fabric__delete_workspace\",\n      \"mcp__fabric__delete_item\",\n      \"mcp__fabric__delete_workspace_role\",\n      \"Bash(fab rm:*)\"\n    &#93;\n  }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki poimandres\" style=\"background-color: #1b1e28\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #A6ACCD\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">  <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #E4F0FB\">permissions<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">    <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #ADD7FF\">deny<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">: &#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">      <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">mcp__fabric__delete_workspace<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">      <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">mcp__fabric__delete_item<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">      <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">mcp__fabric__delete_workspace_role<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #A6ACCD\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">      <\/span><span style=\"color: #A6ACCD\">&quot;<\/span><span style=\"color: #5DE4C7\">Bash(fab rm:*)<\/span><span style=\"color: #A6ACCD\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">    &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6ACCD\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The tool names follow the pattern <code>mcp__&lt;server name&gt;__&lt;tool&gt;<\/code>, so if you named your server something other than <code>fabric<\/code>, adjust the prefix. When you genuinely need to delete something, do it in the portal. It&#8217;s one click, and you see exactly what you&#8217;re removing.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wrap-up<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s the admin side covered, from an empty tenant to a workspace a team can actually use.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quick recap:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Auth first.<\/strong> Copilot signs in on its own. For Claude Code, register your own Entra app (preferred) or let <code>az<\/code> hand the MCP a token.<\/li>\n\n\n\n<li><strong>Workspace, roles and Git<\/strong> are plain prompts, through the MCP and the <code>git-integration-operations-cli<\/code> skill.<\/li>\n\n\n\n<li><strong>Capacity assignment<\/strong> isn&#8217;t in the MCP yet, so <code>fab<\/code> takes over.<\/li>\n\n\n\n<li><strong>Three tools, one rule<\/strong>: MCP first, <code>fab<\/code> for what the MCP doesn&#8217;t cover (capacity, Spark pools, Git), <code>az<\/code> for the skills&#8217; REST calls and anything outside Fabric, like Entra groups.<\/li>\n\n\n\n<li><strong>Lakehouse, Spark pool and environment<\/strong> &#8211; three more prompts.<\/li>\n\n\n\n<li><strong>GitHub needs more prep<\/strong> than Azure DevOps: the tenant setting, an existing folder, and a PAT that lives in a Fabric connection, never in the chat.<\/li>\n\n\n\n<li><strong>Wrap the sequence in a skill<\/strong>, and keep delete tools behind a prompt or a deny rule.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">What does your workspace request process look like today? I&#8217;m curious how many steps people would actually hand over to an agent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Next up in the series: Data Engineering. We take the workspace we just built and put it to work, with notebooks, pipelines and dataflows written by the agent.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Status check, verified October 2026. The Fabric Core MCP Server is out of preview: Microsoft listed it as generally available in the September 2026 Fabric update. The tool set is still growing, though. At the time of writing it has no tools for capacity assignment, Git or Spark settings, which is why fab and az&#8230;<\/p>\n","protected":false},"author":1,"featured_media":545,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"dg_series_part":"2","dg_series_short":"One Prompt, One Workspace: Agentic Fabric Admin","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[19,8,9],"tags":[11,18,17,10],"dg_series":[21],"class_list":["post-497","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-administration","category-microsoft-fabric","tag-administration","tag-agenticdevelopment","tag-ai","tag-microsoftfabric","dg_series-agentic-development"],"jetpack_featured_media_url":"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/10\/image.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/posts\/497","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/comments?post=497"}],"version-history":[{"count":6,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/posts\/497\/revisions"}],"predecessor-version":[{"id":633,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/posts\/497\/revisions\/633"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/media\/545"}],"wp:attachment":[{"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/media?parent=497"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/categories?post=497"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/tags?post=497"},{"taxonomy":"dg_series","embeddable":true,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/dg_series?post=497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}