Skip to main content
Glama

schrodinger-mcp

An MCP server that exposes Schrödinger Suites computational-chemistry / drug-discovery workflows to any MCP-capable coding agent — Claude Code, Claude Desktop, Cursor, GitHub Copilot, OpenCode, Cline, Windsurf, Zed, and more. Ask your agent to fetch a PDB, prep a protein and ligands, build a Glide grid, dock, score, run ADMET, MM-GBSA, QM, or draw a 2D interaction diagram — it drives Schrödinger for you and hands back ranked tables plus files you can open in Maestro.

How it works

The server runs in its own virtualenv (any Python ≥3.10) and shells out to $SCHRODINGER/run for all chemistry. Its MCP dependencies therefore stay independent of Schrödinger's bundled Python 3.11. Fast operations return inline; long jobs run under a detached supervisor that survives server restarts, and you poll them with get_job_status / get_job_results.

MCP client ──tool call──▶ schrodinger-mcp (venv, FastMCP, stdio)
                            │  fast ops ─▶ $SCHRODINGER/run python3 <worker>  ─▶ JSON
                            └  long jobs ─▶ detached supervisor ─▶ $SCHRODINGER/<launcher> -WAIT
                                             └─ status.json (authoritative) ◀─ poll

Outputs are written under ~/.local/share/schrodinger-mcp/ (override with SCHRODINGER_MCP_HOME) and every tool also returns a structured summary.

Related MCP server: PLUMED2 MCP Server

Requirements

  • macOS, Linux, or Windows with Schrödinger Suites installed and licensed. Any recent release works — the server auto-detects the newest installed version (globbing /opt/schrodinger/suites* or C:\Program Files\Schrodinger*) and reports it via detect_installation. Set SCHRODINGER to pin a specific release.

  • uv (recommended) or pip.

Version support: developed and validated against Suites 2026-1, but the server is version-agnostic — it discovers whatever release is installed and calls stable CLI/Python interfaces (with fallbacks for API calls that moved between releases). Tool flags target modern releases; on much older versions a flag may occasionally need a tweak.

This project contains no Schrödinger software or data. You must supply your own licensed installation of Schrödinger Suites; this server only invokes it through its documented $SCHRODINGER/run / CLI interfaces.

GPU note: Desmond molecular dynamics and FEP+ require an NVIDIA/CUDA GPU and are intentionally not exposed — they are not practical on Apple Silicon / non-NVIDIA hosts.

Install

macOS / Linux

cd schrodinger-mcp
uv venv --python 3.12 .venv
source .venv/bin/activate
uv pip install -e ".[dev]"

Windows (PowerShell)

cd schrodinger-mcp
uv venv --python 3.12 .venv
.venv\Scripts\activate
uv pip install -e ".[dev]"

The install root is auto-detected per platform (/opt/schrodinger/suites* on macOS/Linux, C:\Program Files\Schrodinger* on Windows). Set SCHRODINGER to override.

Sanity check:

python -c "from schrodinger_mcp.tools.foundation import detect_installation as d; print(d()['version'])"

Connect a coding agent

This is a standard stdio MCP server, so any MCP-capable client works. In every case you point the client at the console script and set the SCHRODINGER env var. Use the absolute path to the installed command:

Platform

Server command (<CMD> below)

macOS / Linux

/Users/mac/schrodinger mcp/.venv/bin/schrodinger-mcp

Windows

C:\path\to\schrodinger-mcp\.venv\Scripts\schrodinger-mcp.exe

And <ROOT> = your install root (/opt/schrodinger/suites2026-1, or C:\Program Files\Schrodinger2026-1). After configuring, restart the client; the schrodinger tools and the schrodinger://installation resource appear.

Claude Code

claude mcp add schrodinger --env SCHRODINGER=<ROOT> -- "<CMD>"

Cursor · Claude Desktop · Cline · Windsurf (shared mcpServers format)

These four use the same JSON shape — just a different file:

Client

Config file

Cursor

~/.cursor/mcp.json (global) or .cursor/mcp.json (per project)

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json (macOS) · %APPDATA%\Claude\claude_desktop_config.json (Windows)

Cline (VS Code)

the “Configure MCP Servers” panel → cline_mcp_settings.json

Windsurf

~/.codeium/windsurf/mcp_config.json

{
  "mcpServers": {
    "schrodinger": {
      "command": "<CMD>",
      "args": [],
      "env": { "SCHRODINGER": "<ROOT>" }
    }
  }
}

GitHub Copilot (VS Code agent mode)

Create .vscode/mcp.json in the workspace (or run “MCP: Add Server” from the Command Palette), then enable it in the Copilot Chat Agent mode tool picker:

{
  "servers": {
    "schrodinger": {
      "type": "stdio",
      "command": "<CMD>",
      "args": [],
      "env": { "SCHRODINGER": "<ROOT>" }
    }
  }
}

OpenCode

Add to opencode.json (project root) or ~/.config/opencode/opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "schrodinger": {
      "type": "local",
      "command": ["<CMD>"],
      "environment": { "SCHRODINGER": "<ROOT>" },
      "enabled": true
    }
  }
}

Zed

In settings.json (context_servers):

{
  "context_servers": {
    "schrodinger": {
      "command": { "path": "<CMD>", "args": [], "env": { "SCHRODINGER": "<ROOT>" } },
      "settings": {}
    }
  }
}

Any other MCP client

Transport stdio, command <CMD>, one environment variable SCHRODINGER=<ROOT>. That's all the server needs. (On Windows use doubled backslashes inside JSON strings.)

Inline images: the 2D-structure and interaction-diagram tools return MCP image content. Claude clients render it inline; other agents may show it as an attachment or just return the result — either way the PNG is always written to disk and its path is returned, so nothing is lost.

Tools

Foundation (synchronous)

Tool

What it does

detect_installation

Report root, version, installed workflows, hosts, GPU

fetch_pdb

Download a structure from RCSB by 4-char PDB ID

convert_structure

Convert between mae/maegz/sdf/pdb/mol2/smi/cif

structure_info

Counts, titles, charges, MW, chains, properties

smiles_to_3d

Quick single-conformer 3D from SMILES

split_structures / merge_structures

Split a multi-structure file / concatenate

Preparation (async) — ligprep, protein_prepwizard, epik, confgen

Glide docking — generate_glide_grid, glide_dock (SP/XP), summarize_docking (sync)

ADMET & site analysis — qikprop, compute_descriptors (sync), sitemap, shape_screen

QM & MM-GBSA — prime_mmgbsa, jaguar_qm

Visualization (sync) — render_2d_structure (2D depiction PNG), analyze_interactions (H-bonds / salt bridges / π-π / π-cation report), ligand_interaction_diagram (2D interaction map PNG with residues labelled), render_3d_view (self-contained interactive 3D viewer HTML — rotate/zoom/share a protein-ligand pose with H-bonds drawn, no Maestro needed), generate_2d_report (PDF/HTML of structures with properties)

Async job control — get_job_status, get_job_results, cancel_job, list_jobs

Async tools return a job_id immediately. Poll get_job_status(job_id) until state == "completed", then get_job_results(job_id) for the output files.

Example: dock a ligand against a target

1. fetch_pdb("1HSG")                     → receptor.pdb
2. protein_prepwizard(receptor.pdb)      → job → prepared.maegz
3. ligprep("CC(=O)Oc1ccccc1C(=O)O")      → job → ligprep_out.maegz
4. generate_glide_grid(prepared, center=[x,y,z] or ligand_ref=...) → job → grid.zip
5. glide_dock(grid.zip, ligprep_out, precision="SP")  → job → dock_pv.maegz
6. summarize_docking(dock_pv.maegz)      → ranked GlideScore table

Testing

pytest tests/test_unit.py -q            # fast unit tests, no Schrödinger needed
python tests/manual_docking_e2e.py      # real end-to-end docking (bundled fixture, ~3 min)
python tests/manual_wave5.py            # qikprop / MM-GBSA / sitemap / shape / jaguar

Inspect the live MCP server with the official inspector:

npx @modelcontextprotocol/inspector "/Users/mac/schrodinger mcp/.venv/bin/schrodinger-mcp"

Configuration

Env var

Default

Purpose

SCHRODINGER

autodetect

Install root

SCHRODINGER_MCP_HOME

~/.local/share/schrodinger-mcp

Job dirs, scratch, registry

SCHRODINGER_MCP_MAX_JOBS

2

Concurrent heavy-job advisory limit

SCHRODINGER_MCP_SYNC_TIMEOUT

120

Seconds before a sync op suggests going async

Disclaimer & trademarks

This is an independent, unofficial project. It includes no Schrödinger software, source, or data, and requires a separately licensed Schrödinger Suites installation.

Schrödinger, Maestro, Glide, Desmond, Jaguar, Prime, QikProp, Epik, Phase, Canvas, and SiteMap are trademarks of Schrödinger, LLC. This project is not affiliated with, endorsed by, or sponsored by Schrödinger, LLC; product names are used only to describe interoperability. Use of Schrödinger software is governed by your own license agreement with Schrödinger — consult it before publishing benchmarks or results.

License

MIT © 2026. Your use of the underlying Schrödinger Suites remains subject to your Schrödinger license.

Available Tools

28 tools
analyze_interactionsA

Analyze protein-ligand interactions (hydrogen bonds, salt bridges, pi-pi stacking, pi-cation) in a complex or Glide pose-viewer (*_pv.maegz) file. For a pose-viewer the first entry is the receptor and ligand_index (default 2) selects the pose; for a single complex give a ligand_asl. Returns a structured interaction report.

Inputs: input_path (required), ligand_asl, ligand_index.

cancel_jobB

Stop a running job. Terminates the job's process group; the job directory and any partial outputs are left in place.

Inputs: job_id (required).

compute_descriptorsA

Compute 2D physicochemical molecular descriptors (MW, logP, TPSA, H-bond donors/acceptors, rotatable bonds, ring counts, etc.) with Canvas. Synchronous — returns the path to a CSV of descriptors, one row per molecule.

Inputs: input_path (required), output_path.

confgenA

Generate a conformer ensemble for ligands with ConfGen. Input must contain explicit hydrogens (run ligprep first). Accepts .mae/.maegz/.mol2/.sdf. Long-running — returns a job_id; conformers are written to -out.maegz in the job directory.

Inputs: input_path (required), max_conformers, optimize, jobname.

convert_structureA

Convert a structure file between formats (mae, maegz, sdf, pdb, mol2, smi, cif). Schrödinger infers the input format from its extension. Returns the output path.

Inputs: input_path (required), output_format (required), output_path.

detect_installationA

Report the Schrödinger installation: root path, release/build, licensed products, configured job hosts, and GPU availability. Call this first to confirm the suite is found and to see which workflows are licensed. GPU-accelerated workflows (Desmond MD, FEP+) require an NVIDIA GPU and are unavailable on Apple Silicon.

Inputs: no named parameters.

epikB

Enumerate protonation/tautomeric states and estimate pKa for ligands with Epik. Accepts a structure file (.mae/.maegz/.sdf — non-Maestro inputs are auto-converted). Long-running — returns a job_id; states with pKa/penalty properties in <output_name>.

Inputs: input_path (required), ph, ph_tolerance, max_states, +1 more.

fetch_pdbA

Download an experimental structure from the RCSB PDB by its 4-character ID (e.g. '1HSG'). Returns the path to the downloaded .pdb file. Use protein_prepwizard afterward to prepare it for docking.

Inputs: pdb_id (required), output_dir.

generate_2d_reportA

Build a 2D structure report (PDF or HTML) of every structure in a file, each drawn in 2D and labeled with properties (e.g. docking scores from a pose-viewer). Great for sharing docking/screening results. properties is 'all' or a comma-separated list of property names. Returns the path to the report.

Inputs: input_path (required), properties, output_format, output_path.

generate_glide_gridA

Build a Glide docking grid from a prepared receptor. Specify the binding-site center either explicitly via center [x,y,z] or by giving ligand_ref (a file containing a bound ligand whose centroid defines the site). Long-running — returns a job_id; the grid (<grid_name>) lands in the job dir and is the input to glide_dock.

Inputs: receptor_path (required), center, ligand_ref, inner_box, +2 more.

get_job_resultsA

Fetch a finished job's outputs: the list of produced files (poses, prepped structures, logs) and its final state. For docking jobs, follow up with summarize_docking on the produced pose-viewer (*_pv.maegz) file for a ranked table.

Inputs: job_id (required).

get_job_statusA

Check a submitted job. Returns state (submitted/running/completed/failed/ canceled), elapsed time, exit code, and a tail of the job log. Poll this after submitting any long-running workflow.

Inputs: job_id (required).

glide_dockA

Dock prepared ligands into a Glide grid and score them. precision is 'SP' (standard, default) or 'XP' (extra-precision, slower). ligands_path should be a LigPrep-prepared file. Long-running — returns a job_id. When complete, run summarize_docking on the produced *_pv.maegz for a ranked GlideScore table.

Inputs: grid_path (required), ligands_path (required), precision, poses_per_ligand, +1 more.

jaguar_qmA

Run a Jaguar quantum-mechanics calculation on a small molecule. calculation is 'optimization', 'energy', or 'frequency'. Accepts a structure file (.mae/.pdb/.sdf) — a Jaguar input is built automatically — or a prebuilt Jaguar .in file. Long-running; returns a job_id. Keep systems small (a few dozen atoms) on CPU-only hardware.

Inputs: input_path (required), calculation, basis, functional, +2 more.

ligand_interaction_diagramA

Render a 2D ligand-interaction diagram (PNG, shown inline) for a protein-ligand complex or Glide pose-viewer file: the ligand drawn in 2D with the atoms that make interactions highlighted by type (blue=H-bond, red=salt bridge, green=pi-pi, orange=pi-cation) and a legend mapping them to protein residues. Also writes the PNG.

Inputs: input_path (required), ligand_asl, ligand_index, output_path.

ligprepA

Prepare ligands for docking: add hydrogens, generate ionization/tautomeric states (via Epik), enumerate stereoisomers, and produce optimized 3D structures. Accepts .smi/.csv/.sdf/.mae. Long-running — returns a job_id. Prepared ligands are written to <output_name> in the job directory (fetch the path with get_job_results).

Inputs: input_path (required), use_epik, ph, ph_tolerance, +2 more.

list_jobsA

List known async jobs, most recent first. Optionally filter by state (submitted/running/completed/failed/canceled).

Inputs: state.

merge_structuresC

Concatenate several structure files into one multi-structure file.

Inputs: input_paths (required), output_path (required).

prime_mmgbsaA

Rescore a receptor-ligand complex (or Glide pose-viewer file) with Prime MM-GBSA to estimate binding free energy (dG bind). Accepts a *_pv.maegz or a complex .mae. Long-running — returns a job_id; the output structures carry r_psp_MMGBSA_dG_Bind.

Inputs: input_path (required), ligand_asl, minimize.

protein_prepwizardA

Prepare a protein structure for docking with the Protein Preparation Wizard: assign bond orders, add/optimize hydrogens, set het-group protonation states (Epik), optionally fill missing side chains/loops (Prime), and restrained-minimize. Accepts .pdb/.mae/.cif. Long-running — returns a job_id; prepared structure is <output_name>.

Inputs: input_path (required), fill_sidechains, fill_loops, epik_ph, +2 more.

qikpropA

Predict ~50 ADMET properties (aqueous solubility, Caco-2/MDCK permeability, logP, logBB, CNS activity, HERG, etc.) for ligands with QikProp. Accepts most structure formats. Long-running — returns a job_id; results land as a .CSV plus structures annotated with QP* properties. Use structure_info on the output .mae to read them.

Inputs: input_path (required), fast, outname.

render_2d_structureB

Render molecules as a 2D structure image (PNG) shown inline. Provide either a list of smiles or an input_path to a structure file (mae/sdf/pdb/...). For files you can pass legend_property (e.g. 'r_i_docking_score') to label each structure with that value. Also writes the PNG to disk.

Inputs: smiles, input_path, legend_property, output_path, +1 more.

shape_screenA

Shape-based similarity screen: rank the 3D structures in screen_path by shape similarity to the query_path molecule. Both must be 3D structure files (prep ligands first). Long-running — returns a job_id; ranked hits with Shape_Sim scores are written to _align.maegz.

Inputs: query_path (required), screen_path (required), jobname, njobs.

sitemapA

Detect and score potential ligand-binding sites on a protein with SiteMap. Accepts a prepared protein structure (.mae). Long-running — returns a job_id; site maps and SiteScore/Dscore are written to _out.maegz and per-site files.

Inputs: input_path (required), num_sites, jobname.

smiles_to_3dA

Generate single-conformer 3D structures from a list of SMILES strings and write them to one file. Good for quick 3D embedding; for full ligand preparation (ionization, tautomers, stereoisomer enumeration) use the ligprep tool instead. Returns per-molecule results and the output path.

Inputs: smiles (required), output_format, output_path, titles, +1 more.

split_structuresB

Split a multi-structure file into one file per structure. Returns the list of written files with their titles.

Inputs: input_path (required), output_dir, output_format.

structure_infoA

Inspect a structure file: number of structures, per-structure atom/bond counts, title, formal charge, molecular weight, chains/residues, and a sample of named properties (e.g. docking scores). Works on any format Schrödinger reads.

Inputs: input_path (required), max_structures.

summarize_dockingA

Parse a Glide pose-viewer file (*_pv.maegz) into a ranked table of GlideScores and key terms per ligand. Returns the best poses sorted by score (lower is better).

Inputs: pose_file (required), top_n.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 28 tools

    Disambiguation4/5

    Tools have largely distinct purposes, but some overlap exists between confgen and ligprep (both generate structures) and between render_2d_structure and generate_2d_report (both produce images). However, descriptions clearly differentiate them.

    Naming Consistency4/5

    Most tools follow a consistent verb_noun pattern (e.g., convert_structure, summarize_docking). A few deviate with product names (epik, jaguar_qm) or abbreviations (ligprep), but the overall pattern is maintained.

    Tool Count5/5

    28 tools cover the full computational chemistry workflow from structure retrieval to analysis, without being excessive. Each tool serves a specific and necessary function for molecular modeling tasks.

    Completeness5/5

    The tool set covers the complete docking workflow: PDB fetching, protein preparation, site detection, grid generation, ligand preparation, docking, scoring (MM-GBSA, QikProp), interaction analysis, and visualization. No obvious gaps.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Enables molecular design and simulation through 45 chemistry tools including pKa calculations, geometry optimization, conformer searches, docking, protein cofolding, and ADMET predictions powered by Rowan's computational chemistry platform.
      41
      24
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Integrates GROMACS molecular dynamics simulations with VMD visualization, enabling setup, execution, analysis, and 3D visualization of molecular dynamics workflows through natural language.
      24
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      MCP-native scientific skills for reproducible computational biology and AI-driven drug-discovery workflows. It combines deterministic scientific tools with an MCP server to give AI agents real computational capabilities.
      Apache 2.0