Skip to main content
Glama
ilham98

simala-mcp

by ilham98
README.md
# simala-mcp

A **read-only** MCP server for trending SIMALA (Analisa Lab) parameters from
pkt-ismart-web's production data — SQL Server lab-record index + MongoDB
readings. Sibling of `ismart-mcp`; plugs into my-agent, Claude Code, or
Claude Desktop.

## What SIMALA is

SIMALA is the lab-analysis system. A **parameter** is one measurement: a
**test** (`spec_uji`, e.g. "pH", "NH₃") performed on a **sample point**
(`item`, e.g. tag `P-211` / "Cooling Water"), inside a plant **section**
(`bagian`) under a **lab type** (`jenis_lab`, e.g. "Lab Mutu"). Each parameter
is addressed by a composite `key`:

```
id_bagian | id_jenis_lab | id_item | id_spec_uji
```

## Setup

```sh
python3.13 -m venv .venv && .venv/bin/pip install -r requirements.txt
```

(Python ≥3.10 and `pymongo==4.10.1` are required — the target MongoDB is 4.0.)

## Connect it

Add to `mcp.json` (my-agent's plug panel: paste this whole block). Credentials
default to the values in pkt-ismart-web's SIMALA config; override via `env`.

```json
{"mcpServers": {
  "simala": {
    "command": "/Users/ilham/Documents/Applications/simala-mcp/.venv/bin/python",
    "args": ["/Users/ilham/Documents/Applications/simala-mcp/server.py"]
  }
}}
```

## Environment (production / beta)

Defaults to **production**. Set `SIMALA_ENV=beta` (in the mcp.json `env` block)
to read the beta databases — SQL `12.7.2.145/simala_beta` (`elogsheet_u`) +
Mongo `12.7.2.191/simala_beta`. Granular `SIMALA_SQL_*` / `SIMALA_MONGO_*` env
vars still override either environment.

```json
"simala": { "command": "…", "args": ["…"], "env": { "SIMALA_ENV": "beta" } }
```

## Tools

| Tool | What it does |
|------|--------------|
| `list_labs()` | Lab types (jenis lab) + plants and their sections, to navigate. |
| `search_parameters(query, plant?, jenis_lab?, limit?)` | Find parameters by sample-point tag/description or test name; returns the `key` for trending. |
| `trend_parameter(key, date_from, date_to, include_unposted?)` | `[datetime, value]` daily series + min/avg/max over a range (≤62 days). |
| `parameter_snapshot(keys[], lookback_days?, include_unposted?)` | Latest reading per parameter. |

Typical flow: `search_parameters("pH", plant="Pabrik 4")` → take a `key` →
`trend_parameter(key, "2026-06-06", "2026-07-06")`.

**Posted vs draft.** By default only **posted** lab records (`IS_POSTING = 1`,
the official data) are read. Pass `include_unposted=true` to also see records
not yet posted.

## Safety

Every SQL path is a parameterized `SELECT` behind a guard that rejects
anything else; there are no write paths. Both target databases are **shared
production** — this server only reads. See `FINDINGS.md` for the data model
and why trending resolves lab-record ids in SQL Server before fetching
readings from Mongo by `id_analisa_lab` (never range-scanning Mongo).