内容
# MCP 服务器 LIMS
本仓库托管了 MCP 服务器代码,该代码在以下 LinkedIn 文章的视频中演示。示例展示了Anthropic的Claude 调用 MCP 数据库和模拟仪器工具来执行实验室工作流程的步骤。该示例具有挑战性,因为它要求在多个步骤中管理和维护大量结构化数据。
[https://www.linkedin.com/pulse/ai-agent-lims-iot-mcp-tom-sheffler-ylmpc/](https://www.linkedin.com/pulse/ai-agent-lims-iot-mcp-tom-sheffler-ylmpc/)
## 简介
LIMS(实验室信息管理系统)示例的目标是让 AI 代理管理与一组样本相关的数据,这些样本在实验室工作流程中传递。
这里的合成工作流程是一个简化的实验室工作流程版本,但省略了许多细节。在工作流程中,物理样本在处理或分析它们的仪器之间传递。还存在与跟踪样本进入仪器和处理后相关的数据流。
下面的工作流程图呈现了一个示意图,说明了工作流程的步骤和必须管理的数据。数据被表示为一个表格,每个样本在每个步骤都有一个条目。

## 示例
工作流程从试管中样本的到达开始。有一定数量的试管。每个试管都有一个“样本名称”和相关的“质量”。将试管引入实验室的数据被输入到数据跟踪系统中。这一步骤称为“登记”。
现在,样本已在系统中注册,它们可以由第一个仪器处理。样本被加载到仪器中,样本数据也被发送到该仪器。然后仪器可以开始处理。第一个仪器称为“制备”仪器。它的输出由两部分组成。
1. 输出试管中的已制备样本
2. 关于每个样本及其制备方式的数据
在我们的模拟制备步骤中,每个样本都经过处理,以便在试管中为样本附加一个遗传标签(“actg”,“acac”等),并在输出数据中记录附加到每个样本的标签。(事先无法知道哪个标签附加到哪个样本。)还存在一个关于此步骤是否成功执行的“状态”字段,该字段可以为“通过”或“失败”。
已制备的样本然后准备好在“分析仪”仪器中处理。第一个仪器的输出样本被加载到第二个仪器中,每个样本的已知数据被发送到分析仪仪器。
分析仪仪器消耗物理样本并发出关于分析步骤中每个样本的数据。这里存在一个“文件名”和一个“指标”,用于衡量分析步骤中的某个量。
工作流程执行的最终输出应是一份报告,以易于理解的格式汇总各个步骤的数据。
## 模拟仪器
现实实验室仪器确实会处理数据输入和输出,以集合样本为单位,通过HL7或REST等协议。可以通过MCP(模型上下文协议)将现实仪器上的此类接口与AI代理集成作为“工具”。
在此模拟中,而不是调用现实仪器的API,工具会产生模拟结果。“标签”和“状态”值由制备仪器随机选择,分析仪仪器的“指标”也是如此。
在现实世界中,仪器的处理可能需要几分钟或几小时。在我们的模拟仪器中,我们通过每秒处理一个样本来记录时间的流逝。
## AI 代理和工具集成的挑战
在此示例中,我们要求AI代理计划在步骤序列中管理数据。AI代理可以使用数据库保存中间结果,并且它可能会发现使用SQL数据库有助于准备跨步骤的最终“连接”数据。代理还可能设计出一种替代的数据管理方法,或者简单地将其作为对话的一部分。
工作流程规范指示,只有“通过”的样本才由分析步骤处理。
我们还定义了具有丰富类型定义的接口的工具,表示仪器。每个仪器都接受一个结构数组并产生一个结构数组。下面是“preparation_tool”的MCP定义的示例。
定义中的一些值得注意的特征:
1. 在JSON的 `$defs` 部分中使用命名结构“InputSample”
2. 输入参数“sample_list”是一个数组
3. 数组是同质的,所有“项目”都是类型“#/$defs/InputSample”
在我们的测试中,到目前为止,许多LLM都能够管理满足这些模式要求的數據。
```
{
'tools': [{'function': {'description': 'Prepare the samples for analysis. '
"Mark samples as 'passed' or "
"'failed'. ",
'name': 'preparation_tool',
'parameters': {
'$defs': {
'InputSample': {
'properties': {
'mass': {
'description': 'sample mass in ng',
'title': 'Mass',
'type': 'integer'
},
'sample_name': {
'description': 'sample name identifier',
'title': 'Sample Name',
'type': 'string'
}
},
'required': ['sample_name', 'mass'],
'title': 'InputSample',
'type': 'object'
}
},
'properties': {
'sample_list': {
'items': {
'$ref': '#/$defs/InputSample'
},
'type': 'array'
}
},
'required': ['sample_list'],
'type': 'object'
}
},
'type': 'function'
}]}
```
## 需求
除了本仓库的 LIMS 服务器外,还应运行 Python 服务器“mcp-server-sqlite”,以便 AI 代理可以使用数据库。
源代码位于此处。
* https://github.com/modelcontextprotocol/servers/tree/main/src/sqlite
## 提示
第一个提示描述了工作流程的步骤以及通过执行工具执行每个步骤。由于工具的执行需要某些数据的可用性,因此代理需要确定如何获取或生成该数据。给代理的最终目标是生成一份工作流程报告,汇总所有步骤的数据。
下面显示了此第一个提示的开头。
```
助理的目标是管理与一组样本相关的数据。共有四个关注步骤。
- 登记 - 在数据库中输入初始样本
- 制备 - 调用工具处理输入样本以附加标签并监视“通过”或“失败”状态
- 分析 - 调用工具分析制备步骤的输出,其状态为“通过”
- 报告生成 - 显示前3个步骤的样本数据
...
```
### 适用于较小LLM的较小工具测试
第一个提示的复杂性超出了较小LLM的能力。第二个提示旨在仅仅测试LLM格式化和处理工具调用以及将表格数据转换为工具所需的结构数组的能力。
(下面的提示已证明对于检查具有丰富类型的工具接口的正确性很有用。)
```
使用 preparation_tool 处理以下数据表。
<table>
<tr>
<th>样本名称</th> <th>输入质量</th>
<tr>
<tr>
<td> NA12878 </td> <td> 45 </td>
</tr
<tr>
<td> NCC1701 </td> <td> 77 </td>
</tr
<tr>
<td> NACL </td> <td> 12 </td>
</tr
<tr>
<td> NA12879 </td> <td> 32 </td>
</tr
</table>
```
## 如何构建和运行
确保已安装 `uv`。
$ git clone https://github.com/sheffler/mcp-server-lims
$ cd mcp-server-lims
$ uv init
$ uv venv
$ . .venv/bin/activate
$ uv sync
此时,MCP服务器SDK的依赖项应已安装在venv中。
### Claude Desktop 配置
通过编辑以下文件配置Claude Desktop
* ~/Library/Application Support/Claude/claude_desktop_config.json
```
{
"mcpServers": {
"mcp-lims-server" : {
"command": "/Users/sheffler/git/mcp-server-lims/.venv/bin/python",
"args": [
"/Users/sheffler/git/mcp-server-lims/lims_server.py"
]
},
"sqlite": {
"command": "/Users/sheffler/.local/bin/uvx",
"args": [
"mcp-server-sqlite",
"--db-path",
"/Users/sheffler/test.db"
]
},
}
}
```
## Oterm 配置
~/Library/Application Support/oterm/config.json
```
{"theme": "textual-dark",
"splash-screen": false,
"mcpServers": {
"mcp-lims-server" : {
"command": "/Users/sheffler/git/mcp-server-lims/.venv/bin/python",
"args": [
"/Users/sheffler/git/mcp-server-lims/lims_server.py"
]
},
"sqlite": {
"command": "/Users/sheffler/.local/bin/uvx",
"args": [
"mcp-server-sqlite",
"--db-path",
"/Users/sheffler/test.db"
]
},
}
}
```
## Claude 生成的工作流程报告
下面显示了由Claude(使用Claude Desktop)生成的示例输出报告。

## 转录记录
为了参考,包含与Claude的对话转录记录。
* [./lims-claude-transcript.docx](./lims-claude-transcript.docx)
* [./lims-claude-transcript.pdf](./lims-claude-transcript.pdf)