OData报告数据库查询服务

一个基于MCP协议的OData报告数据库查询服务,通过OData API为AI工具提供数据库报告能力。

  • by aligneddev
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 aligneddev/MCPODataReporting

使用说明

# MCP OData报告示例

一种模型上下文协议(MCP)服务器,为AI助手提供通过OData API查询报告数据库的能力。此解决方案演示了如何使用MCP标准向AI工具公开数据库报告功能。

概述

该解决方案由三个主要部分组成:

  1. ODataApi -ASP。NET核心Web API,通过OData端点公开数据库实体
  2. McpODataReporting -基于Azure功能的MCP服务器,提供用于查询OData API的工具
  3. 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集成

先决条件

入门指南

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 run

API将于 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

添加新实体

  1. 将实体类添加到 ODataApi/Data/
  2. 添加 DbSet<T> 到 ReportingDbContext
  3. 在中注册实体集 Program.cs:
    odataBuilder.EntitySet<YourEntity>("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上实施速率限制

许可证

本项目按原样提供,用于演示和教育目的。

资源