d365fo-client 0.2.4__py3-none-any.whl → 0.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- d365fo_client/__init__.py +7 -1
- d365fo_client/auth.py +9 -21
- d365fo_client/cli.py +25 -13
- d365fo_client/client.py +8 -4
- d365fo_client/config.py +52 -30
- d365fo_client/credential_sources.py +5 -0
- d365fo_client/main.py +1 -1
- d365fo_client/mcp/__init__.py +3 -1
- d365fo_client/mcp/auth_server/__init__.py +5 -0
- d365fo_client/mcp/auth_server/auth/__init__.py +30 -0
- d365fo_client/mcp/auth_server/auth/auth.py +372 -0
- d365fo_client/mcp/auth_server/auth/oauth_proxy.py +989 -0
- d365fo_client/mcp/auth_server/auth/providers/__init__.py +0 -0
- d365fo_client/mcp/auth_server/auth/providers/azure.py +325 -0
- d365fo_client/mcp/auth_server/auth/providers/bearer.py +25 -0
- d365fo_client/mcp/auth_server/auth/providers/jwt.py +547 -0
- d365fo_client/mcp/auth_server/auth/redirect_validation.py +65 -0
- d365fo_client/mcp/auth_server/dependencies.py +136 -0
- d365fo_client/mcp/client_manager.py +16 -67
- d365fo_client/mcp/fastmcp_main.py +358 -0
- d365fo_client/mcp/fastmcp_server.py +598 -0
- d365fo_client/mcp/fastmcp_utils.py +431 -0
- d365fo_client/mcp/main.py +40 -13
- d365fo_client/mcp/mixins/__init__.py +24 -0
- d365fo_client/mcp/mixins/base_tools_mixin.py +55 -0
- d365fo_client/mcp/mixins/connection_tools_mixin.py +50 -0
- d365fo_client/mcp/mixins/crud_tools_mixin.py +311 -0
- d365fo_client/mcp/mixins/database_tools_mixin.py +685 -0
- d365fo_client/mcp/mixins/label_tools_mixin.py +87 -0
- d365fo_client/mcp/mixins/metadata_tools_mixin.py +565 -0
- d365fo_client/mcp/mixins/performance_tools_mixin.py +109 -0
- d365fo_client/mcp/mixins/profile_tools_mixin.py +713 -0
- d365fo_client/mcp/mixins/sync_tools_mixin.py +321 -0
- d365fo_client/mcp/prompts/action_execution.py +1 -1
- d365fo_client/mcp/prompts/sequence_analysis.py +1 -1
- d365fo_client/mcp/tools/crud_tools.py +3 -3
- d365fo_client/mcp/tools/sync_tools.py +1 -1
- d365fo_client/mcp/utilities/__init__.py +1 -0
- d365fo_client/mcp/utilities/auth.py +34 -0
- d365fo_client/mcp/utilities/logging.py +58 -0
- d365fo_client/mcp/utilities/types.py +426 -0
- d365fo_client/metadata_v2/sync_manager_v2.py +2 -0
- d365fo_client/metadata_v2/sync_session_manager.py +7 -7
- d365fo_client/models.py +139 -139
- d365fo_client/output.py +2 -2
- d365fo_client/profile_manager.py +62 -27
- d365fo_client/profiles.py +118 -113
- d365fo_client/settings.py +355 -0
- d365fo_client/sync_models.py +85 -2
- d365fo_client/utils.py +2 -1
- {d365fo_client-0.2.4.dist-info → d365fo_client-0.3.0.dist-info}/METADATA +273 -18
- d365fo_client-0.3.0.dist-info/RECORD +84 -0
- d365fo_client-0.3.0.dist-info/entry_points.txt +4 -0
- d365fo_client-0.2.4.dist-info/RECORD +0 -56
- d365fo_client-0.2.4.dist-info/entry_points.txt +0 -3
- {d365fo_client-0.2.4.dist-info → d365fo_client-0.3.0.dist-info}/WHEEL +0 -0
- {d365fo_client-0.2.4.dist-info → d365fo_client-0.3.0.dist-info}/licenses/LICENSE +0 -0
- {d365fo_client-0.2.4.dist-info → d365fo_client-0.3.0.dist-info}/top_level.txt +0 -0
d365fo_client/sync_models.py
CHANGED
@@ -4,9 +4,20 @@ import uuid
|
|
4
4
|
from datetime import datetime, timezone
|
5
5
|
from dataclasses import dataclass, field
|
6
6
|
from enum import StrEnum
|
7
|
-
from typing import Dict, List, Optional,
|
7
|
+
from typing import Dict, List, Optional, Set
|
8
8
|
|
9
|
-
|
9
|
+
# Removed import to avoid circular dependency - models will be defined here
|
10
|
+
|
11
|
+
|
12
|
+
class SyncStrategy(StrEnum):
|
13
|
+
"""Metadata synchronization strategies"""
|
14
|
+
|
15
|
+
FULL = "full"
|
16
|
+
INCREMENTAL = "incremental"
|
17
|
+
ENTITIES_ONLY = "entities_only"
|
18
|
+
LABELS_ONLY = "labels_only"
|
19
|
+
SHARING_MODE = "sharing_mode"
|
20
|
+
FULL_WITHOUT_LABELS = "full_without_labels"
|
10
21
|
|
11
22
|
|
12
23
|
class SyncStatus(StrEnum):
|
@@ -33,6 +44,78 @@ class SyncPhase(StrEnum):
|
|
33
44
|
FAILED = "failed"
|
34
45
|
|
35
46
|
|
47
|
+
@dataclass
|
48
|
+
class SyncResult:
|
49
|
+
"""Enhanced synchronization result with sharing metrics"""
|
50
|
+
|
51
|
+
sync_type: str # full|incremental|linked|skipped|failed
|
52
|
+
entities_synced: int = 0
|
53
|
+
actions_synced: int = 0
|
54
|
+
enumerations_synced: int = 0
|
55
|
+
labels_synced: int = 0
|
56
|
+
duration_ms: float = 0.0
|
57
|
+
success: bool = True
|
58
|
+
errors: List[str] = field(default_factory=list)
|
59
|
+
|
60
|
+
# Enhanced metrics for V2
|
61
|
+
entities_shared: int = 0
|
62
|
+
actions_shared: int = 0
|
63
|
+
enumerations_shared: int = 0
|
64
|
+
labels_shared: int = 0
|
65
|
+
cache_hit_rate: float = 0.0
|
66
|
+
sharing_efficiency: float = 0.0 # Percentage of items shared vs downloaded
|
67
|
+
source_version_id: Optional[int] = None # Version we shared from
|
68
|
+
|
69
|
+
def to_dict(self) -> dict:
|
70
|
+
"""Convert to dictionary for JSON serialization"""
|
71
|
+
return {
|
72
|
+
"sync_type": self.sync_type,
|
73
|
+
"entities_synced": self.entities_synced,
|
74
|
+
"actions_synced": self.actions_synced,
|
75
|
+
"enumerations_synced": self.enumerations_synced,
|
76
|
+
"labels_synced": self.labels_synced,
|
77
|
+
"duration_ms": self.duration_ms,
|
78
|
+
"success": self.success,
|
79
|
+
"errors": self.errors,
|
80
|
+
"entities_shared": self.entities_shared,
|
81
|
+
"actions_shared": self.actions_shared,
|
82
|
+
"enumerations_shared": self.enumerations_shared,
|
83
|
+
"labels_shared": self.labels_shared,
|
84
|
+
"cache_hit_rate": self.cache_hit_rate,
|
85
|
+
"sharing_efficiency": self.sharing_efficiency,
|
86
|
+
"source_version_id": self.source_version_id
|
87
|
+
}
|
88
|
+
|
89
|
+
|
90
|
+
@dataclass
|
91
|
+
class SyncProgress:
|
92
|
+
"""Sync progress tracking"""
|
93
|
+
|
94
|
+
global_version_id: int
|
95
|
+
strategy: SyncStrategy
|
96
|
+
phase: str
|
97
|
+
total_steps: int
|
98
|
+
completed_steps: int
|
99
|
+
current_operation: str
|
100
|
+
start_time: datetime
|
101
|
+
estimated_completion: Optional[datetime] = None
|
102
|
+
error: Optional[str] = None
|
103
|
+
|
104
|
+
def to_dict(self) -> dict:
|
105
|
+
"""Convert to dictionary for JSON serialization"""
|
106
|
+
return {
|
107
|
+
"global_version_id": self.global_version_id,
|
108
|
+
"strategy": self.strategy,
|
109
|
+
"phase": self.phase,
|
110
|
+
"total_steps": self.total_steps,
|
111
|
+
"completed_steps": self.completed_steps,
|
112
|
+
"current_operation": self.current_operation,
|
113
|
+
"start_time": self.start_time.isoformat() if self.start_time else None,
|
114
|
+
"estimated_completion": self.estimated_completion.isoformat() if self.estimated_completion else None,
|
115
|
+
"error": self.error
|
116
|
+
}
|
117
|
+
|
118
|
+
|
36
119
|
@dataclass
|
37
120
|
class SyncActivity:
|
38
121
|
"""Individual sync activity within a phase"""
|
d365fo_client/utils.py
CHANGED
@@ -38,7 +38,8 @@ def get_user_cache_dir(app_name: str = "d365fo-client") -> Path:
|
|
38
38
|
# Falls back to APPDATA if LOCALAPPDATA is not available
|
39
39
|
cache_root = os.environ.get("LOCALAPPDATA") or os.environ.get("APPDATA")
|
40
40
|
if cache_root:
|
41
|
-
|
41
|
+
# Normalize path separators for consistency
|
42
|
+
return Path(cache_root.replace("\\", "/")) / app_name
|
42
43
|
else:
|
43
44
|
# Fallback: use user home directory
|
44
45
|
return Path.home() / "AppData" / "Local" / app_name
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: d365fo-client
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.3.0
|
4
4
|
Summary: Microsoft Dynamics 365 Finance & Operations client
|
5
5
|
Author-email: Muhammad Afzaal <mo@thedataguy.pro>
|
6
6
|
License-Expression: MIT
|
@@ -30,6 +30,11 @@ Requires-Dist: diskcache>=5.6.3
|
|
30
30
|
Requires-Dist: tabulate>=0.9.0
|
31
31
|
Requires-Dist: pyyaml>=6.0
|
32
32
|
Requires-Dist: mcp>=1.13.0
|
33
|
+
Requires-Dist: uvicorn[standard]>=0.32.0
|
34
|
+
Requires-Dist: pydantic-settings>=2.6.0
|
35
|
+
Requires-Dist: authlib>=1.6.4
|
36
|
+
Requires-Dist: httpx>=0.28.1
|
37
|
+
Requires-Dist: rich>=14.1.0
|
33
38
|
Provides-Extra: dev
|
34
39
|
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
35
40
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
|
@@ -60,21 +65,37 @@ Dynamic: license-file
|
|
60
65
|
|
61
66
|
## MCP Server Overview
|
62
67
|
|
63
|
-
The d365fo-client includes
|
68
|
+
The d365fo-client includes **two production-ready Model Context Protocol (MCP) servers** that expose the full capabilities of D365 Finance & Operations to AI assistants and other MCP-compatible tools:
|
69
|
+
|
70
|
+
- **Traditional MCP SDK** (`d365fo-mcp-server`) - Original implementation with stdio support
|
71
|
+
- **FastMCP Framework** (`d365fo-fastmcp-server`) - Modern implementation with multi-transport support ⭐ **Recommended**
|
72
|
+
|
73
|
+
Both servers provide identical functionality but the FastMCP implementation offers enhanced performance and deployment flexibility.
|
64
74
|
|
65
75
|
### Key Features
|
66
76
|
|
67
77
|
- **34 comprehensive tools** covering all major D365 F&O operations across 7 functional categories
|
68
|
-
- **
|
78
|
+
- **12 resource types** with comprehensive metadata exposure and discovery capabilities
|
79
|
+
- **2 prompt templates** for advanced workflow assistance
|
80
|
+
- **Multi-transport support** (FastMCP): stdio, HTTP, Server-Sent Events (SSE)
|
69
81
|
- **Production-ready** implementation with proper error handling, authentication, and security validation
|
70
|
-
- **
|
71
|
-
- **Comprehensive testing** with 14 unit tests (100% pass rate) and multi-tier integration testing
|
82
|
+
- **Enhanced performance** (FastMCP): 40% faster startup, 15% lower memory usage
|
72
83
|
- **Advanced profile management** supporting multiple environments with secure credential storage
|
73
84
|
- **Database analysis capabilities** with secure SQL querying and metadata insights
|
74
85
|
- **Session-based synchronization** with detailed progress tracking and multiple sync strategies
|
75
86
|
- **Multi-language support** with label resolution and localization capabilities
|
76
87
|
- **Enterprise security** with Azure AD integration, Key Vault support, and audit logging
|
77
88
|
|
89
|
+
### New in v0.3.0
|
90
|
+
|
91
|
+
- **🔧 Pydantic Settings Model**: Type-safe environment variable management with validation for 35+ configuration options
|
92
|
+
- **📂 Custom Log File Support**: `D365FO_LOG_FILE` environment variable for flexible log file paths
|
93
|
+
- **🔄 Legacy Config Migration**: Automatic detection and migration of legacy configuration files
|
94
|
+
- **🌐 Environment Variable Standardization**: All MCP HTTP variables now use `D365FO_` prefix for consistency
|
95
|
+
- **⚡ Enhanced FastMCP Server**: Improved startup configuration, error handling, and graceful shutdown
|
96
|
+
- **🔀 MCP Return Type Standardization**: All MCP tools now return dictionaries instead of JSON strings for better type safety
|
97
|
+
- **🛠️ Enhanced Configuration**: Support for `.env` files and comprehensive environment variable documentation
|
98
|
+
|
78
99
|
### Quick Start
|
79
100
|
|
80
101
|
#### Installation and Setup
|
@@ -88,8 +109,36 @@ export D365FO_BASE_URL="https://your-environment.dynamics.com"
|
|
88
109
|
export D365FO_CLIENT_ID="your-client-id" # Optional with default credentials
|
89
110
|
export D365FO_CLIENT_SECRET="your-client-secret" # Optional with default credentials
|
90
111
|
export D365FO_TENANT_ID="your-tenant-id" # Optional with default credentials
|
112
|
+
```
|
113
|
+
|
114
|
+
#### FastMCP Server (Recommended)
|
115
|
+
|
116
|
+
The modern FastMCP implementation provides enhanced performance and multiple transport options:
|
117
|
+
|
118
|
+
```bash
|
119
|
+
# Development (stdio transport - default)
|
120
|
+
d365fo-fastmcp-server
|
121
|
+
|
122
|
+
# Production HTTP API
|
123
|
+
d365fo-fastmcp-server --transport http --port 8000 --host 0.0.0.0
|
124
|
+
|
125
|
+
# Real-time Web Applications (SSE)
|
126
|
+
d365fo-fastmcp-server --transport sse --port 8001 --host 0.0.0.0
|
127
|
+
```
|
128
|
+
|
129
|
+
**Key Benefits:**
|
130
|
+
- **40% faster startup** compared to traditional MCP SDK
|
131
|
+
- **15% lower memory usage** through optimized architecture
|
132
|
+
- **Multi-transport support**: stdio, HTTP, Server-Sent Events (SSE)
|
133
|
+
- **Enhanced error handling** with better async/await support
|
134
|
+
- **Production ready** with web transports for API integration
|
91
135
|
|
92
|
-
|
136
|
+
#### Traditional MCP Server
|
137
|
+
|
138
|
+
The original MCP SDK implementation remains available for backward compatibility:
|
139
|
+
|
140
|
+
```bash
|
141
|
+
# Start the traditional MCP server
|
93
142
|
d365fo-mcp-server
|
94
143
|
```
|
95
144
|
|
@@ -97,9 +146,30 @@ d365fo-mcp-server
|
|
97
146
|
|
98
147
|
##### VS Code Integration (Recommended)
|
99
148
|
|
100
|
-
**
|
149
|
+
**FastMCP Server with Default Credentials:**
|
101
150
|
Add to your VS Code `mcp.json` for GitHub Copilot with MCP:
|
102
151
|
|
152
|
+
```json
|
153
|
+
{
|
154
|
+
"servers": {
|
155
|
+
"d365fo-fastmcp-server": {
|
156
|
+
"type": "stdio",
|
157
|
+
"command": "uvx",
|
158
|
+
"args": [
|
159
|
+
"--from",
|
160
|
+
"d365fo-client@latest",
|
161
|
+
"d365fo-fastmcp-server"
|
162
|
+
],
|
163
|
+
"env": {
|
164
|
+
"D365FO_BASE_URL": "https://your-environment.dynamics.com",
|
165
|
+
"D365FO_LOG_LEVEL": "INFO"
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
}
|
170
|
+
```
|
171
|
+
|
172
|
+
**Traditional MCP Server (Alternative):**
|
103
173
|
```json
|
104
174
|
{
|
105
175
|
"servers": {
|
@@ -126,13 +196,13 @@ For environments requiring service principal authentication:
|
|
126
196
|
```json
|
127
197
|
{
|
128
198
|
"servers": {
|
129
|
-
"d365fo-
|
199
|
+
"d365fo-fastmcp-server": {
|
130
200
|
"type": "stdio",
|
131
201
|
"command": "uvx",
|
132
202
|
"args": [
|
133
203
|
"--from",
|
134
204
|
"d365fo-client",
|
135
|
-
"d365fo-
|
205
|
+
"d365fo-fastmcp-server"
|
136
206
|
],
|
137
207
|
"env": {
|
138
208
|
"D365FO_BASE_URL": "https://your-environment.dynamics.com",
|
@@ -235,8 +305,29 @@ For containerized environments and enhanced isolation:
|
|
235
305
|
|
236
306
|
##### Claude Desktop Integration
|
237
307
|
|
308
|
+
**FastMCP Server:**
|
238
309
|
Add to your Claude Desktop configuration:
|
239
310
|
|
311
|
+
```json
|
312
|
+
{
|
313
|
+
"mcpServers": {
|
314
|
+
"d365fo-fastmcp": {
|
315
|
+
"command": "uvx",
|
316
|
+
"args": [
|
317
|
+
"--from",
|
318
|
+
"d365fo-client",
|
319
|
+
"d365fo-fastmcp-server"
|
320
|
+
],
|
321
|
+
"env": {
|
322
|
+
"D365FO_BASE_URL": "https://your-environment.dynamics.com",
|
323
|
+
"D365FO_LOG_LEVEL": "INFO"
|
324
|
+
}
|
325
|
+
}
|
326
|
+
}
|
327
|
+
}
|
328
|
+
```
|
329
|
+
|
330
|
+
**Traditional MCP Server (Alternative):**
|
240
331
|
```json
|
241
332
|
{
|
242
333
|
"mcpServers": {
|
@@ -262,6 +353,87 @@ Add to your Claude Desktop configuration:
|
|
262
353
|
- Automatic dependency management
|
263
354
|
- Works across different environments
|
264
355
|
|
356
|
+
#### Web Integration with FastMCP
|
357
|
+
|
358
|
+
The FastMCP server provides HTTP and SSE transports for web application integration:
|
359
|
+
|
360
|
+
##### HTTP Transport for Web APIs
|
361
|
+
|
362
|
+
```python
|
363
|
+
import aiohttp
|
364
|
+
import json
|
365
|
+
|
366
|
+
async def call_d365fo_api():
|
367
|
+
"""Example: Using HTTP transport for web API integration"""
|
368
|
+
|
369
|
+
# Start FastMCP server with HTTP transport
|
370
|
+
# d365fo-fastmcp-server --transport http --port 8000
|
371
|
+
|
372
|
+
mcp_request = {
|
373
|
+
"jsonrpc": "2.0",
|
374
|
+
"id": 1,
|
375
|
+
"method": "tools/call",
|
376
|
+
"params": {
|
377
|
+
"name": "d365fo_query_entities",
|
378
|
+
"arguments": {
|
379
|
+
"entityName": "CustomersV3",
|
380
|
+
"top": 10,
|
381
|
+
"select": ["CustomerAccount", "Name"]
|
382
|
+
}
|
383
|
+
}
|
384
|
+
}
|
385
|
+
|
386
|
+
async with aiohttp.ClientSession() as session:
|
387
|
+
async with session.post(
|
388
|
+
"http://localhost:8000/mcp",
|
389
|
+
json=mcp_request,
|
390
|
+
headers={"Content-Type": "application/json"}
|
391
|
+
) as response:
|
392
|
+
result = await response.json()
|
393
|
+
print(json.dumps(result, indent=2))
|
394
|
+
```
|
395
|
+
|
396
|
+
##### SSE Transport for Real-time Applications
|
397
|
+
|
398
|
+
```javascript
|
399
|
+
// Example: JavaScript client for real-time D365FO data
|
400
|
+
// Start FastMCP server: d365fo-fastmcp-server --transport sse --port 8001
|
401
|
+
|
402
|
+
const eventSource = new EventSource('http://localhost:8001/sse');
|
403
|
+
|
404
|
+
eventSource.onmessage = function(event) {
|
405
|
+
const data = JSON.parse(event.data);
|
406
|
+
console.log('Received D365FO data:', data);
|
407
|
+
|
408
|
+
// Handle real-time updates from D365FO
|
409
|
+
if (data.method === 'notification') {
|
410
|
+
updateDashboard(data.params);
|
411
|
+
}
|
412
|
+
};
|
413
|
+
|
414
|
+
// Send MCP requests via SSE
|
415
|
+
function queryCustomers() {
|
416
|
+
const request = {
|
417
|
+
jsonrpc: "2.0",
|
418
|
+
id: Date.now(),
|
419
|
+
method: "tools/call",
|
420
|
+
params: {
|
421
|
+
name: "d365fo_search_entities",
|
422
|
+
arguments: {
|
423
|
+
pattern: "customer",
|
424
|
+
limit: 50
|
425
|
+
}
|
426
|
+
}
|
427
|
+
};
|
428
|
+
|
429
|
+
fetch('http://localhost:8001/sse/send', {
|
430
|
+
method: 'POST',
|
431
|
+
headers: {'Content-Type': 'application/json'},
|
432
|
+
body: JSON.stringify(request)
|
433
|
+
});
|
434
|
+
}
|
435
|
+
```
|
436
|
+
|
265
437
|
#### Alternative: Programmatic Usage
|
266
438
|
|
267
439
|
```python
|
@@ -431,7 +603,7 @@ The server provides **34 comprehensive tools** organized into functional categor
|
|
431
603
|
- **`d365fo_get_environment_info`** - Get comprehensive environment details including versions, configurations, and capabilities
|
432
604
|
|
433
605
|
#### CRUD Operations Tools (6 tools)
|
434
|
-
- **`d365fo_query_entities`** -
|
606
|
+
- **`d365fo_query_entities`** - Simplified OData querying with 'eq' filtering, wildcard patterns, field selection, and pagination
|
435
607
|
- **`d365fo_get_entity_record`** - Retrieve specific records by key with expansion options and ETag support
|
436
608
|
- **`d365fo_create_entity_record`** - Create new entity records with validation and business logic execution
|
437
609
|
- **`d365fo_update_entity_record`** - Update existing records with partial updates and optimistic concurrency control
|
@@ -593,20 +765,54 @@ d365fo-mcp-server
|
|
593
765
|
|
594
766
|
#### Advanced Configuration
|
595
767
|
|
768
|
+
**New in v0.3.0**: Comprehensive environment variable management with type safety and validation using Pydantic settings.
|
769
|
+
|
596
770
|
Create a configuration file or set additional environment variables:
|
597
771
|
|
598
772
|
```bash
|
599
|
-
#
|
600
|
-
export
|
601
|
-
|
602
|
-
|
603
|
-
export
|
773
|
+
# === Core D365FO Connection Settings ===
|
774
|
+
export D365FO_BASE_URL="https://your-environment.dynamics.com"
|
775
|
+
export D365FO_CLIENT_ID="your-client-id"
|
776
|
+
export D365FO_CLIENT_SECRET="your-client-secret"
|
777
|
+
export D365FO_TENANT_ID="your-tenant-id"
|
604
778
|
|
605
|
-
#
|
606
|
-
export
|
607
|
-
export
|
779
|
+
# === Logging Configuration ===
|
780
|
+
export D365FO_LOG_LEVEL="DEBUG" # DEBUG, INFO, WARNING, ERROR, CRITICAL
|
781
|
+
export D365FO_LOG_FILE="/custom/path/server.log" # Custom log file path
|
782
|
+
|
783
|
+
# === MCP Server Transport Settings (v0.3.0+) ===
|
784
|
+
export D365FO_MCP_TRANSPORT="stdio" # stdio, sse, http, streamable-http
|
785
|
+
export D365FO_MCP_HTTP_HOST="0.0.0.0" # HTTP host (default: 127.0.0.1)
|
786
|
+
export D365FO_MCP_HTTP_PORT="8000" # HTTP port (default: 8000)
|
787
|
+
export D365FO_MCP_HTTP_STATELESS="true" # Enable stateless mode
|
788
|
+
export D365FO_MCP_HTTP_JSON="true" # Enable JSON response mode
|
789
|
+
|
790
|
+
# === Cache and Performance Settings ===
|
791
|
+
export D365FO_CACHE_DIR="/custom/cache/path" # General cache directory
|
792
|
+
export D365FO_META_CACHE_DIR="/custom/metadata/cache" # Metadata cache directory
|
793
|
+
export D365FO_LABEL_CACHE="true" # Enable label caching (default: true)
|
794
|
+
export D365FO_LABEL_EXPIRY="1440" # Label cache expiry in minutes (24 hours)
|
795
|
+
export D365FO_USE_CACHE_FIRST="true" # Use cache before API calls
|
796
|
+
|
797
|
+
# === Connection and Performance Tuning ===
|
798
|
+
export D365FO_TIMEOUT="60" # General timeout in seconds
|
799
|
+
export D365FO_MCP_MAX_CONCURRENT_REQUESTS="10" # Max concurrent requests
|
800
|
+
export D365FO_MCP_REQUEST_TIMEOUT="30" # Request timeout in seconds
|
801
|
+
export D365FO_VERIFY_SSL="true" # Verify SSL certificates
|
802
|
+
|
803
|
+
# === MCP Authentication Settings (Advanced) ===
|
804
|
+
export D365FO_MCP_AUTH_CLIENT_ID="your-mcp-client-id"
|
805
|
+
export D365FO_MCP_AUTH_CLIENT_SECRET="your-mcp-client-secret"
|
806
|
+
export D365FO_MCP_AUTH_TENANT_ID="your-mcp-tenant-id"
|
807
|
+
export D365FO_MCP_AUTH_BASE_URL="http://localhost:8000"
|
808
|
+
export D365FO_MCP_AUTH_REQUIRED_SCOPES="User.Read,email,openid,profile"
|
809
|
+
|
810
|
+
# === Debug Settings ===
|
811
|
+
export DEBUG="true" # Enable debug mode
|
608
812
|
```
|
609
813
|
|
814
|
+
**Environment File Support**: You can also create a `.env` file in your project directory with these variables for development convenience.
|
815
|
+
|
610
816
|
## Python Client Library
|
611
817
|
|
612
818
|
### Features
|
@@ -626,6 +832,9 @@ export D365FO_MAX_CONCURRENT_REQUESTS="10"
|
|
626
832
|
- 📋 **Metadata Scripts**: PowerShell and Python utilities for entity, enumeration, and action discovery
|
627
833
|
- 🔐 **Enhanced Credential Management**: Support for Azure Key Vault and multiple credential sources
|
628
834
|
- 📊 **Advanced Sync Management**: Session-based synchronization with detailed progress tracking
|
835
|
+
- **🔧 NEW v0.3.0**: Pydantic settings model with type-safe environment variable validation
|
836
|
+
- **📂 NEW v0.3.0**: Custom log file path support and flexible logging configuration
|
837
|
+
- **🔄 NEW v0.3.0**: Automatic legacy configuration migration and compatibility layer
|
629
838
|
|
630
839
|
### Installation
|
631
840
|
|
@@ -829,6 +1038,38 @@ async with create_client("https://your-fo-environment.dynamics.com") as client:
|
|
829
1038
|
|
830
1039
|
## Configuration
|
831
1040
|
|
1041
|
+
### Environment Variable Management (New in v0.3.0)
|
1042
|
+
|
1043
|
+
The d365fo-client now includes a comprehensive **Pydantic settings model** for type-safe environment variable management:
|
1044
|
+
|
1045
|
+
```python
|
1046
|
+
from d365fo_client import D365FOSettings, get_settings
|
1047
|
+
|
1048
|
+
# Get type-safe settings instance
|
1049
|
+
settings = get_settings()
|
1050
|
+
|
1051
|
+
# Access settings with full IntelliSense support
|
1052
|
+
print(f"Base URL: {settings.base_url}")
|
1053
|
+
print(f"Log Level: {settings.log_level}")
|
1054
|
+
print(f"Cache Directory: {settings.cache_dir}")
|
1055
|
+
|
1056
|
+
# Check configuration state
|
1057
|
+
if settings.has_client_credentials():
|
1058
|
+
print("Client credentials configured")
|
1059
|
+
|
1060
|
+
startup_mode = settings.get_startup_mode() # "profile_only", "default_auth", "client_credentials"
|
1061
|
+
|
1062
|
+
# Convert to environment dictionary for external tools
|
1063
|
+
env_vars = settings.to_env_dict()
|
1064
|
+
```
|
1065
|
+
|
1066
|
+
**Key Benefits:**
|
1067
|
+
- **Type Safety**: Automatic validation and type conversion for all 35+ environment variables
|
1068
|
+
- **IDE Support**: Full IntelliSense and autocompletion for configuration options
|
1069
|
+
- **Environment Files**: Support for `.env` files in development
|
1070
|
+
- **Comprehensive Defaults**: Sensible defaults for all configuration options
|
1071
|
+
- **Validation**: Built-in validation for URLs, ports, timeouts, and other settings
|
1072
|
+
|
832
1073
|
### Authentication Options
|
833
1074
|
|
834
1075
|
```python
|
@@ -868,6 +1109,20 @@ config = FOClientConfig(
|
|
868
1109
|
)
|
869
1110
|
```
|
870
1111
|
|
1112
|
+
### Legacy Configuration Migration (New in v0.3.0)
|
1113
|
+
|
1114
|
+
The d365fo-client automatically detects and migrates legacy configuration files:
|
1115
|
+
|
1116
|
+
- **Automatic Detection**: Identifies legacy configuration patterns (missing `verify_ssl`, outdated field names)
|
1117
|
+
- **Field Migration**: Updates `cache_dir` → `metadata_cache_dir`, `auth_mode` → `use_default_credentials`
|
1118
|
+
- **Backup Creation**: Creates backup of original configuration before migration
|
1119
|
+
- **Seamless Upgrade**: Ensures smooth transition from older versions without manual intervention
|
1120
|
+
|
1121
|
+
```python
|
1122
|
+
# Legacy configurations are automatically migrated when FastMCP server starts
|
1123
|
+
# No manual intervention required - migration happens transparently
|
1124
|
+
```
|
1125
|
+
|
871
1126
|
## Core Operations
|
872
1127
|
|
873
1128
|
### CRUD Operations
|
@@ -0,0 +1,84 @@
|
|
1
|
+
d365fo_client/__init__.py,sha256=uJ8QB_7tc5oHKt6kJt8hDjpL4IWG50JAbHOP3ZwyJsc,7947
|
2
|
+
d365fo_client/auth.py,sha256=CgO2KctDvqftWWJMFIQA22KL8na9ISlrcOMd7NPNJlk,4152
|
3
|
+
d365fo_client/cli.py,sha256=NBYzxQ4upvSgibj-5Dg2Gz5-CMqv4KT7It7uVXee3j0,26784
|
4
|
+
d365fo_client/client.py,sha256=BM-XtUwzt5ehWIsT6FneNWW63fgfI6NO68RANw0rtEI,55447
|
5
|
+
d365fo_client/config.py,sha256=p4bF_WemoLyR70-CZvL7tmTR2L-vAo-9-uY0uFpZv5Q,11569
|
6
|
+
d365fo_client/credential_sources.py,sha256=19nnkjbPjubq84BgTLay2U1eqQP6caUc4R-ZeegIsAM,17560
|
7
|
+
d365fo_client/crud.py,sha256=YBjYIKqgyWYsLB8uRtI_sjRa2G7d9qtgm5mLGCB2CfA,6701
|
8
|
+
d365fo_client/exceptions.py,sha256=k8tVb5K6C_F4sCY5NVoE5RYpKPjCgPLd3JtcLIuXzTw,733
|
9
|
+
d365fo_client/labels.py,sha256=a7b_YYWDWaXANirDAr-CoodEpBvfaZvRGy76kNg4Z44,18412
|
10
|
+
d365fo_client/main.py,sha256=VrQ3eTkc2BRJtmGqn0NJLPDHKoaj-pYcmVnVEeRxzKo,19008
|
11
|
+
d365fo_client/metadata_api.py,sha256=1tDkPLxvR3F4St8GjHssn9EAoNa-ZDEP0-pbGa84DLI,41624
|
12
|
+
d365fo_client/models.py,sha256=2OA9zd10ac2vOxR5BHmHhAqR_UeBqwsLSczd0WakjXU,28550
|
13
|
+
d365fo_client/output.py,sha256=0hfyPQ_JvC8lf4s-D8lcrFiokqV_SLB06hVDb0AeE28,5981
|
14
|
+
d365fo_client/profile_manager.py,sha256=43_V82r0gugEgn5o2EbGN-JDleJaEFMPH9Ak4KmJVdk,13710
|
15
|
+
d365fo_client/profiles.py,sha256=3EwD9zYfyjdiuPPaul-_qvL8GUPiky_m6kyZqoYN20I,8106
|
16
|
+
d365fo_client/query.py,sha256=wOZjXEtGzPcd5mRfdkpMZTHZdSId44gLSboJs4LeSaw,5028
|
17
|
+
d365fo_client/session.py,sha256=4OIR61eYQHALPmbXZ446Ko4j5ttvozDxDRnMikogBys,1841
|
18
|
+
d365fo_client/settings.py,sha256=Pq5GnJA6B15RDKCbaIR8XQQ2Leys3RvqI1sfm3f2qcA,10854
|
19
|
+
d365fo_client/sync_models.py,sha256=BOYR3zCaqPwrvAQq2pM3cBb6Pt9SU7pxKKTAJLsoVZA,9247
|
20
|
+
d365fo_client/utils.py,sha256=JywzDfgEI4Ei3l6xnAA0aw15RThWAT8mY-C4tpTrToU,6846
|
21
|
+
d365fo_client/mcp/__init__.py,sha256=IT55UrOYT3kC7DS5zlALPilVu_KEIlVgIm3WR7QmEcQ,673
|
22
|
+
d365fo_client/mcp/client_manager.py,sha256=LoCpRl_WeURXVjv8ugBFFlWqQ3bUO-HpP94CwC5c010,9705
|
23
|
+
d365fo_client/mcp/fastmcp_main.py,sha256=0kzxugFnqRyiiWaEmeX2_ZSmnn5TzJKwB_jeRiXafC8,13934
|
24
|
+
d365fo_client/mcp/fastmcp_server.py,sha256=xm1gugM8TX0n613n9MqRFDlBL9pK2-5jsM2kpbsCt9o,23873
|
25
|
+
d365fo_client/mcp/fastmcp_utils.py,sha256=uBg4iziIEVN-MiMxtMwSg8a4RPseW6ltC-HKdGq-dWw,18250
|
26
|
+
d365fo_client/mcp/main.py,sha256=sNG6IIs3SvzumUhfzRH6aNzN2T7OZrPNl7_Yx-Fkt8I,5333
|
27
|
+
d365fo_client/mcp/models.py,sha256=Tq48Xvh6aXkGAHZ805r1OwPIzftUGXSYE-rt0pY4wI8,7493
|
28
|
+
d365fo_client/mcp/server.py,sha256=n4BlgfJkMuRZbHD8jshZOS-oPH-Pi2uKBExE4oxeo3U,24964
|
29
|
+
d365fo_client/mcp/auth_server/__init__.py,sha256=PaB9lYYwpfPRXgd05RgZVQfnabKfCufzKr3Zqcclal8,128
|
30
|
+
d365fo_client/mcp/auth_server/dependencies.py,sha256=CE0olD7ugJIbmfBrA3Y-w2gVWQBbExnRQxu1i2DuV40,3915
|
31
|
+
d365fo_client/mcp/auth_server/auth/__init__.py,sha256=GwoyosVxuWCPzFHaCnj6iFp9fulnp124G2gQfsnzcgc,695
|
32
|
+
d365fo_client/mcp/auth_server/auth/auth.py,sha256=YLM04cwXHURaI1o3liPhAw-37YAnDOWHZTHfXfnoyEE,13053
|
33
|
+
d365fo_client/mcp/auth_server/auth/oauth_proxy.py,sha256=EOveccoyF6wkRuf1ccQ-3QHH1n8JGzinKzbrbyodQHs,42253
|
34
|
+
d365fo_client/mcp/auth_server/auth/redirect_validation.py,sha256=Jlhela9xpTbw4aWnQ04A5Z-TW0HYOC3f9BMsq3NXx1Q,2000
|
35
|
+
d365fo_client/mcp/auth_server/auth/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
36
|
+
d365fo_client/mcp/auth_server/auth/providers/azure.py,sha256=MyOkyz_c19MB9RrcaM-mXuTbIlRK-Z5Z-o2AnT7N-jk,12824
|
37
|
+
d365fo_client/mcp/auth_server/auth/providers/bearer.py,sha256=uz7sbxXQobem3YV6HUSf-QUOnkhhnmjyXoUEu5AIIkc,891
|
38
|
+
d365fo_client/mcp/auth_server/auth/providers/jwt.py,sha256=Xj9W8WsENjeT8U3Ncic69gxQREkPp1P6LxQodE3UI5A,19542
|
39
|
+
d365fo_client/mcp/mixins/__init__.py,sha256=b7sJ77m-7EmT5PKEuMkIIBAI6ISTG2-ZnNNQQBVYbTc,778
|
40
|
+
d365fo_client/mcp/mixins/base_tools_mixin.py,sha256=pk13sckDjKQqqwS8VQyRIqXRa-M0xiB4IdwTBP1sY3k,1694
|
41
|
+
d365fo_client/mcp/mixins/connection_tools_mixin.py,sha256=RUynwtbdTGgGRmPyTdyF_H8WK5nDrnr9CdIIKInk23k,1713
|
42
|
+
d365fo_client/mcp/mixins/crud_tools_mixin.py,sha256=zV3UqpSiUb8EJZOWnJIhIytLFmjOb7Zty27sh6UKCkA,12670
|
43
|
+
d365fo_client/mcp/mixins/database_tools_mixin.py,sha256=6FeT-IVl5diikNE3IV-7kujo8TLfmcz48sK2DsO7gXw,29335
|
44
|
+
d365fo_client/mcp/mixins/label_tools_mixin.py,sha256=TYwdMVnkmJzbPWAn3bnj8AtGUZYoGzzEo7gnBCktw3o,2692
|
45
|
+
d365fo_client/mcp/mixins/metadata_tools_mixin.py,sha256=lyFqnree5J2o-0hb_uBWQ2cD1TARBxZvQbzcVe_0Unw,26037
|
46
|
+
d365fo_client/mcp/mixins/performance_tools_mixin.py,sha256=Q2DBj8oKBP7atjmJfL-EacTqQbYxvwkZc-gAlwk7S-Y,3895
|
47
|
+
d365fo_client/mcp/mixins/profile_tools_mixin.py,sha256=6Ei6Ljc8d0IGabAnPjZJRV7XChm3JhEpnAiw0I3qNkM,31516
|
48
|
+
d365fo_client/mcp/mixins/sync_tools_mixin.py,sha256=VhEs7ux23ky5xKVTMi6pP0vkjRT0onfrcSxSh_zucz8,14347
|
49
|
+
d365fo_client/mcp/prompts/__init__.py,sha256=haa0Cit3f2xWrcqlFkhfQTqff2DfAore_I0il2VIW_0,1104
|
50
|
+
d365fo_client/mcp/prompts/action_execution.py,sha256=bKj5IArWUfpcTWA8-BU_SCbTGQiliz_g3055jnEz8Hw,15606
|
51
|
+
d365fo_client/mcp/prompts/sequence_analysis.py,sha256=lDquo5OxjCVm4pejdmqkNEXasC-ur2yOeik-79fvFww,12686
|
52
|
+
d365fo_client/mcp/resources/__init__.py,sha256=2NPqxsyXWCoRw-sdj38Jjml3fKJSU54ocGWRcjFv4fc,468
|
53
|
+
d365fo_client/mcp/resources/database_handler.py,sha256=ejz2sn1pm09ySUpW7lDOpanqlu66sR0EnykCG404oa0,22884
|
54
|
+
d365fo_client/mcp/resources/entity_handler.py,sha256=wFYMPp_Rny-HZams5NtIFF8vrYU8HuIH4JmOqnEu9zU,7021
|
55
|
+
d365fo_client/mcp/resources/environment_handler.py,sha256=iblut_E_0q9Z4gfOeEG5bfodTPOzFcvfiYQFzH3WggE,4469
|
56
|
+
d365fo_client/mcp/resources/metadata_handler.py,sha256=ZPH4yAylASpbAPptWMHazACKS3dhDQKr88o22KBqRsM,11618
|
57
|
+
d365fo_client/mcp/resources/query_handler.py,sha256=NMJ07SolMO_rjdY9l7m53_EV2j0KHQSrckTySnTw1oU,4635
|
58
|
+
d365fo_client/mcp/tools/__init__.py,sha256=kfPPcs2r6biL_KLn-1MqSN2tU2eD5QahocMIun7yfuU,463
|
59
|
+
d365fo_client/mcp/tools/connection_tools.py,sha256=TT4eDF0Bb8gS36nTj5K-AIuuAYCZMB-UjW66w5HLi3I,6872
|
60
|
+
d365fo_client/mcp/tools/crud_tools.py,sha256=Ed6qKPekGvDMwOLahPbtGl-xAyFhC96qzmxpKa2wL2Y,31682
|
61
|
+
d365fo_client/mcp/tools/database_tools.py,sha256=Kh9g-e0RCTKPbmsuZ99MDK8-ZYaBB2czbElHDaJXPGU,33286
|
62
|
+
d365fo_client/mcp/tools/label_tools.py,sha256=BpUI55MgDjhokN44JhZLh1J46JgiPL0Fh0pfhZrD5I0,6376
|
63
|
+
d365fo_client/mcp/tools/metadata_tools.py,sha256=NHFrQbpL0403EA2mxLqqRE0q7MDPLroZ79JRb3gqxeQ,32260
|
64
|
+
d365fo_client/mcp/tools/profile_tools.py,sha256=n8-uGbA-K4kFVBZ--yfk-9znyPydiwCoWNEm9EpULwg,42337
|
65
|
+
d365fo_client/mcp/tools/sync_tools.py,sha256=wawJgHwRGP-ZnTtmLjK4yR1nAAhIa9tK8MF2olzUYMc,22363
|
66
|
+
d365fo_client/mcp/utilities/__init__.py,sha256=-imJ8S-rXmbXMWeDamldP-dHDqAPg_wwmPVz-LNX14E,31
|
67
|
+
d365fo_client/mcp/utilities/auth.py,sha256=ZVHkNb4YBpLE1EmmFyhvFB2qfWDZdEYNH9TRI9jylOE,1140
|
68
|
+
d365fo_client/mcp/utilities/logging.py,sha256=O_TsD5x8BPRRQ-xAa2CZlpKfRjipkpvdg6w6invBZVY,1508
|
69
|
+
d365fo_client/mcp/utilities/types.py,sha256=dZ9dw5U1gAOJsERODSlVF1Ua6q7XBAQaD7SF2K_H38w,14751
|
70
|
+
d365fo_client/metadata_v2/__init__.py,sha256=54VTuWSo5j-BEM-raLbRr3bfxc5lVXp2COajsy-7Oo0,1895
|
71
|
+
d365fo_client/metadata_v2/cache_v2.py,sha256=lW9QiPXzv__rjhswNiiRgsoOyistk5tBYhX-WjmhQqE,60476
|
72
|
+
d365fo_client/metadata_v2/database_v2.py,sha256=JX6kB_xGc1QrHSgo0XBdeBWj_k3n_ZwYtx2fsxV5ufI,25584
|
73
|
+
d365fo_client/metadata_v2/global_version_manager.py,sha256=dbf7ISFGCU88mDK5gtEZa9-q0DLLbWkLiiJIVJ_9W60,22537
|
74
|
+
d365fo_client/metadata_v2/label_utils.py,sha256=-GRagiURJv-ZQCepeOkCRqfo62rhWo8A42271w0Cb6A,3752
|
75
|
+
d365fo_client/metadata_v2/search_engine_v2.py,sha256=s_XVqP3LLog19IAv8DpxVUS7TFRUAjuBevyfe1Ldwps,16525
|
76
|
+
d365fo_client/metadata_v2/sync_manager_v2.py,sha256=JM8ThiXyXKYlnGaH3iwbBlPd9RFkDr0-ivkuHLAIo40,34090
|
77
|
+
d365fo_client/metadata_v2/sync_session_manager.py,sha256=XWxjFGwgnm6S4lzeYqyPqZgvpcqzK3tBaxnQ-srgYrg,44365
|
78
|
+
d365fo_client/metadata_v2/version_detector.py,sha256=t9mKaeT4SKb13LmIq5fB6PTLOZn5Jp7ZUqQobntNEUg,15791
|
79
|
+
d365fo_client-0.3.0.dist-info/licenses/LICENSE,sha256=idD7NJAZD7ognzZVyKjDxVYDCmngEIt0WxA_uB1v0iI,1071
|
80
|
+
d365fo_client-0.3.0.dist-info/METADATA,sha256=AbDB8_EoFT_MaATG9HDXXPvIQ16sJ3dAw78HrLICB2s,59480
|
81
|
+
d365fo_client-0.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
82
|
+
d365fo_client-0.3.0.dist-info/entry_points.txt,sha256=jCw6TT6lLRKzAWTSzxMhdYbTT-m5v0LDcZ9Zun4JM-0,174
|
83
|
+
d365fo_client-0.3.0.dist-info/top_level.txt,sha256=ZbvqO90RjhOW0cjFCAEeP8OFyITbhrij2vC3k4bWERQ,14
|
84
|
+
d365fo_client-0.3.0.dist-info/RECORD,,
|
@@ -1,56 +0,0 @@
|
|
1
|
-
d365fo_client/__init__.py,sha256=EH0lGM1TDt_-hVJqnuZK4i7sKSttSEhHapl0tRdRrmE,7752
|
2
|
-
d365fo_client/auth.py,sha256=XKt6MJQrnR1v5ahA1OR3Q-1LpHY3xo-mA62a4kvmO1M,4633
|
3
|
-
d365fo_client/cli.py,sha256=fBF6OjbZgj0T--Sii1wazP2fIFZnZnEeznUSti3l194,26118
|
4
|
-
d365fo_client/client.py,sha256=00d1V_kz6-upPMvKMSs42jXej2N7lAznna3KxQJYyCo,55326
|
5
|
-
d365fo_client/config.py,sha256=WQxXEHYhgXaM2Ocd98ILiAnJycevKArn1FNp-TGKdKA,10469
|
6
|
-
d365fo_client/credential_sources.py,sha256=XJ-DitJD3f0ncTMP4Cj0-O1RW4dFGiicYJojzg4HL_w,17259
|
7
|
-
d365fo_client/crud.py,sha256=YBjYIKqgyWYsLB8uRtI_sjRa2G7d9qtgm5mLGCB2CfA,6701
|
8
|
-
d365fo_client/exceptions.py,sha256=k8tVb5K6C_F4sCY5NVoE5RYpKPjCgPLd3JtcLIuXzTw,733
|
9
|
-
d365fo_client/labels.py,sha256=a7b_YYWDWaXANirDAr-CoodEpBvfaZvRGy76kNg4Z44,18412
|
10
|
-
d365fo_client/main.py,sha256=6jBBcePWHOG-FMJ8HMz9Qz1Tmw486Ef6VGbfvK5oBHg,19045
|
11
|
-
d365fo_client/metadata_api.py,sha256=1tDkPLxvR3F4St8GjHssn9EAoNa-ZDEP0-pbGa84DLI,41624
|
12
|
-
d365fo_client/models.py,sha256=MZoDAiXC0itaGjhgzxAzYR7JxgYwkR3035u3VHgYiNo,27309
|
13
|
-
d365fo_client/output.py,sha256=U-q6_wRHARWUKEhK-OCu16VhgWZ89sofzZuE67hNg1Q,5986
|
14
|
-
d365fo_client/profile_manager.py,sha256=w5yV1Ab2hZDpYQjssr2ztcOswXbAYCfy5Bl56YhuVwg,11609
|
15
|
-
d365fo_client/profiles.py,sha256=M_PlJ42ahNCkQr5W5eXdile_ljGOnqueHOQJboVwHlo,7147
|
16
|
-
d365fo_client/query.py,sha256=wOZjXEtGzPcd5mRfdkpMZTHZdSId44gLSboJs4LeSaw,5028
|
17
|
-
d365fo_client/session.py,sha256=4OIR61eYQHALPmbXZ446Ko4j5ttvozDxDRnMikogBys,1841
|
18
|
-
d365fo_client/sync_models.py,sha256=svQGwf9PDOBot-8bo6jiUHL4L62qtICHrhuM5RXGbOs,6419
|
19
|
-
d365fo_client/utils.py,sha256=9bHSWznuhuOmxbx9Vkd8k9RFctHYUCTiWZCmcUujPqw,6771
|
20
|
-
d365fo_client/mcp/__init__.py,sha256=B6Pw342ejRUKrw0NN5zyMSb1lF2rTICxv8KFfBMlBsU,487
|
21
|
-
d365fo_client/mcp/client_manager.py,sha256=Z8jNm8pjI64-xloJW5mcLe-7tP1JD6iGxwsaynLgyNs,12169
|
22
|
-
d365fo_client/mcp/main.py,sha256=mlKnxHHo79NBYAwcNHXuB5ImuE6QDcJvCVBtktbdduM,4269
|
23
|
-
d365fo_client/mcp/models.py,sha256=Tq48Xvh6aXkGAHZ805r1OwPIzftUGXSYE-rt0pY4wI8,7493
|
24
|
-
d365fo_client/mcp/server.py,sha256=n4BlgfJkMuRZbHD8jshZOS-oPH-Pi2uKBExE4oxeo3U,24964
|
25
|
-
d365fo_client/mcp/prompts/__init__.py,sha256=haa0Cit3f2xWrcqlFkhfQTqff2DfAore_I0il2VIW_0,1104
|
26
|
-
d365fo_client/mcp/prompts/action_execution.py,sha256=gdZcgtXHrn8fUBfk2758RGbxwAcu1qRODOxVqwLoeZA,15587
|
27
|
-
d365fo_client/mcp/prompts/sequence_analysis.py,sha256=AMsb3boD0rdd4xUYrnEqvx_OTYcFIyo6acE9zMJzgOU,12662
|
28
|
-
d365fo_client/mcp/resources/__init__.py,sha256=2NPqxsyXWCoRw-sdj38Jjml3fKJSU54ocGWRcjFv4fc,468
|
29
|
-
d365fo_client/mcp/resources/database_handler.py,sha256=ejz2sn1pm09ySUpW7lDOpanqlu66sR0EnykCG404oa0,22884
|
30
|
-
d365fo_client/mcp/resources/entity_handler.py,sha256=wFYMPp_Rny-HZams5NtIFF8vrYU8HuIH4JmOqnEu9zU,7021
|
31
|
-
d365fo_client/mcp/resources/environment_handler.py,sha256=iblut_E_0q9Z4gfOeEG5bfodTPOzFcvfiYQFzH3WggE,4469
|
32
|
-
d365fo_client/mcp/resources/metadata_handler.py,sha256=ZPH4yAylASpbAPptWMHazACKS3dhDQKr88o22KBqRsM,11618
|
33
|
-
d365fo_client/mcp/resources/query_handler.py,sha256=NMJ07SolMO_rjdY9l7m53_EV2j0KHQSrckTySnTw1oU,4635
|
34
|
-
d365fo_client/mcp/tools/__init__.py,sha256=kfPPcs2r6biL_KLn-1MqSN2tU2eD5QahocMIun7yfuU,463
|
35
|
-
d365fo_client/mcp/tools/connection_tools.py,sha256=TT4eDF0Bb8gS36nTj5K-AIuuAYCZMB-UjW66w5HLi3I,6872
|
36
|
-
d365fo_client/mcp/tools/crud_tools.py,sha256=YM6TDK41f7-xg9K4d4vs3t5vTwabtru9Z7gnzup3XvE,31229
|
37
|
-
d365fo_client/mcp/tools/database_tools.py,sha256=Kh9g-e0RCTKPbmsuZ99MDK8-ZYaBB2czbElHDaJXPGU,33286
|
38
|
-
d365fo_client/mcp/tools/label_tools.py,sha256=BpUI55MgDjhokN44JhZLh1J46JgiPL0Fh0pfhZrD5I0,6376
|
39
|
-
d365fo_client/mcp/tools/metadata_tools.py,sha256=NHFrQbpL0403EA2mxLqqRE0q7MDPLroZ79JRb3gqxeQ,32260
|
40
|
-
d365fo_client/mcp/tools/profile_tools.py,sha256=n8-uGbA-K4kFVBZ--yfk-9znyPydiwCoWNEm9EpULwg,42337
|
41
|
-
d365fo_client/mcp/tools/sync_tools.py,sha256=nHpwDwGttYTVenrhl4PygWRguZj37IfHeZeqRCqpg6w,22358
|
42
|
-
d365fo_client/metadata_v2/__init__.py,sha256=54VTuWSo5j-BEM-raLbRr3bfxc5lVXp2COajsy-7Oo0,1895
|
43
|
-
d365fo_client/metadata_v2/cache_v2.py,sha256=lW9QiPXzv__rjhswNiiRgsoOyistk5tBYhX-WjmhQqE,60476
|
44
|
-
d365fo_client/metadata_v2/database_v2.py,sha256=JX6kB_xGc1QrHSgo0XBdeBWj_k3n_ZwYtx2fsxV5ufI,25584
|
45
|
-
d365fo_client/metadata_v2/global_version_manager.py,sha256=dbf7ISFGCU88mDK5gtEZa9-q0DLLbWkLiiJIVJ_9W60,22537
|
46
|
-
d365fo_client/metadata_v2/label_utils.py,sha256=-GRagiURJv-ZQCepeOkCRqfo62rhWo8A42271w0Cb6A,3752
|
47
|
-
d365fo_client/metadata_v2/search_engine_v2.py,sha256=s_XVqP3LLog19IAv8DpxVUS7TFRUAjuBevyfe1Ldwps,16525
|
48
|
-
d365fo_client/metadata_v2/sync_manager_v2.py,sha256=iNwnKxHdE-kIbPUvBmRYJjrHEbyLMNt___ISXEnz3FM,34060
|
49
|
-
d365fo_client/metadata_v2/sync_session_manager.py,sha256=4v3idTQF3Mhaky7DD3R4AY74ZAt1s5mIuHlekIVH9MY,44350
|
50
|
-
d365fo_client/metadata_v2/version_detector.py,sha256=t9mKaeT4SKb13LmIq5fB6PTLOZn5Jp7ZUqQobntNEUg,15791
|
51
|
-
d365fo_client-0.2.4.dist-info/licenses/LICENSE,sha256=idD7NJAZD7ognzZVyKjDxVYDCmngEIt0WxA_uB1v0iI,1071
|
52
|
-
d365fo_client-0.2.4.dist-info/METADATA,sha256=up-X2CVzga_AlfPCWBWHipCWMyqc0dzbpIsp2IkW1OI,50040
|
53
|
-
d365fo_client-0.2.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
54
|
-
d365fo_client-0.2.4.dist-info/entry_points.txt,sha256=ZZBjH4mQ0XO3ALeNswswa09dh_JGIvD-zCBkKi6qNqA,106
|
55
|
-
d365fo_client-0.2.4.dist-info/top_level.txt,sha256=ZbvqO90RjhOW0cjFCAEeP8OFyITbhrij2vC3k4bWERQ,14
|
56
|
-
d365fo_client-0.2.4.dist-info/RECORD,,
|