MCP OData报告示例
一种模型上下文协议(MCP)服务器,为AI助手提供通过OData API查询报告数据库的能力。此解决方案演示了如何使用MCP标准向AI工具公开数据库报告功能。
概述
该解决方案由三个主要部分组成:
- ODataApi -ASP。NET核心Web API,通过OData端点公开数据库实体
- McpODataReporting -基于Azure功能的MCP服务器,提供用于查询OData API的工具
- mcpODataReporting。AppHost -用于编排分布式应用程序的Aspire应用程序主机
建筑
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ AI Assistant │ ◄─MCP─► │ McpODataReporting│ ◄─HTTP─►│ ODataApi │
│ (e.g. Claude) │ │ (MCP Server) │ │ (OData Service)│
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ SQL Server │
│ (ReportingDb) │
└─────────────────┘特性
OData API
- 具有查询功能的完全OData v4支持(
$filter,$select,$orderby,$expand,$top,$skip,$count) - SQL Server实体框架核心
- 支持多个实体,包括:
- 客户、产品、订单 - 产品类别和型号 - 销售订单标题和详细信息 - 地址及其他
- 数据库视图支持复杂查询
- OpenAPI/Swagger文档
MCP服务器
- AI助手的两个主要工具:
- Getodatametat -发现可用的实体集及其属性 - GetData -对报告数据库执行OData查询
- 基于Azure函数和MCP SDK构建
- 具有扩展超时支持的可配置HTTP客户端
- 用于监控的Application Insights集成
先决条件
- .NET 10.0 SDK
- SQL Server (本地数据库、Express或完整版)
- Azure功能核心工具 (用于地方发展)
- MCP兼容的AI客户端(例如,Claude Desktop)
入门指南
1.数据库设置
使用AdventureWorksLT示例架构设置SQL Server数据库。更新配置中的连接字符串:
{
"ConnectionStrings": {
"ReportingDb": "Server=(localdb)\\mssqllocaldb;Database=AdventureWorksLT;Trusted_Connection=True;"
}
}我创建了一个新的Azure SQL数据库,并使用了AdventureWorksLT数据库的Microsoft示例数据。
2.跑步。NET Aspire
运行整个解决方案的最简单方法是使用Aspire App Host:
cd mcpODataReporting.AppHost
dotnet run这将启动OData API和MCP服务器,并进行适当的服务发现和协调。
3.单独运行组件
OData API:
cd ODataApi
dotnet runAPI将于 https://localhost:7066 (或按配置)。
MCP服务器:
cd MCP
dotnet run使用MCP服务器
配置
配置您的AI客户端(例如Claude Desktop)以连接到MCP服务器。将以下内容添加到MCP设置中:
{
"mcpServers": {
"odata-reporting": {
"command": "dotnet",
"args": ["run", "--project", "path/to/MCP/McpODataReporting.csproj"]
}
}
}或者从本地运行注册MCP服务器端点:
"odata-reporting-mcp-function": {
"type": "http",
"url": "http://localhost:63930/runtime/webhooks/mcp/sse"
},或指向Azure函数
"odata-reporting-mcp-function": {
"type": "http",
"url": "https://mcpodatareporting.internal.{more}.eastus.azurecontainerapps.io/runtime/webhooks/mcp/sse"
},然后VS提示“需要身份验证”
可用的MCP工具
Getodatametat
检索可用实体的架构及其属性。
示例用法:
Please show me what data is available in the reporting database.GetData
执行OData查询以检索数据。
示例用法:
Get all customers from Seattle
Get the top 10 most expensive products
Show me sales orders with customer details查询格式:
/EntitySetName?$filter=Field eq 'Value'&$select=Field1,Field2&$top=10示例:
/Customers?$filter=City eq 'Seattle'&$select=FirstName,LastName,EmailAddress/Products?$filter=ListPrice gt 100&$orderby=ListPrice desc&$top=10/SalesOrderHeaders?$expand=Customer,SalesOrderDetails&$top=5
OData查询选项
| 选项 | 描述 | 示例 |
|---|---|---|
$filter | 筛选结果 | City eq 'Seattle' |
$select | 选择特定属性 | FirstName,LastName |
$orderby | 对结果进行排序 | ModifiedDate desc |
$expand | 包括相关实体 | Customer,Product |
$top | 限制结果(最多100个) | 10 |
$skip | 跳过结果进行分页 | 20 |
$count | 获取总计数 | true |
可用实体
核心表
- 客户 -客户信息
- 产品 -产品目录
- 产品分类 -产品类别层次结构
- 产品型号 -产品型号信息
- 销售订单标题 -销售订单主记录
- 销售订单详情 -销售订单行项目
- 地址 -地址信息
- 客户地址 -客户地址关系
视图
- VGetAll分类 -扁平化产品类别视图
- V产品和说明 -带有描述的产品
- VProductModel目录描述 -详细的产品型号目录
项目结构
mcpODataReporting/
├── ODataApi/ # OData Web API
│ ├── Data/
│ │ ├── ReportingDbContext.cs # EF Core DbContext
│ │ └── [Entity Models] # Database entity classes
│ ├── Controllers/ # OData controllers
│ └── Program.cs # API startup
├── MCP/ # MCP Server (Azure Functions)
│ ├── Tools/
│ │ └── OdataTool.cs # MCP tool implementations
│ ├── Services/
│ │ └── ODataMetadataService.cs # Metadata discovery service
│ └── Program.cs # Function app startup
├── mcpODataReporting.AppHost/ # Aspire App Host
│ └── AppHost.cs # Orchestration configuration
└── mcpODataReporting.ServiceDefaults/ # Shared service defaults发展
构建解决方案
dotnet build运行测试
dotnet test添加新实体
- 将实体类添加到
ODataApi/Data/ - 添加
DbSet到ReportingDbContext - 在中注册实体集
Program.cs:
odataBuilder.EntitySet("YourEntities");部署
按照以下步骤部署到Azure:https://learn.microsoft.com/en-us/dotnet/aspire/deployment/azd/aca-deployment-github-actions?tabs=windows&pivots=github-行动
由于这是使用Aspire,您必须在\\mcpODataReporting中。AppHost目录,否则您将遇到问题,它不会创建infi/main.bicep文件,azd-up将失败。 azure文件夹也将位于此文件夹中。
azd init 初始化项目 azd infra gen 将在中创建二头肌文件 infra 目录
azd pipeline config 为CI/CD设置GitHub Actions(在添加新的或更新现有环境变量后再次运行此操作)。它会将值推送到GitHub Secrets/Variables中。
azd up 创建基础架构和资源调配,但可以分开进行资源调配和部署 azd provision 它将提示您输入Azure SQL连接字符串并创建新的资源组 azd deploy 部署应用程序
发布MCP服务器
MCP服务器被配置为打包为自包含的单文件可执行文件:
cd MCP
dotnet publish -c Release已发布的包可以作为具有包类型的NuGet包分发 McpServer.
部署OData API
OData API可以部署到任何位置。NET托管环境:
- Azure应用服务
- Azure容器应用
- Docker容器
- 本地IIS
配置
应用设置
ODataApi/apps设置:
{
"ConnectionStrings": {
"ReportingDb": "Server=...;Database=...;"
}
}MCP配置: 通过配置或环境变量设置OData API基本URL:
{
"ODataApi": {
"BaseUrl": "https://localhost:7066"
}
}监控
该解决方案包括用于监控的Application Insights集成:
- 请求/响应日志记录
- 性能指标
- 误差跟踪
- 自定义遥测
安全注意事项
- 认证:当前配置用于开发。为生产实施正确的身份验证(Azure AD、API密钥等)
- 授权:添加授权策略以控制对敏感数据的访问
- 连接串:使用Azure密钥库或安全配置提供程序进行生产
- 超文本传输安全协议:在生产环境中始终使用HTTPS
- 速率限制:考虑在OData API上实施速率限制
许可证
本项目按原样提供,用于演示和教育目的。
