github Python analyzed 8c444c2

gawk-dev/mcpgawk

v0.1.48
github

One gateway in front of every MCP server your agents can reach. A server that changes after you approved it is caught, the call is blocked before it runs, and nothing leaves your machine.

maintainer
gawk-dev
licence
Apache-2.0
first seen
2026-07-08
last seen
2026-09-16
releases · 30d
21
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 0 tools
transport stdio · streamable-http · http counts 0 tools · 0 res · 0 prompts permission surface via code analysis

No tools enumerated yet for this server.

skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit 8c444c2 · analyzer v33 · 2h ago

skills & prompt files 1

danger signals10

code evidence vv0.1.48 · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 206

filesystem 77

  • fs (weak) gawk-dev-mcpgawk-8c444c2/scripts/ci_gate.py :92 with open(step_summary, "a", encoding="utf-8") as handle:
  • fs (weak) gawk-dev-mcpgawk-8c444c2/scripts/verify_public_artifact.py :31 import shutil
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/__init__.py :30 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/agents.py :31 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/ambient.py :33 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/capability.py :15 import shutil
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/checkup.py :31 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/cli.py :37 with open(path, encoding="utf-8") as f:
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/configedit.py :25 import shutil
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/decide.py :37 from pathlib import Path
  • fs (weak) gawk-dev-mcpgawk-8c444c2/src/mcpgawk/demo.py :29 import shutil
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/discover.py :16 from pathlib import Path
show 28 more
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/dxt.py :32 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/engine_fetch.py :29 import shutil
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/guard.py :33 import shutil
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/guard_hook.py :48 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/history.py :11 import shutil
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/node_runtime.py :27 import shutil
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/oauth_login.py :25 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/obot_filter.py :55 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/obot_filter_server.py :24 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/panel.py :32 import pathlib
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/probe.py :16 import shutil
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/protect.py :30 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/remote_login.py :33 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/report.py :38 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/report_redact.py :25 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/skills.py :32 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/spool.py :176 fd = os.open(target, os.O_WRONLY | os.O_CREAT | os.O_APPEND, 0o600)
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/staleness.py :57 data = json.loads(open(_cache_path(), encoding="utf-8").read())
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/state.py :31 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/status.py :19 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/verify.py :26 from pathlib import Path
  • fs gawk-dev-mcpgawk-8c444c2/src/mcpgawk/wrap.py :295 import shutil
  • fs (weak) gawk-dev-mcpgawk-8c444c2/tests/fixtures/toy_http_mcp_server.py :20 from pathlib import Path
  • fs (weak) gawk-dev-mcpgawk-8c444c2/tests/test_agents_multi.py :21 from pathlib import Path
  • fs (weak) gawk-dev-mcpgawk-8c444c2/tests/test_ambient.py :34 for forbidden in ("read_text(", "open(", "read_bytes(", "readlines("):
  • fs (weak) gawk-dev-mcpgawk-8c444c2/tests/test_baseline_spine.py :16 from pathlib import Path
  • fs (weak) gawk-dev-mcpgawk-8c444c2/tests/test_credential_identity.py :15 from pathlib import Path
  • fs (weak) gawk-dev-mcpgawk-8c444c2/tests/test_credential_stores_are_owner_only.py :29 from pathlib import Path

37 more not shown — this panel samples each group; the count above is the real total.

shell / exec 26

  • shell (weak) gawk-dev-mcpgawk-8c444c2/scripts/ci_gate.py :13 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/scripts/verify_public_artifact.py :32 import subprocess
  • shell gawk-dev-mcpgawk-8c444c2/src/mcpgawk/checkup.py :26 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/src/mcpgawk/demo.py :30 import subprocess
  • shell gawk-dev-mcpgawk-8c444c2/src/mcpgawk/engine_fetch.py :30 import subprocess
  • shell gawk-dev-mcpgawk-8c444c2/src/mcpgawk/panel.py :4466 import subprocess
  • shell gawk-dev-mcpgawk-8c444c2/src/mcpgawk/sandbox.py :27 import subprocess
  • shell gawk-dev-mcpgawk-8c444c2/src/mcpgawk/verify.py :24 import subprocess
  • shell gawk-dev-mcpgawk-8c444c2/src/mcpgawk/wrap.py :42 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_agents_multi.py :19 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_baseline_spine.py :14 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_demo.py :16 import subprocess
show 14 more
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_guard.py :14 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_obot_filter.py :22 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_panel_e2e.py :33 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_panel_tells_you_what_happened.py :606 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_remote_auth_classification.py :20 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_remote_oauth_login.py :20 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_runlog_redacts_the_run_registry.py :21 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_scan_speaks_both_mcp_revisions.py :84 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_spool.py :22 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_spool_redacts_the_decision_log.py :24 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_store_redacts_every_server_controlled_field.py :27 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_url_credentials_are_not_printed.py :103 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_verify_documents_redact_tool_names.py :24 import subprocess
  • shell (weak) gawk-dev-mcpgawk-8c444c2/tests/test_version_banner_names_the_running_code.py :16 import subprocess

network 24

  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/cli.py :2428 from urllib.parse import urlsplit
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/decide.py :39 from urllib.parse import parse_qs, quote, unquote_plus, urlparse
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/engine_fetch.py :33 import urllib.error
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/history.py :687 import socket
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/node_runtime.py :32 import urllib.error
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/oauth_login.py :27 from urllib.parse import parse_qs, urlparse
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/panel.py :2409 from urllib.parse import quote as _urlq
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/probe.py :327 from urllib.parse import urlsplit
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/redact.py :22 from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/remote_login.py :35 from urllib.parse import urlparse
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/report_redact.py :24 import socket
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/runlog.py :32 import socket
show 12 more
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/servercard.py :15 from urllib.parse import urlsplit, urlunsplit
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/supplychain.py :12 import urllib.error
  • net gawk-dev-mcpgawk-8c444c2/src/mcpgawk/transport.py :29 from urllib.parse import urlsplit, urlunsplit
  • net (weak) gawk-dev-mcpgawk-8c444c2/tests/test_no_egress.py :13 import socket
  • net (weak) gawk-dev-mcpgawk-8c444c2/tests/test_panel_api_state.py :95 import socket
  • net (weak) gawk-dev-mcpgawk-8c444c2/tests/test_panel_e2e.py :32 import socket
  • net (weak) gawk-dev-mcpgawk-8c444c2/tests/test_panel_live_updates_without_jank.py :20 import socket
  • net (weak) gawk-dev-mcpgawk-8c444c2/tests/test_panel_tells_you_what_happened.py :181 import urllib.error
  • net (weak) gawk-dev-mcpgawk-8c444c2/tests/test_remote_auth_classification.py :9 "HTTPStatusError", while `_kind_of` only ever tested `isinstance(exc, httpx.HTTPStatusError)`.
  • net (weak) gawk-dev-mcpgawk-8c444c2/tests/test_remote_oauth_login.py :19 import socket
  • net (weak) gawk-dev-mcpgawk-8c444c2/tests/test_servercard.py :59 import httpx
  • net (weak) gawk-dev-mcpgawk-8c444c2/tests/test_skills.py :242 d = _mk_skill(tmp_path, "benign", body=body, extra={"helper.py": "import requests\n"})

secrets 4

  • secrets gawk-dev-mcpgawk-8c444c2/src/mcpgawk/history.py :686 import getpass
  • secrets gawk-dev-mcpgawk-8c444c2/src/mcpgawk/report_redact.py :21 import getpass
  • secrets (weak) gawk-dev-mcpgawk-8c444c2/tests/test_checkup_walks_the_whole_product.py :211 import getpass
  • secrets (weak) gawk-dev-mcpgawk-8c444c2/tests/test_report_bundle_is_safe_and_honest.py :177 import getpass

database 7

  • db gawk-dev-mcpgawk-8c444c2/src/mcpgawk/decide.py :33 import sqlite3
  • db gawk-dev-mcpgawk-8c444c2/src/mcpgawk/panel.py :5744 import sqlite3
  • db gawk-dev-mcpgawk-8c444c2/src/mcpgawk/report.py :33 import sqlite3
  • db gawk-dev-mcpgawk-8c444c2/src/mcpgawk/runlog.py :33 import sqlite3
  • db gawk-dev-mcpgawk-8c444c2/src/mcpgawk/status.py :340 import sqlite3
  • db (weak) gawk-dev-mcpgawk-8c444c2/tests/test_runlog.py :11 import sqlite3
  • db (weak) gawk-dev-mcpgawk-8c444c2/tests/test_runlog_redacts_the_run_registry.py :20 import sqlite3

declared dependencies 13

  • mcp@>=2,<3
  • httpx2@>=2
  • tiktoken@>=0.7
  • httpx@>=0.27
  • pyyaml@>=6
  • tomli@>=2.0; python_version <
  • pytest@>=8
  • pytest-asyncio@>=0.23
  • starlette@>=0.40
  • uvicorn@>=0.30
  • zed_extension_api@0.7
  • org.junit.jupiter:junit-jupiter@5.11.3
show 1 more
  • org.junit.platform:junit-platform-launcher@*

jetbrains-plugin 1

  • opaque (low) gawk-dev-mcpgawk-8c444c2/extensions/jetbrains/src/main/resources/META-INF/plugin.xml bundled JetBrains plugin "mcpgawk: see every MCP server your agents can reach" (gawk-dev-mcpgawk-8c444c2/extensions/jetbrains/src/main/resources/META-INF/plugin.xml) — presence-detected; review the plugin descriptor