Skip to main content
Glama

MCP Dynamics 365 Commerce Server

by jiantmo
debug_tools_count.py13.4 kB
#!/usr/bin/env python3 """ Debug script to analyze tool count and registration in MCP server """ import os from mcp_dynamics365_commerce_server.server import Dynamics365CommerceServer def analyze_tools(): """Analyze all tools registered in the server""" print("MCP Tools Analysis") print("=" * 60) # Initialize server server = Dynamics365CommerceServer() # Get tools from each controller controllers = [ ('customer_controller', server.customer_controller), ('sales_order_controller', server.sales_order_controller), ('cart_controller', server.cart_controller), ('products_controller', server.products_controller), ('org_units_controller', server.org_units_controller), ('loyalty_card_controller', server.loyalty_card_controller), ('shifts_controller', server.shifts_controller), ('address_controller', server.address_controller), ('barcode_controller', server.barcode_controller), ('cash_declaration_controller', server.cash_declaration_controller), ('cities_controller', server.cities_controller), ('counties_controller', server.counties_controller), ('country_region_controller', server.country_region_controller), ('credit_memo_controller', server.credit_memo_controller), ('suspended_cart_controller', server.suspended_cart_controller), ('tender_types_controller', server.tender_types_controller), ('reason_codes_controller', server.reason_codes_controller), ('pricing_controller', server.pricing_controller), ('delivery_options_controller', server.delivery_options_controller), ('customer_group_controller', server.customer_group_controller), ('currency_controller', server.currency_controller), ('customer_balance_controller', server.customer_balance_controller), ('device_configuration_controller', server.device_configuration_controller), ('language_controller', server.language_controller), # Additional controllers ('app_info_controller', server.app_info_controller), ('async_service_controller', server.async_service_controller), ('attribute_controller', server.attribute_controller), ('attribute_group_controller', server.attribute_group_controller), ('audit_event_controller', server.audit_event_controller), ('card_type_controller', server.card_type_controller), ('catalogs_controller', server.catalogs_controller), ('categories_controller', server.categories_controller), ('commission_sales_group_controller', server.commission_sales_group_controller), ('district_controller', server.district_controller), ('environment_configuration_controller', server.environment_configuration_controller), ('extension_package_definition_controller', server.extension_package_definition_controller), ('extensible_enumeration_controller', server.extensible_enumeration_controller), ('gift_card_controller', server.gift_card_controller), ('hardware_profiles_controller', server.hardware_profiles_controller), ('image_controller', server.image_controller), ('income_expense_accounts_controller', server.income_expense_accounts_controller), ('kits_controller', server.kits_controller), ('localized_string_controller', server.localized_string_controller), ('notification_controller', server.notification_controller), ('number_sequence_controller', server.number_sequence_controller), ('operations_controller', server.operations_controller), ('product_lists_controller', server.product_lists_controller), ('purchase_order_controller', server.purchase_order_controller), ('recommendation_controller', server.recommendation_controller), ('receipt_controller', server.receipt_controller), ('report_datasets_controller', server.report_datasets_controller), ('search_controller', server.search_controller), ('shift_reconciliation_lines_controller', server.shift_reconciliation_lines_controller), ('state_province_controller', server.state_province_controller), ('store_safe_controller', server.store_safe_controller), ('tax_controller', server.tax_controller), ('tender_drop_and_declare_operation_controller', server.tender_drop_and_declare_operation_controller), ('transfer_order_controller', server.transfer_order_controller), ('unit_of_measure_controller', server.unit_of_measure_controller), ('warehouse_controller', server.warehouse_controller), ('zipcodes_controller', server.zipcodes_controller), ('publishing_controller', server.publishing_controller), ('non_sales_transaction_tender_operations_controller', server.non_sales_transaction_tender_operations_controller), ('sales_orders_fulfillment_controller', server.sales_orders_fulfillment_controller), ('scan_result_controller', server.scan_result_controller), ('stock_count_journal_controller', server.stock_count_journal_controller), ] total_tools = 0 all_tool_names = [] print("Controller Analysis:") print("-" * 40) for controller_name, controller in controllers: try: tools = controller.get_tools() tool_count = len(tools) total_tools += tool_count tool_names = [tool.name for tool in tools] all_tool_names.extend(tool_names) print(f"{controller_name:<50} {tool_count:>3} tools") # Show first few tool names for verification if tool_count > 0: sample_tools = tool_names[:3] if len(tool_names) > 3: sample_tools.append("...") print(f" Sample tools: {', '.join(sample_tools)}") else: print(" No tools found!") except Exception as e: print(f"{controller_name:<50} ERROR: {e}") print("-" * 60) print(f"Total Tools: {total_tools}") # Check for duplicates duplicate_tools = set() seen_tools = set() for tool_name in all_tool_names: if tool_name in seen_tools: duplicate_tools.add(tool_name) seen_tools.add(tool_name) if duplicate_tools: print(f"WARNING: Found {len(duplicate_tools)} duplicate tool names:") for dup in sorted(duplicate_tools): print(f" - {dup}") print(f"\nUnique Tools: {len(seen_tools)}") # Show distribution by prefix print("\nTool Distribution by Prefix:") print("-" * 30) prefixes = {} for tool_name in all_tool_names: prefix = tool_name.split('_')[0] prefixes[prefix] = prefixes.get(prefix, 0) + 1 for prefix, count in sorted(prefixes.items()): print(f"{prefix:<20} {count:>3} tools") return total_tools, len(seen_tools), all_tool_names def compare_with_server_registration(): """Compare with actual server registration""" print("\n" + "=" * 60) print("Server Registration Analysis") print("=" * 60) server = Dynamics365CommerceServer() # Get tools as they would be registered in list_tools registered_tools = [] # This mirrors the list_tools function in server.py registered_tools.extend(server.customer_controller.get_tools()) registered_tools.extend(server.sales_order_controller.get_tools()) registered_tools.extend(server.cart_controller.get_tools()) registered_tools.extend(server.products_controller.get_tools()) registered_tools.extend(server.org_units_controller.get_tools()) registered_tools.extend(server.loyalty_card_controller.get_tools()) registered_tools.extend(server.shifts_controller.get_tools()) registered_tools.extend(server.address_controller.get_tools()) registered_tools.extend(server.barcode_controller.get_tools()) registered_tools.extend(server.cash_declaration_controller.get_tools()) registered_tools.extend(server.cities_controller.get_tools()) registered_tools.extend(server.counties_controller.get_tools()) registered_tools.extend(server.country_region_controller.get_tools()) registered_tools.extend(server.credit_memo_controller.get_tools()) registered_tools.extend(server.suspended_cart_controller.get_tools()) registered_tools.extend(server.tender_types_controller.get_tools()) registered_tools.extend(server.reason_codes_controller.get_tools()) registered_tools.extend(server.pricing_controller.get_tools()) registered_tools.extend(server.delivery_options_controller.get_tools()) registered_tools.extend(server.customer_group_controller.get_tools()) registered_tools.extend(server.currency_controller.get_tools()) registered_tools.extend(server.customer_balance_controller.get_tools()) registered_tools.extend(server.device_configuration_controller.get_tools()) registered_tools.extend(server.language_controller.get_tools()) # Newly added registered_tools.extend(server.app_info_controller.get_tools()) registered_tools.extend(server.async_service_controller.get_tools()) registered_tools.extend(server.attribute_controller.get_tools()) registered_tools.extend(server.attribute_group_controller.get_tools()) registered_tools.extend(server.audit_event_controller.get_tools()) registered_tools.extend(server.card_type_controller.get_tools()) registered_tools.extend(server.catalogs_controller.get_tools()) registered_tools.extend(server.categories_controller.get_tools()) registered_tools.extend(server.commission_sales_group_controller.get_tools()) registered_tools.extend(server.district_controller.get_tools()) registered_tools.extend(server.environment_configuration_controller.get_tools()) registered_tools.extend(server.extension_package_definition_controller.get_tools()) registered_tools.extend(server.extensible_enumeration_controller.get_tools()) registered_tools.extend(server.gift_card_controller.get_tools()) registered_tools.extend(server.hardware_profiles_controller.get_tools()) registered_tools.extend(server.image_controller.get_tools()) registered_tools.extend(server.income_expense_accounts_controller.get_tools()) registered_tools.extend(server.kits_controller.get_tools()) registered_tools.extend(server.localized_string_controller.get_tools()) registered_tools.extend(server.notification_controller.get_tools()) registered_tools.extend(server.number_sequence_controller.get_tools()) registered_tools.extend(server.operations_controller.get_tools()) registered_tools.extend(server.product_lists_controller.get_tools()) registered_tools.extend(server.purchase_order_controller.get_tools()) registered_tools.extend(server.recommendation_controller.get_tools()) registered_tools.extend(server.receipt_controller.get_tools()) registered_tools.extend(server.report_datasets_controller.get_tools()) registered_tools.extend(server.search_controller.get_tools()) registered_tools.extend(server.shift_reconciliation_lines_controller.get_tools()) registered_tools.extend(server.state_province_controller.get_tools()) registered_tools.extend(server.store_safe_controller.get_tools()) registered_tools.extend(server.tax_controller.get_tools()) registered_tools.extend(server.tender_drop_and_declare_operation_controller.get_tools()) registered_tools.extend(server.transfer_order_controller.get_tools()) registered_tools.extend(server.unit_of_measure_controller.get_tools()) registered_tools.extend(server.warehouse_controller.get_tools()) registered_tools.extend(server.zipcodes_controller.get_tools()) registered_tools.extend(server.publishing_controller.get_tools()) registered_tools.extend(server.non_sales_transaction_tender_operations_controller.get_tools()) registered_tools.extend(server.sales_orders_fulfillment_controller.get_tools()) registered_tools.extend(server.scan_result_controller.get_tools()) registered_tools.extend(server.stock_count_journal_controller.get_tools()) print(f"Tools registered in server: {len(registered_tools)}") return len(registered_tools) def main(): """Main analysis function""" total_tools, unique_tools, all_tool_names = analyze_tools() registered_count = compare_with_server_registration() print("\n" + "=" * 60) print("SUMMARY") print("=" * 60) print(f"Expected tools (from README): 386") print(f"Total tools found: {total_tools}") print(f"Unique tools: {unique_tools}") print(f"Registered in server: {registered_count}") print(f"Claude Desktop shows: 320 (reported)") print(f"\nDiscrepancy Analysis:") if total_tools != 386: print(f" - Missing {386 - total_tools} tools from expected count") if unique_tools != total_tools: print(f" - {total_tools - unique_tools} duplicate tool names found") if registered_count != unique_tools: print(f" - Registration mismatch: {abs(registered_count - unique_tools)} tools") if registered_count != 320: print(f" - Claude Desktop shows {320}, server has {registered_count}") if __name__ == "__main__": main()

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/jiantmo/mcp-commerce'

If you have feedback or need assistance with the MCP directory API, please join our Discord server