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
- Go to Azure Portal โ Deploy a custom template
- Click "Build your own template in the editor"
- Paste the contents of
azure-deploy.json - Fill 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.
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.
- 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
- ๐ง 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
# 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 credentialsThe 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
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
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
The FastMCP server provides HTTP and SSE transports for web application integration:
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))// 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)
});
}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()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}
)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)
- 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
- 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
- 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
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"- Logs: Check
~/.d365fo-mcp/logs/mcp-server.logfor detailed error information - Environment: Use
d365fo_get_environment_infotool to check system status - Documentation: See MCP Implementation Summary for technical details
- Issues: Report problems at GitHub Issues
The server provides 49 comprehensive tools organized into functional categories:
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
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
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
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
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
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
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
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
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.
The server exposes four types of resources for discovery and access:
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 details
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 translations
Release History
| Version | Changes | Urgency | Date |
|---|---|---|---|
| v0.3.7 | ## What's Changed * ci(deps): Bump actions/checkout from 5 to 6 by @dependabot[bot] in https://github.com/mafzaal/d365fo-client/pull/90 * deps(deps): Bump mcp from 1.21.1 to 1.22.0 by @dependabot[bot] in https://github.com/mafzaal/d365fo-client/pull/91 * deps(deps): Bump ruff from 0.14.5 to 0.14.6 by @dependabot[bot] in https://github.com/mafzaal/d365fo-client/pull/92 * deps(deps): Bump black from 25.11.0 to 25.12.0 by @dependabot[bot] in https://github.com/mafzaal/d365fo-client/pull/93 * d | High | 4/18/2026 |
| v0.3.6 | ## v0.3.6 - 2025-11-23 ### Added - **MCP Server Definition**: Added official MCP server definition file (server.json) for enhanced discoverability - Comprehensive server metadata including name, description, title, website, and repository information - Package registry configurations for both PyPI (uvx) and OCI (Docker) installation methods - Environment variable definitions with security and requirement specifications - Runtime arguments configuration for Docker deployment - ** | Low | 11/23/2025 |
| v0.3.5 | ## v0.3.5 - 2025-11-22 ### Added - **Cross-Company Query Support**: Automatic cross-company query handling for dataAreaId filtering - Automatically adds `cross-company=true` parameter when filter contains dataAreaId - Cross-company support for composite keys with dataAreaId - New unit tests for cross-company key handling and query building - Demo examples showcasing cross-company query functionality ### Improved - **Test Suite Organization**: Major refactoring and cleanup of | Low | 11/22/2025 |
| v0.3.4 | ## v0.3.4 - 2025-10-26 ### Added - **SRS Report Download Tools**: New comprehensive MCP tools for downloading various report types from D365 Finance & Operations - `d365fo_download_customer_invoice` tool for customer invoice PDFs - `d365fo_download_free_text_invoice` tool for free text invoice PDFs - `d365fo_download_debit_credit_note` tool for credit/debit note PDFs - `d365fo_download_sales_confirmation` tool for sales confirmation PDFs - `d365fo_download_purchase_order` tool | Low | 10/26/2025 |
| v0.3.3 | ## v0.3.3 - 2025-10-19 ### Fixed - **OData Key Formatting**: Fixed OData date/time key formatting for D365 F&O compatibility - **BREAKING**: Date/time types in OData keys no longer use quotes (aligns with D365 F&O OData spec) - OData queries with date/time keys now work correctly with D365 F&O - Enhanced test coverage with comprehensive mock support for session manager - **Docker Deployment**: Updated deployment script to use 'latest' Docker image tag - **Docker Build**: Updated D | Low | 10/19/2025 |
| v0.3.2 | ## v0.3.2 - 2025-10-12 ### Added - **JSON Service Tools**: New MCP tools for calling D365 F&O JSON services - `d365fo_call_json_service` tool for generic JSON service operations - `d365fo_call_sql_diagnostic_service` tool for SQL diagnostic operations - JsonServiceRequest and JsonServiceResponse models for structured requests - Comprehensive examples in `examples/json_service_examples.py` - **Enhanced QueryBuilder**: Advanced OData query building with schema awareness - Autom | Low | 10/12/2025 |
| v0.3.1 | ## [0.3.1] - 2025-10-01 ### Added - **API Key Authentication Provider**: New authentication provider for MCP server - Added auth/providers/apikey.py for secure API key validation - Enhanced fastmcp_main.py with API key authentication support - Comprehensive test suite for API key functionality - Integration and unit tests for secure authentication flow ### Fixed - **Azure OAuth Provider Client Persistence**: Resolved serialization and reliability issues - Fixed OAuthClient | Low | 10/2/2025 |
| v0.3.0 | ## [0.3.0] - 2025-09-29 ### Added - **Pydantic Settings Model**: Comprehensive environment variable management with type safety and validation - Added D365FOSettings class with support for 35+ environment variables - Automatic type conversion and validation with pydantic-settings>=2.6.0 - Support for .env files and IDE IntelliSense - Utility methods: has_client_credentials(), get_startup_mode() - **Custom Log File Support**: D365FO_LOG_FILE environment variable for custom log fi | Low | 9/30/2025 |
| v0.2.4 | ### Added - **Docker Support**: Added containerization support for d365fo-client package - Added `.dockerignore` file with comprehensive exclusion patterns for clean Docker builds - Added `Dockerfile` with multi-stage build process optimized for production deployment - Added GitHub workflow for automated Docker image building and publishing to GitHub Container Registry ### Documentation - **Comprehensive MCP Tools Guide**: Added detailed introduction to MCP tools with usage example | Low | 9/21/2025 |
| v0.2.3 | ## [0.2.3] - 2025-08-31 ### Added - **Enhanced Credential Management**: Complete credential source management system for D365 F&O client authentication - Added `CredentialSource`, `EnvironmentCredentialSource`, and `KeyVaultCredentialSource` classes for managing different credential sources - Implemented `CredentialProvider` interface with `EnvironmentCredentialProvider` and `KeyVaultCredentialProvider` for retrieving credentials - Introduced `CredentialManager` to handle credential | Low | 8/31/2025 |
| v0.2.2 | ## [0.2.2] - 2025-08-28 ### Added - **Environment-scoped Statistics**: Enhanced metadata cache with environment-scoped statistics methods - Added database and version management statistics scoping for better cache management - Comprehensive tests for cache statistics scoping and environment isolation - Improved metadata cache performance monitoring and debugging capabilities ### Improved - **Async Context Handling**: Resolved background thread blocking issues through enhanced as | Low | 8/28/2025 |
| v0.2.1 | ## [0.2.1] - 2025-08-24 ### Added - **Action Cache Search and Lookup**: Complete action cache functionality with search and retrieval capabilities - Added `search_actions` and `get_action_info` methods to `MetadataCacheV2` for cached action operations - Integrated action search capabilities into metadata API with regex pattern matching and entity filtering - Enhanced `ActionInfo` model serialization to ensure JSON compatibility for enum values - Comprehensive unit tests for actio | Low | 8/24/2025 |
| v0.2.0 | ## What's Changed * Implement comprehensive CLI enhancement with hierarchical commands and multi-format output by @Copilot in https://github.com/mafzaal/d365fo-client/pull/2 * Implement comprehensive MCP Server for d365fo-client by @Copilot in https://github.com/mafzaal/d365fo-client/pull/4 * feat: Add Dependabot configuration for Python and GitHub Actions, enaโฆ by @mafzaal in https://github.com/mafzaal/d365fo-client/pull/5 * ci(deps): bump actions/download-artifact from 4 to 5 by @dependabo | Low | 8/24/2025 |

