MCP server for Microsoft Dynamics 365 Business Central API access via STDIO transport. Provides tools to retrieve customers, items, sales orders, and currency exchange rates from Business Central.
Moderate quality with consistent structure across tools. All 6 tools have explicit registrations with names, descriptions, and input schemas. Descriptions are present but generic (emoji-heavy, lack context on WHEN to use each tool or dependencies between them). Parameter schemas are well-formed with types and descriptions, but missing constraints (no enums, no min/max bounds for 'top' parameter). Output schemas are completely undocumented, the code constructs TextContent responses but LLMs have no visibility into what fields/structure to expect. No error handling guidance provided. Tool naming follows verb_noun pattern (get_*) which is good, but 'get_customers' vs 'get_customer_details' distinction is only clear from description, not name alone. All tools are READ_ONLY which is appropriate, but responses in the code sample are truncated and do not show structured field documentation.
💱 Get currency exchange rates from Business Central
🔍 Get detailed information about a specific customer
🏢 Get customer list from Business Central
🔍 Get detailed information about a specific item
📦 Get items list from Business Central
🛒 Get sales orders from Business Central
Output schemas completely undocumented. Code constructs TextContent responses with formatted strings but provides no schema to LLMs about return structure. LLM cannot plan downstream operations or extract structured data reliably.
Parameter 'top' lacks constraints (min/max bounds). Accepts integer with no documented limits. LLM could pass absurd values (0, -1, 999999) that break downstream APIs or cause timeout. Should specify 1 - 100 range and default behavior.
Descriptions are generic and emoji-heavy but lack context on WHEN to use each tool. No guidance on dependencies or how tools chain together. E.g., should LLM call get_customers then get_customer_details, or call get_customer_details directly? No stated dependency hints.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | F | 45 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 13 | - | v1 |
No error handling guidance. Code shows try/except and logger.info but no documented error responses. If a tool fails, LLM receives no actionable recovery instructions (retry? lookup alternative? ask user?).
Tool naming lacks specificity for distinction. 'get_customer_details' vs 'get_customers' could be confused without reading descriptions. Should be 'get_customers_list' and 'get_customer_by_id' for clarity, or include business meaning (e.g., 'search_customers_by_name' vs 'get_customer_profile_by_id').
No pagination documented. Tools with 'top' parameter (get_customers, get_items, get_currency_exchange_rates) lack offset/limit or cursor mechanism. No 'total_count' or 'next_cursor' in output spec. Large result sets will blow context window.
Required parameter 'customer_id' (in get_customer_details) and 'item_no' (in get_item_details) accept only system IDs. No guidance on whether LLM should call search_customers() first if it only has a name. Forces multi-step discovery and wastes tokens.