dev.tanod/docs

PDF & Office Tools (Tanod)

Bank statement PDF to CSV, OCR, Office to PDF, PDF to Word, any file to Markdown, merge and split.

Endpointhttps://tanod.dev/mcp/docs (streamable-http)
Registry version0.1.7
Now40 tools · grade D (58) · pin ts_98345f0b7599bc4d6cf59956ea8666e9 · protocol 2025-06-18
First / last listed2026-10-26 01:22 UTC / 2026-10-26 01:22 UTC
Grade over time2026-10-26: D (58), 40 tools

Is this your server? Own a server? ToolFit hosted watch re-checks it every 24 h ($0.25 per 30 days) or 6 h ($0.60) and sends you an HMAC-signed webhook when its tools or grade change: POST https://api.youraitools.co/toolfit/v1/watch. To opt out, see About & opt-out.

Timeline

First listing · 2026-10-26 01:22 UTC
40 tools, grade D (58)

Tools: extract_pdf ocr_image extract_pdf_tables convert_bank_statement convert_office_to_pdf convert_excel_to_json convert_document_to_markdown convert_pdf_to_word fill_docx_template build_pptx_deck build_xlsx_workbook compare_documents pdf_merge pdf_split pdf_extract_pages pdf_remove_pages pdf_rotate pdf_compress pdf_to_images pdf_rasterize images_to_pdf pdf_watermark pdf_page_numbers pdf_protect pdf_unlock pdf_metadata html_to_pdf pdf_ocr pdf_inspect pdf_reorder_pages pdf_crop pdf_resize pdf_outline pdf_set_outline pdf_form_fields pdf_fill_form pdf_flatten pdf_repair pdf_attachments pdf_pipeline

Current tools (40)

extract_pdfsitepeek: extract the text of a PDF. For tables use extract_pdf_tables; for scans use pdf_ocr; for other formats use convert_document_to_markdown. Input: exactly one of `url` or `pdf_base64`, plus optional `max_pages` and `reading_order`. Clear 2-4-column pages are read column by column. Returns text (at most 200k characters; truncated when cut), metadata, columns_detected and size (pages, chars,
params: url, max_pages, reading_order, pdf_base64
ocr_imagesitepeek: OCR the text in a public image. For a scanned PDF use pdf_ocr; for QR codes and barcodes use read_qr_barcode. Returns width, height, format, text (lines and paragraphs kept), words and confidence_mean (0-100, mean word confidence). Non-images, oversize images and private addresses are a 422 (not charged). Typically 1-5 s. Price: USD 0.0025. Free: 5 static renders per IP per UTC day. The
params: url*, lang
extract_pdf_tablespdfpeek: Use when an agent must pull the tables out of a PDF as JSON, CSV or XLSX for analysis. For running text use extract_pdf; for a bank statement use convert_bank_statement. Returns every table of the selected pages (at most 200); `format` json (default), csv (a file per table) or xlsx (one workbook). Text PDFs only: a scanned PDF is a 422 no_text_layer (run OCR first), pages with no table a
params: url, file_base64, pages, format, output
convert_bank_statementpdfpeek: Use when an agent must turn a PDF bank statement into dated transactions for bookkeeping or import. For any other table use extract_pdf_tables. Returns transactions (`date`, `description`, signed `amount`, `balance`, `row_ok`), opening and closing balance, totals, `currency` and a `confidence` 0-1; every row is checked against the running balance. `format` json, csv, xlsx, ofx or qif. Hea
params: url, file_base64, pages, format, output
convert_office_to_pdfpdfpeek: Convert a Word, Excel, PowerPoint, OpenDocument or RTF file to PDF. For the reverse use convert_pdf_to_word. Returns the document as a PDF made by LibreOffice, base64 in `file`, with `format`, `pages` and `active_content_removed`. No options. Reads DOCX, XLSX, PPTX, ODT, ODS, ODP, RTF and text, detected from the content; a PDF, images, legacy .doc / .xls / .ppt, HTML and EPUB are a 422. L
params: url, file_base64, filename, output
convert_excel_to_jsonpdfpeek: Read an Excel workbook into structured rows as JSON, or one CSV file per sheet. To build a workbook use build_xlsx_workbook. Returns the .xlsx/.xlsm workbook read into sheets of string rows. json returns `sheets` (name, columns, row_count, truncated, rows); csv returns one formula-guarded CSV per sheet. A formula cell is its last cached value (empty if uncached); trailing empty cells and
params: url, file_base64, format, merge_mode, output
convert_document_to_markdownpdfpeek: Use when an agent must read a Word, Excel, PowerPoint, PDF, HTML or EPUB file as Markdown text. For PDF tables as rows use extract_pdf_tables. Returns Markdown; PDF `columns_detected`, `page_text_characters`, `pages_without_extractable_text`, `text_coverage`, `warnings` (source text layer before truncation; fallback unknown). Cut at 500,000 characters (`truncated`); `size` estimates token
params: url, file_base64, filename, merge_mode, reading_order
convert_pdf_to_wordpdfpeek: Use when an agent must convert a PDF to Word (.docx) for editing. For the reverse use convert_office_to_pdf; for plain text use convert_document_to_markdown. Add output=url for a 24 h link. Returns a .docx made by LibreOffice with one positioned text box per line, not reflowable paragraphs. At most 50 pages (`pages` converts in parts). Layout fidelity varies: tables are not rebuilt, links
params: url, pdf_base64, pages, output
fill_docx_templatepdfpeek: Fill the {{placeholders}} of a Word template with JSON data, as DOCX or PDF. For slides from JSON use build_pptx_deck. Returns the filled document, base64 in `file` (DOCX, or PDF with output=pdf; delivery=url gives a 24 h link); a placeholder with no value is left as written and listed in `missing`. {{name}} and dotted paths {{customer.name}} read `data`; a table row holding {{#items}} an
params: url, file_base64, data*, output, delivery
build_pptx_deckpdfpeek: Generate a PowerPoint deck from JSON slides: titles, bullets, speaker notes. For a workbook use build_xlsx_workbook; for a Word file use fill_docx_template. Returns the deck as a .pptx, base64 in `file` (output=url gives a 24 h link), with `slides` and `output_bytes`. Input: `slides`, optional deck `title` and optional `theme`. Slides: title, bullets (max 20), notes, layout (title, title_
params: title, slides*, theme, output
build_xlsx_workbookpdfpeek: Build a styled Excel workbook from JSON sheets, columns and rows. To read a workbook back use convert_excel_to_json; for slides use build_pptx_deck. Rows are arrays or objects; a column `type` (string, number, integer, date, datetime, boolean, currency, percent) sets the format. Strings are always stored as text, never as formulas. At most 20 sheets, 50,000 cells, 32,767 characters per ce
params: sheets*, filename, output
compare_documentspdfpeek: Compare two PDF or Word documents: changed paragraphs and rows, word diff, redline. For two plain texts use diff_text. Returns `summary` (inserted, deleted, modified, unchanged, similarity_pct) and `changes`: each inserted, deleted or modified paragraph or table row with its place and `before` / `after` text, plus a `word_diff` for modified ones; with output=docx or pdf also a redline fil
params: a*, b*, output, delivery
pdf_mergepdfpeek: Use when an agent must combine several PDFs into one file, optionally taking only selected pages of each. To cut one PDF apart use pdf_split. Returns one PDF made of 2-20 input PDFs in order, each optionally cut to a page selection (`pages`, e.g. 1-3,5); at most 500 pages out; bookmarks are not carried over. Input: `inputs`: 2-20 objects, each `url` or `pdf_base64` plus optional `pages`.
params: inputs*, output
pdf_splitpdfpeek: Split a PDF by page ranges or every N pages. For one file of chosen pages use pdf_extract_pages. Returns a PDF split into several files: one per comma part of `ranges` (mode=ranges, e.g. 1-3,4-6,7-) or one every `every` pages (mode=every); at most 50 files. More than 50 files is a 413 too_many_files (not charged). Output: base64 `file` (or `files`), or with `output` "url" a 24 h link; ove
params: url, pdf_base64, mode, ranges, every, output
pdf_extract_pagespdfpeek: Extract pages from a PDF. To drop pages use pdf_remove_pages; for several files use pdf_split. Returns a new PDF with the selected pages in the order given (repeats allowed). Pages are 1-based: N, N-M, N- (to the end), -M and last, comma separated; an out-of-range or reversed part is a 422 page_out_of_range (never clamped). Pages not selected are really gone (no orphan objects). Output: b
params: url, pdf_base64, pages*, output
pdf_remove_pagespdfpeek: Remove pages from a PDF. To keep only some pages use pdf_extract_pages. Returns the PDF without the selected pages (1-based: N, N-M, N-, -M, last); removed pages and everything only they reference are really gone. Removing every page is a 422 empty_result. Output: base64 `file` (or `files`), or with `output` "url" a 24 h link; over 15 MB is a 413 (not charged). Active content (JavaScript,
params: url, pdf_base64, pages*, output
pdf_rotatepdfpeek: Rotate the pages of a PDF by 90, 180 or 270 degrees. For several page operations in one call use pdf_pipeline. Returns the PDF with its pages (or a `pages` selection) rotated clockwise by `angle` (90, 180, 270 or -90), added to each page's current rotation. Output: base64 `file` (or `files`), or with `output` "url" a 24 h link; over 15 MB is a 413 (not charged). Active content (JavaScript
params: url, pdf_base64, angle*, pages, output
pdf_compresspdfpeek: Compress a PDF to shrink its file size. For an image-only copy use pdf_rasterize. Returns a smaller PDF: `level` lossless (structure only), recommended (images re-encoded as JPEG q75 at most 150 dpi) or extreme (q50, 96 dpi), with optional `image_quality` and `max_image_dpi`; bytes_before, bytes_after and saved_percent. It never returns a larger file: when it cannot win it returns the inp
params: url, pdf_base64, level, image_quality, max_image_dpi, output
pdf_to_imagespdfpeek: Convert PDF pages to PNG or JPEG images. For one image-only PDF use pdf_rasterize. Returns each selected page rendered to PNG or JPEG (PDFium, no JavaScript) at `dpi` 36-300, optionally grayscale; at most 20 pages per call (a page over 36 megapixels at a lower dpi, reported per image). Priced on `pages`: a closed selection of at most 5 pages is the lower price. Output: base64 `file` (or `
params: url, pdf_base64, format, dpi, pages, jpeg_quality, grayscale, output
pdf_rasterizepdfpeek: Rasterize a PDF: every page rendered to an image, rebuilt as one PDF. To shrink and keep text use pdf_compress; for page images use pdf_to_images. Returns a new image-only PDF: each selected page rendered (PDFium, no JavaScript) at `dpi` 36-300, optional grayscale, re-embedded as JPEG or PNG; no selectable text, forms or active content; at most 20 pages. Priced on `pages`: a closed select
params: url, pdf_base64, format, dpi, pages, jpeg_quality, grayscale, output
images_to_pdfpdfpeek: Convert 1-30 images into a PDF. For Office files use convert_office_to_pdf; for a web page use html_to_pdf. Returns one PDF page per image (PNG, JPEG or WebP; JPEGs embedded byte for byte, EXIF orientation honoured, transparency flattened on white), sized to each image or to A4 / letter with `orientation` and `margin`; at most 30 images, each at most 40 megapixels. Input: `images`: 1-30 o
params: images*, page_size, orientation, margin, output
pdf_watermarkpdfpeek: Add a text watermark to a PDF. For page numbers use pdf_page_numbers; for images use image_watermark. Returns the PDF with a text watermark on every page (or a `pages` selection): Latin text in one of 6 built-in fonts, size, opacity, angle, one of 9 positions, colour, over or under the content; upright on rotated pages. The original content is never rewritten. Text outside Windows-1252 is
params: url, pdf_base64, text*, font, font_size, opacity, angle, position, color, layer, margin, pages, output
pdf_page_numberspdfpeek: Add page numbers to a PDF. For a text stamp use pdf_watermark. Returns the PDF with page numbers in a `format` such as "Page {n} of {N}" at one of 6 positions, with font, size, colour, opacity, margin, `start_number` and a `pages` selection (e.g. 2- skips a cover; numbering counts the stamped pages). Output: base64 `file` (or `files`), or with `output` "url" a 24 h link; over 15 MB is a 4
params: url, pdf_base64, format, position, font, font_size, color, opacity, margin, start_number, pages, output
pdf_protectpdfpeek: Password-protect a PDF. To remove a password use pdf_unlock; to black out content use pdf_redact. Returns the PDF encrypted with AES-256: `user_password` opens it; `owner_password` lifts the `permissions` (all allowed by default). Without `owner_password` a random one nobody knows is used, so the restrictions can never be lifted; each call encrypts afresh, so the file differs every time.
params: url, pdf_base64, user_password*, owner_password, permissions, output
pdf_unlockpdfpeek: Unlock a password-protected PDF. To add a password use pdf_protect. Returns the PDF decrypted, only with a password that opens it (the user or owner password, or "" for a file restricted by an owner password only), with `opened_with`. A wrong password is a 422 invalid_password, an unencrypted file a 422 not_encrypted, public-key (PubSec) encryption a 422 unsupported_encryption. Passwords
params: url, pdf_base64, password*, output
pdf_metadatapdfpeek: Read, edit or strip the metadata of a PDF. For pages, forms and active content use pdf_inspect. Returns a PDF's document metadata (title, author, subject, keywords, creator, producer, created and modified as ISO 8601, PDF version, XMP present); with `set` it writes fields ("" deletes one) and with `strip` removes all document metadata first, returning the new file only when something chan
params: url, pdf_base64, set, strip, output
html_to_pdfpdfpeek: Convert a web page URL to PDF. For images use images_to_pdf; for an image capture use take_website_screenshot. Returns a public web page printed to PDF in a sandboxed headless browser: `paper` (a4, letter, legal, a3, a5, tabloid), `landscape`, `margin_mm`, `print_background`, `scale` and `wait_ms` after load. The page can reach only its own host (other hosts and IP literals are blocked);
params: url*, paper, landscape, margin_mm, print_background, scale, wait_ms, output
pdf_ocrpdfpeek: OCR a scanned PDF into a searchable PDF. For one image use ocr_image; for a PDF with a text layer use extract_pdf. Returns a searchable PDF: tesseract OCR of the selected pages as an invisible text layer over the unchanged originals, plus the recognised `text` (at most 100,000 characters); `skip_text` (default true) leaves pages that have text alone. At most 10 pages per call (200 dpi abo
params: url, pdf_base64, lang, dpi, pages*, skip_text, output
pdf_inspectpdfpeek: Inspect a PDF: page sizes, text layer or scan, forms, attachments, JavaScript, bookmarks. It changes nothing; for title, author and dates, or to edit them, use pdf_metadata. Returns a report on one PDF (nothing changed): page count and version; per page the size in points (with the paper name), rotation, text layer or not and whether it looks scanned (no text, images covering 85%+); and d
params: url, pdf_base64
pdf_reorder_pagespdfpeek: Reorder, repeat or drop the pages of a PDF from a list of page numbers. To only drop pages use pdf_remove_pages. Returns a new PDF made of the pages in `order` (1-based, at most 500), in that order: a page listed twice is copied, one not listed is left out (listed in the reply). Like extract-pages: bookmarks, forms and metadata are not carried over. A page the document does not have is a
params: url, pdf_base64, order*, output
pdf_croppdfpeek: Crop the margins of a PDF. To change the paper size use pdf_resize. Returns the PDF with every page's (or a `pages` selection's) crop box set inside the page by the margins, measured on the page as displayed; new sizes listed. The content outside the box stays in the file: not redaction. Input: at least one of `top`, `right`, `bottom`, `left`. Margins that leave under 1 pt of a page are a
params: url, pdf_base64, top, right, bottom, left, unit, pages, output
pdf_resizepdfpeek: Resize PDF pages to A4, Letter, Legal or a custom size. To trim margins use pdf_crop. Returns pages scaled to A4, Letter, Legal or a custom width x height (pt, mm, in): fit (whole page inside, centred, aspect ratio kept), fill (covered, overflow cut) or stretch; orientation auto keeps each page's. Scaled, not reflowed; links and form fields move with the page. Output: base64 `file` (or `f
params: url, pdf_base64, size*, width, height, unit, mode, orientation, pages, output
pdf_outlinepdfpeek: Read the bookmarks of a PDF as a nested tree. To write bookmarks use pdf_set_outline. Returns the bookmarks as a nested tree of {title, page, open, children}; page is the 1-based target (null: nowhere or another file). At most 1,000 bookmarks and 8 levels (`truncated`); named destinations are resolved. Encrypted input is a 422 (unlock it first). Over about 78 s: a 503 (not charged). Typic
params: url, pdf_base64
pdf_set_outlinepdfpeek: Write the bookmarks of a PDF from a nested tree. To read bookmarks use pdf_outline. Returns the PDF with its bookmarks replaced by the `outline` tree {title, page, open?, children?} (at most 1,000 bookmarks, 8 levels; [] removes them all); each opens its page fit to the window. A page the document does not have is a 422 page_out_of_range. Output: base64 `file` (or `files`), or with `outpu
params: url, pdf_base64, outline*, output
pdf_form_fieldspdfpeek: List the form fields of a PDF. To fill the fields use pdf_fill_form. Returns the form's fields in reading order: name (for fill-form), type (text, checkbox, radio, choice, button, signature), value, required, read_only, page, tooltip as description, options (and labels) of radio and choice fields, max_length, multiline, comb. At most 1,000 fields listed, a form over 5,000 is a 422. XFA is
params: url, pdf_base64
pdf_fill_formpdfpeek: Fill the form fields of a PDF from a JSON object. To make the values permanent use pdf_flatten. Returns the PDF with its form filled from `fields` (names from form-fields): strings or numbers, true / false for checkboxes, an option for radio and choice fields (a list for multi-select), null clears. Appearances are drawn so every viewer shows the values; `flatten` bakes them in and removes
params: url, pdf_base64, fields*, flatten, output
pdf_flattenpdfpeek: Flatten the form fields and annotations of a PDF into the page content. To fill fields first use pdf_fill_form. Returns the PDF with form fields and annotations merged into the pages (`mode` all, screen or print; annotations a mode does not flatten are removed). Fields with a value but no appearance are drawn first; links stay; in mode all, empty signatures and buttons are dropped. A digi
params: url, pdf_base64, mode, output
pdf_repairpdfpeek: Repair a damaged PDF. For a report on a readable file use pdf_inspect. Returns the PDF opened with qpdf's recovery (bad or missing xref, cut-off file, junk before the header) and written again, with qpdf's `warnings`; `linearize` also writes it for fast web view. Structure, not damaged page data. A file that cannot be read at all is a 422. Output: base64 `file` (or `files`), or with `outp
params: url, pdf_base64, linearize, output
pdf_attachmentspdfpeek: List, extract or add the file attachments of a PDF. For a whole-file report use pdf_inspect. Returns the PDF's file attachments by `action`: list (default: name, filename, media type, size, description), extract (one by `name`, base64, at most 10 MB) or add (`file_base64` as `name`, at most 5 MB; the existing ones are kept). Input: `url` or `pdf_base64` and `action` with `name`, `file_bas
params: url, pdf_base64, action, name, file_base64, mime_type, description, output
pdf_pipelinepdfpeek: Run up to 10 PDF operations in sequence on one PDF in a single call. For one operation use its own tool, such as pdf_rotate. Returns a PDF put through the `steps` in order, each step's output the next one's input: rotate, remove-pages, extract-pages, reorder, crop, resize, set-outline, flatten, repair (params as on that operation's own tool); inspect or outline may come last (JSON `report
params: url, pdf_base64, steps*, output

Entries describe changes in tool definitions. They are not statements about a server, its quality or its author. The grade measures how the tool definitions fit model providers (token cost, schema compatibility, confusable names) as scored by the ToolFit engine at the time of the listing. JSON: append .json. Opt-out: how or hello@youraitools.co.