Read Search Console, Bing Webmaster, GA4 and PageSpeed data through one self-hosted MCP server.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http
verified
reported
listed in the official MCP registry counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit c942b75 · analyzer v33 · 3w ago
skills & prompt files 1
danger signals2
- suspicious endpoint analytics.google.com (telemetry) psyb0t-rankrat-c942b75/src/rankrat/services/onboarding_guide.py :52
_GOOGLE_ANALYTICS_ADMIN_URL = "https://analytics.google.com" - suspicious endpoint analytics.google.com (telemetry) psyb0t-rankrat-c942b75/tests/contract/test_onboarding_guide.py :67
assert account["start_url"] == "https://analytics.google.com"
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 200
filesystem 83
- fs (weak) psyb0t-rankrat-c942b75/scripts/generate_openapi.py :7
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/scripts/init_indexnow.py :7
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/scripts/run_live_http_image.py :9
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/scripts/verify_indexnow_public_key.py :8
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/cli.py :11
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/config.py :6
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/constants.py :5
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/logging.py :13
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/models/boundaries.py :8
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/models/common.py :8
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/operator/guided_setup.py :10
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/operator/indexnow.py :14
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/operator/site_onboarding.py :11
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/policy/boundaries.py :6
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/base.py :8
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/bing.py :13
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/clarity.py :10
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/cloudflare.py :8
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/cloudflare_performance.py :14
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/crux.py :10
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/google_analytics.py :9
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/google_analytics_admin.py :8
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/google_oauth.py :19
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/google_search_console.py :14
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/indexnow.py :7
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/lighthouse.py :9
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/providers/pagespeed.py :11
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/state/sqlite.py :16
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/transports/auth.py :8
from pathlib import Path - fs psyb0t-rankrat-c942b75/src/rankrat/transports/runtime.py :266
SQLiteStateRepository.open(settings.state_database, settings.state_retention_days) - fs (weak) psyb0t-rankrat-c942b75/tests/conftest.py :5
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/contract/test_http.py :5
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/contract/test_openapi_snapshot.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/integration/test_google_account_discovery.py :5
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/integration/test_google_oauth_operator.py :5
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/integration/test_indexnow_operator.py :6
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/integration/test_live_http_image.py :8
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/integration/test_monitoring_state.py :7
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/integration/test_runtime.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/integration/test_site_onboarding.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/integration/test_stdio_process.py :6
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/integration/test_upload_indexnow_export.py :5
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/security/test_cpython_stdlib_vex.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/security/test_regressions.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/operator/test_guided_setup.py :5
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/operator/test_indexnow.py :6
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/operator/test_monitoring.py :5
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/operator/test_site_onboarding.py :5
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_bing.py :5
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_clarity.py :3
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_cloudflare.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_cloudflare_edge_redirects.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_cloudflare_performance.py :6
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_crux.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_analytics.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_analytics_admin.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_analytics_admin_reads.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_indexing.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_oauth.py :6
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_search_console.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_site_verification.py :3
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_site_writes.py :3
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_sitemap_writes.py :3
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_tag_manager.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_indexnow.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_lighthouse.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_pagespeed.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/state/test_sqlite.py :6
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_bing_content_service.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_boundaries_and_models.py :8
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_cli.py :5
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_config_services_and_logging.py :6
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_google_analytics_service.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_google_indexing_service.py :3
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_google_search_console_service.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_google_site_service.py :3
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_google_sitemap_service.py :3
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_lighthouse_service.py :3
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_make_runtime.py :3
import shutil - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_openapi_source.py :4
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_openclaw_bridge.py :6
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_seo_platform_expansion.py :3
from pathlib import Path - fs (weak) psyb0t-rankrat-c942b75/tests/unit/test_site_audit_diagnostics.py :3
from pathlib import Path
shell / exec 5
- shell (weak) psyb0t-rankrat-c942b75/tests/integration/test_indexnow_operator.py :4
import subprocess - shell (weak) psyb0t-rankrat-c942b75/tests/integration/test_live_http_image.py :5
import subprocess - shell (weak) psyb0t-rankrat-c942b75/tests/integration/test_upload_indexnow_export.py :3
import subprocess - shell (weak) psyb0t-rankrat-c942b75/tests/unit/test_make_runtime.py :4
import subprocess - shell (weak) psyb0t-rankrat-c942b75/tests/unit/test_openclaw_bridge.py :5
import subprocess
network 83
- net (weak) psyb0t-rankrat-c942b75/scripts/run_live_http_image.py :12
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/models/boundaries.py :10
from urllib.parse import urlparse, urlunparse - net psyb0t-rankrat-c942b75/src/rankrat/operator/content_opportunities.py :9
from urllib.parse import urljoin - net psyb0t-rankrat-c942b75/src/rankrat/operator/indexnow.py :17
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/operator/internal_links.py :8
from urllib.parse import unquote, urljoin, urlsplit - net psyb0t-rankrat-c942b75/src/rankrat/operator/site_onboarding.py :12
from urllib.parse import urlparse - net psyb0t-rankrat-c942b75/src/rankrat/operator/site_ownership.py :7
from urllib.parse import urlparse - net psyb0t-rankrat-c942b75/src/rankrat/providers/base.py :11
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/providers/bing.py :14
from urllib.parse import urlparse - net psyb0t-rankrat-c942b75/src/rankrat/providers/clarity.py :13
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/providers/cloudflare.py :10
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/providers/cloudflare_performance.py :16
from urllib.parse import urlsplit - net psyb0t-rankrat-c942b75/src/rankrat/providers/connectivity.py :19
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/providers/crux.py :12
from urllib.parse import urlsplit - net psyb0t-rankrat-c942b75/src/rankrat/providers/dns.py :11
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/providers/google_analytics.py :11
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/providers/google_analytics_admin.py :10
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/providers/google_oauth.py :21
from urllib.parse import parse_qs, urlencode, urlsplit - net psyb0t-rankrat-c942b75/src/rankrat/providers/google_search_console.py :15
from urllib.parse import quote - net psyb0t-rankrat-c942b75/src/rankrat/providers/google_site_verification.py :10
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/providers/google_tag_manager.py :12
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/providers/indexnow.py :9
from urllib.parse import unquote, urlparse, urlunparse - net psyb0t-rankrat-c942b75/src/rankrat/providers/lighthouse.py :10
from urllib.parse import urlsplit - net psyb0t-rankrat-c942b75/src/rankrat/providers/pagespeed.py :14
import httpx - net psyb0t-rankrat-c942b75/src/rankrat/providers/schema_fetch.py :10
from urllib.parse import urlparse - net psyb0t-rankrat-c942b75/src/rankrat/providers/site_fetch.py :7
from urllib.parse import urlparse - net psyb0t-rankrat-c942b75/src/rankrat/services/bing.py :13
from urllib.parse import urlparse - net psyb0t-rankrat-c942b75/src/rankrat/services/cross_provider.py :8
from urllib.parse import urlsplit - net psyb0t-rankrat-c942b75/src/rankrat/services/edge_redirects.py :6
from urllib.parse import urlsplit - net psyb0t-rankrat-c942b75/src/rankrat/services/indexnow.py :11
from urllib.parse import quote, unquote, urlparse, urlunparse - net psyb0t-rankrat-c942b75/src/rankrat/services/site_audit.py :10
from urllib.parse import urljoin, urlparse - net psyb0t-rankrat-c942b75/src/rankrat/transports/mcp.py :10
from urllib.parse import unquote - net (weak) psyb0t-rankrat-c942b75/tests/conftest.py :7
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_bing_opportunity_matrix.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_cross_provider.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_free_seo_platform.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_ga4_search_console_comparison.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_google_account_discovery.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_google_analytics_admin.py :3
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_google_indexing.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_http.py :8
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_lighthouse.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_mcp.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_onboarding_guide.py :90
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_openapi_snapshot.py :7
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_pagespeed_core_web_vitals.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_search_engine_comparison.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_search_engine_traffic_health.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_seo_intelligence.py :8
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_seo_platform.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/contract/test_site_onboarding.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/integration/test_google_account_discovery.py :7
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/integration/test_google_oauth_operator.py :6
from urllib.parse import parse_qs, urlparse - net (weak) psyb0t-rankrat-c942b75/tests/integration/test_live_http_image.py :11
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/integration/test_runtime.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/integration/test_site_onboarding.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/security/test_regressions.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/operator/test_indexnow.py :8
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_base.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_bing.py :7
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_clarity.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_cloudflare.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_cloudflare_edge_redirects.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_cloudflare_performance.py :8
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_connectivity.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_crux.py :7
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_dns.py :3
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_analytics.py :7
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_analytics_admin.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_analytics_admin_reads.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_indexing.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_oauth.py :7
from urllib.parse import parse_qs, urlparse - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_search_console.py :7
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_site_verification.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_site_writes.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_sitemap_writes.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_google_tag_manager.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_indexnow.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_lighthouse.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_pagespeed.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_schema_fetch.py :6
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/providers/test_site_fetch.py :5
import httpx - net (weak) psyb0t-rankrat-c942b75/tests/unit/test_lighthouse_service.py :5
import httpx
secrets 1
- secrets psyb0t-rankrat-c942b75/src/rankrat/operator/guided_setup.py :5
import getpass
database 2
- db psyb0t-rankrat-c942b75/src/rankrat/state/sqlite.py :7
import sqlite3 - db (weak) psyb0t-rankrat-c942b75/tests/integration/test_monitoring_state.py :3
import sqlite3
declared dependencies 9
- mcp@==1.28.1
- fastapi@==0.139.2
- httpcore@==1.0.9
- httpx@==0.28.1
- pydantic@==2.12.5
- pydantic-settings@==2.10.1
- pyyaml@==6.0.3
- starlette@==1.3.1
- uvicorn@==0.35.0