[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DERSCDSJS7WREQD3JB7YTC":3,"skill-same:01M6DERSCDSJS7WREQD3JB7YTC":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":14,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":54,"install":55,"resources":68},"01M6DERSCDSJS7WREQD3JB7YTC","schrodinger-maestro-driver",null,"Use when driving the local schrodinger MCP server for structure-based drug discovery on a Schrodinger Suite install - SMILES to 3D, LigPrep, Protein Preparation Wizard, Glide grid generation, Glide docking, Prime MM-GBSA binding free energy, QikProp ADMET, structure format conversion, RDKit descriptors, or the run_schrodinger_python escape hatch. Covers SCHRODINGER environment setup and the license-token-free vs token-consuming split. NOT for the whole prep-to-rescore campaign (use structure-based-screening).","Prekzursil\u002Fagent-skills-toolchain","Prekzursil","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54636077?v=4","01M6DACZ1PCQHD99SCR1YXG28B","Andrei Mihai Visalon","01M6DACZ670WZF535V3WYYSS4Z",0,"MIT","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Fskills\u002Fschrodinger-maestro-driver\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"schrodinger maestro driver","use","hatch","free","generation","docking","local","structure","conversion","campaign","MCP","environment","wizard","discovery","3D","rdkit","server","license","mcp server","python","2026-11-10 10:12:30",false,"---\nname: schrodinger-maestro-driver\ndescription: Use when driving the local schrodinger MCP server for structure-based drug discovery on a Schrodinger Suite install - SMILES to 3D, LigPrep, Protein Preparation Wizard, Glide grid generation, Glide docking, Prime MM-GBSA binding free energy, QikProp ADMET, structure format conversion, RDKit descriptors, or the run_schrodinger_python escape hatch. Covers SCHRODINGER environment setup and the license-token-free vs token-consuming split. NOT for the whole prep-to-rescore campaign (use structure-based-screening).\n---\n\n# Schrodinger \u002F Maestro Driver\n\n## Overview\n\nThe `schrodinger` MCP server is a thin, security-conscious wrapper over a local Schrodinger Suite install. It NEVER imports the `schrodinger` package in-process; every tool builds an argv list and hands it to a single internal `_exec()` chokepoint that runs WITHOUT a shell. Client-supplied paths are validated by `_safe_path()` (rejects empty\u002Fflag-like values, normalizes to absolute) before reaching any argv, so there is no shell or argument injection. The `run_schrodinger_python` tool is an intentional arbitrary-code escape hatch - this server is for local, single-user use only.\n\n- Source: `C:\\Users\\Prekzursil\\source\\agent-skills-toolchain\\tools\\mcp\\schrodinger-mcp\\server.py` (+ `_sch_helper.py`, which runs INSIDE the Schrodinger interpreter where both `schrodinger` and a bundled `rdkit` are importable).\n- Validation boundary: the core pipeline was live-tested on Schrodinger 2022-4, build 79134. The expanded 67-tool surface targets 2026-2 and is statically verified, with live-box smoke testing still pending.\n\n## Environment Setup\n\nThe server reads `SCHRODINGER` from the environment; it defaults to the Windows path `D:\\Program Files\\Schrodinger 2026-2` and on POSIX you must set it.\n\n- MCP registration (canonical stdio target):\n  - command: `C:\\Users\\Prekzursil\\source\\agent-skills-toolchain\\tools\\mcp\\schrodinger-mcp\\.venv\\Scripts\\python.exe`\n  - args: `C:\\Users\\Prekzursil\\source\\agent-skills-toolchain\\tools\\mcp\\schrodinger-mcp\\server.py`\n  - env: `SCHRODINGER` = `D:\\Program Files\\Schrodinger 2026-2`\n- Cross-platform note: the server resolves `run.exe`\u002Fdriver `.exe` on Windows and falls back to the extension-less `run`\u002Fdriver names on POSIX. On POSIX, export `SCHRODINGER` to your suite root (e.g. `\u002Fopt\u002Fschrodinger\u002Fsuites\u002F2026-2`).\n- Sanity check first: call `schrodinger_version` (wraps `run -v`) and `backend_info` (suite build + bundled RDKit version visible to the backend). If these fail, fix `SCHRODINGER` before anything else.\n\n## The 67 Tools\n\nThe core structure and docking pipeline is documented in detail first. The\nexpanded workflows are grouped afterward so you can route directly to the typed\ntool instead of falling back to arbitrary Python.\n\n### Core structure and docking pipeline\n\nLicense-token-FREE (fast, no `-WAIT` driver):\n\n- `schrodinger_version()` - suite version + resolved environment from `run -v`.\n- `backend_info()` - suite build + bundled RDKit version + install path the backend sees.\n- `smiles_to_3d(smiles, out_path, title=\"\")` - SMILES to a 3D `.sdf` or `.mae` file. 3D via RDKit ETKDGv3 + MMFF; the output extension picks the format (`.mae` for Glide\u002FPrime downstream, `.sdf` for portability).\n- `molecule_properties(smiles)` - drug-likeness panel: formula, MW, logP, HBD\u002FHBA, TPSA, rotatable bonds, rings, QED, Lipinski pass\u002Ffail (RDKit).\n- `convert_structure(src, dst)` - convert a structure file between formats (`.sdf`, `.mae`, `.pdb`) via `schrodinger.structure`.\n- `run_schrodinger_python(code, timeout_s=300)` - escape hatch: run a Python snippet inside the Schrodinger interpreter (has both `schrodinger` and `rdkit`). Returns returncode + truncated stdout\u002Fstderr. Use this only when the typed tools do not cover the task (custom analysis, batch scripting, computing a binding-site centroid).\n\nToken-CONSUMING product drivers (synchronous `-WAIT`; each call holds a license token until it finishes). Listed in pipeline order:\n\n- `prepwizard(input_file, output_mae, ph=7.0, fill_sidechains=True, timeout_s=1800)` - Protein Preparation Wizard: clean a raw receptor (`.pdb`\u002F`.mae`) - add hydrogens, assign bond orders, optionally fill missing side chains, set protonation at `ph` via PROPKA. Output is a prepared `.mae` ready for `glide_grid`. (The driver lives in `$SCHRODINGER\u002Futilities`; `_driver()` resolves it there.)\n- `ligprep(input_file, output_mae, timeout_s=1200)` - LigPrep prepared 3D ligand states (ionization\u002Ftautomers\u002Fstereo). Input flag is auto-selected from the extension: `-ismi` for `.smi`, `-isd` for `.sdf`\u002F`.sd`, else `-imae`. So LigPrep can take a `.smi` directly - `smiles_to_3d` is an ALTERNATIVE 3D entry point, not a mandatory predecessor.\n- `glide_grid(receptor_mae, out_grid_zip, center=\"\", ligand_molnum=0, inner_box=10, outer_box=30, timeout_s=1800)` - generate the Glide docking grid (`.zip`) from a prepared receptor. Define the box EITHER with explicit `center=\"x,y,z\"` coordinates OR with `ligand_molnum` (1-based molecule number of a co-crystallized ligand already in the receptor file). This is the step `glide_dock` needs.\n- `glide_dock(grid_file, ligands_mae, precision=\"SP\", timeout_s=3600)` - Glide docking of prepared ligands into a grid `.zip` (from `glide_grid`). `precision` must be `HTVS`, `SP`, or `XP`. Writes a `glide_dock_job.in` and returns the `*_pv.maegz` pose-viewer path.\n- `prime_mmgbsa(pose_viewer, timeout_s=3600)` - Prime MM-GBSA binding free-energy (dG bind) rescoring of docked poses; input is the `*_pv.maegz` from `glide_dock`. Returns the `-out.csv` (with `r_psp_MMGBSA_dG_Bind`) + `-out.maegz`. Far more reliable than the raw Glide score.\n- `qikprop_admet(structure_file, timeout_s=900)` - QikProp ADMET\u002Fphyschem prediction on a 3D structure (`.mae`\u002F`.sdf`). Returns the result `.CSV` path + first 3 lines.\n\n### Expanded workflow surface\n\n- **Diagnostics and structure I\u002FO (4):** `backend_doctor`,\n  `structure_properties_extract`, `pdb_fetch`, `install_cure`.\n- **Prep, docking, and pose workflows (10):** `prep_target`, `ensemble_dock`,\n  `al_dock`, `dock_triage`, `induced_fit_docking`, `covalent_docking`,\n  `pose_validity`, `pose_interaction_fingerprint`, `pose_viewer_split`,\n  `pymol_render`.\n- **Screening, properties, and analogs (12):** `qikprop_parse_results`,\n  `sitemap`, `confgen`, `shape_screen`, `canvas_fingerprints`,\n  `canvas_descriptors`, `phase_pharmacophore`, `phase_screen`, `ligfilter`,\n  `propfilter`, `analog_scan`, `reaction_enumerate`.\n- **MD and free energy (14):** `desmond_setup`, `desmond_md`,\n  `desmond_trajectory_analysis`, `desmond_interactions`,\n  `desmond_membrane_setup`, `thermal_mmgbsa`, `fep_plus`, `fep_map_build`,\n  `fep_parse_results`, `fep_absolute_binding`, `watermap`, `bpmd`,\n  `bpmd_ladder`, `openmm_from_prepared`.\n- **QM, advanced modeling, and ML (10):** `jaguar_pka`, `jaguar_qm`,\n  `epik_enumerate`, `epik_pka`, `qm_cluster_extract`,\n  `macromodel_confsearch`, `residue_scanning`, `qsite_qmmm`,\n  `autoqsar_build`, `autoqsar_predict`.\n- **Job and GPU operations (5):** `job_server_control`, `job_status`, `job_wait`,\n  `job_restart`, `schrodinger_gpu_pool`.\n\n## Typical Workflow (end-to-end structure-based screening)\n\n1. `backend_info` \u002F `schrodinger_version` - confirm the suite and `SCHRODINGER` resolve.\n2. Receptor side - `prepwizard(\"receptor.pdb\", \"receptor_prep.mae\")` then `glide_grid(\"receptor_prep.mae\", \"grid.zip\", center=\"x,y,z\")`.\n3. Ligand side - either `smiles_to_3d(smiles, \"lig.mae\")` then `ligprep(\"lig.mae\", \"lig_prepped.mae\")`, OR feed SMILES straight to `ligprep(\"lig.smi\", \"lig_prepped.mae\")`.\n4. Dock - `glide_dock(\"grid.zip\", \"lig_prepped.mae\", \"SP\")` -> `*_pv.maegz`.\n5. Rescore + triage - `prime_mmgbsa(\"..._pv.maegz\")` for dG bind; `qikprop_admet(\"lig_prepped.mae\")` and\u002For `molecule_properties(smiles)` for ADMET\u002Fdescriptors.\n6. Convert poses\u002Fstructures as needed - `convert_structure(\"out.maegz\", \"out.sdf\")`.\n\nThe `structure-based-screening` skill spells out this full pipeline with the centroid trick and license-token notes.\n\n## Full pipeline is now in-server (receptor prep -> grid -> dock -> rescore)\n\nAs of the `prepwizard` \u002F `glide_grid` \u002F `prime_mmgbsa` addition, the whole structure-based chain is callable from this MCP - no Maestro GUI step required:\n\n1. `prepwizard(\"raw_receptor.pdb\", \"receptor_prep.mae\")` - clean\u002Fprotonate the receptor.\n2. `glide_grid(\"receptor_prep.mae\", \"grid.zip\", center=\"x,y,z\")` - build the docking box. Center it on explicit coordinates, or on a co-crystallized ligand via `ligand_molnum`. To derive a centroid from a co-crystal ligand, use `run_schrodinger_python` to average that ligand's atom coordinates.\n3. `glide_dock(\"grid.zip\", \"lig_prepped.mae\", \"SP\")` - dock.\n4. `prime_mmgbsa(\"..._pv.maegz\")` - rescore with binding free energy.\n\n`glide_dock` still requires a grid `.zip` - but `glide_grid` now produces it, so a true `receptor.pdb + SMILES -> docked, rescored pose` flow is possible end-to-end. The grid box still needs a sensible center (the binding site); surface that choice to the user rather than guessing blindly.\n\n## Multi-GPU pool on a cloud box (Linux) - and the BPMD\u002FJobDJ \"No job found\" download gotcha\n\nOn a multi-GPU Linux box (e.g. a 4xH100 node) a SINGLE shared `jobserverd` strips `CUDA_VISIBLE_DEVICES` from its subjobs, so every job piles onto GPU 0. The working pattern (see `schrod-gpu-pool.sh`, toolchain PR #79) is one CVD-pinned `jobserverd` per GPU, with each launch routed to its GPU's server via `jsc local-server-dir --set \u003Cpool>\u002Fjs_gpu\u003Cg>` at submit time. FEP+ is the exception - it self-parallelizes, so use `multisim -maxjob N` instead of the pool.\n\n- GOTCHA (cost real re-runs): a driver that ends with a JobDJ `jsc download` - BPMD (`binding_pose_metadynamics.py`), and any `-WAIT` driver that downloads its own results - FAILS the download step when the pool restores the default jobserver after launch. The compute RAN fine on the pinned GPU, but the driver's final `jsc download \u003Cjobid>` queries the RESTORED default server, which has no record of the job -> `No job found for JobId`. This is a silent partial failure: GPU work done, results never collected.\n- FIX (validated): give each concurrent driver its OWN isolated `HOME` (e.g. `export HOME=\u002Froot\u002Fbpmd_iso_\u003Cligand>`) BEFORE routing. Then inside that HOME: `jsc local-server-dir --set \u003Cpool>\u002Fjs_gpu\u003Cg>`, `export CUDA_VISIBLE_DEVICES=\u003Cg>`, and run the driver `-HOST localhost -SUBHOST localhost:1 -WAIT`. The isolated HOME pins the driver's `~\u002F.schrodinger` jobserver config for its WHOLE lifecycle, so submit AND the final JobDJ download resolve against the SAME per-driver server. Shared-HOME pool BPMD failed every download; isolated-HOME BPMD produced `-out.maegz` + CompScore cleanly.\n- Extract BPMD scores from the driver's real output: `proplister -c bpmd_\u003CL>-out.maegz` (CompScore\u002FPoseScore properties) - do NOT `head` the per-frame `-out.csv`, which is trajectory data, not the summary.\n\n## Common Mistakes\n\n- Treating `smiles_to_3d` as a required step before `ligprep` - LigPrep accepts SMILES (`.smi`) directly.\n- Calling `glide_dock` without first running `glide_grid` (it needs the grid `.zip`); or calling `glide_grid` with no box center (pass `center=\"x,y,z\"` or `ligand_molnum`).\n- Running `prepwizard` and expecting the top-level driver - it lives in `$SCHRODINGER\u002Futilities` (the server resolves it; a hand-rolled call to `$SCHRODINGER\u002Fprepwizard` will miss).\n- Forgetting that product drivers consume license tokens, often with long default timeouts. Concurrent driver calls compete for tokens.\n- Passing flag-like or relative paths and assuming they pass `_safe_path` - they are normalized to absolute and rejected if they start with `-`.\n- Expecting `convert_structure`\u002F`smiles_to_3d` (.mae path) to work if the suite cannot import `schrodinger.adapter`\u002F`schrodinger.structure` - those run inside the suite interpreter via `_sch_helper.py`.\n\n## Related Skills\n\n- [[structure-based-screening]] - the end-to-end receptor-prep -> grid -> dock -> MM-GBSA pipeline that chains these tools, with the centroid trick and license-token notes.\n- `mechanistic-ddi-pipeline` - combine this server's structure tools with ToolUniverse CYP\u002FDDI knowledge for a DDI verdict.\n- `cheminformatics-rdkit` - standalone RDKit MCP for descriptors\u002Ffingerprints\u002Fsimilarity\u002Fscaffolds (no Schrodinger license needed).\n","# Schrodinger \u002F Maestro Driver\n\n## Overview\n\nThe `schrodinger` MCP server is a thin, security-conscious wrapper over a local Schrodinger Suite install. It NEVER imports the `schrodinger` package in-process; every tool builds an argv list and hands it to a single internal `_exec()` chokepoint that runs WITHOUT a shell. Client-supplied paths are validated by `_safe_path()` (rejects empty\u002Fflag-like values, normalizes to absolute) before reaching any argv, so there is no shell or argument injection. The `run_schrodinger_python` tool is an intentional arbitrary-code escape hatch - this server is for local, single-user use only.\n\n- Source: `C:\\Users\\Prekzursil\\source\\agent-skills-toolchain\\tools\\mcp\\schrodinger-mcp\\server.py` (+ `_sch_helper.py`, which runs INSIDE the Schrodinger interpreter where both `schrodinger` and a bundled `rdkit` are importable).\n- Validation boundary: the core pipeline was live-tested on Schrodinger 2022-4, build 79134. The expanded 67-tool surface targets 2026-2 and is statically verified, with live-box smoke testing still pending.\n\n## Environment Setup\n\nThe server reads `SCHRODINGER` from the environment; it defaults to the Windows path `D:\\Program Files\\Schrodinger 2026-2` and on POSIX you must set it.\n\n- MCP registration (canonical stdio target):\n  - command: `C:\\Users\\Prekzursil\\source\\agent-skills-toolchain\\tools\\mcp\\schrodinger-mcp\\.venv\\Scripts\\python.exe`\n  - args: `C:\\Users\\Prekzursil\\source\\agent-skills-toolchain\\tools\\mcp\\schrodinger-mcp\\server.py`\n  - env: `SCHRODINGER` = `D:\\Program Files\\Schrodinger 2026-2`\n- Cross-platform note: the server resolves `run.exe`\u002Fdriver `.exe` on Windows and falls back to the extension-less `run`\u002Fdriver names on POSIX. On POSIX, export `SCHRODINGER` to your suite root (e.g. `\u002Fopt\u002Fschrodinger\u002Fsuites\u002F2026-2`).\n- Sanity check first: call `schrodinger_version` (wraps `run -v`) and `backend_info` (suite build + bundled RDKit version visible to the backend). If these fail, fix `SCHRODINGER` before anything else.\n\n## The 67 Tools\n\nThe core structure and docking pipeline is documented in detail first. The\nexpanded workflows are grouped afterward so you can route directly to the typed\ntool instead of falling back to arbitrary Python.\n\n### Core structure and docking pipeline\n\nLicense-token-FREE (fast, no `-WAIT` driver):\n\n- `schrodinger_version()` - suite version + resolved environment from `run -v`.\n- `backend_info()` - suite build + bundled RDKit version + install path the backend sees.\n- `smiles_to_3d(smiles, out_path, title=\"\")` - SMILES to a 3D `.sdf` or `.mae` file. 3D via RDKit ETKDGv3 + MMFF; the output extension picks the format (`.mae` for Glide\u002FPrime downstream, `.sdf` for portability).\n- `molecule_properties(smiles)` - drug-likeness panel: formula, MW, logP, HBD\u002FHBA, TPSA, rotatable bonds, rings, QED, Lipinski pass\u002Ffail (RDKit).\n- `convert_structure(src, dst)` - convert a structure file between formats (`.sdf`, `.mae`, `.pdb`) via `schrodinger.structure`.\n- `run_schrodinger_python(code, timeout_s=300)` - escape hatch: run a Python snippet inside the Schrodinger interpreter (has both `schrodinger` and `rdkit`). Returns returncode + truncated stdout\u002Fstderr. Use this only when the typed tools do not cover the task (custom analysis, batch scripting, computing a binding-site centroid).\n\nToken-CONSUMING product drivers (synchronous `-WAIT`; each call holds a license token until it finishes). Listed in pipeline order:\n\n- `prepwizard(input_file, output_mae, ph=7.0, fill_sidechains=True, timeout_s=1800)` - Protein Preparation Wizard: clean a raw receptor (`.pdb`\u002F`.mae`) - add hydrogens, assign bond orders, optionally fill missing side chains, set protonation at `ph` via PROPKA. Output is a prepared `.mae` ready for `glide_grid`. (The driver lives in `$SCHRODINGER\u002Futilities`; `_driver()` resolves it there.)\n- `ligprep(input_file, output_mae, timeout_s=1200)` - LigPrep prepared 3D ligand states (ionization\u002Ftautomers\u002Fstereo). Input flag is auto-selected from the extension: `-ismi` for `.smi`, `-isd` for `.sdf`\u002F`.sd`, else `-imae`. So LigPrep can take a `.smi` directly - `smiles_to_3d` is an ALTERNATIVE 3D entry point, not a mandatory predecessor.\n- `glide_grid(receptor_mae, out_grid_zip, center=\"\", ligand_molnum=0, inner_box=10, outer_box=30, timeout_s=1800)` - generate the Glide docking grid (`.zip`) from a prepared receptor. Define the box EITHER with explicit `center=\"x,y,z\"` coordinates OR with `ligand_molnum` (1-based molecule number of a co-crystallized ligand already in the receptor file). This is the step `glide_dock` needs.\n- `glide_dock(grid_file, ligands_mae, precision=\"SP\", timeout_s=3600)` - Glide docking of prepared ligands into a grid `.zip` (from `glide_grid`). `precision` must be `HTVS`, `SP`, or `XP`. Writes a `glide_dock_job.in` and returns the `*_pv.maegz` pose-viewer path.\n- `prime_mmgbsa(pose_viewer, timeout_s=3600)` - Prime MM-GBSA binding free-energy (dG bind) rescoring of docked poses; input is the `*_pv.maegz` from `glide_dock`. Returns the `-out.csv` (with `r_psp_MMGBSA_dG_Bind`) + `-out.maegz`. Far more reliable than the raw Glide score.\n- `qikprop_admet(structure_file, timeout_s=900)` - QikProp ADMET\u002Fphyschem prediction on a 3D structure (`.mae`\u002F`.sdf`). Returns the result `.CSV` path + first 3 lines.\n\n### Expanded workflow surface\n\n- **Diagnostics and structure I\u002FO (4):** `backend_doctor`,\n  `structure_properties_extract`, `pdb_fetch`, `install_cure`.\n- **Prep, docking, and pose workflows (10):** `prep_target`, `ensemble_dock`,\n  `al_dock`, `dock_triage`, `induced_fit_docking`, `covalent_docking`,\n  `pose_validity`, `pose_interaction_fingerprint`, `pose_viewer_split`,\n  `pymol_render`.\n- **Screening, properties, and analogs (12):** `qikprop_parse_results`,\n  `sitemap`, `confgen`, `shape_screen`, `canvas_fingerprints`,\n  `canvas_descriptors`, `phase_pharmacophore`, `phase_screen`, `ligfilter`,\n  `propfilter`, `analog_scan`, `reaction_enumerate`.\n- **MD and free energy (14):** `desmond_setup`, `desmond_md`,\n  `desmond_trajectory_analysis`, `desmond_interactions`,\n  `desmond_membrane_setup`, `thermal_mmgbsa`, `fep_plus`, `fep_map_build`,\n  `fep_parse_results`, `fep_absolute_binding`, `watermap`, `bpmd`,\n  `bpmd_ladder`, `openmm_from_prepared`.\n- **QM, advanced modeling, and ML (10):** `jaguar_pka`, `jaguar_qm`,\n  `epik_enumerate`, `epik_pka`, `qm_cluster_extract`,\n  `macromodel_confsearch`, `residue_scanning`, `qsite_qmmm`,\n  `autoqsar_build`, `autoqsar_predict`.\n- **Job and GPU operations (5):** `job_server_control`, `job_status`, `job_wait`,\n  `job_restart`, `schrodinger_gpu_pool`.\n\n## Typical Workflow (end-to-end structure-based screening)\n\n1. `backend_info` \u002F `schrodinger_version` - confirm the suite and `SCHRODINGER` resolve.\n2. Receptor side - `prepwizard(\"receptor.pdb\", \"receptor_prep.mae\")` then `glide_grid(\"receptor_prep.mae\", \"grid.zip\", center=\"x,y,z\")`.\n3. Ligand side - either `smiles_to_3d(smiles, \"lig.mae\")` then `ligprep(\"lig.mae\", \"lig_prepped.mae\")`, OR feed SMILES straight to `ligprep(\"lig.smi\", \"lig_prepped.mae\")`.\n4. Dock - `glide_dock(\"grid.zip\", \"lig_prepped.mae\", \"SP\")` -> `*_pv.maegz`.\n5. Rescore + triage - `prime_mmgbsa(\"..._pv.maegz\")` for dG bind; `qikprop_admet(\"lig_prepped.mae\")` and\u002For `molecule_properties(smiles)` for ADMET\u002Fdescriptors.\n6. Convert poses\u002Fstructures as needed - `convert_structure(\"out.maegz\", \"out.sdf\")`.\n\nThe `structure-based-screening` skill spells out this full pipeline with the centroid trick and license-token notes.\n\n## Full pipeline is now in-server (receptor prep -> grid -> dock -> rescore)\n\nAs of the `prepwizard` \u002F `glide_grid` \u002F `prime_mmgbsa` addition, the whole structure-based chain is callable from this MCP - no Maestro GUI step required:\n\n1. `prepwizard(\"raw_receptor.pdb\", \"receptor_prep.mae\")` - clean\u002Fprotonate the receptor.\n2. `glide_grid(\"receptor_prep.mae\", \"grid.zip\", center=\"x,y,z\")` - build the docking box. Center it on explicit coordinates, or on a co-crystallized ligand via `ligand_molnum`. To derive a centroid from a co-crystal ligand, use `run_schrodinger_python` to average that ligand's atom coordinates.\n3. `glide_dock(\"grid.zip\", \"lig_prepped.mae\", \"SP\")` - dock.\n4. `prime_mmgbsa(\"..._pv.maegz\")` - rescore with binding free energy.\n\n`glide_dock` still requires a grid `.zip` - but `glide_grid` now produces it, so a true `receptor.pdb + SMILES -> docked, rescored pose` flow is possible end-to-end. The grid box still needs a sensible center (the binding site); surface that choice to the user rather than guessing blindly.\n\n## Multi-GPU pool on a cloud box (Linux) - and the BPMD\u002FJobDJ \"No job found\" download gotcha\n\nOn a multi-GPU Linux box (e.g. a 4xH100 node) a SINGLE shared `jobserverd` strips `CUDA_VISIBLE_DEVICES` from its subjobs, so every job piles onto GPU 0. The working pattern (see `schrod-gpu-pool.sh`, toolchain PR #79) is one CVD-pinned `jobserverd` per GPU, with each launch routed to its GPU's server via `jsc local-server-dir --set \u003Cpool>\u002Fjs_gpu\u003Cg>` at submit time. FEP+ is the exception - it self-parallelizes, so use `multisim -maxjob N` instead of the pool.\n\n- GOTCHA (cost real re-runs): a driver that ends with a JobDJ `jsc download` - BPMD (`binding_pose_metadynamics.py`), and any `-WAIT` driver that downloads its own results - FAILS the download step when the pool restores the default jobserver after launch. The compute RAN fine on the pinned GPU, but the driver's final `jsc download \u003Cjobid>` queries the RESTORED default server, which has no record of the job -> `No job found for JobId`. This is a silent partial failure: GPU work done, results never collected.\n- FIX (validated): give each concurrent driver its OWN isolated `HOME` (e.g. `export HOME=\u002Froot\u002Fbpmd_iso_\u003Cligand>`) BEFORE routing. Then inside that HOME: `jsc local-server-dir --set \u003Cpool>\u002Fjs_gpu\u003Cg>`, `export CUDA_VISIBLE_DEVICES=\u003Cg>`, and run the driver `-HOST localhost -SUBHOST localhost:1 -WAIT`. The isolated HOME pins the driver's `~\u002F.schrodinger` jobserver config for its WHOLE lifecycle, so submit AND the final JobDJ download resolve against the SAME per-driver server. Shared-HOME pool BPMD failed every download; isolated-HOME BPMD produced `-out.maegz` + CompScore cleanly.\n- Extract BPMD scores from the driver's real output: `proplister -c bpmd_\u003CL>-out.maegz` (CompScore\u002FPoseScore properties) - do NOT `head` the per-frame `-out.csv`, which is trajectory data, not the summary.\n\n## Common Mistakes\n\n- Treating `smiles_to_3d` as a required step before `ligprep` - LigPrep accepts SMILES (`.smi`) directly.\n- Calling `glide_dock` without first running `glide_grid` (it needs the grid `.zip`); or calling `glide_grid` with no box center (pass `center=\"x,y,z\"` or `ligand_molnum`).\n- Running `prepwizard` and expecting the top-level driver - it lives in `$SCHRODINGER\u002Futilities` (the server resolves it; a hand-rolled call to `$SCHRODINGER\u002Fprepwizard` will miss).\n- Forgetting that product drivers consume license tokens, often with long default timeouts. Concurrent driver calls compete for tokens.\n- Passing flag-like or relative paths and assuming they pass `_safe_path` - they are normalized to absolute and rejected if they start with `-`.\n- Expecting `convert_structure`\u002F`smiles_to_3d` (.mae path) to work if the suite cannot import `schrodinger.adapter`\u002F`schrodinger.structure` - those run inside the suite interpreter via `_sch_helper.py`.\n\n## Related Skills\n\n- [[structure-based-screening]] - the end-to-end receptor-prep -> grid -> dock -> MM-GBSA pipeline that chains these tools, with the centroid trick and license-token notes.\n- `mechanistic-ddi-pipeline` - combine this server's structure tools with ToolUniverse CYP\u002FDDI knowledge for a DDI verdict.\n- `cheminformatics-rdkit` - standalone RDKit MCP for descriptors\u002Ffingerprints\u002Fsimilarity\u002Fscaffolds (no Schrodinger license needed).\n",{"name":5,"description":7},"main","a298c929b6cbd662e1fce54302ce520d5ceea1a5","skills\u002Fschrodinger-maestro-driver","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill schrodinger-maestro-driver",{"tool":61,"command":62},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill schrodinger-maestro-driver",{"tool":64,"command":65},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill schrodinger-maestro-driver","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Fskills\u002Fschrodinger-maestro-driver\u002FSKILL.md",true,[],[70,91,114,141,155,171],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":44},"01M6DF7D7478R55P46REYH4QAC","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.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fworkspace-hooks\u002Fskills\u002Fclarify-requirements\u002FSKILL.md",[],[77,78,79,80,81,82,83,84,85,25,86,87,88,89,90],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","context","repo","injection","execution","file",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":98,"publishedAt":44},"01M6DF79CA4BHJS66J8EZDBPWJ","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 \u002F 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.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fmcp\u002Fopenmm-md-mcp\u002Fskill\u002Fopenmm-md\u002FSKILL.md",[97],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[99,100,101,102,103,104,105,106,107,108,109,41,110,111,25,27,112,30,113,34],"openmm md","how","decision","pick","linux","analyze","tool","stack","open","NVIDIA","gpu","workflow","windows","molecular dynamics","do",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":126,"publishedAt":44},"01M6DF76C1MG85VEWP8VZCBNMN","visual-review","Take screenshots of web pages and UI using Playwright for visual review and iteration","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fvisual-review\u002FSKILL.md",[120,123],{"categoryNo":121,"categoryName":122,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":124,"categoryName":125,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[127,128,129,130,131,132,133,134,135,136,100,137,138,139,140],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","playwright","screenshots",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":44},"01M6DF73AQVCBZKEN0YXEX9FXP","status","Diagnostic status report — shows metaswarm installation state, project setup, and potential issues","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstatus\u002FSKILL.md",[],[143,148,149,150,151,152,153,154],"setup","report","project","installation","project setup","issues","state",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":162,"publishedAt":44},"01M6DF6X6C2XB0P6GX76P7TTYV","start","Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstart\u002FSKILL.md",[161],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[157,163,82,164,165,166,25,167,168,169,170],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":172,"name":148,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":44},"01M6DF6QMJ9AJKFKHHKRT005PQ","Interactive project setup — detects your project, configures metaswarm, writes project-local files","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fsetup\u002FSKILL.md",[],[148,150,30,177,152,178],"files","interactive"]