Microsoft Business Central MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Microsoft Business Central MCP Serverlist all customers in my company"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Microsoft Business Central MCP Server
Model Context Protocol (MCP) server for Microsoft Dynamics 365 Business Central. Provides AI assistants with direct access to Business Central data through properly formatted API v2.0 calls.
Features
✅ Correct API URLs: Uses proper
/companies(id)/resourceformat (no ODataV4 segment)✅ Zero Installation: Run with
npx- no pre-installation required✅ Azure CLI Auth: Leverages existing Azure CLI authentication
✅ Client Credentials Auth: Service-to-service authentication for AI agents
✅ Clean Tool Names: No prefixes, just
get_schema,list_items, etc.✅ Full CRUD: Create, read, update, and delete Business Central records
Related MCP server: Microsoft Business Central MCP Server
Installation
Using npx (Recommended)
No installation needed! Configure in Claude Desktop or Claude Code:
{
"mcpServers": {
"business-central": {
"type": "stdio",
"command": "cmd",
"args": ["/c", "npx", "-y", "@knowall-ai/mcp-business-central"],
"env": {
"BC_URL_SERVER": "https://api.businesscentral.dynamics.com/v2.0/{tenant-id}/{environment}/api/v2.0",
"BC_COMPANY": "Your Company Name",
"BC_AUTH_TYPE": "azure_cli"
}
}
}
}Note for Windows: Use cmd with /c as shown above for proper npx execution.
Using Smithery
Install via Smithery:
npx -y @smithery/cli install @knowall-ai/mcp-business-central --client claudeLocal Development
git clone https://github.com/knowall-ai/mcp-business-central.git
cd mcp-business-central
npm install
npm run build
node build/index.jsConfiguration
Environment Variables
Variable | Required | Description | Example |
| Yes | Business Central API base URL |
|
| Yes | Company display name |
|
| No | Authentication type (default: |
|
| For client_credentials | Azure AD tenant ID |
|
| For client_credentials | App registration client ID |
|
| For client_credentials | App registration client secret |
|
Getting Your Configuration Values
Tenant ID: Find in Azure Portal → Azure Active Directory → Overview
Environment: Usually
ProductionorSandboxCompany Name: The display name shown in Business Central
Example URL format:
https://api.businesscentral.dynamics.com/v2.0/00000000-0000-0000-0000-000000000000/Production/api/v2.0Authentication
Recommendation: Use
azure_cliauthentication - it's simpler to set up and more reliable. Theclient_credentialsmethod is also supported but has known configuration challenges with Business Central's Microsoft Entra Applications setup. See docs/TROUBLESHOOTING.adoc for details.
Option 1: Azure CLI (Recommended)
The simplest and most reliable authentication method. Uses your existing Azure CLI login.
Prerequisites:
Install Azure CLI: https://docs.microsoft.com/cli/azure/install-azure-cli
Login:
az loginVerify access:
az account get-access-token --resource https://api.businesscentral.dynamics.com
Configuration:
{
"mcpServers": {
"business-central": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@knowall-ai/mcp-business-central"],
"env": {
"BC_AUTH_TYPE": "azure_cli",
"BC_URL_SERVER": "https://api.businesscentral.dynamics.com/v2.0/{tenant-id}/Production/api/v2.0",
"BC_COMPANY": "My Company"
}
}
}
}Option 2: Client Credentials (Service-to-Service)
For automated systems that need to run without user interaction. This method uses OAuth 2.0 client credentials flow.
Note: This method has known configuration challenges. The Business Central "Microsoft Entra Applications" setup can be complex and the application user creation may not work as expected. See docs/TROUBLESHOOTING.adoc for detailed guidance.
Setup Overview:
Create Azure App Registration:
Go to Azure Portal → Azure Active Directory → App registrations
Create new registration (single tenant)
Add API permission: Dynamics 365 Business Central →
app_access(Application permission, NOT Delegated)Grant admin consent for the permission
Add redirect URI:
https://businesscentral.dynamics.com/OAuthLanding.htm
Generate Client Secret:
In your app registration, go to Certificates & secrets
Create a new client secret and save it securely
Configure Business Central:
In Business Central, search for "Microsoft Entra Applications"
Click + New and enter your app's Client ID
Set a Description (this becomes the application user name)
Set State to "Enabled" - you should see "A user named '[Description]' will be created"
Add permission sets:
D365 BUS FULL ACCESS(recommended) orD365 READLeave Company field blank for all companies access
Click "Grant Consent"
Verify Setup:
The application user should appear in the Users list in Business Central
If not, see docs/TROUBLESHOOTING.adoc for solutions
References:
Available Tools
1. get_schema
Get OData metadata for a Business Central resource.
Parameters:
resource(string, required): Resource name (e.g.,customers,contacts,salesOpportunities)
Example:
{
"resource": "customers"
}2. list_items
List items with optional filtering and pagination.
Parameters:
resource(string, required): Resource namefilter(string, optional): OData filter expressiontop(number, optional): Maximum number of items to returnskip(number, optional): Number of items to skip for pagination
Example:
{
"resource": "customers",
"filter": "displayName eq 'Contoso'",
"top": 10
}3. get_items_by_field
Get items matching a specific field value.
Parameters:
resource(string, required): Resource namefield(string, required): Field name to filter byvalue(string, required): Value to match
Example:
{
"resource": "contacts",
"field": "companyName",
"value": "Contoso Ltd"
}4. create_item
Create a new item in Business Central.
Parameters:
resource(string, required): Resource nameitem_data(object, required): Item data to create
Example:
{
"resource": "contacts",
"item_data": {
"displayName": "John Doe",
"companyName": "Contoso Ltd",
"email": "john.doe@contoso.com"
}
}5. update_item
Update an existing item.
Parameters:
resource(string, required): Resource nameitem_id(string, required): Item ID (GUID)item_data(object, required): Fields to update
Example:
{
"resource": "customers",
"item_id": "1366066e-7688-f011-b9d1-6045bde9b95f",
"item_data": {
"displayName": "Updated Name"
}
}6. delete_item
Delete an item from Business Central.
Parameters:
resource(string, required): Resource nameitem_id(string, required): Item ID (GUID)
Example:
{
"resource": "contacts",
"item_id": "a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6"
}Common Resources
companies- Company informationcustomers- Customer recordscontacts- Contact recordssalesOpportunities- Sales opportunitiessalesQuotes- Sales quotessalesOrders- Sales orderssalesInvoices- Sales invoicesitems- Product/service itemsvendors- Vendor records
Troubleshooting
See docs/TROUBLESHOOTING.adoc for detailed troubleshooting guides covering:
Authentication issues (401 errors, token problems)
client_credentialssetup challenges and known issuesCompany not found errors
Environment-specific configuration (Production vs Sandbox)
Development
# Install dependencies
npm install
# Build TypeScript
npm run build
# Watch mode for development
npm run devLicense
MIT
Contributing
Issues and pull requests welcome at https://github.com/knowall-ai/mcp-business-central
Related Projects
MCP Specification: modelcontextprotocol.io
Available Tools
6 toolscreate_itemC
Create a new item in Business Central
| Name | Required | Description | Default |
|---|---|---|---|
| resource | Yes | The resource name (e.g., customers, contacts) | |
| item_data | Yes | The item data to create |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description is insufficient to disclose behavioral traits. It only states 'create', which implies a write operation, but does not describe side effects, authentication needs, required permissions, or error states. The description fails to add context beyond the obvious.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short (one sentence), which is concise but lacks structure and completeness. It is not verbose, but it does not fully earn its place because it omits important details that could fit in a few more words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema and two parameters (one with nested objects), the description is insufficient. It does not mention return values, success indicators, or potential errors. The complexity is low but the description should at least indicate what happens upon successful creation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add any meaning beyond what the schema already provides for the two parameters (resource and item_data). It merely restates the tool's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'create' and the resource 'item', and the tool name is a direct action. It is distinct from sibling tools which perform other operations like get_schema, list_items, etc., but lacks specificity about what types of items can be created (e.g., customers, contacts).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There is no mention of prerequisites, context, or situations where other tools (like update_item or list_items) would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_itemB
Delete an item from Business Central
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | The ID of the item to delete | |
| resource | Yes | The resource name (e.g., customers, contacts) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It only says 'delete', implying destruction, but provides no details on permissions, reversibility, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, zero waste, front-loaded with the core action. Highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete tool with 2 params and no output schema, it is minimally complete. However, lacks any context about the resource parameter or that deletion is irreversible.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already described. The description adds no extra meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'delete' and the resource 'item', distinguishing it from siblings like create_item and update_item.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like update_item or list_items; lacks any context about prerequisites or scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_items_by_fieldC
Get items matching a field value
| Name | Required | Description | Default |
|---|---|---|---|
| field | Yes | The field name to filter by | |
| value | Yes | The value to match | |
| resource | Yes | The resource name (e.g., customers, contacts) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It only states 'Get items matching a field value,' implying a read operation, but does not mention pagination, limits, response format, or any side effects. This is insufficient for a clear understanding of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, short sentence that is concise and to the point. It avoids verbosity but could be slightly expanded without losing conciseness. The brevity is appropriate for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 parameters, no output schema, no annotations), the description is minimal but lacks completeness. It does not explain the nature of the filter (exact match? case-sensitive?), potential return size, or where the data comes from. This leaves gaps in understanding for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters (field, value, resource) have descriptions in the input schema. The tool description adds no new information beyond the schema, matching the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get items matching a field value' clearly states the action (get) and the resource (items) with a filtering condition. It distinguishes from siblings like create_item, update_item, delete_item, get_schema, and list_items by indicating a filtered retrieval, though it could be more specific about the filtering mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like list_items (which likely retrieves all items) or get_schema. The description lacks context about when filtering by field is appropriate, leaving the agent without decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_schemaC
Get schema information for a Business Central resource
| Name | Required | Description | Default |
|---|---|---|---|
| resource | Yes | The resource name (e.g., customers, contacts, salesOpportunities) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It implies a read operation but does not explicitly state that it is read-only, nor does it disclose any behavioral traits like idempotency or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the purpose. It could be slightly expanded without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter and no output schema, the description is minimally adequate but incomplete: it does not describe the format or content of the returned schema information, leaving the agent uncertain about the output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no meaning beyond what the input schema already provides (the 'resource' parameter has a description). Schema coverage is 100%, but the description does not elaborate on the parameter's usage or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Get') and resource ('schema information for a Business Central resource'), and it distinguishes itself from sibling tools that operate on list/items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus its siblings, nor are there any exclusions or context for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_itemsB
Get items from Business Central with filtering and pagination
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of items to return (optional) | |
| skip | No | Number of items to skip for pagination (optional) | |
| filter | No | OData filter expression (optional) | |
| resource | Yes | The resource name (e.g., customers, contacts, salesOpportunities) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It indicates a read operation ('get'), but does not explicitly state non-destructive behavior or any other behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no wasted words. However, it is too short and could benefit from additional context without sacrificing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of sibling tools and the lack of output schema, the description is insufficient. It does not explain the return format, valid resource values, or error handling, making it incomplete for an agent to use effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters have schema descriptions (100% coverage), so baseline is 3. The description adds no additional meaning beyond what is in the schema; it merely mentions filtering and pagination, which are already reflected in the parameter names and descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves items with filtering and pagination. However, it does not distinguish from the sibling tool 'get_items_by_field', which also retrieves items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like 'get_items_by_field'. The description implies listing with filters but does not specify conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_itemC
Update an existing item in Business Central
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | The ID of the item to update | |
| resource | Yes | The resource name (e.g., customers, contacts) | |
| item_data | Yes | The item data to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavior. It only says 'update' without mentioning side effects, authorization, idempotency, or response. Minimal disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, concise and front-loaded. However, it could be slightly expanded without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, no annotations, and nested item_data parameter. Description lacks details on success/error behavior, constraints, or return values, making it incomplete for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all parameters. Description adds no extra meaning beyond schema; baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it updates an existing item in Business Central, with verb and resource. However, 'item' is vague and doesn't specify the entity type, which slightly reduces clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus siblings like create_item or delete_item. Agent is left without context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
6 tool updates
v0.1.4- First observed
create_item - First observed
delete_item - First observed
get_items_by_field - First observed
get_schema - First observed
list_items - First observed
update_item
TDQS
Each tool has a clear distinct purpose: schema retrieval, listing with filtering, field-based search, and standard CRUD operations. No overlap exists.
All tools follow a consistent verb_noun pattern in snake_case (e.g., get_schema, create_item), making naming predictable and clear.
With 6 tools covering schema retrieval and full CRUD for items, the set is well-scoped and each tool serves a necessary function.
Covers all essential operations for items: create, read (list and field-based), update, delete, plus schema metadata. No obvious gaps for the item-focused domain.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Cloud-hosted MCP server for secure AI access to enterprise data sources via CData Connect AI.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
- mcp-serverOAuthio.klokin
MCP server exposing klokin time-tracking operations (employees, time entries, stores) to AI clients.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server that integrates with Microsoft Dynamics 365 Business Central, enabling querying of customers, items, and sales orders through natural language commands in Claude Desktop.10-
- AlicenseAqualityDmaintenanceModel Context Protocol (MCP) server for Microsoft Dynamics 365 Business Central. Provides AI assistants with direct access to Business Central data through properly formatted API v2.0 calls.6308MIT
- AlicenseBqualityCmaintenanceMCP server for Microsoft Dynamics 365 Business Central, enabling AI assistants to perform CRUD operations, query data, and retrieve schemas via Business Central API v2.0.630MIT
- AlicenseAqualityCmaintenanceMCP server that provides AI assistants direct access to Microsoft Dynamics 365 Business Central using its native WebSocket protocol, enabling page navigation, data operations, actions, and report execution without OData or browser automation.1457MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MehrozeKhan73/Business-Central-MCP-Server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server