Sırdaş for Claude Desktop: your documents, without uploading them
Claude Desktop does not read files from your disk on its own. With the Sırdaş server it can open a folder you choose and work with what is inside, without dragging each file into the chat and without the file leaving your machine.
Published version 0.4.3 · recorded on 2026-10-09
Install
claude_desktop_config.json
Settings → Developer → Edit Config. On macOS it is ~/Library/Application Support/Claude/claude_desktop_config.json; on Windows, %APPDATA%\Claude\claude_desktop_config.json. Restart Claude Desktop afterwards.
{
"mcpServers": {
"sirdas": {
"command": "npx",
"args": [
"-y",
"@sirdaspdf/mcp@0.4.3"
]
}
}
}Try it in two minutes
Three made-up PDFs, with “SINTÉTICO” printed on them, the same ones as in the examples gallery. Download them into a new folder: (gallery)
mkdir -p ~/sirdas-demo && cd ~/sirdas-demo
curl -O https://www.sirdaspdf.com/examples/factura.pdf \
-O https://www.sirdaspdf.com/examples/contrato.pdf \
-O https://www.sirdaspdf.com/examples/historia-clinica.pdfOpen Claude Desktop in that folder and ask, in your own words:
1«How much is factura.pdf for, who issued it and on which page does it say so?»
Calls
read_documentread-onlyA single call: document type, each field with its page and the exact line it comes from, and personal data already replaced with placeholders before it reaches the model.
Real response from @sirdaspdf/mcp@0.4.3, trimmed
{ "arguments": { "path": "factura.pdf" }, "result": { "document_type": "factura", "steps": [ "Extracted text from 1 page(s).", "Found 1 table(s).", "Identified as factura (match 1).", "Extracted 7 field(s) with page citations.", "Replaced 7 personal data item(s) with placeholders." ], "fields": [ { "name": "nit_emisor", "value": "000000001-1", "page": 1, "evidence": "Emisor: Empresa Ficticia S.A.S. [NIT_1]" }, { "name": "fecha_emision", "value": "15/09/2026", "page": 1, "evidence": "Fecha de emisión: [FECHA_1] Vence: [FECHA_2]" }, { "name": "total", "value": "1.445.500", "page": 1, "evidence": "Subtotal: 1.445.500 IVA: 0 Total a pagar: 1.445.500" } ], "redacted": { "EMAIL": 1, "NIT": 1, "DOCUMENTO": 1, "TELEFONO": 1, "FECHA": 2, "NOMBRE": 1 }, "tokens": 123, "next_steps": [ "pdf_tables", "protect_pdf" ] } }2«What are the rent and the term of the lease? Look through the whole folder.»
Calls
build_contextread-onlybuild_context reads the whole folder and hands over only the blocks that answer, each with its file, page and evidence line, and says how many tokens it delivered against the whole folder. With five one-page PDFs the difference is small: the figure is measured on every call, on your own files.
Real response from @sirdaspdf/mcp@0.4.3, trimmed
{ "arguments": { "query": "¿Cuál es el canon y la duración del contrato de arrendamiento?", "max_results": 2 }, "result": { "items": [ { "source": "contrato.pdf", "pages": [ 1, 1 ], "section": [ "Contrato de arrendamiento de vivienda urbana" ], "relevance": 1, "evidence": "Canon mensual: $ 1.500.000, pagadero los cinco primeros días de cada mes." }, { "source": "contrato.pdf", "pages": [ 1, 1 ], "section": [], "relevance": 0.163, "evidence": "SINTÉTICO · documento inventado para la galería de Sirdas PDF" } ], "stats": { "source_tokens": 456, "context_tokens": 243, "tokens_saved": 213 }, "documents": 5 } }3«Give me the invoice's line items as CSV.»
Calls
pdf_tablesread-onlyTables come out by column, not as running text. Amounts stay as they were in the document.
Real response from @sirdaspdf/mcp@0.4.3, trimmed
{ "arguments": { "path": "factura.pdf" }, "result": { "total": 1, "tables": [ { "page": 1, "columns": 3, "csv": "↓ 1" } ] } }↓ 1
Concepto,Cant,Valor Consulta general,1,80.000 Examen de laboratorio,3,245.500 Ecografía abdominal,1,1.120.000
4«Turn historia-clinica.pdf into Markdown with no personal data, to paste into another chat.»
Calls
pdf_to_markdownread-onlyName, ID number, date and record number come out as [NOMBRE_1], [DOCUMENTO_1]…; the diagnosis and the plan stay, which is what the model needs. It is rule-based: check before sharing.
Real response from @sirdaspdf/mcp@0.4.3, trimmed
{ "arguments": { "path": "historia-clinica.pdf" }, "result": { "markdown": "↓ 1", "tokens_estimate": 108, "redacted": { "HISTORIA_CLINICA": 1, "DOCUMENTO": 1, "FECHA": 1, "NOMBRE": 2 } } }↓ 1
SINTÉTICO · documento inventado para la galería de Sirdas PDF ## Historia clínica · Consulta externa Paciente: [NOMBRE_1] C.C. [DOCUMENTO_1] Historia clínica N.º [HISTORIA_CLINICA_1] Fecha: [FECHA_1] Motivo de consulta: dolor abdominal de tres días de evolución. Diagnóstico: gastritis aguda (K29.1). Plan: omeprazol 20 mg cada 24 horas por 14 días. Control en un mes. Médico tratante: Dra. [NOMBRE_2], registro 000000.
5«Merge factura.pdf and contrato.pdf into expediente.pdf.»
Calls
merge_pdfswrites a fileThis one writes a file, so the server declares it as a writing tool (readOnlyHint: false) and your client can ask you before running it. It never overwrites an existing file unless overwrite is set.
Real response from @sirdaspdf/mcp@0.4.3, trimmed
{ "arguments": { "paths": [ "factura.pdf", "contrato.pdf" ], "output": "expediente.pdf" }, "result": { "output": "expediente.pdf", "inputs": 2, "bytes": 2473 } }
Limit it to one folder
One folder only
Recommended here: without SIRDAS_ROOT, the root is the folder the client starts the server from, and in a desktop app you do not choose it. Absolute path; on Windows, with double backslashes (C:\\Users\\…).
{
"mcpServers": {
"sirdas": {
"command": "npx",
"args": [
"-y",
"@sirdaspdf/mcp@0.4.3"
],
"env": {
"SIRDAS_ROOT": "/Users/you/sirdas-demo"
}
}
}
}Two variables change what the agent can touch:
SIRDAS_READ_ONLY=1— removes the tools that write files.SIRDAS_TOOLSETS=core— keeps only the tools that read and understand documents.
What it takes up in your context
The tool descriptions travel with every conversation. Measured on 0.4.3 (characters / 4):
| Mode | Tools | Approx. tokens |
|---|---|---|
| All | 30 | ~14,000 |
SIRDAS_TOOLSETS=core | 15 | ~6,800 |
SIRDAS_READ_ONLY=1 | 19 | ~8,600 |
Check that it is connected
After restarting, the chat's tools icon should list sirdas's tools. If it does not, Settings → Developer shows the server error.
If it does not show up: node -v has to be 20 or higher, and the client has to restart after a configuration change. The first start downloads the package with npx; later ones do not.
What we tested and what we did not
The configuration is the standard stdio protocol, the same one the server is tested with in CI. We have not recorded a session inside Claude Desktop: which tool it picks depends on the model; what it returns does not.
New in 0.4.3
It arrived with this version, so it works with the install above:
SIRDAS_TIMEOUT_SECONDS: a call that runs past 10 minutes returns an error, and from then on it cannot write any file.build_context: each block's citation comes from the block already anonymized, with its table header: an amount no longer shows as [DOCUMENTO_1].anonymize_text: in a table the column header is the label, and a name starting with an accented capital is redacted across the whole text (since 0.4.2).