Skip to content
Sırdaş
← Developers

Sırdaş for Cursor: PDFs and documents as context, locally

The spec in PDF, the client's contract or the invoice to reconcile often live next to the code and out of the agent's reach. With Sırdaş, Cursor's agent reads them on your machine and cites the page of each value.

Published version 0.4.3 · recorded on 2026-10-09

Install

Install in Cursor

.cursor/mcp.json

At the project root, or in ~/.cursor/mcp.json for every project.

{
  "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.pdf

Open Cursor in that folder and ask, in your own words:

  1. 1«How much is factura.pdf for, who issued it and on which page does it say so?»

    Calls read_document read-only

    A 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. 2«What are the rent and the term of the lease? Look through the whole folder.»

    Calls build_context read-only

    build_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. 3«Give me the invoice's line items as CSV.»

    Calls pdf_tables read-only

    Tables 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. 4«Turn historia-clinica.pdf into Markdown with no personal data, to paste into another chat.»

    Calls pdf_to_markdown read-only

    Name, 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. 5«Merge factura.pdf and contrato.pdf into expediente.pdf.»

    Calls merge_pdfs writes a file

    This 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

Useful to keep the agent inside the project's docs/. Absolute path.

{
  "mcpServers": {
    "sirdas": {
      "command": "npx",
      "args": [
        "-y",
        "@sirdaspdf/mcp@0.4.3"
      ],
      "env": {
        "SIRDAS_ROOT": "/path/to/your-project/docs"
      }
    }
  }
}

Two variables change what the agent can touch:

What it takes up in your context

The tool descriptions travel with every conversation. Measured on 0.4.3 (characters / 4):

ModeToolsApprox. tokens
All30~14,000
SIRDAS_TOOLSETS=core15~6,800
SIRDAS_READ_ONLY=119~8,600

Check that it is connected

Cursor Settings → MCP: sirdas should show as enabled, with its tools.

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 Cursor: 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:

Other agents