Sifter - Turn a folder of documents into typed records you can query
LocalAbout Sifter - Turn a folder of documents into typed records you can query
Sifter is an open-source document intelligence engine that extracts typed records from documents such as PDFs, scans, contracts and invoices using natural-language field specs. It is aimed at teams that need exact counts and aggregations across similar documents, rather than similarity-based retrieval as in RAG.
Key features
- 01Infers extraction schema from natural-language descriptions
- 02Stores results as typed structured records
- 03Supports filters, counts and sums
- 04MCP server with read and write tools over stdio
- 05Python and TypeScript SDKs and a CLI
Use cases
- 01Total unpaid amounts across invoices for a quarter
- 02Find contracts expiring within the next 90 days
- 03Filter candidate resumes by skills and experience
MCP support
This project is an MCP server that offers read and write tools over stdio, letting MCP clients query extracted document records.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
15Saved tool list · updated 2w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | No | |
| offset | integer | No |
Details
From the project READMESifter
Your documents are a dark database.
Open-source document intelligence engine — schema-driven extraction, NL query, MCP server, Python and TypeScript SDKs. Self-hostable under MIT.

Why not RAG?
RAG is built for retrieval — find me chunks similar to this query. It breaks on homogeneous collections like invoices, contracts, or receipts where every document looks alike and the question is an aggregation, not a search.

Sifter's approach: extract structured fields once (client, date, total), store them as typed records, query with real filters and aggregations. The answer is exact and reproducible — because it's a database query, not a similarity search.
Quickstart
git clone https://github.com/sifter-ai/sifter
cd sifter/code
cp server/.env.example server/.env.local # set SIFTER_DEFAULT_API_KEY (required)
docker compose up -d
Open http://localhost:3000 — create a sift, upload documents, query results.
Python SDK
pip install sifter-ai
from sifter import Sifter
s = Sifter(api_key="sk-...")
sift = s.create_sift("Invoices", "client name, date, total amount")
sift.upload("./invoices/")
sift.wait()
for record in sift.records():
print(record["extracted_data"])
# {"client": "Acme Corp", "date": "2024-01-15", "total_amount": 1500.0}
TypeScript SDK
npm install @sifter-ai/sdk
import { Sifter } from "@sifter-ai/sdk";
const client = new Sifter({ apiKey: "sk-..." });
const sift = await client.createSift("Invoices", "client, date, total amount");
await sift.upload("./invoices/");
await sift.wait();
const records = await sift.records();
console.log(records);
MCP server (Claude Desktop / Cursor / AI agents)
{
"mcpServers": {
"sifter": {
"command": "uvx",
"args": ["sifter-mcp", "--base-url", "http://localhost:8000"],
"env": { "SIFTER_API_KEY": "sk-dev" }
}
}
}
Then ask:
"What's the total unpaid across all invoices from last quarter?" "Show me all contracts expiring in the next 90 days." "Which candidates have Python and more than 5 years experience?"
Sifter answers with structured data — exact counts, sums, filtered rows. Not a text blob.
Want a remote MCP URL without running a local server? → Sifter Cloud
Dashboard
Sifter includes a built-in dashboard — no Metabase, no Grafana, no SQL required.
Describe what you want to see in plain language:
sift = client.sifts.get("invoices")
sift.create_dashboard("Show total invoiced and unpaid by vendor, monthly trend")
Produces KPI tiles, breakdowns, and time-series — updated automatically on every extraction.
What's included
- Schema-driven extraction — describe what to extract in natural language; schema is inferred automatically and exported as Pydantic / TypeScript types
- NL query — ask questions in plain language; Sifter generates inspectable MongoDB aggregation pipelines
- MCP server — stdio transport, read + write tools, zero custom integration code
- REST API + SDKs — full OpenAPI spec, typed clients for Python and TypeScript
- Webhooks — HMAC-signed HTTP callbacks on every extraction event
- Spec-driven dashboards — short NL spec → auto-generated board (KPI, breakdown, table, time series)
- CLI —
sifter extract,sifter records,sifter siftsfor terminal workflows and CI - Self-hostable — Docker Compose, bring your own MongoDB and LLM API key
Don't want to run infrastructure?
Sifter Cloud is the managed version — no Mongo, no ops, remote MCP endpoint, Google Drive and email ingress. Free tier available.
Docs
Full documentation at docs.sifter.run — quickstart, SDK reference, MCP guide, cookbook, self-hosting.
License
MIT — see LICENSE.
Created by Bruno Fortunato.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.