mcpField
S
SiLA 2 Bridge

SiLA 2 Bridge

本地服务
github.com科研与教育235 周前更新

关于 SiLA 2 Bridge

SiLA 2 Bridge 是供 AI Agent 操作 SiLA 2 实验室设备和中间件的 MCP 服务。它读取服务器的 Feature Definitions,校验命令参数,并跟踪或取消长时间运行的命令。

主要功能

  1. 01通过 mDNS 发现 SiLA 2 服务器
  2. 02从 FDL 读取功能与类型约束
  3. 03发送前校验命令参数
  4. 04跟踪并取消可观测命令
  5. 05支持只读模式和命令允许列表

适用场景

  1. 01查看仪器的命令和属性
  2. 02运行并监控长时间仪器操作
  3. 03观察温度等属性变化
  4. 04查找本地网络中的 SiLA 2 服务器

MCP 相关

向 MCP 客户端提供服务器发现、功能与属性查询、命令执行、状态和结果查询、取消及连接管理工具。可用只读模式或允许列表限制命令。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"k-dense-ai-labmcp-sila2": {
"command": "uvx",
"args": [
"labmcp-sila2"
],
"env": {
"LABMCP_ADDRESS": "<LABMCP_ADDRESS>",
"LABMCP_SIMULATE": "<LABMCP_SIMULATE>",
"LABMCP_READ_ONLY": "<LABMCP_READ_ONLY>",
"LABMCP_LIMITS": "<LABMCP_LIMITS>"
}
}
}
}
启动命令uvx labmcp-sila2
需要配置的环境变量
LABMCP_ADDRESSInstrument address, e.g. serial:///dev/ttyUSB0 or tcp://192.168.1.50:5025
LABMCP_SIMULATESet to 1 to use the built-in simulator (no hardware)
LABMCP_READ_ONLYSet to 1 to disable all state-changing tools
LABMCP_LIMITSSafety limit overrides, e.g. max_temperature_c=80

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypilabmcp-sila20.1.2

工具

13

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

SiLA 2 桥接器 — MCP 服务

让 AI Agent 使用任何 SiLA 2 服务:液体处理仪、培养箱、酶标仪、机械臂、天平或调度中间件,只要它们实现了开放的 SiLA 2 实验室自动化标准即可。桥接器会读取服务自身的 Feature Definitions(FDL),因此能了解每条命令、属性、参数类型、单位和约束。它会在发送前根据 FDL 验证参数、运行并跟踪长时间运行(可观测)的命令,还会通过 SiLA 的 CancelController 取消这些命令。

软件包labmcp-sila2
仪器任何 SiLA 2 服务:具有 SiLA 2 接口的设备和中间件,以及使用 sila_python、sila_java、sila_csharp 或 sila_cpp 构建的服务
接口以太网:通过 TLS 使用 HTTP/2 的 gRPC(或不安全的测试服务),mDNS 服务发现
协议SiLA 2 v1.x(Part A 和 Part B 规范、FDL 架构和核心功能、客户端库 sila2(文档))
状态🧪 模拟:已针对真实的进程内 SiLA 2 服务(sila2 库,运行于 localhost 的 gRPC)进行测试,尚未通过供应商服务验证。报告硬件测试

无需硬件即可试用

uvx labmcp-sila2 --simulate --check

--simulate 会在进程内启动一个使用 sila2 库构建的真实 SiLA 2 服务。它会在 127.0.0.1 上使用一个空闲端口运行,不加密,并关闭发现功能。它实现了一个模拟的热模块功能(org.labmcp/simulation/TemperatureController/v1)和官方的 CancelController 功能:

  • 可观测的 CurrentTemperature 属性,以及 TargetTemperature、RampRate 和 DeviceState
  • ControlTemperature:具有进度、中间响应和 DeviceBusy 定义错误的可观测命令
  • RunProgram:接收一个 {TargetTemperature, HoldTime} 结构列表
  • SetRampRate:约束为 0 < rate ≤ 10 K/s
  • SwitchOff

整个桥接器通过真实的 gRPC 和 FDL 流程运行。

连接 SiLA 服务

  1. 查找服务。 使用 discover_servers 工具(mDNS _sila._tcp),或使用服务显示的地址和端口运行服务。SiLA 没有默认端口,但常用端口是 50052。
  2. TLS。 SiLA 2 服务默认使用 TLS,而且大多数服务会在启动时生成自签名证书。将该证书的 CA 作为 --option root_cert=ca.pem 传入:许多服务会将其写入文件,或发布在发现记录中。以不安全测试模式启动的服务需要使用 --option insecure=true。如需双向 TLS,请添加 --option client_cert=… --option client_key=…。
  3. 测试连接:
    uvx labmcp-sila2 --address 192.168.1.40:50052 --option root_cert=~/sila/ca.pem --check
    uvx labmcp-sila2 --address sila://localhost:50052 --option insecure=true --check      # test server
    uvx labmcp-sila2 --option server_name="Liquid Handler 1" --option root_cert=ca.pem --check  # via discovery
    

添加到 MCP 客户端

Claude Code

claude mcp add sila -- uvx labmcp-sila2 --address 192.168.1.40:50052 --option root_cert=/path/ca.pem

Claude Desktop / Cursor / Windsurf(claude_desktop_config.json、.cursor/mcp.json 等)

{
  "mcpServers": {
    "sila": {
      "command": "uvx",
      "args": ["labmcp-sila2", "--address", "192.168.1.40:50052", "--option", "root_cert=/path/ca.pem",
               "--option", "command_allowlist=Incubator.*,PlateReader.ReadPlate"]
    }
  }
}

--read-only 允许 Agent 浏览功能、读取并订阅属性,以及查看命令状态,但不能调用命令。cancel_command 仍可用。如需限制可运行的命令,请使用 --option command_allowlist=Feature.Command,Feature.*。条目也可以用 ; 或空格分隔,这在 LABMCP_OPTIONS=command_allowlist=A.B;C.* 中很方便。

工具

工具类型描述
call_command⚠️ 危险运行 SiLA 命令。这可能会实际操控设备(移动、分液、加热、摇晃、开门):请先告知用户将发生什么。发送任何内容前,都会根据 Feature Definition 验证参数;如果设置了允许列表,命令必须在列表中。不可观测的命令会返回其响应;可观测的命令会返回 execution_id。
cancel_command🛑 安全通过 SiLA 的 CancelController 功能取消正在运行的可观测命令,或取消所有命令。始终可用(即使是只读模式)。如果服务没有 CancelController,此工具会说明情况,并指出设备自身的停止命令。
discover_servers👁 读取使用 SiLA Server Discovery(mDNS _sila._tcp)查找本地网络上的 SiLA 2 服务。列出每个服务的名称、UUID、地址和端口,但不会连接。无需配置服务。
get_command_log👁 读取返回最近发送给仪器的原始命令和收到的回复(最新记录在最后)。适用于调试和记录已执行的操作。
get_command_result👁 读取返回已完成的可观测命令的响应,或其完成时产生的 SiLA 执行错误。如果命令仍在运行,则会显示清晰的错误消息。
get_command_status👁 读取返回使用 call_command 启动的可观测命令的状态:waiting / running / finishedSuccessfully / finishedWithError、进度、预计剩余时间,以及最新的中间响应。
get_connection_info👁 读取报告当前连接的仪器(身份、地址、模拟或真实)、服务是否为只读模式,以及生效的安全限制。请先调用此工具。
get_property👁 读取读取 SiLA 属性的当前值(对于可观测属性,读取订阅的第一个值)。
get_server_info👁 读取识别已连接的 SiLA 服务(名称、类型、UUID、版本、供应商、描述),列出其功能,并说明命令是否可以取消,以及此桥接可调用哪些命令。
list_executions👁 读取列出本次会话中启动的所有可观测命令执行及其状态,最新记录在最后。
list_features👁 读取根据 Feature Definition 描述服务的功能:列出每个命令(是否可观测、参数、响应、中间响应、定义的错误,以及允许列表是否允许调用该命令)和每个属性;类型以类似 JSON Schema 的字典形式呈现,并包含单位和约束。
reconnect🛑 安全关闭并重新打开与仪器的连接(例如,仪器断电重启或重新插接线缆后)。
subscribe_property👁 读取收集属性在 duration_s 秒内的值(对可观测属性使用 SiLA 订阅,否则进行轮询),并汇总这些值(例如,观察温度趋于稳定)。

安全限制

限制默认值含义
max_command_wait_s300 scall_command 等待可观测命令时可能阻塞的最长时间
max_subscription_duration_s120 ssubscribe_property 收集数据的最长时间
max_discovery_s30 smDNS 发现扫描的最长时间

可在启动时覆盖,例如:--limit max_command_wait_s=60。命令的主要防护措施:

防护措施方式
危险操作注释call_command 被标记为具有破坏性,因此 MCP 客户端会在运行前询问
允许列表--option command_allowlist=Feature.Command,...:其他命令会在发送任何内容前被拒绝,并且 list_features 会将这些命令显示为 callable: false
FDL 验证参数名称必须完全匹配。发送前会根据服务器的 FDL 检查类型、范围(最小值/最大值,含边界或不含边界)、集合、长度、模式、元素数量、完全限定标识符和结构字段
只读模式--read-only 会隐藏 call_command
取消如果服务器实现了 CancelController.CancelCommand / CancelAll 功能,cancel_command(SAFETY)会使用该功能;否则会说明这一点,并指向设备自身的停止命令
截止时间不可观测命令和属性读取会在 call_timeout_s(默认 30 s,最多 300 s)后超时,而不会一直挂起;对于超时读取而打开的订阅会被取消;服务器在截止时间后仍接受的可观测命令仍会出现在 list_executions 中,因此可以取消

服务器也会始终重新验证,因此被服务器拒绝的参数会以 SiLA 验证错误的形式返回。

示例提示词

  • “网络上有哪些 SiLA 服务器,培养箱能做什么?”
  • “将培养箱设为 37 °C,并在达到该温度时告诉我。”
  • “监测酶标仪的腔室温度一分钟,并告诉我温度是否稳定。”
  • “在热循环仪上运行‘PCR-short’程序,每 30 秒轮询一次进度,并报告结果。”
  • “出问题了,取消液体处理器上正在运行的所有任务。”
  • “显示机器人 MovePlate 命令的参数(类型、单位和允许范围)。”

说明

  • 将类型表示为 JSON。 list_features 会将每种 SiLA 类型呈现为类似 JSON Schema 的字典:Real 变为 number,Integer 变为 integer,List 变为 array,Structure 变为 object。SiLA 单位会以 x-unit(标签)和 x-unit-si(转换为 SI 基本单位的换算方式,SI = value × factor + offset)表示。其他 SiLA 详情使用 x-sila-* 键。值以 JSON 格式传递:
    • Binary:base64 字符串
    • Date:YYYY-MM-DD[±HH:MM]
    • Time:HH:MM:SS[±HH:MM]
    • Timestamp:ISO 8601;未给出偏移量时使用 UTC
    • Any:{"type": "Real", "value": 1.5},仅支持基本类型
  • 可观测命令会立即返回 execution_id。get_command_status 会报告 SiLA 执行状态(waiting、running、finishedSuccessfully、finishedWithError)、进度、预计剩余时间和最新的中间响应。get_command_result 会返回响应,或返回已定义/未定义的执行错误以及 FDL 中的错误描述。对于短时间运行的命令,可在 call_command 中传入 wait_s。执行记录仅在当前会话中跟踪,并会在 reconnect 时清除。
  • 取消操作并非 SiLA 核心功能的一部分。 这需要服务实现 org.silastandard/core.commands/CancelController/v1;get_server_info 会报告服务是否支持该功能。有些供应商提供自己的 Stop/Abort 命令,list_features 会显示这些命令。
  • SiLA 客户端元数据(例如 LockController 锁标识符或 AuthorizationService 访问令牌)可通过 call_command、get_property 和 subscribe_property 中的 metadata={"LockController.LockIdentifier": "…"} 传入。值会根据元数据的 FDL 类型进行验证。
  • 特征定义仅在拒绝任何 DOCTYPE/实体声明后才会解析(SiLA FDL 从不使用这些声明),因此恶意服务无法触发 XML 实体扩展。sila2 库判定为无效的特征会从 list_features 中省略(命令日志会记录原因)。
  • 本地不会检查: Schema 和 ContentType 约束,以及仅供参考的 Unit 约束。这些由服务强制执行。超过 2 MB 的大型二进制数据会使用 SiLA 二进制传输,由 sila2 库处理。
  • 库的限制(sila2 ≤ 0.14): 直接用作命令参数或响应的 Constrained List 无法解包。对于使用 sila2 构建的服务,参数会受到影响,因此模拟器的 RunProgram 使用普通列表,并自行检查步骤数是否为 1–10。此桥接也会受到这类响应的影响:服务会执行命令,但无法解码其响应。桥接会将此情况报告为 “已执行……无法解码”,以免盲目重复执行命令。这类属性可以正常解码。普通(不受约束的)列表不受影响。
  • 发现会在指定时间内浏览 mDNS,并返回服务所通告的信息(UUID、名称、版本、地址、是否发布了 CA 证书),但不会连接这些服务。在 --simulate 模式下,只会返回模拟服务,且不会向网络发送任何内容。

硬件验证

SiLA 服务(设备 / 软件)服务版本接口验证者日期
暂无:抢先验证

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。