MCP图形API演示
此项目演示了将模型上下文协议(MCP)与Azure Graph API一起用于查询Azure租户中的应用程序注册。
该应用程序使用一个与ASP通信的DateTimeWebAssembly客户端。NET Core服务器实现MCP协议。服务器连接到Microsoft Graph API以检索应用程序注册数据,然后通过人工智能辅助聊天界面对其进行处理和呈现。
架构概述
+---------------------+ +---------------------+
| MCP Client | | MCP Server |
| | | |
| +---------------+ | MCP API | +--------------+ |
| | LLM | | Requests & | | Graph API | |
| | Integration |Functions | | Functions | Microsoft Graph API
| | (SK + OpenAI) | | | | | |
| +---------------+ | | +--------------+ |
| | | |
| +---------------+ | | +--------------+ |
| | UI/UX | | | | Azure AD | |
| | (Blazor WASM)| | | | Integration | Azure Active Directory
| +---------------+ | | +--------------+ |
+---------------------+ +---------------------+
Client handles: Server handles:
- User Interface - Function Definitions
- Prompt Engineering - Graph API Integration
- LLM Integration - Azure AD Authentication
- Function Orchestration - Data Processing该架构严格遵循MCP原则,其中:
- MCP客户端处理所有LLM交互和用户体验
- MCP服务器提供函数定义并处理实际的Graph API调用
- 通信通过标准化的MCP协议进行
项目结构
- MCP。客户端:与MCP服务器交互的ArgumentWebAssembly客户端
- 处理用户界面和聊天体验 - 与Azure OpenAI或OpenAI API集成 - 使用语义内核来编排LLM交互和函数调用
- MCP。服务器:ASP。NET核心服务器,实现Azure Graph API的MCP协议
- 为Graph API操作提供函数定义 - 处理Azure AD的身份验证 - 当客户端请求时执行Graph API调用 - 将结构化数据返回给客户端
- MCP。共享:客户端和服务器之间的共享模型和接口
- 定义MCP协议结构 - 包含共享数据模型和接口
什么是模型上下文协议(MCP)?
模型上下文协议(MCP)是LLM驱动的应用程序的架构模式,它将以下内容分开:
- LLM集成 (客户端):用户界面、提示工程、LLM调用
- 工具/功能集成 (服务器端):LLM可以使用的功能
MCP提供了一种清晰的关注点分离:
- 客户端处理所有LLM交互和用户体验
- 服务器专注于提供函数定义并在调用时执行它们
- 这种分离允许更好的安全性、模块化和可扩展性
本项目通过以下方式实施MCP:
- 在服务器上将Graph API功能作为函数公开
- 允许客户端的LLM发现并调用这些函数
- 切勿将LLM密钥暴露给服务器或将函数实现细节暴露给客户端
先决条件
- .NET 9.0
- 具有应用程序注册权限的Azure订阅
- Azure OpenAI资源或OpenAI API密钥
配置
在运行应用程序之前,您需要使用自己的Azure凭据对其进行配置:
MCP服务器配置
编辑 MCP.Server/appsettings.json 并更新以下设置:
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "",
"ClientId": "",
"ClientSecret": "",
"Scopes": ["User.Read", "Application.Read.All"]
}MCP客户端配置
编辑 MCP.Client/wwwroot/appsettings.json 并更新以下设置:
"AzureAd": {
"Authority": "https://login.microsoftonline.com/",
"ClientId": "",
"ValidateAuthority": true
},
"ApiBaseUrl": "http://localhost:5197",
"AzureOpenAI": {
"Endpoint": "https://your-resource.openai.azure.com/",
"ApiKey": "",
"DeploymentName": "gpt-35-turbo"
}备注MCP服务器不再需要OpenAI配置,因为它不直接与LLM交互。所有LLM集成都由客户端处理。
安装说明
- 先决条件:
- 安装。净9.0 SDK - 拥有具有创建应用程序注册权限的Azure订阅 - 访问Azure OpenAI或OpenAI API
- 在Azure AD中注册应用程序:
- 转到Azure门户>Azure Active Directory>应用程序注册 - 创建新注册 - 设置客户端密码 - 授予以下API权限: - Microsoft Graph API>应用程序。读。全部 - 确保授予管理员同意 - 看 GraphApiPermissionFix.md 有关权限的详细故障排除
- 配置Azure OpenAI:
- 创建Azure OpenAI资源或直接使用OpenAI - 为GPT模型创建部署(例如GPT-35-turbo或GPT-4) - 获取API密钥和终结点
- 更新配置文件:
- 按照上述配置部分中的说明更新服务器和客户端配置文件
运行应用程序
- 启动MCP服务器:
cd MCP.Server
dotnet run- 启动MCP客户端(在新终端中):
cd MCP.Client
dotnet run- 打开浏览器并导航到:
- http://localhost:5268(客户) - http://localhost:5197/swagger(服务器API文档)
- 使用聊天界面询问有关Azure应用程序注册的问题:
- “列出我租户中的所有应用程序注册” - “获取ID为\[app-ID\]的应用注册详细信息” - “\[应用程序名称\]有哪些权限?”
使用MCP开发
要使用新的Graph API功能扩展此应用程序,请执行以下操作:
- 在中添加新的函数声明
MCP.Server/Services/McpGraphService.cs - 在同一文件中实现功能逻辑
- 更新
ExecuteFunctionAsync处理新函数的方法 - 客户的LLM将在适当的时候自动发现并使用新功能
函数声明示例:
new McpFunctionDeclaration
{
Name = "get_user_details",
Description = "Get details for a specific user in the tenant",
Parameters = new McpFunctionParameters
{
Type = "object",
Properties = new Dictionary
{
["user_id"] = new McpParameterProperty
{
Type = "string",
Description = "The ID of the user"
}
},
Required = new List { "user_id" }
}
}GitHub准备
在将此项目推送到公共GitHub存储库之前:
- 运行附带的清理脚本来清理配置文件:
.\clean-for-github.ps1- 验证是否存在敏感数据:
- 全部 appsettings.json 文件应使用占位符(`) - 不应包含任何实际的API密钥或凭据 - 不 .bak 或 .private` 应提交文件
- 查看 礼品清单.md 提交完整的预发布检查表
安全考虑
- 永远不要将真正的API密钥或机密提交到GitHub
- MCP架构通过仅在客户端保留LLM密钥来增强安全性
- 服务器只需要访问Graph API,而不需要访问任何LLM服务
- 使用Azure密钥保险库进行生产部署,以安全存储API密钥
- 看 贡献.md 了解更多安全最佳实践
许可证
此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。
- 按照配置部分更新设置文件
运行应用程序
- 启动服务器:
cd MCP.Server
dotnet run --launch-profile https- 启动客户端:
cd MCP.Client
dotnet run- 访问应用程序:
打开浏览器并导航到 https://localhost:7030/chat
故障排除
如果遇到权限问题,请检查以下内容:
- 验证API权限:确保您的应用程序注册具有所需的Microsoft Graph权限,并且已授予管理员同意。
- 检查身份验证:确保配置文件中的Azure AD凭据正确。
- 运行测试脚本:使用提供的PowerShell脚本测试Graph API权限:
./TestGraphPermissions.ps1特性
- 聊天界面,用于查询有关Azure租户的信息
- 通过MCP访问Graph API函数
- LLM函数的语义内核集成
为GitHub做准备
在将此项目推送到公共存储库之前,请运行清理脚本以删除敏感信息:
./clean-for-github.ps1此脚本将:
- 删除不必要的文件(bin、obj文件夹)
- 删除Azure存储模拟器文件
- 通过用占位符替换敏感数据来净化配置文件
- 使用创建原始文件的备份
.private.bak扩展
贡献
如果你想为这个项目做出贡献,请阅读我们的 贡献指南 有关我们的行为准则和提交pull请求流程的详细信息。
许可证
此项目根据MIT许可证获得许可-有关详细信息,请参阅许可证文件。
致谢
- 模型上下文协议(MCP) -为AI模型交互提供框架
- Microsoft Graph API -用于访问Azure AD数据
