iGods GEO Visibility Tool (GVT)
What this MCP does
Runs and monitors GEO visibility tests for websites, evaluates technical and content categories, compares score trends, and provides remediation guidance.
Tools
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['tid'], 'properties': {'tid': {'type': 'string', 'description': 'The 8-character test ID of the test to delete.'}}}
Output schema
{'type': 'object', 'properties': {'message': {'type': 'string', 'description': 'Human-readable confirmation'}, 'success': {'type': 'boolean', 'description': 'True when the test was deleted'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'The URL to look up (must match the URL used when the test was run).'}}}
Output schema
{'type': 'object', 'properties': {'tid': {'type': 'string', 'description': 'Test ID of the snapshot'}, 'url': {'type': 'string', 'description': 'The URL this snapshot analyzed'}, 'oldest': {'type': ['object', 'null'], 'description': 'Null when no test exists for the URL'}, 'status': {'type': 'string', 'description': 'Snapshot status (completed, failed, etc.)'}, 'message': {'type': 'string', 'description': 'Present only in the no-test case'}, 'isPublic': {'type': 'boolean', 'description': 'Whether this test is publicly visible'}, 'testType': {'enum': ['url', 'html_paste'], 'type': 'string', 'description': 'The type of the test run'}, 'createdAt': {'type': 'string', 'description': 'ISO 8601 instant this snapshot was created'}, 'expiresAt': {'type': ['string', 'null'], 'description': 'ISO 8601 instant this snapshot will expire'}, 'updatedAt': {'type': 'string', 'description': 'ISO 8601 instant this snapshot was last updated'}, 'shareableTid': {'type': ['string', 'null'], 'description': 'Public share ID, non-null when shareable'}, 'analysisSummary': {'type': 'object', 'properties': {'timestamp': {'type': 'string', 'description': 'ISO 8601 instant of the analysis'}, 'totalIssues': {'type': 'integer', 'description': 'Total open issues across all categories'}, 'overallScore': {'type': 'number', 'description': 'Overall GEO visibility score (0-100)'}, 'categoryScores': {'type': 'object', 'properties': {'nojs': {'type': 'number', 'description': 'No-JS rendering score (0-100)'}, 'schema': {'type': 'number', 'description': 'schema.org markup score (0-100)'}, 'social': {'type': 'number', 'description': 'Social tags score (0-100)'}, 'headings': {'type': 'number', 'description': 'Heading structure score (0-100)'}, 'semantic': {'type': 'number', 'description': 'Semantic HTML5 score (0-100)'}, 'javascript': {'type': 'number', 'description': 'JavaScript dependency score (0-100)'}, 'accessibility': {'type': 'number', 'description': 'Accessibility score (0-100)'}}, 'description': 'Score per analysis category (0-100)'}, 'jsDependencySource': {'enum': ['measured', 'estimated', 'unavailable'], 'type': 'string', 'description': 'How the JS dependency score was derived'}, 'categoryIssueCounts': {'type': 'object', 'properties': {'nojs': {'type': 'integer', 'description': 'Number of open No-JS rendering issues'}, 'schema': {'type': 'integer', 'description': 'Number of open schema.org markup issues'}, 'social': {'type': 'integer', 'description': 'Number of open social tag issues'}, 'headings': {'type': 'integer', 'description': 'Number of open heading structure issues'}, 'semantic': {'type': 'integer', 'description': 'Number of open semantic HTML5 issues'}, 'javascript': {'type': 'integer', 'description': 'Number of open JavaScript dependency issues'}, 'accessibility': {'type': 'integer', 'description': 'Number of open accessibility issues'}}, 'description': 'Open issue count per analysis category'}}, 'description': 'Aggregate scores for this test'}, 'findingSentence': {'type': ['string', 'null'], 'description': 'Pre-generated natural language verdict for this snapshot'}}, 'description': 'Oldest baseline snapshot for one URL, including expired tests. On success the snapshot fields sit at the top level; when no test exists the response is { url, oldest: null, message }.'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['batchId'], 'properties': {'batchId': {'type': 'string', 'format': 'uuid', 'description': 'The UUID of the batch to check, returned by gvt_run_visibility_batch.'}}}
Output schema
{'type': 'object', 'properties': {'urls': {'type': 'array', 'items': {'type': 'object', 'properties': {'tid': {'type': ['string', 'null'], 'description': 'Test ID once that test completed, null while queued, running, or failed'}, 'url': {'type': 'string', 'description': 'The submitted URL'}, 'status': {'enum': ['queued', 'running', 'completed', 'failed'], 'type': 'string', 'description': 'This URL test state'}}}, 'description': 'One entry per submitted URL, in submission order'}, 'counts': {'type': 'object', 'properties': {'failed': {'type': 'integer', 'description': 'Tests that failed or were skipped'}, 'queued': {'type': 'integer', 'description': 'Tests not yet started'}, 'running': {'type': 'integer', 'description': 'Tests currently executing'}, 'completed': {'type': 'integer', 'description': 'Tests that completed successfully'}}, 'description': 'Per-URL test state counts; the four fields always sum to totalUrls'}, 'status': {'enum': ['queued', 'running', 'completed', 'failed'], 'type': 'string', 'description': 'Aggregate batch state; completed means every per-URL test reached a terminal state'}, 'batchId': {'type': 'string', 'description': 'The batch that was queried'}, 'totalUrls': {'type': 'integer', 'description': 'URLs in the batch after duplicate collapsing'}, 'completedAt': {'type': ['string', 'null'], 'description': 'ISO 8601 instant when the batch reached a terminal state, null while in flight'}, 'submittedAt': {'type': 'string', 'description': 'ISO 8601 instant of batch submission'}}, 'description': 'Batch progress and per-URL state. Poll until status is completed or failed.'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['batchId'], 'properties': {'batchId': {'type': 'string', 'format': 'uuid', 'description': 'The UUID of the completed batch to summarize, returned by gvt_run_visibility_batch.'}}}
Output schema
{'type': 'object', 'properties': {'pages': {'type': 'array', 'items': {'type': 'object', 'properties': {'tid': {'type': 'string', 'description': 'Test ID, for gvt_get_test_results deep dives'}, 'url': {'type': 'string', 'description': 'The tested URL'}, 'status': {'type': 'string', 'description': 'This URL test state'}, 'overallScore': {'type': ['number', 'null'], 'description': 'Overall GEO visibility score (0-100), null when the test failed'}, 'categoryScores': {'type': ['object', 'null'], 'description': 'Score per analysis category (0-100)'}, 'findingSentence': {'type': ['string', 'null'], 'description': 'Pre-generated natural language verdict'}}}, 'description': 'One compact entry per URL, in batch order. Failed tests appear with status failed and null scores; they are excluded from the aggregates.'}, 'counts': {'type': 'object', 'description': 'Per-URL test state counts; the four fields always sum to totalUrls'}, 'status': {'enum': ['queued', 'running', 'completed', 'failed'], 'type': 'string', 'description': 'Aggregate batch state; pages and summary are present only when completed'}, 'batchId': {'type': 'string', 'description': 'The batch that was summarized'}, 'message': {'type': 'string', 'description': 'Polling guidance, present when the batch is not completed'}, 'summary': {'type': 'object', 'properties': {'bestPage': {'type': ['object', 'null'], 'description': 'Highest scoring page: url and overallScore'}, 'worstPage': {'type': ['object', 'null'], 'description': 'Lowest scoring page: url and overallScore'}, 'topIssueTypes': {'type': 'array', 'items': {'type': 'object', 'properties': {'type': {'type': 'string', 'description': 'Issue type identifier'}, 'count': {'type': 'integer', 'description': 'Pages carrying this issue type'}, 'fixId': {'type': ['string', 'null'], 'description': 'fixId for gvt_get_fix, when the issue type is mapped'}, 'severity': {'type': 'string', 'description': 'Highest severity observed for this issue type'}}}, 'description': 'Up to five issue types shared across pages (error and warning severities, counted once per page), each with its fixId for gvt_get_fix'}, 'weakestCategory': {'type': ['string', 'null'], 'description': 'Category with the lowest average score'}, 'categoryAverages': {'type': 'object', 'description': 'Mean score per category across completed pages'}, 'strongestCategory': {'type': ['string', 'null'], 'description': 'Category with the highest average score'}, 'averageOverallScore': {'type': ['number', 'null'], 'description': 'Mean overall score across completed pages, rounded to one decimal'}}, 'description': 'Aggregates computed over the completed pages'}, 'totalUrls': {'type': 'integer', 'description': 'URLs in the batch after duplicate collapsing'}}, 'description': 'Compact per-page results and pre-computed aggregates for a completed batch. An in-flight or failed batch returns its status and counts without per-page data.'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['issue_id'], '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.'}}}
Output schema
{'type': 'object', 'properties': {'ttlMs': {'type': 'integer', 'description': 'Suggested client cache lifetime in milliseconds'}, 'impact': {'type': 'string', 'description': 'Plain-language statement of what the issue costs'}, 'weight': {'type': 'number', 'description': 'Scoring weight'}, 'category': {'type': 'string', 'description': 'Analysis category the issue belongs to'}, 'issue_id': {'type': 'string', 'description': 'Stable issue identifier, e.g. og_title_missing'}, 'resourceUri': {'type': 'string', 'description': 'The gvt:// resource this record was read from'}, 'subcategory': {'type': 'string', 'description': 'Finer-grained grouping within the category'}, 'recommendation': {'type': 'string', 'description': 'The recommended remediation'}, 'severity_range': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Severity levels this issue can take'}, 'human_description': {'type': 'string', 'description': 'Human-readable description of the issue'}}, 'description': 'Canonical fix record for one issue type'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': [], 'properties': {'topic': {'enum': ['all', 'methodology', 'scoring', 'categories', 'glossary'], 'type': 'string', '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).'}}}
Output schema
{'type': 'object', 'properties': {'uri': {'type': 'string', 'description': 'The gvt:// resource the content came from'}, 'topic': {'enum': ['all', 'methodology', 'scoring', 'categories', 'glossary'], 'type': 'string', 'description': 'The topic that was served'}, 'ttlMs': {'type': 'integer', 'description': 'Suggested client cache lifetime in milliseconds'}, 'knowledge': {'type': 'object', 'description': 'Reference content for the requested topic'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'The URL to look up (must match the URL used when the test was run).'}}}
Output schema
{'type': 'object', 'properties': {'tid': {'type': 'string', 'description': 'Test ID of the snapshot'}, 'url': {'type': 'string', 'description': 'The URL this snapshot analyzed'}, 'latest': {'type': ['object', 'null'], 'description': 'Null when no test exists for the URL'}, 'status': {'type': 'string', 'description': 'Snapshot status (completed, failed, etc.)'}, 'message': {'type': 'string', 'description': 'Present only in the no-test case'}, 'isPublic': {'type': 'boolean', 'description': 'Whether this test is publicly visible'}, 'testType': {'enum': ['url', 'html_paste'], 'type': 'string', 'description': 'The type of the test run'}, 'createdAt': {'type': 'string', 'description': 'ISO 8601 instant this snapshot was created'}, 'expiresAt': {'type': ['string', 'null'], 'description': 'ISO 8601 instant this snapshot will expire'}, 'updatedAt': {'type': 'string', 'description': 'ISO 8601 instant this snapshot was last updated'}, 'shareableTid': {'type': ['string', 'null'], 'description': 'Public share ID, non-null when shareable'}, 'analysisSummary': {'type': 'object', 'properties': {'timestamp': {'type': 'string', 'description': 'ISO 8601 instant of the analysis'}, 'totalIssues': {'type': 'integer', 'description': 'Total open issues across all categories'}, 'overallScore': {'type': 'number', 'description': 'Overall GEO visibility score (0-100)'}, 'categoryScores': {'type': 'object', 'properties': {'nojs': {'type': 'number', 'description': 'No-JS rendering score (0-100)'}, 'schema': {'type': 'number', 'description': 'schema.org markup score (0-100)'}, 'social': {'type': 'number', 'description': 'Social tags score (0-100)'}, 'headings': {'type': 'number', 'description': 'Heading structure score (0-100)'}, 'semantic': {'type': 'number', 'description': 'Semantic HTML5 score (0-100)'}, 'javascript': {'type': 'number', 'description': 'JavaScript dependency score (0-100)'}, 'accessibility': {'type': 'number', 'description': 'Accessibility score (0-100)'}}, 'description': 'Score per analysis category (0-100)'}, 'jsDependencySource': {'enum': ['measured', 'estimated', 'unavailable'], 'type': 'string', 'description': 'How the JS dependency score was derived'}, 'categoryIssueCounts': {'type': 'object', 'properties': {'nojs': {'type': 'integer', 'description': 'Number of open No-JS rendering issues'}, 'schema': {'type': 'integer', 'description': 'Number of open schema.org markup issues'}, 'social': {'type': 'integer', 'description': 'Number of open social tag issues'}, 'headings': {'type': 'integer', 'description': 'Number of open heading structure issues'}, 'semantic': {'type': 'integer', 'description': 'Number of open semantic HTML5 issues'}, 'javascript': {'type': 'integer', 'description': 'Number of open JavaScript dependency issues'}, 'accessibility': {'type': 'integer', 'description': 'Number of open accessibility issues'}}, 'description': 'Open issue count per analysis category'}}, 'description': 'Aggregate scores for this test'}, 'findingSentence': {'type': ['string', 'null'], 'description': 'Pre-generated natural language verdict for this snapshot'}}, 'description': 'Most recent non-expired snapshot for one URL. On success the snapshot fields sit at the top level; when no test exists the response is { url, latest: null, message }.'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Prompt name from gvt_list_prompts, e.g. gvt_setup_domain_monitoring.'}, 'arguments': {'type': 'object', 'description': 'Argument values for the prompt, keyed by argument name (e.g. {"domain": "example.com", "frequency": "weekly"}). Omit optional arguments to use their defaults.', 'additionalProperties': {'type': 'string'}}}}
Output schema
{'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The prompt name that was rendered'}, 'text': {'type': 'string', 'description': 'Fully interpolated instruction text referencing GVT tools by name'}, 'arguments': {'type': 'object', 'description': 'Effective arguments after binding defaults'}, 'description': {'type': 'string', 'description': 'The prompt catalog description'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'url': {'type': 'string', 'description': 'Single URL scope (XOR with domain).'}, 'limit': {'type': 'integer', 'default': 25, 'maximum': 100, 'description': 'Cap on returned records in domain mode (max 100, default 25).'}, 'domain': {'type': 'string', 'description': 'Domain scope — matches the domain, www.<domain>, and subdomains (XOR with url).'}, 'offset': {'type': 'integer', 'default': 0, 'minimum': 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.'}}}
Output schema
{'type': 'object', 'properties': {'url': {'type': ['string', 'null'], 'description': 'The compared URL in url mode, else null'}, 'limit': {'type': 'integer', 'description': 'Max records per page in domain mode'}, 'scope': {'enum': ['url', 'domain'], 'type': 'string', 'description': 'Which mode the comparison ran in'}, 'ttlMs': {'type': 'integer', 'description': 'Suggested client cache lifetime in milliseconds'}, 'domain': {'type': ['string', 'null'], 'description': 'The compared domain in domain mode, else null'}, 'offset': {'type': 'integer', 'description': 'Row offset applied to this page'}, 'trends': {'type': 'array', 'items': {'type': 'object', 'properties': {'url': {'type': 'string', 'description': 'The URL this trend row describes'}, 'deltas': {'type': ['object', 'null'], 'properties': {'overall': {'type': ['number', 'null'], 'description': 'Overall score change, latest minus baseline'}, 'categories': {'type': 'object', 'properties': {'nojs': {'type': 'number', 'description': 'No-JS rendering score (0-100)'}, 'schema': {'type': 'number', 'description': 'schema.org markup score (0-100)'}, 'social': {'type': 'number', 'description': 'Social tags score (0-100)'}, 'headings': {'type': 'number', 'description': 'Heading structure score (0-100)'}, 'semantic': {'type': 'number', 'description': 'Semantic HTML5 score (0-100)'}, 'javascript': {'type': 'number', 'description': 'JavaScript dependency score (0-100)'}, 'accessibility': {'type': 'number', 'description': 'Accessibility score (0-100)'}}, 'description': 'Per-category score change, latest minus baseline'}}, 'description': 'Latest minus baseline'}, 'latest': {'type': ['object', 'null'], 'properties': {'tid': {'type': 'string', 'description': 'Test ID of this snapshot'}, 'createdAt': {'type': 'string', 'description': 'ISO 8601 instant of this snapshot'}, 'overallScore': {'type': ['number', 'null'], 'description': 'Overall GEO visibility score (0-100), null when the test failed'}, 'categoryScores': {'type': 'object', 'properties': {'nojs': {'type': 'number', 'description': 'No-JS rendering score (0-100)'}, 'schema': {'type': 'number', 'description': 'schema.org markup score (0-100)'}, 'social': {'type': 'number', 'description': 'Social tags score (0-100)'}, 'headings': {'type': 'number', 'description': 'Heading structure score (0-100)'}, 'semantic': {'type': 'number', 'description': 'Semantic HTML5 score (0-100)'}, 'javascript': {'type': 'number', 'description': 'JavaScript dependency score (0-100)'}, 'accessibility': {'type': 'number', 'description': 'Accessibility score (0-100)'}}, 'description': 'Score per analysis category (0-100)'}}, 'description': 'One test snapshot: tid, createdAt, overallScore, categoryScores'}, 'baseline': {'type': ['object', 'null'], 'properties': {'tid': {'type': 'string', 'description': 'Test ID of this snapshot'}, 'createdAt': {'type': 'string', 'description': 'ISO 8601 instant of this snapshot'}, 'overallScore': {'type': ['number', 'null'], 'description': 'Overall GEO visibility score (0-100), null when the test failed'}, 'categoryScores': {'type': 'object', 'properties': {'nojs': {'type': 'number', 'description': 'No-JS rendering score (0-100)'}, 'schema': {'type': 'number', 'description': 'schema.org markup score (0-100)'}, 'social': {'type': 'number', 'description': 'Social tags score (0-100)'}, 'headings': {'type': 'number', 'description': 'Heading structure score (0-100)'}, 'semantic': {'type': 'number', 'description': 'Semantic HTML5 score (0-100)'}, 'javascript': {'type': 'number', 'description': 'JavaScript dependency score (0-100)'}, 'accessibility': {'type': 'number', 'description': 'Accessibility score (0-100)'}}, 'description': 'Score per analysis category (0-100)'}}, 'description': 'One test snapshot: tid, createdAt, overallScore, categoryScores'}, 'testCount': {'type': 'integer', 'description': 'Total tests ever run for this URL'}, 'isSameTest': {'type': 'boolean', 'description': 'True when baseline and latest are the same test (no movement yet)'}}}, 'description': 'One row per matched URL, baseline vs latest with deltas'}, 'compare': {'type': ['object', 'null'], 'description': 'Comparison window settings used'}, 'hasMore': {'type': 'boolean', 'description': 'True when more pages exist'}, 'returned': {'type': 'integer', 'description': 'Records in this page'}, 'urlCount': {'type': 'integer', 'description': 'Total matched URLs before pagination'}, 'truncated': {'type': 'boolean', 'deprecated': True, 'description': 'Deprecated. Use `hasMore` instead.'}, 'nextOffset': {'type': ['integer', 'null'], 'description': 'Offset for the next page, null on the last page'}, 'windowSummary': {'type': ['object', 'null'], 'description': 'Summary of window comparison results'}, 'includeSubdomains': {'type': 'boolean', 'description': 'Whether subdomains were included in the domain search'}}, 'description': 'Baseline vs latest comparison with pre-computed deltas, scoped to one URL or a whole domain'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['tid'], 'properties': {'tid': {'type': 'string', 'description': 'Opaque 8-character hash ID returned by gvt_run_visibility_test or gvt_list_tests. Not an integer.'}, 'detail': {'enum': ['summary', 'full'], 'type': 'string', '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).'}}}
Output schema
{'type': 'object', 'properties': {'tid': {'type': 'string', 'description': 'The test ID that was polled'}, 'url': {'type': ['string', 'null'], 'description': 'The URL that was analyzed'}, 'detail': {'enum': ['summary'], 'type': 'string', 'description': 'Present with value "summary" when detail=summary was requested; omitted from full responses so existing callers see no change'}, 'status': {'enum': ['pending', 'processing', 'completed', 'failed'], 'type': 'string', 'description': 'Pending and running mean poll again; completed means full results are present'}, 'results': {'type': 'array', 'items': {'type': 'object', 'properties': {'score': {'type': 'number', 'description': 'Category score (0-100), present in summary mode when the category reports one'}, 'issues': {'type': 'array', 'description': 'Issue records; in summary mode each carries type, severity, impact, weight, element, description, and fixId (remediation comes from gvt_get_fix, not the payload)'}, 'analysisType': {'enum': ['heading', 'semantic', 'accessibility', 'schema', 'javascript', 'nojs', 'social'], 'type': 'string', 'description': 'Which analysis category this record holds'}}}, 'description': '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 analysisType, score, and the top issues deduplicated by type (capped at 10 per category); the nojs_rendered duplicate pass is omitted — analysisSummary.categoryIssueCounts keeps the true totals.'}, 'isPublic': {'type': ['boolean', 'null'], 'description': 'Whether this test result is publicly accessible'}, 'testType': {'enum': ['url', 'html_paste'], 'type': 'string', 'description': 'Type of test performed (e.g., URL or direct HTML paste)'}, 'createdAt': {'type': 'string', 'description': 'ISO 8601 instant of test creation'}, 'expiresAt': {'type': ['string', 'null'], 'description': 'ISO 8601 instant when this test session and its results will expire and be deleted'}, 'updatedAt': {'type': 'string', 'description': 'ISO 8601 instant of the last update to this test session'}, 'shareableTid': {'type': ['string', 'null'], 'description': '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 indicator that share links may be generated.'}, 'analysisSummary': {'type': 'object', 'properties': {'timestamp': {'type': 'string', 'description': 'ISO 8601 instant of the analysis'}, 'totalIssues': {'type': 'integer', 'description': 'Total open issues across all categories'}, 'overallScore': {'type': 'number', 'description': 'Overall GEO visibility score (0-100)'}, 'categoryScores': {'type': 'object', 'properties': {'nojs': {'type': 'number', 'description': 'No-JS rendering score (0-100)'}, 'schema': {'type': 'number', 'description': 'schema.org markup score (0-100)'}, 'social': {'type': 'number', 'description': 'Social tags score (0-100)'}, 'headings': {'type': 'number', 'description': 'Heading structure score (0-100)'}, 'semantic': {'type': 'number', 'description': 'Semantic HTML5 score (0-100)'}, 'javascript': {'type': 'number', 'description': 'JavaScript dependency score (0-100)'}, 'accessibility': {'type': 'number', 'description': 'Accessibility score (0-100)'}}, 'description': 'Score per analysis category (0-100)'}, 'jsDependencySource': {'enum': ['measured', 'estimated', 'unavailable'], 'type': 'string', 'description': 'How the JS dependency score was derived'}, 'categoryIssueCounts': {'type': 'object', 'properties': {'nojs': {'type': 'integer', 'description': 'Number of open No-JS rendering issues'}, 'schema': {'type': 'integer', 'description': 'Number of open schema.org markup issues'}, 'social': {'type': 'integer', 'description': 'Number of open social tag issues'}, 'headings': {'type': 'integer', 'description': 'Number of open heading structure issues'}, 'semantic': {'type': 'integer', 'description': 'Number of open semantic HTML5 issues'}, 'javascript': {'type': 'integer', 'description': 'Number of open JavaScript dependency issues'}, 'accessibility': {'type': 'integer', 'description': 'Number of open accessibility issues'}}, 'description': 'Open issue count per analysis category'}}, 'description': 'Aggregate scores for one test session'}, 'findingSentence': {'type': ['string', 'null'], 'description': 'Pre-generated natural language verdict; use as the primary summary'}}, 'description': 'Results for one test. While status is pending or running, results are incomplete — wait and retry. detail=summary returns the compact shape; detail=full (the default) returns complete per-category resultData.'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['urls'], 'properties': {'urls': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 100, 'minItems': 1, 'description': 'Array of URLs to look up (max 100).'}}}
Output schema
{'type': 'object', 'properties': {'found': {'type': 'integer', 'description': 'URLs that had at least one test'}, 'ttlMs': {'type': 'integer', 'description': 'Suggested client cache lifetime in milliseconds'}, 'results': {'type': 'array', 'items': {'type': 'object', 'properties': {'url': {'type': 'string', 'description': 'The URL this record describes'}, 'oldest': {'type': ['object', 'null'], 'properties': {'tid': {'type': 'string', 'description': 'Test ID of this snapshot'}, 'createdAt': {'type': 'string', 'description': 'ISO 8601 instant of this snapshot'}, 'overallScore': {'type': ['number', 'null'], 'description': 'Overall GEO visibility score (0-100), null when the test failed'}, 'categoryScores': {'type': 'object', 'properties': {'nojs': {'type': 'number', 'description': 'No-JS rendering score (0-100)'}, 'schema': {'type': 'number', 'description': 'schema.org markup score (0-100)'}, 'social': {'type': 'number', 'description': 'Social tags score (0-100)'}, 'headings': {'type': 'number', 'description': 'Heading structure score (0-100)'}, 'semantic': {'type': 'number', 'description': 'Semantic HTML5 score (0-100)'}, 'javascript': {'type': 'number', 'description': 'JavaScript dependency score (0-100)'}, 'accessibility': {'type': 'number', 'description': 'Accessibility score (0-100)'}}, 'description': 'Score per analysis category (0-100)'}}, 'description': 'One test snapshot: tid, createdAt, overallScore, categoryScores'}}}, 'description': 'One entry per requested URL, in request order'}, 'requested': {'type': 'integer', 'description': 'Number of URLs requested'}}, 'description': 'Oldest baseline snapshots for a batch of URLs (up to 100)'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
Output schema
{'type': 'object', 'properties': {'ttlMs': {'type': 'integer', 'description': 'Suggested client cache lifetime in milliseconds'}, 'prompts': {'type': 'array', 'items': {'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Prompt name for gvt_get_prompt'}, 'title': {'type': 'string', 'description': 'Human-readable display name'}, 'arguments': {'type': 'array', 'items': {'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Argument name'}, 'required': {'type': 'boolean', 'description': 'True when the argument must be supplied'}, 'description': {'type': 'string', 'description': 'What the argument controls'}}}, 'description': 'Arguments the prompt accepts'}, 'description': {'type': 'string', 'description': 'What the prompt workflow does'}}}, 'description': 'The prompt workflow catalog'}, 'promptCount': {'type': 'integer', 'description': 'Number of prompt workflows in the catalog'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'default': 25, 'maximum': 100, 'minimum': 1, 'description': 'The maximum number of schedules requested for this page.'}, 'domain': {'type': 'string', 'description': 'Filter to schedules matching this domain substring.'}, 'offset': {'type': 'integer', 'default': 0, 'minimum': 0, 'description': 'The number of skipped items from the beginning of the result set.'}, 'status': {'enum': ['active', 'paused', 'completed'], 'type': 'string', 'description': 'Filter by the derived overall state of the schedule.'}, 'frequency': {'enum': ['daily', 'weekly', 'monthly', 'once'], 'type': 'string', 'description': 'Filter by repetition interval.'}, 'sortDirection': {'enum': ['asc', 'desc'], 'type': 'string', 'default': 'desc', 'description': 'Sort order by creation time; desc is newest first.'}, 'includeSubdomains': {'type': 'boolean', 'default': True, 'description': 'Whether subdomains should be included in the domain filter match.'}, '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.'}}}
Output schema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'description': 'Page size applied to this response'}, 'total': {'type': 'integer', 'description': 'Total schedules matching the filters, across all pages'}, 'domain': {'type': ['string', 'null'], 'description': 'The applied domain filter, null when unfiltered'}, 'offset': {'type': 'integer', 'description': 'Offset applied to this response'}, 'status': {'type': ['string', 'null'], 'description': 'The applied status filter, null when unfiltered'}, 'hasMore': {'type': 'boolean', 'description': 'True when more results exist beyond this page'}, 'frequency': {'type': ['string', 'null'], 'description': 'The applied frequency filter, null when unfiltered'}, 'schedules': {'type': 'array', 'items': {'type': 'object', 'properties': {'url': {'type': 'string', 'description': 'The monitored URL'}, 'schid': {'type': 'string', 'description': 'Opaque 8-character schedule identifier, accepted by the gvt_schedule_test pause/resume/cancel/change_frequency modes'}, 'status': {'enum': ['active', 'paused', 'completed'], 'type': 'string', 'description': 'Derived overall state; cancelled schedules are deleted outright and never appear here'}, 'isPaused': {'type': 'boolean', 'description': 'True when the schedule is paused; a paused schedule retains its schid and its nextRunAt'}, 'wpPostId': {'type': ['string', 'null'], 'description': 'WordPress post ID when the schedule was created from the WordPress plugin, null otherwise'}, 'createdAt': {'type': 'string', 'description': 'ISO 8601 instant the schedule was created'}, 'frequency': {'enum': ['daily', 'weekly', 'monthly', 'once'], 'type': 'string', 'description': 'How often the test recurs; once is a one-off scheduled run'}, 'lastRunAt': {'type': ['string', 'null'], 'description': 'ISO 8601 instant of the most recent completed run, null when it has not run yet'}, 'nextRunAt': {'type': ['string', 'null'], 'description': 'ISO 8601 instant of the next queued run. Retained while paused (it fires on resume); null for completed one-off runs or when nothing is scheduled yet'}, 'updatedAt': {'type': ['string', 'null'], 'description': 'ISO 8601 instant of the most recent schedule change, null when never modified'}, 'autoPauseReason': {'type': ['string', 'null'], 'description': 'Reason the schedule was automatically paused, null when not auto-paused'}, 'consecutiveFailureCount': {'type': 'integer', 'description': 'Number of consecutive failed runs; a high count precedes auto-pause'}}}, 'description': 'One entry per schedule, newest first by creation time'}, 'nextOffset': {'type': ['integer', 'null'], 'description': 'Offset for the next page, null when hasMore is false'}, 'includeSubdomains': {'type': 'boolean', 'description': 'The applied subdomain-inclusion setting'}, 'allowedFrequencies': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Frequencies the caller may set when creating schedules'}, 'maxActiveSchedules': {'type': 'integer', 'description': "The caller's cap on active schedules; add mode enforces this limit"}, 'includeCompletedOnce': {'type': 'boolean', 'description': 'Whether completed one-off rows were included in this response'}}, 'description': "Paginated roster of the caller's monitoring schedules with applied filters echoed back."}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'The target website URL or an explicit sitemap .xml URL.'}, 'sort': {'enum': ['significance', 'lastmod', 'alphabetical', 'document'], 'type': 'string', 'default': 'significance', 'description': "How to sort the discovered URLs. 'significance' uses SEO heuristics."}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 500, 'minimum': 1, 'description': 'Maximum number of URLs to return (default 10).'}, 'exclude': {'type': 'array', 'items': {'type': 'string'}, 'description': "Wildcard patterns to reject (e.g., '*archive*')."}, 'include': {'type': 'array', 'items': {'type': 'string'}, 'description': "Wildcard patterns to require (e.g., '*blog*'). Only '*' wildcards are supported."}, 'legalPages': {'enum': ['include', 'exclude', 'only'], 'type': 'string', '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.'}, '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.'}, 'excludeDisallowed': {'type': 'boolean', 'default': False, 'description': 'If true, silently drops URLs that are blocked by robots.txt.'}}}
Output schema
{'type': 'object', 'properties': {'sort': {'enum': ['significance', 'lastmod', 'alphabetical', 'document'], 'type': 'string', 'description': 'The sort actually applied to the results'}, 'urls': {'type': 'array', 'items': {'type': 'object', 'properties': {'url': {'type': 'string', 'description': 'The discovered URL'}, 'lastmod': {'type': ['string', 'null'], 'description': 'Last-modified timestamp from the sitemap, when present'}, 'priority': {'type': ['number', 'null'], 'description': 'Sitemap priority hint, when present'}, 'legalPage': {'type': 'boolean', 'description': 'True when detected as legal/policy boilerplate'}, 'pathDepth': {'type': 'integer', 'description': 'Path depth from the site root (1 = homepage)'}, 'changefreq': {'type': ['string', 'null'], 'description': 'Sitemap change frequency hint, when present'}, 'alreadyTested': {'type': 'boolean', 'description': 'True when the caller has an existing test for this URL'}, 'alreadyScheduled': {'type': 'boolean', 'description': 'True when this URL is already in the testing queue'}, 'significanceScore': {'type': 'number', 'description': 'SEO significance score used for the default ranking'}, 'disallowedByRobots': {'type': 'boolean', 'description': 'True when robots.txt disallows crawling this URL'}}}, 'description': 'Discovered URLs, ranked per the sort setting'}, 'limit': {'type': 'integer', 'description': 'Effective result cap'}, 'errors': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Per-sitemap fetch or parse failures; non-empty means discovery was partial'}, 'hasMore': {'type': 'boolean', 'description': 'True when the filtered set was cut short by the limit'}, 'matched': {'type': 'integer', 'description': 'URLs remaining after include/exclude and legalPages filters'}, 'returned': {'type': 'integer', 'description': 'URLs actually returned after the limit'}, 'truncated': {'type': 'boolean', 'description': 'True if the underlying sitemap parser hit its 5000-URL cap during fetching.'}, 'legalPages': {'enum': ['include', 'exclude', 'only'], 'type': 'string', 'description': 'The legal-page filter actually applied'}, 'bulkUrlLimit': {'type': 'integer', 'description': "How many of these URLs the caller's tier permits in one batch-analyze call."}, 'requestedUrl': {'type': 'string', 'description': 'The URL or sitemap URL that was resolved'}, 'sitemapCount': {'type': 'integer', 'description': 'Number of sitemaps parsed'}, 'robotsTxtFound': {'type': 'boolean', 'description': 'Whether a robots.txt was found and consulted'}, 'legalPagesFound': {'type': 'integer', 'description': 'How many of the URLs discovered across all sitemaps were detected as legal/policy boilerplate, counted BEFORE any filtering or limiting is applied.'}, 'totalDiscovered': {'type': 'integer', 'description': 'Raw URL count discovered before filtering'}, 'resolvedSitemaps': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Sitemap URLs actually parsed'}}, 'description': 'Ranked URL discovery from a domain XML sitemaps'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'url': {'type': 'string', 'description': 'URL to filter tests by; matched per urlMode (contains by default).'}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 100, 'minimum': 1, 'description': 'Max results to return (default 10, max 100)'}, 'domain': {'type': 'string', 'description': 'Domain to filter tests by, e.g. example.com. Subdomains are included unless includeSubdomains is false.'}, 'offset': {'type': 'integer', 'default': 0, '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.'}, 'status': {'enum': ['pending', 'processing', 'completed', 'failed'], 'type': 'string', 'description': 'Test status to filter by: pending, processing, completed, or failed.'}, 'urlMode': {'enum': ['exact', 'contains'], 'type': 'string', 'default': 'contains', 'description': 'How the url filter matches: "exact" for full-URL equality, "contains" for substring match.'}, 'testType': {'enum': ['url', 'html', 'html_paste'], 'type': 'string', 'description': 'Test type to filter by: url, html, or html_paste.'}, 'createdTo': {'type': 'string', 'description': 'Exclusive creation-date upper bound. YYYY-MM-DD (UTC midnight) or full ISO 8601 instant.'}, 'createdFrom': {'type': 'string', 'description': 'Inclusive creation-date lower bound. YYYY-MM-DD (UTC midnight) or full ISO 8601 instant.'}, 'sortDirection': {'enum': ['asc', 'desc'], 'type': 'string', 'default': 'desc', 'description': 'Sort direction by creation date: desc (newest first, default) or asc (oldest first).'}, '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.'}}}
Output schema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'description': 'Page size actually applied'}, 'tests': {'type': 'array', 'items': {'type': 'object', 'description': 'Test session summaries (tid, url, status, analysisSummary, createdAt)'}, 'description': 'The matching test sessions on this page'}, 'total': {'type': 'integer', 'description': 'Total matching tests before pagination'}, 'ttlMs': {'type': 'integer', 'description': 'Suggested client cache lifetime in milliseconds'}, 'domain': {'type': ['string', 'null'], 'description': 'The domain filter actually applied, if any'}, 'offset': {'type': 'integer', 'description': 'Row offset applied to this page'}, 'hasMore': {'type': 'boolean', 'description': 'True when more pages exist'}, 'createdTo': {'type': ['string', 'null'], 'description': 'Effective upper creation-date bound, if any'}, 'nextOffset': {'type': ['integer', 'null'], 'description': 'Offset for the next page, null on the last page'}, 'createdFrom': {'type': ['string', 'null'], 'description': 'Effective lower creation-date bound, if any'}, 'includeSubdomains': {'type': 'boolean', 'description': 'Whether subdomains were included in the domain filter'}}, 'description': 'Filtered, paginated test history, newest first'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['urls'], 'properties': {'urls': {'type': 'array', 'items': {'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'The URL to analyze'}, 'wpPostId': {'type': 'string', 'description': 'Optional WordPress post ID for association'}, 'addToSchedule': {'type': 'object', 'required': ['frequency'], 'properties': {'frequency': {'enum': ['daily', 'weekly', 'monthly'], 'type': 'string', 'description': 'How often to re-run the test'}}}}}, 'maxItems': 500, 'minItems': 1, 'description': 'Array of URL objects to test (max 500)'}, 'webhookUrl': {'type': 'string', 'description': 'Optional HTTPS URL to receive a batch completion webhook'}}}
Output schema
{'type': 'object', 'properties': {'status': {'enum': ['queued'], 'type': 'string', 'description': 'Always queued at submission time'}, 'batchId': {'type': 'string', 'description': 'UUID for tracking the batch'}, 'totalUrls': {'type': 'integer', 'description': 'URLs accepted into the batch'}, 'webhookSecret': {'type': ['string', 'null'], 'description': 'HMAC secret for verifying the webhook, null when no webhook'}, 'webhookConfigured': {'type': 'boolean', 'description': 'True when a completion webhook URL was supplied'}}, 'description': 'Batch acknowledgement. Poll gvt_get_batch_status with the batchId until status is completed or failed, then retrieve results via gvt_get_test_results.'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'The URL to analyze'}, 'waitForJs': {'type': 'boolean', 'default': True, 'description': 'Wait for JavaScript rendering before analysis. Set to false to skip JS rendering (faster, but may miss dynamically injected content).'}}}
Output schema
{'type': 'object', 'properties': {'tid': {'type': 'string', 'description': '8-character test ID to poll with'}, 'next': {'type': 'object', 'properties': {'tool': {'enum': ['gvt_get_test_results'], 'type': 'string', 'description': 'The tool to call next'}, 'arguments': {'type': 'object', 'properties': {'tid': {'type': 'string', 'description': 'The tid to poll with'}}, 'description': 'Arguments for the next call'}}, 'description': 'The suggested next call'}, 'status': {'enum': ['pending'], 'type': 'string', 'description': 'Always pending at queue time'}, 'message': {'type': 'string', 'description': 'Human-readable acknowledgement with polling guidance'}}, 'description': 'Async acknowledgement. Poll gvt_get_test_results with the returned tid until status is not pending or running.'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': [], 'properties': {'mode': {'enum': ['add', 'delete', 'reset', 'pause', 'resume', 'cancel', 'change_frequency'], 'type': 'string', '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).'}, 'urls': {'type': 'array', 'items': {'type': 'object', 'required': [], 'properties': {'url': {'type': 'string', 'description': 'The URL to schedule (required for add mode; optional in delete mode if schid is provided)'}, 'schid': {'type': 'string', 'description': 'Schedule ID (required for delete/reset modes)'}, 'wpPostId': {'type': 'string', 'description': 'Optional WordPress post ID for association'}, 'addToSchedule': {'type': 'object', 'required': ['frequency'], 'properties': {'frequency': {'enum': ['daily', 'weekly', 'monthly'], 'type': 'string', 'description': 'How often to re-run the test'}}}}}, 'minItems': 1, 'description': 'Array of URL/schedule objects. Required for add, delete, and reset modes.'}, 'schid': {'type': 'string', 'description': 'Schedule ID. Required for pause, resume, cancel, and change_frequency modes.'}, '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.'}, 'frequency': {'enum': ['daily', 'weekly', 'monthly'], 'type': 'string', 'description': 'New frequency for the schedule. Required for change_frequency mode.'}}}
Output schema
{'type': 'object', 'properties': {'success': {'type': 'boolean', 'description': 'True when the requested mode completed'}, 'scheduled': {'type': 'array', 'items': {'type': 'object', 'properties': {'url': {'type': 'string', 'description': 'The URL placed on schedule'}, 'schid': {'type': 'string', 'description': 'Schedule ID for later pause/resume/cancel calls'}, 'wpPostId': {'type': ['string', 'null'], 'description': 'Associated WordPress post ID, when provided'}}}, 'description': 'Schedules now in effect (add/reset modes)'}, 'deletedByUrl': {'type': 'array', 'items': {'type': 'object', 'properties': {'url': {'type': 'string', 'description': 'The URL whose schedules were deleted'}, 'count': {'type': 'integer', 'description': 'Number of schedule entries deleted for this URL'}, 'frequencies': {'type': 'array', 'items': {'enum': ['daily', 'weekly', 'monthly', 'once'], 'type': 'string'}, 'description': 'Frequencies that were removed for this URL'}}}, 'description': 'Per-URL breakdown of deleted schedules (delete mode). Present on delete mode responses, including schid-based deletes; omitted for reset mode.'}, 'deletedCount': {'type': 'integer', 'description': 'Schedule entries removed (delete/reset modes)'}, 'upsertedCount': {'type': 'integer', 'description': 'Schedules created or updated (add/reset modes)'}}, 'description': 'Result varies by mode: add/reset return upsertedCount and scheduled; delete returns deletedCount and deletedByUrl'}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['tid', 'is_public'], '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.'}}}
Output schema
{'type': 'object', 'properties': {'tid': {'type': 'string', 'description': 'The test that was modified'}, 'success': {'type': 'boolean', 'description': 'True when the visibility change was applied'}, 'is_public': {'type': 'boolean', 'description': 'The new public visibility state'}, 'share_url': {'type': ['string', 'null'], 'description': 'Public share URL, present when is_public is true; the recipient needs no authentication. Null when sharing failed or the test is private'}}}
Recent tool changes
Similar MCP servers
SharksAPI.AI
Provides marketing analytics and actions across GA4, Search Console, Google Ads, social channels, SEO, WordPress, and marketing p…
synter-ads
Manages cross-platform advertising campaigns, audiences, tracking, creative, landing pages, campaign audits, technology intellige…
synter-ads
Manages cross-platform advertising campaigns, audiences, tracking, creative, landing pages, campaign audits, technology intellige…
Stratalize Intelligence
Provides vendor, market, SaaS, workforce, government contract, public company, regulatory, competitive, and AI-brand intelligence…
captapi
Retrieves social media profiles, posts, engagement metrics, comments, marketplace listings, events, and Meta advertising data acr…
CorpusIQ
Connects authenticated users to business systems such as CRM, ecommerce, advertising, analytics, email marketing, SEO, calendars,…
Rahul D Sarker: Marketing & RevOps Tools
Provides marketing, revenue operations, sales, advertising, SaaS, and conversion calculators, along with article search and consu…
Thousand API
Provides deterministic data conversion, validation, JSON transformation, statistical calculations, date and schedule utilities, i…