Quickstart — install, use, data¶
One page from the files Limma sends you to an agent reading your documents. Each step links the page that holds its detail; Install inside your network is the whole install.
Install¶
- Load the image and check it:
sha256sum -c limma-image-<version>.tar.gz.sha256, thendocker load -i limma-image-<version>.tar.gz(install, step 1). - Configure, in the bundle's
deploy/customer/:cp .env.example .env, then fill the[common]section — an admin key and an analyst key inEPISTEM_API_KEYS(<key>:<organization>:admin,<key>:<organization>:analyst, each key fromopenssl rand -hex 32), the URL your agents reach the API at inLIMMA_APP_BASE_URL, andLIMMA_TERMS_ACCEPTEDonce you have readTERMS.md. Put thelicense.jsonLimma sent you atlicense/license.json. -
Choose the model. The recommended reader runs on one GPU of 48 GB or more; add to
.env(removing the#from theCOMPOSE_FILEline):COMPOSE_FILE=compose.yaml:compose.vllm.yaml VLLM_IMAGE=vllm/vllm-openai:v0.29.0@sha256:c2914767605584b6d8f45686b82de173ecc99e781897aa3d0a66dacd72c51ae1 LIMMA_VLLM_ARTEFACT=Qwen/Qwen3-30B-A3B-Instruct-2507-FP8 MAX_MODEL_LEN=32768More GPUs, or open weights you already serve: install, section 2. That model is Limma's own reader; your agents may use any model. 4. Start, then check:
docker compose --profile fetch run --rm model-fetch docker compose up -d curl -s http://127.0.0.1:8000/health docker compose exec api python -m epistem.deploy smoke --bundle bundle_expert_network --registry-lessThe smoke ends
smoke: PASSED(install, step 5, which also says what every line of/healthmust read).
Use — the five tools¶
Attach an agent to the API's MCP endpoint, <LIMMA_APP_BASE_URL>/mcp, with a key — for
Claude Code:
claude mcp add --transport http limma https://limma.your-company.internal/mcp --header 'X-API-Key: ${LIMMA_API_KEY}'
Claude Desktop, Cursor and VS Code: MCP over HTTP. There is no workspace to create first: a call that names none is served from the key's default workspace, which the first such call of the admin or analyst key creates. The agent is offered five tools:
| tool | for | one example |
|---|---|---|
limma_ingest |
put a text in | limma_ingest(content="Board minutes: Ingrid Solberg was appointed CFO on 1 March 2024.", filename="minutes.txt") |
limma_facts |
every fact at an address, with a receipt each and a count | limma_facts(question="revenue 2023", mode="enumerate", coordinate={"attribute": "revenue", "period": "FY2023"}) |
limma_search |
the closed set of people (or anything a pack declares) that meet a request | limma_search(brief="VP-level sales people in DACH") |
limma_region |
re-read the exact bytes a receipt points at | limma_region(source_id="<from a fact>", start=126, end=131, page=0) |
limma_connect |
load a table or an export as addressed facts | limma_connect(document_source={"path": "/data/imports/experts.jsonl", "collection": "experts"}, mode="propose") |
What each returns, and every field: the verb reference.
Data — getting yours in¶
| what you have | how it goes in |
|---|---|
| Documents — PDF, Word, PowerPoint, Excel, HTML, e-mail, text, scans | a folder sync (below), or one file at a time: POST /v1/workspaces/{workspace_id}/documents (multipart files=@<file>). An agent sends a text with limma_ingest. |
Exports — JSON / JSONL (a mongoexport file), CSV / TSV, Excel |
put the file in the bundle's ./imports (the API reads it at /data/imports), then limma_connect with document_source.path — mode="propose" first, which drafts the mapping and writes nothing (the connect path). A file from another machine is uploaded first (POST /v1/public/upload_export) and connected by its export_id. |
| Databases — PostgreSQL, MySQL / MariaDB | list the host in EPISTEM_CONNECT_ALLOWED_HOSTS (by name, in .env), then limma_connect(database_url=..., table=..., relation_mapping=...) with a read-only account (the connect path). |
| A folder, a bucket, Google Drive or SharePoint, kept current — S3, Azure Blob, Google Cloud Storage, a Drive folder, a SharePoint or OneDrive for Business library | pip install limma-ai on any machine that reaches the API, then limma sync ./contracts --url https://limma.your-company.internal, run again to keep it current; in an air gap the image runs the same command as python -m epistem.sdk sync (connectors). |
A sync tool you already run (Airbyte, Fivetran, a nightly job) writes files; load what it writes as an export (its output). Deleting a document or a workspace is proven by enumeration (data handling).