克劳德代码↔ Dynamics 365 F&O-MCP集成
一个小型代理,允许 克劳德代码 和...交谈 微软Dynamics 365财务与运营 通过 模型上下文协议(MCP).
设置后,您可以查询D365数据、浏览表单和调用自定义X++操作——所有这些都可以使用自然语言从Claude Code中完成。
在WSL Ubuntu上测试,安装了Azure CLI扩展的VSCode。
为什么需要这个?
为什么不直接通过HTTP连接?
虽然模型上下文协议(MCP)正式支持HTTP传输(通过服务器发送事件-SSE),但将Claude Code直接连接到远程Dynamics 365 F&O MCP服务器并不简单。该代理通过解决三个主要的架构约束来弥合差距:
*1.不支持动态HTTP标头(身份验证)* Claude Code的配置依赖于静态设置。连接到D365 F&O需要动态注入 Authorization: Bearer 将标题插入请求中。Claude Code目前缺乏一个内置机制来动态获取Entra ID(Azure AD)令牌并将其动态注入HTTP标头。
*2.令牌到期(Entra ID)* 即使您可以将Bearer令牌硬编码到Claude Code配置中,Entra ID访问令牌通常也会在60-90分钟内过期。静态配置将导致 401 Unauthorized 此Node.js代理通过在后台通过Azure CLI动态获取和管理有效令牌来解决此问题。
*3.克劳德密码 stdio 设计* Claude Code主要是一个开发人员CLI工具,旨在与本地资源进行交互。它本机更喜欢生成MCP服务器,因为本地子进程通过 stdio.
解决方案: 此代理充当适配器。从Claude Code的角度来看,它只是一个简单的本地脚本,通过 stdio从D365 F&O的角度来看,它是一个经过适当身份验证的HTTP/SSE客户端,使用有效的Bearer令牌发出请求。
运作原理
这个想法很简单:一个很小的Node.js脚本位于中间,在两个世界之间转换。
┌─────────────┐ stdio (JSON-RPC) ┌───────────────────┐ HTTPS + Bearer ┌──────────────────┐
│ Claude Code │ ◄───────────────► │ mcp-dynamics365fo │ ◄──────────────► │ D365 F&O MCP │
│ (IDE/CLI) │ stdin / stdout │ proxy.mjs │ HTTP POST │ Server (remote) │
└─────────────┘ └───────────────────┘ └──────────────────┘
│
│ az account get-access-token
▼
┌──────────────────┐
│ Azure CLI (az) │
│ Token Provider │
└──────────────────┘- Claude Code将代理作为子进程生成(在中配置
.mcp.json). - 它将JSON-RPC消息发送到代理的stdin。
- 代理从Azure CLI获取Bearer令牌,并将每条消息作为HTTP POST转发到D365 MCP端点。
- D365响应(纯JSON或SSE流)——代理解析它并将结果写回stdout。
- 一
mcp-session-id在请求之间跟踪标头以保持D365服务器端状态。
设计决策
为什么选择Azure CLI进行身份验证? D365 MCP服务器需要Azure AD令牌。使用 az account get-access-token 这是阻力最小的道路——无需管理客户端机密,无需创建应用程序注册,只需您现有的 az login 会议。它适用于MFA、有条件访问等。
为什么每45分钟刷新一次代币? Azure AD令牌大约在60-75分钟后过期。代理每45分钟主动刷新一次,这样您就不会在对话过程中出现随机故障。
为什么要代理上交所? D365有时会回应 text/event-stream 而不是普通的JSON。代理透明地处理这两个问题——你不需要担心。
关于ClientID
Azure CLI客户端ID为: 04b07795-8ddb-461a-bbee-02f9e1bf7b46
这是在Azure AD中注册的第一方Microsoft应用程序,适用于全球所有Azure CLI用户。您不需要创建自己的应用程序注册。只需将此ID复制到步骤2中的D365“允许的MCP客户端”表单中。
注意:这与默认的VSCode不同 可点击.
可选--自己验证:
- 运行:
az account get-access-token --resource https://YOUR-ENVIRONMENT.operations.dynamics.com --query accessToken -o tsv - 将令牌粘贴到 jwt.ms
- 检查
appidclaim——它应该与上面的ID匹配。
更多信息: Microsoft文档--使用Azure CLI登录
先决条件
- Node.js 22+ (需要本地
fetch;节点18+可能适用于--experimental-fetch) - Azure命令行界面 已安装并登录(
az login) - D365 F&O 启用MCP服务器的环境
- 克劳德代码 (VSCode扩展或CLI)
设置
步骤1:Azure CLI
# Install if needed: https://learn.microsoft.com/en-us/cli/azure/install-azure-cli
# Log in
az login
# Quick test — should print a long token string
az account get-access-token \
--resource "https://YOUR-ENVIRONMENT.operations.dynamics.com" \
--query accessToken -o tsv步骤2:在D365中注册ClientID
这部分很重要——除非明确允许客户端应用程序,否则D365不会接受MCP连接。
- 在浏览器中打开D365 F&O环境。
- 首选 系统管理 并搜索 “允许的MCP客户端”.
- 添加新行:
- 名字: AzureCLI-ClaudeCode (或你喜欢的任何东西) - 可点击: 04b07795-8ddb-461a-bbee-02f9e1bf7b46 - 允许: true
- 保存。
Allowed MCP Clients form in D365
步骤3:克隆仓库
git clone https://github.com/axpolik/claude-code-d365fo-mcp.git无需编辑代理脚本——所有配置都是通过中的环境变量完成的 .mcp.json.
步骤4:配置Claude代码
复制 .mcp.json 到您的项目根(或 ~/.claude/.mcp.json 全局配置):
cp .mcp.json /path/to/your/project/.mcp.json然后编辑 .mcp.json --设置D365环境URL和代理脚本的路径:
{
"mcpServers": {
"dynamics365fo": {
"command": "/absolute/path/to/node",
"args": ["/absolute/path/to/mcp-dynamics365fo-proxy.mjs"],
"env": {
"PATH": "/mnt/c/Program Files/Microsoft SDKs/Azure/CLI2/wbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"D365_MCP_URL": "https://YOUR-ENVIRONMENT.sandbox.operations.dynamics.com/mcp",
"D365_RESOURCE": "https://YOUR-ENVIRONMENT.sandbox.operations.dynamics.com"
}
}
}
}有几件事要记住:
command--可以只是"node"如果它在你的路径中,或者像这样的完整路径"/home/user/.nvm/versions/node/v22.22.0/bin/node".args--需要 绝对路径 到代理脚本。D365_MCP_URL/D365_RESOURCE--您的D365 F&O环境URL。打开D365时在浏览器地址栏中找到它(例如。https://mycompany.sandbox.operations.eu.dynamics.com).env.PATH--必须包含以下目录az生活。在WSL上,您可能还需要添加Windows侧路径(请参阅故障排除)。
第五步:测试
- 在VSCode或终端中打开克劳德代码。
- 检查MCP服务器状态--
dynamics365fo应该出现。 - 尝试以下内容: *“在D365中查找SalesOrderHeaders实体”*.
文件
claude-code-d365fo-mcp/
├── README.md # You're reading it
├── mcp-dynamics365fo-proxy.mjs # The proxy (stdio ↔ HTTP)
├── .mcp.json # Claude Code MCP config template
└── d365foMCPclient_form.jpg # Screenshot of the D365fo config form故障排除
“令牌刷新失败” --你的 az login 会话已过期。跑 az login 再一次。
代理已启动,但未显示任何工具 --检查三件事:(1)您的D365环境上启用了MCP服务器,(2)您的ClientID在“允许的MCP客户端”窗体中,(3)您的Azure AD用户具有正确的D365安全角色。
“未定义fetch” --你需要Node.js 22+(它具有原生 fetch).在节点18-21上,添加 --experimental-fetch 标志作为Node.js参数 *之前* 中的脚本路径 .mcp.json:
"args": ["--experimental-fetch", "/path/to/mcp-dynamics365fo-proxy.mjs"]如何在本地调试代理? --如果Claude Code没有显示任何工具,请直接在终端中运行代理以查看原始错误:
D365_MCP_URL="https://YOUR-ENV.operations.dynamics.com/mcp" \
D365_RESOURCE="https://YOUR-ENV.operations.dynamics.com" \
node mcp-dynamics365fo-proxy.mjs如果它崩溃了,你会立即看到Node.js错误堆栈。如果它静默等待,则表示它正在正常运行并等待来自stdin的JSON-RPC输入。
WSL上的PATH问题 --如果 az 已安装在Windows端,请将其添加到PATH中 .mcp.json:
"env": {
"PATH": "/usr/local/bin:/usr/bin:/bin:/mnt/c/Program Files/Microsoft SDKs/Azure/CLI2/wbin"
}D365 MCP工具
连接后,您将获得三类工具: 数据 (OData CRUD), 形式 (UI导航),以及 API (自定义X++调用)。对于CRUD操作,首选数据工具——目前它们更快、更可靠。
⚠️ 高令牌消耗警告
D365 F&O可以返回大量JSON有效载荷(数据实体、元数据)。无限制地查询它会迅速耗尽Claude上下文窗口并增加API成本。
如何最大限度地减少代币使用:
- 重度过滤: 始终指示克劳德使用以下限制
$top,$select,或$filter只获取所需的确切行和列。 - 💡 专业提示:将本地文件用作“内存”: 请Claude将常用的静态D365数据(如模式、元数据或特定ID)保存到本地文件中(例如。,
d365_memory.md).Claude可以稍后读取此文件,而无需重新查询MCP服务器,从而节省了大量令牌!
示例:使用内存文件启动新的Claude Code会话的初始提示
## Session context:
- The file `d365fo-mcp-memory.md` in the project root is a local cache for dynamics365fo MCP tool data
- Before any query to the dynamics365fo MCP tool, check this file first — if data is there and current, use it without calling MCP tools
- If data is missing, insufficient, or ambiguous — call dynamics365fo MCP tool and save the result to the memory file
- Save to memory: entity metadata, field schemas, control names, semi-static query results (with query date)
- Modify the memory file without asking for confirmation
##Start by reading d365fo-mcp-memory.md to load context.许可证
麻省理工学院
