MCP Server

Ciro Cesar Maciel — Free Tools

click.ciromaciel/tools
Developer Tools Media & Content Public & reachable MCP 2025-11-25

What this MCP does

Offers utilities for converting web pages to Markdown, turning CSV data into charts, generating passwords, producing speech audio, and comparing time zones.

compare_timezones
Time zone comparison
Converts one moment across several time zones, daylight saving time included. WHEN TO USE: "what time is it in…", scheduling a meeting across cities, checking whether a time falls at night or on another day somewhere. HOW IT WORKS: - zones: IANA time zone names in Area/City form — America/Sao_Paulo, Europe/Lisbon, Asia/Tokyo, UTC. Not city names alone, abbreviations (EST, BRT) or offsets (GMT-3). The FIRST zone is the reference for date and hour. 1 to 12 zones. - date (YYYY-MM-DD) and hour (0–23) are read in the first zone. Without them: the current moment. Only hour: that hour today in the first zone. Only date: that day at the current hour. - format: 24h (14:00) or 12h (2:00 PM). RETURNS: the moment in UTC and, for each zone, its local date, weekday, time, UTC offset and dayShift (+1 = next day, -1 = previous day, relative to the first zone). link: this tool's web page with the same comparison. ERRORS name the unknown zone or the invalid date; fix it and call again.
Read only
Input schema
{'type': 'object', 'properties': {'date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'The day, as YYYY-MM-DD, in the first time zone. Defaults to today there.'}, 'hour': {'type': 'integer', 'maximum': 23, 'minimum': 0, 'description': 'The hour, 0 to 23, in the first time zone. Defaults to the current hour there.'}, 'zones': {'type': 'array', 'items': {'type': 'string', 'description': 'An IANA time zone name, such as America/Sao_Paulo or Europe/London.'}, 'default': ['America/Sao_Paulo', 'America/New_York', 'Europe/London'], 'maxItems': 12, 'minItems': 1, 'description': 'IANA time zone names, such as America/Sao_Paulo or Europe/London. The first one is the reference. 1 to 12.'}, 'format': {'enum': ['24h', '12h'], 'type': 'string', 'default': '24h', 'description': 'How times are written: 24h (14:00) or 12h (2:00 PM).'}}, 'additionalProperties': False}
data_to_chart
CSV to chart
Draws a chart from a CSV table and returns it as an image. WHEN TO USE: the user wants to see data as a chart, or needs a chart image for a document, a README, a slide or a chat. HOW IT WORKS: - csv: a header row, then data rows. First column: the category (or x value); the next columns: numbers. Use a comma or semicolon as separator; decimals with a point, or with a comma when the separator is a semicolon. Up to 20,000 characters. - chartType, and what each one needs: bar, horizontalBar, line, area, pie, donut, funnel — one category column + one numeric column; multiline — one x column + one or more numeric columns (one line per column); scatter — two numeric columns (x, y); heatmap — three columns: row, column, value. - title: optional, drawn at the top. RETURNS: - image: a PNG address that IS the chart (rendered on request) — put it straight into Markdown (![title](image)) or an <img>. imageSvg: the same as SVG, sharper where SVG is accepted. Both are null when the CSV is too long to fit in an address; then use svg. - svg: the chart as SVG markup. - link: this tool's web page with the same chart, to edit it. ERRORS say what is wrong with the CSV (missing columns, non-numeric values, too many rows); fix the data and call again.
Read only
Input schema
{'type': 'object', 'required': ['csv'], 'properties': {'csv': {'type': 'string', 'maxLength': 20000, 'minLength': 1, 'description': 'The data as CSV with a header row. First column: category or x value; next columns: numbers. Up to 20,000 characters.'}, 'title': {'type': 'string', 'default': '', 'maxLength': 120, 'description': 'Optional title drawn at the top of the chart. Empty for none.'}, 'chartType': {'enum': ['bar', 'horizontalBar', 'line', 'multiline', 'area', 'pie', 'donut', 'scatter', 'funnel', 'heatmap'], 'type': 'string', 'default': 'bar', 'description': 'The kind of chart. See the tool description for the columns each kind needs.'}}, 'additionalProperties': False}
generate_favicon
Favicon generator
Generates a complete favicon set from 1 to 3 characters (initials) or one emoji. WHEN TO USE: the user needs a favicon, tab icon, apple-touch-icon or web app icon for a website or web app, or the project still has a framework's default icon. HOW IT WORKS: mode text draws the characters in any Google Font as vector paths (no font dependency); mode emoji draws one Twemoji emoji as vectors, with a margin. Both sit inside a shape. With adaptive=true the SVG swaps its colors when the browser is in dark mode. Pass framework to get where each file goes. To turn the user's own image into a favicon, send them the link with mode=image: the image is uploaded on the web page, not through this tool. RETURNS: svg (write it to disk exactly as given), files (each with path and url: download the binaries with curl -o), manifest (path and content), html (the head tags; null on Next.js App Router), inline (the whole favicon as one <link> tag, no files), install (steps for the framework), warnings, credit (emoji only), and link (this tool's web page with the same options, to adjust and preview).
Read only
Input schema
{'type': 'object', 'properties': {'font': {'type': 'string', 'default': 'Montserrat', 'description': 'Mode text: any Google Font family, by its name (Montserrat, Inter, Lobster). Heavy sans-serif families read best at 16 px.'}, 'mode': {'enum': ['text', 'emoji', 'image'], 'type': 'string', 'default': 'text', 'description': 'text: initials. emoji: one emoji. image: only on the web page; the call returns the link for the user.'}, 'size': {'type': 'integer', 'default': 80, 'maximum': 96, 'minimum': 30, 'description': 'Mode text: the characters fit in a square this percentage of the icon (the longer side decides).'}, 'text': {'type': 'string', 'default': 'CM', 'maxLength': 3, 'minLength': 1, 'description': 'Mode text: 1 to 3 characters. Latin letters (accents ok), digits and & @ # + . - !. Two characters read best at 16 px.'}, 'color': {'type': 'string', 'default': 'ffffff', 'pattern': '^[0-9a-fA-F]{6}$', 'description': 'Character color, hex without #. With shape outline or none, the color of the characters in dark mode.'}, 'emoji': {'type': 'string', 'default': 'ð\x9f\x9a\x80', 'description': 'Mode emoji: one emoji, as the character itself (ð\x9f\x9a\x80, ð\x9f¦\x8a, â\x98\x95).'}, 'shape': {'enum': ['square', 'rounded', 'circle', 'outline', 'none'], 'type': 'string', 'default': 'square', 'description': 'Container: filled square, rounded square, circle, outlined square, or none (transparent).'}, 'margin': {'type': 'integer', 'default': 8, 'maximum': 30, 'minimum': 0, 'description': 'Mode emoji: space between the emoji and the edge, as a percentage of the icon on each side.'}, 'weight': {'type': 'integer', 'default': 800, 'maximum': 900, 'minimum': 100, 'description': 'Mode text: font weight. The closest weight the family has is used. 700 or more reads best.'}, 'adaptive': {'type': 'boolean', 'default': True, 'description': 'Swap the colors when the browser is in dark mode (SVG only; PNG and ICO stay light).'}, 'framework': {'enum': ['html', 'nextjs', 'vite', 'astro', 'nuxt'], 'type': 'string', 'default': 'html', 'description': 'Where the files will live; changes install, html and the file paths only.'}, 'background': {'type': 'string', 'default': '141414', 'pattern': '^[0-9a-fA-F]{6}$', 'description': 'Container color, hex without #. With shape outline or none, the color of the characters in light mode.'}}, 'additionalProperties': False}
generate_password
Password generator
Generates a strong random password with a cryptographically secure generator. WHEN TO USE: the user asks for a password or a random key. HOW IT WORKS: always uses upper and lower case letters; numbers and symbols are optional. Each selected kind of character appears at least once. length: 8 to 64 (default 16). RETURNS: password, the options used, and link — this tool's web page with the same options. The password is never in the link. Show the password to the user as it is; do not store it or repeat it elsewhere.
Read only
Input schema
{'type': 'object', 'properties': {'length': {'type': 'integer', 'default': 16, 'maximum': 64, 'minimum': 8, 'description': 'Number of characters, 8 to 64. Default 16.'}, 'numbers': {'type': 'boolean', 'default': True, 'description': 'Include digits 0-9. Default true.'}, 'symbols': {'type': 'boolean', 'default': True, 'description': 'Include symbols such as !@#$%. Default true. Set false for systems that reject symbols.'}}, 'additionalProperties': False}
text_to_speech
Text to speech
Reads a text aloud with a Microsoft neural voice (the voices of Edge's "Read aloud") and returns an MP3. WHEN TO USE: the user wants to hear a text or needs an audio file of it — narration, audiobook, lesson, voice-over, a message read aloud. HOW IT WORKS: - Up to 50,000 characters per call. A text over 1,000 characters is split by sentence into parts of up to 1,000; each part is voiced in order and the parts are joined into ONE MP3. Progress is reported per part ("Gerando áudio... 3 de 18"), so keep waiting while it arrives. - It takes time: about 5 seconds per part. 5,000 characters ≈ 30 s; 16,000 ≈ 2 min; 50,000 ≈ 6 min. - Over 50,000 characters: split the text at paragraph boundaries into several calls with the same voice and speed, and give the user every link, in order. - Send the text as it should be HEARD: remove Markdown marks (**, #, list bullets), URLs, emojis and tables. Do not summarize, translate or reword unless the user asked — every word you send is read. - voice: choose one in the language of the text (the prefix is language-region: pt-BR, pt-PT, en-US, es-MX…). Brazilian Portuguese: pt-BR-FranciscaNeural (female, default) or pt-BR-AntonioNeural (male). - speed: 1 is the voice's natural pace; 0.9 suits calm narration, 1.2 a quick read. RETURNS: - audioUrl: the complete MP3 to download, valid for 7 days. Always give this link to the user. If you can run commands, you can download it (e.g. curl -o audio.mp3 <audioUrl>). - audio: the MP3 itself, only when it is short (about 1.5 minutes or less); otherwise null. - seconds (duration), parts, characters, voice, speed. - link: this tool's web page with the same voice and speed (the text is not in it). ERRORS say what happened and what to do next. If a part fails, no audio is produced and a new call starts again from part 1.
Read only
Input schema
{'type': 'object', 'required': ['text'], 'properties': {'text': {'type': 'string', 'maxLength': 50000, 'minLength': 1, 'description': 'The text to read aloud: 1 to 50,000 characters. Plain text as it should be heard â\x80\x94 no Markdown, URLs or emojis. Longer texts: split into several calls.'}, 'speed': {'type': 'number', 'default': 1, 'maximum': 2, 'minimum': 0.5, 'description': "Reading speed, 0.5 to 2. 1 is the voice's natural pace; 0.9 calm narration; 1.25 a quick read."}, 'voice': {'enum': ['pt-BR-FranciscaNeural', 'pt-BR-AntonioNeural', 'pt-PT-RaquelNeural', 'pt-PT-DuarteNeural', 'en-US-AriaNeural', 'en-US-JennyNeural', 'en-US-GuyNeural', 'en-US-ChristopherNeural', 'en-GB-SoniaNeural', 'en-GB-RyanNeural', 'en-GB-LibbyNeural', 'en-AU-NatashaNeural', 'en-AU-WilliamNeural', 'es-ES-ElviraNeural', 'es-ES-AlvaroNeural', 'es-MX-DaliaNeural', 'es-MX-JorgeNeural', 'fr-FR-DeniseNeural', 'fr-FR-HenriNeural', 'fr-CA-SylvieNeural', 'fr-CA-JeanNeural', 'de-DE-KatjaNeural', 'de-DE-ConradNeural', 'it-IT-ElsaNeural', 'it-IT-DiegoNeural', 'ja-JP-NanamiNeural', 'ja-JP-KeitaNeural', 'zh-CN-XiaoxiaoNeural', 'zh-CN-YunxiNeural', 'ko-KR-SunHiNeural', 'ko-KR-InJoonNeural', 'ru-RU-SvetlanaNeural', 'ru-RU-DmitryNeural', 'hi-IN-SwaraNeural', 'hi-IN-MadhurNeural', 'ar-SA-ZariyahNeural', 'ar-SA-HamedNeural', 'nl-NL-ColetteNeural', 'nl-NL-MaartenNeural', 'sv-SE-SofieNeural', 'sv-SE-MattiasNeural', 'nb-NO-PernilleNeural', 'nb-NO-FinnNeural', 'da-DK-ChristelNeural', 'da-DK-JeppeNeural', 'pl-PL-ZofiaNeural', 'pl-PL-MarekNeural', 'tr-TR-EmelNeural', 'tr-TR-AhmetNeural'], 'type': 'string', 'default': 'pt-BR-FranciscaNeural', 'description': "A Microsoft neural voice; one of the listed ids. Pick one in the text's language â\x80\x94 the prefix is language-region (pt-BR, en-US, es-MXâ\x80¦). Default: pt-BR-FranciscaNeural."}}, 'additionalProperties': False}
web_to_markdown
Web page to Markdown
Fetches a public web page and returns its content as clean Markdown. WHEN TO USE: you need to read a page — documentation, an article, a product page — to answer, summarize or quote it; or the user wants a page as Markdown. HOW IT WORKS: - url: a public http(s) address. Private networks, localhost and addresses with credentials are refused. - Reads the HTML the server sends (like a simple browser, without running JavaScript). Pages that build their content with JavaScript have no text to convert — the error says so. - onlyMainContent (default true) drops menus, headers, footers, sidebars, cookie banners and ads. Set false to keep the whole page. - pages above 1 also follows links on the same site (same folder and below), breadth-first, up to that many pages (max 20), respecting robots.txt. Slower: a few seconds per page. - Limits per page: 15 seconds and 5 MB. PDFs and non-HTML files are not converted. RETURNS: for each page, its Markdown with absolute links and images, plus title, description and language when the page has them; pages that failed are listed with the reason. link: this tool's web page with the same request. ERRORS say why the page could not be read and whether retrying makes sense.
Read only Open world
Input schema
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'maxLength': 2048, 'description': 'The page to convert: a public http or https address.'}, 'pages': {'type': 'integer', 'default': 1, 'maximum': 20, 'minimum': 1, 'description': 'How many pages of the same site to convert, 1 to 20, starting at url and following its links. 1 (default) converts only url.'}, 'onlyMainContent': {'type': 'boolean', 'default': True, 'description': 'true (default): keep only the content, without menus, footers, sidebars, cookie banners and ads. false: the whole page.'}}, 'additionalProperties': False}
Added
generate_favicon
Sept. 29, 2026, 2:48 a.m.
Added
web_to_markdown
Sept. 27, 2026, 2:40 a.m.
Added
text_to_speech
Sept. 27, 2026, 2:40 a.m.
Added
data_to_chart
Sept. 27, 2026, 2:40 a.m.
Added
compare_timezones
Sept. 27, 2026, 2:40 a.m.
Added
generate_password
Sept. 27, 2026, 2:40 a.m.