silex-archaeology
PyPI
v0.12.0
Published by silex-tec — no publish provenance, so origin is unverified, but the source is public: the repository link below is self-declared yet readable, so you can inspect the code before adopting it.
Evidence-backed, local-first MCP server that reconstructs architecture, workflows and business rules from your codebase for AI coding agents.
The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.
1. Threat score — 100 − 15.4 = 85. What the published surface and source actually contain:
| Points | What was found | Category |
|---|---|---|
| −15.4 | Unsafe deserialization ×10 MTC-SRC-007 | permissions |
2. Client adoption risk — 85 − 7 = 78. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:
| Points | Adoption-risk factor |
|---|---|
| −6 | capability blast radius (high) — client exposure if the model is manipulated |
| −1 | publisher verification (public source) — no provenance, but the source is public and inspectable |
Capability observations and info notes are shown under Findings but never scored.
Open any row's finding below for the file, line and evidence behind a deduction.
In the server's implementation (`extractors/emitters/materialize.py:91`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: try: out = subprocess.run( ["git", *args], capture_output=True, text=Tr
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server extractors/emitters/materialize.py
In the server's implementation (`extractors/metrics/provenance_report.py:93`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: str) -> str: out = subprocess.run( ["git", *args], cwd=str(repo_root), capture_output=True,
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server extractors/metrics/provenance_report.py
In the server's implementation (`extractors/phase2_derived/risk_marker.py:211`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: try: result = subprocess.run( ["git", "blame", "-L", f"{line},{line}", "--porcelain", "--", file],
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server extractors/phase2_derived/risk_marker.py
In the server's implementation (`extractors/phase5_narrative/operations_builder.py:977`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: try: out = subprocess.check_output( ["grep", "-rln", "--include=*.cs", f"\
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server extractors/phase5_narrative/operations_builder.py
In the server's implementation (`extractors/runtime/package_merge.py:178`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: try: out = subprocess.run( ["git", "merge-base", "--is-ancestor", ancestor, descendant],
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server extractors/runtime/package_merge.py
In the server's implementation (`extractors/runtime/run_manifest.py:225`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: try: out = subprocess.run( ["git", *args], capture_output=True, text=Tr
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server extractors/runtime/run_manifest.py
In the server's implementation (`fresh/hook.py:50`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: dProcess.""" return subprocess.run( ["git", *args], cwd=cwd, capture_output=True, te
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server fresh/hook.py
In the server's implementation (`fresh/hook_install.py:46`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: str) -> str: proc = subprocess.run( ["git", "rev-parse", "--show-toplevel"], cwd=cwd, captur
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server fresh/hook_install.py
In the server's implementation (`ingestao/detectors/clear_and_reingest.py:21`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: return False r = subprocess.run([sys.executable, path], cwd=SCRIPT_DIR) return r.returncode == 0 def main():
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/detectors/clear_and_reingest.py
In the server's implementation (`ingestao/vendor_filter.py:402`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: try: result = subprocess.run( ["git", "log", "--oneline", "--follow", "--", rel_path],
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/vendor_filter.py
Untrusted-input tools ([get_rules_by_ids]) co-exist with external-action tools ([silex_export_materialized]). A prompt injection could cause unwanted external actions, though no direct sensitive-data leak path was found.
Evidence: untrusted [get_rules_by_ids] → sinks [silex_export_materialized]
Fix: Require confirmation for state-changing/egress actions triggered after processing untrusted content.
Location: flow get_rules_by_ids → silex_export_materialized
In the server's implementation (`ingestao/silex_interativo.py:36`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: } r = requests.post("http://172.17.0.1:11434/api/generate", json=payload, stream=True) pri
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/silex_interativo.py
In the server's implementation (`ui_archaeology.py:1829`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: rf_counter() resp = requests.post( "https://openrouter.ai/api/v1/chat/completions", headers={
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ui_archaeology.py
In the server's implementation (`ingestao/arqueologia_recruta.py:61`): Deserializing untrusted data with these APIs can execute arbitrary code (a well-known RCE gadget class). This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ') as f: data = pickle.load(f) index = data['index'] documents = data['documents'] model = S
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/arqueologia_recruta.py
In the server's implementation (`ingestao/fase0_export_fragmentos_from_pickle.py:23`): Deserializing untrusted data with these APIs can execute arbitrary code (a well-known RCE gadget class). This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ') as f: data = pickle.load(f) documents = data.get('documents', []) if not documents: print("[!
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/fase0_export_fragmentos_from_pickle.py
In the server's implementation (`ingestao/fase0_inspect_pickle.py:25`): Deserializing untrusted data with these APIs can execute arbitrary code (a well-known RCE gadget class). This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ') as f: data = pickle.load(f) print("data.keys():", list(data.keys())) if 'documents' in data and data[
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/fase0_inspect_pickle.py
In the server's implementation (`ingestao/formula/auditoria_agnostica.py:8`): Deserializing untrusted data with these APIs can execute arbitrary code (a well-known RCE gadget class). This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: s f: data = pickle.load(f) documentos = data['documents'] # Assume que os vetores es
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/formula/auditoria_agnostica.py
In the server's implementation (`ingestao/formula/auditoria_regras.py:7`): Deserializing untrusted data with these APIs can execute arbitrary code (a well-known RCE gadget class). This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: s f: data = pickle.load(f) vetores = data['vectors'] documentos = data['documents']
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/formula/auditoria_regras.py
In the server's implementation (`ingestao/formulas/analisador_lacuna_agnostico.py:10`): Deserializing untrusted data with these APIs can execute arbitrary code (a well-known RCE gadget class). This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ') as f: return pickle.load(f)['documents'] def aplicar_equacao_silex(): print("[*] Extraindo Lacunas Semân
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/formulas/analisador_lacuna_agnostico.py
In the server's implementation (`ingestao/formulas/ask_recruta.py:15`): Deserializing untrusted data with these APIs can execute arbitrary code (a well-known RCE gadget class). This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: 'rb') as f: data = pickle.load(f) index = data['index'] documents = data['documents'] driver = GraphDatabas
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/formulas/ask_recruta.py
In the server's implementation (`ingestao/formulas/buscador_bruto.py:12`): Deserializing untrusted data with these APIs can execute arbitrary code (a well-known RCE gadget class). This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: 'rb') as f: data = pickle.load(f) vector_index = data['index'] documents = data['documents'] def query_sil
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/formulas/buscador_bruto.py
In the server's implementation (`ingestao/formulas/buscador_principal.py:12`): Deserializing untrusted data with these APIs can execute arbitrary code (a well-known RCE gadget class). This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: 'rb') as f: data = pickle.load(f) vector_index = data['index'] documents = data['documents'] def query_sil
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/formulas/buscador_principal.py
In the server's implementation (`ingestao/formulas/buscador_sniper.py:12`): Deserializing untrusted data with these APIs can execute arbitrary code (a well-known RCE gadget class). This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: 'rb') as f: data = pickle.load(f) vector_index = data['index'] documents = data['documents'] def query_sil
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server ingestao/formulas/buscador_sniper.py
Each tool and what it can reach — statically extracted from the published source.
get_rules_by_idsingests untrusted inputsilex_export_materializednetwork egresscreate_workspaceno sensitive capabilitydiscover_entity_candidatesno sensitive capabilitydiscover_featuresno sensitive capabilitydiscover_workflowsno sensitive capabilitygenerate_domain_jsonsno sensitive capabilitygenerate_domain_reportno sensitive capabilityget_bridgesno sensitive capabilityget_class_referencesno sensitive capabilityget_code_communitiesno sensitive capabilityget_communitiesno sensitive capabilityget_domain_mapno sensitive capabilityget_field_graph_summaryno sensitive capabilityget_field_operationsno sensitive capabilityget_operation_detailno sensitive capabilityget_operation_fieldsno sensitive capabilityget_operation_workflow_contextno sensitive capabilityget_published_domainno sensitive capabilityget_state_machinesno sensitive capabilityget_structural_findingsno sensitive capabilityget_workflows_for_operationno sensitive capabilityget_workspace_statsno sensitive capabilityingest_field_graphno sensitive capabilityinvalidate_pathsno sensitive capabilitylabel_communitiesno sensitive capabilitylist_extractorsno sensitive capabilitylist_pending_reviewsno sensitive capabilitylist_unresolved_field_referencesno sensitive capabilitylist_workspacesno sensitive capabilitypublish_domainno sensitive capabilityrescan_workspaceno sensitive capabilityreview_artifactno sensitive capabilityrun_extractorno sensitive capabilitysearch_code_semanticno sensitive capabilitysilex.business_logic.submitno sensitive capabilitysilex.business_mermaid.runno sensitive capabilitysilex.business_mermaid.statusno sensitive capabilitysilex.code_decision.community_storyno sensitive capabilitysilex.code_decision.context_packno sensitive capabilitysilex.code_decision.file_storyno sensitive capabilitysilex.code_decision.symbol_storyno sensitive capabilitysilex.code_symbol.searchno sensitive capabilitysilex.communities.statusno sensitive capabilitysilex.community.code_packno sensitive capabilitysilex.community.label_submitno sensitive capabilitysilex.contract.fact.generateno sensitive capabilitysilex.contract.goal.getno sensitive capabilitysilex.contract.goal.listno sensitive capabilitysilex.contract.goal.upsertno sensitive capabilitysilex.contract.ledger.correctno sensitive capabilitysilex.contract.ledger.generate_batchno sensitive capabilitysilex.contract.ledger.list_proposedno sensitive capabilitysilex.contract.ledger.promoteno sensitive capabilitysilex.contract.ledger.proposeno sensitive capabilitysilex.contract.ledger.rejectno sensitive capabilitysilex.contract.searchno sensitive capabilitysilex.curation.budgetno sensitive capabilitysilex.curation.community_natureno sensitive capabilitysilex.entity.packno sensitive capabilitysilex.extractors.describeno sensitive capabilitysilex.extractors.get_outputno sensitive capabilitysilex.extractors.listno sensitive capabilitysilex.extractors.runno sensitive capabilitysilex.extractors.run_batchno sensitive capabilitysilex.extractors.validate_outputno sensitive capabilitysilex.feedback.investigate_ruleno sensitive capabilitysilex.feedback.list_extractor_gapsno sensitive capabilitysilex.feedback.report_extractor_gapno sensitive capabilitysilex.fsm_evidence.build_transitions_offlineno sensitive capabilitysilex.fsm_evidence.inspectno sensitive capabilitysilex.fsm_evidence.runno sensitive capabilitysilex.llm_provider.statusno sensitive capabilitysilex.packages.getno sensitive capabilitysilex.packages.listno sensitive capabilitysilex.packages.mergeno sensitive capabilitysilex.packages.runno sensitive capabilitysilex.phase5_narrative.runno sensitive capabilitysilex.phase5_narrative.statusno sensitive capabilitysilex.pipeline_run.artifactsno sensitive capabilitysilex.pipeline_run.createno sensitive capabilitysilex.pipeline_run.getno sensitive capabilitysilex.pipeline_run.listno sensitive capabilitysilex.pipeline_run.resumeno sensitive capabilitysilex.pipeline_run.statusno sensitive capabilitysilex.product_surface.diagnoseno sensitive capabilitysilex.qdrant_gate.diagnoseno sensitive capabilitysilex.qdrant_gate.runno sensitive capabilitysilex.refactoring.crosscuttingno sensitive capabilitysilex.review.surface_statusno sensitive capabilitysilex.roadmap.scoreno sensitive capabilitysilex.runner.arch_findingsno sensitive capabilitysilex.runner.claimno sensitive capabilitysilex.runner.comment_gateno sensitive capabilitysilex.runner.enqueueno sensitive capabilitysilex.runner.governanceno sensitive capabilitysilex.runner.manifestno sensitive capabilitysilex.runner.merge_readyno sensitive capabilitysilex.runner.planno sensitive capabilitysilex.runner.queueno sensitive capabilitysilex.runner.set_blockedno sensitive capabilitysilex.runner.set_doneno sensitive capabilitysilex.runner.statusno sensitive capabilitysilex.state_review.applyno sensitive capabilitysilex.state_review.get_nextno sensitive capabilitysilex.state_review.list_pendingno sensitive capabilitysilex.state_review.list_targetsno sensitive capabilitysilex.state_review.summaryno sensitive capabilitysilex.tool_surface.describeno sensitive capabilitysilex.tool_surface.listno sensitive capabilitysilex.transition_review.applyno sensitive capabilitysilex.transition_review.get_nextno sensitive capabilitysilex.transition_review.list_pendingno sensitive capabilitysilex.transition_review.list_targetsno sensitive capabilitysilex.transition_review.summaryno sensitive capabilityvalidate_domain_jsonsno sensitive capabilityCross-tool combinations that form a data-exfiltration primitive (untrusted input → sensitive source → external sink).
Scan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.
| Version | Score | Findings | Engine | Scanned |
|---|---|---|---|---|
v0.12.0 latest |
C 78/100 | 23 | 1.13.0 | 2026-09-07 |
v0.11.42 |
C 78/100 | 23 | 1.13.0 | 2026-08-30 |
v0.11.39 |
C 78/100 | 23 | 1.13.0 | 2026-08-25 |
Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.
The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.
npx mcptrustchecker scan silex-archaeology --online --registry pypi
Hotel booking MCP server — 300K+ properties, real confirmation numbers, loyalty programs. Builders monetize every booking via Stripe Connect. The first MCP server that completes real hotel reservations inside AI conversations.
Manage AdGuard Home through AI assistants
Read-only Azure DevOps for MCP clients using only your existing browser session — no PAT, no Azure CLI. Browse work items, pull requests, comments, attachments and Artifacts feeds across every project, repo and feed you can access.
MCP server for Adobe Experience Manager Assets integration development
Servidor MCP para el tiempo oficial de España (API pública OpenData de AEMET). Predicción, observación y avisos como herramientas MCP tipadas.
A standalone MCP stdio bridge for Affinity by Canva's local MCP SSE server.