# D365FO MCP Server (oci · ghcr.io/mafzaal/d365fo-client:0.3.6)

A community-driven Microsoft Dynamics 365 Finance & Operations MCP server

- Trust score: 33/100 (low)
- Change this week: −6
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- oci · `ghcr.io/mafzaal/d365fo-client:0.3.6`: 33/100 (this document), [markdown](https://verifymcp.io/servers/mafzaal-d365fo-client/ghcr-io-mafzaal-d365fo-client-0-3-6.md), [page](https://verifymcp.io/servers/mafzaal-d365fo-client/ghcr-io-mafzaal-d365fo-client-0-3-6)
- pypi · `d365fo-client`: 10/100, [markdown](https://verifymcp.io/servers/mafzaal-d365fo-client/d365fo-client.md), [page](https://verifymcp.io/servers/mafzaal-d365fo-client/d365fo-client)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/mafzaal/d365fo-client:0.3.6`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 0/100
  - Malware scan not yet available for this package.
  - CVE data not yet available for this package.
  - Install-script risk not yet assessed.
  - Dependency-health data not yet available.
- **Provenance & Transparency**: 44/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 252 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 71/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 8818 tokens (~172/item across 51 items; 49 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (41% of tools); any adoption earns full credit.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

**Unverified: 2 categories.** Categories scored 0 because we could not verify them: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### Claude

```bash
claude mcp add mafzaal-d365fo-client -- docker run --rm -i ghcr.io/mafzaal/d365fo-client:0.3.6
```

### Codex

```bash
codex mcp add mafzaal-d365fo-client -- docker run --rm -i ghcr.io/mafzaal/d365fo-client:0.3.6
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mafzaal-d365fo-client": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "ghcr.io/mafzaal/d365fo-client:0.3.6"
      ],
      "enabled": true
    }
  }
}
```

### Hermes

```yaml
mcp_servers:
  mafzaal-d365fo-client:
    command: "docker"
    args: ["run", "--rm", "-i", "ghcr.io/mafzaal/d365fo-client:0.3.6"]
```

### Other

```json
{
  "mcpServers": {
    "mafzaal-d365fo-client": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/mafzaal/d365fo-client:0.3.6"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-07-31 (score 33, −6)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-27 (score 39, +28)

- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Schema quality: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 0
- [functional] First check of Schema quality: good
- [functional] First check of Tool coverage: 41

### 2026-07-26 (score 11)

First indexed and scored.

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

## MCP tools (49)

### `d365fo_execute_sql_query` (~488 tokens)

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:
1\. Get most used entities by category:
   SELECT entity_category, COUNT(*) as count FROM data_entities GROUP BY entity_category ORDER BY count DESC

2\. 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

3\. 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 stru…

Input parameters:

- `format` (string)
- `limit` (integer)
- `profile` (string)
- `query` (string, required)

### `d365fo_get_database_schema` (~212 tokens)

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

Input parameters:

- `include_indexes` (boolean)
- `include_relationships` (boolean)
- `include_statistics` (boolean)
- `profile` (string)
- `table_name`

### `d365fo_get_table_info` (~204 tokens)

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

Input parameters:

- `include_relationships` (boolean)
- `include_sample_data` (boolean)
- `profile` (string)
- `table_name` (string, required)

### `d365fo_get_database_statistics` (~178 tokens)

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

Input parameters:

- `include_performance_stats` (boolean)
- `include_table_stats` (boolean)
- `include_version_stats` (boolean)
- `profile` (string)

### `d365fo_search_entities` (~497 tokens)

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:

1\. Extract individual keywords from the request (e.g. "data management entities" → "data", "management", "entities")
2\. Perform separate searches for each significant keyword using simple text matching
3\. Combine and analyze results from all searches
4\. 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.
    pro…

Input parameters:

- `data_management_enabled`
- `data_service_enabled`
- `entity_category`
- `is_read_only`
- `limit` (integer)
- `pattern` (string, required)
- `profile` (string)

### `d365fo_get_entity_schema` (~184 tokens)

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

Input parameters:

- `entityName` (string, required)
- `include_properties` (boolean)
- `language` (string)
- `profile` (string)
- `resolve_labels` (boolean)

### `d365fo_search_actions` (~450 tokens)

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:

1\. Extract keywords from requests (e.g., "posting actions" → "post", "posting")
2\. Perform separate searches for each keyword using simple text matching
3\. Combine and analyze results from all searches
4\. 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

Input parameters:

- `bindingKind`
- `entityName`
- `isFunction`
- `limit` (integer)
- `pattern` (string, required)
- `profile` (string)

### `d365fo_search_enumerations` (~343 tokens)

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:

1\. Extract keywords from requests (e.g., "customer status enums" → "customer", "status")
2\. Perform separate searches for each keyword using simple text matching
3\. Combine and analyze results from all searches
4\. 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

Input parameters:

- `limit` (integer)
- `pattern` (string, required)
- `profile` (string)

### `d365fo_get_enumeration_fields` (~157 tokens)

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

Input parameters:

- `enumeration_name` (string, required)
- `language` (string)
- `profile` (string)
- `resolve_labels` (boolean)

### `d365fo_get_installed_modules` (~77 tokens)

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

Input parameters:

- `profile` (string)

### `d365fo_query_entities` (~359 tokens)

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.

Input parameters:

- `count` (boolean)
- `entity_name` (string, required)
- `expand`
- `filter`
- `order_by`
- `profile` (string)
- `select`
- `skip`
- `top` (integer)

### `d365fo_get_entity_record` (~162 tokens)

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

Input parameters:

- `entity_name` (string, required)
- `expand`
- `key_fields` (array, required)
- `key_values` (array, required)
- `profile` (string)
- `select`

### `d365fo_create_entity_record` (~128 tokens)

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

Input parameters:

- `data` (object, required)
- `entity_name` (string, required)
- `profile` (string)
- `return_record` (boolean)

### `d365fo_update_entity_record` (~169 tokens)

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

Input parameters:

- `data` (object, required)
- `entity_name` (string, required)
- `key_fields` (array, required)
- `key_values` (array, required)
- `profile` (string)
- `return_record` (boolean)

### `d365fo_delete_entity_record` (~131 tokens)

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

Input parameters:

- `entity_name` (string, required)
- `key_fields` (array, required)
- `key_values` (array, required)
- `profile` (string)

### `d365fo_call_action` (~167 tokens)

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

Input parameters:

- `action_name` (string, required)
- `entity_name` (string)
- `key_fields` (array)
- `key_values` (array)
- `parameters` (object)
- `profile` (string)

### `d365fo_call_json_service` (~302 tokens)

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"
        }
    }

Input parameters:

- `operation_name` (string, required)
- `parameters`
- `profile` (string)
- `service_group` (string, required)
- `service_name` (string, required)

### `d365fo_list_profiles` (~31 tokens)

Get list of all available D365FO environment profiles.

Returns:
    Dictionary with list of profiles

Output parameters:

- `result` (object)

### `d365fo_get_profile` (~51 tokens)

Get details of a specific D365FO environment profile.

Args:
    profileName: Name of the profile to retrieve

Returns:
    Dictionary with profile details

Input parameters:

- `profileName` (string, required)

Output parameters:

- `result` (object)

### `d365fo_create_profile` (~415 tokens)

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

Input parameters:

- `baseUrl` (string, required)
- `cacheDir`
- `credentialSource`
- `description`
- `labelCacheExpiryMinutes` (integer)
- `language` (string)
- `name` (string, required)
- `outputFormat` (string)
- `setAsDefault` (boolean)
- `timeout` (integer)
- `useCacheFirst` (boolean)
- `useLabelCache` (boolean)
- `verifySsl` (boolean)

Output parameters:

- `result` (object)

### `d365fo_update_profile` (~369 tokens)

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

Input parameters:

- `baseUrl`
- `cacheDir`
- `credentialSource`
- `description`
- `labelCacheExpiryMinutes`
- `language`
- `name` (string, required)
- `outputFormat`
- `timeout`
- `useCacheFirst`
- `useLabelCache`
- `verifySsl`

Output parameters:

- `result` (object)

### `d365fo_delete_profile` (~70 tokens)

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

Input parameters:

- `profileName` (string, required)

Output parameters:

- `result` (object)

### `d365fo_set_default_profile` (~80 tokens)

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

Input parameters:

- `profileName` (string, required)

Output parameters:

- `result` (object)

### `d365fo_get_default_profile` (~30 tokens)

Get the current default D365FO environment profile.

Returns:
    Dictionary with default profile

Output parameters:

- `result` (object)

### `d365fo_validate_profile` (~49 tokens)

Validate a D365FO environment profile configuration.

Args:
    profileName: Name of the profile to validate

Returns:
    Dictionary with validation result

Input parameters:

- `profileName` (string, required)

Output parameters:

- `result` (object)

### `d365fo_test_profile_connection` (~53 tokens)

Test connection for a specific D365FO environment profile.

Args:
    profileName: Name of the profile to test

Returns:
    Dictionary with connection test result

Input parameters:

- `profileName` (string, required)

Output parameters:

- `result` (object)

### `d365fo_clone_profile` (~88 tokens)

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

Input parameters:

- `description`
- `newProfileName` (string, required)
- `sourceProfileName` (string, required)

Output parameters:

- `result` (object)

### `d365fo_export_profiles` (~51 tokens)

Export all D365FO environment profiles to a file.

Args:
    filePath: Path where to export the profiles

Returns:
    Dictionary with export result

Input parameters:

- `filePath` (string, required)

Output parameters:

- `result` (object)

### `d365fo_import_profiles` (~72 tokens)

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

Input parameters:

- `filePath` (string, required)
- `overwrite` (boolean)

Output parameters:

- `result` (object)

### `d365fo_search_profiles` (~107 tokens)

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

Input parameters:

- `credentialSourceType`
- `hasCredentialSource`
- `pattern`

Output parameters:

- `result` (object)

### `d365fo_get_profile_names` (~31 tokens)

Get list of all D365FO environment profile names.

Returns:
    Dictionary with profile names

Output parameters:

- `result` (object)

### `d365fo_start_sync` (~185 tokens)

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

Input parameters:

- `global_version_id`
- `profile` (string)
- `strategy` (string)

### `d365fo_get_sync_progress` (~93 tokens)

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

Input parameters:

- `profile` (string)
- `session_id` (string, required)

### `d365fo_cancel_sync` (~87 tokens)

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

Input parameters:

- `profile` (string)
- `session_id` (string, required)

### `d365fo_list_sync_sessions` (~65 tokens)

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

Input parameters:

- `profile` (string)

### `d365fo_get_sync_history` (~92 tokens)

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

Input parameters:

- `limit` (integer)
- `profile` (string)

### `d365fo_get_label` (~95 tokens)

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

Input parameters:

- `labelId` (string, required)
- `language` (string)
- `profile` (string)

### `d365fo_get_labels_batch` (~93 tokens)

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

Input parameters:

- `labelIds` (array, required)
- `language` (string)
- `profile` (string)

### `d365fo_download_srs_report` (~546 tokens)

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` | `VendPurchO…

Input parameters:

- `controller_name` (string)
- `data_field` (string)
- `data_table` (string)
- `document_id` (string, required)
- `document_type` (string)
- `legal_entity` (string, required)
- `profile` (string)
- `save_path` (string)

### `d365fo_download_customer_invoice` (~315 tokens)

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

Input parameters:

- `invoice_id` (string, required)
- `legal_entity` (string, required)
- `profile` (string)
- `save_path` (string)

### `d365fo_download_free_text_invoice` (~325 tokens)

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

Input parameters:

- `invoice_id` (string, required)
- `legal_entity` (string, required)
- `profile` (string)
- `save_path` (string)

### `d365fo_download_debit_credit_note` (~316 tokens)

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

Input parameters:

- `invoice_id` (string, required)
- `legal_entity` (string, required)
- `profile` (string)
- `save_path` (string)

### `d365fo_download_sales_confirmation` (~321 tokens)

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

Input parameters:

- `confirmation_id` (string, required)
- `legal_entity` (string, required)
- `profile` (string)
- `save_path` (string)

### `d365fo_download_purchase_order` (~318 tokens)

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

Input parameters:

- `legal_entity` (string, required)
- `profile` (string)
- `purchase_order_id` (string, required)
- `save_path` (string)

### `d365fo_test_connection` (~53 tokens)

Test connection to D365FO environment.

Args:
    profile: Optional profile name to test (uses default if not specified)

Returns:
    JSON string with connection test results

Input parameters:

- `profile` (string)

### `d365fo_get_environment_info` (~53 tokens)

Get D365FO environment information and version details.

Args:
    profile: Optional profile name (uses default if not specified)

Returns:
    JSON string with environment information

Input parameters:

- `profile` (string)

### `d365fo_get_server_performance` (~33 tokens)

Get FastMCP server performance statistics and health metrics.

Returns:
    Dict with server performance data

### `d365fo_reset_performance_stats` (~26 tokens)

Reset server performance statistics.

Returns:
    Dict with reset confirmation

### `d365fo_get_server_config` (~31 tokens)

Get current FastMCP server configuration and feature status.

Returns:
    Dict with server configuration

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/mafzaal-d365fo-client/ghcr-io-mafzaal-d365fo-client-0-3-6#diagnostics

## Score history

- 2026-08-03: 33
- 2026-08-02: 33
- 2026-08-01: 33
- 2026-07-31: 33
- 2026-07-30: 39
- 2026-07-29: 39
- 2026-07-28: 39
- 2026-07-27: 39
- 2026-07-26: 11

## Links

- Repository: https://github.com/mafzaal/d365fo-client
- Changelog RSS feed: https://verifymcp.io/servers/mafzaal-d365fo-client/ghcr-io-mafzaal-d365fo-client-0-3-6/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/mafzaal-d365fo-client/ghcr-io-mafzaal-d365fo-client-0-3-6/changelog.json
- HTML version of this page: https://verifymcp.io/servers/mafzaal-d365fo-client/ghcr-io-mafzaal-d365fo-client-0-3-6
