fairchem-mcp
An interactive MCP server for FAIRChem and ASE simulations that allows LLM agents to load a model once and steer relaxations, MD, NEB, phonons, and minima searches mid-flight, with live monitoring and code introspection.
README
fairchem-mcp
An agent-steerable MCP server for FAIRChem and ASE simulations.
Most LLM-driven simulation today is batch: the agent writes a script, runs it,
waits, and reads the output. fairchem-mcp makes it interactive. The model is
loaded once and kept resident; relaxations and MD run in the background; and the
agent can watch a simulation as it runs and steer it mid-flight — switch the
optimizer when it stalls, tighten fmax, change temperature, pause, or abort.
Why
- Resident model. Load a UMA/eSEN model once; reuse it across every call. No reloading the model (seconds–minutes) on each run.
- Live monitoring.
get_statusreturns step, energy, max force, and atrendverdict (decreasing/plateaued/stuck/diverging) so the agent can decide whether to intervene. - Mid-flight steering.
steercanpause/resume/abort,set_fmax,switch_optimizer, orset_temperatureon a running job. Switching optimizer carries the atomic positions over — it just rebuilds the driver. - Hybrid namespace. High-level tools (
start_relaxation, …) and theexecute/inspect_exprescape hatch share one Python namespace, so the agent can drop to raw Python on the very same liveAtoms. - Code awareness.
introspectreads the installed API (real signatures and docstrings) and live objects viajedi— not possibly-stale docs.
Install
pip install -e . # core: mcp + ase + jedi + numpy (works with EMT)
pip install -e ".[fairchem]" # add FAIRChem (torch + models) for UMA/eSEN
pip install -e ".[lammps]" # add LAMMPS as a classical force engine
pip install -e ".[saddles]" # add Sella + POUNCE for transition-state searches
ASE, numpy, jedi and mcp are core dependencies (installed automatically) — the server is fully usable out of the box with the built-in EMT calculator.
FAIRChem (optional)
pip install -e ".[fairchem]" pulls in fairchem-core (PyTorch + models). To
actually load a UMA model you also need:
- a Hugging Face account with approved access to the
facebook/UMAmodel repository, andhuggingface-cli login(orHF_TOKEN) set; - PyTorch for your platform (CUDA build for GPU; CPU works but is slower).
Everything except load_model works with a plain ASE calculator (attach_emt),
so you can develop and test without a GPU or model.
LAMMPS (optional)
pip install -e ".[lammps]" installs the lammps Python package. LAMMPS is used
as a force engine (classical potentials) while ASE drives the dynamics, so
attach_lammps works with every steerable job (MD, relaxation, NEB, phonons,
EOS, minima search).
macOS note (Homebrew MPICH): the PyPI lammps wheel links
@rpath/libmpi.12.dylib and libpmpi.12.dylib, which the dynamic loader can't
find by default. If you have Homebrew's mpich (brew install mpich),
attach_lammps auto-symlinks those libs into the lammps package directory
on first use. If that can't be applied (read-only install, non-Homebrew MPI),
either symlink them yourself or export before launching the server:
export DYLD_FALLBACK_LIBRARY_PATH=/opt/homebrew/lib:$DYLD_FALLBACK_LIBRARY_PATH
Verify with: python -c "from lammps import lammps; lammps(cmdargs=['-log','none','-screen','none']).close(); print('ok')".
Transition-state searches (optional)
pip install -e ".[saddles]" adds two extra saddle-point backends:
sella (a rational-function ASE optimizer)
and pounce-solver (multistart
eigenvector following). The dimer method (start_saddle_search) is pure ASE
and needs neither. See examples/saddles/ for all three.
Register with Claude Code
Add to your MCP config (see examples/claude_mcp_config.json):
{
"mcpServers": {
"fairchem": { "command": "fairchem-mcp" }
}
}
Tools
| Tool | Purpose |
|---|---|
list_models |
List FAIRChem pretrained models |
load_model |
Load a UMA/eSEN model as a resident calculator |
attach_emt |
Attach a fast EMT calculator (no GPU/model) |
attach_lammps |
Attach LAMMPS (classical potentials) as the force engine |
build_structure / load_structure |
Make/register an ASE structure |
start_relaxation / start_md |
Launch a background relaxation / MD (returns a job_id) |
start_neb |
Launch a steerable nudged-elastic-band (reaction barrier) |
start_saddle_search |
Transition state via the dimer method (Hessian-free) |
start_sella_search |
Transition state via Sella (RFO + approximate Hessian) |
start_pounce_saddles |
Enumerate saddles by Morse index (POUNCE eigenvector following) |
start_phonons |
Launch a finite-displacement phonon calculation |
start_eos_scan |
Scan cell strain → fit equation of state (V0, E0, bulk modulus) |
start_minima_search |
Find multiple distinct relaxed geometries via deflation/flooding |
get_status / get_trajectory |
Observe a running job |
get_results |
Final results: NEB barrier/energies, phonon frequencies & stability, distinct minima, EOS fit |
steer |
pause/resume/abort/set_fmax/switch_optimizer/set_temperature/set_climb |
introspect |
Signatures/docstrings/members of installed code or live objects |
execute / inspect_expr |
Run/eval Python in the shared session namespace |
Resources: sim://models, sim://job/{id}/status, sim://job/{id}/trajectory.
Example flow
attach_emt() -> calc_1
build_structure({"kind":"bulk","name":"Cu","crystalstructure":"fcc",
"a":3.6,"repeat":[2,2,2],"rattle":0.2}) -> struct_1
start_relaxation("struct_1","calc_1",optimizer="FIRE",fmax=0.01) -> job_1
get_status("job_1") -> {status:"running", trend:{label:"stuck", ...}}
steer("job_1","switch_optimizer",optimizer="LBFGS")
get_status("job_1") -> {status:"converged", ...}
introspect("atoms", live=True) -> live object signature/docstring
Finding multiple relaxed geometries
start_minima_search finds several distinct local minima of the PES — useful
for surface adsorption sites, cluster isomers, or conformers. It relaxes
repeatedly from the starting structure on a PES biased to repel the minima
already found, then polishes each escape on the true PES:
kernel="flooding"(default) adds Gaussian bumps (sigmaÅ,amplitudeeV);kernel="deflation"adds inverse-distance poles (eta,power). Both are best for fixed-frame problems (an adsorbate on a frozen slab, an anchored conformer).kernel="basinhopping"(random kick + relax + Metropolis accept) is the right tool for free clusters / nanoparticles, whose rigid-body rotation defeats a spatial bias. Pair it withcomparator="fingerprint"(see below).- New minima are deduplicated by energy (
energy_tol) plus a structurecomparator:"rmsd"(raw coords, frame-dependent — fine for a fixed frame) or"fingerprint"(sorted pairwise distances; rotation/translation/permutation invariant — use for free clusters and molecules, or rotated copies get miscounted as distinct). Each accepted minimum is registered as its own structure.
This reuses the escape mechanism from POUNCE's find_minima (deflation /
flooding) but drives it with ASE's gradient optimizers — the right inner solver
for a PES — so each escape relaxation is a normal steerable job (watch the trend,
switch_optimizer, set_fmax, pause/abort). POUNCE's interior-point solver is
deliberately not used as the inner relaxer.
Examples
examples/catalysis/ has four end-to-end catalysis
workflows — adsorption energy, adsorption-site search, diffusion-barrier NEB, and
surface-stability phonons — each as a runnable script and an MCP tool-call
walkthrough. They run on EMT out of the box; set FAIRCHEM_MCP_EXAMPLE_MODEL for
UMA.
examples/saddles/ covers the three single-ended
transition-state routes — dimer, Sella, and POUNCE eigenvector following — on one
shared system so you can compare them.
Safety
execute / inspect_expr run arbitrary Python in-process. This is a trusted
local developer tool — do not expose it to untrusted input or over a network.
Notes
- Only one job runs at a time (serializes model/GPU access).
- All optimizers/integrators use
logfile=None; the stdio transport reserves stdout for the MCP protocol.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.