Multi-agent shared brain across Claude Code/Desktop, Codex, Gemini, Copilot, VS Code. Cross-session memory, self-improving skill loops, inter-agent signaling — one local MCP server.
Drift inferred · capture-to-capture
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged dynamic code execution in po4erk91/thread-keeper
- HIGH code analysis flagged committed secret ×2, dynamic code execution ×3 in po4erk91/thread-keeper
transport stdio · 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 089a92a · analyzer v33 · 9h ago
danger signals5
- dynamic code execution __import__() po4erk91-thread-keeper-089a92a/threadkeeper/config_watcher.py :243
mod = __import__(f"threadkeeper.{mod_name}", fromlist=[fn_name]) - dynamic code execution __import__() po4erk91-thread-keeper-089a92a/threadkeeper/host.py :76
mod = __import__(f"threadkeeper.{modname}", fromlist=[fn]) - dynamic code execution __import__ sink po4erk91-thread-keeper-089a92a/threadkeeper/search_proxy.py :40
__import__("os").environ.get("THREADKEEPER_SEARCH_PROXY_POLL_S", "0.5") - committed secret GitHub token po4erk91-thread-keeper-089a92a/tests/test_github_safety.py :23
ghp_aa…(40 chars, redacted) - committed secret OpenAI key po4erk91-thread-keeper-089a92a/tests/test_github_safety.py :45
sk-pro…(32 chars, redacted)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 260
filesystem 105
- fs (weak) po4erk91-thread-keeper-089a92a/scripts/db_stress.py :16
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/scripts/memory_eval/run.py :50
import shutil - fs (weak) po4erk91-thread-keeper-089a92a/scripts/tk_verify_ingest.py :36
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/conftest.py :9
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_adapters.py :16
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_auto_update.py :8
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_backup.py :6
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_candidate_reviewer.py :13
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_config_settings.py :10
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_config_watcher.py :19
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_curator.py :20
import shutil - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_daemon_host_config.py :4
from pathlib import Path
show 28 more
- fs (weak) po4erk91-thread-keeper-089a92a/tests/test_daemon_host_integration.py :4
import shutil - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_dashboard.py :18
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_db_contention.py :6
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_db_migration_fts.py :6
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_db_schema.py :9
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_dialectic_feed_tools.py :5
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_dialectic_miner.py :8
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_dialectic_observation_resolve.py :5
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_dialectic_recompute.py :8
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_dialectic_tier.py :19
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_dialectic_validator.py :10
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_eval_harness.py :24
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_evolve_applier.py :16
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_evolve_apply_2.py :6
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_evolve_apply_3.py :17
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_evolve_daemon.py :16
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_extract_daemon.py :14
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_github_safety.py :15
"from pathlib import Path\n" - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_host_embed.py :2
import shutil - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_ingest_cursor.py :4
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_ingest_denylist.py :4
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_ingest_secret_redaction.py :3
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_ingest_transactions.py :4
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_lessons.py :14
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_memory_eval.py :19
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_menubar_app.py :4
import shutil - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_notify_daemon.py :9
from pathlib import Path - fs (weak) po4erk91-thread-keeper-089a92a/tests/test_nudges.py :18
from pathlib import Path
65 more not shown — this panel samples each group; the count above is the real total.
shell / exec 36
- shell (weak) po4erk91-thread-keeper-089a92a/tests/test_db_contention.py :7
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_db_schema.py :6
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_eval_harness.py :22
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_evolve_applier.py :13
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_evolve_daemon.py :12
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_host_wedged.py :12
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_memory_eval.py :17
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_memory_guard.py :6
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_menubar_app.py :5
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_model_catalog.py :4
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_spawn_budget.py :9
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_spawn_codex_stdin.py :4
import subprocess
show 24 more
- shell (weak) po4erk91-thread-keeper-089a92a/tests/test_spawn_watchdog.py :20
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_spawn_worktree_isolation.py :4
import subprocess - shell (weak) po4erk91-thread-keeper-089a92a/tests/test_spawn_wrap.py :22
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/_spawn_wrap.py :37
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/adapters/antigravity.py :20
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/adapters/claude_code.py :12
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/adapters/codex.py :19
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/adapters/copilot.py :34
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/auto_update.py :22
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/evolve_applier.py :58
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/evolve_daemon.py :34
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/github_budget.py :20
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/github_safety.py :17
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/helpers.py :11
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/host.py :10
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/identity.py :9
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/memory_guard.py :15
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/menubar_app.py :13
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/model_catalog.py :8
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/notify.py :33
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/process_health.py :28
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/spawn_budget.py :36
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/tools/dialog.py :10
import subprocess - shell po4erk91-thread-keeper-089a92a/threadkeeper/tools/spawn.py :12
import subprocess
network 12
- net (weak) po4erk91-thread-keeper-089a92a/scripts/memory_eval/run.py :55
import urllib.request - net (weak) po4erk91-thread-keeper-089a92a/tests/test_auto_update.py :10
from urllib.error import HTTPError - net (weak) po4erk91-thread-keeper-089a92a/tests/test_evolve_applier.py :1869
import socket - net (weak) po4erk91-thread-keeper-089a92a/tests/test_sync_transport.py :9
import urllib.error - net po4erk91-thread-keeper-089a92a/threadkeeper/auto_update.py :27
from urllib.error import HTTPError, URLError - net po4erk91-thread-keeper-089a92a/threadkeeper/backup.py :13
from urllib.parse import quote - net po4erk91-thread-keeper-089a92a/threadkeeper/eval/harness.py :62
import urllib.request - net po4erk91-thread-keeper-089a92a/threadkeeper/evolve_applier.py :64
from urllib.parse import urlsplit - net po4erk91-thread-keeper-089a92a/threadkeeper/host_embed.py :18
import socket - net po4erk91-thread-keeper-089a92a/threadkeeper/model_catalog.py :10
import urllib.error - net po4erk91-thread-keeper-089a92a/threadkeeper/skill_updater.py :25
from urllib import request - net po4erk91-thread-keeper-089a92a/threadkeeper/sync/daemon.py :19
import urllib.request
secrets 3
- secrets (weak) po4erk91-thread-keeper-089a92a/scripts/memory_eval/run.py :351
api_key = os.environ.get("ANTHROPIC_API_KEY", "") - secrets po4erk91-thread-keeper-089a92a/threadkeeper/eval/harness.py :514
api_key = os.environ.get("ANTHROPIC_API_KEY", "") - secrets po4erk91-thread-keeper-089a92a/threadkeeper/github_budget.py :86
os.environ.get("GH_TOKEN", "").strip()
database 77
- db (weak) po4erk91-thread-keeper-089a92a/tests/test_adapters.py :12
import sqlite3 - db (weak) po4erk91-thread-keeper-089a92a/tests/test_backup.py :3
import sqlite3 - db (weak) po4erk91-thread-keeper-089a92a/tests/test_config_settings.py :8
import sqlite3 - db (weak) po4erk91-thread-keeper-089a92a/tests/test_db_migration_fts.py :4
import sqlite3 - db (weak) po4erk91-thread-keeper-089a92a/tests/test_db_runtime.py :4
import sqlite3 - db (weak) po4erk91-thread-keeper-089a92a/tests/test_db_schema.py :5
import sqlite3 - db (weak) po4erk91-thread-keeper-089a92a/tests/test_dialectic.py :10
import sqlite3 - db (weak) po4erk91-thread-keeper-089a92a/tests/test_single_flight_prompt_prefixes.py :5
import sqlite3 - db (weak) po4erk91-thread-keeper-089a92a/tests/test_sync_capture.py :83
import sqlite3 - db (weak) po4erk91-thread-keeper-089a92a/tests/test_sync_migrate.py :9
import sqlite3 - db (weak) po4erk91-thread-keeper-089a92a/tests/test_sync_protocol.py :7
import sqlite3 - db (weak) po4erk91-thread-keeper-089a92a/tests/test_sync_reset_node.py :11
import sqlite3
show 28 more
- db (weak) po4erk91-thread-keeper-089a92a/tests/test_verify_ingest.py :10
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/_spawn_wrap.py :36
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/adapters/copilot.py :33
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/backup.py :9
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/brief.py :15
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/candidate_reviewer.py :39
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/config.py :1136
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/config_watcher.py :67
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/curator.py :60
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/curator_snapshots.py :14
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/daemon_state.py :20
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/db.py :9
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/dialectic_miner.py :13
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/dialectic_validator.py :16
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/embeddings.py :17
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/evolve_applier.py :57
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/evolve_daemon.py :33
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/extract_daemon.py :33
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/forget.py :9
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/github_budget.py :19
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/harvest.py :10
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/helpers.py :10
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/identity.py :7
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/ingest.py :10
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/lessons.py :34
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/link_health.py :7
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/migrate_embeddings.py :27
import sqlite3 - db po4erk91-thread-keeper-089a92a/threadkeeper/notify.py :32
import sqlite3
37 more not shown — this panel samples each group; the count above is the real total.
declared dependencies 13
- mcp@>=1.10.0,<2
- pydantic@>=2.13.4
- pydantic-settings@>=2.14.2
- pyyaml@>=6.0.3
- fastembed@>=0.8,<0.9
- huggingface-hub@>=0.20
- numpy@>=1.24.0
- sqlite-vec@>=0.1.9
- sentence-transformers@>=2.2.0
- pytest@>=9.1.1
- pytest-cov@>=7.1.0
- pytest-forked@>=1.6
show 1 more
- pytest-xdist@>=3.5