MCP SERVER LIMS について
MCP SERVER LIMS は、実験室のワークフローでサンプルデータを管理する MCP サーバーの例です。複数工程を調整する AI エージェント向けに、模擬装置ツールとデータベースを使い、サンプル登録から結果の集計までを扱います。
主な機能
- 01サンプルデータの登録と追跡
- 02サンプル調製装置のシミュレーション
- 03分析と結果出力のシミュレーション
- 04構造化配列による入出力
- 05工程をまたいだサンプル情報の集計
活用シーン
- 01サンプル登録から分析までの実験フローの検証
- 02調製に合格したサンプルだけを分析に送る
- 03構造化されたツールデータの処理をテスト
- 04複数工程をまとめたワークフローレポートの生成
MCP 対応
実験室のサンプルワークフロー向けに、データベースと模擬装置のツールを MCP クライアントに公開します。中間データの保存には mcp-server-sqlite も必要です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP SERVER LIMS
このリポジトリには、以下の LinkedIn 記事の動画で紹介された MCP Server のコードが格納されています。この例では、Anthropic の Claude が MCP のデータベースツールとシミュレーション機器ツールを呼び出し、ラボのワークフローを実行する手順を示しています。複数のステップにわたって、構造が複雑なデータの集合を管理する必要があるため、難易度の高い例となっています。
https://www.linkedin.com/pulse/ai-agent-lims-iot-mcp-tom-sheffler-ylmpc/
はじめに
LIMS(Laboratory Information Management System)の例では、サンプルの集合がラボのワークフローを進む際に関連するデータを AI エージェントが管理することを目指します。
ここでの架空のワークフローは、ラボで見られるようなものを簡略化し、多くの詳細を省略したものです。このワークフローでは、サンプルを処理または分析する機器の間で、物理サンプルを受け渡します。また、サンプルが機器に入るときと処理後に追跡するためのデータフローもあります。
以下のワークフロー図は、ワークフローの手順と管理が必要なデータを示す概略図です。データは、各ステップにおける各サンプルのエントリーを含む表として示されています。

例
ワークフローは、チューブに入ったサンプルの到着から始まります。チューブは複数あります。それぞれに「サンプル名」と対応する「質量」があります。ラボにチューブを導入したときのデータは、データ追跡システムに入力されます。この手順は「受入登録」と呼ばれます。
サンプルがシステムに登録されると、最初の機器で処理できます。サンプルを機器にロードし、サンプルに関するデータも機器に送信します。その後、機器で処理を開始できます。この最初の機器は「調製」機器と呼ばれます。その出力は次の 2 つです。
- 出力チューブの集合に入った調製済みサンプル
- 各サンプルとその調製方法に関するデータ
シミュレーションによる調製ステップでは、各サンプルを処理し、チューブ内のサンプルに遺伝子タグ(「actg」、「acac」など)を付けます。各サンプルに付けられたタグは出力データに記録されます。(どのサンプルにどのタグが付くかを事前に知る方法はありません。)また、このステップが正常に実行されたかどうかも「status」フィールドに記録され、「passed」または「failed」の値が入ります。
調製済みサンプルは、「分析」機器で処理する準備が整います。最初の機器の出力サンプルを 2 台目の機器にロードし、各サンプルについて既知のデータを分析機器に送信します。
分析機器は物理サンプルを消費し、分析した各サンプルに関するデータを出力します。ここでは、「filename」と、分析ステップの測定量を示す「metric」があります。
ワークフロー実行の最終出力は、各ステップにわたる情報をわかりやすい形式でまとめたレポートである必要があります。
シミュレーション機器
実際のラボ機器では、HL7 や REST などのプロトコルを介して、サンプルの集合についてデータの入力と出力を処理します。実際の機器に搭載されたこのようなインターフェースを、MCP(Model Context Protocol)を使った「ツール」として AI エージェントと連携できる可能性があります。
このシミュレーションでは、実際の機器の API を呼び出す代わりに、ここでのツールがシミュレーション結果を生成します。調製機器の「tag」と「status」の値、および分析機器の「metric」の値はランダムに選択されます。
現実の機器では、処理に数分から数時間かかることがあります。シミュレーション機器では、1 秒につき 1 サンプルを処理することで時間の経過を表します。
AI エージェントとツールの統合における課題
この例では、複数の手順にわたるデータ管理の計画を AI エージェントに依頼します。AI エージェントは、中間結果の保存にデータベースを使用する場合があります。また、各手順のデータを最終的に「結合」するために、SQL データベースが役立つと判断することもあります。エージェントは別のデータ管理方法を考案する場合もあれば、単に会話の一部として扱う場合もあります。
ワークフローの仕様では、「合格」したサンプルのみを分析手順で処理するよう指示しています。
また、豊富な型定義を備えたインターフェースを持つ、機器を表すツールも定義しています。各機器は構造体の配列を受け取り、構造体の配列を生成します。「preparation_tool」の MCP 定義の例を以下に示します。
JSON Schema 定義の主な特徴は次のとおりです。
- JSON の「$defs」節で名前付き構造体「InputSample」を使用していること
- 入力パラメーター「sample_list」が配列であること
- 配列の項目がすべて「#/$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 Server に加えて、AI エージェントがデータベースを利用できるよう、Python サーバー「mcp-server-sqlite」も実行しておく必要があります。
ソースコードはこちらにあります。
プロンプト
最初のプロンプトでは、ワークフローの各手順と、ツールを実行して各手順をどのように実施するかを説明します。ツールの実行には特定のデータが必要なため、エージェントはそのデータをどのように取得または生成するかを判断する必要があります。エージェントに与えられる最終目標は、すべての手順にわたるデータを要約したワークフローレポートの作成です。
この最初のプロンプトの冒頭を以下に示します。
The assistant's goal is to manage the data associated with a set of samples. There are four steps of concern.
- accessioning - entering the initial samples in the database
- preparation - calling a tool to process the input samples to attach a tag and monitor a "passed" or "failed" status
- analysis - calling a tool to analyze the outputs of the preparation step whose status is "passed"
- report generation - displaying the sample data across the first 3 steps
...
小規模 LLM 向けの簡易ツールテスト
最初のプロンプトは複雑であり、小規模な LLM では対応できません。2 つ目のプロンプトは、ツール呼び出しの形式を整え、表形式のデータをツールに必要な構造体の配列に変換する LLM の能力を試すことだけを目的としています。
(以下に示すプロンプトは、豊富な型を持つツールインターフェースの正確性を検証するのに役立つことがわかっています。)
Process the following table of data with the preparation_tool.
<table>
<tr>
<th>Sample Name</th> <th>Input Mass</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 との会話記録を収録しています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。