{"name":"com.igods/gvt","slug":"igods-gvt","title":"iGods GEO Visibility Tool (GVT)","description":"GEO visibility tests, score trends, sitemap discovery, and domain monitoring for AI agents.","url":"https://mcp.market/server/igods-gvt","rating":null,"grade":"C","score":60,"certified":false,"status":"active","category":"seo","tags":["seo","maps"],"presence":{"score":8,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":{"percent":100,"checks":2,"ok":2,"last_checked_at":"2026-09-19T21:30:49.139Z","last_ok_at":"2026-09-19T21:30:49.139Z","latency_ms":252},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/CameronKnowlton/gvt-mcp","website":"https://geo.igods.com","version":"0.3.1","remotes":[{"type":"streamable-http","url":"https://mcp.geo.igods.com/mcp"}],"packages":[],"tools":[{"name":"gvt_delete_test","description":"Permanently delete a test session and all its associated results. This action cannot be undone. Use gvt_set_test_visibility instead if you only want to hide a test from public view. Deleting a test does not delete its schedule (if one exists): recurring runs continue until removed via gvt_schedule_test delete mode.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"tid":{"type":"string","description":"The 8-character test ID of the test to delete."}},"required":["tid"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_get_baseline","description":"Get the oldest baseline test snapshot for a single URL, including expired tests. For pre-computed baseline-vs-latest deltas without fetching full snapshots, use gvt_get_score_trend instead; for baselines across many URLs in one call, use gvt_list_baselines. Use with gvt_get_latest to compare baseline vs current when you need the full snapshot detail on both ends. The url must be passed exactly as the test was run — matching is exact string equality (scheme, host, path, trailing slash), not nearest-match. When unsure of the recorded form, discover it with gvt_list_tests first.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"The URL to look up (must match the URL used when the test was run)."}},"required":["url"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_get_batch_status","description":"Retrieves the current progress, state, and test IDs (tids) of an ongoing or completed visibility testing batch. Poll this tool with the batchId returned by gvt_run_visibility_batch until status is completed or failed. A tid appears on each URL entry only after its test completes — then call gvt_get_batch_summary for the compact per-page scores and top shared issues, or gvt_get_test_results for a single test. Batch records are retained for the lifetime of the account (no automated pruning); an unknown, pruned, or foreign batchId returns 404. Read-only: consumes rate limit, never test credits. Duplicate URLs in a batch are collapsed, so counts always sum to totalUrls.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"batchId":{"type":"string","format":"uuid","description":"The UUID of the batch to check, returned by gvt_run_visibility_batch."}},"required":["batchId"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_get_batch_summary","description":"Compact per-page results and pre-computed aggregates for a completed visibility testing batch: per-URL overall and category scores, findingSentence, average overall score, strongest and weakest categories, best and worst scoring pages, and the top shared issue types with their fixIds. One call replaces one gvt_get_test_results call per URL for audit and status-report workflows — a 10-URL batch drops from roughly 1.6 MB to a few KB of context. The batch must be completed (poll gvt_get_batch_status first); an in-flight batch returns its current status without per-page data. Read-only: consumes rate limit, never test credits. For element-level detail on a single page, call gvt_get_test_results with that page's tid.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"batchId":{"type":"string","format":"uuid","description":"The UUID of the completed batch to summarize, returned by gvt_run_visibility_batch."}},"required":["batchId"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_get_fix","description":"Read the canonical fix record for one GVT issue type: severity range, impact, scoring weight, plain-language description, and the recommended remediation. Issue IDs come from the fixId field on issues in gvt_get_test_results output. The same content is served as the gvt://knowledge/fixes/{issue_id} resource template for resource-capable clients. Copy fixId verbatim from the results output — unknown or mistyped IDs return not-found rather than a fuzzy match. Responses are static reference content and cacheable.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"issue_id":{"type":"string","description":"Stable issue identifier, e.g. og_title_missing or color-contrast. Matches the fixId field in gvt_get_test_results output."}},"required":["issue_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_get_knowledge","description":"Read GVT reference knowledge: how scoring works, score bands and category weights, what each analysis category checks, or GEO glossary definitions. Use it to interpret test results and scores correctly instead of guessing. The topic is matched exactly and case-sensitively (Methodology will not match methodology); unrecognized values fail fast with the valid list. The same content is served as MCP resources at gvt://knowledge/app/* for resource-capable clients.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"topic":{"type":"string","enum":["all","methodology","scoring","categories","glossary"],"default":"all","description":"Which knowledge topic to read: methodology (how GVT analyzes pages), scoring (score bands and category weights), categories (what each of the six categories checks), glossary (GEO term definitions), or all (complete knowledge base)."}},"required":[],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_get_latest","description":"Get the most recent non-expired test snapshot for a single URL. For pre-computed baseline-vs-latest deltas without fetching full snapshots, use gvt_get_score_trend instead. Use with gvt_get_baseline to compare baseline vs current when you need the full snapshot detail on both ends. The url must be passed exactly as the test was run — matching is exact string equality, not nearest-match; an unrecorded URL returns 404. Considers only the authenticated caller's own non-expired tests.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"The URL to look up (must match the URL used when the test was run)."}},"required":["url"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_get_prompt","description":"Render a GVT prompt workflow with concrete argument values, returning the complete step-by-step instruction text ready to follow. Also returns the effective arguments that were bound (provided values plus defaults for omitted optionals). Prompt names and their arguments come from gvt_list_prompts; an unknown name or argument key errors rather than guessing. The rendered text references GVT tools by name — call them as instructed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"Prompt name from gvt_list_prompts, e.g. gvt_setup_domain_monitoring."},"arguments":{"type":"object","additionalProperties":{"type":"string"},"description":"Argument values for the prompt, keyed by argument name (e.g. {\"domain\": \"example.com\", \"frequency\": \"weekly\"}). Omit optional arguments to use their defaults."}},"required":["name"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_get_score_trend","description":"Compare the oldest baseline vs the latest non-expired test for a single URL or an entire domain, with pre-computed per-category deltas (latest minus baseline). Provide exactly one of url or domain. Domain mode matches the exact domain, www.<domain>, and subdomains (alphabetical, capped by limit). Page through the whole domain with offset: offset=0 for the first page, offset=limit for the second, following hasMore/nextOffset. Returns scores and deltas only, not full snapshot detail; for complete snapshots of one URL use gvt_get_baseline and gvt_get_latest. This replaces paging the full test history and computing comparisons client-side, one call per site.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"Single URL scope (XOR with domain)."},"domain":{"type":"string","description":"Domain scope — matches the domain, www.<domain>, and subdomains (XOR with url)."},"limit":{"type":"integer","maximum":100,"default":25,"description":"Cap on returned records in domain mode (max 100, default 25)."},"offset":{"type":"integer","minimum":0,"default":0,"description":"Number of matched URLs to skip in domain mode (row skip, not a page number). Use offset=0 for the first page, offset=limit for the second. Ignored in single-URL mode."}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_get_test_results","description":"Get results for a visibility test by tid: overall scores, findingSentence, shareableTid, and per-category resultData. The tid is an opaque 8-character HashID — copy it verbatim from gvt_run_visibility_test, gvt_list_tests, or gvt_get_batch_status; partial or reformatted values will not match, and results are scoped to the caller's own tests. If status is \"pending\" or \"running\", wait and retry. findingSentence is a pre-generated natural-language verdict; use it as the primary summary. shareableTid is non-null when the result is public and linkable. detail selects the payload shape: \"summary\" (recommended for reporting workflows) returns analysisSummary plus the top issues per category without the semantic tree, per-element markup, or the nojs_rendered duplicate pass; \"full\" (the default) returns complete per-category resultData for all 7 analysis types (heading, semantic, accessibility, schema, javascript, nojs, social). For compact per-page scores across a whole completed batch, prefer gvt_get_batch_summary instead of one call per tid.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tid":{"type":"string","description":"Opaque 8-character hash ID returned by gvt_run_visibility_test or gvt_list_tests. Not an integer."},"detail":{"type":"string","enum":["summary","full"],"default":"full","description":"Payload shape. summary: analysisSummary plus the top issues per category (deduplicated by type, capped at 10, sorted by severity then weight) — no semantic tree, per-element markup, or nojs_rendered pass. full: complete resultData for all analysis types (previous behavior, the default)."}},"required":["tid"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_list_baselines","description":"Get the oldest baseline test snapshots for a batch of URLs (up to 100) in a single call. Each result includes the URL and its oldest test object (null if no test exists for that URL). For a single URL use gvt_get_baseline; for pre-computed baseline-vs-latest deltas use gvt_get_score_trend. This bulk form is ideal for monthly/periodic batch comparisons: fetch baselines in bulk here, then call gvt_get_latest per URL. One call replaces up to 100 gvt_get_baseline calls; split larger URL sets into consecutive calls of at most 100. Order of results follows the submitted order.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"urls":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"string"},"description":"Array of URLs to look up (max 100)."}},"required":["urls"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_list_prompts","description":"List the GVT prompt workflows: user-invocable recipes that chain GVT tools into complete tasks (check a page, review a monthly batch, analyze regressions, verify fixes, set up domain monitoring, report client status). Each entry lists its arguments. Use gvt_get_prompt to render a prompt with concrete argument values, then follow the rendered instructions to run the workflow. This catalog is static and costs nothing to call on every session start — it never queues tests or consumes credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_list_schedules","description":"Retrieves the paginated roster of the authenticated caller's test monitoring schedules, allowing filtering by domain, frequency, and status. This is the only way to discover existing schedules and their schids, which the pause/resume/cancel/change_frequency modes of gvt_schedule_test require. Completed one-off rows are hidden by default: batch runs create a throwaway once row per queued URL, so include them only with includeCompletedOnce true. The row's tid is deliberately not surfaced (it is often stale); use gvt_list_tests or gvt_get_latest for test result lookups. Read-only: consumes rate limit, never test credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":100,"default":25,"description":"The maximum number of schedules requested for this page."},"offset":{"type":"integer","minimum":0,"default":0,"description":"The number of skipped items from the beginning of the result set."},"domain":{"type":"string","description":"Filter to schedules matching this domain substring."},"includeSubdomains":{"type":"boolean","default":true,"description":"Whether subdomains should be included in the domain filter match."},"frequency":{"type":"string","enum":["daily","weekly","monthly","once"],"description":"Filter by repetition interval."},"status":{"type":"string","enum":["active","paused","completed"],"description":"Filter by the derived overall state of the schedule."},"includeCompletedOnce":{"type":"boolean","default":false,"description":"Whether to include completed one-off schedules in the results. Hidden by default because batch runs create a throwaway once row per queued URL; include them only when investigating batch history."},"sortDirection":{"type":"string","enum":["asc","desc"],"default":"desc","description":"Sort order by creation time; desc is newest first."}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_list_sitemap_urls","description":"Discovers and ranks URLs from a domain's XML sitemaps to find the most significant pages (homepages, product pages, recently updated content) before analyzing them. Supports URL-pattern filtering and automatically flags robots.txt-blocked and already-tested pages. Legal/policy boilerplate (privacy, terms, cookies, disclaimers, refunds) is flagged legalPage:true with a -25 significance penalty; use the legalPages filter to drop it (exclude) or isolate it for a policy-coverage audit (only). Parameters group into three jobs: discovery (url), ranking and paging (limit, sort), and filtering (include and exclude URL patterns, excludeDisallowed, excludeTested, excludeScheduled, legalPages).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"The target website URL or an explicit sitemap .xml URL."},"limit":{"type":"integer","minimum":1,"maximum":500,"default":10,"description":"Maximum number of URLs to return (default 10)."},"sort":{"type":"string","enum":["significance","lastmod","alphabetical","document"],"default":"significance","description":"How to sort the discovered URLs. 'significance' uses SEO heuristics."},"include":{"type":"array","items":{"type":"string"},"description":"Wildcard patterns to require (e.g., '*blog*'). Only '*' wildcards are supported."},"exclude":{"type":"array","items":{"type":"string"},"description":"Wildcard patterns to reject (e.g., '*archive*')."},"excludeDisallowed":{"type":"boolean","default":false,"description":"If true, silently drops URLs that are blocked by robots.txt."},"excludeTested":{"type":"boolean","default":false,"description":"If true, omits URLs the user has already tested."},"excludeScheduled":{"type":"boolean","default":false,"description":"If true, omits URLs currently in the testing queue."},"legalPages":{"type":"string","enum":["include","exclude","only"],"default":"include","description":"Tri-state filter for legal/policy boilerplate pages (privacy, terms, cookies, disclaimers, refund policies, etc). \"include\" keeps them (default), \"exclude\" drops them, and \"only\" returns just the legal/policy pages — useful for auditing a site's policy coverage."}},"required":["url"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_list_tests","description":"List visibility tests for the authenticated user, newest first. Supports filtering by domain (optionally including subdomains), by URL (exact or contains match), by creation date range, by status, and by test type. This is the tid and history discovery surface: use it to find the exact recorded URL string and tids that gvt_get_baseline, gvt_get_latest, and gvt_get_test_results require, and use gvt_get_score_trend instead when you only need baseline-vs-latest deltas — it skips the paging entirely.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":100,"description":"Max results to return (default 10, max 100)","default":10},"offset":{"type":"integer","minimum":0,"description":"Number of records to skip before returning results (not a page number). Use offset=0 for the first page, offset=limit for the second page, etc.","default":0},"domain":{"type":"string","description":"Domain to filter tests by, e.g. example.com. Subdomains are included unless includeSubdomains is false."},"includeSubdomains":{"type":"boolean","default":true,"description":"If true (the default), includes tests for subdomains of the given domain. Set false to match the exact domain only."},"url":{"type":"string","description":"URL to filter tests by; matched per urlMode (contains by default)."},"urlMode":{"type":"string","enum":["exact","contains"],"default":"contains","description":"How the url filter matches: \"exact\" for full-URL equality, \"contains\" for substring match."},"createdFrom":{"type":"string","description":"Inclusive creation-date lower bound. YYYY-MM-DD (UTC midnight) or full ISO 8601 instant."},"createdTo":{"type":"string","description":"Exclusive creation-date upper bound. YYYY-MM-DD (UTC midnight) or full ISO 8601 instant."},"status":{"type":"string","enum":["pending","processing","completed","failed"],"description":"Test status to filter by: pending, processing, completed, or failed."},"testType":{"type":"string","enum":["url","html","html_paste"],"description":"Test type to filter by: url, html, or html_paste."},"sortDirection":{"type":"string","enum":["asc","desc"],"default":"desc","description":"Sort direction by creation date: desc (newest first, default) or asc (oldest first)."}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_run_visibility_batch","description":"Queue up to 500 URLs for batch GEO visibility testing. Returns a batch ID for tracking progress. Optionally add URLs to recurring schedules (daily, weekly, monthly) during the same call. Poll gvt_get_batch_status with the batchId until status is completed or failed; then get the compact per-page score summary with gvt_get_batch_summary, or individual results with gvt_get_test_results. This tool queues paid test runs and consumes credits; for score interpretation, methodology, or reference knowledge, use gvt_get_knowledge instead — it never runs tests. A webhook URL can be provided to receive a completion notification; when set, the response returns webhookSecret, an HMAC key for verifying that the notification genuinely came from GVT. Duplicate URLs in the submitted array are collapsed, so totalUrls may be smaller than the array you sent.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"urls":{"type":"array","minItems":1,"maxItems":500,"items":{"type":"object","properties":{"url":{"type":"string","description":"The URL to analyze"},"wpPostId":{"type":"string","description":"Optional WordPress post ID for association"},"addToSchedule":{"type":"object","properties":{"frequency":{"type":"string","enum":["daily","weekly","monthly"],"description":"How often to re-run the test"}},"required":["frequency"]}},"required":["url"]},"description":"Array of URL objects to test (max 500)"},"webhookUrl":{"type":"string","description":"Optional HTTPS URL to receive a batch completion webhook"}},"required":["urls"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_run_visibility_test","description":"Run a GEO visibility test on a URL. Analyzes 7 categories: JavaScript dependencies (js), no-JS rendering (nojs), semantic HTML5, heading structure, schema.org markup, social tags, and accessibility. This is an async operation — it returns a tid immediately. Pass that tid to gvt_get_test_results to retrieve scores and issues once the test completes (poll until status is not \"pending\" or \"running\").","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"The URL to analyze"},"waitForJs":{"type":"boolean","description":"Wait for JavaScript rendering before analysis. Set to false to skip JS rendering (faster, but may miss dynamically injected content).","default":true}},"required":["url"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_schedule_test","description":"Manage recurring GVT test schedules: add, delete, reset, pause, resume, cancel, and change_frequency. Discover existing schedules and their schids via gvt_list_schedules; control modes require a schid. For one-off tests use gvt_run_visibility_test; for queued batches without recurrence use gvt_run_visibility_batch. Modes: \"add\" upserts schedules for the provided urls without duplicating; \"delete\" permanently removes schedule entries by schid or url (test results are never deleted by any mode); \"reset\" is destructive — deletes all matching schedules first (domain-scoped when provided, otherwise ALL account-wide), then upserts the provided urls; \"pause\" halts reversibly; \"resume\" restarts a paused schedule and clears auto-pause reasons and failure counts; \"cancel\" permanently ends the schedule (schid unusable); \"change_frequency\" updates the recurrence interval. Management modes (add/delete/reset) require urls; control modes require schid. Subscription-tier enforcement applies.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"mode":{"type":"string","enum":["add","delete","reset","pause","resume","cancel","change_frequency"],"default":"add","description":"Schedule operation mode. add/delete/reset operate on URLs (require urls array). pause/resume/cancel/change_frequency operate on a single schedule (require schid)."},"domain":{"type":"string","description":"Domain to scope a reset operation (reset mode only). e.g. \"example.com\". Matches https://, http://, with/without www., with/without trailing path. Omit to reset ALL schedules."},"schid":{"type":"string","description":"Schedule ID. Required for pause, resume, cancel, and change_frequency modes."},"frequency":{"type":"string","enum":["daily","weekly","monthly"],"description":"New frequency for the schedule. Required for change_frequency mode."},"urls":{"type":"array","minItems":1,"items":{"type":"object","properties":{"schid":{"type":"string","description":"Schedule ID (required for delete/reset modes)"},"url":{"type":"string","description":"The URL to schedule (required for add mode; optional in delete mode if schid is provided)"},"wpPostId":{"type":"string","description":"Optional WordPress post ID for association"},"addToSchedule":{"type":"object","properties":{"frequency":{"type":"string","enum":["daily","weekly","monthly"],"description":"How often to re-run the test"}},"required":["frequency"]}},"required":[]},"description":"Array of URL/schedule objects. Required for add, delete, and reset modes."}},"required":[],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"gvt_set_test_visibility","description":"Toggle the public visibility of a test session. Set is_public to true to make the test shareable and receive its public share URL, or false to make it private. The response confirms the new state and, when making a test public, includes the share_url the recipient can visit without any authentication. is_public is the only lever: true both publishes and yields the link in this same response; false revokes access to any previously issued share_url immediately. This is the only way to control who can view a test result without requiring MCP authentication.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tid":{"type":"string","description":"The 8-character test ID returned by gvt_run_visibility_test."},"is_public":{"type":"boolean","description":"true to make the test publicly shareable, false to make it private."}},"required":["tid","is_public"],"$schema":"https://json-schema.org/draft/2020-12/schema"}}],"scan":{"score":60,"grade":"C","scanned_at":"2026-09-19T20:27:41.838Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T20:27:41.757Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 421ms"]},"poisoning":{"score":15,"max":15,"notes":["19 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 3 write-action tools with no auth"]},"maintenance":{"score":3,"max":15,"notes":["repository not readable: repo not found"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://mcp.geo.igods.com/mcp","reachable":true,"authRequired":false,"latencyMs":421,"serverInfo":{"name":"gvt-mcp","version":"0.2.0"}}],"packages":[],"repo":{"found":false,"owner":"CameronKnowlton","repo":"gvt-mcp","error":"repo not found"},"icon":{"url":"https://geo.igods.com/icons/icon-192x192.png","source":"registry","width":192,"height":192},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":8}}}},"grade_history":[],"reviews":[]}