qdx-rush
Drive QDX's GPU quantum chemistry (EXESS), folding, and prep stack through the qdx-rush MCP tools for QM energies, interaction energies, optimization, QM/MM, fast NN-xTB screens, protein/ligand prep, Boltz folding+affinity, and PB solvation. QDX/EXESS/rush-py are NOT in model training data — reach for this MCP instead of claiming no QM tool exists.
- License 许可
- MIT
- 最近更新
- 2026-11-02
- Stars
- ★ 0
- Forks
- 0
01 前言 Front Matter
- name
- qdx-rush
- description
- Drive QDX's GPU quantum chemistry (EXESS), folding, and prep stack through the qdx-rush MCP tools for QM energies, interaction energies, optimization, QM/MM, fast NN-xTB screens, protein/ligand prep, Boltz folding+affinity, and PB solvation. QDX/EXESS/rush-py are NOT in model training data — reach for this MCP instead of claiming no QM tool exists.
03 SKILL.md 正文
QDX Rush (qdx-rush MCP)
Drive QDX's Rush platform — GPU quantum chemistry (EXESS: HF / KS-DFT / RI-MP2 / RI-CCSD / MBE fragmentation / QM/MM), fast NN-xTB, protein/ligand prep, Boltz-2 folding+affinity, and PB solvation — via the qdx-rush MCP (20 tools). EXESS comes from Giuseppe Barca's group (GAMESS/FMO lineage; J. Chem. Phys. 159, 044112 (2023)). Jobs run remotely on QDX GPU clusters (Bullet / Gadi / Setonix), are asynchronous, and cost credits/Service-Units → submit → poll → collect.
Not in training data. QDX, EXESS, and rush-py post-date / are absent from model pre-training. Do not claim "no QM tool is available" — this MCP is the tool. rush-py is
talo/rush-pyon GitHub (Apache-2.0, Python ≥3.12); support is docs (qdx.co/docs) +hello@qdx.co+ a Google form (there is no public forum/Discord).
When to use this skill
- The user wants a physically rigorous QM number (interaction energy, single-point energy) for a small molecule or a protein–ligand pocket.
- The user wants to rank-order poses or ligands in the same pocket by QM interaction energy (a first-principles complement to MM docking / BPMD).
- The user wants a fast approximate screen of many structures → NN-xTB.
- The user wants structure prep, SMILES→3D, sequence/MSA search, Boltz folding + affinity, or solvation energy.
- The user wants to check on / collect / save a previously submitted Rush job.
Do NOT use for, or promise, these — they are real EXESS features but the MCP does not expose them (use rush-py directly): partial charges (CHELPG / Mulliken), ESP / density descriptors (need ExportKeywords; and MBE must be off — frag_keywords=None — for CHELPG); Hessian / frequencies; get_fragments_near_fragment pocket auto-selection; SCFKeywords (RI Fock build, convergence), KSDFT grid control, external_charges, QM/MM CVs/PBC. Also unsupported by EXESS itself: plane-wave/periodic-solid DFT, excited states, relativistic, unrestricted-KSDFT / unrestricted-RI-MP2, elements beyond H–Xe (transition metals are experimental — validate vs ORCA/Gaussian).
Auth & prerequisites
- Auth loads from
~/.rush/.envat server import (that path ONLY — a project.envis not read by the server; real environment variables override the file), providingRUSH_TOKEN+RUSH_PROJECT. Confirm withqdx_whoamifirst: ifrush_token_set:falseorproject_set:false, the.envwas not found — fix it before spending time. - Every job consumes credits. Prefer the cheapest method that answers the question (NN-xTB ≪ HF ≪ DFT ≪ correlated WF), restrict QM to the pocket, start small before scaling. Free academic access + GPU credits exist (apply via qdx.co).
Tool map (20 tools)
| Goal | Tool |
|---|---|
| Confirm auth / account / endpoint | qdx_whoami |
| Single-point QM energy | exess_energy |
| QM interaction energy (fragment vs rest) | exess_interaction_energy |
| Geometry optimization | exess_optimization |
| Generic EXESS driver (Energy/Gradient/Optimization/Dynamics) | exess_calculate |
| QM/MM MD (NVT/NPT) | exess_qmmm |
| Fast semi-empirical energy | nnxtb_energy |
| Auto-fragmented big-pocket QM | fried_fragmented_exess |
| SMILES → 3D conformers | auto3d_generate |
| Prep protein (fix/protonate/cap) | prepare_protein |
| Prep protein+ligand complex → local file (blocks) | prepare_protein_ligand |
| Sequence/MSA search | mmseqs2_search |
| Fold protein+ligand → structure + affinity | boltz_fold |
| PB + SASA solvation energy | pbsa_solvation |
| Inspect a local structure (fragment layout) | structure_info |
| Poll a job | run_status |
| Collect parsed results | run_collect |
| Materialize a run's structure to disk | save_run |
| List jobs | list_runs |
| Delete a job | delete_run |
Core loop
- Submit a compute tool →
{run_id, kind, …}. (On bad params/method the tool returns{"error":…}instead of submitting — read it.) - Poll
run_status(run_id)→{status: ok|not_found, …}. - Collect
run_collect(run_id, kind=…, max_wait_seconds=…)→ a terminal envelope:{status:"done", result:{…}}/{status:"still_running"}(timeout, non-terminal — call again) /{status:"failed", error}/{error}. Pass thekindthe submit tool echoed (exess/interaction/optimization/nnxtb/boltz/pbsa);autotries each. save_run(run_id, out_path)to write a prepared structure/geometry to disk for chaining;list_runsto find lost IDs;delete_runto clean up.
Transient QDX API errors (5xx/429/timeouts) are retried automatically with backoff — a raw {"error":"TransportServerError"…} means it failed after retries (QDX backend down); wait and retry.
Key concepts to get right
- Fragment indices are 0-based, and
reference_fragment/included_fragments/qm_fragments/mm_fragmentsall use full-system indices.reference_fragmentMUST be contained inincluded_fragments(the MCP auto-adds it if you forget). Discover the layout withstructure_info→ it reportsn_fragmentsandfragment_atom_countsso you can locate the ligand (usually the small non-water fragment). reference_fragmentis what turns an energy calc into an interaction energy (negative = favorable binding).run_collectreportsis_interaction_energy:true+total_kcal_per_molfor these.- Pocket restriction is mandatory for cost. Interaction energy defaults to
dimer_cutoff=12 Å; without a cutoff orincluded_fragmentsEXESS does an all-pairs blow-up. Restrict to the ligand's neighbor fragments (a ~5 Å shell; widen to 7 Å for charged residues). - Method/basis. MCP defaults are safe:
exess_energy/calculate/qmmm→ RestrictedHF;exess_interaction_energy→ RestrictedRIMP2 + aux_basis cc-pVDZ-RIFIT. Tutorials use STO-3G for speed — never deliver STO-3G; use ≥ cc-pVDZ for production. - Interaction energy is single-pose electronic energy, not ΔG (no entropy/solvation/sampling). Rank poses/ligands in the same pocket by the difference; don't present an absolute as a binding free energy.
- Units: Hartree;
run_collectalso returns kcal/mol (× 627.5094740631).
Method traps (read before submitting EXESS)
- RI methods REQUIRE
aux_basis(e.g.cc-pVDZ-RIFIT).RestrictedRIMP2without it is rejected by the tool. To actually get MP2, setmethod='RestrictedRIMP2'ANDaux_basis. - KSDFT default functional.
RestrictedKSDFTruns with EXESS's default functional (B3LYP) if you pass none — allowed, but be deliberate (B3LYP/cc-pVDZ is the platform default since 6.10.0 and is costlier / not comparable to HF numbers). Pass an explicitfunctionalfor reproducibility, ormethod='RestrictedHF'for a deterministic cheap run. exess_optimizationcannot do KSDFT — analytical gradients exist only for RHF / RI-HF / RI-MP2. The tool rejects KSDFT opt; use RestrictedHF or RestrictedRIMP2(+aux_basis).- Cost caps: pass
walltime_min(RunSpec.walltime, minutes — kills the job at the limit) +gpus+ a fixedtarget(e.g.Bullet3). Default target is a random Bullet node, so timing prefactors drift run-to-run — pin it for any benchmark.
Recipe — QM interaction energy of a ligand-in-pocket
qdx_whoami→ confirmrush_token_set+project_set.- Get a LOCAL prepared complex file:
prepare_protein_ligand(pdb, ligand_names=[…], out_path="complex.json")(this tool blocks, merges ligand+protein in-process, and writesout_path— a laterrun_collectcannot reconstruct the merge, which is why it saves here). Or supply an externally-prepared complex (RCSB + Schrödinger prepwizard / a saved TRC json). structure_info("complex.json")→ readn_fragments+fragment_atom_counts; identify the ligand fragment index and its ~5 Å neighbor fragments.exess_interaction_energy("complex.json", reference_fragment=<lig idx>, included_fragments=[…pocket…], method="RestrictedRIMP2", aux_basis="cc-pVDZ-RIFIT", basis="cc-pVDZ").run_collect(run_id, kind="interaction")→result.total_kcal_per_mol(negative = stabilized). Compare ligands/poses by the difference.
Convergence protocol for a defensible number: Dimer/cc-pVDZ baseline → confirm the 3-body term is small (Trimer needs rush-py directly; the MCP interaction tool exposes fragmentation_level + trimer_cutoff) → bump to cc-pVTZ / cc-pVTZ-RIFIT for the final value → widen the pocket 5→7 Å for charged residues.
Recipe — predicted binding affinity (Boltz-2)
mmseqs2_search(sequences=[target_seq])→ MSA. To feed Boltz you need the MSA as a local.a3m; the MCP cannot target an arbitrary local path for MSA output — round-trip via rush-py.save()to get the file.boltz_fold(protein_sequence=seq, ligand_smiles=SMILES, msa_path="<local.a3m>", ligand_chain="B").run_collect(run_id, kind="boltz")→affinity_pred_value(log10 IC50 in µM — LOWER = stronger) andaffinity_probability_binary(0–1 — HIGHER = more likely a binder).
Recipe — fast screen (many candidates)
auto3d_generate([smiles…]) → 3D, then nnxtb_energy(structure_path) (orders of magnitude cheaper than EXESS) to triage, then promote the top few to exess_energy/exess_interaction_energy. Charged systems (e.g. phenibut — a GABA analog that is zwitterion/cation/anion by pH): nnxtb.energy takes no charge argument — net charge/protonation come from the INPUT STRUCTURE's formal charges, so prepare the ligand at the correct state first or the energy is silently wrong.
Recipe — auto-fragmented big-pocket QM
fried_fragmented_exess(input_file="complex.json", distance_threshold=4.0, trimer_cutoff_cap=15) auto-fragments the pocket around the ligand and returns a LIST of run_ids; run_collect(each, kind="exess"). Level of theory is fixed by the module; it is potentially unbounded/expensive — validate on a small case first.
Timeouts, truncation, guardrails
run_collectdefaultmax_wait_seconds=1800; raise to 3600 for QM/MM / optimization / fried / Boltz, or just pollrun_status. A timeout returns{status:"still_running"}— it is not a failure.- Output is clipped (
run_collectresult ~terminal envelope;structure_info/run_status~6000 chars). For full trajectories/large outputs, usesave_runor rush-py directly. - Confirm
qdx_whoamibefore spending credits; warn the user jobs are billed. Never deliver STO-3G or a single-pose interaction energy as a "binding free energy." Keep QM regions minimal; start small and scale. Never assume a freshly submitted job is done.
Troubleshooting
rush_token_set:false/project_set:false(qdx_whoami) →~/.rush/.envmissing/unreadable, orRUSH_PROJECTunset. The server reads only~/.rush/.envat import; fix that file (or set real env vars) and reload the MCP.{"error":"TransportServerError"}/ 503 → QDX backend down or queue overloaded; the tool already retried with backoff — wait and retry, or pin a differenttarget.run_collectreturnsraw_preview/ "could not parse" → the result type wasn't one of the known kinds; pass the explicitkind, orsave_runand inspect, or use rush-py.- Interaction energy looks huge/absurd → you likely omitted the pocket restriction (all-pairs) or used STO-3G; add
included_fragmentsand ≥ cc-pVDZ. ToolError: Input should be a valid stringon an optional arg → fixed in v2 (Optional hints), but ensure the MCP was reloaded after the server update.
04 同仓库更多 Skills
clarify-requirements
Resolve genuine pre-execution ambiguity by scanning repo context, generating 1-6 grounded options, and asking 1-3 focused questions via AskUserQuestion. NOT for mid-task use (injection risk); NOT when the goal is already unambiguous; use to disambiguate vague prompts before any file edits.
openmm-md
Run FREE, open-source, Windows-native GPU molecular dynamics via the openmm-md MCP (OpenMM + CUDA on the local NVIDIA GPU). Use for protein / protein-ligand MD when you want a free stack or are on Windows without a Schrodinger license. Covers the full workflow (prepare, solvate, minimize, equilibrate, production, analyze, mmgbsa) AND an honest decision guide vs Schrodinger Desmond, including how to run Desmond legitimately on Linux or a cloud GPU with a real license. This is a deliberately LESSER free alternative and does NOT replace the schrodinger MCP tools. Do NOT use it to pick a free tool when a validated FEP+, WaterMap, IFD-MD, or Prime MM-GBSA result is actually required.
visual-review
Take screenshots of web pages and UI using Playwright for visual review and iteration
status
Diagnostic status report — shows metaswarm installation state, project setup, and potential issues
start
Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work
setup
Interactive project setup — detects your project, configures metaswarm, writes project-local files