https://github.com/sharkyger/mcp-safe-fetch
· scanned 2026-06-16 00:09 UTC (2 months, 2 weeks ago)
15 raw signals (0 security + 15 graph)
Last scanned 2 months, 2 weeks ago · v1 · 14 actionable findings from 1 signal source. 1 repeated signal grouped for readability. Security checks, system graph analysis, and verified AI-agent feedback are merged into one review queue.
All 204 nodes from the latest scan, grouped by kind. Each node is a unit the engine identified (file, function, endpoint, table…). Most users won't need this view — it's primarily for debugging the engine's graph extraction or for AI agents that want to enumerate the project structure.
| Label | Layer | Status | Path |
|---|---|---|---|
test_validate_url_rejects_bad_schemes_and_structures |
software | healthy | tests/test_server.py:33 |
test_validate_url_blocks_ip_literals |
software | healthy | tests/test_server.py:59 |
test_validate_url_rejects_invalid_port |
software | healthy | tests/test_server.py:66 |
test_validate_url_blocks_localhost_literal |
software | healthy | tests/test_server.py:72 |
test_validate_url_accepts_plain_hostname |
software | healthy | tests/test_server.py:78 |
test_is_ip_literal |
software | healthy | tests/test_server.py:101 |
test_ip_is_private |
software | healthy | tests/test_server.py:129 |
_fake_getaddrinfo |
software | healthy | tests/test_server.py:136 |
_impl |
software | healthy | tests/test_server.py:139 |
test_resolve_and_validate_blocks_private_resolution |
software | healthy | tests/test_server.py:145 |
test_resolve_and_validate_rejects_mixed_public_and_private |
software | healthy | tests/test_server.py:153 |
test_resolve_and_validate_returns_pinned_public_ip |
software | healthy | tests/test_server.py:163 |
test_resolve_and_validate_raises_on_dns_failure |
software | healthy | tests/test_server.py:168 |
_boom |
software | healthy | tests/test_server.py:169 |
test_redirect_targets_are_rejected_by_validation |
software | healthy | tests/test_server.py:191 |
test_none_and_blank_return_none |
software | healthy | tests/test_server.py:201 |
test_valid_header_parsed |
software | healthy | tests/test_server.py:205 |
test_value_may_contain_colons |
software | healthy | tests/test_server.py:208 |
test_malformed_no_colon_raises |
software | healthy | tests/test_server.py:212 |
test_empty_name_raises |
software | healthy | tests/test_server.py:216 |
test_crlf_injection_dropped |
software | healthy | tests/test_server.py:220 |
__init__ |
software | healthy | tests/test_server.py:252 |
getheader |
software | healthy | tests/test_server.py:241 |
read |
software | healthy | tests/test_server.py:244 |
close |
software | healthy | tests/test_server.py:262 |
request |
software | healthy | tests/test_server.py:256 |
getresponse |
software | healthy | tests/test_server.py:259 |
_patch_fetch |
software | healthy | tests/test_server.py:266 |
_fake_make_connection |
software | healthy | tests/test_server.py:272 |
test_fetch_without_credential_sends_no_auth |
software | healthy | tests/test_server.py:280 |
test_fetch_sends_credential_on_original_origin |
software | healthy | tests/test_server.py:287 |
test_fetch_keeps_credential_on_same_origin_redirect |
software | healthy | tests/test_server.py:293 |
test_fetch_drops_credential_on_cross_origin_redirect |
software | healthy | tests/test_server.py:303 |
test_fetch_refuses_credential_over_http |
software | healthy | tests/test_server.py:313 |
test_handle_search_unconfigured_fails_closed |
software | healthy | tests/test_server.py:324 |
test_handle_search_missing_query |
software | healthy | tests/test_server.py:331 |
test_handle_search_rejects_control_char_query |
software | healthy | tests/test_server.py:336 |
test_handle_search_happy_path_wraps_results |
software | healthy | tests/test_server.py:342 |
test_wrap_round_trip_on_empty_input |
software | healthy | tests/test_sanitizer.py:16 |
test_zero_width_unicode_is_stripped |
software | healthy | tests/test_sanitizer.py:22 |
test_html_comments_are_stripped |
software | healthy | tests/test_sanitizer.py:30 |
test_script_tag_is_stripped |
software | healthy | tests/test_sanitizer.py:37 |
_inner_body |
software | healthy | tests/test_sanitizer.py:44 |
test_inner_untrusted_tags_in_plain_text_are_neutered |
software | healthy | tests/test_sanitizer.py:52 |
test_inner_untrusted_tags_in_html_are_neutered_by_parser |
software | healthy | tests/test_sanitizer.py:66 |
test_length_cap_is_enforced |
software | healthy | tests/test_sanitizer.py:82 |
test_wrap_uses_provided_url |
software | healthy | tests/test_sanitizer.py:90 |
test_envelope_url_is_output_encoded |
software | healthy | tests/test_sanitizer.py:95 |
test_valid_https_template_passes |
software | healthy | tests/test_search.py:26 |
test_valid_http_template_passes |
software | healthy | tests/test_search.py:29 |
Showing first 50 of this kind. Full payload available via the JSON button at the top of the page.
| Label | Layer | Status | Path |
|---|---|---|---|
README.md |
software | healthy | README.md |
CLAUDE.md |
software | healthy | CLAUDE.md |
Dockerfile |
software | healthy | Dockerfile |
.coderabbit.yaml |
software | healthy | .coderabbit.yaml |
pyproject.toml |
software | healthy | pyproject.toml |
LICENSE |
software | healthy | LICENSE |
NOTICE |
software | healthy | NOTICE |
SCOPE.md |
software | healthy | SCOPE.md |
PLAN.md |
software | healthy | PLAN.md |
CHANGELOG.md |
software | healthy | CHANGELOG.md |
__init__.py |
software | healthy | tests/__init__.py |
test_server.py |
software | healthy | tests/test_server.py |
test_sanitizer.py |
software | healthy | tests/test_sanitizer.py |
test_search.py |
software | healthy | tests/test_search.py |
en.md |
software | healthy | docs/install/en.md |
fr.md |
software | healthy | docs/install/fr.md |
de.md |
software | healthy | docs/install/de.md |
README.md |
software | healthy | docs/install/img/README.md |
FUNDING.yml |
software | healthy | .github/FUNDING.yml |
dependabot.yml |
software | healthy | .github/dependabot.yml |
docker.yml |
software | healthy | .github/workflows/docker.yml |
ci.yml |
software | healthy | .github/workflows/ci.yml |
sanitizer.py |
software | healthy | src/mcp_safe_fetch/sanitizer.py |
__init__.py |
software | healthy | src/mcp_safe_fetch/__init__.py |
search.py |
software | healthy | src/mcp_safe_fetch/search.py |
server.py |
software | healthy | src/mcp_safe_fetch/server.py |
__main__.py |
software | healthy | src/mcp_safe_fetch/__main__.py |
CLAUDE.md |
quality | healthy | CLAUDE.md |
| Label | Layer | Status | Path |
|---|---|---|---|
127.0.0.1 |
network | healthy | README.md |
10.0.0.5 |
network | healthy | README.md |
169.254.169.254 |
network | healthy | README.md |
172.16.0.1 |
network | healthy | tests/test_server.py |
192.168.1.1 |
network | healthy | tests/test_server.py |
8.8.8.8 |
network | healthy | tests/test_server.py |
10.1.2.3 |
network | healthy | tests/test_server.py |
100.64.0.1 |
network | healthy | tests/test_server.py |
224.0.0.1 |
network | healthy | tests/test_server.py |
240.0.0.1 |
network | healthy | tests/test_server.py |
255.255.255.255 |
network | healthy | tests/test_server.py |
93.184.216.34 |
network | healthy | tests/test_server.py |
10.0.0.1 |
network | healthy | tests/test_server.py |
127.0.0.0 |
network | healthy | src/mcp_safe_fetch/server.py |
10.0.0.0 |
network | healthy | src/mcp_safe_fetch/server.py |
172.16.0.0 |
network | healthy | src/mcp_safe_fetch/server.py |
192.168.0.0 |
network | healthy | src/mcp_safe_fetch/server.py |
169.254.0.0 |
network | healthy | src/mcp_safe_fetch/server.py |
100.64.0.0 |
network | healthy | src/mcp_safe_fetch/server.py |
224.0.0.0 |
network | healthy | src/mcp_safe_fetch/server.py |
240.0.0.0 |
network | healthy | src/mcp_safe_fetch/server.py |
| Label | Layer | Status | Path |
|---|---|---|---|
TestParseSearchHeader |
software | healthy | tests/test_server.py:200 |
_FakeResp |
software | healthy | tests/test_server.py:232 |
_FakeConn |
software | healthy | tests/test_server.py:251 |
TestTemplateError |
software | healthy | tests/test_search.py:25 |
TestQueryError |
software | healthy | tests/test_search.py:74 |
TestBuildSearchUrl |
software | healthy | tests/test_search.py:100 |
TestLoadConfig |
software | healthy | tests/test_search.py:123 |
SanitizeResult |
software | healthy | src/mcp_safe_fetch/sanitizer.py:44 |
SearchConfig |
software | healthy | src/mcp_safe_fetch/search.py:61 |
FetchError |
software | healthy | src/mcp_safe_fetch/server.py:87 |
_PinnedHTTPConnection |
software | healthy | src/mcp_safe_fetch/server.py:175 |
_PinnedHTTPSConnection |
software | healthy | src/mcp_safe_fetch/server.py:186 |
| Label | Layer | Status | Path |
|---|---|---|---|
tests |
software | healthy | tests |
docs |
software | healthy | docs |
install |
software | healthy | docs/install |
img |
software | healthy | docs/install/img |
.github |
software | healthy | .github |
workflows |
software | healthy | .github/workflows |
src |
software | healthy | src |
mcp_safe_fetch |
software | healthy | src/mcp_safe_fetch |
| Label | Layer | Status | Path |
|---|---|---|---|
build |
cicd | healthy | .github/workflows/docker.yml |
test |
cicd | healthy | .github/workflows/ci.yml |
static-analysis |
cicd | healthy | .github/workflows/ci.yml |
docker-build |
cicd | healthy | .github/workflows/ci.yml |
| Label | Layer | Status | Path |
|---|---|---|---|
REGISTRY |
cicd | healthy | — |
GITHUB_TOKEN |
cicd | healthy | — |
IMAGE_NAME |
cicd | healthy | — |
| Label | Layer | Status | Path |
|---|---|---|---|
gha::docker |
cicd | healthy | .github/workflows/docker.yml |
gha::ci |
cicd | healthy | .github/workflows/ci.yml |
| Label | Layer | Status | Path |
|---|---|---|---|
repobility-clone-na28krzp |
software | healthy | /tmp/repobility-clone-na28krzp |
| Label | Layer | Status | Path |
|---|---|---|---|
port:07 |
network | healthy | .github/dependabot.yml |
| Label | Layer | Status | Path |
|---|---|---|---|
image::Dockerfile |
hardware | healthy | Dockerfile |
| Label | Layer | Status | Path |
|---|---|---|---|
vps::aws |
hardware | healthy | tests/test_server.py |
This page is publicly accessible at:
https://repobility.com/scan/0c1aca1e-6ad2-42dd-846c-1de1d8423f97/
To check status programmatically (no auth required):
curl -s https://repobility.com/api/v1/public/scan/0c1aca1e-6ad2-42dd-846c-1de1d8423f97/
Important — please don't re-submit the same URL repeatedly. The submission endpoint is idempotent: re-submitting the same git URL returns this same scan_token, not a new one. To re-scan this repo, sign up free and use the dashboard.