{"name":"io.github.unblockingapi/mcp","slug":"unblockingapi-mcp","title":"UnblockingAPI","description":"Fetch bot-protected and JavaScript-heavy pages for AI agents, or parse them to JSON with templates.","url":"https://mcp.market/server/unblockingapi-mcp","rating":null,"grade":"A","score":90,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":39,"stars":2,"forks":0,"downloads_week":193,"last_push_at":"2026-10-22T20:17:44.000Z","license":"MIT"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T07:35:25.076Z","last_ok_at":"2026-11-04T07:35:25.076Z","latency_ms":561},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/unblockingapi/mcp","website":"https://unblockingapi.com","version":"0.8.2","remotes":[{"type":"streamable-http","url":"https://mcp.unblockingapi.com/mcp","headers":[{"description":"Optional. Bearer followed by your UnblockingAPI key from https://unblockingapi.com (500 free credits, no card), e.g. 'Bearer <key>'. Without it, clients that support OAuth sign in with your UnblockingAPI account instead.","format":"string","isSecret":true,"name":"Authorization"}]}],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@unblockingapi/mcp","version":"0.8.2","transport":{"type":"stdio"},"environmentVariables":[{"description":"Your UnblockingAPI key from https://unblockingapi.com (500 free credits, no card).","isRequired":true,"format":"string","isSecret":true,"name":"UNBLOCKINGAPI_KEY"},{"description":"Per-request timeout in milliseconds. Default 180000.","format":"number","name":"UNBLOCKINGAPI_TIMEOUT_MS"}]}],"tools":[{"name":"find_templates","description":"Find published templates that parse a site into structured JSON instead of HTML. Pass the url you are about to fetch to see whether one already covers it — do this before writing your own extraction for a well-known site. Also searches by keyword or category. Each result shows the fields it returns and an example call; pass its reference as unblock_fetch's template argument. Free — no credit is charged.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"A URL you intend to fetch. Returns the templates built for that site, if any."},"search":{"type":"string","description":"Keyword matched against a template's name, reference, host and description (e.g. 'property', 'company')."},"category":{"type":"string","description":"Category slug, e.g. 'search-results', 'real-estate', 'business-directories'. Omit all filters to see the categories."},"limit":{"type":"integer","minimum":1,"maximum":100,"description":"Maximum templates to return (default 25)."},"page":{"type":"integer","minimum":1,"description":"Which page of `limit` results to return, from 1, when more templates match than fit."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_build_guide","description":"Read this before writing code that uses UnblockingAPI - an app, script, scheduled job or backend that fetches web pages (a rank tracker, a listings aggregator, a price monitor, …). Returns the REST API reference for calling it with plain HTTP (no SDK), how to keep the key server-side on platforms like Lovable, Replit and Next.js, how to use templates, and complete recipes. Free. Start with topic 'api', then the recipe that fits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"topic":{"type":"string","enum":["api","fetch-tuning","templates","rank-tracker","listings-aggregator","price-monitor"],"description":"'api': the REST API for apps: request, response, errors, timeouts, keeping the key server-side. 'fetch-tuning': getting complete pages: scrolling, waiting for content, consent walls, locations. 'templates': finding and calling templates for JSON, their output shapes, building your own. 'rank-tracker': recipe: a Google rank tracker for keywords and domains. 'listings-aggregator': recipe: one page that aggregates listings (e.g. properties) from several sites. 'price-monitor': recipe: watch product prices and alert on changes."}},"required":["topic"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"unblock_fetch","description":"Fetch a web page through UnblockingAPI's rotating residential proxies and a real browser. Useful for pages a plain HTTP fetch can't read: pages that need JavaScript, refuse automated requests, or show different content by country. Returns the page as Markdown (or cleaned HTML with format: 'html'); select narrows it to the part you need. If content is missing, fetch again with scroll_steps or wait_for. Picks the mode itself by default: a plain HTTP fetch first, and a real browser when the site blocks it or needs JavaScript. Pass a template reference to get structured JSON instead of HTML — call find_templates with the url first to see whether one exists. Costs 1 credit per successful fetch; failures are free.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"The HTTP/HTTPS URL to fetch. Media and binary files are rejected."},"render":{"type":"boolean","description":"Omit to let the API decide (plain fetch first, a browser when blocked or when the page is an empty JavaScript shell; learned per site). true always renders with a real browser (slower, up to ~2 min worst case); false never does. Any wait option implies true."},"location":{"type":"string","pattern":"^[a-zA-Z]{2}$","description":"2-letter country code to proxy through (e.g. 'us', 'gb', 'de'). Most countries are supported; an unsupported one is refused with the list."},"wait_for":{"type":"string","maxLength":500,"description":"Implies a browser. When to capture: 'stable' (default — once the DOM stops changing), 'domcontentloaded' (immediately), 'networkidle', or any CSS selector (wait until it is visible, then settle). Prefer a selector or 'stable' on pages that never go quiet."},"settle_ms":{"type":"integer","minimum":0,"maximum":25000,"description":"Implies a browser. Ceiling (not a delay) on the settle wait, default 5000. Capture happens as soon as the DOM has been quiet for 500ms. Use wait_min_ms for a minimum delay; lower this to cap the worst case."},"wait_rules":{"type":"array","items":{"type":"object","properties":{"if":{"type":"string","description":"CSS selector to probe for visibility."},"then":{"type":"string","description":"Replacement wait_for when the guard is visible: a mode or a CSS selector. Empty = capture as-is."}},"required":["if"],"additionalProperties":false},"maxItems":10,"description":"Implies a browser. Conditional waits for pages with several possible layouts (consent gate, interstitial, A/B variant). Each 'if' selector is probed in order for detect_ms; the first visible one wins and its 'then' replaces wait_for. Example: [{if: '#consent', then: '#results'}]."},"detect_ms":{"type":"integer","minimum":0,"maximum":25000,"description":"Implies a browser. How long to probe wait_rules guards before falling back to wait_for. Default 800."},"wait_state":{"type":"string","enum":["visible","nonempty","hidden","stable"],"description":"Condition for a CSS selector in wait_for (requires one): 'visible' (default), 'nonempty' (visible text, ignoring loading placeholders), 'hidden' (all matches hidden or gone — e.g. a spinner), 'stable' (text and match count unchanged for 750ms)."},"scroll_steps":{"type":"integer","minimum":0,"maximum":10,"description":"Implies a browser. Scroll down this many times before the readiness check, to trigger lazy-loaded sections. Bounded discovery, not a way to collect an infinite list."},"wait_min_ms":{"type":"integer","minimum":0,"maximum":10000,"description":"Implies a browser. Minimum delay after navigation before scrolling or checking readiness, for content that is absent from the first capture."},"max_age":{"type":"integer","minimum":0,"maximum":300,"description":"Accept a cached copy of the same request up to this many seconds old (0–300). Cache hits return in milliseconds and still cost 1 credit. Default 0 = always fetch fresh."},"template":{"type":"string","pattern":"^(?:[a-z0-9][a-z0-9-]{1,48}[a-z0-9]\\/)?[a-z0-9][a-z0-9-]{1,48}[a-z0-9](?:@[1-9]\\d{0,8})?$","description":"Parse the page with a published template and return JSON instead of HTML. Takes a template reference like 'handle/name' — call find_templates with this url first to see whether one covers the site. Append '@<version>' to pin a version (the response's template_version is the one that answered). The template forces its own render and wait settings."},"format":{"type":"string","enum":["markdown","html"],"description":"How the page comes back (template results are always JSON). \"markdown\" (default): text, headings, links and lists, a fraction of the size. \"html\": the cleaned markup, for attributes, custom elements and choosing a select."},"select":{"type":"string","maxLength":500,"description":"CSS selector: return only the matching elements (e.g. 'article', 'table tr', 'shreddit-post'), in the chosen format. Re-reading a fetch with another select or format reuses the page already fetched - no credit."},"fresh":{"type":"boolean","description":"Fetch again even if this exact fetch was made in the last 10 minutes (by default that copy is reused for free)."},"max_chars":{"type":"integer","minimum":1000,"maximum":140000,"description":"Cap on returned body characters (default 80000, max 140000). Longer bodies are cut with a note; select narrows a page to the part you need instead."}},"required":["url"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}],"scan":{"score":90,"grade":"A","scanned_at":"2026-10-25T05:01:12.851Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-25T05:01:12.736Z","components":{"code":{"score":25,"max":25,"notes":["15 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1651ms"]},"poisoning":{"score":15,"max":15,"notes":["3 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":15,"max":15,"notes":["last push 2 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"probes":[{"url":"https://mcp.unblockingapi.com/mcp","reachable":true,"authRequired":false,"latencyMs":1651,"serverInfo":{"name":"unblockingapi","version":"0.8.2"}}],"packages":[{"registryType":"npm","identifier":"@unblockingapi/mcp","version":"0.8.2","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":4,"publishedAt":"2026-10-22T20:30:11.073Z","repositoryUrl":"git+https://github.com/unblockingapi/mcp.git","weeklyDownloads":193}],"repo":{"found":true,"owner":"unblockingapi","repo":"mcp","archived":false,"pushedAt":"2026-10-22T20:17:44Z","stars":2,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/266298032?v=4","ownerCreatedAt":"2026-03-07T13:20:11Z","license":"MIT"},"icon":{"url":"https://unblockingapi.com/favicon.svg","source":"site"},"presence":{"stars":2,"forks":0,"downloadsWeek":193,"license":"MIT","lastPushAt":"2026-10-22T20:17:44.000Z","score":39}}}},"grade_history":[],"reviews":[]}