跳到主要内容

tabella

❖ Communityv2.0.1

Document lifecycle for agents in one package: create .docx/.xlsx/.pptx/.pdf/.odt/.ods/.odp from structured JSON or raw HTML/CSS, convert between formats via pandoc + LaTeX, and read any document — anydoc (Rust, office formats and text PDFs to Markdown, in-process) with LiteParse + Tesseract OCR fallback for scanned PDFs and images, plus PDF text editing with output-directory guards. Ships as an Agent Plugins v1 package (auto-discovered plugin.json + mcp.json declaring a stdio MCP server — the client spawns it per the v1 lifecycle, PLUGIN_ROOT/PLUGIN_DATA injected — plus an optional self-host streamable-HTTP server; first run of either bootstraps the dependency venv). The HTTP lane binds to 127.0.0.1 only and requires Bearer auth out of the box: a random token is generated into PLUGIN_DATA on first run (TABELLA_TOKEN overrides); requests with an Origin header or a non-JSON body are rejected, and model-supplied HTML cannot fetch network or local-file resources (data: URIs only — the same fetcher now also guards CSS input, not just HTML). Pandoc invocations are argument-safe: extra_args is allowlisted (--toc, --number-sections, -V key=value) and from_format/to_format are validated against the built-in format-name grammar (^[a-z0-9_]+([+-][a-z0-9_]+)*$), closing pandoc's *.lua reader/writer code-exec path; both servers re-exec into the dependency venv after bootstrap.

Open in Hermes Desktop
hermes plugins install tabella

What it adds

Tools 5

doc_readdoc_read_metadoc_convertdoc_create_documentdoc_edit_pdf

README

From the reviewed commit b70f209 ↗; it updates when the author re-pins.

tabella

A portable document lifecycle suite: create, convert, and read documents from structured JSON or raw HTML/CSS.

Cross-Platform Compatibility

This package conforms to the Agent Plugins v1.0.0 specification. It works with any compatible AI agent client that supports MCP servers, including:

Three installation paths

Transports: the plugin ships both.

  • stdio (default) — the declaring client spawns mcp_server.py itself (Agent Plugins v1 lifecycle; PLUGIN_ROOT/PLUGIN_DATA injected by the client). Nothing to run by hand.

  • streamable-HTTP (self-host lane) — for clients that prefer connecting to a URL, run the server yourself:

    python3 scripts/mcp_http_server.py   # serves 127.0.0.1:8602
    

    First run bootstraps the dependency venv (or scripts/setup.sh); TABELLA_TOKEN enables bearer auth. Then point an mcp.json streamable-http entry at http://127.0.0.1:8602/mcp.

Agent Plugins v1 package — clients that support the v1 spec auto-discover plugin.json + mcp.json from the repo root and launch the MCP server:

# Hermes Agent
hermes plugins install dyiapanis/tabella --no-enable
hermes plugins enable tabella

# Other v1-compatible clients: follow your client's plugin installation instructions

MCP server (manual) — point any MCP-compatible client at the server directly:

{
  "mcpServers": {
    "tabella": {
      "type": "stdio",
      "command": "python3",
      "args": ["/path/to/tabella/mcp_server.py"]
    }
  }
}

pip install — use the Python library directly:

pip install tabella-docs[all]

Or install only the modules you need:

pip install tabella-docs[create]    # python-docx, openpyxl, python-pptx, weasyprint, odfpy
pip install tabella-docs[read]      # firecrawl-anydoc, liteparse, PyMuPDF
pip install tabella-docs[convert]   # no python deps (needs system pandoc + texlive-xetex)

Modules

Create

Generate documents from structured JSON content or raw HTML/CSS:

  • DOCX — Word documents (python-docx)
  • XLSX — Spreadsheets (openpyxl)
  • PPTX — Presentations (python-pptx)
  • PDF — Print-ready documents and visual designs (WeasyPrint)
    • Document-style: structured JSON → HTML → PDF
    • Visual-style: raw HTML/CSS (Grid, Flexbox, gradients, themes) → PDF
  • ODT/ODS/ODP — OpenDocument formats (odfpy)

Accepts plain strings (auto-normalized), HTML, or structured dicts with sections, sheets, slides, tables, images, and page breaks.

Convert

Format conversion via pandoc + LaTeX (page size, margins, headers/footers configurable). Pandoc 3.1 supports 44 input and 54 output formats — doc_convert passes your from/to through, so all of them work. The everyday set:

Format In Out Notes
Markdown (.md, variants) ✅ ✅ gfm, commonmark, multimarkdown, strict…
HTML ✅ ✅ html4/html5, chunkedhtml
DOCX (Word) ✅ ✅
ODT ✅ ✅ + opendocument
PDF ✅ ✅ in: text-based PDFs (pandoc's pdf reader); out: needs pdflatex/xelatex (texlive) — engine auto-selected
LaTeX (.tex) ✅ ✅ incl. beamer slides out
RST ✅ ✅
EPUB ✅ ✅ out: epub2/epub3
CSV / TSV ✅ ✅ out via markdown/AST route
RTF ✅ ✅
Plain text (.txt) ✅ ✅
Org-mode, MediaWiki, Jira wiki, Textile, DocBook, FB2, OPML, IPynb, JATS ✅ ✅ writers for most
Typst / man / ms / texinfo / AsciiDoc ✅ ✅ typst in+out
Presentations — ✅ beamer, revealjs, slidy, s5, dzslides (from any reader, Markdown especially)
Pandoc AST (JSON) ✅ ✅ for programmatic pipelines

Everything not in the table: if pandoc --list-input-formats / --list-output-formats lists it, doc_convert accepts it as-is — unknown extensions pass through untouched.

Read

Extract text and metadata from any document:

  • Office formats (DOCX, DOC, XLSX, XLSB, PPTX, PPT, ODT, ODS, ODP, RTF, EPUB, CSV) and text-based PDFs → GitHub-Flavored Markdown via anydoc (~4ms, in-process)
  • Scanned PDFs and images (JPG, PNG, TIFF) → OCR via LiteParse (Tesseract)
  • Plain text (.txt, .md, .json, .py, .yaml, etc.) → direct file read
  • Returns structured Markdown (office formats) or plain text (OCR, plain text)

Prerequisites

Create module

The create module uses a separate Python venv for heavy document libraries. Set DOCS_VENV_PYTHON to point to it:

# Create a dedicated venv
python -m venv ~/.venvs/docs
~/.venvs/docs/bin/pip install python-docx openpyxl python-pptx weasyprint odfpy Pillow lxml PyMuPDF firecrawl-anydoc liteparse

Or install the libraries into your main Python environment:

pip install tabella-docs[create]

Read module

~/.venvs/docs/bin/pip install firecrawl-anydoc liteparse PyMuPDF

Or:

pip install tabella-docs[read]

Convert module

pip install tabella-docs[convert]

Requires system-installed pandoc and a LaTeX engine:

# Debian/Ubuntu
sudo apt install pandoc texlive-xetex

# macOS
brew install pandoc basictex

# Arch
sudo pacman -S pandoc texlive

WeasyPrint system dependencies (PDF creation)

# Debian/Ubuntu
sudo apt install libcairo2 libpango-1.0-0 libgdk-pixbuf-2.0-0

# macOS
brew install cairo pango gdk-pixbuf

Installation from source

git clone https://github.com/dyiapanis/tabella.git
cd tabella
pip install -e ".[all]"

Configuration

Variable Purpose Default
DOCS_VENV_PYTHON Python binary for document libraries PLUGIN_DATA/venv/bin/python or ~/.venvs/docs/bin/python
DOCS_OUTPUT_DIR Default output directory for generated documents ~/Documents
PLUGIN_DATA Client-managed data directory (set by v1 client) —
PLUGIN_ROOT Plugin root directory (set by v1 client) —

Automatic bootstrap

On first startup, the MCP server checks if the docs venv exists. If not, it runs scripts/setup.sh to create a venv in PLUGIN_DATA (provided by the v1 client) or ~/.venvs/docs as fallback, and installs all dependencies: python-docx, openpyxl, python-pptx, weasyprint, odfpy, PyMuPDF, firecrawl-anydoc, liteparse.

This means the v1 package is fully self-contained — no manual pip install required. The bootstrap runs once; subsequent startups use the existing venv.

Usage

Create a PDF from HTML/CSS

from agent_docs.create import create_document

result = create_document(
    format="pdf",
    content={"html": "<html><body><h1>Hello</h1></body></html>"},
    output_path="/tmp/output.pdf",
    options={"page_size": "A4"}
)

Read a DOCX file

from agent_docs.read import read

text = read("/path/to/document.docx")
# Returns GitHub-Flavored Markdown

Convert Markdown to PDF

from agent_docs.convert import doc_convert

result = doc_convert(
    input_path="/path/to/input.md",
    to_format="pdf",
    output_path="/path/to/output.pdf"
)

Via MCP

The bundled MCP server exposes five tools: doc_read, doc_read_meta, doc_convert, doc_create_document, doc_edit_pdf. Any MCP-compatible client can call these directly.

License

MIT

limbic❖ Community★ 8

Self-organising memory provider (MemoryProvider ABC): local SQLite (WAL) with sqlite-vec KNN + FTS5 hybrid recall, adaptive trust scoring, activation maturation, interference-based forgetting, NLI-based correction detection and synaptic atrophy. No LLM cost — all lifecycle mechanisms are deterministic. The optional inline chat recall indicator is off by default (recall_indicator in limbic.yaml) and memory injection works identically either way. Recall is confidence-gated: when nothing clears the calibration floor, recall abstains (no_confident_match) instead of surfacing near-misses, and the agent answers from what it knows without attributing anything to memory. Tools (remember/recall) and lifecycle hooks dispatch via the MemoryManager from the registered provider — this entry registers a MemoryProvider only, so provides_tools/provides_hooks are empty. Disclosure — on first primary session start downloads ~1.0GB of ONNX models (Arctic Embed 2.0 L int8 embedding, ~570MB; MiniLMv2 NLI, ~430MB, on first contradiction check) from huggingface.co at pinned commits with hash checks into ~/.cache/limbic/ (outside HERMES_HOME); at every model load, every file in those cache folders that is not in the pinned manifest is deleted — including unrelated files if you point embedding/nli cache_dir at a shared folder — which reclaims stale orphans from prior versions (e.g. an older fp32 cache of ~2.2GB); the memory database is never touched; spaCy NER models are not downloaded and must be installed manually for entity extraction; memory stays local in limbic.db under HERMES_HOME, and hermes backup adds VACUUM snapshots under HERMES_HOME/backups; no telemetry. Stores created or reindexed on 0.6.0+ record the embedder that produced their vectors and report stale_embedder=true after an embedder change until `hermes limbic reindex`; stores from 0.5.x keep serving their fp32 vectors unflagged until reindexed. PolyForm Noncommercial 1.0.0 (commercial use requires a separate license).

Memory
pass-secrets❖ Community★ 1

pass (password-store) secret source: resolves secrets from a local, GPG-encrypted, git-tracked password store into environment variables at startup, as a first-class SecretSource beside the built-in Bitwarden and 1Password sources. Stdlib-only (subprocess + pathlib), no Python deps, no network — ever. Config: secrets.pass.{enabled,store_path,subdirs,override_existing,timeout_seconds}. Disclosure — when enabled, shells out to the local pass binary (10 s per entry) for every .gpg entry under the configured store subdirs and injects each as an env var that by default overrides .env and shell values; when enabled, also adds a ~900-char system-prompt note about secret resolution; no network.

Tools

← Back to the catalog · catalog built Oct 19, 2026