关于 SiLA 2 Bridge
SiLA 2 Bridge 是供 AI Agent 操作 SiLA 2 实验室设备和中间件的 MCP 服务。它读取服务器的 Feature Definitions,校验命令参数,并跟踪或取消长时间运行的命令。
主要功能
- 01通过 mDNS 发现 SiLA 2 服务器
- 02从 FDL 读取功能与类型约束
- 03发送前校验命令参数
- 04跟踪并取消可观测命令
- 05支持只读模式和命令允许列表
适用场景
- 01查看仪器的命令和属性
- 02运行并监控长时间仪器操作
- 03观察温度等属性变化
- 04查找本地网络中的 SiLA 2 服务器
MCP 相关
向 MCP 客户端提供服务器发现、功能与属性查询、命令执行、状态和结果查询、取消及连接管理工具。可用只读模式或允许列表限制命令。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx labmcp-sila2LABMCP_ADDRESSInstrument address, e.g. serial:///dev/ttyUSB0 or tcp://192.168.1.50:5025LABMCP_SIMULATESet to 1 to use the built-in simulator (no hardware)LABMCP_READ_ONLYSet to 1 to disable all state-changing toolsLABMCP_LIMITSSafety limit overrides, e.g. max_temperature_c=80本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
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/sSwitchOff
整个桥接器通过真实的 gRPC 和 FDL 流程运行。
连接 SiLA 服务
- 查找服务。 使用
discover_servers工具(mDNS_sila._tcp),或使用服务显示的地址和端口运行服务。SiLA 没有默认端口,但常用端口是 50052。 - TLS。 SiLA 2 服务默认使用 TLS,而且大多数服务会在启动时生成自签名证书。将该证书的 CA 作为
--option root_cert=ca.pem传入:许多服务会将其写入文件,或发布在发现记录中。以不安全测试模式启动的服务需要使用--option insecure=true。如需双向 TLS,请添加--option client_cert=… --option client_key=…。 - 测试连接:
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_s | 300 s | call_command 等待可观测命令时可能阻塞的最长时间 |
max_subscription_duration_s | 120 s | subscribe_property 收集数据的最长时间 |
max_discovery_s | 30 s | mDNS 发现扫描的最长时间 |
可在启动时覆盖,例如:--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;未给出偏移量时使用 UTCAny:{"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 服务(设备 / 软件) | 服务版本 | 接口 | 验证者 | 日期 |
|---|---|---|---|---|
| 暂无:抢先验证 |
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。