{"server":{"name":"com.replynodes/mcp","_meta":{"io.modelcontextprotocol.registry/publisher-provided":{"pricing":"https://replynodes.com/pricing","homepage":"https://replynodes.com","capabilities":["web-extraction","web-crawling","website-map","web-search","brand-retrieval","brand-search","brand-assets","brand-fonts","brand-styleguide","app-store","google-play","youtube","youtube-transcripts","reddit","hacker-news"],"documentation":"https://docs.replynodes.com/docs/mcp","authentication":"Bearer API key required for production tool calls"}},"icons":[{"src":"https://mcp.replynodes.com/favicon.svg","sizes":["any"],"mimeType":"image/svg+xml"}],"title":"ReplyNodes","$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","remotes":[{"url":"https://mcp.replynodes.com/mcp","type":"streamable-http","headers":[{"name":"Authorization","isSecret":true,"isRequired":true,"description":"ReplyNodes API key sent as a Bearer token for authenticated access."}]}],"version":"1.0.3","repository":{"url":"https://github.com/replynodes/replynodes-mcp","source":"github"},"websiteUrl":"https://replynodes.com/mcp","description":"Web MCP: scrape/crawl sites, web search, brand assets, app stores, YouTube, Reddit, Hacker News."},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-09-15T14:01:55.885959Z","publishedAt":"2026-09-15T14:01:55.885959Z","statusChangedAt":"2026-09-15T14:01:55.885959Z"},"dev.protogrid/connectability":{"class":"R1","autonomous":true,"human_steps":[],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://mcp.replynodes.com/mcp","transport":"streamable-http","templated":false,"headers":[{"name":"Authorization","required":true,"secret":true,"value":null,"secret_names":["REPLYNODES_TOKEN"]}],"auth":{"type":"api_key","location":null,"secret_name":"REPLYNODES_TOKEN","oauth":null},"protocol":{"supported_versions":["2026-07-28"],"stateless":true},"health":{"reachable":true,"uptime_30d":0.91588783,"latency_ms_p50":1662,"consecutive_failures":0,"last_probe_at":"2026-10-19T14:41:33.832Z","last_ok_at":"2026-10-19T14:41:33.832Z"}}],"packages":[]},"dev.protogrid/tools":[{"name":"anonymous_brand","title":null,"description":"Read public brand intelligence\n\nAlready-anonymous Brand gateway route for canonical capability brand-kit (fixed Tier A: 20 valid requests per trusted client-IP bucket per UTC calendar day). Domain validation occurs before admission; cache hits and upstream failures consume one unit. X-RateLimit-Limit is the effective fixed tier limit, X-RateLimit-Remaining is the capability bucket balance, and X-RateLimit-Reset is the next UTC midnight Unix timestamp.\n\nHTTP: GET /{domain}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"anonymous_company_research","title":null,"description":"Run the anonymous company-research workflow\n\nTop-level anonymous company-research workflow for canonical capability company-research (fixed Tier C: 3 valid requests per trusted client-IP bucket per UTC calendar day). A valid request is admitted once, before the read-only server-side fan-out; the url-to-markdown, brand-kit, and brand-logo primitives composed inside the workflow are server-owned and never charged a second anonymous bucket. Malformed input is rejected before admission; admitted provider failures consume one unit. X-RateLimit-Limit is 3, X-RateLimit-Remaining is the Tier C bucket balance, and X-RateLimit-Reset is the next UTC midnight Unix timestamp. Redis failure returns 503 degraded.\n\nHTTP: GET /v1/company-research","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"anonymous_competitor_research","title":null,"description":"Run the anonymous competitor-research workflow\n\nTop-level anonymous competitor-research workflow for canonical capability competitor-research (fixed Tier C: 3 valid requests per trusted client-IP bucket per UTC calendar day). One admitted request fans out read-only to the company domain plus up to 5 competitor domains; the whole composition is charged once and primitives are never charged a second anonymous bucket. Malformed input (missing/invalid domain, empty/invalid/oversized competitor list) is rejected before admission. See /v1/company-research for the shared quota-header contract.\n\nHTTP: GET /v1/competitor-research","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"anonymous_markdown","title":null,"description":"Read a public URL as Markdown\n\nAlready-anonymous Markdown gateway route for canonical capability url-to-markdown (dedicated Markdown tier: 100 valid requests per trusted client-IP bucket per UTC calendar day). Admission occurs after method and target/SSRF validation and before cache/upstream work; cache hits and upstream failures consume one unit. X-RateLimit-Limit is the effective fixed tier limit, X-RateLimit-Remaining is the capability bucket balance, and X-RateLimit-Reset is the next UTC midnight Unix timestamp. Redis failure returns 503 degraded. Output format is chosen with request headers because the whole path and query string belong to the target URL: no Accept header, Accept: */*, text/markdown or text/plain returns Markdown (default); Accept: application/json (JSON preferred with q>0) returns the {data, meta} envelope with the same data shape as GET /v1/webcontext/scrape; X-Format: frontmatter returns Markdown preceded by a fixed seven-key YAML front-matter block; an unknown X-Format value, or application/json together with X-Format: frontmatter, returns 400 invalid_request with reason bad_option before any quota is spent. X-Include-Selectors and X-Exclude-Selectors (comma-separated CSS selectors, at most 10 entries and 512 bytes per header, duplicates removed, no control characters or { } ; < >) filter the page; they are part of the cache key; with selectors set, a page that returns an access-check page returns 502 upstream_blocked (no crawl fallback). A page main heading may remain even when it matches an exclude selector. Every error response of this host carries error.reason (a stable value from the closed set in the MarkdownHostError schema) and error.retryable in addition to error.code, error.message and error.request_id. Successful responses set Vary: Accept, X-Format.\n\nHTTP: GET /md/{target}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"app","title":null,"description":"Look up one public App Store application\n\nLook up one public App Store application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/appstore/app","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"brand_fonts","title":null,"description":"Get Fonts\n\nExtract the typography and font stack of a website by domain or URL.\n\nHTTP: GET /v1/brand/fonts","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"brand_logo","title":null,"description":"Get Brand Logo\n\nFetch the brand logo kit for one company domain: primary logo URL, candidate logo variants, favicon, and og_image.\n\nHTTP: GET /v1/brand/logo","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"brand_retrieve","title":null,"description":"Retrieve Brand\n\nResolve the full brand profile of a company by domain, or extract brand details from one specific page URL: name, description, primary logo, logos, colors, fonts, social links, favicon, and og_image.\n\nHTTP: GET /v1/brand/retrieve","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"brand_search","title":null,"description":"Search Brand\n\nFuzzy brand or company search by name or domain; returns up to 10 lightweight matches with domain, name, and logo.\n\nHTTP: GET /v1/brand/search","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"brand_styleguide","title":null,"description":"Get Styleguide\n\nExtract the design system of a website by domain or URL: colors, typography, spacing, and more.\n\nHTTP: GET /v1/brand/styleguide","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"developer","title":null,"description":"List applications by developer\n\nList applications by developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/appstore/developer","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"get_company_events","title":null,"description":"List Company Changes events for an Entity\n\nLists Events for a domain when the organization has a current or retained Watch topic subscription; unentitled Entities return 404.\n\nHTTP: GET /v1/entities/{domain}/events","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"get_company_history","title":null,"description":"Retrieve entitled Entity topic history\n\nReturns retained canonical topic history for an entitled Entity, including history older than a Watch; unentitled access returns 404.\n\nHTTP: GET /v1/entities/{domain}/history/{topic}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"get_company_intelligence","title":null,"description":"Retrieve entitled Company Changes intelligence\n\nReturns only entitled topic state and recent events plus shared coverage, never internal Entity scheduling.\n\nHTTP: GET /v1/intelligence/{domain}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"get_fetcher_healthz","title":null,"description":"Health check\n\nHTTP: GET /fetcher/healthz","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"get_fetcher_readyz","title":null,"description":"Readiness (auth/db status)\n\nHTTP: GET /fetcher/readyz","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"get_gateway_capabilities","title":null,"description":"Get gateway capabilities\n\nUnauthenticated, read-only discovery of the gateway-wide provider inventory, routes currently callable under their provider manifests, and the embedded OpenAPI document. Callable discovery is a runtime snapshot, not authorization or billing state.\n\nHTTP: GET /v1/capabilities","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"get_recent_company_events","title":null,"description":"List entitled Company Changes events\n\nLists canonical Events covered by the organization's current or retained Watch topic subscriptions.\n\nHTTP: GET /v1/events","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"get_v1_hackernews_capabilities","title":null,"description":"List available operations\n\nHTTP: GET /v1/hackernews/capabilities","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"googleplay_app_details","title":null,"description":"Fetch a single Google Play app's public detail record\n\nFetch a single Google Play app's public detail record. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/googleplay/app_details/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"googleplay_availability","title":null,"description":"Fetch a Google Play app's per-storefront availability\n\nFetch a Google Play app's per-storefront availability. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/googleplay/availability/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"googleplay_categories","title":null,"description":"List available Google Play category identifiers\n\nList available Google Play category identifiers. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/googleplay/categories","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"googleplay_category_apps","title":null,"description":"Fetch top public apps in a Google Play category\n\nFetch top public apps in a Google Play category. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/googleplay/category_apps/{category}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"googleplay_data_safety","title":null,"description":"Fetch a Google Play app's declared data-safety disclosure\n\nFetch a Google Play app's declared data-safety disclosure. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/googleplay/data_safety/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"googleplay_developer","title":null,"description":"Fetch public apps published by a Google Play developer\n\nFetch public apps published by a Google Play developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/googleplay/developer","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"googleplay_permissions","title":null,"description":"Fetch a Google Play app's declared permissions\n\nFetch a Google Play app's declared permissions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/googleplay/permissions/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"googleplay_reviews","title":null,"description":"Fetch public reviews for a Google Play app\n\nFetch public reviews for a Google Play app. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/googleplay/reviews/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"googleplay_search","title":null,"description":"Search public Google Play applications by term\n\nSearch public Google Play applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/googleplay/search","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"googleplay_similar_apps","title":null,"description":"Fetch apps similar to a given Google Play package\n\nFetch apps similar to a given Google Play package. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/googleplay/similar_apps/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"googleplay_suggest","title":null,"description":"Fetch Google Play search-term suggestions\n\nFetch Google Play search-term suggestions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/googleplay/suggest","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"hackernews_item","title":null,"description":"Fetch a single Hacker News item and its comment tree\n\nFetch a single Hacker News item and its comment tree. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/hackernews/item/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"hackernews_search","title":null,"description":"Search Hacker News via Algolia\n\nSearch Hacker News via Algolia. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/hackernews/search","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"hackernews_stories_ask","title":null,"description":"Fetch current Ask HN stories\n\nFetch current Ask HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/hackernews/stories_ask","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"hackernews_stories_best","title":null,"description":"Fetch current Hacker News best stories\n\nFetch current Hacker News best stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/hackernews/stories_best","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"hackernews_stories_job","title":null,"description":"Fetch current Hacker News job postings\n\nFetch current Hacker News job postings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/hackernews/stories_job","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"hackernews_stories_new","title":null,"description":"Fetch current Hacker News new stories\n\nFetch current Hacker News new stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/hackernews/stories_new","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"hackernews_stories_show","title":null,"description":"Fetch current Show HN stories\n\nFetch current Show HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/hackernews/stories_show","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"hackernews_stories_top","title":null,"description":"Fetch current Hacker News top stories\n\nFetch current Hacker News top stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/hackernews/stories_top","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"hackernews_user","title":null,"description":"Fetch a public Hacker News user profile\n\nFetch a public Hacker News user profile. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/hackernews/user/{handle}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"list","title":null,"description":"List applications from an iTunes collection\n\nList applications from an iTunes collection. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/appstore/list","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"monitor_changes","title":null,"description":"List monitor changes\n\nHTTP: GET /v1/monitors/{id}/changes","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"monitor_create","title":null,"description":"Create a monitor asynchronously\n\nHTTP: POST /v1/monitors","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"monitor_get","title":null,"description":"Get a monitor\n\nHTTP: GET /v1/monitors/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"monitor_list","title":null,"description":"List monitors for the authenticated organization\n\nHTTP: GET /v1/monitors","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"monitor_runs","title":null,"description":"List monitor runs\n\nHTTP: GET /v1/monitors/{id}/runs","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"monitor_update","title":null,"description":"Update frequency, pause state, or webhook\n\nUpdate frequency, pause state, or webhook configuration. The change is recorded immediately in the monitor service database (scheduling authority) and the external changedetection watch is reconciled asynchronously and with bounded retries; the response monitor object carries sync_state/sync_next_retry_at/sync_error_reason so a degraded engine (for example, a failed pause) is truthful and visible rather than silently dropped.\n\nHTTP: PATCH /v1/monitors/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"post_by_id","title":null,"description":"HTTP: GET /v1/reddit/post_by_id/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"post_by_permalink","title":null,"description":"HTTP: GET /v1/reddit/post_by_permalink","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"privacy","title":null,"description":"Read public App Store privacy details\n\nRead public App Store privacy details. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/appstore/privacy","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"ratings","title":null,"description":"Read public app ratings\n\nRead public app ratings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/appstore/ratings","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"read_document","title":null,"description":"Read a public PDF as Markdown for AI agents\n\nDirect public HTTP POST to https://pdf.replynodes.com/ requires no account, API key, or cookie. POST converts one public PDF URL to Markdown. GET and HEAD on the root are documentation-only; allowed methods are GET, HEAD, POST. This PDF to Markdown response is designed for read PDF, PDF for AI agents, extract PDF text, and PDF context workflows. The MCP read_document / tools/call at https://mcp.replynodes.com/mcp requires the existing MCP authorization boundary; MCP is not anonymous. Limits: 10 MiB source/download, 50 pages, 60 seconds, 20 conversions/IP/hour, 2 active conversions/IP, and a maximum encoded JSON response of 1 MiB including the trailing newline. MCP discovery identifies the sole read_document tool at https://mcp.replynodes.com/mcp.\n\nHTTP: POST https://pdf.replynodes.com/","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"reviews","title":null,"description":"Read a page of public app reviews\n\nRead a page of public app reviews. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/appstore/reviews","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"search","title":null,"description":"Search public App Store applications by term\n\nSearch public App Store applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/appstore/search","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"search_posts","title":null,"description":"HTTP: GET /v1/reddit/search_posts","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"similar","title":null,"description":"List apps related to an application\n\nList apps related to an application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/appstore/similar","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"subreddit_posts","title":null,"description":"HTTP: GET /v1/reddit/subreddit_posts/{subreddit}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"suggest","title":null,"description":"Suggest public App Store search terms\n\nSuggest public App Store search terms. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.\n\nHTTP: GET /v1/appstore/suggest","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"user_activity","title":null,"description":"HTTP: GET /v1/reddit/user_activity/{username}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"user_posts","title":null,"description":"HTTP: GET /v1/reddit/user_posts/{username}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"webcontext_brand","title":null,"description":"Extract public brand identity for a site\n\nLightweight brand snapshot for one site URL: logos, colors, fonts, and basic public metadata. Prefer brand_retrieve for a fuller normalized brand profile or brand_search for fuzzy company-name discovery.\n\nHTTP: GET /v1/webcontext/brand","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"webcontext_crawl","title":null,"description":"Crawl same-origin links from a URL\n\nCrawl same-origin links starting from a URL and return normalized page results. max_pages/max_depth are clamped server-side regardless of the requested value.\n\nHTTP: GET /v1/webcontext/crawl","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"webcontext_map","title":null,"description":"Discover URLs belonging to a site\n\nDiscover URLs belonging to a site without extracting page content. Results are deduplicated.\n\nHTTP: GET /v1/webcontext/map","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"webcontext_scrape","title":null,"description":"Fetch one URL as clean Markdown\n\nFetch one URL and return clean, main-content Markdown plus normalized metadata, links, and images. Backed by a privately deployed webclaw-server instance; upstream implementation details are never exposed.\n\nHTTP: GET /v1/webcontext/scrape","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"web_search","title":null,"description":"Search the public web\n\nSearch the public web through the normalized Web Search provider contract.\n\nHTTP: GET /v1/web/search","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"youtube_channel","title":null,"description":"HTTP: GET /v1/youtube/channel/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"youtube_comments","title":null,"description":"HTTP: GET /v1/youtube/comments/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"youtube_playlist","title":null,"description":"HTTP: GET /v1/youtube/playlist/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"youtube_related","title":null,"description":"HTTP: GET /v1/youtube/related/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"youtube_search","title":null,"description":"HTTP: GET /v1/youtube/search","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"youtube_transcript","title":null,"description":"HTTP: GET /v1/youtube/transcript/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"},{"name":"youtube_video","title":null,"description":"HTTP: GET /v1/youtube/video/{id}","annotations":null,"source":"probe","observed_at":"2026-10-19T14:41:33.832Z"}],"dev.protogrid/trust":{"score":96,"components":{"hygiene":100,"liveness":97,"freshness":85,"provenance":100},"drivers":["+repository","+namespace-matches-repo","+dns-namespace","+website","+reachable","+uptime-92%","~updated-34d-ago"],"flags":[],"blocked":false,"computed_at":"2026-10-19T20:04:24.025Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":58,"label":"needs work","components":{"auth":null,"hygiene":50,"protocol":88,"stability":25,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"supports 2026-07-28 (server/discover)","status":"pass","category":"protocol"},{"id":"protocol.stateless","detail":"answers without a session","status":"pass","category":"protocol"},{"id":"protocol.transport","detail":"streamable HTTP","status":"pass","category":"protocol"},{"id":"protocol.list_ttl","detail":"tools/list declares ttlMs 0, so clients re-fetch it on every use","status":"warn","category":"protocol"},{"id":"auth.prm","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.as_metadata","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.cimd","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"1 tools have descriptions over 1,024 characters, which crowds the context","status":"warn","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones","status":"fail","category":"hygiene"},{"id":"tools.directory_hints","detail":"no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: user_activity (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); youtube_comments (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); brand_fonts (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …","status":"fail","category":"hygiene"},{"id":"tools.token_cost","detail":"about 584,771 tokens to load every tool, a large share of an agent's context","status":"fail","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"399 tool changes in 30 days","status":"warn","category":"stability"},{"id":"stability.rug_pull","detail":"2 tools kept their name but changed most of their description in 30 days; review before trusting them","status":"fail","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["-tools.annotations","-tools.directory_hints","-tools.token_cost","-stability.rug_pull","~protocol.list_ttl","~tools.description_length","~stability.changes"],"flags":[],"tool_count":71,"token_estimate":584771,"tools_hash":"4546081f1e37a2c38f9686a1a1c759b4","tools_changed_at":"2026-10-18T14:39:32.141Z","computed_at":"2026-10-19T20:06:07.665Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"com.replynodes/mcp","aliases":["io.github.replynodes/mcp"],"alias_count":1,"repository_key":"github:replynodes/replynodes-mcp","owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/com.replynodes%2Fmcp/tools","arguments":{"name":"com.replynodes/mcp"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/com.replynodes%2Fmcp/connection?target=mcpServers","arguments":{"name":"com.replynodes/mcp","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}