Computational papers ship code that readers must clone, install, configure and debug. That cost keeps useful methods locked inside PDFs. A Stanford team led by Jiacheng Miao and James Zou proposes a fix. Paper2Agent was published in Nature on 16 September 2026. It converts a paper and its codebase into a Model Context Protocol (MCP) server. Any MCP-compatible agent, such as Claude Code, can then run the paper’s methods through natural language. The authors describe the result as a virtual corresponding author.
Is it deployable? Yes. The code is MIT-licensed and installs as a skill for Claude Code or Codex. Prebuilt AlphaGenome, Scanpy and TISSUE servers run on Hugging Face Spaces. A hosted version is also available at paper2agent.ai.
How the Pipeline Works
Paper2Agent runs on Claude Code’s agent SDK. A central orchestrator dispatches specialized sub-agents through 6 steps:
- Locate and download the codebase.
- An environment manager builds an isolated virtual environment.
- A tutorial scanner indexes usable tutorials.
- A tutorial executor runs them end to end and records reference outputs.
- A tool extractor turns tutorials into parameterized MCP tools, and a test verifier validates them.
- The orchestrator assembles validated tools into 1 MCP server.
The validation gate is strict. A tool passes only when expected files appear and numbers match within 3%. Figures must also match references by perceptual hash, with Hamming distance under 20. The verifier gets up to 6 attempts per function. Tools that keep failing are excluded from the final server.
Each server exposes 3 components. MCP tools wrap the paper’s methods as executable functions: MCP resources hold the manuscript, code links, datasets and figures. MCP prompts encode multi-step workflows, such as the correct Scanpy preprocessing order. The research team used Claude Sonnet 4 for all Paper2Agent applications.
Interactive Explainer
STEP ‘+(k+1)+’ #p2a-x AGENT
‘+esc(s.a)+’
‘;
send();
#p2a-x *,#p2a-x *:before,#p2a-x *:aftern.classList.toggle(‘cur’,j===k);n.classList.toggle(‘done’,j
STEP ‘+(k+1)+’ #p2a-x p:empty,#p2a-x hr,#p2a-x del,#p2a-x s AGENT
‘+esc(s.a)+’
‘;
send();
#p2a-x .mono{font-family:"IBM Plex Mono",ui-monospace,Menlo,Consolas,monospace!important}
#p2a-x .kick{font-size:12px;color:var(–orange2);letter-spacing:.04em;margin:0 0 6px}
#p2a-x h2{font-size:26px;line-height:1.2;margin:0 0 6px;font-weight:700;color:var(–ink)!important}
#p2a-x h2 .o{color:var(–orange)}
#p2a-x .lede{color:var(–mute);margin:0 0 16px;font-size:15px;max-width:70ch}
#p2a-x .tabs{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 14px}
#p2a-x .tab{background:var(–panel)!important;color:var(–mute)!important;border:1px solid var(–line)!important;border-radius:999px;padding:8px 14px;font:600 13px "IBM Plex Sans",system-ui,sans-serif;cursor:pointer;transition:all .25s}
#p2a-x .tab b{color:var(–orange);margin-right:6px;font-family:"IBM Plex Mono",monospace}
#p2a-x .tab:hover{color:var(–ink)!important;border-color:var(–sky)!important}
#p2a-x .tab.on{background:var(–orange)!important;color:#1B1208!important;border-color:var(–orange)!important}
#p2a-x .tab.on b{color:#1B1208}
#p2a-x .pane{display:none;background:var(–panel)!important;border:1px solid var(–line)!important;border-radius:12px;padding:18px;animation:p2aIn .45s ease}
#p2a-x .pane.on{display:block}
@keyframes p2aIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
#p2a-x h3{margin:0 0 4px;font-size:18px;color:var(–ink)!important}
#p2a-x .sub{color:var(–mute);font-size:14px;margin:0 0 14px}
#p2a-x .btn{background:transparent!important;color:var(–orange2)!important;border:1px solid var(–orange)!important;border-radius:8px;padding:7px 12px;font:600 13px "IBM Plex Sans",system-ui,sans-serif;cursor:pointer;transition:background .2s}
#p2a-x .btn:hover{background:rgba(245,132,59,.15)!important}
#p2a-x .btn.solid{background:var(–orange)!important;color:#1B1208!important}
#p2a-x .btn:disabled{opacity:.4;cursor:not-allowed}
#p2a-x .note{font-size:12px;color:var(–mute);margin-top:12px}
/* pipeline */
#p2a-x .track{position:relative;display:grid;grid-template-columns:repeat(6,1fr);gap:8px;margin:18px 0 8px}
#p2a-x .rail{position:absolute;left:8%;right:8%;top:25px;height:3px;background:var(–line);border-radius:3px;overflow:hidden}
#p2a-x .rail i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(–sky),var(–orange));transition:width .6s ease}
#p2a-x .node{position:relative;z-index:1;background:none!important;border:0!important;color:var(–mute)!important;cursor:pointer;text-align:center;padding:0;font:500 12px "IBM Plex Sans",system-ui,sans-serif}
#p2a-x .node .dot{width:52px;height:52px;margin:0 auto 6px;border-radius:50%;display:grid;place-items:center;background:var(–panel2);border:2px solid var(–line);font:600 16px "IBM Plex Mono",monospace;color:var(–mute);transition:all .3s}
#p2a-x .node.done .dot{border-color:var(–sky);color:var(–sky)}
#p2a-x .node.cur .dot{border-color:var(–orange);color:#1B1208;background:var(–orange);box-shadow:0 0 0 6px rgba(245,132,59,.18);animation:p2aPulse 1.4s infinite}
#p2a-x .node.cur{color:var(–ink)!important}
@keyframes p2aPulse{50%{box-shadow:0 0 0 12px rgba(245,132,59,0)}}
#p2a-x .detail{display:grid;grid-template-columns:1.1fr 1fr 1fr;gap:10px;margin-top:14px}
#p2a-x .cell{background:var(–panel2);border:1px solid var(–line);border-radius:10px;padding:12px;animation:p2aIn .35s ease}
#p2a-x .cell .lab{font-size:11px;color:var(–orange2);margin-bottom:4px;font-family:"IBM Plex Mono",monospace}
#p2a-x .cell .val{font-size:14px;color:var(–ink)}
#p2a-x .row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
/* server */
#p2a-x .srv{display:grid;grid-template-columns:1fr 1fr;gap:14px}
#p2a-x .comp{border-radius:10px;padding:12px;margin-bottom:10px;color:#13262C;cursor:pointer;border:2px solid transparent;transition:transform .2s,border-color .2s}
#p2a-x .comp:hover{transform:translateX(4px)}
#p2a-x .comp.on{border-color:var(–orange)}
#p2a-x .comp h4{margin:0 0 4px;font-size:14px;color:#13262C}
#p2a-x .comp p{margin:0;font-size:13px;color:#24414A}
#p2a-x .comp code{font-family:"IBM Plex Mono",monospace;font-size:12px;background:rgba(255,255,255,.55)!important;color:#13262C!important;padding:1px 5px;border-radius:4px;border:0!important;word-break:break-word}
#p2a-x .c-tool{background:var(–tool)}#p2a-x .c-res{background:var(–res)}#p2a-x .c-prm{background:var(–prm)}
#p2a-x .chat{background:#0B1F26;border:1px solid var(–line);border-radius:12px;padding:12px;min-height:280px;display:flex;flex-direction:column;gap:10px}
#p2a-x .chat .hd{font:600 12px "IBM Plex Mono",monospace;color:var(–mute);display:flex;justify-content:space-between}
#p2a-x .bub{border-radius:10px;padding:10px 12px;font-size:13px;opacity:0;transform:translateY(6px);transition:all .4s}
#p2a-x .bub.show{opacity:1;transform:none}
#p2a-x .bub.u{background:#3A2A36;border:1px solid #5C3F55;align-self:flex-end;max-width:92%}
#p2a-x .bub.t{background:rgba(245,132,59,.12);border:1px dashed var(–orange);font-family:"IBM Plex Mono",monospace;font-size:12px;color:var(–orange2)}
#p2a-x .bub.a{background:#123845;border:1px solid var(–navy);max-width:92%}
#p2a-x .seg{display:inline-flex;border:1px solid var(–line);border-radius:8px;overflow:hidden;margin-bottom:12px}
#p2a-x .seg button{background:transparent!important;color:var(–mute)!important;border:0!important;padding:7px 12px;font:600 12px "IBM Plex Sans",system-ui,sans-serif;cursor:pointer}
#p2a-x .seg button.on{background:var(–sky)!important;color:#08202A!important}
/* test gate */
#p2a-x .gate{display:grid;grid-template-columns:1fr 1fr;gap:14px}
#p2a-x .ctl{margin-bottom:14px}
#p2a-x .ctl label{display:flex;justify-content:space-between;font-size:13px;color:var(–ink);margin-bottom:6px}
#p2a-x .ctl label span{font-family:"IBM Plex Mono",monospace;color:var(–orange2)}
#p2a-x input[type=range]{width:100%;accent-color:#F5843B}
#p2a-x .ctl label.chk{display:flex;justify-content:flex-start;align-items:center;gap:10px;font-size:13px;cursor:pointer}
#p2a-x .chk input{accent-color:#F5843B;width:16px;height:16px}
#p2a-x .checks .ck{display:flex;justify-content:space-between;align-items:center;padding:10px 12px;border:1px solid var(–line);border-radius:8px;margin-bottom:8px;background:var(–panel2);font-size:13px;transition:border-color .3s}
#p2a-x .ck .st{font:600 12px "IBM Plex Mono",monospace;color:var(–mute)}
#p2a-x .ck.pass{border-color:var(–ok)}#p2a-x .ck.pass .st{color:var(–ok)}
#p2a-x .ck.fail{border-color:var(–bad)}#p2a-x .ck.fail .st{color:var(–bad)}
#p2a-x .ck.run .st{color:var(–orange2)}
#p2a-x .verdict{margin-top:10px;padding:12px;border-radius:10px;font-weight:600;font-size:14px;text-align:center;background:var(–panel2);border:1px solid var(–line)}
#p2a-x .verdict.pass{border-color:var(–ok);color:var(–ok)}#p2a-x .verdict.fail{border-color:var(–bad);color:var(–bad)}
#p2a-x .att{display:flex;gap:5px;margin:8px 0 0}
#p2a-x .att i{flex:1;height:8px;border-radius:4px;background:var(–line);transition:background .3s}
#p2a-x .att i.used{background:var(–orange)}
/* bench */
#p2a-x .bars{margin-top:6px}
#p2a-x .bar{margin-bottom:12px}
#p2a-x .bar .bl{display:flex;justify-content:space-between;font-size:13px;margin-bottom:4px}
#p2a-x .bar .bl span:last-child{font-family:"IBM Plex Mono",monospace}
#p2a-x .bar .bt{height:18px;background:var(–panel2);border-radius:5px;overflow:hidden;border:1px solid var(–line)}
#p2a-x .bar .bf{height:100%;width:0;border-radius:4px;transition:width 1s cubic-bezier(.2,.8,.2,1)}
#p2a-x .stats{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:14px}
#p2a-x .stat{background:var(–panel2);border:1px solid var(–line);border-radius:10px;padding:12px}
#p2a-x .stat .n{font:600 22px "IBM Plex Mono",monospace;color:var(–orange)}
#p2a-x .stat .d{font-size:12px;color:var(–mute)}
/* collab */
#p2a-x .net{position:relative;height:170px;margin:6px 0 10px}
#p2a-x .net svg{position:absolute;inset:0;width:100%;height:100%}
#p2a-x .net .ag{position:absolute;transform:translate(-50%,-50%);background:var(–panel2);border:2px solid var(–line);border-radius:10px;padding:8px 10px;font-size:12px;text-align:center;width:150px;transition:all .4s}
#p2a-x .net .ag b{display:block;font-size:13px;color:var(–ink)}
#p2a-x .net .ag.lit{border-color:var(–orange);box-shadow:0 0 18px rgba(245,132,59,.35)}
#p2a-x .flow{stroke:var(–line);stroke-width:2;fill:none;stroke-dasharray:6 6;vector-effect:non-scaling-stroke}
#p2a-x .flow.lit{stroke:var(–orange);animation:p2aDash 1s linear infinite}
@keyframes p2aDash{to{stroke-dashoffset:-24}}
#p2a-x .stepbox{background:var(–panel2);border:1px solid var(–line);border-radius:10px;padding:12px;font-size:14px;min-height:64px;animation:p2aIn .35s ease}
#p2a-x .rho{margin-top:12px}
#p2a-x .rhot{position:relative;height:26px;background:linear-gradient(90deg,#3a2230,#15363F 50%,#3a2a18);border-radius:6px;border:1px solid var(–line);margin:6px 0 2px}
#p2a-x .rhot .mid{position:absolute;left:50%;top:0;bottom:0;width:1px;background:var(–mute)}
#p2a-x .rhot .mk{position:absolute;top:50%;width:14px;height:14px;border-radius:50%;transform:translate(-50%,-50%);transition:left .9s cubic-bezier(.2,.8,.2,1)}
#p2a-x .rhoscale{display:flex;justify-content:space-between;font:11px "IBM Plex Mono",monospace;color:var(–mute)}
#p2a-x .lg{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(–mute);margin-top:6px}
#p2a-x .lg i{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:5px;vertical-align:middle}
#p2a-x table{width:100%;border-collapse:collapse;font-size:13px;margin-top:10px;background:transparent!important}
#p2a-x th,#p2a-x td{border:1px solid var(–line)!important;padding:7px 8px;text-align:left;color:var(–ink)!important;background:transparent!important}
#p2a-x th{color:var(–orange2)!important;font-weight:600}
#p2a-x td.sig{color:var(–ok)!important;font-weight:600}
#p2a-x .foot{display:flex;justify-content:space-between;flex-wrap:wrap;gap:6px;margin-top:14px;font-size:12px;color:var(–mute)}
#p2a-x .foot a{color:var(–sky)!important;text-decoration:none}
#p2a-x .foot .mtp{color:var(–mtp)!important;font-weight:600}
@media (max-width:640px){
#p2a-x{padding:14px 12px 10px!important}
#p2a-x h2{font-size:21px}
#p2a-x .track{grid-template-columns:repeat(3,1fr);row-gap:14px}
#p2a-x .rail{display:none}
#p2a-x .detail,#p2a-x .srv,#p2a-x .gate{grid-template-columns:1fr}
#p2a-x .stats{grid-template-columns:1fr}
#p2a-x .tab{padding:7px 10px;font-size:12px}
#p2a-x .net{height:190px}
#p2a-x .net .ag{width:31%;font-size:10px;padding:6px 4px}
#p2a-x .net .ag b{font-size:11px}
#p2a-x .net .ag span{display:none}
#p2a-x .seg{display:flex;flex-wrap:wrap}
#p2a-x .seg button{flex:1 1 45%}
}
@media (prefers-reduced-motion:reduce){#p2a-x *{animation:none!important;transition:none!important}}
</style>
<div id="p2a-x">
<p class="kick mono">NATURE | STANFORD UNIVERSITY | PUBLISHED 16 SEP 2026</p>
<h2>How <span class="o">Paper2Agent</span> turns a paper into a working agent</h2>
<p class="lede">A research paper and its codebase go in. A tested MCP server comes out, ready for Claude Code or any MCP-compatible agent. Explore each stage below.</p>
<div class="tabs" role="tablist">
<button class="tab on" data-t="0"><b>01</b>Pipeline</button>
<button class="tab" data-t="1"><b>02</b>Server anatomy</button>
<button class="tab" data-t="2"><b>03</b>Test gate</button>
<button class="tab" data-t="3"><b>04</b>Benchmarks</button>
<button class="tab" data-t="4"><b>05</b>Agents collaborate</button>
</div>
<!– 01 PIPELINE –>
<section class="pane on" data-p="0">
<h3>The 6-step build pipeline</h3>
<p class="sub">A central orchestrator built on Claude Code’s agent SDK dispatches specialized sub-agents. Steps pass JSON reports forward. Click a step or press play.</p>
<div class="row"><button class="btn solid" id="pPlay">▶ Play pipeline</button><button class="btn" id="pReset">Reset</button></div>
<div class="track" id="track"><div class="rail"><i id="railFill"></i></div></div>
<div class="detail" id="pDetail"></div>
<p class="note">Source: Methods, "Details on implementing Paper2Agent". Steps run sequentially; tutorials inside a step can run in parallel.</p>
</section>
<!– 02 SERVER –>
<section class="pane" data-p="1">
<h3>Inside a paper MCP server</h3>
<p class="sub">Every server exposes 3 component types. Pick a paper agent, then click a component to see it used in chat.</p>
<div class="seg" id="srvSeg"><button class="on" data-k="ag">AlphaGenome</button><button data-k="sc">Scanpy</button><button data-k="ti">TISSUE</button></div>
<div class="srv">
<div id="comps"></div>
<div class="chat" id="chat"><div class="hd"><span>Claude Code + <span id="chatName">AlphaGenome</span> MCP</span><span>● connected</span></div><div id="chatBody"></div></div>
</div>
<p class="note">Tool and component names come from the main text, Fig. 2, Fig. 3 and Extended Data Fig. 1. Tool-call labels are simplified. The AlphaGenome answer shown matches the ground truth reported in Fig. 2b.</p>
</section>
<!– 03 TEST GATE –>
<section class="pane" data-p="2">
<h3>The validation gate every tool must pass</h3>
<p class="sub">The test verifier-improver checks each extracted tool against the tutorial’s own outputs. Set the inputs, then run the test.</p>
<div class="gate">
<div>
<div class="ctl"><label class="chk"><input type="checkbox" id="gFiles" checked> Expected output files generated</label></div>
<div class="ctl"><label>Numerical deviation from tutorial output <span id="gNumV">1.5%</span></label><input type="range" id="gNum" min="0" max="10" step="0.5" value="1.5"></div>
<div class="ctl"><label>Figure perceptual-hash Hamming distance <span id="gHamV">12</span></label><input type="range" id="gHam" min="0" max="40" step="1" value="12"></div>
<div class="row"><button class="btn solid" id="gRun">Run test</button><button class="btn" id="gReset">New tool</button></div>
<div style="margin-top:12px;font-size:13px">Attempts used: <span class="mono" id="gAttV">0 / 6</span></div>
<div class="att" id="gAtt"></div>
</div>
<div>
<div class="checks">
<div class="ck" id="ck1"><span>Files generated</span><span class="st">waiting</span></div>
<div class="ck" id="ck2"><span>Numbers within 3% tolerance</span><span class="st">waiting</span></div>
<div class="ck" id="ck3"><span>Figure Hamming distance < 20</span><span class="st">waiting</span></div>
</div>
<div class="verdict" id="gVerdict">Run the test to see the verdict</div>
</div>
</div>
<p class="note">Thresholds are from Methods: 3% floating-point tolerance, Hamming distance < 20, maximum of 6 attempts. Tools that keep failing lose their MCP decorator and are excluded. Slider inputs are illustrative.</p>
</section>
<!– 04 BENCH –>
<section class="pane" data-p="3">
<h3>Reported accuracy</h3>
<p class="sub">Mean accuracy with s.e.m. as reported in the paper. Choose a benchmark.</p>
<div class="seg" id="bSeg"><button class="on" data-k="tut">AlphaGenome tutorial (15)</button><button data-k="nov">AlphaGenome novel (15)</button><button data-k="open">Open-ended (30)</button><button data-k="big">74 papers (300 Qs)</button></div>
<div class="bars" id="bars"></div>
<div class="stats" id="bStats"></div>
<p class="note" id="bNote"></p>
</section>
<!– 05 COLLAB –>
<section class="pane" data-p="4">
<h3>3 paper agents test a psoriasis locus</h3>
<p class="sub">AlphaGenome, an MPRA-coupled scCRISPRi screen and a CD4+ T cell Perturb-seq dataset, each wrapped as an agent. Step through the study.</p>
<div class="net" id="net">
<svg viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true">
<path id="f1" class="flow" d="M20 28 L50 72"/>
<path id="f2" class="flow" d="M50 28 L50 72"/>
<path id="f3" class="flow" d="M80 28 L50 72"/>
</svg>
<div class="ag" id="a1" style="left:20%;top:22%"><b>AlphaGenome</b><span>variant effect prediction</span></div>
<div class="ag" id="a2" style="left:50%;top:22%"><b>scCRISPRi</b><span>CRE perturbation data</span></div>
<div class="ag" id="a3" style="left:80%;top:22%"><b>Perturb-seq</b><span>gene knockdown data</span></div>
<div class="ag" id="a4" style="left:50%;top:80%"><b>AI co-scientist</b><span>human in the loop</span></div>
</div>
<div class="row" style="margin-bottom:10px"><button class="btn" id="cPrev">◀ Back</button><button class="btn solid" id="cNext">Next step ▶</button><span class="mono" id="cCount" style="font-size:12px;color:#9DB7BE">1 / 4</span></div>
<div class="stepbox" id="cStep"></div>
<div id="cRho" style="display:none">
<div class="seg" id="rSeg" style="margin-top:12px"><button data-k="0">Rest</button><button data-k="1" class="on">Stim8hr</button><button data-k="2">Stim48hr</button></div>
<div class="rho">
<div style="font-size:13px">Spearman correlation with rs887314 CRE perturbation signature</div>
<div class="rhot"><div class="mid"></div><div class="mk" id="mkG" style="background:#F5843B;left:50%"></div><div class="mk" id="mkB" style="background:#3BA3E3;left:50%"></div></div>
<div class="rhoscale"><span>-1</span><span>0</span><span>+1</span></div>
<div class="lg"><span><i style="background:#F5843B"></i>GPR137 knockdown</span><span><i style="background:#3BA3E3"></i>BAD knockdown</span></div>
</div>
<table><thead><tr><th>Knockdown</th><th>Spearman’s rho</th><th>P value</th></tr></thead><tbody id="rBody"></tbody></table>
</div>
<p class="note">Values from Fig. 4b and main text. Significance uses Benjamini-Hochberg correction (FDR < 0.05).</p>
</section>
<div class="foot"><span>Source: <a href="https://www.nature.com/articles/s41586-026-11044-y" target="_blank" rel="noopener">Miao et al., Nature (2026)</a> | <a href="https://github.com/jmiao24/Paper2Agent" target="_blank" rel="noopener">GitHub</a></span><span class="mtp">Built by Marktechpost</span></div>
</div>
<script>
(function(){
var root=document.getElementById(‘p2a-x’);
var reduce=window.matchMedia&&window.matchMedia(‘(prefers-reduced-motion: reduce)’).matches;
function $(id){return document.getElementById(id)}
function esc(s){return String(s).replace(/&/g,’&’).replace(/</g,'<‘).replace(/>/g,’>’)}
function send(){try{parent.postMessage({mtpP2A:1,h:root.offsetHeight+40},’*’)}catch(e){}}
window.addEventListener(‘load’,send);window.addEventListener(‘resize’,send);
if(window.ResizeObserver){new ResizeObserver(send).observe(root)}
/* tabs */
var tabs=root.querySelectorAll(‘.tab’),panes=root.querySelectorAll(‘.pane’);
tabs.forEach(function(t){t.addEventListener(‘click’,function(){
tabs.forEach(function(x){x.classList.remove(‘on’)});panes.forEach(function(x){x.classList.remove(‘on’)});
t.classList.add(‘on’);var i=+t.dataset.t;panes[i].classList.add(‘on’);
if(i===3)renderBench(curBench);
if(i===1)renderChat(curComp);
setTimeout(send,60);
})});
/* 01 pipeline */
var steps=[
{n:’Locate codebase’,a:’Paper2Agent pipeline (automatic repo identification)’,i:’Manuscript text, references or supplementary materials (or a user-supplied repo URL)’,o:’Cloned repository and detected language’},
{n:’Environment setup’,a:’Environment manager’,i:’Cloned repository’,o:’Isolated virtual environment and test configuration files’},
{n:’Tutorial discovery’,a:’Tutorial scanner’,i:’Cloned repository and an optional tutorial filter’,o:’JSON file with a classified index of candidate tutorials’},
{n:’Execute and audit’,a:’Tutorial executor’,i:’Tutorial source files, activated environment, scanner report’,o:’Executed notebooks and per-tutorial execution reports’},
{n:’Extract and test tools’,a:’Tool extractor-implementor, then test verifier-improver’,i:’Executed notebooks, virtual environment, scanner report’,o:’Tool modules, per-function test files, test logs and summaries’},
{n:’Assemble MCP server’,a:’Orchestrator’,i:’All validated tool modules’,o:’Unified MCP server with manifest, versioning and basic security defaults’}
];
var track=$(‘track’),cur=0,timer=null;
steps.forEach(function(s,k){var b=document.createElement(‘button’);b.className=” node=””>’+(k+1)+’
‘+esc(s.n);
b.addEventListener(‘click’,function(){stop();setStep(k)});track.appendChild(b)});
var nodes=track.querySelectorAll(‘.node’);
function setStep(k){cur=k;nodes.forEach(function(n,j){n.classList.toggle(‘cur’,j===k);n.classList.toggle(‘done’,j
STEP ‘+(k+1)+’ | AGENT
‘+esc(s.a)+’
‘;
send();}
function stop(){if(timer){clearInterval(timer);timer=null;$(‘pPlay’).innerHTML=’▶ Play pipeline’}}
$(‘pPlay’).addEventListener(‘click’,function(){if(timer){stop();return}
if(cur>=steps.length-1)setStep(0);$(‘pPlay’).innerHTML=’❚❚ Pause’;
timer=setInterval(function(){if(cur>=steps.length-1){stop();return}setStep(cur+1)},reduce?2500:1700)});
$(‘pReset’).addEventListener(‘click’,function(){stop();setStep(0)});
setStep(0);
/* 02 server */
var agents={
ag:{name:’AlphaGenome’,
comps:[{c:’c-tool’,k:’MCP tools’,d:’Executable functions with a pre-configured environment.’,x:’score_variant_effect(), visualize_variant_effects()’},
{c:’c-res’,k:’MCP resources’,d:’Static assets: manuscript, code and supplements.’,x:’Links to the training data used to train the model’},
{c:’c-prm’,k:’MCP prompts’,d:’Multi-step workflow instructions inferred from the paper.’,x:’Chain of tools for interpreting GWAS loci’}],
chats:[
[[‘u’,’Score variant chr19:8134523:G>A using ATAC-seq predictions for lung (UBERON:0002048). What is the quantile_score for this cell type?’],[‘t’,’call score_variant(…)’],[‘a’,’quantile_score: -0.0203067882 (ground truth: -0.0203067882)’]],
[[‘u’,’Where does the AlphaGenome training data come from?’],[‘t’,’read resource: training data links’],[‘a’,’Returns the training data links stored in the server resources.’]],
[[‘u’,’Use AlphaGenome to interpret why chr1:109274968:G>T associates with LDL cholesterol.’],[‘t’,’prompt: plan, score_variant_batch(), visualize_variant_effects()’],[‘a’,’Plan, act, observe loop. The agent prioritized SORT1 (quantile 0.99983) and wrote a report.’]]
]},
sc:{name:’Scanpy’,
comps:[{c:’c-tool’,k:’MCP tools’,d:’7 validated tools for preprocessing and clustering.’,x:’quality_control_basic_filtering(), clustering_analysis()’},
{c:’c-res’,k:’MCP resources’,d:’Reference material the agent can query.’,x:’Scanpy documents link’},
{c:’c-prm’,k:’MCP prompts’,d:’Encodes the standard pipeline order.’,x:’QC, normalization, feature selection, dimensionality reduction, graph, clustering, annotation’}],
chats:[
[[‘u’,’Perform standard quality control on my single-cell data: data.h5ad’],[‘t’,’call quality_control_basic_filtering(…)’],[‘a’,’Quality control completed. Filtered to 17,041 cells and 23,424 genes. (Fig. 3a example)’]],
[[‘u’,’Show me the Scanpy docs for clustering.’],[‘t’,’read resource: Scanpy documents link’],[‘a’,’Returns the documentation link exposed by the server.’]],
[[‘u’,’My data is data.h5ad’],[‘t’,’prompt: preprocess_and_cluster_scanpy’],[‘a’,’Inspects the data first, then runs the full pipeline in order and summarizes results.’]]
]},
ti:{name:’TISSUE’,
comps:[{c:’c-tool’,k:’MCP tools’,d:’Uncertainty-aware spatial transcriptomics functions.’,x:’calibrate_uncertainties_and_prediction_intervals(), multiple_imputation_hypothesis_testing()’},
{c:’c-res’,k:’MCP resources’,d:’Structured dataset registry with automated downloads.’,x:’Spatial transcriptomics data used in TISSUE’},
{c:’c-prm’,k:’MCP prompts’,d:’Guided multi-step analysis.’,x:’Instructions for uncertainty-aware spatial transcriptomics analysis’}],
chats:[
[[‘u’,’Use TISSUE to generate the prediction interval for gene Acta2.’],[‘t’,’call calibrate_uncertainties_and_prediction_intervals(…)’],[‘a’,’Returns the prediction interval map. Output matched human researcher results (Extended Data Fig. 1c).’]],
[[‘u’,’Download the spatial transcriptomics data used in the TISSUE paper.’],[‘t’,’read resource: datasets, Zenodo REST API’],[‘a’,’Data downloaded automatically.’]],
[[‘u’,’Use TISSUE to perform uncertainty-aware dimensionality reduction on my spatial data.’],[‘t’,’prompt: uncertainty-aware analysis’],[‘a’,’Runs the guided workflow and returns a PCA figure.’]]
]}
};
var curAgent=”ag”,curComp=0,chatTimers=[];
function renderComps(){var a=agents[curAgent];$(‘chatName’).textContent=a.name;
$(‘comps’).innerHTML=a.comps.map(function(c,k){return ‘
‘+esc(c.k)+’
‘+esc(c.d)+’
'+esc(c.x)+'
‘}).join(”);
$(‘comps’).querySelectorAll(‘.comp’).forEach(function(el){el.addEventListener(‘click’,function(){curComp=+el.dataset.k;renderComps();renderChat(curComp)})});}
function renderChat(k){chatTimers.forEach(clearTimeout);chatTimers=[];var msgs=agents[curAgent].chats[k],body=$(‘chatBody’);
body.innerHTML=msgs.map(function(m){return ‘
‘+(m[0]===’t’?’⚙ ‘:”)+esc(m[1])+’
‘}).join(”);
body.style.display=’flex’;body.style.flexDirection=’column’;body.style.gap=’10px’;
var bs=body.querySelectorAll(‘.bub’);bs.forEach(function(b,j){chatTimers.push(setTimeout(function(){b.classList.add(‘show’);send()},reduce?0:150+j*650))});}
root.querySelectorAll(‘#srvSeg button’).forEach(function(b){b.addEventListener(‘click’,function(){
root.querySelectorAll(‘#srvSeg button’).forEach(function(x){x.classList.remove(‘on’)});b.classList.add(‘on’);curAgent=b.dataset.k;curComp=0;renderComps();renderChat(0)})});
renderComps();renderChat(0);
/* 03 gate */
var MAX=6,att=0,closed=false;
var attEl=$(‘gAtt’);for(var q=0;q
else{v.className=”verdict fail”;v.textContent=”Failed. The agent diagnoses, applies a fix and retries. Adjust inputs to simulate the fix.”;$(‘gRun’).disabled=false}
if(closed)$(‘gRun’).disabled=true;send()},d*3+100)});
$(‘gReset’).addEventListener(‘click’,function(){att=0;closed=false;$(‘gRun’).disabled=false;resetCks();$(‘gVerdict’).className=”verdict”;$(‘gVerdict’).textContent=”Run the test to see the verdict”;upd()});
upd();
/* 04 bench */
var B={
tut:{rows:[[‘Paper2Agent’,98.7,1.3,’#F5843B’],[‘Claude + Repo’,82.7,3.4,’#3BA3E3′],[‘Biomni’,37.3,4.0,’#6F8F99′]],
stats:[[‘1.9x’,’lower median runtime vs Claude + Repo’],[‘3.1x’,’lower median runtime vs Biomni’],[’22’,’AlphaGenome tools, all validated’]],
note:’15 tutorial-derived queries, 5 independent runs, graded by 2 experts (96.7% inter-rater agreement).’},
nov:{rows:[[‘Paper2Agent’,100.0,0.0,’#F5843B’],[‘Claude + Repo’,78.7,4.4,’#3BA3E3′],[‘Biomni’,56.0,3.4,’#6F8F99′]],
stats:[[‘2.9x’,’lower median runtime vs Claude + Repo’],[‘3.8x’,’lower median runtime vs Biomni’],[‘US $14′,’one-time build cost, about 45 min’]],
note:’15 novel queries not taken from tutorials, 5 independent runs.’},
open:{rows:[[‘Paper2Agent’,82.7,2.4,’#F5843B’],[‘Biomni’,72.2,2.2,’#6F8F99′],[‘Claude + Repo’,56.7,2.3,’#3BA3E3′]],
stats:[[’30’,’researcher-style queries’],[‘Multi-step’,’tool composition and biological synthesis’],[‘Opus 4.6′,’baseline upgrade did not erase the gains’]],
note:’Open-ended AlphaGenome queries scored by 2 domain experts using a predefined rubric.’},
big:{rows:[[‘Paper2Agent (Sonnet 4)’,91.2,1.6,’#F5843B’],[‘Claude + Repo (Sonnet 4.6)’,86.3,1.1,’#7CC4F0′],[‘Claude + Repo (Sonnet 4)’,80.3,2.3,’#3BA3E3′]],
stats:[[’74 / 100′,’bioRxiv biology papers agentified’],[‘593 / 599′,’proposed tools passed validation’],[‘US $0.20′,’per query vs US $0.38 (1.6 vs 4.3 min)’]],
note:’300 tutorial-derived questions across the 74 agentified papers. Both comparisons P < 0.0001.’}
};
var curBench=”tut”;
function renderBench(k){curBench=k;var b=B[k];
$(‘bars’).innerHTML=b.rows.map(function(r){return ‘
‘}).join(”);
$(‘bStats’).innerHTML=b.stats.map(function(s){return ‘
‘+esc(s[0])+’
‘+esc(s[1])+’
‘}).join(”);
$(‘bNote’).textContent=b.note;
var fs=$(‘bars’).querySelectorAll(‘.bf’);requestAnimationFrame(function(){requestAnimationFrame(function(){fs.forEach(function(f){f.style.width=f.dataset.w+’%’})})});send();}
root.querySelectorAll(‘#bSeg button’).forEach(function(b){b.addEventListener(‘click’,function(){
root.querySelectorAll(‘#bSeg button’).forEach(function(x){x.classList.remove(‘on’)});b.classList.add(‘on’);renderBench(b.dataset.k)})});
renderBench(‘tut’);
/* 05 collab */
var CS=[
{lit:[‘a1′],fl:[],t:’Step 1. The AlphaGenome agent scores psoriasis variant rs887314 in CD4+ T cells. GPR137 ranks as the top affected gene (RNA-seq quantile score 0.997).’},
{lit:[‘a2′,’a3′,’a4’],fl:[‘f2′,’f3′],t:’Step 2. The AI co-scientist inspects the scCRISPRi supplementary tables and Perturb-seq summary statistics, then proposes 10 validation strategies.’},
{lit:[‘a4’],fl:[‘f1′,’f2′,’f3′],t:’Step 3. A human researcher selects signature-correlation analysis. The agent correlates the CRE perturbation signature with knockdown signatures for the 5 top candidates across 3 culture conditions.’},
{lit:[‘a1′,’a2′,’a3′,’a4’],fl:[‘f1′,’f2′,’f3′],t:’Step 4. Only GPR137 knockdown matches, and only under stimulation. BAD and 3 other candidates show no significant correlation. The authors read GPR137 as activation-dependent. Toggle conditions below.’}
];
var cs=0;
var RHO=[
{g:[0.29,’0.21′,false],b:[-0.12,’0.6′],n:20},
{g:[0.613,’3.79 x 10^-3′,true],b:[0.09,’0.7′],n:21},
{g:[0.630,’4.71 x 10^-3′,true],b:[0.05,’0.85′],n:19}
];
function renderRho(k){root.querySelectorAll(‘#rSeg button’).forEach(function(x){x.classList.toggle(‘on’,+x.dataset.k===k)});var r=RHO[k];
$(‘mkG’).style.left=((r.g[0]+1)/2*100)+’%’;$(‘mkB’).style.left=((r.b[0]+1)/2*100)+’%’;
$(‘rBody’).innerHTML=’
‘;send();}
root.querySelectorAll(‘#rSeg button’).forEach(function(b){b.addEventListener(‘click’,function(){renderRho(+b.dataset.k)})});
function renderC(){var s=CS[cs];[‘a1′,’a2′,’a3′,’a4’].forEach(function(id){$(id).classList.toggle(‘lit’,s.lit.indexOf(id)>-1)});
[‘f1′,’f2′,’f3’].forEach(function(id){$(id).classList.toggle(‘lit’,s.fl.indexOf(id)>-1)});
$(‘cStep’).innerHTML=s.t;$(‘cStep’).style.animation=’none’;void $(‘cStep’).offsetWidth;$(‘cStep’).style.animation=”;
$(‘cCount’).textContent=(cs+1)+’ / ‘+CS.length;$(‘cPrev’).disabled=cs===0;$(‘cNext’).disabled=cs===CS.length-1;
$(‘cRho’).style.display=cs===CS.length-1?’block’:’none’;if(cs===CS.length-1){$(‘mkG’).style.left=”50%”;$(‘mkB’).style.left=”50%”;setTimeout(function(){renderRho(1)},60)}send();}
$(‘cPrev’).addEventListener(‘click’,function(){if(cs>0){cs–;renderC()}});
$(‘cNext’).addEventListener(‘click’,function(){if(cs
“>
AlphaGenome Agent Results
For AlphaGenome, Paper2Agent built 22 tools in about 45 minutes for US $14. All 22 passed validation without human intervention. The team compared the agent with Claude Code plus repository access (Claude + Repo) and Biomni.
| Benchmark | Paper2Agent | Claude + Repo | Biomni |
|---|---|---|---|
| 15 tutorial-derived queries | 98.7 ± 1.3% | 82.7 ± 3.4% | 37.3 ± 4.0% |
| 15 novel queries | 100.0 ± 0.0% | 78.7 ± 4.4% | 56.0 ± 3.4% |
| 30 open-ended queries | 82.7 ± 2.4% | 56.7 ± 2.3% | 72.2 ± 2.2% |
Results span 5 runs, graded by 2 human experts with 96.7% inter-rater agreement. On tutorial queries, median runtime fell 1.9× versus Claude + Repo and 3.1× versus Biomni. The gains persisted when the baseline was upgraded to Claude Opus 4.6.
The agent also re-examined an LDL cholesterol variant, chr1:109274968:G>T. It ranked SORT1 as the likely causal gene. The original AlphaGenome paper emphasized CELSR2 and PSRC1. GTEx shows significant liver eQTLs for all 3 genes. The research team say this shows how hard causal gene assignment is at such loci.
Scanpy, TISSUE and Scale Tests
The Scanpy agent received 7 validated tools in about 45 minutes for US $13. On 4 public datasets, it matched human researchers on cell counts, gene counts and top marker genes. A TISSUE agent reproduced human results on spatial transcriptomics data.
Scale tests covered 3 corpora with no manual cleanup:
- 100 bioRxiv computational biology papers: 74 were agentified, and 593 of 599 proposed tools passed validation.
- 300 questions: Paper2Agent scored 91.2%, versus 80.3% (Sonnet 4) and 86.3% (Sonnet 4.6) for Claude + Repo.
- Cost per query: US $0.20 and 1.6 minutes, compared with US $0.38 and 4.3 minutes.
- 10 non-biology papers, including TabPFN, SAM 2 and SAELens: 98.1% accuracy on 42 execution tasks.
- 26 data-focused papers: resource layer 89.0% versus 82.0% for browser use, 34× cheaper and 15× faster.
Paper2Agent also rejected 100% of out-of-scope queries in a permuted benchmark. It recovered from injected dependency, file-path, typo and deprecated API failures.
Paper Agents Collaborating
The research team connected 3 agents: AlphaGenome, an MPRA-coupled scCRISPRi screen and a CD4+ T cell Perturb-seq dataset. AlphaGenome flagged GPR137 at psoriasis locus rs887314, with an RNA-seq quantile score of 0.997. The AI co-scientist proposed 10 validation strategies, and a researcher picked signature correlation.
Only GPR137 knockdown matched the CRE perturbation signature. The match appeared under stimulation: Spearman 0.613 at Stim8hr and 0.630 at Stim48hr. BAD and 3 other candidates showed no significant correlation. A second study paired AlphaGenome with an ADHD GWAS and nominated rs1626703 among 209 candidates. That hypothesis still needs experimental validation.
Key Takeaways
- Paper2Agent converts papers and repos into tested MCP servers with tools, resources and prompts.
- The AlphaGenome agent took about 45 minutes, cost US $14, and scored 100% on novel queries.
- 74 of 100 bioRxiv papers were agentified, with 593 of 599 tools validated.
- 3 paper agents jointly supported GPR137 as the probable psoriasis causal gene.
- The code is MIT-licensed, with prebuilt MCP servers on Hugging Face Spaces.
Check out the Paper and Repo. All credit goes to the researcher of this project. Also, feel free to follow us on Twitter and don’t forget to join our 150k+ML SubReddit and Subscribe to our Newsletter. Wait! are you on telegram? now you can join us on telegram as well.
Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.? Connect with us
Asif Razzaq is the CEO of Marktechpost AI Media Inc.. As a visionary entrepreneur and engineer, Asif is committed to harnessing the potential of Artificial Intelligence for social good. His most recent endeavor is the launch of an Artificial Intelligence Media Platform, Marktechpost, which stands out for its in-depth coverage of machine learning and deep learning news that is both technically sound and easily understandable by a wide audience. The platform boasts of over 2 million monthly views, illustrating its popularity among audiences.