.NET 10 + MCP + SqlSugar:给工控设备做一个 AI 能查的数据中枢

简介: 这是一个面向工业现场的离线AI助手骨架:基于SQLite本地数据库,通过双进程(Web API + MCP Server)共享数据;AI仅读取设备状态、越限判断等逻辑由服务端完成,确保准确可靠;支持自然语言查询如“3号机正常吗”,实时响应无需同步。技术栈含.NET 8、React 19与MCP标准协议。(239字)

一、先看最终效果

问 AI:「3 号机现在正常吗?」

它自己去调 get_status,返回:运行中 / 自动模式 / 通讯正常 / 4 个点位其中 1 个越限 / 近 24 小时 2 条报警,然后用中文答出「压力 0.95 MPa 高于上限 0.8,建议检查」。

这件事的技术本质是:模型没有连数据库,它只是请求调用一个 C# 方法。

两条链路、两个进程、一个数据库文件。这个设计的价值在于:前端改的数据,AI 立刻能看到,不需要任何同步逻辑。


二、环境与版本

后端 NuGet 包(三个项目共用版本,避免还原冲突):

|
包
|
版本
|
用在哪

|
| --- | --- | --- |
|
ModelContextProtocol
|
2.2.0
|
MCP Server
|
|
SqlSugarCore
|
5.1.4.221
|
Shared(两个后端都用)
|
|
Microsoft.Data.Sqlite
|
10.0.13
|
Shared(SQLite 驱动)
|
|
Microsoft.Extensions.Hosting
|
10.0.13
|
MCP Server
|
|
Microsoft.AspNetCore.OpenApi
|
10.0.13
|
Web API
|

前端:react 19.2.8 / antd 6.6.6 / vite 8.3.0 / typescript 6.0.2 / axios 1.20.0。

SQLite 不需要单独装数据库服务,devicehub.db 这个文件就是数据库。


三、项目结构

关键点:DeviceQueryService(只读)和 DeviceHubService(可写)是刻意分开的。MCP Server 只注入前者,从代码层面保证 AI 改不了数据。等以后要开放写操作,再改注入后者,那时所有改动会自动落进操作日志。


四、三条命令跑起来

1. 起后端 API

成功会打两行:

首次启动会自动建表并灌入示例数据:3 个型号、5 台设备、16 个点位、9 条报警。想重灌就删掉 data/devicehub.db* 三个文件(含 -wal、-shm)再启动。

2. 起前端

打开 http://localhost:5173。

3. 验证 MCP Server(可选)

MCP Server 走 stdio,不是双击运行的,它由客户端(Claude Desktop / Cursor / 各类 Agent 框架)当子进程拉起:

它会停在等待 stdin 的状态——这是正常的。Ctrl+C 退出。

客户端配置指向编译产物:


五、五张表:为什么这么分

|
表
|
说明

|
| --- | --- |
|
device_model
|
型号字典。设备只引用字典里的型号,不允许自由填写
|
|
device
|
设备台账。编码、名称、型号、位置、状态、运行模式
|
|
point
|
点位(测点)。当前值、单位、上下限、采集地址、采集周期
|
|
alarm
|
报警流水。只增不改,恢复填 ClearedAt,确认填 IsAcknowledged
|
|
operation_log
|
操作日志。每次写操作自动追加,记录改动前后完整 JSON
|

三个设计决定值得说:

1. device 表把编号和名称拆成两个字段。 DeviceCode 是给系统用的稳定标识(M-003),DeviceName 是给人用的(3号机)。现场师傅嘴里说的永远是后者,而且设备改造后可能改名,所以 AI 查询要按名称模糊匹配,日志和关联要用编号。

2. point 表必须存上下限。 只有 Value 没有 LowerLimit/UpperLimit,AI 就只能念数字;有了上下限,它才能回答「正常吗」。这是从「能查数」到「能判断」的关键一步。

3. alarm 表只增不改。 报警是历史事实,恢复和确认都是补字段,不做物理删除。否则半年后想复盘「那天为什么停机」就没有原始记录了。

实体写法(以 Point 为例):

主键一律用 int,不要用 long——原因见第八节坑 ①。


六、双进程共享一个 SQLite:两个必做配置

这是整个项目最容易翻车的地方。

1. 用 SqlSugarScope,不要用 SqlSugarClient

SqlSugarClient 不是线程安全的。Web API 并发处理请求时,多个请求共用一个 Client 会出现数据串台(A 请求拿到 B 请求的结果)。SqlSugarScope 是官方为多线程准备的,内部按线程隔离。

注册成单例,不要每次 new。

2. 必须开 WAL 模式

两个进程(MCP Server + Web API)同时读写同一个 .db 文件,默认的 delete 日志模式下写操作会互相阻塞,直接抛 database is locked。WAL 允许多读一写并发,这个场景够用。

InitTables 是幂等的,每次启动都可以调,表已存在时只比对字段差异做增量变更,不会清空数据。

3. 数据库路径必须统一解析

这是双进程架构最容易掉的坑:MCP Server 和 Web API 是两个项目,各自的 bin 目录不同。如果直接用 AppContext.BaseDirectory 拼相对路径,会生成两个 .db 文件,你会以为「数据没同步」,实际是两个进程各写各的。

解决办法是从程序目录往上找到解决方案根目录:

两个进程都调这个方法,就一定指向同一个文件。部署到别的机器时用环境变量覆盖。


七、MCP Server 的三个关键写法

1. stdio 铁律:stdout 只能走协议

stdio 的通信通道就是标准输入输出。任何一句 Console.WriteLine 都会污染 JSON-RPC 消息流,客户端会报解析错误,而且报错位置离真正原因很远,极难排查。

所有日志必须重定向到 stderr:

2. 注册与工具发现

ServerInstructions 在握手时发给客户端,客户端会当成系统提示注入,对之后每次对话都生效。它和工具的 Description 分工不同:工具描述回答「这个工具是什么」,ServerInstructions 回答「什么时候必须用它、不许绕过它」。

注意它只在握手时发送一次,改完必须重启客户端才会重新下发。多数客户端只把前 512 个字符喂给模型,硬规则放最前面。

3. 工具写法:[Description] 不是注释

这段中文是模型决定调不调用这个工具的唯一依据。 写含糊了,模型就直接不调,然后自己编一个答案——这是「AI 答非所问」最常见的原因,比代码写错更致命。

所以每段描述必须回答三件事:

  1. 这个工具能做什么

  2. 什么情况下必须调它(用用户可能说出口的词写,如「正常吗」「什么情况」)

  3. 边界:查不到怎么办

第 3 条很多人会漏。模型遇到「查不到」非常容易直接回用户一句「系统里没有这台设备」,用户当场认为这个工具没用。

参数描述同理,hours 写成「用户说『今天』填 24,『这周』填 168」,比写「回溯小时数」有效得多。

4. UseStructuredContent = true 到底给什么

开了它,MCP 协议的返回会多两样东西:

  • tools/list 里多出 outputSchema——由返回类型自动推导的 JSON Schema,说明「这个工具返回什么结构」

  • tools/call 里多出 structuredContent——可以直接反序列化成对象的干净 JSON

不开的话 Tool.OutputSchema 就是 null。

但要注意一个和直觉相反的事实:content(给模型读的那份)在开与不开时内容完全一样,都是整个返回值序列化成的 JSON 字符串,中文还会被转义成 \uXXXX。开关的增量只有 outputSchema + structuredContent 这两样。


八、越限判断放服务端,别交给模型

这是我认为整个项目里最值钱的一个决定。

如果只返回 {"压力": 0.62},模型不知道 0.62 是好是坏——它没有工艺区间这个概念,最后要么瞎猜、要么反问、要么编一句「正常」。

所以在 DTO 转换时就把结论算好:

三个收益:

  • 模型不需要比大小,几乎不会算错

  • 规则集中在一个方法里,将来改(比如停机不判越限)只改一处,不用去改 prompt

  • 返回值里再附带一句人话摘要("3号机 · 压力 = 0.62 MPa(正常区间 0.5–0.8),当前正常"),模型直接引用就不会说错

模型擅长语言,不擅长你那套工艺规则。判断权别交给它。


九、设备名解析:把最高频的失败兜住

现场最常见的失败不是模型不会答,而是名字对不上——人说「三号机」,库里存的是「3号机」。

查不到时不返回错误,返回可用清单:

模型看到这句,下一轮就会自己改对重试。用户看到的是正确答案,而不是「查不到」。

只多写了十几行代码,但把最高频的失败场景从「失败」变成了「自动纠正」。


十、怎么验证 MCP Server 真的在干活

不用装任何客户端,直接用 stdio 喂它 JSON-RPC。MCP 就是拿标准输入当对话通道:

三条请求:握手 → 要工具清单 → 真正调一次。id=2 的回复里是 5 个工具的完整定义(含 outputSchema),id=3 的回复里是真实数据。

这个办法在排查「工具没被调用」「返回结构不对」时极其有用,比在客户端里猜快得多。


十一、这套东西能用在什么场景

它的定位不是「炫技 demo」,而是断网内网环境下的一份最小可运行骨架:

  • 全程不联网,不需要云服务,一台普通工控机就能跑

  • 数据落在本地 SQLite 文件里,可以直接拷走备份

  • MCP 是标准协议,工具写完,Claude Desktop / Cursor / 各类 Agent 框架都能直接接

  • AI 只读不写,从依赖注入那层就限制住了,不会误改现场数据

还没做的部分(也是下一步):写操作工具(要解决「AI 改了参数,操作日志记谁」)、离线打包(dotnet publish 单文件 + 配置外置)、登录与权限。


十三、代码

完整项目在 GitHub,仓库名 device-hub:包含 5 张表实体、5 个只读工具、Web API、React 前端,以及上面的所有踩坑记录。

如果这篇文章帮你省下了排查 MSB3026 或 AUTOINCREMENT 的那两个小时,欢迎在评论区说一声。有做现场的朋友想聊聊「AI 读实时数据」在产线上的实际接受度,也欢迎留言。

https://github.com/Dawn-Dong/DeviceHub.git

相关文章
|
1天前
|
人工智能 运维 搜索推荐
云上工程化EEAT:企业事实如何被AI优先引用
本文提出低门槛生成式AI落地路径:通过云上向量检索+模型服务,以GEO(知识图谱+RAG)实现企业权威事实工程化接入。聚焦信源标准化(4类字段)与检索加权,73%未标注企业可2周跑通,权威块召回率↑38%,AI引用概率↑210%,已验证90+案例。(239字)
|
1天前
|
人工智能 自然语言处理 安全
文旅GEO是什么意思:用大白话讲清AI搜索时代的生成式引擎优化
2026年,文旅行业的获客入口正在发生位移。游客在规划一趟旅行之前,越来越多地先向大模型提问,从"带老人去哪个城市更合适"到"这个古镇值不值得住两晚",答案的组织方式早已不是一列链接,而是一段被模型消化过的自然语言结论。传统SEO围绕关键词排名和点击率建立的那套逻辑,在问答式交互里被削弱:页面排上去,不等于被模型引用;被模型引用,也不等于品牌被正确理解。本文从GEO(生成式引擎优化)的概念讲起,用尽量通俗的方式拆解大模型"先检索、再生成"的底层机制,并梳理文旅企业可以参照的落地环节。
|
1天前
|
存储 人工智能 自然语言处理
阿里云万小智 AI 建站服务租用价格表(一年 / 按月 / 按小时报价明细)
万小智AI建站大幅降低建站门槛,无需服务器运维,依靠自然语言快速生成网站。短期项目适合月付订阅,长期企业官网优先年付套餐,根据访客地域选择内地或香港节点。预算测算时,除订阅费外,需要把灵感值资源包、域名、SSL证书等配套成本纳入整体预算,合理规划AI素材创作,避免不必要的资源消耗。
|
1天前
|
人工智能 自然语言处理 UED
官网GEO优化指南:从展示窗口到AI品牌认知中心
AI时代,官网已从“给人看”的展示窗口,升级为“给AI看”的知识中枢:作为AI理解品牌的首要信源与GEO优化基础设施,需沉淀结构化知识、部署语义标记、持续更新,打造可信、可读、可引用的品牌知识资产。(238字)
|
4天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1231 3
|
27天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9694 32
|
13天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
7天前
|
存储 人工智能 安全
千问办公官网入口网页版登录:qwenwork.cn 注册送2000积分、登录送100积分
阿里云千问办公(QwenWork)是AI智能工作平台,支持一句话生成PPT、表格、网页、视频及数据分析。个人免费版送2000积分+每日登录赠100分,含1GB存储、5个发布页;企业版198元/席/月起。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务