D365 OData MCP服务器
 
MCP(模型上下文协议)服务器,使AI助手能够查询 微软Dynamics 365 数据通过OData API。支持两者 JB 和 财务与运营(F&O).
AI助理
如果你想让人工智能助手在帮助进行更改之前了解这个存储库,请让它阅读 AI_CONTEXT.md 第一。该文件简要概述了架构、运行时流程、MCP工具、安全规则和发布过程。
特性
- ✅ 完全支持OData查询:
$filter,$select,$orderby,$top,$skip,$expand,$count - ✅ 跨公司查询(F&O)
- ✅ Azure AD 身份验证(Cloud D365)
- ✅ ADFS 身份验证(内部D365)
- ✅ 自动令牌刷新
- ✅ 使用指数回退重试
- ✅ 元数据缓存 具有可配置的TTL,可提高性能
- ✅ 适用于OpenAI Codex、Claude Desktop、Claude Code和其他MCP客户端
______________________________________________________________________
快速开始
步骤1:安装
cargo install d365-odata-mcp升级到最新版本
cargo install d365-odata-mcp --force步骤2:创建Azure AD应用程序
- 首选 Azure门户
- 导航至 微软Entra ID → 应用程序注册 → 新注册
- 命名您的应用程序(例如。,
D365 MCP) - 记下:
- 租户ID (摘自概览) - 客户端ID (应用程序ID)
- 首选 证书和秘密 → 新客户机密 → 复制 机密值
- 首选 API权限 → 添加权限:
- 对于 JB: Dynamics CRM → user_impersonation - 对于 F&O: Dynamics ERP → CustomService.FullAccess
- 点击 授予管理员同意
步骤3:配置您的AI客户端
在下面选择您的AI客户端:
______________________________________________________________________
OpenAI Codex的配置
编辑 ~/.codex/config.toml:
[mcp_servers.d365]
command = "d365-odata-mcp"
[mcp_servers.d365.env]
TENANT_ID = "your-tenant-id"
CLIENT_ID = "your-client-id"
CLIENT_SECRET = "your-client-secret"
ENDPOINT = "https://your-org.crm.dynamics.com/api/data/v9.2/"
PRODUCT = "dataverse"对于F&O:
[mcp_servers.d365]
command = "d365-odata-mcp"
[mcp_servers.d365.env]
TENANT_ID = "your-tenant-id"
CLIENT_ID = "your-client-id"
CLIENT_SECRET = "your-client-secret"
ENDPOINT = "https://your-org.sandbox.operations.dynamics.com/data/"
PRODUCT = "finops"验证安装:
codex mcp list______________________________________________________________________
Claude桌面配置
编辑 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)或 %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"d365": {
"command": "d365-odata-mcp",
"env": {
"TENANT_ID": "your-tenant-id",
"CLIENT_ID": "your-client-id",
"CLIENT_SECRET": "your-client-secret",
"ENDPOINT": "https://your-org.crm.dynamics.com/api/data/v9.2/",
"PRODUCT": "dataverse"
}
}
}
}______________________________________________________________________
双子座的配置(反重力)
添加工作流文件 .agent/workflows/d365-query.md 对于您的项目:
---
description: How to query D365 Finance & Operations data via d365-odata-mcp
---
# D365 OData Query
Query D365 data via command line:
\```bash
export TENANT_ID="your-tenant-id"
export CLIENT_ID="your-client-id"
export CLIENT_SECRET="your-client-secret"
export ENDPOINT="https://your-org.sandbox.operations.dynamics.com/data/"
export PRODUCT="finops"
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"query_entity","arguments":{"entity":"CustomersV3","top":"10"}}}' | d365-odata-mcp 2>/dev/null | jq '.result.content[0].text' -r
\```______________________________________________________________________
可用工具
1. list_entities
列出所有可用的D365实体:
"List all D365 entities"2. query_entity
具有完全OData支持的查询数据:
| 参数 | 说明 | 必填 |
|---|---|---|
entity | 实体名称。, CustomersV3 | ✅ |
filter | OData过滤器。, dataAreaId eq 'bc' | ❌ |
select | 要返回的字段。, Name,Id | ❌ |
orderby | 排序顺序。, CreatedDate desc | ❌ |
top | 最大记录数(默认值:50,最大值:1000) | ❌ |
skip | 要跳过的记录(分页) | ❌ |
expand | 要展开的导航属性 | ❌ |
cross_company | true 适用于跨公司(仅F&O) | ❌ |
count | true 包括总计数 | ❌ |
示例:
"Query CustomersV3, show first 10 records"
"Query SalesOrderHeaders where dataAreaId is 'bc', order by SalesOrderNumber desc"
"Get inventory where warehouse is 'WH01' with count"3. get_entity_schema
获取实体的可用字段:
"Show schema for SalesOrderHeaders"4. get_record
按ID获取单个记录:
"Get customer record with ID 'CUS-001'"5. delete_record
按OData键删除单个记录。此工具需要 confirm 确切地说 DELETE.
| 参数 | 说明 | 必填 |
|---|---|---|
entity | 实体名称。, CustomersV3 | ✅ |
key | 无括号的OData密钥表达式。, dataAreaId='bc',CustomerAccount='CUS-001' | ❌ |
id | 简单记录ID/密钥,用于 key 未提供 | ❌ |
if_match | 可选 If-Match 标头值(默认值: *) | ❌ |
confirm | 必须完全正确 DELETE | ✅ |
例子:
"Delete CustomersV3 with key dataAreaId='bc',CustomerAccount='CUS-001' and confirm DELETE"6. get_environment_info
获取D365环境信息:
"Show D365 environment info"7. get_metadata
获取实体元数据,包括属性和导航属性(可扩展字段):
"Get metadata for CustomersV3"
"Show me the schema and expandable fields for SalesOrderHeaders"8. refresh_metadata
强制刷新缓存的元数据(架构更改时有用):
"Refresh metadata cache"______________________________________________________________________
环境变量
| 变量 | 描述 | 必填 |
|---|---|---|
TENANT_ID | Azure AD租户ID(或 adfs 对于ADFS) | ✅ |
CLIENT_ID | Azure AD/ADF应用程序ID | ✅ |
CLIENT_SECRET | Azure AD/ADF客户端密码 | ✅ |
ENDPOINT | D365 OData endpoint URL | ✅ |
PRODUCT | dataverse 或 finops | ✅ |
AUTH_TYPE | azure (默认)或 adfs | ❌ |
TOKEN_URL | 自定义令牌URL(仅限ADFS) | ❌ |
RESOURCE | 资源/受众(仅限ADFS) | ❌ |
METADATA_CACHE_TTL | 元数据缓存TTL(秒)(默认值:900=15分钟) | ❌ |
INSECURE_SSL | 跳过自签名证书的SSL验证(true/false) | ❌ |
______________________________________________________________________
本地D365(ADFS)的配置
对于具有ADFS身份验证的D365 F&O内部部署:
# ~/.codex/config.toml
[mcp_servers.d365_onprem]
command = "d365-odata-mcp"
[mcp_servers.d365_onprem.env]
AUTH_TYPE = "adfs"
TENANT_ID = "adfs"
CLIENT_ID = "your-adfs-client-id"
CLIENT_SECRET = "your-adfs-secret"
TOKEN_URL = "https://your-adfs-server.com/adfs/oauth2/token"
RESOURCE = "https://your-d365-onprem.com"
ENDPOINT = "https://your-d365-onprem.com/namespaces/AXSF/data/"
PRODUCT = "finops"______________________________________________________________________
常见F&O实体
| 实体 | 描述 |
|---|---|
CustomersV3 | 客户主数据 |
VendorsV2 | 供应商主数据 |
ProductsV2 | 产品主数据 |
SalesOrderHeaders | 销售订单标题 |
SalesOrderLines | 销售订单行 |
PurchaseOrderHeaders | 采购订单标题 |
PurchaseOrderLines | 采购订单行 |
InventoryOnHandAggregatedByWarehouse | 现有库存 |
______________________________________________________________________
OData筛选器语法
| 操作员 | 示例 |
|---|---|
eq | Status eq 'Open' |
ne | Status ne 'Closed' |
gt / ge | Amount gt 1000 |
lt / le | Amount lt 100 |
and / or | Status eq 'Open' and Amount gt 100 |
contains | contains(Name, 'Corp') |
startswith | startswith(Name, 'ABC') |
______________________________________________________________________
测试
直接测试服务器:
export TENANT_ID="..." CLIENT_ID="..." CLIENT_SECRET="..." ENDPOINT="..." PRODUCT="finops"
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | d365-odata-mcp______________________________________________________________________
许可证
MIT许可证-请参阅 许可证 了解详情。
______________________________________________________________________
贡献
欢迎投稿!请打开问题或提交PR。
