Connect Any Agent to Business Central

Happy New Year!

It’s a first blog of 2026 and I believe 2026 will be the year of production Agents.

We’re transitioning from PoC agents to production agents. But before I continue, let me clarify something that I’ve being asked a lot.

What differs agents from copilots?

Copilots answer questions using available context. Usually, they search for info on the internet, public/private sources, or vector DBs โ€” but the flow is deterministic. You ask, they search, they answer. Done.

Agents can do the same โ€” answer questions or even execute actions. But the flow is non-deterministic. Agents self-decide where and what data to query, and they can do that continuously until the question is answered or the task is done.

Ability to search and execute actions are given to the agents as tools. And agents self-decide what tools to run, how to run them, in which order, and when to stop.

So in very short โ€” agents run tools in a loop.

๐Ÿ”ง Tools for Agents: The MCP Protocol

Now, if you build an agent that requires data from Business Central, this “query Business Central” is also a tool. The standard way to give/expose tools to the agents โ€” is the MCP (Model Context Protocol).

At the end of last year, Microsoft introduced the Business Central MCP Server. This MCP gives external agents (not the ones inside BC) the ability to read or write data in Business Central or execute actions available through APIs.

You can read more about how to setup and use MCP in different sources. However, currently (as on January 2026) you can provide BC MCP to only one agent โ€” created in Copilot Studio.

If you are building a custom agent in Langchain, Agent Framework, or you want to use standard 3rd party agents like Cursor, GitHub Copilot, Claude etc. โ€” you can’t use BC MCP… until now.

Microsoft workaround

Late December 2025, Microsoft added a small library called BcMCPProxy. It allows you to connect Claude Desktop or VS Code to a Business Central Model Context Protocol (MCP) server.

I tried to set it up in Claude Desktop. You need to add something like this to your config:

				
					{
  "mcpServers": {
    "BC_MCP": {
      "command": "C:\\Path\\To\\BcMCPProxy.exe",
      "args": [
        "--TenantId", "<Your-Tenant-ID>",
        "--ClientId", "<Your-Client-ID>",
        "--Environment", "<BC-Environment-Name>",
        "--Company", "<Company-Name>"
      ]
    }
  }
}
				
			

Notice that .exe? Yeah, that means only Windows users can use that.

๐Ÿ Multiplatform BCMCPProxy

I’m on a Mac. So, I built a multiplatform BCMCPProxy, which is now also part of the BCTech repo.

I tested it on Mac and Windows. I believe Linux users can use it as well.

Compared to the Microsoft .NET version, it’s just simpler:

  • โœ… Easier installation: Just pip install bc-mcp-proxy, no need to build or download executables.
  • โœ… Cross-platform: Works everywhere Python runs.
  • โœ… Unified setup: One interactive command handles everything.
  • โœ… Better IDE integration: Works seamlessly with Cursor, VS Code and other tools that expect Python-based MCPs.

Choose this python based version if you prefer easier installation and cross-platform support, or .NET version if you prefer a compiled executable.

Prerequisites

Before you start, you’ll need an Azure AD App Registration and MCP Setup completed in Business Central.

  • Set redirect URL to ms-appx-web://Microsoft.AAD.BrokerPlugin/<clientID>
  • Enable “Allow public client flows”
  • Add API permissions (Financials.ReadWrite.All and user_impersonation, both Delegated).
  • Ensure your BC environment has the MCP preview feature enabled.

๐Ÿš€ Setup

The setup process is now very simple โ€” just two steps:

Step 1: Install Python (if you don’t have it)

Download Python 3.10+ from python.org if you don’t have it already.

Step 2: Run the Unified Setup

One simple command for Mac/Linux:

				
					python3 -m pip install --upgrade --force-reinstall bc-mcp-proxy && python3 -m bc_mcp_proxy setup
				
			

or Windows:

				
					python -m pip install --upgrade --force-reinstall bc-mcp-proxy && python -m bc_mcp_proxy setup
				
			

That’s it. The interactive setup will:

  • Prompt for your Business Central tenant ID, client ID, environment, and company
  • Launch the device-code login flow (so you sign in immediately)
  • Generate ready-to-click install URLs for Cursor and VS Code plus a Claude Desktop snippet
  • Save everything under ~/.bc_mcp_proxy/ (or %USERPROFILE%\.bc_mcp_proxy\ on Windows)

Step 3: Configure Your MCP Client

The setup command generates ready-to-use configuration files and install links:

  • Cursor/VS Code: Use the clickable install link printed by setup, or copy the generated cursor_mcp.json or vscode_mcp.json from ~/.bc_mcp_proxy/ into your MCP configuration
  • Claude Desktop: Copy the generated claude_mcp.json snippet into your claude_desktop_config.json

Step 4: Restart Your MCP Client

After adding the configuration, restart your MCP client. You should see Business Central tools available.

๐Ÿ’ฌ Usage

Once configured, you can interact with Business Central through natural language. The proxy handles authentication and API calls for you.

Try asking:

  • “Show me the latest sales orders”
  • “Create a new customer record”
  • “What are the current inventory levels?”

The agent will understand your request, decide which BC API tools to use, execute the queries, and return results in plain English. All without you writing a single line of code or knowing the BC API structure.

Depending on the agent, it can also ask to approve tool call.

๐Ÿ” Example: How It Works

Here’s what happens under the hood when you ask an agent to get inventory levels. The agent calls the BC MCP tool, which translates to a Business Central API request:

Request:

				
					{
  "Reason": "User requested current inventory levels to display in a chart",
  "Arguments": {
    "top": 50,
    "select": "number,displayName,inventory,unitPrice,baseUnitOfMeasureCode"
  },
  "ActionName": "ListItems_PAG30008"
}
				
			

Response:

				
					{
  "@odata.context": "https://...businesscentral.dynamics.com:7048/MS/api/v2.0/$metadata#items",
  "value": [
    {
      "@odata.etag": "W/\"JzE5OzYyMDYwNjM1NDE2ODk5NDEyOTgxOzAwOyc=\"",
      "number": "1896-S",
      "displayName": "ATHENS Desk",
      "inventory": 10,
      "unitPrice": 299.99,
      "baseUnitOfMeasureCode": "PCS"
    }
    // ... more items
  ]
}
				
			

โš ๏ธ A Common Issue: The top Parameter

You might notice the top: 50 parameter in the request above. Very often, agents automatically add this parameter to limit results (e.g., to 50 items), which can cut off other items you need.

This is not a proxy issue โ€” it’s an agent/MCP behavior. I’ve seen this in other MCPs as well. The agent is trying to be efficient by limiting the dataset, but sometimes it’s too aggressive.

Workaround: If you need all items, explicitly ask the agent to get all items and not use the top parameter. For example:

  • โŒ “Show me inventory levels” (might only return 50 items)
  • โœ… “Show me all inventory levels, don’t use the top parameter” (should return everything)

I hope this will be resolved at the MCP level in the future, but for now, being explicit about wanting complete datasets helps.

๐Ÿ’ก Final thoughts

I hope Microsoft will end up with a solution where no MCP proxy is required. Until that moment, you are free to use bc_mcp_proxy to power your agents with the ability to use BC data.

The future is agentic โ€” let’s build it.

๐Ÿ”— Links

Python MCP Proxy: GitHub Repository
.NET MCP Proxy: GitHub Repository
– Business Central MCP Documentation: Microsoft Learn

Share Post:

Leave a Reply

About Me

DMITRY KATSON

A Microsoft MVP, Business Central architect and a project manager, blogger and a speaker, husband and a twice a father. With more than 15 years in business, I went from developer to company owner. Having a great team, still love to put my hands on code and create AI powered Business Central Apps that just works.

Follow Me

Recent Posts

Tags