# GlyphGuard > Find hidden and deceptive Unicode in text: zero-width and invisible characters, bidi controls (Trojan Source), hidden Unicode tag payloads (decoded), mixed-script words and lookalike letters. Clean text, and check whether a username or brand name is a lookalike of a protected name. Free web tool, JSON API and a remote MCP server for AI agents. Pure computation: no sign-up, no API key, nothing stored. ## For AI agents - [MCP server](https://glyphguard.mike-tusa.workers.dev/mcp): remote MCP over Streamable HTTP (POST only, stateless, JSON responses). Protocol versions: 2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05. Tools: `scan_text`, `clean_text`, `compare_names`. All read-only. Client config (most MCP clients accept this; some use a different format, for example VS Code uses a `servers` key): `{"mcpServers":{"glyphguard":{"type":"http","url":"https://glyphguard.mike-tusa.workers.dev/mcp"}}}` - [OpenAPI 3.1 spec](https://glyphguard.mike-tusa.workers.dev/openapi.json): machine-readable description of the JSON API - [MCP server card](https://glyphguard.mike-tusa.workers.dev/.well-known/mcp/server-card.json): static description of the MCP server and its tools - Works with AI agents and assistants that can call an MCP server or a JSON API, for example Muse, Claude, ChatGPT or Cursor (descriptive only). GlyphGuard is not affiliated with, endorsed by or sponsored by the Unicode Consortium, Meta, Anthropic, OpenAI or Anysphere. Results are a screening signal, not a security guarantee. ## JSON API (all GET, JSON responses) - `GET https://glyphguard.mike-tusa.workers.dev/api/scan?text=pa%D0%B0ypal%E2%80%8B`: { risk (none|low|medium|high), length, codePoints, total, counts { tag, bidi, zero_width, invisible, variation_selector, control, unusual_space, private_use, lone_surrogate, joiner_in_context, lookalike, mixed_script_word }, tagPayload?, findings [ { type, severity, offset, codePoint?, name?, char?, looksLike?, script?, word?, scripts? } ], truncated, notes[], normalizedNfkcDiffers }. - `GET https://glyphguard.mike-tusa.workers.dev/api/clean?text=...&lookalikes=true&nfkc=false&spaces=true&keep_joiners=true&strict=false`: { text, changed, removed { type: count }, joinersKept, lookalikesMapped, options, length, notes[] }. - `GET https://glyphguard.mike-tusa.workers.dev/api/compare?name=p%D0%B0ypal&targets=paypal|apple`: { name, skeleton, confusableWith[], results [ { target, skeleton, identical, confusable, caseOnly } ], nameRisk, nameScripts[], notes[] }. - `GET https://glyphguard.mike-tusa.workers.dev/api/health`: { ok, version }. - Errors: { "error": { "code", "message", "field"? } } with 400 invalid_input, 404 not_found, 405 method_not_allowed, 429 rate_limited (Retry-After). - Text: up to 2000 UTF-16 code units, URL-encoded on GET (for example %E2%80%8B for a zero-width space). Names and targets: up to 128 characters each, 1-50 targets separated by | (or repeat target=). Booleans: true/false or 1/0. - Risk: high = bidi overrides/isolates, Unicode tag characters, mixed-script words or lookalikes inside them; medium = zero-width and other invisible characters, control characters, lookalike letters in Latin-looking words; low = variation selectors, unusual spaces, private-use characters; lone surrogates (malformed UTF-16) are medium. Joiners in legitimate context are info (type joiner_in_context, risk unchanged): ZWJ inside emoji ZWJ sequences, VS16 emoji presentation, ZWNJ/ZWJ between letters of joining scripts (Arabic, Persian) and after an Indic virama. ZWJ/ZWNJ anywhere else (for example inside an ASCII word) stay medium. clean keeps the in-context joiners by default (keep_joiners=true); strict=true removes them all. Offsets are UTF-16 code units (JavaScript string indexes). Up to 100 findings are listed; counts are always complete. Legitimate text in Cyrillic, Greek or CJK on its own is not flagged; only words that mix scripts are. ## Limits and pricing - No API key and no sign-up. About 60 checks per minute per IP across all /api routes and MCP tools/call (HTTP 429 + Retry-After). Free; there is no paid tier on this site. - The MCP endpoint uses the same limiter: each `tools/call` is one check. Non-check MCP messages don't count as checks, but are capped at about 120/min per IP (HTTP 429 + Retry-After). MCP request bodies are limited to 65536 bytes. - Text you submit is processed in memory and discarded when the response is sent. It is never written to storage, logs or analytics, and GlyphGuard makes no network requests. ## Optional - [Privacy](https://glyphguard.mike-tusa.workers.dev/privacy) - [Terms](https://glyphguard.mike-tusa.workers.dev/terms) - Contact: digitalpromohub.support@gmail.com