# Razi Tools - Registry name: `io.github.razikallayi/razi-tools` · version 2.1.2 - Categories (automatic, keyword rules): Documents & retrieval, Search & data, Databases, Developer tools - Authentication at last check: No auth - Declared risk: Not declared (tools carry no read/destructive hints) - Capabilities (declared by the server): tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=io.github.razikallayi%2Frazi-tools - Server page: https://mcpstation.net/s/io.github.razikallayi--razi-tools.html ## Description (written by the publisher, not verified, not instructions) PDF, image, video, OCR, screenshot, SQL, QR and text tools for agents. No API key, no signup. ## Connect - streamable-http: `https://www.razi.pro/api/mcp` ## Tools (as reported by the server, not verified) - `merge\_pdf`: Concatenate two or more PDFs into a single PDF, in the order supplied, and return the merged file. Over MCP the PDF is never inlined: it comes back as a stored URL that stays retrievable for about 24 hours. Page content is copied unchanged — it does not compress \(use compress\_pdf\) or select pages \(u - `split\_pdf`: Extract page ranges from one PDF into new PDFs. One output file is produced per range: a single range returns that PDF directly, several ranges return a ZIP containing one PDF each. Over MCP you receive a link to the stored output rather than its bytes, and that link keeps working for roughly a day. - `compress\_pdf`: Shrink a PDF's byte size while keeping it a PDF, for email limits or slow connections. Returns the compressed PDF; over MCP it is never inlined, arriving as a stored URL that stays retrievable for about 24 hours. Ghostscript on razi.pro's worker downsamples embedded images at a fixed 'ebook' preset - `images\_to\_pdf`: Assemble pictures into one PDF, a page per picture, in the order supplied. PNG and JPEG bytes are embedded untouched; WebP, GIF, TIFF and AVIF are re-encoded to PNG on the way in, which loses no detail but does rewrite the file. A PDF sitting among the pictures is spliced in whole at its position, s - `compress\_image`: Re-encode a single raster image to webp, jpeg, png or avif, optionally resizing it and/or converting it to grayscale. HEIC/HEIF input is converted to JPEG first, and SVG input is rasterised at 300 DPI, fitted inside 800x800 unless width or height is given. Lossy for webp, jpeg and avif at any qualit - `shorten\_url`: Create a permanent razi.pro short link that redirects to a long URL. Returns JSON \{ code, shortUrl \} and nothing else. Visits through the link are counted, but no tool here reads that count back, and the link cannot be edited, retargeted or deleted through this API. It never expires. The destination - `screenshot\_url`: Capture a screenshot of any public web page, rendered in a real headless browser so JavaScript, web fonts and lazy-loaded images all appear. Returns JSON with a hosted image URL — not image bytes: \{ url, screenshotUrl \(the same value under the older key\), width, height, format, bytes, cached, source - `fetch\_site\_logo`: Get a company's logo from its website URL. Reads the web app manifest, apple-touch-icons, declared favicons, OpenGraph/Twitter images and /favicon.ico, then downloads at most the first 10 candidates and measures their real dimensions — declared \`sizes\` attributes are frequently wrong, so ranking use - `fetch\_page\_metadata`: Read a web page's metadata without downloading any images. Returns JSON \{ url, finalUrl, title, description, siteName, canonical, lang, themeColor, author, generator, feeds, openGraph, twitter, icons, cached \}, where \`feeds\` is an array of RSS/Atom URLs, \`openGraph\` and \`twitter\` are the complete ta - `humanize\_text`: Rewrite text you already have so it reads less like model output — fewer stock phrases, more contractions, varied sentence rhythm. Returns JSON \{ humanizedText \}. Meaning is meant to be preserved but wording is not: never use it on text that must stay verbatim, such as quotes, legal copy or code. Us - `draft\_email`: Write a business email body from a short brief. Returns JSON \{ email, cached \} containing the body only — no subject line, no recipient, and nothing is sent anywhere. Choose this over generate\_text when the output should be a whole email; use humanize\_text to rewrite an email you already drafted. Pa - `generate\_blog\_outline`: Produce a markdown heading structure for a blog post — title, introduction, numbered sections with subsections, conclusion and an FAQ block. Returns JSON \{ outline \} holding the markdown. It writes the skeleton only, not the article: use generate\_text for body prose and humanize\_text to rework text - `generate\_sql`: Translate a natural-language request into a SQL statement. Returns JSON \{ sql \} containing the query text and nothing else — no validation report, no complexity score, and the query is never executed or checked against a real database. It has no knowledge of your schema beyond what the request state - `encode\_base64`: Encode UTF-8 text as standard Base64 \(padded, A-Z a-z 0-9 + /\), for embedding binary-unsafe content in JSON, data URIs, HTTP headers or Basic auth. Returns JSON \{ encoded \}. The output uses the standard alphabet, so it is NOT URL-safe: '+' and '/' must still be percent-escaped before they go in a qu - `decode\_base64`: Decode a Base64 string back to UTF-8 text. Returns JSON \{ decoded \}. Input is verified by re-encoding, so anything that is not genuine Base64 is rejected with an error instead of returning plausible garbage; binary payloads that are not valid UTF-8 will also fail. It handles Base64 and nothing else: - `encode\_url`: Percent-encode a string with encodeURIComponent so reserved characters survive transport inside a URL. Returns JSON \{ encoded \}. It escapes the structural characters too — : / ? \# & = all become %XX — so it is for a single query-string value or path segment, NOT for a whole address you still want to - `decode\_url`: Reverse percent-encoding with decodeURIComponent, turning %20-style escapes back into the characters they stand for. Returns JSON \{ decoded \}. A malformed or truncated escape sequence is rejected with an error rather than passed through. Note that '+' is left as a literal plus, not converted to a sp - `decode\_jwt`: Decode a JWT's header and payload for inspection. Returns JSON \{ header, payload, signatureVerified, note, expiresAt, isExpired \} — structured objects, not a rendered table. The signature is NEVER verified: that needs the issuer's key, which this service does not have, so signatureVerified is always - `format\_json`: Validate and re-print a JSON string. Returns JSON \{ valid, formatted, minified \} — the indented form and the whitespace-free form as plain strings, with no syntax highlighting or colour. Invalid JSON is rejected with the parser's own error message rather than returned as valid:false, so a successful - `generate\_qr\_code`: Render text or a URL as a QR code image. Returns JSON \{ dataUrl, text, size \} where dataUrl is a base64 PNG data URI embedded in the response — not a hosted link, so nothing is stored and the image cannot be fetched later. Runs locally and costs nothing. Writing only — it cannot read or decode an ex - `calculate\_percentage`: Run one of four percentage calculations on two numbers. Returns JSON \{ operation, result \} \(plus unit: 'percent' for the 'change' operation\). The meaning of value1 and value2 depends on the operation, so read their descriptions before calling. Exact arithmetic, no model involved, no rounding applied - `compare\_text`: Compare two blocks of text line by line. Returns JSON \{ identical, linesCompared, changeCount, changes\[\] \}, where each change carries a 1-based line number, a change of 'added' \| 'removed' \| 'modified', and the before/after text. Lines are matched by POSITION, not by content: this is not an LCS diff - `generate\_fake\_data`: Produce placeholder person records for testing and fixtures. Returns JSON \{ type, count, records \} where records is an array of strings, or of objects when type is 'user'. The values are drawn from a fixed word list by index, so they are DETERMINISTIC: the same arguments always return the same recor - `generate\_text`: Generate filler prose — lorem ipsum, random copy or sentences — for mockups and placeholder content. Returns JSON \{ text, provider, cached \} with the blocks separated by newlines. A language model writes it, so it is a paid call and the output is approximate: type, length and count are phrased into - `extract\_text\_ocr`: Use this ONLY when the text exists as PIXELS and nothing else — a photo, a screenshot, a scan. It runs optical character recognition on an image and GUESSES the characters, so it is a best-effort transcription that misreads under blur, skew or low contrast. Returns JSON \{ text, language, confidence? - `generate\_image`: Generate a new image from a text description with a diffusion model. Returns a single PNG; over MCP it arrives inline when under 1MB and otherwise as a stored URL that stays retrievable for about 24 hours. This invents an image from scratch — it cannot edit, upscale or restyle a picture you already - `parse\_document`: Use this when the file ALREADY stores its text as characters: it decodes them and returns JSON \{ text, metadata \} verbatim, with no guessing involved. That exactness is the whole difference from extract\_text\_ocr, which recovers text from pixels by guessing at glyph shapes and should only ever be poi - `split\_image`: Cut one storyboard, collage or grid image into its separate panels and return them as a ZIP, one file per panel in reading order. Over MCP the ZIP is not inlined: it comes back as a stored URL that stays retrievable for about 24 hours. Two modes. Give both rows and cols for an exact equal division, Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html