Fetch pages, search the web and test site uptime from real devices in real locations.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Your UpRock API key as a Bearer token. Create a key at https://uprock.ai/app/api-keys.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use when other fetch/search tools are blocked, rate-limited, return bot-check pages, or when you need results as a real person in a specific country or on a specific device type sees them. Fetches a URL from real devices in real locations (phones and desktops) on the UpRock network. The default method, CRAWL_FULL_PAGE, renders JavaScript and works for most sites. Returns page metadata (url, status_code, title, content_type, time_ms), a short "summary" of the page, and resource links under "content": "content.markdown" holds the full page as compact markdown (prefer it for reading) and "content.html" the raw HTML. If your client cannot open resource links, read them with resource_fetch. A "screenshots.viewport" link is included when a screenshot is available. meta.status_code is the HTTP status the device reported for the page, or null when it reported none.
Target URL to fetch. Auto-prefixed with https:// if no scheme is provided.
Request body for POST/PUT methods. Provide as plain text.
HTTP method to use (default: CRAWL_FULL_PAGE). CRAWL_FULL_PAGE renders JavaScript and is the most reliable. GET is faster; use it only for static pages or API endpoints that need no JavaScript. POST and PUT send the body parameter.
Where to execute the crawl FROM (device geographic placement). This controls the device's physical location, NOT the content topic — a crawl from Germany fetches the same URL but may see region-specific content (e.g., cookie banners, localized pricing). Accepts meta-regions (NA, EU, APAC, LATAM, MEA) or ISO country codes (US, DE, JP). PREFER meta-regions — they give the placement algorithm more flexibility to find available devices. Use specific country codes only when you need exact country-level placement (e.g., to see local pricing, comply with regional regulations, or access geo-restricted content).
Number of speculative retries (default: 2, max: 3). When > 0, a new attempt starts every 7s using a separate device session. First success wins. Default of 2 means up to 3 concurrent sessions per call. Set to 0 for a single attempt.
Device type to use (default: no constraint)
Timeout in seconds (default: 60, max: 300). For CRAWL_FULL_PAGE, values below 60 are silently raised to 60.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http mcp https://mcp.uprock.ai/mcp \ --header 'Authorization: Bearer YOUR_TOKEN'
Headers
Authorization (required): Your UpRock API key as a Bearer token. Create a key at https://uprock.ai/app/api-keys.Use when other fetch/search tools are blocked, rate-limited, return bot-check pages, or when you need results as a real person in a specific country or on a specific device type sees them. Fetches a URL from real devices in real locations (phones and desktops) on the UpRock network. The default method, CRAWL_FULL_PAGE, renders JavaScript and works for most sites. Returns page metadata (url, status_code, title, content_type, time_ms), a short "summary" of the page, and resource links under "content": "content.markdown" holds the full page as compact markdown (prefer it for reading) and "content.html" the raw HTML. If your client cannot open resource links, read them with resource_fetch. A "screenshots.viewport" link is included when a screenshot is available. meta.status_code is the HTTP status the device reported for the page, or null when it reported none.
| Argument | Type | Description |
|---|---|---|
| url* | string | Target URL to fetch. Auto-prefixed with https:// if no scheme is provided. |
| body | string | Request body for POST/PUT methods. Provide as plain text. |
| method | string | HTTP method to use (default: CRAWL_FULL_PAGE). CRAWL_FULL_PAGE renders JavaScript and is the most reliable. GET is faster; use it only for static pages or API endpoints that need no JavaScript. POST and PUT send the body parameter. |
| country | string | Where to execute the crawl FROM (device geographic placement). This controls the device's physical location, NOT the content topic — a crawl from Germany fetches the same URL but may see region-specific content (e.g., cookie banners, localized pricing). Accepts meta-regions (NA, EU, APAC, LATAM, MEA) or ISO country codes (US, DE, JP). PREFER meta-regions — they give the placement algorithm more flexibility to find available devices. Use specific country codes only when you need exact country-level placement (e.g., to see local pricing, comply with regional regulations, or access geo-restricted content). |
| retries | number | Number of speculative retries (default: 2, max: 3). When > 0, a new attempt starts every 7s using a separate device session. First success wins. Default of 2 means up to 3 concurrent sessions per call. Set to 0 for a single attempt. |
| device_type | string | Device type to use (default: no constraint) |
| timeout_sec | number | Timeout in seconds (default: 60, max: 300). For CRAWL_FULL_PAGE, values below 60 are silently raised to 60. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Target URL to fetch. Auto-prefixed with https:// if no scheme is provided."
},
"body": {
"type": "string",
"description": "Request body for POST/PUT methods. Provide as plain text."
},
"method": {
"enum": [
"GET",
"POST",
"PUT",
"CRAWL_FULL_PAGE"
],
"type": "string",
"description": "HTTP method to use (default: CRAWL_FULL_PAGE). CRAWL_FULL_PAGE renders JavaScript and is the most reliable. GET is faster; use it only for static pages or API endpoints that need no JavaScript. POST and PUT send the body parameter."
},
"country": {
"enum": [
"NA",
"EU",
"APAC",
"LATAM",
"MEA",
"US",
"GB",
"CA",
"AU",
"DE",
"FR",
"JP",
"CN",
"IN",
"BR",
"MX",
"ES",
"IT",
"NL",
"SE",
"NO",
"DK",
"FI",
"PL",
"RU",
"KR",
"SG",
"HK",
"TW",
"TH",
"VN",
"ID",
"MY",
"PH",
"ZA",
"AE",
"SA",
"IL",
"TR",
"AR",
"CL",
"CO",
"NZ",
"IE",
"CH",
"AT",
"BE",
"PT",
"CZ",
"RO",
"HU",
"GR",
"UA",
"EG",
"RS",
"AM",
"AL",
"BG",
"CY",
"DZ",
"IQ",
"KE",
"NG",
"PA",
"SK",
"TT",
"LK",
"AG"
],
"type": "string",
"description": "Where to execute the crawl FROM (device geographic placement). This controls the device's physical location, NOT the content topic — a crawl from Germany fetches the same URL but may see region-specific content (e.g., cookie banners, localized pricing). Accepts meta-regions (NA, EU, APAC, LATAM, MEA) or ISO country codes (US, DE, JP). PREFER meta-regions — they give the placement algorithm more flexibility to find available devices. Use specific country codes only when you need exact country-level placement (e.g., to see local pricing, comply with regional regulations, or access geo-restricted content)."
},
"retries": {
"type": "number",
"description": "Number of speculative retries (default: 2, max: 3). When > 0, a new attempt starts every 7s using a separate device session. First success wins. Default of 2 means up to 3 concurrent sessions per call. Set to 0 for a single attempt."
},
"device_type": {
"enum": [
"mobile",
"desktop"
],
"type": "string",
"description": "Device type to use (default: no constraint)"
},
"timeout_sec": {
"type": "number",
"description": "Timeout in seconds (default: 60, max: 300). For CRAWL_FULL_PAGE, values below 60 are silently raised to 60."
}
}
}Fetch the full content of an MCP resource URI. Use this when you need to read the actual content from a prior tool result and cannot resolve resource URIs natively (most hosted AI environments do not yet support native MCP resource fetching). This tool accepts crawl:// URIs from crawl_fetch responses, sweep:// URIs from verify results, and sitemaps:// URIs from sitemaps_generate results. For crawl_fetch, responses include a summary for quick analysis, plus crawl:// resource URIs pointing to the full content in markdown and HTML formats. When the summary is sufficient, you do not need this tool. When you need the complete page text — to extract specific data, parse tables, read full articles, etc. — pass the resource URI here to get the full content. For crawl_fetch results, use the markdown resource URI unless you specifically need raw HTML structure. Markdown is significantly more compact and easier to work with. For verify results, pass a sweep:// screenshot URI to retrieve the screenshot for visual inspection. For sitemaps_generate results, pass a sitemaps:// URI to read the llms.txt content for a domain or section.
| Argument | Type | Description |
|---|---|---|
| uri* | string | A crawl://, sweep://, or sitemaps:// resource URI from a prior tool response (e.g. crawl://jobId/markdown, sweep://sweepId/region/jobIndex/screenshot, or sitemaps://domainId/llms.txt). |
{
"type": "object",
"required": [
"uri"
],
"properties": {
"uri": {
"type": "string",
"description": "A crawl://, sweep://, or sitemaps:// resource URI from a prior tool response (e.g. crawl://jobId/markdown, sweep://sweepId/region/jobIndex/screenshot, or sitemaps://domainId/llms.txt)."
}
}
}Deprecated: use the verify tool instead. sweep is the old name of verify, kept so existing setups keep working, and will be removed in a later release. It takes the same inputs and returns the same output. Verify a site works: load a URL on real devices in many regions and return status, load speed (Core Web Vitals) and screenshots, plus a shareable report link. Use this after deploying a website or service to verify it is up, responsive, and performing well from different parts of the world. Loads the target URL from multiple regions simultaneously, capturing performance metrics from each check. All checks (regions x tries) run concurrently, so the total operation time is approximately equal to the timeout value. Each completed check returns Core Web Vitals (TTFB, FCP, LCP, CLS), load times, transfer size, and HTTP protocol. Screenshots are captured and available as resource links in the response for visual verification if needed, but can be ignored if you only need the metrics. A run may complete with some failed checks. Inspect the failed_jobs count and per-job error fields in the response to identify issues. If the timeout passes before every region finishes, the checks that did finish are still returned with status "partial"; each region without a completed check has a status ("no_device" when no device in that region was available, otherwise "incomplete") and an "error" saying why. The response includes a "report_url" field with a link to a human-readable report page that can be shared with others for visual review of the results.
| Argument | Type | Description |
|---|---|---|
| url* | string | Target URL to test. |
| tries | number | Number of checks per region (default: 5). All checks across all regions run concurrently. |
| device | string |
Verify a site works: load a URL on real devices in many regions and return status, load speed (Core Web Vitals) and screenshots, plus a shareable report link. Use this after deploying a website or service to verify it is up, responsive, and performing well from different parts of the world. Loads the target URL from multiple regions simultaneously, capturing performance metrics from each check. All checks (regions x tries) run concurrently, so the total operation time is approximately equal to the timeout value. Each completed check returns Core Web Vitals (TTFB, FCP, LCP, CLS), load times, transfer size, and HTTP protocol. Screenshots are captured and available as resource links in the response for visual verification if needed, but can be ignored if you only need the metrics. A run may complete with some failed checks. Inspect the failed_jobs count and per-job error fields in the response to identify issues. If the timeout passes before every region finishes, the checks that did finish are still returned with status "partial"; each region without a completed check has a status ("no_device" when no device in that region was available, otherwise "incomplete") and an "error" saying why. The response includes a "report_url" field with a link to a human-readable report page that can be shared with others for visual review of the results.
| Argument | Type | Description |
|---|---|---|
| url* | string | Target URL to test. |
| tries | number | Number of checks per region (default: 5). All checks across all regions run concurrently. |
| device | string | Device type (default: mobile). Options: mobile, desktop. |
| regions | array |
Fetch transcribed, time-stamped moments for a specific video URL. This is a CURSOR over the video pre-computed sliding-window moments (~30s windows on a ~25s grid, ~5s overlap) -- NOT a summary or sample of a time range. A call returns up to max_moments consecutive windows starting at start_s, in chronological order. To cover a long span you PAGINATE: read a page, then call again with start_s = next_start_s until has_more is false. If the video is not yet indexed, indexing starts automatically and the response tells you how long to wait. Moment text is model-generated from video frames plus verbatim ASR and may contain transcription artifacts. The response includes has_more / next_start_s for pagination and a stable moment_key per moment for dedupe. When following a video_search hit, pass its url, t0, and t1 as the url, start_s, and end_s of this tool. When include_images is set (not "none"), decoded keyframe IMAGES for each moment are returned inline as base64 ImageContent blocks, downscaled to 448px and re-encoded (WebP by default; JPEG if the server is configured with VIDEO_FRAME_FORMAT=jpeg -- the actual format is reported in the frame_format field). The frames_returned / frames_truncated / frame_format fields describe what was delivered so you can narrow scope (fewer moments, or a lower tier) for full fidelity. Frames always follow their moments in order. Only request images if you can view them.
| Argument | Type | Description |
|---|---|---|
| url* | string | Required. Video URL (https:// auto-added). |
| end_s | number | Upper bound of the range. <=0 (default) = a single moment at start_s; >0 = consecutive windows overlapping [start_s, end_s]. |
| start_s | number | Where to start reading / the pagination cursor (default 0). |
| max_moments | number |
Semantic search over indexed video moments. Finds the most relevant moments (time-stamped segments) across indexed videos for a natural-language query. Each result includes the source video, the moment's start/end timestamps, a relevance score, and the moment transcript when available. Results are ordered best-first and limited to the top 10 moments. Each result's url, t0, and t1 are the exact inputs to video_moment (pass them as its url, start_s, and end_s).
| Argument | Type | Description |
|---|---|---|
| tags | object | Optional key/value facet filters. |
| query* | string | Natural-language search query. |
| unique_videos | boolean | Return one (best) result per distinct video instead of per-moment hits (default: true). |
| published_after | number | Only include moments published at or after this unix timestamp (seconds, UTC). |
| order_by_recency | boolean | Sort results newest-first by publish date, with relevance as the tiebreak (default: false). |
| published_before | number | Only include moments published at or before this unix timestamp (seconds, UTC). |
{
"type": "object",
"required": [
"query"
],
"properties": {
"tags": {
"type": "object",
"properties": {},
"description": "Optional key/value facet filters."
},
"query": {
"type": "string",
"description": "Natural-language search query."
},
"unique_videos": {
"type": "boolean",
"description": "Return one (best) result per distinct video instead of per-moment hits (default: true)."
},
"published_after": {
"type": "number",
"description": "Only include moments published at or after this unix timestamp (seconds, UTC)."
},
"order_by_recency": {
"type": "boolean",
"description": "Sort results newest-first by publish date, with relevance as the tiebreak (default: false)."
},
"published_before": {
"type": "number",
"description": "Only include moments published at or before this unix timestamp (seconds, UTC)."
}
}
}Use when other fetch/search tools are blocked, rate-limited, return bot-check pages, or when you need results as a real person in a specific country or on a specific device type sees them. Searches the web with several engines (Bing, DuckDuckGo, Yahoo, plus regional engines) from real devices in real locations, and returns deduplicated results with url, title and description. suggested_countries sets where the search runs FROM, not what it is ABOUT: - Geography is the topic ('Paris hotels', 'history of the Berlin Wall') → keep it in the query and omit suggested_countries. - Geography is the perspective (what Europeans see when searching for beach holidays) → query='best beach destinations', suggested_countries=['EU']. - Both ('what Germans think about Italian food') → query='Italian food', suggested_countries=['EU']. To compare regions, make one call per region; do not combine them in one call. Deduplication can return fewer results than max_results; request 2-3x your target. Results are ordered by relevance, best first: pages ranked highly by several engines or regions come first. Each result has a "score" and the engine/country "sources" that returned it.
| Argument | Type | Description |
|---|---|---|
| query* | string | Search query terms. Include geographic terms only when they describe the TOPIC you are searching for (e.g., 'Tokyo tourist spots,' 'Brazilian coffee'). Do NOT add geographic terms to target a search location — use suggested_countries for that. Query language does not imply search location. |
| max_results | number | Maximum number of results to return (default: 12, max: 50). Actual count may be lower due to cross-source deduplication. |
| num_sources | number | Maximum number of countries to query (default: 5, max: 20). Each country generates sources for all eligible providers, so the actual number of provider+country combinations may be higher. When suggested_countries expands to more countries than this value, the list is sampled down using daylight-aware selection. The server independently sizes the fan-out based on max_results; this parameter controls geographic diversity, not total source count. |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.
| Device type (default: mobile). Options: mobile, desktop. |
| regions | array | Geographic regions to test from: NA (North America), EU (Europe), APAC (Asia Pacific), LATAM (Latin America), MEA (Middle East & Africa). Default: [NA, EU, APAC] — these three regions have the fastest and most reliable device pools. |
| timeout | number | Global timeout in seconds for the entire run (default: 60). All checks run concurrently, so total wall-clock time is approximately this value. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Target URL to test."
},
"tries": {
"type": "number",
"description": "Number of checks per region (default: 5). All checks across all regions run concurrently."
},
"device": {
"enum": [
"mobile",
"desktop"
],
"type": "string",
"description": "Device type (default: mobile). Options: mobile, desktop."
},
"regions": {
"type": "array",
"items": {
"enum": [
"NA",
"EU",
"APAC",
"LATAM",
"MEA"
],
"type": "string"
},
"description": "Geographic regions to test from: NA (North America), EU (Europe), APAC (Asia Pacific), LATAM (Latin America), MEA (Middle East & Africa). Default: [NA, EU, APAC] — these three regions have the fastest and most reliable device pools."
},
"timeout": {
"type": "number",
"description": "Global timeout in seconds for the entire run (default: 60). All checks run concurrently, so total wall-clock time is approximately this value."
}
}
}| Geographic regions to test from: NA (North America), EU (Europe), APAC (Asia Pacific), LATAM (Latin America), MEA (Middle East & Africa). Default: [NA, EU, APAC] — these three regions have the fastest and most reliable device pools. |
| timeout | number | Global timeout in seconds for the entire run (default: 60). All checks run concurrently, so total wall-clock time is approximately this value. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Target URL to test."
},
"tries": {
"type": "number",
"description": "Number of checks per region (default: 5). All checks across all regions run concurrently."
},
"device": {
"enum": [
"mobile",
"desktop"
],
"type": "string",
"description": "Device type (default: mobile). Options: mobile, desktop."
},
"regions": {
"type": "array",
"items": {
"enum": [
"NA",
"EU",
"APAC",
"LATAM",
"MEA"
],
"type": "string"
},
"description": "Geographic regions to test from: NA (North America), EU (Europe), APAC (Asia Pacific), LATAM (Latin America), MEA (Middle East & Africa). Default: [NA, EU, APAC] — these three regions have the fastest and most reliable device pools."
},
"timeout": {
"type": "number",
"description": "Global timeout in seconds for the entire run (default: 60). All checks run concurrently, so total wall-clock time is approximately this value."
}
}
}| PAGE SIZE -- max windows returned per call (default 5; hard cap 10). Bounds how far FORWARD you read (~max_moments x 25s); it does NOT sample the whole range -- paginate for more. |
| include_images | string | Return decoded keyframe IMAGES for each moment inline (base64, downscaled to 448px; re-encoded as WebP by default or JPEG per server config -- check frame_format in the response for the actual format). Frames follow their moments in order. Only request images if you can view them. - none (default): text moments only. - hero: 1 anchoring frame per moment (the keyframe near its start). - summary: ~3 evenly-sampled frames per moment. - full: all available frames per moment. For ANY non-none tier, the total number of frames across the whole response is capped to 8 (after per-tier selection). When the cap trims frames, frames_truncated is set -- narrow scope (fewer moments or a lower tier) for true full fidelity. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Required. Video URL (https:// auto-added)."
},
"end_s": {
"type": "number",
"description": "Upper bound of the range. <=0 (default) = a single moment at start_s; >0 = consecutive windows overlapping [start_s, end_s]."
},
"start_s": {
"type": "number",
"description": "Where to start reading / the pagination cursor (default 0)."
},
"max_moments": {
"type": "number",
"description": "PAGE SIZE -- max windows returned per call (default 5; hard cap 10). Bounds how far FORWARD you read (~max_moments x 25s); it does NOT sample the whole range -- paginate for more."
},
"include_images": {
"enum": [
"none",
"hero",
"summary",
"full"
],
"type": "string",
"description": "Return decoded keyframe IMAGES for each moment inline (base64, downscaled to 448px; re-encoded as WebP by default or JPEG per server config -- check frame_format in the response for the actual format). Frames follow their moments in order. Only request images if you can view them.\n- none (default): text moments only.\n- hero: 1 anchoring frame per moment (the keyframe near its start).\n- summary: ~3 evenly-sampled frames per moment.\n- full: all available frames per moment.\nFor ANY non-none tier, the total number of frames across the whole response is capped to 8 (after per-tier selection). When the cap trims frames, frames_truncated is set -- narrow scope (fewer moments or a lower tier) for true full fidelity."
}
}
}| suggested_countries | array | Where to search FROM (the searcher's geographic perspective), NOT what to search ABOUT. When omitted, the server automatically selects optimal countries for broad global coverage — this is the correct default for most queries that do not require a specific regional perspective. Only set this parameter when you need results from a particular region's point of view. Accepts meta-regions (NA, EU, APAC, LATAM, MEA) or ISO country codes. ALWAYS PREFER meta-regions for regional perspectives — they give the scheduler more flexibility and better cache hit rates. Only use specific country codes when the query demands country-level precision (e.g., country-specific law, language-specific content, or data that varies within a region). Do NOT mix meta-regions and country codes in a single call. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"description": "Search query terms. Include geographic terms only when they describe the TOPIC you are searching for (e.g., 'Tokyo tourist spots,' 'Brazilian coffee'). Do NOT add geographic terms to target a search location — use suggested_countries for that. Query language does not imply search location."
},
"max_results": {
"type": "number",
"description": "Maximum number of results to return (default: 12, max: 50). Actual count may be lower due to cross-source deduplication."
},
"num_sources": {
"type": "number",
"description": "Maximum number of countries to query (default: 5, max: 20). Each country generates sources for all eligible providers, so the actual number of provider+country combinations may be higher. When suggested_countries expands to more countries than this value, the list is sampled down using daylight-aware selection. The server independently sizes the fan-out based on max_results; this parameter controls geographic diversity, not total source count."
},
"suggested_countries": {
"type": "array",
"items": {
"enum": [
"NA",
"EU",
"APAC",
"LATAM",
"MEA",
"US",
"GB",
"CA",
"AU",
"DE",
"FR",
"JP",
"CN",
"IN",
"BR",
"MX",
"ES",
"IT",
"NL",
"SE",
"NO",
"DK",
"FI",
"PL",
"RU",
"KR",
"SG",
"HK",
"TW",
"TH",
"VN",
"ID",
"MY",
"PH",
"ZA",
"AE",
"SA",
"IL",
"TR",
"AR",
"CL",
"CO",
"NZ",
"IE",
"CH",
"AT",
"BE",
"PT",
"CZ",
"RO",
"HU",
"GR",
"UA",
"EG",
"RS",
"AM",
"AL",
"BG",
"CY",
"DZ",
"IQ",
"KE",
"NG",
"PA",
"SK",
"TT",
"LK",
"AG"
],
"type": "string"
},
"description": "Where to search FROM (the searcher's geographic perspective), NOT what to search ABOUT. When omitted, the server automatically selects optimal countries for broad global coverage — this is the correct default for most queries that do not require a specific regional perspective. Only set this parameter when you need results from a particular region's point of view. Accepts meta-regions (NA, EU, APAC, LATAM, MEA) or ISO country codes. ALWAYS PREFER meta-regions for regional perspectives — they give the scheduler more flexibility and better cache hit rates. Only use specific country codes when the query demands country-level precision (e.g., country-specific law, language-specific content, or data that varies within a region). Do NOT mix meta-regions and country codes in a single call."
}
}
}