# iGods GEO Visibility Tool (GVT) (remote · mcp.geo.igods.com)

GEO visibility tests, score trends, sitemap discovery, and domain monitoring for AI agents.

- Trust score: 83/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-30

## Components

- remote · `mcp.geo.igods.com`: 83/100 (this document), [markdown](https://verifymcp.io/servers/com-igods-gvt/mcp.md), [page](https://verifymcp.io/servers/com-igods-gvt/mcp)

## Channel facts

- Endpoint: `https://mcp.geo.igods.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.3.1`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-30.

- **Endpoint Security**: 89/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 82/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4189 tokens (~161/item across 26 items; 19 tools + 7 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 34/100
  - Stability check failed: schema churn in the 21 days we've observed: 6 tool removals, 0 breaking changes, 0 auth/transport breaks, 8 additions.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 20 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the iGods GEO Visibility Tool (GVT) MCP server?

iGods GEO Visibility Tool (GVT) is a hosted endpoint at https://mcp.geo.igods.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-igods-gvt 'https://mcp.geo.igods.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-igods-gvt": {
      "url": "https://mcp.geo.igods.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-igods-gvt": {
      "type": "http",
      "url": "https://mcp.geo.igods.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-igods-gvt]
url = "https://mcp.geo.igods.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-igods-gvt": {
      "type": "remote",
      "url": "https://mcp.geo.igods.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-igods-gvt --url 'https://mcp.geo.igods.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-igods-gvt:
    url: "https://mcp.geo.igods.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-igods-gvt": {
      "Transport": "http",
      "Url": "https://mcp.geo.igods.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-igods-gvt -t streamable-http -u 'https://mcp.geo.igods.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "com-igods-gvt": {
      "type": "http",
      "url": "https://mcp.geo.igods.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-29 (score 83, +1)

No change was recorded against any check on this day. Stability & Change Management went from 27 to 31.

### 2026-09-28 (score 82, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-27 (score 82, +1)

No change was recorded against any check on this day. Stability & Change Management went from 21 to 24.

### 2026-09-25 (score 81, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-23 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 11.

### 2026-09-20 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 0 to 1.

### 2026-09-12 (score 78, −1)

- [security] Tool “gvt_get_batch_status” rewrote its description, which is the text the model reads
- [security] Tool “gvt_get_test_results” rewrote its description, which is the text the model reads
- [security] Tool “gvt_run_visibility_batch” rewrote its description, which is the text the model reads
- [functional] New tool “gvt_get_batch_summary”
- [cosmetic] “gvt_get_test_results” added an optional parameter “detail”

### 2026-09-11 (score 79, 0)

- [security] Tool “gvt_get_latest” rewrote its description, which is the text the model reads

## MCP tools (19)

### `gvt_run_visibility_test` (~146 tokens)

Run a visibility test

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").

Input parameters:

- `url` (string, required): The URL to analyze
- `waitForJs` (boolean): Wait for JavaScript rendering before analysis. Set to false to skip JS rendering (faster, but may miss dynamically injected content).

Output parameters:

- `message` (string): Human-readable acknowledgement with polling guidance
- `next` (object): The suggested next call
- `status` (string): Always pending at queue time
- `tid` (string): 8-character test ID to poll with

### `gvt_get_test_results` (~336 tokens)

Get test results

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.

Input parameters:

- `detail` (string): 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…
- `tid` (string, required): Opaque 8-character hash ID returned by gvt_run_visibility_test or gvt_list_tests. Not an integer.

Output parameters:

- `analysisSummary` (object): Aggregate scores for one test session
- `createdAt` (string): ISO 8601 instant of test creation
- `detail` (string): Present with value "summary" when detail=summary was requested; omitted from full responses so existing callers see no change
- `expiresAt` (string|null): ISO 8601 instant when this test session and its results will expire and be deleted
- `findingSentence` (string|null): Pre-generated natural language verdict; use as the primary summary
- `isPublic` (boolean|null): Whether this test result is publicly accessible
- `results` (array): Per-category result records. detail=full: each carries analysisType and complete resultData (semantic tree, per-element issues); issues carry fixId for gvt_get_fix. detail=summary: each carries analy…
- `shareableTid` (string|null): Non-null when the result is publicly shareable. Public share identifier for this session. Equal to tid when the session is shareable; null when the session is private. Presence of a value is the indi…
- `status` (string): Pending and running mean poll again; completed means full results are present
- `testType` (string): Type of test performed (e.g., URL or direct HTML paste)
- `tid` (string): The test ID that was polled
- `updatedAt` (string): ISO 8601 instant of the last update to this test session
- `url` (string|null): The URL that was analyzed

### `gvt_list_tests` (~417 tokens)

List tests

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.

Input parameters:

- `createdFrom` (string): Inclusive creation-date lower bound. YYYY-MM-DD (UTC midnight) or full ISO 8601 instant.
- `createdTo` (string): Exclusive creation-date upper bound. YYYY-MM-DD (UTC midnight) or full ISO 8601 instant.
- `domain` (string): Domain to filter tests by, e.g. example.com. Subdomains are included unless includeSubdomains is false.
- `includeSubdomains` (boolean): If true (the default), includes tests for subdomains of the given domain. Set false to match the exact domain only.
- `limit` (integer): Max results to return (default 10, max 100)
- `offset` (integer): 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.
- `sortDirection` (string): Sort direction by creation date: desc (newest first, default) or asc (oldest first).
- `status` (string): Test status to filter by: pending, processing, completed, or failed.
- `testType` (string): Test type to filter by: url, html, or html_paste.
- `url` (string): URL to filter tests by; matched per urlMode (contains by default).
- `urlMode` (string): How the url filter matches: "exact" for full-URL equality, "contains" for substring match.

Output parameters:

- `createdFrom` (string|null): Effective lower creation-date bound, if any
- `createdTo` (string|null): Effective upper creation-date bound, if any
- `domain` (string|null): The domain filter actually applied, if any
- `hasMore` (boolean): True when more pages exist
- `includeSubdomains` (boolean): Whether subdomains were included in the domain filter
- `limit` (integer): Page size actually applied
- `nextOffset` (integer|null): Offset for the next page, null on the last page
- `offset` (integer): Row offset applied to this page
- `tests` (array): The matching test sessions on this page
- `total` (integer): Total matching tests before pagination
- `ttlMs` (integer): Suggested client cache lifetime in milliseconds

### `gvt_get_baseline` (~160 tokens)

Get baseline snapshot

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.

Input parameters:

- `url` (string, required): The URL to look up (must match the URL used when the test was run).

Output parameters:

- `analysisSummary` (object): Aggregate scores for this test
- `createdAt` (string): ISO 8601 instant this snapshot was created
- `expiresAt` (string|null): ISO 8601 instant this snapshot will expire
- `findingSentence` (string|null): Pre-generated natural language verdict for this snapshot
- `isPublic` (boolean): Whether this test is publicly visible
- `message` (string): Present only in the no-test case
- `oldest` (object|null): Null when no test exists for the URL
- `shareableTid` (string|null): Public share ID, non-null when shareable
- `status` (string): Snapshot status (completed, failed, etc.)
- `testType` (string): The type of the test run
- `tid` (string): Test ID of the snapshot
- `updatedAt` (string): ISO 8601 instant this snapshot was last updated
- `url` (string): The URL this snapshot analyzed

### `gvt_get_latest` (~139 tokens)

Get latest snapshot

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.

Input parameters:

- `url` (string, required): The URL to look up (must match the URL used when the test was run).

Output parameters:

- `analysisSummary` (object): Aggregate scores for this test
- `createdAt` (string): ISO 8601 instant this snapshot was created
- `expiresAt` (string|null): ISO 8601 instant this snapshot will expire
- `findingSentence` (string|null): Pre-generated natural language verdict for this snapshot
- `isPublic` (boolean): Whether this test is publicly visible
- `latest` (object|null): Null when no test exists for the URL
- `message` (string): Present only in the no-test case
- `shareableTid` (string|null): Public share ID, non-null when shareable
- `status` (string): Snapshot status (completed, failed, etc.)
- `testType` (string): The type of the test run
- `tid` (string): Test ID of the snapshot
- `updatedAt` (string): ISO 8601 instant this snapshot was last updated
- `url` (string): The URL this snapshot analyzed

### `gvt_list_baselines` (~164 tokens)

List baselines (batch)

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.

Input parameters:

- `urls` (array, required): Array of URLs to look up (max 100).

Output parameters:

- `found` (integer): URLs that had at least one test
- `requested` (integer): Number of URLs requested
- `results` (array): One entry per requested URL, in request order
- `ttlMs` (integer): Suggested client cache lifetime in milliseconds

### `gvt_get_score_trend` (~264 tokens)

Get score trend

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.

Input parameters:

- `domain` (string): Domain scope — matches the domain, www.<domain>, and subdomains (XOR with url).
- `limit` (integer): Cap on returned records in domain mode (max 100, default 25).
- `offset` (integer): 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.
- `url` (string): Single URL scope (XOR with domain).

Output parameters:

- `compare` (object|null): Comparison window settings used
- `domain` (string|null): The compared domain in domain mode, else null
- `hasMore` (boolean): True when more pages exist
- `includeSubdomains` (boolean): Whether subdomains were included in the domain search
- `limit` (integer): Max records per page in domain mode
- `nextOffset` (integer|null): Offset for the next page, null on the last page
- `offset` (integer): Row offset applied to this page
- `returned` (integer): Records in this page
- `scope` (string): Which mode the comparison ran in
- `trends` (array): One row per matched URL, baseline vs latest with deltas
- `truncated` (boolean): Deprecated. Use `hasMore` instead.
- `ttlMs` (integer): Suggested client cache lifetime in milliseconds
- `url` (string|null): The compared URL in url mode, else null
- `urlCount` (integer): Total matched URLs before pagination
- `windowSummary` (object|null): Summary of window comparison results

### `gvt_list_sitemap_urls` (~383 tokens)

List sitemap URLs

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).

Input parameters:

- `exclude` (array): Wildcard patterns to reject (e.g., '*archive*').
- `excludeDisallowed` (boolean): If true, silently drops URLs that are blocked by robots.txt.
- `excludeScheduled` (boolean): If true, omits URLs currently in the testing queue.
- `excludeTested` (boolean): If true, omits URLs the user has already tested.
- `include` (array): Wildcard patterns to require (e.g., '*blog*'). Only '*' wildcards are supported.
- `legalPages` (string): 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 leg…
- `limit` (integer): Maximum number of URLs to return (default 10).
- `sort` (string): How to sort the discovered URLs. 'significance' uses SEO heuristics.
- `url` (string, required): The target website URL or an explicit sitemap .xml URL.

Output parameters:

- `bulkUrlLimit` (integer): How many of these URLs the caller's tier permits in one batch-analyze call.
- `errors` (array): Per-sitemap fetch or parse failures; non-empty means discovery was partial
- `hasMore` (boolean): True when the filtered set was cut short by the limit
- `legalPages` (string): The legal-page filter actually applied
- `legalPagesFound` (integer): How many of the URLs discovered across all sitemaps were detected as legal/policy boilerplate, counted BEFORE any filtering or limiting is applied.
- `limit` (integer): Effective result cap
- `matched` (integer): URLs remaining after include/exclude and legalPages filters
- `requestedUrl` (string): The URL or sitemap URL that was resolved
- `resolvedSitemaps` (array): Sitemap URLs actually parsed
- `returned` (integer): URLs actually returned after the limit
- `robotsTxtFound` (boolean): Whether a robots.txt was found and consulted
- `sitemapCount` (integer): Number of sitemaps parsed
- `sort` (string): The sort actually applied to the results
- `totalDiscovered` (integer): Raw URL count discovered before filtering
- `truncated` (boolean): True if the underlying sitemap parser hit its 5000-URL cap during fetching.
- `urls` (array): Discovered URLs, ranked per the sort setting

### `gvt_set_test_visibility` (~162 tokens)

Set test visibility

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.

Input parameters:

- `is_public` (boolean, required): true to make the test publicly shareable, false to make it private.
- `tid` (string, required): The 8-character test ID returned by gvt_run_visibility_test.

Output parameters:

- `is_public` (boolean): The new public visibility state
- `share_url` (string|null): Public share URL, present when is_public is true; the recipient needs no authentication. Null when sharing failed or the test is private
- `success` (boolean): True when the visibility change was applied
- `tid` (string): The test that was modified

### `gvt_delete_test` (~92 tokens)

Delete a test

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.

Input parameters:

- `tid` (string, required): The 8-character test ID of the test to delete.

Output parameters:

- `message` (string): Human-readable confirmation
- `success` (boolean): True when the test was deleted

### `gvt_run_visibility_batch` (~216 tokens)

Run batch tests

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.

Input parameters:

- `urls` (array, required): Array of URL objects to test (max 500)
- `webhookUrl` (string): Optional HTTPS URL to receive a batch completion webhook

Output parameters:

- `batchId` (string): UUID for tracking the batch
- `status` (string): Always queued at submission time
- `totalUrls` (integer): URLs accepted into the batch
- `webhookConfigured` (boolean): True when a completion webhook URL was supplied
- `webhookSecret` (string|null): HMAC secret for verifying the webhook, null when no webhook

### `gvt_get_batch_status` (~176 tokens)

Get batch status

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.

Input parameters:

- `batchId` (string, required): The UUID of the batch to check, returned by gvt_run_visibility_batch.

Output parameters:

- `batchId` (string): The batch that was queried
- `completedAt` (string|null): ISO 8601 instant when the batch reached a terminal state, null while in flight
- `counts` (object): Per-URL test state counts; the four fields always sum to totalUrls
- `status` (string): Aggregate batch state; completed means every per-URL test reached a terminal state
- `submittedAt` (string): ISO 8601 instant of batch submission
- `totalUrls` (integer): URLs in the batch after duplicate collapsing
- `urls` (array): One entry per submitted URL, in submission order

### `gvt_get_batch_summary` (~187 tokens)

Get batch summary

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.

Input parameters:

- `batchId` (string, required): The UUID of the completed batch to summarize, returned by gvt_run_visibility_batch.

Output parameters:

- `batchId` (string): The batch that was summarized
- `counts` (object): Per-URL test state counts; the four fields always sum to totalUrls
- `message` (string): Polling guidance, present when the batch is not completed
- `pages` (array): One compact entry per URL, in batch order. Failed tests appear with status failed and null scores; they are excluded from the aggregates.
- `status` (string): Aggregate batch state; pages and summary are present only when completed
- `summary` (object): Aggregates computed over the completed pages
- `totalUrls` (integer): URLs in the batch after duplicate collapsing

### `gvt_list_schedules` (~295 tokens)

List schedules

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.

Input parameters:

- `domain` (string): Filter to schedules matching this domain substring.
- `frequency` (string): Filter by repetition interval.
- `includeCompletedOnce` (boolean): 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.
- `includeSubdomains` (boolean): Whether subdomains should be included in the domain filter match.
- `limit` (integer): The maximum number of schedules requested for this page.
- `offset` (integer): The number of skipped items from the beginning of the result set.
- `sortDirection` (string): Sort order by creation time; desc is newest first.
- `status` (string): Filter by the derived overall state of the schedule.

Output parameters:

- `allowedFrequencies` (array): Frequencies the caller may set when creating schedules
- `domain` (string|null): The applied domain filter, null when unfiltered
- `frequency` (string|null): The applied frequency filter, null when unfiltered
- `hasMore` (boolean): True when more results exist beyond this page
- `includeCompletedOnce` (boolean): Whether completed one-off rows were included in this response
- `includeSubdomains` (boolean): The applied subdomain-inclusion setting
- `limit` (integer): Page size applied to this response
- `maxActiveSchedules` (integer): The caller's cap on active schedules; add mode enforces this limit
- `nextOffset` (integer|null): Offset for the next page, null when hasMore is false
- `offset` (integer): Offset applied to this response
- `schedules` (array): One entry per schedule, newest first by creation time
- `status` (string|null): The applied status filter, null when unfiltered
- `total` (integer): Total schedules matching the filters, across all pages

### `gvt_schedule_test` (~365 tokens)

Manage schedules

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.

Input parameters:

- `domain` (string): 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.
- `frequency` (string): New frequency for the schedule. Required for change_frequency mode.
- `mode` (string): Schedule operation mode. add/delete/reset operate on URLs (require urls array). pause/resume/cancel/change_frequency operate on a single schedule (require schid).
- `schid` (string): Schedule ID. Required for pause, resume, cancel, and change_frequency modes.
- `urls` (array): Array of URL/schedule objects. Required for add, delete, and reset modes.

Output parameters:

- `deletedByUrl` (array): Per-URL breakdown of deleted schedules (delete mode). Present on delete mode responses, including schid-based deletes; omitted for reset mode.
- `deletedCount` (integer): Schedule entries removed (delete/reset modes)
- `scheduled` (array): Schedules now in effect (add/reset modes)
- `success` (boolean): True when the requested mode completed
- `upsertedCount` (integer): Schedules created or updated (add/reset modes)

### `gvt_get_knowledge` (~153 tokens)

Read GVT knowledge

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.

Input parameters:

- `topic` (string): 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),…

Output parameters:

- `knowledge` (object): Reference content for the requested topic
- `topic` (string): The topic that was served
- `ttlMs` (integer): Suggested client cache lifetime in milliseconds
- `uri` (string): The gvt:// resource the content came from

### `gvt_get_fix` (~150 tokens)

Read a fix record

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.

Input parameters:

- `issue_id` (string, required): Stable issue identifier, e.g. og_title_missing or color-contrast. Matches the fixId field in gvt_get_test_results output.

Output parameters:

- `category` (string): Analysis category the issue belongs to
- `human_description` (string): Human-readable description of the issue
- `impact` (string): Plain-language statement of what the issue costs
- `issue_id` (string): Stable issue identifier, e.g. og_title_missing
- `recommendation` (string): The recommended remediation
- `resourceUri` (string): The gvt:// resource this record was read from
- `severity_range` (array): Severity levels this issue can take
- `subcategory` (string): Finer-grained grouping within the category
- `ttlMs` (integer): Suggested client cache lifetime in milliseconds
- `weight` (number): Scoring weight

### `gvt_list_prompts` (~109 tokens)

List prompt workflows

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.

Output parameters:

- `promptCount` (integer): Number of prompt workflows in the catalog
- `prompts` (array): The prompt workflow catalog
- `ttlMs` (integer): Suggested client cache lifetime in milliseconds

### `gvt_get_prompt` (~158 tokens)

Render a prompt workflow

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.

Input parameters:

- `arguments` (object): Argument values for the prompt, keyed by argument name (e.g. {"domain": "example.com", "frequency": "weekly"}). Omit optional arguments to use their defaults.
- `name` (string, required): Prompt name from gvt_list_prompts, e.g. gvt_setup_domain_monitoring.

Output parameters:

- `arguments` (object): Effective arguments after binding defaults
- `description` (string): The prompt catalog description
- `name` (string): The prompt name that was rendered
- `text` (string): Fully interpolated instruction text referencing GVT tools by name

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-igods-gvt/mcp#diagnostics

## Score history

- 2026-09-30: 83
- 2026-09-29: 83
- 2026-09-28: 82
- 2026-09-27: 82
- 2026-09-26: 81
- 2026-09-25: 81
- 2026-09-24: 80
- 2026-09-23: 80
- 2026-09-22: 79
- 2026-09-21: 79
- 2026-09-20: 79
- 2026-09-19: 78
- 2026-09-18: 78
- 2026-09-17: 78
- 2026-09-16: 78
- 2026-09-15: 78
- 2026-09-14: 78
- 2026-09-13: 78
- 2026-09-12: 78
- 2026-09-11: 79
- 2026-09-10: 79
- 2026-09-09: 79

## Common questions

### What is the iGods GEO Visibility Tool (GVT) MCP server?

iGods GEO Visibility Tool (GVT) is an MCP server listed in the public MCP registry as com.igods/gvt. GEO visibility tests, score trends, sitemap discovery, and domain monitoring for AI agents. This page covers its hosted endpoint (https://mcp.geo.igods.com/mcp).

### Is the iGods GEO Visibility Tool (GVT) MCP server safe to use?

iGods GEO Visibility Tool (GVT) scores 83 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the iGods GEO Visibility Tool (GVT) MCP server expose?

iGods GEO Visibility Tool (GVT) exposes 19 tools: gvt_run_visibility_test, gvt_get_test_results, gvt_list_tests, gvt_get_baseline, gvt_get_latest, and 14 more. Their descriptions and schemas cost roughly 4,072 tokens of context every time the server is loaded.

### Does the iGods GEO Visibility Tool (GVT) MCP server require authentication?

Yes. iGods GEO Visibility Tool (GVT) asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the iGods GEO Visibility Tool (GVT) MCP server still maintained?

iGods GEO Visibility Tool (GVT) is still listed as active in the MCP registry. We last reached this channel on 30 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.geo.igods.com/mcp
- Repository: https://github.com/CameronKnowlton/gvt-mcp
- Website: https://geo.igods.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-igods-gvt/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-igods-gvt/mcp.json
- HTML version of this page: https://verifymcp.io/servers/com-igods-gvt/mcp
