Open-source, evidence-first scanner for passive AI agent readiness signals on websites.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 4 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
explain_check
-
get_core_score
-
list_checks
-
scan_site
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit fe65ac1 · analyzer v33 · 4d ago
danger signals6
- suspicious endpoint 169.254.169.254 (cloud metadata) Scovant-scovant-core-fe65ac1/tests/test_client_security.py :26
return httpx.Response(302, headers={"location": "http://169.254.169.254/"}) - suspicious endpoint 93.184.216.34 Scovant-scovant-core-fe65ac1/tests/test_pinned_transport.py :109
_client(t2).get("https://93.184.216.34/") - suspicious endpoint 169.254.169.254 (cloud metadata) Scovant-scovant-core-fe65ac1/tests/test_private_networks.py :83
301, headers={"location": "http://169.254.169.254/latest/meta-data/"}, - suspicious endpoint 169.254.169.254 (cloud metadata) Scovant-scovant-core-fe65ac1/tests/test_security_suite.py :285
return httpx.Response(302, headers={"location": "http://169.254.169.254/latest/meta-data/"}) - suspicious endpoint 1.1.1.1 Scovant-scovant-core-fe65ac1/tests/test_url_safety.py :16
result = assert_safe_public_url("https://1.1.1.1", require_https=True) - suspicious endpoint 169.254.169.254 (cloud metadata) Scovant-scovant-core-fe65ac1/tests/test_url_safety.py :23
assert_safe_public_url("http://169.254.169.254/latest/meta-data/", require_https=False)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 224
filesystem 21
- fs Scovant-scovant-core-fe65ac1/src/scovant_core/action.py :31
from pathlib import Path - fs Scovant-scovant-core-fe65ac1/src/scovant_core/cli.py :16
from pathlib import Path - fs Scovant-scovant-core-fe65ac1/src/scovant_core/docs.py :25
from pathlib import Path - fs Scovant-scovant-core-fe65ac1/src/scovant_core/schema.py :22
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/_fixture_server.py :23
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/_source_tree.py :23
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/conftest.py :5
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_action_guard.py :8
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_checks_operability_2.py :69
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_constraints.py :5
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_docs.py :7
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_docs_standards.py :1
from pathlib import Path
show 9 more
- fs (weak) Scovant-scovant-core-fe65ac1/tests/test_hardening_followups.py :6
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_no_cloud_imports.py :3
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_no_competitor_terms.py :14
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_npm_package.py :8
import shutil - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_parsers_html.py :2
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_registry_derivation.py :7
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_repo_hygiene.py :3
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_schema.py :7
from pathlib import Path - fs (weak) Scovant-scovant-core-fe65ac1/tests/test_truncation_check_completeness.py :20
from pathlib import Path
shell / exec 2
- shell (weak) Scovant-scovant-core-fe65ac1/tests/test_action_guard.py :7
import subprocess - shell (weak) Scovant-scovant-core-fe65ac1/tests/test_npm_package.py :9
import subprocess
network 52
- net Scovant-scovant-core-fe65ac1/src/scovant_core/analysis/integrity_probe.py :22
import socket - net Scovant-scovant-core-fe65ac1/src/scovant_core/checks/access/core_access_007.py :3
from urllib.parse import urlsplit, urlunsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/checks/access/core_access_011.py :5
from urllib.parse import urlsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/cli.py :17
from urllib.parse import urlsplit, urlunsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/context.py :5
from urllib.parse import urlsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/contribute.py :6
from urllib.parse import urlsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/engine.py :10
from urllib.parse import urlsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/__init__.py :1
"""Network probes; every function takes an httpx.Client and never raises.""" - net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/_http.py :31
both a real `httpx.Response` and `security.client._ProbeResponse` (the - net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/agent_payments.py :13
import httpx - net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/contact.py :6
from urllib.parse import urljoin, urlsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/link_headers.py :11
import httpx
show 28 more
- net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/machine_rep.py :12
import httpx - net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/markdown.py :11
import httpx - net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/oauth.py :7
from urllib.parse import urlsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/openapi.py :6
from urllib.parse import urljoin, urlsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/pages.py :5
from urllib.parse import urlsplit, urlunsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/policy_pages.py :21
from urllib.parse import urljoin, urlsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/gatherers/reference_integrity.py :13
from urllib.parse import urlsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/parsers/html.py :11
from urllib.parse import parse_qsl, urlencode, urljoin, urlsplit, urlunsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/parsers/robots.py :6
from urllib.robotparser import RobotFileParser - net Scovant-scovant-core-fe65ac1/src/scovant_core/security/client.py :19
from urllib.parse import urlsplit - net Scovant-scovant-core-fe65ac1/src/scovant_core/security/pinned_transport.py :10
import socket - net Scovant-scovant-core-fe65ac1/src/scovant_core/security/url_safety.py :6
import socket - net (weak) Scovant-scovant-core-fe65ac1/tests/_fixture_server.py :5
only works inside this process, via `httpx.BaseTransport` injection). - net (weak) Scovant-scovant-core-fe65ac1/tests/conftest.py :7
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_checks_access.py :5
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_checks_interfaces.py :3
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_checks_interfaces_2.py :5
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_checks_machine.py :3
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_checks_machine_2.py :3
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_checks_operability_2.py :3
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_checks_trust_2.py :3
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_checks_trust_operability.py :3
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_cli.py :3
to a `FixtureTransport` (or a raising `httpx.MockTransport`) so every case is - net (weak) Scovant-scovant-core-fe65ac1/tests/test_client_security.py :1
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_contribute.py :3
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_gatherers.py :1
"""Network gatherer probes: httpx.MockTransport-based unit tests. - net (weak) Scovant-scovant-core-fe65ac1/tests/test_gatherers_core.py :1
import httpx - net (weak) Scovant-scovant-core-fe65ac1/tests/test_gatherers_more.py :4
import httpx
12 more not shown — this panel samples each group; the count above is the real total.
tool registrations 4
- scan_site Scovant-scovant-core-fe65ac1/src/scovant_core/mcp_server.py :62
- get_core_score Scovant-scovant-core-fe65ac1/src/scovant_core/mcp_server.py :68
- list_checks Scovant-scovant-core-fe65ac1/src/scovant_core/mcp_server.py :92
- explain_check Scovant-scovant-core-fe65ac1/src/scovant_core/mcp_server.py :113
declared dependencies 13
- mcp@>=1.28,<2
- httpx@>=0.27,<1
- beautifulsoup4@>=4.12,<5
- lxml@>=5.2,<7
- tldextract@>=5,<6
- pydantic@>=2.7,<3
- pytest@>=8,<9
- pytest-cov@>=5,<7
- ruff@==0.16.6
- jsonschema@>=4.20,<5
- mypy@>=1.10,<2
- twine@>=5,<7
show 1 more
- pyyaml@>=6,<7