# ASTM LIS Analyzer Receiver

Collects results from clinical and lab analyzers over ASTM E1381/E1394 and lets an agent look them up by sample, patient, test or time.

- MCP server · `type=mcp` · Claude Code, Codex, Cursor, GitHub Copilot, Windsurf (Devin Desktop), Cline, Zed, Gemini CLI · ★ 23
- Author: K-Dense-AI
- License: Apache-2.0 · policy=link-only · description only; the file stays with the author
- Source: https://github.com/K-Dense-AI/lab-instrument-mcps/tree/HEAD/servers/health/astm-lis-analyzer
- Updated: 2026-09-26
- HTML: https://affpapa.org/en/nevibecode/mcp/astm-lis-analyzer-receiver

## What it does

The server runs a receive-only LIS endpoint on your machine. It answers the analyzer's frames, checks checksums and stitches multi-frame messages back together. Your agent then queries the tools to pull results by sample ID, patient ID, test code, arrival time or abnormal flag. Host queries and order downloads are out of scope — this side only listens.

Three link types are supported: RS-232 via `serial://`, TCP with the analyzer as the server, and TCP with this server listening (`--option listen_port=5000`). On the instrument, switch on the ASTM protocol and automatic result upload, and turn off host query or order request mode. Leave bidirectional mode on and the analyzer sits waiting for a reply it will never get, then times out before running samples. To test the whole path without hardware, run `uvx labmcp-astm-lis --simulate --check`.

This is not a medical device and not a validated LIS. Results travel through an AI agent that can misread them, so they must not be used to release reports or make clinical decisions — that stays with your validated LIS and release process. Patient identifiers are masked by default; change that only if your institution's privacy rules allow it.

## Requirements
- Needs: Python and uv (commands run via uvx)
- Environment variables: `LABMCP_ADDRESS`, `LABMCP_SIMULATE`, `LABMCP_READ_ONLY`, `LABMCP_LIMITS` — keys and tokens: ask the human for the values, never commit them or put them in shared files.

## Install

### Claude Code (native platform)

**Platform CLI**
```bash
claude mcp add --env LABMCP_ADDRESS=<LABMCP_ADDRESS> --env LABMCP_SIMULATE=<LABMCP_SIMULATE> --env LABMCP_READ_ONLY=<LABMCP_READ_ONLY> --env LABMCP_LIMITS=<LABMCP_LIMITS> --transport stdio astm-lis-analyzer -- uvx labmcp-astm-lis
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from labmcp-astm-lis <command>

### Codex

**Platform CLI**
```bash
codex mcp add astm-lis-analyzer --env LABMCP_ADDRESS=<LABMCP_ADDRESS> --env LABMCP_SIMULATE=<LABMCP_SIMULATE> --env LABMCP_READ_ONLY=<LABMCP_READ_ONLY> --env LABMCP_LIMITS=<LABMCP_LIMITS> -- uvx labmcp-astm-lis
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from labmcp-astm-lis <command>

### Cursor

**Config file**
File `.cursor/mcp.json`:
```json
{
    "mcpServers": {
        "astm-lis-analyzer": {
            "command": "uvx",
            "args": [
                "labmcp-astm-lis"
            ],
            "env": {
                "LABMCP_ADDRESS": "<LABMCP_ADDRESS>",
                "LABMCP_SIMULATE": "<LABMCP_SIMULATE>",
                "LABMCP_READ_ONLY": "<LABMCP_READ_ONLY>",
                "LABMCP_LIMITS": "<LABMCP_LIMITS>"
            }
        }
    }
}
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from labmcp-astm-lis <command>

### GitHub Copilot

**Config file**
File `.vscode/mcp.json`:
```json
{
    "servers": {
        "astm-lis-analyzer": {
            "type": "stdio",
            "command": "uvx",
            "args": [
                "labmcp-astm-lis"
            ],
            "env": {
                "LABMCP_ADDRESS": "<LABMCP_ADDRESS>",
                "LABMCP_SIMULATE": "<LABMCP_SIMULATE>",
                "LABMCP_READ_ONLY": "<LABMCP_READ_ONLY>",
                "LABMCP_LIMITS": "<LABMCP_LIMITS>"
            }
        }
    }
}
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from labmcp-astm-lis <command>

### Gemini CLI

**Platform CLI**
```bash
gemini mcp add -e LABMCP_ADDRESS=<LABMCP_ADDRESS> -e LABMCP_SIMULATE=<LABMCP_SIMULATE> -e LABMCP_READ_ONLY=<LABMCP_READ_ONLY> -e LABMCP_LIMITS=<LABMCP_LIMITS> astm-lis-analyzer uvx labmcp-astm-lis
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from labmcp-astm-lis <command>

## When to use it
- pull results off a hematology analyzer over RS-232
- find every result for one sample ID within a shift
- filter out runs with flagged abnormal values
- inspect raw ASTM frames when the link misbehaves
- keep a local log of incoming messages for later review

## Example prompts
- Show me the results that arrived from the analyzer in the last hour
- Find the results for sample `S-1042` and show their comments
- Report the analyzer link state and the link-layer error counters

## Similar
- [FSharp.Refactor](https://affpapa.org/en/nevibecode/mcp/fsharprefactor.md) — MCP server · ★ 16
- [serial-mcp-server](https://affpapa.org/en/nevibecode/mcp/serial-mcp-server.md) — MCP server · ★ 26
- [pty-mcp](https://affpapa.org/en/nevibecode/mcp/pty-mcp.md) — MCP server · ★ 20
- [Serial MCP](https://affpapa.org/en/nevibecode/mcp/serial-mcp.md) — MCP server · ★ 13
- [cardputer-buddy](https://affpapa.org/en/nevibecode/skills/cardputer-buddy.md) — skill · 2897 installs
- [uptrend-analyzer](https://affpapa.org/en/nevibecode/skills/uptrend-analyzer.md) — skill · 3400 installs

From the same set: [k-dense-ai/lab-instrument-mcps](https://affpapa.org/en/nevibecode/by/k-dense-ai/lab-instrument-mcps.md) — 15 cards

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
