systemlink-mcp
systemlink-mcp
一个 MCP 服务器,通过测试与测量原生的工具将 NI SystemLink 暴露给 AI 客户端:按产品版本统计的良率、失效 DUT 步骤与规格限值的对比、测量迹线摘要,以及校准到期资产。
这是 daq-mcp 的机群/数据层配套项目。daq-mcp 与单个 DAQ 设备通信。systemlink-mcp 则跨实验室查询并关联结果、资产和系统。
这是一个由单人维护的个人项目。它不是 NI 产品,与 NI / Emerson 无关联、未获其认可,也不受其支持。
为什么用测试领域工具而不是通用包装器
商业中间件目录可以把 SystemLink 列在数千个工业系统之中,然后暴露出一套 CMMS/ERP 形态的界面:工单、站点、空间、销售订单。这种抽象无法回答测试工程师真正会问的问题:
本季度产品版本 B 的通过/失败率
失效 DUT 上哪个测量值超出了限值
哪个 PXI 模块已超过校准到期日
这里的每个工具都围绕这些问题来设计。响应是摘要加有界预览,而不是原始的 Test Monitor 或 DataFrame 负载。即使 API 调用本身正确,把数千行结果或 2000 点的波形倾倒进模型上下文也会让服务器无法使用。
Related MCP server: Auto-Manager MCP
默认只读
变更类工具(update_result_properties、execute_notebook)在未设置 SYSTEMLINK_MCP_ALLOW_WRITE=1 时会拒绝执行。读取类工具无需额外标志即可工作。
当前的 nisystemlink-clients AssetManagementClient 提供创建、查询、删除、文件链接和利用率方法,但没有资产更新方法。因此,受门控的写入面更新 Test Monitor 结果元数据,并将笔记本执行加入队列,而不是更新资产记录。
技术栈
Python 3.11+、uv、FastMCP(stdio 或 Streamable HTTP)、Pydantic v2,以及官方的 nisystemlink-clients 包。工具从不导入 SDK;它们调用 SystemLinkBackend。设置 SYSTEMLINK_MCP_SIMULATE=1 即可使用一个不需要 SystemLink 服务器的纯 Python 假实现。
快速开始(无需 SystemLink 服务器)
uv sync
SYSTEMLINK_MCP_SIMULATE=1 uv run server.pyPowerShell:
$env:SYSTEMLINK_MCP_SIMULATE="1"; uv run server.py真实的 SystemLink
模拟后端仅在 SYSTEMLINK_MCP_SIMULATE=1 时使用,或者当实时连接失败且未设置 SYSTEMLINK_MCP_REQUIRE_REAL 时使用。实时响应包含 "backend": "systemlink" 和 "simulated": false。
在 SystemLink 中创建 API 密钥(Enterprise:先创建策略,再创建 API 密钥;SDK 发送的 HTTP 头是
x-ni-api-key)。SLE 不接受用户名和密码进行编程访问。将
.env.example复制为.env(已被 gitignore)并设置:
SYSTEMLINK_SERVER_URI=https://your-systemlink-host
SYSTEMLINK_API_KEY=...
SYSTEMLINK_MCP_REQUIRE_REAL=1保持 SYSTEMLINK_MCP_SIMULATE 不设置。仍允许基本认证的本地 SystemLink Server 可以使用 SYSTEMLINK_USERNAME / SYSTEMLINK_PASSWORD 代替密钥。SystemLink Cloud 可以单独使用 API 密钥(无需 URI);后端随后会构造 CloudHttpConfiguration。
在启动 MCP 之前先探测,这样登录失败就不会悄悄变成假机群:
uv run server.py --probe你应该会看到来自服务器的 "simulated": false 和一段简短的 query_systems 预览。然后在不带 simulate 标志的情况下启动 MCP,或者让 Cursor 指向 .cursor/mcp.json.live.example。
如果 --probe 失败,JSON 错误来自 SDK(ApiException / 连接),而不是来自模拟数据。
工具
工具 | 访问权限 | 回答的问题 |
| 读取 | 通过/失败良率,可选按部件、程序或序列号分组 |
| 读取 | 过滤后的结果计数,外加有界的近期预览 |
| 读取 | 单个结果的失败步骤,含测量值与限值对比 |
| 读取 | 表格统计,外加降采样迹线(在实时 API 上抽取) |
| 读取 | 已过或即将到达校准期的资产 |
| 读取 | 库存清单,含在位状态和校准状态 |
| 读取 | 已注册系统及连接健康状态 |
| 读取 | 产品 / 部件号 / 系列 |
| 读取 | 产品的规格限值 |
| 读取 | 结果或资产的文件元数据(不含内容) |
| 受控写入 | 测试结果上的关键字/属性 |
| 受控写入 | 排队执行 Jupyter 笔记本 |
MCP Inspector
在仓库根目录下,强制启用模拟:
SYSTEMLINK_MCP_SIMULATE=1 npx -y @modelcontextprotocol/inspector uv run server.pyPowerShell:
$env:SYSTEMLINK_MCP_SIMULATE="1"
npx -y @modelcontextprotocol/inspector uv run server.py打开打印出的 URL(通常是 http://127.0.0.1:6274)。确认十二个工具出现,然后以 group_by=part_number 调用 summarize_yield。
使用 Streamable HTTP 代替 stdio:
SYSTEMLINK_MCP_SIMULATE=1 uv run server.py --httpMCP 端点是 http://127.0.0.1:8000/mcp。不要使用 transport="sse";该传输方式已弃用。
Cursor
使用 .cursor/mcp.json.example(模拟器)或 .cursor/mcp.json.live.example(真实服务器)。机器本地的 .cursor/mcp.json 已被 gitignore。
{
"mcpServers": {
"systemlink-mcp": {
"command": "uv",
"args": [
"run",
"--directory",
"C:/Users/folayaod/personal/systemlink-mcp",
"server.py"
],
"env": {
"SYSTEMLINK_MCP_SIMULATE": "1"
}
}
}
}Claude Desktop
在 claude_desktop_config.json 中使用相同的 JSON 块:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
保存后重启 Claude Desktop。
用于演练模拟机群的提示词
“部件号 PN-5164-B 与其他版本分组对比的通过/失败良率是多少?”
“DUT-1001 在 BoardFunctional.seq 中失败。哪个步骤失败了?Gain 与其限值相比如何?请总结附带的测量迹线。”
“哪些 PXI 资产已逾期或即将到达校准期?PXI Rack 1 是否已连接?”
测试
SYSTEMLINK_MCP_SIMULATE=1 uv run pytest测试只访问模拟后端。它们不会打开到 SystemLink 的网络连接。
状态
个人项目,单人维护。模拟后端是日常受支持的路径。真实后端是针对 python-docs.systemlink.io 中记录的 nisystemlink-clients 2.32.x API 以及 ni/nisystemlink-clients-python 源码编写的。它尚未在本仓库的 CI 中针对真实的 SystemLink Enterprise 实例运行过。用于校准状态的资产 Dynamic LINQ 属性名遵循官方 AssetIdentifier 示例的 PascalCase 风格;如果真实服务器拒绝该过滤器,这是 DEVLOG.md 中记录的一个已知集成风险。
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceExposes enterprise KPIs, health scores, forecasting, and anomaly detection as MCP tools, resources, and prompts for use by any MCP-compatible agent.2AGPL 3.0
- AlicenseNot gradedqualityCmaintenanceEnables natural language analysis of mechanical test data files (CSV, TDMS, MDF) by providing tools for channel statistics, spectrum analysis, rainflow fatigue counting, thermal state detection, and report generation.MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to analyze plant-floor data using OEE, Pareto, SPC, and yield-loss calculations, providing continuous-improvement insights from manufacturing data.1
- FlicenseNot gradedqualityCmaintenanceExposes product analytics metrics from an internal data warehouse via MCP, enabling agents to query metrics, product summaries, and event breakdowns.
Related MCP Connectors
A paid remote MCP for AI SDK data query MCP, built to return verdicts, receipts, usage logs, and aud
A paid remote MCP for AI SDK benchmark dashboard, built to return verdicts, receipts, usage logs, an
A paid remote MCP for AI SDK eval dashboard, built to return verdicts, receipts, usage logs, and aud
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rhit-folayaod/systemlink-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server