D365 OData查询服务器

一个MCP服务器,支持AI助手通过OData API查询Microsoft Dynamics 365数据,适用于Dataverse和Finance & Operations (F&O)场景。

  • by FlintsLabs
  • Rust
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 FlintsLabs/d365-odata-mcp

使用说明

D365 OData MCP服务器

MCP(模型上下文协议)服务器,使AI助手能够查询 微软Dynamics 365 数据通过OData API。支持两者 数据空间 和 财务与运营(F&O).

AI助理

如果你想让人工智能助手在帮助进行更改之前了解这个存储库,请让它阅读 AI_CONTEXT.md 第一。该文件简要概述了架构、运行时流程、MCP工具、安全规则和发布过程。

特性

  • ✅ 完全支持OData查询: $filter, $select, $orderby, $top, $skip, $expand, $count
  • ✅ 跨公司查询(F&O)
  • ✅ Azure Active Directory 身份验证(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应用程序

  1. 首选 Azure门户
  2. 导航至 微软Entra ID → 应用程序注册 → 新注册
  3. 命名您的应用程序(例如。, D365 MCP)
  4. 记下:
    • 租户ID (摘自概览)
    • 客户端ID (应用程序ID)
  5. 首选 证书和秘密 → 新客户机密 → 复制 秘密价值
  6. 首选 API权限 → 添加权限:
    • 对于 数据空间: Dynamics CRM → user_impersonation
    • 对于 F&O: Dynamics ERP → CustomService.FullAccess
  7. 点击 授予管理员同意

步骤3:配置您的AI客户端

在下面选择您的AI客户端:

这些示例是以下对象的快照 d365-odata-mcp。如果您正在排除故障 MCP连接或更新配置示例,请查看官方客户端文档 首先,MCP配置结构和支持的传输可能会在外部发生变化 这个仓库。


OpenAI Codex的配置

官方文件: OpenAI Codex MCP

食品法典委员会支持地方 stdio MCP服务器和流式HTTP MCP服务器。这 服务器作为本地服务器运行 stdio 服务器。Codex CLI和Codex IDE扩展 通过共享MCP配置 config.toml.

建议使用操作系统密钥存储进行本地设置:

codex mcp add d365 \
  --env TENANT_ID=your-tenant-id \
  --env CLIENT_ID=your-client-id \
  --env USE_KEYCHAIN=true \
  --env CLIENT_SECRET_KEYCHAIN_SERVICE=d365-odata-mcp-client-secret \
  --env ENDPOINT=https://your-org.crm.dynamics.com/api/data/v9.2/ \
  --env PRODUCT=dataverse \
  -- d365-odata-mcp

这 -- 将Codex MCP选项与本地选项分开 stdio 服务器命令。

要获得更细粒度的控制,请编辑 ~/.codex/config.toml.值得信赖 项目,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"

商店 CLIENT_SECRET 在操作系统密钥存储中

默认情况下, d365-odata-mcp 读取 CLIENT_SECRET 从MCP客户端的环境配置中。为了保守秘密 ~/.codex/config.toml,启用本地密钥存储查找:

[mcp_servers.d365]
command = "d365-odata-mcp"

[mcp_servers.d365.env]
TENANT_ID = "your-tenant-id"
CLIENT_ID = "your-client-id"
USE_KEYCHAIN = "true"
CLIENT_SECRET_KEYCHAIN_SERVICE = "d365-odata-mcp-client-secret"
ENDPOINT = "https://your-org.crm.dynamics.com/api/data/v9.2/"
PRODUCT = "dataverse"

秘密查找使用这对:

service = CLIENT_SECRET_KEYCHAIN_SERVICE
account = CLIENT_SECRET_KEYCHAIN_ACCOUNT, or CLIENT_ID when account is omitted

在macOS上,使用以下命令创建或更新Keychain项目:

security add-generic-password \
  -a "<CLIENT_ID>" \
  -s "d365-odata-mcp-client-secret" \
  -w "<CLIENT_SECRET>" \
  -U

如果您的Keychain项目使用了不同的帐户名,请设置 CLIENT_SECRET_KEYCHAIN_ACCOUNT 明确地:

USE_KEYCHAIN = "true"
CLIENT_SECRET_KEYCHAIN_SERVICE = "d365-odata-mcp-client-secret"
CLIENT_SECRET_KEYCHAIN_ACCOUNT = "shared-d365-app"

对于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
codex mcp --help

在Codex终端UI中,使用 /mcp 查看活动的MCP服务器。


Claude代码的配置

官方文件: 克劳德代码MCP

建议使用操作系统密钥存储进行本地设置:

claude mcp add --transport stdio --scope local d365 \
  --env TENANT_ID=your-tenant-id \
  --env CLIENT_ID=your-client-id \
  --env USE_KEYCHAIN=true \
  --env CLIENT_SECRET_KEYCHAIN_SERVICE=d365-odata-mcp-client-secret \
  --env ENDPOINT=https://your-org.crm.dynamics.com/api/data/v9.2/ \
  --env PRODUCT=dataverse \
  -- d365-odata-mcp

这 -- 将Claude Code选项与MCP服务器命令分开 论据。将本地作用域用于您不希望使用的凭据支持的配置 在存储库中共享。

对于共享项目配置,请创建 .mcp.json 并在操作系统中保守秘密 秘密商店:

{
  "mcpServers": {
    "d365": {
      "type": "stdio",
      "command": "d365-odata-mcp",
      "env": {
        "TENANT_ID": "${TENANT_ID}",
        "CLIENT_ID": "${CLIENT_ID}",
        "USE_KEYCHAIN": "true",
        "CLIENT_SECRET_KEYCHAIN_SERVICE": "d365-odata-mcp-client-secret",
        "ENDPOINT": "https://your-org.crm.dynamics.com/api/data/v9.2/",
        "PRODUCT": "dataverse"
      }
    }
  }
}

使用以下工具进行管理和调试:

claude mcp list
claude mcp get d365

在Claude Code内部,使用 /mcp 检查连接状态。如果D365响应 如果较大,请使用较大的输出预算启动Claude Code:

MAX_MCP_OUTPUT_TOKENS=50000 claude

Claude桌面配置

官方文件: 连接到本地MCP服务器

编辑 ~/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",
        "USE_KEYCHAIN": "true",
        "CLIENT_SECRET_KEYCHAIN_SERVICE": "d365-odata-mcp-client-secret",
        "ENDPOINT": "https://your-org.crm.dynamics.com/api/data/v9.2/",
        "PRODUCT": "dataverse"
      }
    }
  }
}

谷歌反重力2.0的配置

官方文件: 谷歌反重力MCP

Antigravity 2.0使用专用 mcp_config.json 顶级文件 mcpServers 对象。您可以全局或按工作区配置此服务器:

  • 全球的: ~/.gemini/config/mcp_config.json
  • 工作区: .agents/mcp_config.json

在《反重力2.0》中,打开 设置 → 定制 → 已安装的MCP服务器.在Antigravity IDE中,打开代理侧面板菜单 (...) → MCP服务器 → 管理MCP服务器 → 查看原始配置. 在Antigravity CLI中,键入 /mcp 打开交互式MCP管理器。

建议使用操作系统密钥存储区进行Webex配置:

{
  "mcpServers": {
    "d365": {
      "command": "d365-odata-mcp",
      "env": {
        "TENANT_ID": "your-tenant-id",
        "CLIENT_ID": "your-client-id",
        "USE_KEYCHAIN": "true",
        "CLIENT_SECRET_KEYCHAIN_SERVICE": "d365-odata-mcp-client-secret",
        "ENDPOINT": "https://your-org.crm.dynamics.com/api/data/v9.2/",
        "PRODUCT": "dataverse"
      }
    }
  }
}

建议使用操作系统机密存储的F&O配置:

{
  "mcpServers": {
    "d365-finops": {
      "command": "d365-odata-mcp",
      "env": {
        "TENANT_ID": "your-tenant-id",
        "CLIENT_ID": "your-client-id",
        "USE_KEYCHAIN": "true",
        "CLIENT_SECRET_KEYCHAIN_SERVICE": "d365-odata-mcp-client-secret",
        "ENDPOINT": "https://your-org.sandbox.operations.dynamics.com/data/",
        "PRODUCT": "finops"
      }
    }
  }
}

如果必须使用每个环境的钥匙扣项目,请设置服务和帐户 明确地:

{
  "mcpServers": {
    "d365": {
      "command": "d365-odata-mcp",
      "env": {
        "TENANT_ID": "your-tenant-id",
        "CLIENT_ID": "your-client-id",
        "USE_KEYCHAIN": "true",
        "CLIENT_SECRET_KEYCHAIN_SERVICE": "d365-odata-mcp-client-secret",
        "CLIENT_SECRET_KEYCHAIN_ACCOUNT": "shared-d365-app",
        "ENDPOINT": "https://your-org.crm.dynamics.com/api/data/v9.2/",
        "PRODUCT": "dataverse"
      }
    }
  }
}

用于本地 stdio MCP服务器,如 d365-odata-mcp,使用 command, args, env,并且可选 cwd反重力的远程MCP配置使用 serverUrl 用于流式HTTP或SSE服务器。


可用工具

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客户端密码 ✅ 除非 USE_KEYCHAIN=true
ENDPOINT D365 OData 端点网址✅
PRODUCT dataverse 或 finops ✅
AUTH_TYPE azure (默认)或 adfs ❌
TOKEN_URL 自定义令牌URL(仅限ADFS) ❌
RESOURCE 资源/受众(仅限ADFS) ❌
METADATA_CACHE_TTL 元数据缓存TTL(秒)(默认值:900=15分钟) ❌
INSECURE_SSL 跳过自签名证书的SSL验证(true/false) ❌
USE_KEYCHAIN 阅读 CLIENT_SECRET 来自操作系统本机密钥存储(true/false,默认值 false) ❌
CLIENT_SECRET_KEYCHAIN_SERVICE 在以下情况下使用的秘密商店服务名称 USE_KEYCHAIN=true ✅ 当 USE_KEYCHAIN=true
CLIENT_SECRET_KEYCHAIN_ACCOUNT 秘密商店帐户名称;默认为 CLIENT_ID 如果省略 ❌

本地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。