Dynamics 365 Finance & Operations 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., "@Dynamics 365 Finance & Operations MCP Serverlist the top 10 sales orders for company USMF"
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.
Dynamics 365 Finance & Operations MCP Server
Production-ready Model Context Protocol (MCP) server that exposes the full capabilities of Microsoft Dynamics 365 Finance & Operations (D365 F&O) to AI assistants and other MCP-compatible tools. This enables sophisticated Dynamics 365 integration workflows through standardized protocol interactions.
🚀 One-Click Installation for VS Code:
🐳 Docker Installation for VS Code:
☁️ Deploy to Azure Container Apps:
Deploy the MCP server as a secure, internet-accessible HTTP endpoint with OAuth or API Key authentication. Perfect for web integrations and remote AI assistant access.
Option 1: Using Bash Script (Recommended)
# Download and run the deployment script
curl -O https://raw.githubusercontent.com/mafzaal/d365fo-client/main/deploy-aca.sh
chmod +x deploy-aca.sh
# Set authentication (choose OAuth or API Key)
export D365FO_MCP_AUTH_CLIENT_ID="your-client-id"
export D365FO_MCP_AUTH_CLIENT_SECRET="your-client-secret"
export D365FO_MCP_AUTH_TENANT_ID="your-tenant-id"
# OR
export D365FO_MCP_API_KEY_VALUE="your-secret-key"
# Deploy
./deploy-aca.shOption 2: Using ARM Template
Download azure-deploy.json
Click "Build your own template in the editor"
Paste the contents of
azure-deploy.jsonFill in the parameters and deploy
Also includes a comprehensive Python client library for Microsoft Dynamics 365 Finance & Operations with OData endpoints, metadata operations, label management, and CLI tools.
MCP Server Overview
The d365fo-client includes a production-ready Model Context Protocol (MCP) server (d365fo-fastmcp-server) built on the FastMCP framework that exposes the full capabilities of D365 Finance & Operations to AI assistants and other MCP-compatible tools.
The server provides multi-transport support (stdio, HTTP, SSE) with enhanced performance and deployment flexibility.
Key Features
49 comprehensive tools covering all major D365 F&O operations across 9 functional categories
12 resource types with comprehensive metadata exposure and discovery capabilities
2 prompt templates for advanced workflow assistance
Multi-transport support (FastMCP): stdio, HTTP, Server-Sent Events (SSE)
Production-ready implementation with proper error handling, authentication, and security validation
Enhanced performance (FastMCP): 40% faster startup, 15% lower memory usage
Advanced profile management supporting multiple environments with secure credential storage
Database analysis capabilities with secure SQL querying and metadata insights
Session-based synchronization with detailed progress tracking and multiple sync strategies
Multi-language support with label resolution and localization capabilities
Enterprise security with Azure AD integration, Key Vault support, and audit logging
New in v0.3.0
🔧 Pydantic Settings Model: Type-safe environment variable management with validation for 35+ configuration options
📂 Custom Log File Support:
D365FO_LOG_FILEenvironment variable for flexible log file paths🔄 Legacy Config Migration: Automatic detection and migration of legacy configuration files
🌐 Environment Variable Standardization: All MCP HTTP variables now use
D365FO_prefix for consistency⚡ Enhanced FastMCP Server: Improved startup configuration, error handling, and graceful shutdown
🔀 MCP Return Type Standardization: All MCP tools now return dictionaries instead of JSON strings for better type safety
🛠️ Enhanced Configuration: Support for
.envfiles and comprehensive environment variable documentation
Quick Start
Installation and Setup
# Install d365fo-client with MCP dependencies
pip install d365fo-client
# Set up environment variables
export D365FO_BASE_URL="https://your-environment.dynamics.com"
export D365FO_CLIENT_ID="your-client-id" # Optional with default credentials
export D365FO_CLIENT_SECRET="your-client-secret" # Optional with default credentials
export D365FO_TENANT_ID="your-tenant-id" # Optional with default credentialsFastMCP Server (Recommended)
The modern FastMCP implementation provides enhanced performance and multiple transport options:
# Development (stdio transport - default)
d365fo-fastmcp-server
# Production HTTP API
d365fo-fastmcp-server --transport http --port 8000 --host 0.0.0.0
# Real-time Web Applications (SSE)
d365fo-fastmcp-server --transport sse --port 8001 --host 0.0.0.0Key Benefits:
Optimized performance with FastMCP framework
Efficient resource usage through optimized architecture
Multi-transport support: stdio, HTTP, Server-Sent Events (SSE)
Enhanced error handling with better async/await support
Production ready with web transports for API integration
Integration with AI Assistants
VS Code Integration (Recommended)
FastMCP Server with Default Credentials:
Add to your VS Code mcp.json for GitHub Copilot with MCP:
{
"servers": {
"d365fo-fastmcp-server": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"d365fo-client@latest",
"d365fo-fastmcp-server"
],
"env": {
"D365FO_BASE_URL": "https://your-environment.dynamics.com",
"D365FO_LOG_LEVEL": "INFO"
}
}
}
}Option 2: Explicit Credentials For environments requiring service principal authentication:
{
"servers": {
"d365fo-fastmcp-server": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"d365fo-client",
"d365fo-fastmcp-server"
],
"env": {
"D365FO_BASE_URL": "https://your-environment.dynamics.com",
"D365FO_LOG_LEVEL": "DEBUG",
"D365FO_CLIENT_ID": "${input:client_id}",
"D365FO_CLIENT_SECRET": "${input:client_secret}",
"D365FO_TENANT_ID": "${input:tenant_id}"
}
}
},
"inputs": [
{
"id": "tenant_id",
"type": "promptString",
"description": "Azure AD Tenant ID for D365 F&O authentication",
"password": true
},
{
"id": "client_id",
"type": "promptString",
"description": "Azure AD Client ID for D365 F&O authentication",
"password": true
},
{
"id": "client_secret",
"type": "promptString",
"description": "Azure AD Client Secret for D365 F&O authentication",
"password": true
}
]
}Option 3: Docker Integration For containerized environments and enhanced isolation:
{
"servers": {
"d365fo-fastmcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-v",
"d365fo-mcp:/home/mcp_user/",
"-e",
"D365FO_CLIENT_ID=${input:client_id}",
"-e",
"D365FO_CLIENT_SECRET=${input:client_secret}",
"-e",
"D365FO_TENANT_ID=${input:tenant_id}",
"ghcr.io/mafzaal/d365fo-client:latest"
],
"env": {
"D365FO_LOG_LEVEL": "DEBUG",
"D365FO_CLIENT_ID": "${input:client_id}",
"D365FO_CLIENT_SECRET": "${input:client_secret}",
"D365FO_TENANT_ID": "${input:tenant_id}"
}
}
},
"inputs": [
{
"id": "tenant_id",
"type": "promptString",
"description": "Azure AD Tenant ID for D365 F&O authentication",
"password": true
},
{
"id": "client_id",
"type": "promptString",
"description": "Azure AD Client ID for D365 F&O authentication",
"password": true
},
{
"id": "client_secret",
"type": "promptString",
"description": "Azure AD Client Secret for D365 F&O authentication",
"password": true
}
]
}Benefits of Docker approach:
Complete environment isolation and reproducibility
No local Python installation required
Consistent runtime environment across different systems
Automatic dependency management with pre-built image
Enhanced security through containerization
Persistent data storage via Docker volume (
d365fo-mcp)
Prerequisites:
Docker installed and running
Access to Docker Hub or GitHub Container Registry
Network access for pulling the container image
Claude Desktop Integration
FastMCP Server: Add to your Claude Desktop configuration:
{
"mcpServers": {
"d365fo-fastmcp": {
"command": "uvx",
"args": [
"--from",
"d365fo-client",
"d365fo-fastmcp-server"
],
"env": {
"D365FO_BASE_URL": "https://your-environment.dynamics.com",
"D365FO_LOG_LEVEL": "INFO"
}
}
}
}Traditional MCP Server (Alternative):
{
"mcpServers": {
"d365fo": {
"command": "uvx",
"args": [
"--from",
"d365fo-client",
"d365fo-fastmcp-server"
],
"env": {
"D365FO_BASE_URL": "https://your-environment.dynamics.com",
"D365FO_LOG_LEVEL": "INFO"
}
}
}
}Benefits of uvx approach:
Always uses the latest version from the repository
No local installation required
Automatic dependency management
Works across different environments
Web Integration with FastMCP
The FastMCP server provides HTTP and SSE transports for web application integration:
HTTP Transport for Web APIs
import aiohttp
import json
async def call_d365fo_api():
"""Example: Using HTTP transport for web API integration"""
# Start FastMCP server with HTTP transport
# d365fo-fastmcp-server --transport http --port 8000
mcp_request = {
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "d365fo_query_entities",
"arguments": {
"entityName": "CustomersV3",
"top": 10,
"select": ["CustomerAccount", "Name"]
}
}
}
async with aiohttp.ClientSession() as session:
async with session.post(
"http://localhost:8000/mcp",
json=mcp_request,
headers={"Content-Type": "application/json"}
) as response:
result = await response.json()
print(json.dumps(result, indent=2))SSE Transport for Real-time Applications
// Example: JavaScript client for real-time D365FO data
// Start FastMCP server: d365fo-fastmcp-server --transport sse --port 8001
const eventSource = new EventSource('http://localhost:8001/sse');
eventSource.onmessage = function(event) {
const data = JSON.parse(event.data);
console.log('Received D365FO data:', data);
// Handle real-time updates from D365FO
if (data.method === 'notification') {
updateDashboard(data.params);
}
};
// Send MCP requests via SSE
function queryCustomers() {
const request = {
jsonrpc: "2.0",
id: Date.now(),
method: "tools/call",
params: {
name: "d365fo_search_entities",
arguments: {
pattern: "customer",
limit: 50
}
}
};
fetch('http://localhost:8001/sse/send', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(request)
});
}Alternative: Programmatic Usage
from d365fo_client.mcp import D365FOMCPServer
# Create and run server with custom configuration
config = {
"default_environment": {
"base_url": "https://your-environment.dynamics.com",
"use_default_credentials": True
}
}
server = D365FOMCPServer(config)
await server.run()Custom MCP Clients
Connect using any MCP-compatible client library:
from mcp import Client
async with Client("d365fo-fastmcp-server") as client:
# Discover available tools
tools = await client.list_tools()
# Execute operations
result = await client.call_tool(
"d365fo_query_entities",
{"entityName": "Customers", "top": 5}
)Docker Deployment
For containerized environments and production deployments:
Pull the Docker Image:
# Pull from GitHub Container Registry
docker pull ghcr.io/mafzaal/d365fo-client:latest
# Or pull a specific version
docker pull ghcr.io/mafzaal/d365fo-client:v0.2.3Standalone Docker Usage:
# Run MCP server with environment variables
docker run --rm -i \
-e D365FO_BASE_URL="https://your-environment.dynamics.com" \
-e D365FO_CLIENT_ID="your-client-id" \
-e D365FO_CLIENT_SECRET="your-client-secret" \
-e D365FO_TENANT_ID="your-tenant-id" \
-e D365FO_LOG_LEVEL="INFO" \
-v d365fo-mcp:/home/mcp_user/ \
ghcr.io/mafzaal/d365fo-client:latest
# Run CLI commands with Docker
docker run --rm -it \
-e D365FO_BASE_URL="https://your-environment.dynamics.com" \
-e D365FO_CLIENT_ID="your-client-id" \
-e D365FO_CLIENT_SECRET="your-client-secret" \
-e D365FO_TENANT_ID="your-tenant-id" \
ghcr.io/mafzaal/d365fo-client:latest \
d365fo-client entities --limit 10Docker Compose Example:
version: '3.8'
services:
d365fo-mcp:
image: ghcr.io/mafzaal/d365fo-client:latest
environment:
- D365FO_BASE_URL=https://your-environment.dynamics.com
- D365FO_CLIENT_ID=${D365FO_CLIENT_ID}
- D365FO_CLIENT_SECRET=${D365FO_CLIENT_SECRET}
- D365FO_TENANT_ID=${D365FO_TENANT_ID}
- D365FO_LOG_LEVEL=INFO
volumes:
- d365fo-mcp:/home/mcp_user/
stdin_open: true
tty: true
volumes:
d365fo-mcp:Docker Benefits:
Complete environment isolation and reproducibility
No local Python installation required
Consistent runtime environment across different systems
Built-in dependency management
Enhanced security through containerization
Persistent data storage via Docker volumes
Easy integration with orchestration platforms (Kubernetes, Docker Swarm)
Architecture Benefits
For AI Assistants
Standardized Interface: Consistent MCP protocol access to D365 F&O
Rich Metadata: Self-describing entities and operations
Type Safety: Schema validation for all operations
Error Context: Detailed error information for troubleshooting
For Developers
Minimal Integration: Standard MCP client libraries
Comprehensive Coverage: Full D365 F&O functionality exposed
Performance Optimized: Efficient connection and caching strategies
Well Documented: Complete API documentation and examples
For Organizations
Secure Access: Enterprise-grade authentication (Azure AD, Managed Identity)
Audit Logging: Complete operation tracking and monitoring
Scalable Design: Connection pooling and session management
Maintenance Friendly: Clear architecture and comprehensive test coverage
Troubleshooting
Common Issues
Connection Failures
# Test connectivity
d365fo-client version app --base-url https://your-environment.dynamics.com
# Check logs
tail -f ~/.d365fo-mcp/logs/mcp-server.logAuthentication Issues
# Verify Azure CLI authentication
az account show
# Test with explicit credentials
export D365FO_CLIENT_ID="your-client-id"
# ... set other variables
d365fo-fastmcp-serverPerformance Issues
# Enable debug logging
export D365FO_LOG_LEVEL="DEBUG"
# Adjust connection settings
export D365FO_CONNECTION_TIMEOUT="120"
export D365FO_MAX_CONCURRENT_REQUESTS="5"Getting Help
Logs: Check
~/.d365fo-mcp/logs/mcp-server.logfor detailed error informationEnvironment: Use
d365fo_get_environment_infotool to check system statusDocumentation: See MCP Implementation Summary for technical details
Issues: Report problems at GitHub Issues
MCP Tools
The server provides 49 comprehensive tools organized into functional categories:
Connection & Environment Tools (2 tools)
d365fo_test_connection- Test connectivity and authentication with performance metrics and error diagnosticsd365fo_get_environment_info- Get comprehensive environment details including versions, configurations, and capabilities
CRUD Operations Tools (7 tools)
d365fo_query_entities- Simplified OData querying with 'eq' filtering, wildcard patterns, field selection, and paginationd365fo_get_entity_record- Retrieve specific records by key with expansion options and ETag supportd365fo_create_entity_record- Create new entity records with validation and business logic executiond365fo_update_entity_record- Update existing records with partial updates and optimistic concurrency controld365fo_delete_entity_record- Delete entity records with referential integrity checking and cascading rulesd365fo_call_action- Execute OData actions and functions for complex business operationsd365fo_call_json_service- Call generic JSON service endpoints with parameter support and response handling
Metadata Discovery Tools (6 tools)
d365fo_search_entities- Search entities by pattern with category filtering and full-text search capabilitiesd365fo_get_entity_schema- Get detailed entity schemas with properties, relationships, and label resolutiond365fo_search_actions- Search available OData actions with binding type and parameter informationd365fo_search_enumerations- Search system enumerations with keyword-based filteringd365fo_get_enumeration_fields- Get detailed enumeration member information with multi-language supportd365fo_get_installed_modules- Retrieve information about installed modules and their configurations
Label Management Tools (2 tools)
d365fo_get_label- Get single label text by ID with multi-language support and fallback optionsd365fo_get_labels_batch- Get multiple labels efficiently with batch processing and performance optimization
Profile Management Tools (14 tools)
d365fo_list_profiles- List all configured D365FO environment profiles with status informationd365fo_get_profile- Get detailed configuration information for specific profilesd365fo_create_profile- Create new environment profiles with comprehensive authentication optionsd365fo_update_profile- Modify existing profile configurations with partial update supportd365fo_delete_profile- Remove environment profiles with proper cleanup and validationd365fo_set_default_profile- Designate a specific profile as the default for operationsd365fo_get_default_profile- Retrieve information about the currently configured default profiled365fo_validate_profile- Validate profile configurations for completeness and security complianced365fo_test_profile_connection- Test connectivity and authentication for specific profilesd365fo_clone_profile- Clone existing profiles with customization options for new environmentsd365fo_search_profiles- Search profiles by pattern with filtering and sorting capabilitiesd365fo_get_profile_names- Get simplified list of available profile names for quick referenced365fo_import_profiles- Import profile configurations from external sources or backupsd365fo_export_profiles- Export profile configurations for backup or deployment purposes
Database Analysis Tools (4 tools)
d365fo_execute_sql_query- Execute SELECT queries against metadata database with security validationd365fo_get_database_schema- Get comprehensive database schema information including relationshipsd365fo_get_table_info- Get detailed information about specific database tables with sample datad365fo_get_database_statistics- Generate database statistics and analytics for performance monitoring
Synchronization Tools (5 tools)
d365fo_start_sync- Initiate metadata synchronization with various strategies and session trackingd365fo_get_sync_progress- Monitor detailed progress of sync sessions with time estimatesd365fo_cancel_sync- Cancel running sync sessions with graceful cleanupd365fo_list_sync_sessions- List all active sync sessions with status and progress informationd365fo_get_sync_history- Get history of completed sync sessions with success/failure status and statistics
SRS Reporting Tools (6 tools)
d365fo_download_srs_report- Download SQL Server Reporting Services (SRS) reports with parameter supportd365fo_download_sales_confirmation- Download sales confirmation reports in various formatsd365fo_download_purchase_order- Download purchase order documents with formatting optionsd365fo_download_customer_invoice- Download customer invoice reports with customizationd365fo_download_free_text_invoice- Download free text invoice documentsd365fo_download_debit_credit_note- Download debit and credit note reports
Performance Monitoring Tools (3 tools)
d365fo_get_server_performance- Get server performance metrics and statisticsd365fo_get_server_config- Get server configuration information and system settingsd365fo_reset_performance_stats- Reset performance statistics and counters for fresh monitoring
📖 For detailed information about all MCP tools including usage examples and best practices, see the Comprehensive MCP Tools Introduction.
🤖 For AI agents and assistants, see the AI Agent Guide for structured workflows, best practices, and automation patterns.
MCP Resources
The server exposes four types of resources for discovery and access:
Entity Resources
Access entity metadata and sample data:
d365fo://entities/CustomersV3 # Customer entity with metadata and sample data
d365fo://entities/SalesOrders # Sales order entity information
d365fo://entities/Products # Product entity detailsMetadata Resources
Access system-wide metadata:
d365fo://metadata/entities # All data entities metadata (V2 cache)
d365fo://metadata/actions # Available OData actions
d365fo://metadata/enumerations # System enumerations
d365fo://metadata/labels # System labels and translationsEnvironment Resources
Access environment status and information:
d365fo://environment/status # Environment health and connectivity
d365fo://environment/version # Version information (app, platform, build)
d365fo://environment/cache # Cache status and statistics V2Query Resources
Access predefined and templated queries:
d365fo://queries/customers_recent # Recent customers query template
d365fo://queries/sales_summary # Sales summary query with parametersDatabase Resources (New in V2)
Access metadata database queries:
d365fo://database/entities # SQL-based entity searches with FTS5
d365fo://database/actions # Action discovery with metadata
d365fo://database/statistics # Cache and performance statisticsUsage Examples
Basic Tool Execution
{
"tool": "d365fo_query_entities",
"arguments": {
"entityName": "CustomersV3",
"select": ["CustomerAccount", "Name", "Email"],
"filter": "CustomerGroup eq 'VIP'",
"top": 10
}
}Entity Schema Discovery
{
"tool": "d365fo_get_entity_schema",
"arguments": {
"entityName": "CustomersV3",
"includeProperties": true,
"resolveLabels": true,
"language": "en-US"
}
}Environment Information
{
"tool": "d365fo_get_environment_info",
"arguments": {}
}Authentication & Configuration
Default Credentials (Recommended)
Uses Azure Default Credential chain (Managed Identity, Azure CLI, etc.):
export D365FO_BASE_URL="https://your-environment.dynamics.com"
# No additional auth environment variables needed
d365fo-fastmcp-serverExplicit Credentials
For service principal authentication:
export D365FO_BASE_URL="https://your-environment.dynamics.com"
export D365FO_CLIENT_ID="your-client-id"
export D365FO_CLIENT_SECRET="your-client-secret"
export D365FO_TENANT_ID="your-tenant-id"
d365fo-fastmcp-serverAzure Key Vault Integration (New in v0.2.3)
For secure credential storage using Azure Key Vault:
export D365FO_BASE_URL="https://your-environment.dynamics.com"
export D365FO_CREDENTIAL_SOURCE="keyvault"
export D365FO_KEYVAULT_URL="https://your-keyvault.vault.azure.net/"
d365fo-fastmcp-serverAdvanced Configuration
New in v0.3.0: Comprehensive environment variable management with type safety and validation using Pydantic settings.
Create a configuration file or set additional environment variables:
# === Core D365FO Connection Settings ===
export D365FO_BASE_URL="https://your-environment.dynamics.com"
export D365FO_CLIENT_ID="your-client-id"
export D365FO_CLIENT_SECRET="your-client-secret"
export D365FO_TENANT_ID="your-tenant-id"
# === Logging Configuration ===
export D365FO_LOG_LEVEL="DEBUG" # DEBUG, INFO, WARNING, ERROR, CRITICAL
export D365FO_LOG_FILE="/custom/path/server.log" # Custom log file path
# === MCP Server Transport Settings (v0.3.0+) ===
export D365FO_MCP_TRANSPORT="stdio" # stdio, sse, http, streamable-http
export D365FO_MCP_HTTP_HOST="0.0.0.0" # HTTP host (default: 127.0.0.1)
export D365FO_MCP_HTTP_PORT="8000" # HTTP port (default: 8000)
export D365FO_MCP_HTTP_STATELESS="true" # Enable stateless mode
export D365FO_MCP_HTTP_JSON="true" # Enable JSON response mode
# === Cache and Performance Settings ===
export D365FO_CACHE_DIR="/custom/cache/path" # General cache directory
export D365FO_META_CACHE_DIR="/custom/metadata/cache" # Metadata cache directory
export D365FO_LABEL_CACHE="true" # Enable label caching (default: true)
export D365FO_LABEL_EXPIRY="1440" # Label cache expiry in minutes (24 hours)
export D365FO_USE_CACHE_FIRST="true" # Use cache before API calls
# === Connection and Performance Tuning ===
export D365FO_TIMEOUT="60" # General timeout in seconds
export D365FO_MCP_MAX_CONCURRENT_REQUESTS="10" # Max concurrent requests
export D365FO_MCP_REQUEST_TIMEOUT="30" # Request timeout in seconds
export D365FO_VERIFY_SSL="true" # Verify SSL certificates
# === MCP Authentication Settings (Advanced) ===
export D365FO_MCP_AUTH_CLIENT_ID="your-mcp-client-id"
export D365FO_MCP_AUTH_CLIENT_SECRET="your-mcp-client-secret"
export D365FO_MCP_AUTH_TENANT_ID="your-mcp-tenant-id"
export D365FO_MCP_AUTH_BASE_URL="http://localhost:8000"
export D365FO_MCP_AUTH_REQUIRED_SCOPES="User.Read,email,openid,profile"
# === Debug Settings ===
export DEBUG="true" # Enable debug modeEnvironment File Support: You can also create a .env file in your project directory with these variables for development convenience.
Related MCP server: D365 Finance & Operations MCP Server
Python Client Library
Features
🔗 OData Client: Full CRUD operations on D365 F&O data entities with composite key support
📊 Metadata Management V2: Enhanced caching system with intelligent synchronization and FTS5 search
🏷️ Label Operations V2: Multilingual label caching with performance improvements and async support
🔍 Advanced Querying: Support for all OData query parameters ($select, $filter, $expand, etc.)
⚡ Action Execution: Execute bound and unbound OData actions with comprehensive parameter handling
�️ JSON Services: Generic access to D365 F&O JSON service endpoints (/api/services pattern)
�🔒 Authentication: Azure AD integration with default credentials, service principal, and Azure Key Vault support
💾 Intelligent Caching: Cross-environment cache sharing with module-based version detection
🌐 Async/Await: Modern async/await patterns with optimized session management
📝 Type Hints: Full type annotation support with enhanced data models
🤖 MCP Server: Production-ready Model Context Protocol server with 49 tools and 4 resource types
🖥️ Comprehensive CLI: Hierarchical command-line interface for all D365 F&O operations
🧪 Multi-tier Testing: Mock, sandbox, and live integration testing framework (17/17 tests passing)
📋 Metadata Scripts: PowerShell and Python utilities for entity, enumeration, and action discovery
🔐 Enhanced Credential Management: Support for Azure Key Vault and multiple credential sources
📊 Advanced Sync Management: Session-based synchronization with detailed progress tracking
🔧 NEW v0.3.0: Pydantic settings model with type-safe environment variable validation
📂 NEW v0.3.0: Custom log file path support and flexible logging configuration
🔄 NEW v0.3.0: Automatic legacy configuration migration and compatibility layer
Installation
# Install from PyPI
pip install d365fo-client
# Or install from source
git clone https://github.com/mafzaal/d365fo-client.git
cd d365fo-client
uv sync # Installs with exact dependencies from uv.lock
# Or use Docker (no local installation required)
docker pull ghcr.io/mafzaal/d365fo-client:latest
# Run with Docker
docker run --rm -it \
-e D365FO_BASE_URL="https://your-environment.dynamics.com" \
-e D365FO_CLIENT_ID="your-client-id" \
-e D365FO_CLIENT_SECRET="your-client-secret" \
-e D365FO_TENANT_ID="your-tenant-id" \
-v d365fo-mcp:/home/mcp_user/ \
ghcr.io/mafzaal/d365fo-client:latestNote: The package includes MCP (Model Context Protocol) dependencies by default, enabling AI assistant integration. Both d365fo-client CLI and d365fo-fastmcp-server commands will be available after installation.
Breaking Change in v0.2.3: Environment variable names have been updated for consistency:
AZURE_CLIENT_ID→D365FO_CLIENT_IDAZURE_CLIENT_SECRET→D365FO_CLIENT_SECRETAZURE_TENANT_ID→D365FO_TENANT_ID
Please update your environment variables accordingly when upgrading.
Python Client Quick Start
Command Line Interface (CLI)
d365fo-client provides a comprehensive CLI with hierarchical commands for interacting with Dynamics 365 Finance & Operations APIs and metadata. The CLI supports all major operations including entity management, metadata discovery, and system administration.
Usage
# Use the installed CLI command
d365fo-client [GLOBAL_OPTIONS] COMMAND [SUBCOMMAND] [OPTIONS]
# Alternative: Module execution
python -m d365fo_client.main [OPTIONS] COMMAND [ARGS]Command Categories
Entity Operations
# List entities with filtering
d365fo-client entities list --pattern "customer" --limit 10
# Get entity details and schema
d365fo-client entities get CustomersV3 --properties --keys --labels
# CRUD operations
d365fo-client entities create Customers --data '{"CustomerAccount":"US-999","Name":"Test"}'
d365fo-client entities update Customers US-999 --data '{"Name":"Updated Name"}'
d365fo-client entities delete Customers US-999Metadata Operations
# Search and discover entities
d365fo-client metadata entities --search "sales" --output json
# Get available actions
d365fo-client metadata actions --pattern "calculate" --limit 5
# Enumerate system enumerations
d365fo-client metadata enums --search "status" --output table
# Synchronize metadata cache
d365fo-client metadata sync --force-refreshVersion Information
# Get application versions
d365fo-client version app
d365fo-client version platform
d365fo-client version buildLabel Operations
# Resolve single label
d365fo-client labels resolve "@SYS13342"
# Search labels by pattern
d365fo-client labels search "customer" --language "en-US"JSON Service Operations
# Call SQL diagnostic services
d365fo-client service sql-diagnostic GetAxSqlExecuting
d365fo-client service sql-diagnostic GetAxSqlResourceStats --since-minutes 5
d365fo-client service sql-diagnostic GetAxSqlBlocking --output json
# Generic JSON service calls
d365fo-client service call SysSqlDiagnosticService SysSqlDiagnosticServiceOperations GetAxSqlExecuting
d365fo-client service call YourServiceGroup YourServiceName YourOperation --parameters '{"param1":"value1"}'Global Options
--base-url URL— Specify D365 F&O environment URL--profile NAME— Use named configuration profile--output FORMAT— Output format: json, table, csv, yaml (default: table)--verbose— Enable verbose output for debugging--timeout SECONDS— Request timeout (default: 30)
Configuration Profiles
Create reusable configurations in ~/.d365fo-client/config.yaml:
profiles:
production:
base_url: "https://prod.dynamics.com"
use_default_credentials: true
timeout: 60
development:
base_url: "https://dev.dynamics.com"
client_id: "${D365FO_CLIENT_ID}"
client_secret: "${D365FO_CLIENT_SECRET}"
tenant_id: "${D365FO_TENANT_ID}"
use_cache_first: true
default_profile: "development"Examples
# Quick entity discovery
d365fo-client entities list --pattern "cust.*" --output json
# Get comprehensive entity information
d365fo-client entities get CustomersV3 --properties --keys --labels --output yaml
# Search for calculation actions
d365fo-client metadata actions --pattern "calculate|compute" --output table
# Test environment connectivity
d365fo-client version app --verboseFor a complete command reference:
d365fo-client --help
d365fo-client entities --help
d365fo-client metadata --helpBasic Usage
import asyncio
from d365fo_client import D365FOClient, FOClientConfig
async def main():
# Simple configuration with default credentials
config = FOClientConfig(
base_url="https://your-fo-environment.dynamics.com",
use_default_credentials=True # Uses Azure Default Credential
)
async with D365FOClient(config) as client:
# Test connection
if await client.test_connection():
print("✅ Connected successfully!")
# Get environment information
env_info = await client.get_environment_info()
print(f"Environment: {env_info.application_version}")
# Search for entities (uses metadata cache v2)
customer_entities = await client.search_entities("customer")
print(f"Found {len(customer_entities)} customer entities")
# Get customers with query options
from d365fo_client import QueryOptions
options = QueryOptions(
select=["CustomerAccount", "Name", "SalesCurrencyCode"],
top=10,
orderby=["Name"]
)
customers = await client.get_data("/data/CustomersV3", options)
print(f"Retrieved {len(customers['value'])} customers")
if __name__ == "__main__":
asyncio.run(main())Using Convenience Function
from d365fo_client import create_client
# Quick client creation with enhanced defaults
async with create_client("https://your-fo-environment.dynamics.com") as client:
customers = await client.get_data("/data/CustomersV3", top=5)Configuration
Environment Variable Management (New in v0.3.0)
The d365fo-client now includes a comprehensive Pydantic settings model for type-safe environment variable management:
from d365fo_client import D365FOSettings, get_settings
# Get type-safe settings instance
settings = get_settings()
# Access settings with full IntelliSense support
print(f"Base URL: {settings.base_url}")
print(f"Log Level: {settings.log_level}")
print(f"Cache Directory: {settings.cache_dir}")
# Check configuration state
if settings.has_client_credentials():
print("Client credentials configured")
startup_mode = settings.get_startup_mode() # "profile_only", "default_auth", "client_credentials"
# Convert to environment dictionary for external tools
env_vars = settings.to_env_dict()Key Benefits:
Type Safety: Automatic validation and type conversion for all 35+ environment variables
IDE Support: Full IntelliSense and autocompletion for configuration options
Environment Files: Support for
.envfiles in developmentComprehensive Defaults: Sensible defaults for all configuration options
Validation: Built-in validation for URLs, ports, timeouts, and other settings
Authentication Options
from d365fo_client import FOClientConfig
# Option 1: Default Azure credentials (recommended)
config = FOClientConfig(
base_url="https://your-fo-environment.dynamics.com",
use_default_credentials=True
)
# Option 2: Client credentials
config = FOClientConfig(
base_url="https://your-fo-environment.dynamics.com",
client_id="your-client-id",
client_secret="your-client-secret",
tenant_id="your-tenant-id",
use_default_credentials=False
)
# Option 3: Azure Key Vault integration (New in v0.2.3)
config = FOClientConfig(
base_url="https://your-fo-environment.dynamics.com",
credential_source="keyvault", # Use Azure Key Vault for credentials
keyvault_url="https://your-keyvault.vault.azure.net/"
)
# Option 4: With custom settings
config = FOClientConfig(
base_url="https://your-fo-environment.dynamics.com",
use_default_credentials=True,
verify_ssl=False, # For development environments
timeout=60, # Request timeout in seconds
metadata_cache_dir="./my_cache", # Custom cache directory
use_label_cache=True, # Enable label caching
label_cache_expiry_minutes=120 # Cache for 2 hours
)Legacy Configuration Migration (New in v0.3.0)
The d365fo-client automatically detects and migrates legacy configuration files:
Automatic Detection: Identifies legacy configuration patterns (missing
verify_ssl, outdated field names)Field Migration: Updates
cache_dir→metadata_cache_dir,auth_mode→use_default_credentialsBackup Creation: Creates backup of original configuration before migration
Seamless Upgrade: Ensures smooth transition from older versions without manual intervention
# Legacy configurations are automatically migrated when FastMCP server starts
# No manual intervention required - migration happens transparentlyCore Operations
CRUD Operations
async with D365FOClient(config) as client:
# CREATE - Create new customer (supports composite keys)
new_customer = {
"CustomerAccount": "US-999",
"Name": "Test Customer",
"SalesCurrencyCode": "USD"
}
created = await client.create_data("/data/CustomersV3", new_customer)
# READ - Get single customer by key
customer = await client.get_data("/data/CustomersV3('US-001')")
# UPDATE - Update customer with optimistic concurrency
updates = {"Name": "Updated Customer Name"}
updated = await client.update_data("/data/CustomersV3('US-001')", updates)
# DELETE - Delete customer
success = await client.delete_data("/data/CustomersV3('US-999')")
print(f"Delete successful: {success}")Advanced Querying
from d365fo_client import QueryOptions
# Complex query with multiple options
options = QueryOptions(
select=["CustomerAccount", "Name", "SalesCurrencyCode", "CustomerGroupId"],
filter="SalesCurrencyCode eq 'USD' and contains(Name, 'Corp')",
expand=["CustomerGroup"],
orderby=["Name desc", "CustomerAccount"],
top=50,
skip=10,
count=True
)
result = await client.get_data("/data/CustomersV3", options)
print(f"Total count: {result.get('@odata.count')}")Action Execution
# Unbound action
result = await client.post_data("/data/calculateTax", {
"amount": 1000.00,
"taxGroup": "STANDARD"
})
# Bound action on entity set
result = await client.post_data("/data/CustomersV3/calculateBalances", {
"asOfDate": "2024-12-31"
})
# Bound action on specific entity instance
result = await client.post_data("/data/CustomersV3('US-001')/calculateBalance", {
"asOfDate": "2024-12-31"
})JSON Service Operations
# Basic JSON service call (no parameters)
response = await client.post_json_service(
service_group="SysSqlDiagnosticService",
service_name="SysSqlDiagnosticServiceOperations",
operation_name="GetAxSqlExecuting"
)
if response.success:
print(f"Found {len(response.data)} executing SQL statements")
print(f"Status: HTTP {response.status_code}")
else:
print(f"Error: {response.error_message}")
# JSON service call with parameters
from datetime import datetime, timezone, timedelta
end_time = datetime.now(timezone.utc)
start_time = end_time - timedelta(minutes=10)
response = await client.post_json_service(
service_group="SysSqlDiagnosticService",
service_name="SysSqlDiagnosticServiceOperations",
operation_name="GetAxSqlResourceStats",
parameters={
"start": start_time.isoformat(),
"end": end_time.isoformat()
}
)
# Using JsonServiceRequest object for better structure
from d365fo_client.models import JsonServiceRequest
request = JsonServiceRequest(
service_group="SysSqlDiagnosticService",
service_name="SysSqlDiagnosticServiceOperations",
operation_name="GetAxSqlBlocking"
)
response = await client.call_json_service(request)
print(f"Service endpoint: {request.get_endpoint_path()}")
# Multiple SQL diagnostic operations
operations = ["GetAxSqlExecuting", "GetAxSqlBlocking", "GetAxSqlLockInfo"]
for operation in operations:
response = await client.post_json_service(
service_group="SysSqlDiagnosticService",
service_name="SysSqlDiagnosticServiceOperations",
operation_name=operation
)
if response.success:
count = len(response.data) if isinstance(response.data, list) else 1
print(f"{operation}: {count} records")
# Custom service call template
response = await client.post_json_service(
service_group="YourServiceGroup",
service_name="YourServiceName",
operation_name="YourOperation",
parameters={
"parameter1": "value1",
"parameter2": 123,
"parameter3": True
}
)Metadata Operations
# Intelligent metadata synchronization (v2 system)
sync_manager = await client.get_sync_manager()
await sync_manager.smart_sync()
# Search entities with enhanced filtering
sales_entities = await client.search_entities("sales")
print("Sales-related entities:", [e.name for e in sales_entities])
# Get detailed entity information with labels
entity_info = await client.get_public_entity_info("CustomersV3")
if entity_info:
print(f"Entity: {entity_info.name}")
print(f"Label: {entity_info.label_text}")
print(f"Data Service Enabled: {entity_info.data_service_enabled}")
# Search actions with caching
calc_actions = await client.search_actions("calculate")
print("Calculation actions:", [a.name for a in calc_actions])
# Get enumeration information
enum_info = await client.get_public_enumeration_info("NoYes")
if enum_info:
print(f"Enum: {enum_info.name}")
for member in enum_info.members:
print(f" {member.name} = {member.value}")Label Operations
# Get specific label (v2 caching system)
label_text = await client.get_label_text("@SYS13342")
print(f"Label text: {label_text}")
# Get multiple labels efficiently
labels = await client.get_labels_batch([
"@SYS13342", "@SYS9490", "@GLS63332"
])
for label_id, text in labels.items():
print(f"{label_id}: {text}")
# Enhanced entity info with resolved labels
entity_info = await client.get_public_entity_info_with_labels("CustomersV3")
if entity_info.label_text:
print(f"Entity display name: {entity_info.label_text}")
# Access enhanced properties with labels
for prop in entity_info.enhanced_properties[:5]:
if hasattr(prop, 'label_text') and prop.label_text:
print(f"{prop.name}: {prop.label_text}")Error Handling
from d365fo_client import D365FOClientError, AuthenticationError, ConnectionError
try:
async with D365FOClient(config) as client:
customer = await client.get_data("/data/CustomersV3('NON-EXISTENT')")
except ConnectionError as e:
print(f"Connection failed: {e}")
except AuthenticationError as e:
print(f"Authentication failed: {e}")
except D365FOClientError as e:
print(f"Client operation failed: {e}")
print(f"Status code: {e.status_code}")
print(f"Response: {e.response_text}")Development
Setting up Development Environment
# Clone the repository
git clone https://github.com/mafzaal/d365fo-client.git
cd d365fo-client
# Install with development dependencies using uv
uv sync --dev
# Run tests
uv run pytest
# Run integration tests
.\tests\integration\integration-test-simple.ps1 test-sandbox
# Format code
uv run black .
uv run isort .
# Type checking
uv run mypy src/
# Quality checks
.\make.ps1 quality-check # Windows PowerShell
# or
make quality-check # Unix/Linux/macOSProject Structure
d365fo-client/
├── src/
│ └── d365fo_client/
│ ├── __init__.py # Public API exports
│ ├── main.py # CLI entry point
│ ├── cli.py # CLI command handlers
│ ├── client.py # Enhanced D365FOClient class
│ ├── config.py # Configuration management
│ ├── auth.py # Authentication management
│ ├── session.py # HTTP session management
│ ├── crud.py # CRUD operations
│ ├── query.py # OData query utilities
│ ├── metadata.py # Legacy metadata operations
│ ├── metadata_api.py # Metadata API client
│ ├── metadata_cache.py # Metadata caching layer V2
│ ├── metadata_sync.py # Metadata synchronization V2 with session management
│ ├── sync_session.py # Enhanced sync session management (New in v0.2.3)
│ ├── credential_manager.py # Credential source management (New in v0.2.3)
│ ├── labels.py # Label operations V2
│ ├── profiles.py # Profile data models
│ ├── profile_manager.py # Profile management
│ ├── models.py # Data models and configurations
│ ├── output.py # Output formatting
│ ├── utils.py # Utility functions
│ ├── exceptions.py # Custom exceptions
│ └── mcp/ # Model Context Protocol server
│ ├── __init__.py # MCP server exports
│ ├── main.py # MCP server entry point
│ ├── server.py # Core MCP server implementation
│ ├── client_manager.py# D365FO client connection pooling
│ ├── models.py # MCP-specific data models
│ ├── mixins/ # FastMCP tool mixins (49 tools)
│ ├── tools/ # Legacy MCP tools (deprecated)
│ │ ├── connection_tools.py
│ │ ├── crud_tools.py
│ │ ├── metadata_tools.py
│ │ └── label_tools.py
│ ├── resources/ # MCP resource handlers (4 types)
│ │ ├── entity_handler.py
│ │ ├── metadata_handler.py
│ │ ├── environment_handler.py
│ │ └── query_handler.py
│ └── prompts/ # MCP prompt templates
├── tests/ # Comprehensive test suite
│ ├── unit/ # Unit tests (pytest-based)
│ ├── integration/ # Multi-tier integration testing
│ │ ├── mock_server/ # Mock D365 F&O API server
│ │ ├── test_mock_server.py # Mock server tests
│ │ ├── test_sandbox.py # Sandbox environment tests ✅
│ │ ├── test_live.py # Live environment tests
│ │ ├── conftest.py # Shared pytest fixtures
│ │ ├── test_runner.py # Python test execution engine
│ │ └── integration-test-simple.ps1 # PowerShell automation
│ └── test_mcp_server.py # MCP server unit tests ✅
├── scripts/ # Metadata discovery scripts
│ ├── search_data_entities.ps1 # PowerShell entity search
│ ├── get_data_entity_schema.ps1 # PowerShell schema retrieval
│ ├── search_enums.py # Python enumeration search
│ ├── get_enumeration_info.py # Python enumeration info
│ ├── search_actions.ps1 # PowerShell action search
│ └── get_action_info.py # Python action information
├── docs/ # Comprehensive documentation
├── pyproject.toml # Project configuration
└── README.md # This fileConfiguration Options
Option | Type | Default | Description |
| str | Required | D365 F&O base URL |
| str | None | Azure AD client ID |
| str | None | Azure AD client secret |
| str | None | Azure AD tenant ID |
| bool | True | Use Azure Default Credential |
| str | "environment" | Credential source: "environment", "keyvault" |
| str | None | Azure Key Vault URL for credential storage |
| bool | False | Verify SSL certificates |
| int | 30 | Request timeout in seconds |
| str | Platform-specific user cache | Metadata cache directory |
| bool | True | Enable label caching V2 |
| int | 60 | Label cache expiry time |
| bool | False | Enable cache-first mode with background sync |
Cache Directory Behavior
By default, the client uses platform-appropriate user cache directories:
Windows:
%LOCALAPPDATA%\d365fo-client(e.g.,C:\Users\username\AppData\Local\d365fo-client)macOS:
~/Library/Caches/d365fo-client(e.g.,/Users/username/Library/Caches/d365fo-client)Linux:
~/.cache/d365fo-client(e.g.,/home/username/.cache/d365fo-client)
You can override this by explicitly setting metadata_cache_dir:
from d365fo_client import FOClientConfig
# Use custom cache directory
config = FOClientConfig(
base_url="https://your-fo-environment.dynamics.com",
metadata_cache_dir="/custom/cache/path"
)
# Or get the default cache directory programmatically
from d365fo_client import get_user_cache_dir
cache_dir = get_user_cache_dir("my-app") # Platform-appropriate cache dir
config = FOClientConfig(
base_url="https://your-fo-environment.dynamics.com",
metadata_cache_dir=str(cache_dir)
)Testing
This project includes comprehensive testing at multiple levels to ensure reliability and quality.
Unit Tests
Run standard unit tests for core functionality:
# Run all unit tests
uv run pytest
# Run with coverage
uv run pytest --cov=d365fo_client --cov-report=html
# Run specific test file
uv run pytest tests/test_client.py -vIntegration Tests
The project includes a sophisticated multi-tier integration testing framework:
Quick Start
# Run sandbox integration tests (recommended)
.\tests\integration\integration-test-simple.ps1 test-sandbox
# Run mock server tests (no external dependencies)
.\tests\integration\integration-test-simple.ps1 test-mock
# Run with verbose output
.\tests\integration\integration-test-simple.ps1 test-sandbox -VerboseOutputTest Levels
Mock Server Tests - Fast, isolated tests against a simulated D365 F&O API
No external dependencies
Complete API simulation
Ideal for CI/CD pipelines
Sandbox Tests ⭐ (Default) - Tests against real D365 F&O test environments
Validates authentication
Tests real API behavior
Requires test environment access
Live Tests - Optional tests against production environments
Final validation
Performance benchmarking
Use with caution
Configuration
Set up integration testing with environment variables:
# Copy the template and configure
cp tests/integration/.env.template tests/integration/.env
# Edit .env file with your settings:
INTEGRATION_TEST_LEVEL=sandbox
D365FO_SANDBOX_BASE_URL=https://your-test.dynamics.com
D365FO_CLIENT_ID=your-client-id
D365FO_CLIENT_SECRET=your-client-secret
D365FO_TENANT_ID=your-tenant-idAvailable Commands
# Test environment setup
.\tests\integration\integration-test-simple.ps1 setup
# Dependency checking
.\tests\integration\integration-test-simple.ps1 deps-check
# Run specific test levels
.\tests\integration\integration-test-simple.ps1 test-mock
.\tests\integration\integration-test-simple.ps1 test-sandbox
.\tests\integration\integration-test-simple.ps1 test-live
# Coverage and reporting
.\tests\integration\integration-test-simple.ps1 coverage
# Clean up test artifacts
.\tests\integration\integration-test-simple.ps1 cleanTest Coverage
Integration tests cover:
✅ Connection & Authentication - Azure AD integration, SSL/TLS validation
✅ Version Methods - Application, platform, and build version retrieval
✅ Metadata Operations - Entity discovery, metadata API validation
✅ Data Operations - CRUD operations, OData query validation
✅ Error Handling - Network failures, authentication errors, invalid requests
✅ Performance - Response time validation, concurrent operations
For detailed information, see Integration Testing Documentation.
Test Results
Recent sandbox integration test results:
✅ 17 passed, 0 failed, 2 warnings in 37.67s
======================================================
✅ TestSandboxConnection::test_connection_success
✅ TestSandboxConnection::test_metadata_connection_success
✅ TestSandboxVersionMethods::test_get_application_version
✅ TestSandboxVersionMethods::test_get_platform_build_version
✅ TestSandboxVersionMethods::test_get_application_build_version
✅ TestSandboxVersionMethods::test_version_consistency
✅ TestSandboxMetadataOperations::test_download_metadata
✅ TestSandboxMetadataOperations::test_search_entities
✅ TestSandboxMetadataOperations::test_get_data_entities
✅ TestSandboxMetadataOperations::test_get_public_entities
✅ TestSandboxDataOperations::test_get_available_entities
✅ TestSandboxDataOperations::test_odata_query_options
✅ TestSandboxAuthentication::test_authenticated_requests
✅ TestSandboxErrorHandling::test_invalid_entity_error
✅ TestSandboxErrorHandling::test_invalid_action_error
✅ TestSandboxPerformance::test_response_times
✅ TestSandboxPerformance::test_concurrent_operationsContributing
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Make your changes
Run tests (
uv run pytest)Run integration tests (
.\tests\integration\integration-test-simple.ps1 test-sandbox)Format code (
uv run black . && uv run isort .)Commit changes (
git commit -m 'Add amazing feature')Push to branch (
git push origin feature/amazing-feature)Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Changelog
See CHANGELOG.md for a list of changes and version history.
Support
📧 Email: mo@thedataguy.pro
🐛 Issues: GitHub Issues
Related Projects
Model Context Protocol (MCP) - For AI assistant integration
Available Tools
49 toolsd365fo_call_actionB
Execute an OData action method in D365 Finance & Operations.
Args: action_name: Full name of the OData action to invoke parameters: Action parameters as key-value pairs entity_name: The entity's public collection name or entity set name (e.g., "CustomersV3", "SalesOrders", "DataManagementEntities") key_fields: Primary key fields for entity-bound actions key_values: Primary key values for entity-bound actions profile: Optional profile name
Returns: Dictionary with action result
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| key_fields | No | ||
| key_values | No | ||
| parameters | No | ||
| action_name | Yes | ||
| entity_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description fails to disclose side effects, permissions, or error behavior. Only states it executes an action, but not outcomes or risks.
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?
Description uses a docstring format with parameter list and return note, but it is a single paragraph without front-loading the most critical information.
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 6 parameters, nested objects, and no output schema, the description is insufficient. Does not explain return value format, error handling, or prerequisites.
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 0%, but description lists each parameter with brief explanations. Lacks details on how key_fields and key_values interact for entity-bound actions.
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 it executes an OData action method in D365 Finance & Operations, which is distinct from sibling tools like d365fo_search_actions (search) and entity CRUD tools.
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 vs alternatives, no mention of when-not-to-use, and no context about bound vs unbound actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_call_json_serviceA
Call a D365 F&O JSON service endpoint using the /api/services pattern.
This provides a generic way to invoke any JSON service operation in D365 F&O.
Args: service_group: Service group name (e.g., 'SysSqlDiagnosticService') service_name: Service name (e.g., 'SysSqlDiagnosticServiceOperations') operation_name: Operation name (e.g., 'GetAxSqlExecuting') parameters: Optional parameters to send in the POST body profile: Configuration profile to use
Returns: Dictionary with service response data and metadata
Example: Call a service without parameters: { "service_group": "SysSqlDiagnosticService", "service_name": "SysSqlDiagnosticServiceOperations", "operation_name": "GetAxSqlExecuting" }
Call a service with parameters:
{
"service_group": "SysSqlDiagnosticService",
"service_name": "SysSqlDiagnosticServiceOperations",
"operation_name": "GetAxSqlResourceStats",
"parameters": {
"start": "2023-01-01T00:00:00Z",
"end": "2023-01-02T00:00:00Z"
}
}
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| parameters | No | ||
| service_name | Yes | ||
| service_group | Yes | ||
| operation_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full burden. It explains that it uses POST body and returns a dictionary with response data, but does not disclose side effects, authentication needs, rate limits, or error behavior. The behavioral traits are partially covered.
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?
Description is structured with a purpose sentence, then Args and Returns sections. Examples are lengthy but informative. Could be slightly more concise, but overall well-organized and front-loaded.
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 no output schema and no annotations, the description covers functionality, parameters, and examples well. However, it omits error handling, return format details, and idempotency. Completeness is good but not exhaustive.
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 0%, and the description compensates fully by listing all five parameters in the Args block with clear explanations and examples. Each parameter's purpose is described beyond the schema types.
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 calls a D365 F&O JSON service endpoint using the /api/services pattern, and explains it is a generic way to invoke any JSON service operation. However, it does not differentiate from sibling tools like d365fo_call_action or d365fo_execute_sql_query, which may also invoke services.
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 implies usage for invoking JSON services but does not explicitly state when to use this tool versus alternatives. No exclusions or context about when not to use it are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_cancel_syncA
Cancel a running sync session. Only sessions that are currently running and marked as cancellable can be cancelled.
Args: session_id: Session ID of the sync operation to cancel profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with cancellation result
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior. It states the precondition and that it returns a dictionary, but lacks details on side effects, idempotency, or the structure of the return value. More transparency on what 'cancel' entails would improve this.
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 concise, structured with Args and Returns sections, and front-loads the purpose. Every sentence adds value without redundancy.
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 mutation tool with no output schema, the description covers preconditions and parameters adequately. However, it lacks details on cancellation result format and whether the operation is synchronous, leaving minor gaps.
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 0%, so description fully carries parameter meaning. It clearly explains session_id as the session to cancel and profile as an optional configuration with a default. This adds significant value beyond the schema.
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 cancels a running sync session, with a specific verb and resource. It distinguishes from sibling tools like start_sync and list_sync_sessions by focusing on cancellation.
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 a precondition for use (session must be running and cancellable), guiding when the tool is applicable. However, it does not explicitly mention when not to use or suggest alternatives like listing sessions to find cancellable ones.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_clone_profileB
Clone an existing D365FO environment profile with optional modifications.
Args: sourceProfileName: Name of the profile to clone newProfileName: Name for the new profile description: Description for the new profile
Returns: Dictionary with cloning result
| Name | Required | Description | Default |
|---|---|---|---|
| description | No | ||
| newProfileName | Yes | ||
| sourceProfileName | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description fails to disclose behavioral traits such as whether cloning overwrites existing profiles, permissions required, or error handling. The return type is vaguely described as a dictionary.
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 concise and well-structured, with the main action in the first line. The Args/Returns section is redundant but not overly long. A minor improvement would be removing redundancy.
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 moderate complexity (cloning with optional modifications) and the lack of behavioral details in the description, it is incomplete. The output schema exists but is not leveraged, and key aspects like conflict resolution are omitted.
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?
With 0% schema coverage, the description adds basic meaning for each parameter (e.g., 'Name of the profile to clone'). However, it does not provide additional details like constraints or effects beyond what the schema titles imply.
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 'Clone an existing D365FO environment profile with optional modifications,' using a specific verb and resource. It distinguishes itself from sibling tools like create_profile and update_profile, which perform different operations.
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 does not provide any guidance on when to clone vs. create or update a profile. No alternative tools are mentioned, nor are conditions for using this tool specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_create_entity_recordB
Create a new record in a D365 Finance & Operations data entity.
Args: entity_name: The entity's public collection name or entity set name (e.g., "CustomersV3", "SalesOrders", "DataManagementEntities") data: Record data containing field names and values return_record: Whether to return the complete created record profile: Optional profile name
Returns: Dictionary with creation result
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| profile | No | default | |
| entity_name | Yes | ||
| return_record | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Minimal behavioral info beyond creation. No disclosure of side effects, idempotency, or required permissions. No annotations to supplement.
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?
Front-loaded with purpose, then structured Args list. Concisely describes parameters, though some text overhead is acceptable. No fluff.
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?
Lacks details on return value fields, error handling, and validation. No mention of constraints like uniqueness or required fields in data. Not complete for a create tool with moderate complexity.
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?
Adds meaning to all 4 parameters with examples (entity_name), clarifies data as 'Record data containing field names and values', and explains return_record and profile. Compensates for 0% schema description 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?
Clear verb+resource: 'Create a new record in a D365 Finance & Operations data entity.' Distinguishes from siblings like get, update, delete by specifying creation.
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 vs. alternative tools (get, update, delete). Does not mention prerequisites or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_create_profileA
Create a new D365FO environment profile with full configuration options.
Args: name: Profile name baseUrl: D365FO base URL description: Profile description verifySsl: Whether to verify SSL certificates (default: True) timeout: Request timeout in seconds (default: 60) useLabelCache: Whether to enable label caching (default: True) labelCacheExpiryMinutes: Label cache expiry in minutes (default: 60) useCacheFirst: Whether to use cache-first behavior (default: True) language: Default language code (default: "en-US") cacheDir: Custom cache directory path (optional) outputFormat: Default output format for CLI operations (default: "table") setAsDefault: Set as default profile (default: False) credentialSource: Credential source configuration. If None, uses Azure Default Credentials. Can be: - Environment variables: {"sourceType": "environment", "clientIdVar": "MY_CLIENT_ID", "clientSecretVar": "MY_CLIENT_SECRET", "tenantIdVar": "MY_TENANT_ID"} - Azure Key Vault: {"sourceType": "keyvault", "vaultUrl": "https://vault.vault.azure.net/", "clientIdSecretName": "D365FO_CLIENT_ID", "clientSecretSecretName": "D365FO_CLIENT_SECRET", "tenantIdSecretName": "D365FO_TENANT_ID"}
Returns: Dictionary with creation result
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| baseUrl | Yes | ||
| timeout | No | ||
| cacheDir | No | ||
| language | No | en-US | |
| verifySsl | No | ||
| description | No | ||
| outputFormat | No | table | |
| setAsDefault | No | ||
| useCacheFirst | No | ||
| useLabelCache | No | ||
| credentialSource | No | ||
| labelCacheExpiryMinutes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 of behavioral disclosure. It explains the credential source options and basic operation, but omits side effects (e.g., whether the profile becomes active immediately), required permissions, error behavior, or the structure of the return dictionary. For a tool with no annotations, this level of transparency is adequate but not exhaustive.
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 well-structured with an Args list and Returns section, making it easy to scan. However, it is lengthy and repeats some default values already in the schema. Each sentence is justified, but some redundancy could be trimmed. The front-loading of the main purpose is effective.
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 complexity (13 parameters, credential configuration) and the existence of an output schema, the description covers inputs well but lacks detail on the output beyond 'Dictionary with creation result'. It does not address error scenarios, prerequisites (e.g., authentication), or post-creation state. For a tool creating a critical resource, more contextual completeness is warranted.
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 input schema has zero description coverage, leaving the description to fully document each parameter. The Args section thoroughly explains all 13 parameters, including defaults, types, and optionality. Notably, it provides detailed structure for the complex 'credentialSource' parameter, offering concrete examples of environment variable and Key Vault configurations. This adds exceptional value beyond the schema.
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 'a new D365FO environment profile'. It distinguishes this tool from sibling tools like clone_profile, delete_profile, etc. by specifying 'full configuration options', emphasizing its role as the primary creation tool.
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 does not provide explicit guidance on when to use this tool versus alternatives. It does not mention prerequisites, scenarios where other tools (e.g., clone_profile) might be more appropriate, or any limitations. The implicit naming is insufficient for an agent to make informed decisions without additional context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_delete_entity_recordA
Delete a record from a D365 Finance & Operations data entity.
Args: entity_name: The entity's public collection name or entity set name (e.g., "CustomersV3", "SalesOrders", "DataManagementEntities") key_fields: List of key field names for composite keys key_values: List of key values corresponding to key fields profile: Optional profile name
Returns: Dictionary with deletion result
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| key_fields | Yes | ||
| key_values | Yes | ||
| entity_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only says 'Delete a record,' implying mutability but offering no details on side effects, permanence, required permissions, or error conditions. The return type is vaguely described as 'dictionary with deletion result.'
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 concise, with a clear introductory sentence followed by structured Args/Returns sections. No unnecessary words or redundancy.
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?
The description covers parameter meanings and return type, but given no annotations or output schema, it lacks completeness on error handling, authentication needs, and edge cases (e.g., deleting non-existent records). It is adequate for basic usage but not fully comprehensive.
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 input schema lacks descriptions (0% coverage), but the description's Args section provides meaningful explanations for all four parameters, including examples for entity_name and clarifying composite keys. This adds significant value beyond the schema's titles.
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 'Delete a record from a D365 Finance & Operations data entity,' specifying the action and resource. It distinguishes itself from sibling tools like d365fo_create_entity_record and d365fo_update_entity_record, and there is no other delete record tool.
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, nor any prerequisites or exclusions. It simply states what it does without context on appropriate use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_delete_profileA
Delete a D365FO environment profile.
Automatically invalidates all cached client connections since the profile is no longer available.
Args: profileName: Name of the profile to delete
Returns: Dictionary with deletion result including number of clients invalidated
| Name | Required | Description | Default |
|---|---|---|---|
| profileName | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description effectively discloses the key behavioral trait: 'Automatically invalidates all cached client connections since the profile is no longer available.' This adds important context beyond the simple delete action.
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 concise, using only three sentences plus an Args/Returns section. It is front-loaded with the main purpose and uses clear structure, making it easy for an AI agent to parse quickly.
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 one required parameter, the description covers the core behavior, side effect, and return value. It is complete enough given the tool's simplicity, though it could mention prerequisites like profile existence.
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 includes an Args section specifying that profileName is the 'Name of the profile to delete,' which provides clear semantics beyond the schema's minimal 'Profilename' label. Given 0% schema description coverage, the description compensates well.
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 starts with 'Delete a D365FO environment profile,' which is a specific verb and resource. This clearly distinguishes it from sibling tools like create_profile, update_profile, or search_profiles.
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 mentions the side effect of invalidating cached connections, which gives context for using the tool, but it does not explicitly state when to use this tool versus alternatives or when not to use it. No comparison to other profile-related tools is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_download_customer_invoiceA
Download a customer invoice report as PDF from D365 Finance & Operations.
This is a convenience tool with preset configurations for customer invoices. Use this when you need to quickly download customer invoices without specifying all the technical parameters.
To find available invoices to download, query the Customer Invoice Journal entity:
Entity name: CustInvoiceJourBiEntity
Collection name: CustInvoiceJourBiEntities
Key fields: InvoiceId, InvoiceDate, InvoiceAccount, InvoiceAmount, SalesType, dataAreaId
Use d365fo_query_entities tool to search for invoices
Example query to find invoices: d365fo_query_entities( entityName="CustInvoiceJourBiEntities", filter="InvoiceDate ge 2024-01-01", select=["InvoiceId", "InvoiceDate", "InvoiceAccount", "InvoiceAmount", "SalesType"] )
Args: invoice_id: The customer invoice number/ID (e.g., 'CIV-000708', 'INV-2024-001') legal_entity: The legal entity/company code (e.g., 'USMF', 'DEMF') save_path: Full path where PDF should be saved (optional, auto-generates if not provided) profile: Configuration profile name (default: 'default')
Returns: Dictionary with download result including saved file path
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| save_path | No | ||
| invoice_id | Yes | ||
| legal_entity | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 discloses that it downloads PDFs, returns a dictionary with file path, and that save_path auto-generates. It also mentions preset configurations via profile. However, it lacks details on error handling, authentication requirements, or failure modes, which are important for a download tool.
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 well-structured with sections: purpose, usage guidance, example query, and parameter list. It is front-loaded with the core action. While the example query adds length, it is valuable and not wasteful. Slightly longer than minimal but still efficient.
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 purpose and that an output schema exists (as per context signals, though not provided in full), the description covers the main workflow: query first with another tool, then use this to download. It explains parameters, provides examples, and mentions return format. It is complete for typical use, though it omits error scenarios or prerequisites.
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 0%, yet the description adds substantial meaning: it gives concrete examples for invoice_id and legal_entity, explains save_path's optionality and auto-generation, and describes the default for profile. This goes well beyond the bare schema, making parameter usage clear.
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 'Download a customer invoice report as PDF from D365 Finance & Operations.' It uses a specific verb and resource, and distinguishes itself from sibling download tools by explicitly calling out 'customer invoice' and noting it is a convenience tool with preset configurations.
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 clear context: 'Use this when you need to quickly download customer invoices without specifying all the technical parameters.' It also gives detailed guidance on finding invoices by querying the CustInvoiceJourBiEntity through d365fo_query_entities, including an example query. However, it does not explicitly state when not to use this tool or mention alternatives among sibling download tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_download_debit_credit_noteA
Download a debit/credit note report as PDF from D365 Finance & Operations.
This is a convenience tool specifically configured for debit and credit notes using the CustDebitCreditNoteController. These are adjustment documents for customer invoices.
To find available documents to download, query the Customer Invoice Journal entity:
Entity name: CustInvoiceJourBiEntity
Collection name: CustInvoiceJourBiEntities
Key fields: InvoiceId, InvoiceDate, InvoiceAccount, InvoiceAmount, SalesType, dataAreaId
Use d365fo_query_entities tool to search for invoices
Example query to find invoices: d365fo_query_entities( entityName="CustInvoiceJourBiEntities", filter="InvoiceDate ge 2024-01-01", select=["InvoiceId", "InvoiceDate", "InvoiceAccount", "InvoiceAmount", "SalesType"] )
Args: invoice_id: The debit/credit note invoice ID (e.g., 'DN-000123', 'CN-000456') legal_entity: The legal entity/company code (e.g., 'USMF', 'DEMF') save_path: Full path where PDF should be saved (optional, auto-generates if not provided) profile: Configuration profile name (default: 'default')
Returns: Dictionary with download result including saved file path
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| save_path | No | ||
| invoice_id | Yes | ||
| legal_entity | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions the tool downloads a PDF and returns a dictionary with saved file path, but does not disclose potential side effects, required permissions, or performance characteristics. Since it's a download tool, the behavioral impact is minimal, but more detail on authentication or file size constraints would improve transparency.
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 well-structured with clear sections, a purpose statement, usage context, a query example, and explicit args. It is front-loaded and every sentence adds value. Despite length, it is not 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?
Given the complexity of D365 and the presence of an output schema (not shown but indicated), the description covers all essentials: how to find the invoice ID, required parameters, optional parameters, and return value. It is complete for an agent to use correctly.
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 schema has 0% description coverage, but the tool description thoroughly explains all parameters: invoice_id (with examples), legal_entity (with examples), save_path (explains optional auto-generation), and profile (with default). This adds significant meaning beyond the raw schema.
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 it downloads a debit/credit note report as PDF from D365 Finance & Operations. It specifies the controller (CustDebitCreditNoteController) and distinguishes from sibling tools like d365fo_download_customer_invoice and d365fo_download_free_text_invoice.
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?
Provides explicit guidance on when to use this tool (for debit/credit notes) and instructs the agent to first query the CustInvoiceJourBiEntity using d365fo_query_entities to find available invoices. Includes a concrete example query. Clearly differentiates this from other download tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_download_free_text_invoiceA
Download a free text invoice report as PDF from D365 Finance & Operations.
This is a convenience tool specifically configured for free text invoices using the FreeTextInvoiceController. Free text invoices are customer invoices that don't originate from sales orders.
To find available invoices to download, query the Customer Invoice Journal entity:
Entity name: CustInvoiceJourBiEntity
Collection name: CustInvoiceJourBiEntities
Key fields: InvoiceId, InvoiceDate, InvoiceAccount, InvoiceAmount, SalesType, dataAreaId
Use d365fo_query_entities tool to search for invoices
Example query to find free text invoices: d365fo_query_entities( entityName="CustInvoiceJourBiEntities", filter="InvoiceDate ge 2024-01-01", select=["InvoiceId", "InvoiceDate", "InvoiceAccount", "InvoiceAmount", "SalesType"] )
Args: invoice_id: The free text invoice number/ID (e.g., 'FTI-00000021', 'FTI-2024-001') legal_entity: The legal entity/company code (e.g., 'USMF', 'DEMF') save_path: Full path where PDF should be saved (optional, auto-generates if not provided) profile: Configuration profile name (default: 'default')
Returns: Dictionary with download result including saved file path
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| save_path | No | ||
| invoice_id | Yes | ||
| legal_entity | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It explains the download action, controller, and return format, but omits details on error handling, permissions, or limits, leading to moderate transparency.
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?
Structured with purpose, query guidance, example, and args list; front-loaded but slightly repetitive of schema. Mostly concise and clear.
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 4 parameters, no schema descriptions, and an output schema, the description thoroughly covers invoice discovery, parameter explanations, and return value, making it complete for the tool's complexity.
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 has 0% description coverage; the description adds significant value by providing examples for invoice_id and legal_entity, explaining save_path auto-generation, and noting profile default, compensating well for missing schema 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?
Clearly states the tool downloads a free text invoice as PDF and distinguishes it from sales-order invoices, with specific mention of the controller and differentiation from sibling tools like download_customer_invoice.
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?
Provides explicit guidance on finding invoices via CustInvoiceJourBiEntity with a concrete example query, but does not explicitly name alternative tools for other invoice types, relying on implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_download_purchase_orderA
Download a purchase order report as PDF from D365 Finance & Operations.
This is a convenience tool specifically configured for purchase orders using the PurchPurchaseOrderController. Purchase orders are documents sent to vendors to order goods or services.
To find available purchase orders to download, query the Purchase Order Confirmation Headers entity:
Entity name: PurchPurchaseOrderConfirmationHeaderEntity
Collection name: PurchaseOrderConfirmationHeaders
Key fields: PurchaseOrderNumber, ConfirmationNumber, ConfirmationDate, OrderVendorAccountNumber, TotalConfirmedAmount, dataAreaId
Use d365fo_query_entities tool to search for purchase orders
Example query to find purchase orders: d365fo_query_entities( entityName="PurchaseOrderConfirmationHeaders", filter="ConfirmDate ge 2024-01-01", select=["PurchaseOrderNumber", "ConfirmDate", "VendorAccount", "OrderStatus"] )
Args: purchase_order_id: The purchase order ID (e.g., 'PO-000123', 'P00001234') legal_entity: The legal entity/company code (e.g., 'USMF', 'DEMF') save_path: Full path where PDF should be saved (optional, auto-generates if not provided) profile: Configuration profile name (default: 'default')
Returns: Dictionary with download result including saved file path
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| save_path | No | ||
| legal_entity | Yes | ||
| purchase_order_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It mentions the tool downloads a PDF and can auto-generate save_path, but it does not state whether the operation is read-only, destructive, or requires permissions. For a download tool, it likely is read-only, but the lack of explicit disclosure reduces transparency.
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 well-structured with a clear introduction, contextual explanation of purchase orders, actionable query instructions, and parameter list. While slightly verbose with the definition of purchase orders, it remains focused and front-loaded. It could be trimmed but is not overly long.
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 4 parameters and an output schema, the description covers the tool's purpose, parameter details, return value, and provides a concrete query example to aid input preparation. It lacks error handling or permission details, but for a download tool, the coverage is adequate.
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 input schema has 0% description coverage, meaning no parameter descriptions in the schema. The description compensates fully by listing all four parameters in an Args section with meanings, examples (e.g., purchase_order_id: 'PO-000123'), and default values (profile: 'default'). It adds crucial context beyond the schema.
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 'Download a purchase order report as PDF from D365 Finance & Operations.' It uses a specific verb ('download') and resource ('purchase order'), and even mentions the underlying controller (PurchPurchaseOrderController). This makes the tool's purpose distinct from siblings like d365fo_download_customer_invoice, though not explicitly compared.
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 guidance on how to find purchase orders via a query (e.g., using d365fo_query_entities with entity 'PurchaseOrderConfirmationHeaders'), which helps the agent prepare input. However, it does not explicitly state when to use this tool versus alternatives like d365fo_download_customer_invoice or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_download_sales_confirmationA
Download a sales confirmation report as PDF from D365 Finance & Operations.
This is a convenience tool specifically configured for sales order confirmations using the SalesConfirmController. Sales confirmations are documents sent to customers to confirm sales orders.
To find available confirmations to download, query the Sales Order Confirmation Headers entity:
Entity name: SalesOrderConfirmationHeaderEntity
Collection name: SalesOrderConfirmationHeaders
Key fields: ConfirmationNumber, SalesOrderNumber, ConfirmationDate, OrderingCustomerAccountNumber, TotalConfirmedAmount, dataAreaId
Use d365fo_query_entities tool to search for confirmations
Example query to find confirmations: d365fo_query_entities( entityName="SalesOrderConfirmationHeaders", filter="ConfirmationDate ge 2024-01-01", select=["ConfirmationNumber", "SalesOrderNumber", "ConfirmationDate", "OrderingCustomerAccountNumber", "TotalConfirmedAmount"] )
Args: confirmation_id: The confirmation ID or sales order ID (e.g., 'SC-000123', 'SO-001234') legal_entity: The legal entity/company code (e.g., 'USMF', 'DEMF') save_path: Full path where PDF should be saved (optional, auto-generates if not provided) profile: Configuration profile name (default: 'default')
Returns: Dictionary with download result including saved file path
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| save_path | No | ||
| legal_entity | Yes | ||
| confirmation_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It mentions the return format (dictionary with download result) and that it uses SalesConfirmController. However, it does not disclose whether the operation is read-only or destructive, or if specific permissions are required.
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 well-structured: a clear one-liner, followed by context about the entity, then argument details. It is slightly lengthy but each section adds value. Front-loads the core purpose well.
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 an output schema (true) and the tool's complexity, the description is complete. It explains the return value, provides a query example to find confirmations, and covers all arguments. No major gaps.
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 input schema has 0% description coverage, but the description compensates fully. It explains confirmation_id (can be confirmation or sales order ID), legal_entity (company code), save_path (optional full path), and profile (default), with examples. This adds significant semantic value beyond the schema.
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 downloads a sales confirmation report as a PDF from D365 F&O. It specifies the resource (sales confirmation) and the action (download PDF), and distinguishes from siblings like d365fo_download_customer_invoice by noting it uses SalesConfirmController.
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 guidance on when to use the tool (for downloading sales confirmations) and how to find available confirmations via querying the SalesOrderConfirmationHeader entity with an example. It does not explicitly state when not to use it, but the context among sibling download tools implies it's for sales confirmations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_download_srs_reportA
Download SQL Server Reporting Services (SSRS/SRS) reports from D365 Finance & Operations as PDF files.
This tool generates and downloads business documents like invoices, purchase orders, confirmations, and other reports by calling the D365FO SRS reporting engine. The report is returned as a PDF file saved to a specified location.
Args: document_id: The unique identifier/key of the document (e.g., 'CIV-000708', 'SO-001234') legal_entity: The legal entity/company code (DataAreaId) where the document exists (e.g., 'USMF') controller_name: The SSRS controller class name (default: 'SalesInvoiceController') Common controllers: - SalesInvoiceController: Customer invoices - FreeTextInvoiceController: Free text invoices - CustDebitCreditNoteController: Debit/credit notes - SalesConfirmController: Sales confirmations - PurchPurchaseOrderController: Purchase orders data_table: The database table containing the document (default: 'CustInvoiceJour') data_field: The field name that stores the document ID (default: 'InvoiceId') document_type: Human-readable document type for filename (default: 'SalesInvoice') save_path: Full path where PDF should be saved (optional, auto-generates if not provided) profile: Configuration profile name (default: 'default')
Common controller/table/field combinations:
| Controller | Table | Field Name | Field Type | Document Type |
|-----------|-------|-----------|------------|---------------|
| SalesInvoiceController | CustInvoiceJour | InvoiceId | Invoice ID | Sales Invoice |
| FreeTextInvoiceController | CustInvoiceJour | InvoiceId | Invoice ID | Free Text Invoice |
| CustDebitCreditNoteController | CustInvoiceJour | InvoiceId | Invoice ID | Debit/Credit Note |
| SalesConfirmController | CustConfirmJour | ConfirmId or SalesId | Confirm/Sales ID | Sales Confirmation |
| PurchPurchaseOrderController | VendPurchOrderJour | PurchId | Purchase Order ID | Purchase Order |
Returns:
Dictionary with download result including saved file path
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| save_path | No | ||
| data_field | No | InvoiceId | |
| data_table | No | CustInvoiceJour | |
| document_id | Yes | ||
| legal_entity | Yes | ||
| document_type | No | SalesInvoice | |
| controller_name | No | SalesInvoiceController |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It indicates the tool generates and downloads a PDF, which is a read operation. However, it doesn't mention potential side effects (e.g., report generation triggers), permissions required, limits, or error conditions. Some behavioral context is missing.
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 well-structured with a clear opening, bulleted parameter list, and a table. It is front-loaded with the core purpose. While lengthy, every sentence adds value, though it could be slightly more concise by removing some redundancy.
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 complexity (8 parameters, 0% schema coverage, no annotations) and the presence of an output schema, the description is remarkably complete. It explains the return value, provides default values, and offers a reference table for common configurations. No significant gaps remain.
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 0%, but the description fully compensates by detailing each parameter: document_id, legal_entity, controller_name, data_table, data_field, document_type, save_path, and profile. It explains defaults, provides examples, and includes a comprehensive table of common controller/table/field combinations, adding immense value beyond the raw schema.
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 explicitly states it downloads SSRS reports from D365FO as PDF files, listing specific document types (invoices, purchase orders) and the tool's flexibility. The verb 'download' and resource 'SSRS report' are clear, and the tool is distinct from generic data download tools.
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 useful parameter combinations (controller/table/field) but lacks guidance on when to use this generic tool versus the many sibling download tools (e.g., d365fo_download_customer_invoice). No explicit when/when-not or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_execute_sql_queryA
Execute a SELECT query against the D365FO metadata database to get insights from cached metadata.
IMPORTANT SAFETY NOTES:
Only SELECT queries are allowed (no INSERT, UPDATE, DELETE, DROP, etc.)
Query results are limited to 1000 rows maximum
Queries timeout after 30 seconds
Some sensitive tables may be restricted
AVAILABLE TABLES AND THEIR PURPOSE:
metadata_environments: D365FO environments and their details
global_versions: Global version registry with hash and reference counts
environment_versions: Links between environments and global versions
data_entities: D365FO data entities metadata
public_entities: Public entity schemas and configurations
entity_properties: Detailed property information for entities
entity_actions: Available OData actions for entities
enumerations: System enumerations and their metadata
enumeration_members: Individual enumeration values and labels
metadata_search_v2: FTS5 search index for metadata
EXAMPLE QUERIES:
Get most used entities by category: SELECT entity_category, COUNT(*) as count FROM data_entities GROUP BY entity_category ORDER BY count DESC
Find entities with most properties: SELECT pe.name, COUNT(ep.id) as property_count FROM public_entities pe LEFT JOIN entity_properties ep ON pe.id = ep.entity_id GROUP BY pe.id ORDER BY property_count DESC LIMIT 10
Analyze environment versions: SELECT me.environment_name, gv.version_hash, ev.detected_at FROM metadata_environments me JOIN environment_versions ev ON me.id = ev.environment_id JOIN global_versions gv ON ev.global_version_id = gv.id
Use this tool to analyze metadata patterns, generate reports, and gain insights into D365FO structure.
Args: query: SQL SELECT query to execute. Must be a SELECT statement only. Query will be validated for safety before execution. limit: Maximum number of rows to return. Default is 100, maximum is 1000. format: Output format for results. 'table' for human-readable format, 'json' for structured data, 'csv' for spreadsheet-compatible format. profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with query results
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| format | No | table | |
| profile | No | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: only SELECT allowed, 1000 row limit, 30-second timeout, restricted tables, and a list of available tables. This is comprehensive and leaves no ambiguity about safety or constraints.
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 well-structured with clear sections (safety, tables, examples, args). It is relatively long but front-loaded with key information. Minor redundancy (safety notes repeated in args) but overall efficient.
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 lack of output schema and 4 parameters, the description is very complete. It covers safety, table catalog, examples, parameter details, and return type. An agent can confidently use this tool without further information.
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 input schema has 0% description coverage, so the description carries full burden. It explains each parameter: query must be SELECT, limit default 100 and max 1000, format options (table/json/csv), and profile is optional. This adds essential meaning beyond the schema.
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 executes SELECT queries against the D365FO metadata database. It specifies the action (execute), resource (metadata database), and purpose (insights from cached metadata), distinguishing it from sibling tools that perform specific operations like record management or profile handling.
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 explicitly restricts queries to SELECT only, outlines table usage, and provides examples. It does not explicitly mention when not to use or suggest alternatives, but the context is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_export_profilesB
Export all D365FO environment profiles to a file.
Args: filePath: Path where to export the profiles
Returns: Dictionary with export result
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description implies a write operation (creating a file) but does not disclose side effects, required permissions, or safety aspects beyond the basic action.
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 extremely concise with a clear one-line summary, followed by structured Args and Returns sections. No superfluous content.
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 existence of an output schema, the description's return info is minimal but acceptable. Missing details about file format, overwrite behavior, and error handling, but adequate for a simple export 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?
The description includes an Args section that adds the phrase 'Path where to export' to filePath, providing some context beyond the schema. However, schema coverage is reported as 0% likely because the description repeats schema info without deeper semantics.
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 exports all D365FO environment profiles to a file, using a specific verb and resource. It distinguishes itself from siblings like import_profiles, list_profiles, etc.
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 or when not to use this tool, nor alternatives. The description only states what it does without context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_database_schemaA
Get comprehensive schema information for the D365FO metadata database.
This tool provides detailed information about:
All database tables and their structures
Column definitions with types and constraints
Indexes and their purposes
Foreign key relationships
Table statistics (row counts, sizes)
FTS5 virtual table information
Use this tool to understand the database structure before writing SQL queries.
Args: table_name: Optional. Get schema for a specific table only. If omitted, returns schema for all tables. include_statistics: Include table statistics like row counts and sizes. include_indexes: Include index information for tables. include_relationships: Include foreign key relationships between tables. profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with database schema
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| table_name | No | ||
| include_indexes | No | ||
| include_statistics | No | ||
| include_relationships | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It accurately describes the tool as a read-only operation returning schema information and lists the data categories. It does not mention potential performance impacts or limitations, but given the nature of the tool, this is acceptable.
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 well-structured with bullet points for the returned information, a clear usage statement, and a parameter list. It is concise yet complete, with no superfluous sentences.
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 no output schema and no annotations, the description adequately covers purpose, parameters, usage context, and return value. It provides enough information for an AI agent to correctly select and invoke the 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?
The input schema has 0% description coverage, so the description fully compensates by explaining each parameter: table_name for specific tables, include_statistics, include_indexes, include_relationships as boolean flags, and profile with its default behavior. This adds essential semantic meaning beyond the schema.
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 that the tool retrieves comprehensive schema information for the D365FO metadata database, listing specific details like tables, columns, indexes, foreign keys, and statistics. This specificity distinguishes it from sibling tools like d365fo_get_database_statistics or d365fo_get_table_info, which have narrower focus.
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 advises using this tool to understand the database structure before writing SQL queries, providing clear context for its use. It does not explicitly state when not to use it or list alternatives, but the guidance is sufficient for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_database_statisticsA
Get comprehensive database statistics and analytics including:
Overall database size and table counts
Record counts by table
Global version statistics
Environment statistics
Cache hit rates and performance metrics
Storage utilization analysis
Data distribution insights
Use this tool to understand the overall state and health of the metadata database.
Args: include_table_stats: Include per-table statistics (row counts, sizes). include_version_stats: Include global version and environment statistics. include_performance_stats: Include cache performance and query statistics. profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with database statistics
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| include_table_stats | No | ||
| include_version_stats | No | ||
| include_performance_stats | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description describes the tool as read-only (getting statistics), but does not explicitly state it is non-destructive or disclose performance implications. It adequately describes the output scope but lacks behavioral warnings.
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 structured with bullet points and a separate Args section, making it easy to scan. The bullet list of statistics categories is somewhat lengthy but front-loaded with the main purpose.
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 no output schema, the description returns 'Dictionary with database statistics', which is vague. However, all 4 optional parameters are explained, and the tool's scope is clear. Could be improved by detailing output structure.
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 0%, but the description explains each parameter (e.g., 'include_table_stats: Include per-table statistics (row counts, sizes)') adding meaningful context beyond the schema's title and default values.
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's purpose: 'Get comprehensive database statistics and analytics'. It lists specific categories (e.g., overall size, table counts, cache hit rates), distinguishing it from siblings like d365fo_get_database_schema or d365fo_get_server_performance.
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 says 'Use this tool to understand the overall state and health of the metadata database' but does not explicitly exclude alternatives or mention when not to use it. Usage is implied rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_default_profileA
Get the current default D365FO environment profile.
Returns: Dictionary with default profile
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 states the return type ('Dictionary with default profile') but does not disclose whether the tool is read-only, requires authentication, or has side effects. The description is adequate but lacks detail.
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 (two sentences) and to the point. It could be slightly more structured but effectively communicates the essential purpose and return value without wasted 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 parameters and an output schema exists, the description is reasonably complete. It explains what the tool does and the return type. Missing context like potential errors or configuration sources, but for a simple getter it's sufficient.
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?
There are no parameters, and the input schema covers 100% (empty). The description does not need to add parameter info. The baseline for 0 parameters is 4, and the description provides sufficient context for 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 'Get the current default D365FO environment profile,' specifying the verb and resource. This distinguishes it from siblings like d365fo_get_profile (which gets a named profile) and d365fo_list_profiles (which lists all profiles).
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 such as d365fo_get_profile or d365fo_set_default_profile. The description does not mention when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_entity_recordA
Get a specific record from a D365FO data entity.
Args: entity_name: The entity's public collection name or entity set name (e.g., "CustomersV3", "SalesOrders", "DataManagementEntities") key_fields: List of key field names for composite keys key_values: List of key values corresponding to key fields select: List of fields to include in response expand: List of navigation properties to expand profile: Optional profile name
Returns: Dictionary with the entity record
| Name | Required | Description | Default |
|---|---|---|---|
| expand | No | ||
| select | No | ||
| profile | No | default | |
| key_fields | Yes | ||
| key_values | Yes | ||
| entity_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full burden. It states basic behavior (get a record) and return type, but fails to disclose edge cases (e.g., record not found), permissions, or side effects. For a read tool, this is adequate but not comprehensive.
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 concise and well-structured: a one-line purpose, a bulleted Args section, and a Returns line. Every sentence adds value with no redundancy. It is front-loaded with the core action.
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 6 parameters (3 required) and no output schema, the description explains all parameters well. However, it lacks detail on the return structure (only says 'Dictionary with the entity record') and does not cover error handling or behavior on missing records. This is a minor gap.
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 input schema has 0% description coverage, but the description fully compensates by explaining all 6 parameters, including examples for `entity_name` and clear definitions for `key_fields`/`key_values`, `select`, `expand`, and `profile`. It adds significant meaning beyond the raw schema.
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 'Get a specific record from a D365FO data entity', using a specific verb and resource. It distinguishes from sibling tools like `d365fo_query_entities` (which lists records) and CRUD operations. The name also reinforces the purpose.
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 does not provide any guidance on when to use this tool versus alternatives (e.g., `d365fo_query_entities` for multiple records, or `d365fo_create_entity_record`). No when-to-use, when-not-to-use, or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_entity_schemaA
Get the detailed schema for a specific D365 F&O data entity, including properties, keys, and available actions.
Args: entityName: The public name of the entity (e.g., 'CustomerV3'). include_properties: Set to true to include detailed information about each property (field) in the entity. resolve_labels: Set to true to resolve and include human-readable labels for the entity and its properties. language: The language to use for resolving labels (e.g., 'en-US', 'fr-FR'). profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with entity schema
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| language | No | en-US | |
| entityName | Yes | ||
| resolve_labels | No | ||
| include_properties | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It describes parameters and return but does not disclose side effects (likely read-only), authentication requirements, or error behavior. Lacks transparency for a schema retrieval tool.
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?
Well-structured with Args and Returns sections; purpose is front-loaded. While efficient, the description is slightly longer than necessary, but each sentence adds value.
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 and description only says 'Dictionary with entity schema' — vague. Does not explain return structure, possible errors, or handling of invalid entity names. Incomplete for a tool with 5 parameters and no output schema.
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 0%, so description must compensate. It provides detailed, clear explanations for all 5 parameters (entityName, include_properties, resolve_labels, language, profile), including examples and defaults, adding value beyond the raw schema.
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?
Clearly states 'Get the detailed schema for a specific D365 F&O data entity' — a specific verb+resource. It distinguishes from sibling tools like d365fo_get_database_schema and d365fo_get_table_info by focusing on entity schema.
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?
Explains parameters but does not give guidance on when to use this tool versus alternatives like d365fo_get_database_schema or d365fo_get_entity_record. No explicit when-not or context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_enumeration_fieldsA
Get the detailed members (fields) and their values for a specific D365 F&O enumeration.
Args: enumeration_name: The exact name of the enumeration (e.g., 'NoYes', 'CustVendorBlocked'). resolve_labels: Set to true to resolve and include human-readable labels for the enumeration and its members. language: The language to use for resolving labels (e.g., 'en-US', 'fr-FR'). profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with enumeration details
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| language | No | en-US | |
| resolve_labels | No | ||
| enumeration_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It describes the operation as read-only (getting fields) but does not explicitly state it is non-destructive or mention any side effects, authorization needs, or rate limits. The description is adequate but could be more transparent.
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 well-structured with a purpose statement, parameter list, and return value. It is front-loaded with the main action. However, the parameter descriptions could be slightly more concise, and the overall length is reasonable for the complexity.
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 retrieves enumeration fields and has no output schema, the description provides high-level return information but lacks specifics like the structure of the dictionary. For a simple retrieve operation it is mostly adequate, but more detail on the return format would improve completeness.
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 input schema has 0% description coverage, so the description must compensate. It provides clear explanations for each parameter: enumeration_name with example, resolve_labels and language with defaults and purpose, and profile as optional. This adds significant meaning beyond the schema.
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 detailed members and values for a specific D365 F&O enumeration. The verb 'get' and resource 'enumeration fields' are specific. It differentiates from sibling tools like d365fo_search_enumerations which searches for enumerations, not their fields.
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 implies usage when needing enumeration details but does not explicitly state when to use this tool versus alternatives. No exclusions or when-not conditions are provided. The parameter description for profile mentions optional use but lacks guidance on when to specify it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_environment_infoA
Get D365FO environment information and version details.
Args: profile: Optional profile name (uses default if not specified)
Returns: JSON string with environment information
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It implies a read operation but does not disclose safety, permissions, or side effects, which is insufficient for a tool with zero annotation coverage.
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 concise, with a clear purpose followed by structured Args and Returns sections. Every line adds value with no redundancy.
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?
Adequately covers purpose and parameter but lacks details on the return value content (e.g., what specific 'environment information' is included) and potential errors. For a simple read tool, it is minimally sufficient.
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?
With 0% schema description coverage, the description adds value by explaining that the 'profile' parameter is optional and defaults to 'default', which is not evident from the schema alone.
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 D365FO environment information and version details, with a specific verb and resource. It is distinct from sibling 'get_' tools like get_server_config or get_entity_schema.
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 explicit guidance on when to use this tool versus alternatives. The description only states what it does, leaving the agent to infer usage context without differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_installed_modulesB
Get the list of installed modules in the D365 F&O environment with their details including name, version, module ID, publisher, and display name.
Args: profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with installed modules
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It implies a read operation but does not explicitly state that it is non-destructive or clarify permissions, rate limits, or other behavioral aspects.
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 concise, with a clear purpose first, followed by parameter and return details. No unnecessary words, though the Args section could be formatted more cleanly.
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 no output schema, the description lists the expected fields (name, version, etc.) and states the return type as dictionary. It is fairly complete for a simple retrieval tool, though the exact dictionary structure could be more explicit.
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?
Despite 0% schema description coverage, the description explains the profile parameter's purpose and default behavior (optional, uses default if not specified). This adds value beyond the schema's default value.
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 a list of installed modules with specific details like name, version, module ID, publisher, and display name. It is a specific verb (Get) and resource (installed modules), but does not explicitly differentiate from sibling tools like d365fo_get_entity_record.
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. The description only states what it does, with no context on use cases or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_labelC
Get label text by label ID.
Args: labelId: Label ID (e.g., @SYS1234) language: Language code for label text fallbackToEnglish: Fallback to English if translation not found profile: Optional profile name
Returns: Dictionary with label text
| Name | Required | Description | Default |
|---|---|---|---|
| labelId | Yes | ||
| profile | No | default | |
| language | No | en-US |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It does not disclose behavioral traits such as authentication requirements, error handling (e.g., if label not found), or whether the operation is read-only. Minimal transparency.
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 concise but includes a list of arguments in a structured format. However, the inaccuracy of listing a missing parameter reduces reliability.
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 simplicity (3 params, no output schema), the description should provide a complete picture. It lacks details on return format, error behavior, and has a parameter mismatch, making it insufficiently complete.
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 meaning to parameters (e.g., example for labelId) and explains language and profile, but it mentions a parameter 'fallbackToEnglish' that is not in the schema, causing inconsistency. With 0% schema description coverage, the description provides some but incomplete semantic value.
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 'Get label text by label ID', indicating the verb and resource. The name and single vs batch retrieval distinguish it from sibling tool d365fo_get_labels_batch, though explicit differentiation is missing.
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 (e.g., batch retrieval). The description lacks context for appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_labels_batchB
Get multiple labels in a single request.
Args: labelIds: List of label IDs to retrieve language: Language code for label texts fallbackToEnglish: Fallback to English if translation not found profile: Optional profile name
Returns: Dictionary with label texts
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| labelIds | Yes | ||
| language | No | en-US |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and description only mentions return type (dictionary) without discussing side effects, rate limits, or other behaviors.
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?
Concise docstring format, but the inclusion of a parameter not in the schema reduces clarity.
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, and description only states returns dictionary without specifying structure. Missing parameter discrepancy reduces completeness.
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?
Adds partial meaning to parameters but includes a parameter 'fallbackToEnglish' not present in the input schema, causing confusion. Schema coverage is 0%, so description should compensate but fails.
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 multiple labels in a single request, differentiating it from the sibling tool d365fo_get_label which retrieves a single label.
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 explicit guidance on when to use this tool over alternatives. The batch nature implies use for multiple labels, but no when-not or alternative references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_profileA
Get details of a specific D365FO environment profile.
Args: profileName: Name of the profile to retrieve
Returns: Dictionary with profile details
| Name | Required | Description | Default |
|---|---|---|---|
| profileName | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only states 'Get details', which is minimal. It does not disclose any behavior beyond the basic read operation, such as error handling or required permissions.
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 and to the point, with no unnecessary words. It includes an Args/Returns structure, though minimal. Appropriate for a simple tool.
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 output schema exists and the tool is simple with one parameter, the description covers the essential purpose and parameter. It lacks error information but is otherwise complete for this context.
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 schema has 0% description coverage, but the description adds the meaning of profileName as 'Name of the profile to retrieve'. This provides basic semantics, though could be more detailed.
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 details of a specific D365FO environment profile' clearly states the verb (Get) and resource (profile), and distinguishes it from sibling tools like list_profiles, search_profiles, and create_profile.
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 explicit guidance on when to use this tool versus alternatives. The description implies use for retrieving a single profile by name, but lacks when-not-to-use or alternative suggestions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_profile_namesB
Get list of all D365FO environment profile names.
Returns: Dictionary with profile names
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full transparency burden. It correctly indicates a read operation ('Get list'), but does not disclose any additional behavioral traits such as authentication needs, performance implications, or return format beyond a vague 'Dictionary with profile names'.
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 and to the point, with two efficient sentences. It could be slightly more structured, but for a simple no-parameter tool, it is appropriately 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?
Given the presence of many sibling tools related to profiles, the description lacks context about how this tool fits in. It does not clarify its uniqueness or relationship to 'd365fo_list_profiles'. The output schema exists but its details are not visible; the description's vague return type is marginally adequate.
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 input schema has no parameters, so the description cannot add value beyond the schema. Baseline score of 4 is appropriate as there are no parameters to explain.
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 all D365FO environment profile names, which is a specific operation. However, the sibling tool 'd365fo_list_profiles' also deals with profiles and the description does not differentiate between them, slightly reducing 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 is provided on when to use this tool over alternatives like 'd365fo_list_profiles' or others. The description lacks context for appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_server_configC
Get current FastMCP server configuration and feature status.
Returns: Dict with server configuration
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must explicitly state side effects. It describes the operation as getting configuration, implying a read-only action, but does not confirm it is safe or non-destructive. No behavioral traits beyond the core function are disclosed.
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 extremely concise at 10 words, which is efficient but lacks essential context. It front-loads the purpose but does not earn its brevity due to missing behavioral details and usage guidance.
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 no output schema, no annotations, and a simple parameter set, the description fails to explain what the returned dictionary contains or what 'feature status' entails. It is incomplete for an agent to infer output structure or error conditions.
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 tool has zero parameters, and the input schema fully covers the parameter space (100% coverage). The description adds no parameter information, which is acceptable as there are none. Per the baseline for 0 parameters, a score of 4 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?
The description clearly states the tool retrieves server configuration and feature status, using the verb 'Get' and specifying the resource. However, it does not differentiate from sibling tools like get_environment_info or get_server_performance, which may also query server-related settings.
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 over alternatives. There is no mention of context, prerequisites, or when not to use it, 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.
d365fo_get_server_performanceA
Get FastMCP server performance statistics and health metrics.
Returns: Dict with server performance data
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It only states the return type (dict) without mentioning if the operation is read-only, safe, or has any side effects. The agent cannot infer that this is a non-destructive call.
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 extremely concise: two short sentences that front-load the purpose. There is no redundant or irrelevant text, and every word earns its place.
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 zero parameters, no annotations, and no output schema, the description is adequately specific about the resource and return type. However, it lacks details on the structure of the performance data, which could be helpful but is not critical for such a simple 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?
With zero parameters, the schema provides all necessary information. The description adds no additional meaning about parameters, but the baseline for 0 parameters is 4, and no extra value is needed.
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 it retrieves server performance statistics and health metrics, using the verb 'Get' with a specific resource. It distinguishes from siblings like 'get_server_config' and 'get_database_statistics' by focusing on performance.
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 instead of alternatives. It does not mention that it is for monitoring performance vs. configuration or diagnostic purposes, nor does it provide any prerequisites or context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_sync_historyB
Get the history of completed sync sessions including success/failure status, duration, and statistics.
Args: limit: Maximum number of historical sessions to return (default: 20, max: 100) profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with sync history
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| profile | No | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must carry full burden. It discloses it returns a dictionary with sync history but lacks detail on read-only nature, authentication requirements, rate limits, or behavior when no sessions exist. Mentions only completed sessions, which is helpful but insufficient.
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?
Extremely concise: one sentence for purpose, clearly labeled Args and Returns. Every sentence is necessary with no fluff. Excellent front-loading of key information.
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 tool with 2 parameters and no output schema, description explains parameters and return type but is vague on return content (just 'dictionary with sync history'). Missing details on fields, pagination, or error handling. Adequate but has gaps.
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 0%, so description adds meaning. Explains limit with default and max (100), profile with default and optional. Provides constraints and usage context beyond schema types and defaults.
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 gets history of completed sync sessions with status and statistics. The verb 'get' and resource are specific, but does not explicitly differentiate from sibling d365fo_list_sync_sessions, which might be similar.
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 explicit guidance on when to use this tool versus alternatives. Does not mention exclusions, prerequisites, or compare to sibling tools like d365fo_get_sync_progress or d365fo_list_sync_sessions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_sync_progressA
Get detailed progress information for a specific sync session including current phase, completion percentage, items processed, and estimated time remaining.
Args: session_id: Session ID of the sync operation to check progress for profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with sync progress
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It states it returns progress info but does not disclose side effects (assumed read-only), auth needs, or rate limits. Could be more transparent about 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?
Description is short, front-loaded with purpose, and has clear Args and Returns sections. Some redundancy possible, but generally efficient.
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 no output schema, the description adequately explains the return content (phase, completion percentage, etc.). It covers both parameters. Could better differentiate from siblings, but sufficient for this simple 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?
The description explains session_id as the ID of the sync operation and profile as optional with default usage, adding context beyond the schema titles. Good clarification for a 0% 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 clearly states it gets detailed progress information for a specific sync session, listing specific data fields. This distinguishes it from siblings like list_sync_sessions and get_sync_history.
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 vs alternatives. Does not mention prerequisites or when not to use. Only says it requires session_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_get_table_infoA
Get detailed information about a specific database table including:
Column definitions with types, nullability, and defaults
Primary and foreign key constraints
Indexes and their characteristics
Table statistics (row count, size, last updated)
Sample data (first few rows)
Relationships to other tables
This tool is useful for exploring specific tables before writing queries.
Args: table_name: Name of the table to get information about (e.g., 'data_entities', 'public_entities', 'entity_properties'). include_sample_data: Include sample data from the table (first 5 rows). include_relationships: Include information about relationships to other tables. profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with table information
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| table_name | Yes | ||
| include_sample_data | No | ||
| include_relationships | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It describes the tool as a read-only query returning detailed information, which is good, but it omits potential performance impacts, authorization requirements, or behavior on missing tables.
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 structured with bullet points and an Args section, making it easy to scan. It is front-loaded with the purpose. Though somewhat lengthy, every sentence adds value, so it is concise enough for the detail provided.
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 no output schema, the description explains the return value as a dictionary with listed categories. It covers the key aspects of table info. However, it lacks guidance on error handling (e.g., table not found) and could compare against sibling tools for completeness.
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 0%, so the description compensates fully. It explains each parameter: table_name with an example, include_sample_data and include_relationships with their defaults and effects, and profile as optional. This adds significant meaning beyond the schema titles.
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 'Get detailed information about a specific database table' and lists specific aspects like column definitions, keys, indexes, statistics, and sample data. This distinguishes it from sibling tools such as d365fo_get_database_schema (which covers all tables) and d365fo_get_entity_schema (which focuses on entities).
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 explicitly says 'This tool is useful for exploring specific tables before writing queries,' providing clear context. However, it does not specify when not to use it or mention alternatives, though the sibling list implies alternatives exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_import_profilesA
Import D365FO environment profiles from a file.
Args: filePath: Path to the file containing profiles to import overwrite: Whether to overwrite existing profiles with the same name
Returns: Dictionary with import results
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | ||
| overwrite | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must convey behavioral traits. It only states that the tool imports profiles and returns a dictionary, lacking details on side effects (e.g., overwrite behavior when overwrite is false), error handling, file format expectations, or any destructive potential.
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 concise, with a one-line purpose followed by structured Args and Returns sections. Every sentence is necessary and adds value.
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 2-parameter tool with no annotations and an existing output schema, the description is fairly complete but misses details such as the file format, default overwrite behavior (though schema shows default false), and error handling. The output description is minimal.
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?
Since the input schema has no descriptions (0% coverage), the description adds meaningful explanations: filePath is the file path, overwrite indicates whether to overwrite existing profiles. This compensates for the schema gap, though it does not specify file format or restrictions.
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 imports profiles from a file, using a specific verb ('Import') and resource ('D365FO environment profiles'). This distinguishes it from sibling tools like export_profiles (export) and create_profile (single profile creation).
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 such as create_profile or export_profiles. There is no mention of prerequisites, when not to use it, or context for bulk import vs. single creation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_list_profilesA
Get list of all available D365FO environment profiles.
Returns: Dictionary with list of profiles
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must carry the full burden. It describes a read-only operation returning a list, but lacks details about performance, data volume, or impact. Adequate but minimal.
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?
Two sentences, front-loaded with purpose, no extraneous words. Highly efficient.
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 simplicity of a parameterless list tool, the description is sufficient. However, with many sibling tools, a bit more detail on what constitutes a 'profile' would improve completeness.
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?
No parameters exist (0 params, 100% schema coverage). Per guidelines, baseline is 4; description adds nothing but needs nothing more.
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 action ('Get list') and resource ('all available D365FO environment profiles'), distinguishing it from siblings like get_profile (single) or search_profiles (filterable).
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 vs. alternatives such as search_profiles or get_profile_names. There is no mention of context, exclusions, or recommended scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_list_sync_sessionsA
Get a list of all currently active sync sessions with their status, progress, and details.
Args: profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with active sync sessions
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states it lists sessions, implying read-only, but does not mention if it requires authentication, rate limits, or any side effects. For a non-annotated tool, this is insufficient.
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 concise with two sentences plus parameter and return notes. Every sentence serves a purpose, and the main action is front-loaded.
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 (one optional param, no output schema), the description covers the basics: what it does, input, and return type. However, it lacks details on the dictionary structure (keys like status, progress). It is adequate but not fully comprehensive.
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 schema has 0% description coverage, but the description explains the 'profile' parameter, including its optionality and default behavior. This adds meaningful context beyond the schema's type and default value.
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 a list of currently active sync sessions with status and progress. It is specific and distinguishes from sibling tools like d365fo_get_sync_history (historical) and d365fo_get_sync_progress (single session).
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 implies usage when an overview of active sync sessions is needed, but does not provide explicit guidance on when not to use this tool or suggest alternatives among the many sync-related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_query_entitiesA
Query D365FO data entities with simplified filtering capabilities.
Args: entity_name: The entity's public collection name or entity set name (e.g., "CustomersV3", "SalesOrders", "DataManagementEntities") select: List of field names to include in response filter: Simplified filter expression using only "eq" operation with wildcard support: - Basic equality: "FieldName eq 'value'" - Starts with: "FieldName eq 'value*'" - Ends with: "FieldName eq '*value'" - Contains: "FieldName eq 'value'" - Enum values: "StatusField eq Microsoft.Dynamics.DataEntities.EnumType'EnumValue'" Example: "SalesOrderStatus eq Microsoft.Dynamics.DataEntities.SalesStatus'OpenOrder'" order_by: List of field names to sort by (e.g., ["CreatedDateTime desc", "SalesId"]) top: Maximum number of records to return (default: 100) skip: Number of records to skip for pagination count: Whether to include total count in response expand: List of navigation properties to expand profile: Profile name for connection configuration
Returns: Dictionary with query results including data array, count, and pagination info
Note: This tool uses simplified OData filtering that only supports "eq" operations with wildcard patterns. For complex queries, retrieve data first and filter programmatically.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| skip | No | ||
| count | No | ||
| expand | No | ||
| filter | No | ||
| select | No | ||
| profile | No | default | |
| order_by | No | ||
| entity_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It describes the query behavior, simplified OData filtering, and return format (dictionary with data, count, pagination). It does not mention auth or rate limits, but such details are less critical for a read-only query tool.
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?
Description is well-structured with Args, Returns, and Note sections. It is informative without being overly verbose. Minor redundancy in explaining filter patterns could be tightened, but overall efficient.
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 no output schema, description adequately explains return type. All 9 parameters are documented, including complicated filter syntax. Missing some edge cases like error handling, but for a query tool this is sufficient.
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 0%, so description must compensate. It thoroughly explains each parameter, especially filter with detailed examples of wildcard patterns and enum values. This provides far more meaning than the schema alone.
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 queries D365FO data entities with simplified filtering. It distinguishes from siblings like d365fo_get_entity_record (single record) and d365fo_create_entity_record (creation) by focusing on querying multiple entities with filtering and pagination.
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?
Explicitly notes that only 'eq' operations with wildcards are supported, and advises to retrieve data first and filter programmatically for complex queries. This provides clear when-not-to-use guidance, though it does not explicitly compare to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_reset_performance_statsB
Reset server performance statistics.
Returns: Dict with reset confirmation
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says 'reset' implying a destructive action but does not specify consequences, permissions required, or side effects. Since no annotations are present, the description should have provided more behavioral detail.
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 concise with two short sentences. No wasted words; every sentence adds value.
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 no parameters, no output schema, and simple semantics, the description is adequate but lacks context like when resetting is appropriate, if it requires a connection, or what happens during reset.
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?
There are no parameters, and schema coverage is 100%. The description does not need to add meaning for params, but it also does not confirm the absence of inputs. A baseline of 4 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?
The description clearly states it resets server performance statistics, which is a specific verb+resource. However, it does not differentiate from sibling tools like d365fo_get_server_performance or d365fo_get_database_statistics, so it's not a 5.
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 vs. alternatives. There is no mention of prerequisites, conditions, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_search_actionsA
Search for available OData actions in D365 F&O using simple keyword-based search.
IMPORTANT: When searching for actions, break down user requests into individual keywords and perform MULTIPLE searches:
Extract keywords from requests (e.g., "posting actions" → "post", "posting")
Perform separate searches for each keyword using simple text matching
Combine and analyze results from all searches
Look for actions that match the combination of concepts
SEARCH STRATEGY EXAMPLES:
"posting actions" → Search for "post", then look for posting-related actions
"validation functions" → Search for "valid" and "check", then find validation actions
"workflow actions" → Search for "workflow" and "approve", then combine results
Use simple keywords, not complex patterns. Actions are operations that can be performed on entities or globally.
Args: pattern: Simple keyword or text to search for in action names. Use plain text keywords, not regex patterns. For requests like 'posting actions': 1) Extract keywords: 'post', 'posting' 2) Search for each keyword: 'post' 3) Perform multiple searches for related terms 4) Analyze combined results. Use simple text matching. entityName: Optional. Filter actions that are bound to a specific data entity (e.g., 'CustomersV3'). bindingKind: Optional. Filter by binding type: 'Unbound' (can call directly), 'BoundToEntitySet' (operates on entity collections), 'BoundToEntityInstance' (requires specific entity key). isFunction: Optional. Filter by type: 'true' for functions (read-only), 'false' for actions (may have side-effects). Note: This filter may not be fully supported yet. limit: Maximum number of matching actions to return. profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with matching actions
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| pattern | Yes | ||
| profile | No | default | |
| entityName | No | ||
| isFunction | No | ||
| bindingKind | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations present, so description bears full burden. It notes that isFunction filter may not be fully supported and distinguishes between functions (read-only) and actions (may have side-effects). Returns dictionary of matching actions. Does not contradict any structured data.
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?
Well-structured with sections and examples, but contains some redundancy (search strategy repeated in pattern arg). Still concise for the amount of guidance provided.
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 no output schema, description minimally states 'Returns dictionary with matching actions'. Lacks details on pagination, error handling, or additional response fields. Adequate but could be more complete.
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 0%, yet the description adds detailed explanations for all 6 parameters including pattern (keyword search), entityName (entity filter), bindingKind (binding type), isFunction (with caveat), limit, and profile. This compensates fully for schema gaps.
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 searches for OData actions in D365 F&O using keyword-based search. It distinguishes itself from sibling tools like d365fo_search_entities by focusing specifically on actions.
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?
Provides explicit search strategy: break down requests into keywords, perform multiple searches, combine results. Includes examples and warns against complex patterns. This gives clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_search_entitiesB
Search for D365 F&O data entities using simple keyword-based search.
IMPORTANT: When a user asks for something like "Get data management entities" or "Find customer group entities", break the request into individual keywords and perform MULTIPLE searches, then analyze all results:
Extract individual keywords from the request (e.g. "data management entities" → "data", "management", "entities")
Perform separate searches for each significant keyword using simple text matching
Combine and analyze results from all searches
Look for entities that match the combination of concepts
SEARCH STRATEGY EXAMPLES:
"data management entities" → Search for "data", then "management", then find entities matching both concepts
"customer groups" → Search for "customer", then "group", then find intersection
"sales orders" → Search for "sales", then "order", then combine results
Use simple keywords, not complex patterns. The search will find entities containing those keywords.
Args: pattern: Simple keyword or text to search for in entity names. Use plain text keywords, not regex patterns. For multi-word requests like 'data management entities': 1) Break into keywords: 'data', 'management' 2) Search for each keyword separately: 'data' then 'management' 3) Run separate searches for each keyword 4) Analyze combined results. Examples: use 'customer' to find customer entities, 'group' to find group entities. entity_category: Filter entities by their functional category (e.g., Master, Transaction). data_service_enabled: Filter entities that are enabled for OData API access (e.g., for querying). data_management_enabled: Filter entities that can be used with the Data Management Framework (DMF). is_read_only: Filter entities based on whether they are read-only or support write operations. limit: Maximum number of matching entities to return. Use smaller values (10-50) for initial exploration, larger values (100-500) for comprehensive searches. profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with matching entities
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| pattern | Yes | ||
| profile | No | default | |
| is_read_only | No | ||
| entity_category | No | ||
| data_service_enabled | No | ||
| data_management_enabled | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description explains the keyword-based search behavior and the multi-search logic. It does not disclose performance characteristics, case sensitivity, or what happens with empty results.
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 front-loaded with the main purpose and then provides detailed usage instructions. While slightly verbose, every section adds useful context, and the structure is well-organized.
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 complexity and lack of output schema, the description adequately covers the search logic. However, it omits details about return values beyond a vague 'dictionary', and does not discuss error handling or edge cases.
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 0%, so the description must compensate. It provides good detail for the required 'pattern' parameter and limited guidance for 'limit', but other parameters like entity_category and is_read_only get only minimal 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 identifies the tool as searching for D365 F&O data entities via keyword-based search. However, it does not explicitly differentiate from the sibling tool d365fo_query_entities, which may cause confusion.
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?
Provides detailed instructions on when to use the tool, including a multi-search strategy for multi-word queries. However, it lacks guidance on when not to use it and does not mention alternative tools like d365fo_query_entities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_search_enumerationsA
Search for enumerations (enums) in D365 F&O using simple keyword-based search.
IMPORTANT: When searching for enumerations, break down user requests into individual keywords and perform MULTIPLE searches:
Extract keywords from requests (e.g., "customer status enums" → "customer", "status")
Perform separate searches for each keyword using simple text matching
Combine and analyze results from all searches
Look for enums that match the combination of concepts
SEARCH STRATEGY EXAMPLES:
"customer status enums" → Search for "customer", then "status", then find status-related customer enums
"blocking reasons" → Search for "block" and "reason", then combine results
"approval states" → Search for "approval" and "state", then find approval-related enums
Use simple keywords, not complex patterns. Enums represent lists of named constants (e.g., NoYes, CustVendorBlocked).
Args: pattern: Simple keyword or text to search for in enumeration names. Use plain text keywords, not regex patterns. For requests like 'customer blocking enums': 1) Extract keywords: 'customer', 'blocking' 2) Search for each keyword: 'customer' then 'blocking' 3) Perform multiple searches 4) Analyze combined results. Use simple text matching. limit: Maximum number of matching enumerations to return. profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with matching enumerations
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| pattern | Yes | ||
| profile | No | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the search behavior: simple text matching, not regex, and a multi-step strategy. It also specifies the return type (dictionary of enumerations). Since no annotations are provided, the description carries the full burden and does so effectively, though it does not mention potential errors or rate limits.
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 well-structured with bolded sections (IMPORTANT, SEARCH STRATEGY EXAMPLES, Args, Returns). It is front-loaded with the purpose, and every sentence adds value, including concrete examples that illustrate the search strategy. Despite its length, it is efficient.
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 complexity (multi-keyword search strategy), no output schema, and no annotations, the description covers purpose, parameters, usage strategy, and return type thoroughly. It could mention error handling or edge cases, but overall it is sufficiently complete 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?
With 0% schema description coverage, the description greatly expands on each parameter. It clarifies 'pattern' must be plain text keywords (not regex) and provides step-by-step usage examples. 'Limit' and 'profile' are also explained, adding crucial context beyond the schema.
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 searches for enumerations using simple keyword-based search, specifying it is for D365 F&O. This distinguishes it from sibling search tools like d365fo_search_actions and d365fo_search_entities by explicitly targeting enums.
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 detailed guidance on how to use the tool (break queries into keywords, perform multiple searches), but does not explicitly compare it to alternatives or state when not to use it. The usage is implicit: use when enumerations are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_search_profilesA
Search D365FO environment profiles based on criteria.
Args: pattern: Pattern to match in profile name, description, or base URL hasCredentialSource: Filter by presence of credential source (True=has credential source, False=uses default credentials) credentialSourceType: Filter by credential source type ("environment", "keyvault")
Returns: Dictionary with matching profiles
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | No | ||
| hasCredentialSource | No | ||
| credentialSourceType | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It correctly describes a read-only search operation returning a dictionary, which aligns with typical search behavior. However, it lacks details on authentication requirements, rate limits, or potential side effects, though none are expected.
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 well-structured with clear sections (title, Args, Returns). It is concise, with no superfluous sentences, and front-loads the core purpose. Every element earns its place.
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 output schema exists (context signals), the description's 'Returns' summary is adequate. All three parameters are thoroughly explained, and the tool's purpose is fully covered for a search operation. No gaps remain for effective use.
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 0%, so the description must compensate. The 'Args' section explains each parameter clearly: 'pattern' for matching, 'hasCredentialSource' for filtering by credential presence, and 'credentialSourceType' for filtering by type. This adds significant meaning beyond the bare schema names.
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 action ('Search') and resource ('D365FO environment profiles'). It distinguishes from sibling tools like 'd365fo_list_profiles' (which lists all profiles without filtering) and 'd365fo_get_profile' (retrieves a specific profile by ID), making the purpose unambiguous.
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 implies usage when specific profile criteria need to be applied, but it does not explicitly state when to use this tool versus alternatives (e.g., 'list_profiles' for unfiltered listing or 'get_profile' for exact match). No when-not-to-use guidance or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_set_default_profileA
Set the default D365FO environment profile.
Automatically refreshes all cached client connections since changing the default profile may affect client resolution for operations that use the default profile.
Args: profileName: Name of the profile to set as default
Returns: Dictionary with result including client refresh status
| Name | Required | Description | Default |
|---|---|---|---|
| profileName | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes on the full burden. It discloses a key behavioral trait: 'Automatically refreshes all cached client connections since changing the default profile may affect client resolution.' This is valuable, though it could also mention potential permission requirements or irreversibility.
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 concise (~70 words) and well-structured: a clear header line, a paragraph explaining the side effect, and structured Args/Returns sections. Every sentence adds value.
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 (one parameter, no enums, output schema exists), the description is mostly complete. It explains the main function and side effect. However, it could mention error cases (e.g., profile not found) or confirm the result behavior.
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 schema has 0% description coverage, so the description must compensate. The Args section provides a basic description: 'Name of the profile to set as default.' This adds some meaning beyond the schema, but it lacks details like validation rules or expected format.
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 'Set the default D365FO environment profile,' which is a specific verb+resource. It distinguishes itself from sibling tools like d365fo_get_default_profile and d365fo_create_profile by indicating a set operation.
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 does not provide guidance on when to use this tool versus alternatives. It mentions a side effect but lacks explicit context like 'Use this to change the active profile' or 'Do not use if you only need to create a new profile.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_start_syncB
Start a metadata synchronization session and return a session ID for tracking progress.
This downloads and caches metadata from D365 F&O including entities, schemas, enumerations, and labels.
Args: strategy: Sync strategy to use. 'full' downloads all metadata, 'entities_only' downloads just entities for quick refresh, 'labels_only' downloads only labels, 'full_without_labels' downloads all metadata except labels, 'sharing_mode' copies from compatible versions, 'incremental' updates only changes (fallback to full). global_version_id: Specific global version ID to sync. If not provided, will detect current version automatically. profile: Configuration profile to use (optional - uses default profile if not specified)
Returns: Dictionary with sync session details
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default | |
| strategy | No | full_without_labels | |
| global_version_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It mentions downloading and caching metadata but does not disclose side effects (e.g., whether it's destructive), idempotency, rate limits, or auth requirements. The return value is vaguely described.
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 clear and well-structured with a summary paragraph followed by an Args section. It is slightly verbose, as some details could be integrated, but overall it is efficient and front-loaded with the core purpose.
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?
The description adequately explains parameters but lacks details on the return value (only says 'Dictionary with sync session details') and does not mention prerequisites, error scenarios, or relationship to other sync tools. Given the absence of output schema, more context is needed.
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 schema has 0% description coverage, so the description compensates by explaining each parameter in detail, including the strategy options and their meanings, the global_version_id fallback behavior, and profile optionality. This adds significant value beyond the schema.
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 starts a metadata synchronization session and returns a session ID. It lists the types of metadata cached. However, it does not differentiate from sibling sync tools like d365fo_cancel_sync or d365fo_get_sync_progress.
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. There is no mention of prerequisites, such as needing an active connection, or when not to use it (e.g., if a sync is already running).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_test_connectionC
Test connection to D365FO environment.
Args: profile: Optional profile name to test (uses default if not specified)
Returns: JSON string with connection test results
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states it tests a connection and returns a JSON string, but does not mention side effects (e.g., whether any state is modified), authentication requirements, or error 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 short and front-loaded with the purpose, followed by structured Args and Returns sections. It is concise, though it could include more detail within its brevity.
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?
The description fails to provide complete context: no output schema exists, and the description does not specify the structure of the returned JSON, possible errors, or what constitutes a successful/failed test. For a test connection tool, this completeness gap is significant.
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 input schema has 0% description coverage, so the description adds meaning by stating the profile parameter is optional and uses a default if not specified. This adds value beyond the schema, but no further details on valid values or format.
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 tests a connection to a D365FO environment, using a primary verb and resource. However, it does not explicitly distinguish itself from the sibling tool d365fo_test_profile_connection, which likely tests a specific profile connection.
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, such as d365fo_test_profile_connection. It does not provide context for when or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_test_profile_connectionA
Test connection for a specific D365FO environment profile.
Args: profileName: Name of the profile to test
Returns: Dictionary with connection test result
| Name | Required | Description | Default |
|---|---|---|---|
| profileName | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full burden for behavioral disclosure. It only states 'Test connection' with no information about side effects, network calls, permissions, or safety. The return is vaguely described as 'dictionary with connection test result', but given an output schema exists, the description adds minimal transparency.
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 exceedingly concise, consisting of a one-line purpose followed by a brief Args/Returns format. Every sentence adds value, and there is no redundancy. It is front-loaded with the primary purpose.
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 (one parameter, output schema present), the description covers the essential purpose and parameter. However, the lack of behavioral context (e.g., connection type, potential errors) reduces completeness slightly. The existence of an output schema likely mitigates the need for return value details.
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?
With schema coverage at 0% (no parameter descriptions in the schema), the description compensates by explaining the required parameter 'profileName' as 'Name of the profile to test'. This adds meaningful context beyond the schema's type definition.
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 tests a connection for a specific D365FO environment profile. The verb 'test' and resource 'profile connection' are specific, and the tool name reinforces this purpose. It distinguishes from sibling tools like d365fo_test_connection by explicitly mentioning 'profile'.
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 does not provide any guidance on when to use this tool versus alternatives like d365fo_test_connection or d365fo_validate_profile. There is no mention of prerequisites, context, or when not to use it. The agent gets no help in decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_update_entity_recordB
Update an existing record in a D365 Finance & Operations data entity.
Args: entity_name: The entity's public collection name or entity set name (e.g., "CustomersV3", "SalesOrders", "DataManagementEntities") key_fields: List of key field names for composite keys key_values: List of key values corresponding to key fields data: Record data containing fields to update return_record: Whether to return the complete updated record profile: Optional profile name
Returns: Dictionary with update result
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| profile | No | default | |
| key_fields | Yes | ||
| key_values | Yes | ||
| entity_name | Yes | ||
| return_record | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must carry full behavioral transparency. It indicates mutation ('update') and optional return via return_record, but omits details on error handling, idempotency, concurrency, or what happens if the record does not exist. For a mutation tool, this is insufficient.
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 concise: a one-line summary followed by structured Args and Returns. It is front-loaded with the core purpose. However, it could be slightly more compact by omitting docstring conventions (Args, Returns headings) or adding a sentence on typical usage.
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 no annotations, no output schema, and 6 parameters with nested objects, the description could be more complete. It lacks details on return value format ('Dictionary with update result' is vague), error behavior, and required permissions. The sibling list includes many operations, but this tool's description does not help an agent decide when to invoke it.
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 0%, but the description provides meaningful explanations for all parameters. For example, entity_name is defined as 'public collection name or entity set name' with examples. key_fields and key_values are described as for composite keys. This adds value beyond the schema field names.
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 'Update an existing record in a D365 Finance & Operations data entity.' This uses a specific verb ('update') and resource ('existing record in D365 FO data entity'), distinguishing it from sibling tools like create_entity_record and delete_entity_record.
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 lacks guidance on when to use this tool vs alternatives. It does not mention that the entity must already exist, nor does it contrast with create (for new records) or delete. No context on prerequisites or typical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_update_profileB
Update an existing D365FO environment profile with full configuration options.
Automatically invalidates all cached client connections to ensure they pick up the new profile settings on next use.
Args: name: Profile name baseUrl: D365FO base URL description: Profile description verifySsl: Whether to verify SSL certificates timeout: Request timeout in seconds useLabelCache: Whether to enable label caching labelCacheExpiryMinutes: Label cache expiry in minutes useCacheFirst: Whether to use cache-first behavior language: Default language code cacheDir: Custom cache directory path outputFormat: Default output format for CLI operations credentialSource: Credential source configuration. Set to null to use Azure Default Credentials. Can be: - Environment variables: {"sourceType": "environment", "clientIdVar": "MY_CLIENT_ID", "clientSecretVar": "MY_CLIENT_SECRET", "tenantIdVar": "MY_TENANT_ID"} - Azure Key Vault: {"sourceType": "keyvault", "vaultUrl": "https://vault.vault.azure.net/", "clientIdSecretName": "D365FO_CLIENT_ID", "clientSecretSecretName": "D365FO_CLIENT_SECRET", "tenantIdSecretName": "D365FO_TENANT_ID"}
Returns: Dictionary with update result including number of clients invalidated
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| baseUrl | No | ||
| timeout | No | ||
| cacheDir | No | ||
| language | No | ||
| verifySsl | No | ||
| description | No | ||
| outputFormat | No | ||
| useCacheFirst | No | ||
| useLabelCache | No | ||
| credentialSource | No | ||
| labelCacheExpiryMinutes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that it 'automatically invalidates all cached client connections,' a behavioral trait beyond the name. No annotations are provided, so the description carries full burden; it adds meaningful context about side effects and return value.
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 includes a parameter list and return type, but the parameter list largely duplicates schema information. It is moderately concise but could be shortened by omitting parameter names already present in the schema.
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 12 parameters and a nested object, the description covers purpose, a key behavioral detail (cache invalidation), and return structure. However, it lacks explanations for most parameters, leaving the agent without essential context for many inputs.
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 0%. The description lists parameter names but only explains the 'credentialSource' parameter in detail. The other 11 parameters have no additional semantics beyond what the schema provides (type, default).
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 states 'Update an existing D365FO environment profile with full configuration options,' clearly indicating the verb (update) and resource (profile). This distinguishes it from siblings like create_profile and delete_profile.
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 like d365fo_create_profile or d365fo_clone_profile. It does not mention prerequisites, limitations, or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_validate_profileA
Validate a D365FO environment profile configuration.
Args: profileName: Name of the profile to validate
Returns: Dictionary with validation result
| Name | Required | Description | Default |
|---|---|---|---|
| profileName | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must fully disclose behavior. It states it validates and returns a dictionary, but does not specify if the operation is read-only, whether it connects to the environment, what side effects may occur, or what the validation result contains beyond being a dictionary. This lack of detail limits an agent's ability to predict tool 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 concise with a clear structure: purpose sentence followed by Args and Returns sections. Every sentence is essential, and the information is front-loaded, making it easy for an agent to quickly understand the tool.
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 one parameter and an output schema (though not detailed), the description provides the basics. However, it lacks context about what validation entails, whether the profile must exist, or potential errors. This is adequate but not comprehensive for a validation tool that could have nuanced behavior.
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 basic meaning to the single parameter 'profileName' by calling it 'Name of the profile to validate', which is more informative than the schema's title 'Profilename'. However, it does not provide additional details like case sensitivity or format, and with 0% schema description coverage, the contribution is moderate.
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 'Validate a D365FO environment profile configuration', using a specific verb and resource. Among sibling tools like create, delete, get, or test_profile_connection, this one uniquely focuses on validation, making its purpose distinct.
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 implies validation of a profile configuration, but does not explicitly state when to use this tool versus alternatives such as test_profile_connection or get_profile. No guidance on prerequisites or when not to use it is provided.
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.
49 tool updates
v0.3.6- First observed
d365fo_call_action - First observed
d365fo_call_json_service - First observed
d365fo_cancel_sync - First observed
d365fo_clone_profile - First observed
d365fo_create_entity_record - First observed
d365fo_create_profile - First observed
d365fo_delete_entity_record - First observed
d365fo_delete_profile - First observed
d365fo_download_customer_invoice - First observed
d365fo_download_debit_credit_note - First observed
d365fo_download_free_text_invoice - First observed
d365fo_download_purchase_order - First observed
d365fo_download_sales_confirmation - First observed
d365fo_download_srs_report - First observed
d365fo_execute_sql_query - First observed
d365fo_export_profiles - First observed
d365fo_get_database_schema - First observed
d365fo_get_database_statistics - First observed
d365fo_get_default_profile - First observed
d365fo_get_entity_record - First observed
d365fo_get_entity_schema - First observed
d365fo_get_enumeration_fields - First observed
d365fo_get_environment_info - First observed
d365fo_get_installed_modules - First observed
d365fo_get_label - First observed
d365fo_get_labels_batch - First observed
d365fo_get_profile - First observed
d365fo_get_profile_names - First observed
d365fo_get_server_config - First observed
d365fo_get_server_performance - First observed
d365fo_get_sync_history - First observed
d365fo_get_sync_progress - First observed
d365fo_get_table_info - First observed
d365fo_import_profiles - First observed
d365fo_list_profiles - First observed
d365fo_list_sync_sessions - First observed
d365fo_query_entities - First observed
d365fo_reset_performance_stats - First observed
d365fo_search_actions - First observed
d365fo_search_entities - First observed
d365fo_search_enumerations - First observed
d365fo_search_profiles - First observed
d365fo_set_default_profile - First observed
d365fo_start_sync - First observed
d365fo_test_connection - First observed
d365fo_test_profile_connection - First observed
d365fo_update_entity_record - First observed
d365fo_update_profile - First observed
d365fo_validate_profile
TDQS
Most tools have distinct purposes, with clear separation between entity operations, profile management, metadata queries, and document downloads. However, there is some overlap: d365fo_test_connection and d365fo_test_profile_connection are very similar, and the multiple download tools (e.g., d365fo_download_srs_report vs. specific invoice tools) could cause confusion about which to use for a given document type.
All tools follow a consistent d365fo_verb_noun naming pattern with snake_case throughout. The verbs are descriptive and appropriate (e.g., create, get, update, download, search), and the nouns clearly indicate the target resource (e.g., entity_record, profile, sync_progress). No deviations or mixed conventions are present.
With 49 tools, the count is excessive for a single server, making it overwhelming for agents to navigate. While D365FO is a complex system, the toolset could be more consolidated (e.g., merging similar download tools or profile operations). This many tools will likely lead to confusion and inefficiency in agent workflows.
The toolset provides comprehensive coverage for D365FO operations, including full CRUD for entities and profiles, metadata synchronization, document downloads, search capabilities, and system diagnostics. There are no obvious gaps; agents can perform end-to-end workflows from data querying to report generation and system management.
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
D365 F&O: 90 AI tools over 200K+ objects, 25M+ cross-refs, 24M+ label translations.
Read-only finance and operations controls for AI agents with evidence and safe next actions.
- StackOneOAuthcom.stackone
Give AI agents 30,000+ safe, token-optimized actions across Workday, SAP, Oracle + hundreds more.
- mcpOAuthcom.vibgrate
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Dynamics 365 Commerce systems through 125+ tools covering customer management, sales orders, cart operations, product searches, inventory tracking, and store operations. Provides comprehensive mock data for development and testing purposes.3-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to explore metadata, query data, and perform write operations across multiple Microsoft Dynamics 365 Finance & Operations environments. It features specialized tools for OData execution and data analysis with built-in read-only safety for production environments.4710MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to search and analyze Microsoft Dynamics 365 Finance & Operations artifacts, read local source code, and generate context-aware solutions through natural language.28712-
- AlicenseAqualityAmaintenanceEnables AI-assisted X++ development for Dynamics 365 Finance and Operations by pre-indexing the entire codebase and providing 54 specialized tools for metadata lookup, code generation, and best practice validation.20326138MIT
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/mafzaal/d365fo-client'
If you have feedback or need assistance with the MCP directory API, please join our Discord server