simala-mcp
A read-only MCP server for trending SIMALA (Analisa Lab) parameters frompkt-ismart-web's production data — SQL Server lab-record index + MongoDBreadings. Sibling of ismart-mcp; plugs into my-agent, Claude Code, orClaude Desktop.
What SIMALA is
SIMALA is the lab-analysis system. A parameter is one measurement: atest (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 parameteris addressed by a composite key:
id_bagian | id_jenis_lab | id_item | id_spec_uji
Setup
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). Credentialsdefault to the values in pkt-ismart-web's SIMALA config; override via env.
{"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_* envvars still override either environment.
"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 recordsnot yet posted.
Safety
Every SQL path is a parameterized SELECT behind a guard that rejectsanything else; there are no write paths. Both target databases are sharedproduction — this server only reads. See FINDINGS.md for the data modeland why trending resolves lab-record ids in SQL Server before fetchingreadings from Mongo by id_analisa_lab (never range-scanning Mongo).