Atlas / MCP servers / cloudcell / labloop

labloopBLOCK

mcp/cloudcell/labloop

Agent-driven ML researcher in a secure, reproducible KVM lab: five standalone scientific-state MCP servers within per-user VMs with driver / trusted / hostile zone isolation

Verdict
BLOCK
Grade
F
Trust score
51 /100
Exposed tools
46 42r · 3w · 1d
Transport
streamable-http
License
Apache-2.0
Stars
6
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://github.com/cloudcell/labloop/LICENSE) [](https://discord.com/invite/v9JVtpVuUT)

Part of the GnosisLab project.

A persistent scientific loop for AI agents

Most AI agents can reason, call tools and run code. LabLoop gives them something more durable: a persistent scientific loop in which hypotheses, experiments, evidence, belief updates and research memory survive individual runs and inform what happens next.

science → adaptation → meta-adaptation → science

At the science level, the system forms falsifiable hypotheses, runs recorded experiments and updates beliefs from evidence. At the adaptation level, accumulated outcomes can change which hypotheses, experiments or research strategies are pursued next. At the meta-adaptation level, the process used to make those adaptations can itself be evaluated and improved.

LabLoop's defining claim is that self-improvement happens at the research-process level: the system can improve how it investigates a problem without requiring the underlying model to rewrite or retrain its own weights.

This is deliberately narrower than claiming a recursively self-improving model. LabLoop provides infrastructure for auditable, evidence-driven improvement of the research process, with each cycle grounded in persistent scientific state rather than transient agent context.

As adaptation and meta-adaptation become explicit and measurable, LabLoop can support recursive self-improving research systems: systems that improve not only what they know, but how they decide what to try next and how that improvement process itself changes.

Bring your own model and agent; LabLoop provides the scientific loop, durable state and optional isolated execution environment.

LabLoop gives AI age

Read from source at commit f3977c81da15OBSERVED · 2026-10-10
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add ml-episteme-mcp --env ML_EPISTEME_INGEST_TOKEN=${ML_EPISTEME_INGEST_TOKEN} -- uvx ml-episteme-mcp
claude-desktop
{
  "mcpServers": {
    "ml-episteme-mcp": {
      "command": "uvx",
      "args": [
        "ml-episteme-mcp"
      ],
      "env": {
        "ML_EPISTEME_INGEST_TOKEN": "${ML_EPISTEME_INGEST_TOKEN}"
      }
    }
  }
}
03

Exposed tools (46)

42 read · 3 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
abandon_investigationreadAbandon an open investigation — recorded, not deleted.
archive_pending_programmesreadArchive terminal programmes that are still in the live DB.
askreadnonlocal ask_count
assert_claimreadfor cid, c in claims.items():
assess_programmereadAssess programme health: progressive vs degenerating (commitment 8).
best_trialsreadr = results.get(programme_id, [])
check_invariantsreadAudit the lab
close_campaignreadClose an open campaign and freeze its promotion score.
close_tournamentreadSeal the tournament and compute recursive_gain.
create_studywritestudies[programme_id] = variables
describe_blobreadDescribe a content-addressed blob by digest (read-only).
drop_findingdestructiveDrop a provisional finding — it did not survive scrutiny.
execute_codewrite# Same shape as the real executor — the completed-evidence
fast_opreadA test tool inside the deadline.
get_archivereadGet details about an archive, including its programmes.
get_archived_programmereadGet an archived programme
get_campaignreadRead a campaign with its results and evidence trail.
get_candidatereadRead one candidate version (read-only).
get_candidate_lineagereadWalk a candidate
get_claimreadRead a claim with its full provenance bundle.
get_claimsreadBatch-read claims — one call, many claims.
get_evaluation_contractreadRead one evaluation contract (read-only).
get_improverreadRead one improver version with its decisions and policies.
get_incumbentreadDerive the incumbent candidate from decisions (read-only).
get_investigationreadRead an investigation with its full evidence trail and findings.
get_next_experimentreadGet the next experiment configuration from the optimizer role.
get_proposalreadRead a proposal with its authoritative classification and
get_tournamentreadRead a tournament with both arms
get_trial_statusreadreturn json.dumps({
list_active_programmesreadList all active research programmes.
list_archivesreadList all archive files (open and sealed).
list_claimsreadout = [c for c in claims.values() if type is None or c[
list_decisionswriteList meta-decisions, oldest first — the insert-only record.
list_hypothesesreadList all hypotheses in a programme with their status.
list_promotion_decisionsreadList a candidate
list_search_policiesreadList registered search-policy versions.
list_trialsreadList all trials in a programme with configs and status.
param_importancereadvariables = studies.get(programme_id, [
read_cell_outputreadreturn json.dumps({
read_resourcereadRead a resource by URI — the lab-wide read surface.
refresh_rosterreadReconcile the local roster with upstream Loop-0 candidates.
relatereadedge_id = f
slow_opreadA test tool that outlives the deadline.
tellreadresults.setdefault(programme_id, []).append(result)
verify_archivereadVerify an archive
verify_datareadVerify data provenance by re-computing the hash.
04

Trust audit

BLOCKgrade F · trust 51/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (10 observation(s))
Network
declared (15 observation(s))
Shell
declared (3 observation(s))
Dependencies
pinned
Secrets in source
none-found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
ml-scientist/src/ml_agora_mcp/observability/static/pixi.min.js:302
${h};`)}}return new Function("ud","uv","renderer","syncData",s.join(`
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
ml-scientist/src/ml_agora_mcp/observability/static/pixi.min.js:307
${i}`}else if(e!==At.HIGH&&i.substring(0,15)==="precision highp")return i.replace("precision highp","precision mediump");return i}let bs;function Io(){if(typeof bs=="boolean")return bs;try{bs=new Func
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
ml-scientist/src/ml_agora_mcp/observability/static/pixi.min.js:491
`),{size:r,syncFunc:new Function("ud","uv","renderer","syncData","buffer",n.join(`
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
ml-labloop/80-ingest-lab-data.sh:94
-o -iname 'id_rsa*' -o -iname 'id_ed25519*' -o -iname 'id_dsa*' \
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
ml-labloop/80-ingest-lab-data.sh:95
-o -iname 'id_ecdsa*' -o -iname '.env' -o -iname '.env.*' \
Why it matters. touches a credential store
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
ml-labloop/00-build-lab-template.sh:109
if curl -fs -m 2 "http://192.168.122.1:8777/MANIFEST" 2>/dev/null \
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
ml-labloop/00-build-lab-template.sh:120
echo "==> cache endpoint: http://192.168.122.1:8777 (pid $CACHE_HTTP_PID)"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
ml-labloop/02-create-vm-from-template.sh:225
qga_lab "curl -m3 -sf http://127.0.0.1:38080/health >/dev/null" 2>/dev/null && break
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
ml-labloop/create-lab-template:101
CACHE_URL="${LABLOOP_CACHE_URL:-http://192.168.122.1:8777}"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
ml-labloop/deploy/check-lab-ready.sh:27
until curl -m3 -sf http://127.0.0.1:38080/health >/dev/null 2>&1 \
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
ml-scientist/docs-pub/r-references/val-grounding/05-gelman-carlin2014-type-s-type-m-errors.pdf:3315
endstreamendobj34 0 obj<</BaseEncoding/WinAnsiEncoding/Differences[30/minus/uni00A0]/Type/Encoding>>endobj35 0 obj<</Ascent 851/CapHeight 626/CharSet(/minus/uni00A0/space/exclam/percent/ampersand/pare
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
drop_finding
Why it matters. 1 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.labloop-public-export
.labloop-public-export
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
ml-scientist/tests/anamnesis/test_20260915-2210Z--isolation.py:43
importlib.import_module(mod)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
ml-scientist/tests/test_20260928-2149Z--rc10_findings.py:1087
rec = importlib.import_module(module)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
ml-scientist/tests/test_20260929-0639Z--rc11_freeze.py:421
m = importlib.import_module(f"{mod}.clients.adaptors")
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
ml-scientist/tests/test_20260929-1615Z--grounded_constants.py:56
mod = importlib.import_module(f"{pkg}._grounded_constants")
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
ml-scientist/tests/test_20260921-0402Z--ingest.py:110
"/artifacts/../../etc/passwd", headers=AUTH
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
ml-labloop/01-prepare-template-for-cloning.sh:63
sys.stdout.write(base64.b64decode(st.get("out-data","")or"").decode("utf-8","replace"))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
ml-labloop/02-create-vm-from-template.sh:95
sys.stdout.write(base64.b64decode(st.get("out-data","")or"").decode("utf-8","replace"))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
ml-labloop/02-create-vm-from-template.sh:96
sys.stderr.write(base64.b64decode(st.get("err-data","")or"").decode("utf-8","replace"))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
ml-labloop/30-ensure-lab-tools.sh:67
sys.stdout.write(base64.b64decode(
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
ml-labloop/30-ensure-lab-tools.sh:69
sys.stderr.write(base64.b64decode(
INFOInventory / provenance · inv.oversize · CWE-1104
ml-scientist/docs-pub/r-references/val-grounding/13-airsbench-arxiv2602.06855.pdf
ml-scientist/docs-pub/r-references/val-grounding/13-airsbench-arxiv2602.06855.pdf
Why it matters. 2289848 bytes not read
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
ml-labloop/deploy/SECURITY-MANUAL.md:40
the state DBs, never read `ingest.env`. `sudo -u mcp` resolves
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha f3977c81da15full audit observations/trust-audit/mcp-server/cloudcell__labloop.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10f3977c81da15BLOCKF51first audit
06

Questions

What is the labloop MCP server?

Agent-driven ML researcher in a secure, reproducible KVM lab: five standalone scientific-state MCP servers within per-user VMs with driver / trusted / hostile zone isolation

What tools does labloop expose?

46 in total: 42 read-only, 3 that write, and 1 that can delete or overwrite (drop_finding). Every one is listed on this page with its risk.

Is labloop safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (51/100) and found 5 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 1 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does labloop need?

It reads ML_EPISTEME_INGEST_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does labloop run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on PyPI as ml-episteme-mcp.

How current is this page?

The grade is for one exact copy of the source (f3977c81da15), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement