Rosetta Context

Diseño y modelado de proteínas Rosetta para agentes

Documentación

Rosetta MCP Server

Servidor MCP de Rosetta

Autor: Ariel J. Ben-Sasson

Un servidor de Protocolo de Contexto de Modelo (MCP) que permite a Cursor (o cualquier cliente MCP) trabajar con Rosetta, PyRosetta y Biotite: ejecutar RosettaScripts, validar protocolos XML, traducir entre Rosetta y Biotite, puntuar estructuras y consultar documentación, todo desde tu asistente de codificación con IA.

Novedades en v1.3.0 (vs v1.1.8 en npm)

Nuevo: Integración con Biotite

  • rosetta_to_biotite -- Encuentra el equivalente en Biotite de cualquier función de Rosetta con código de ejemplo funcional (21 mapeos que cubren E/S de estructuras, SASA, RMSD, superposición, estructura secundaria, contactos, enlaces de hidrógeno, factores B, ángulos y más)
  • biotite_to_rosetta -- Búsqueda inversa: encuentra el equivalente en Rosetta de una función de Biotite
  • translate_rosetta_script_to_biotite -- Traduce RosettaScripts XML completos o código PyRosetta a Python de Biotite. Las operaciones de diseño/optimización se marcan como exclusivas de Rosetta.
  • Búsqueda difusa con alias de palabras clave ("contactos", "energía de unión", "área superficial", "alinear", etc.)

Mejorado: Traductor de XML a PyRosetta

  • 37 tipos de elementos compatibles (antes 6): 11 movers, 9 filtros, 10 selectores, 7 operaciones de tarea
  • Manejo completo de atributos: repeats, disable_design, cartesian, tolerance, threshold, distance y más
  • Soporte de elementos hijos: MoveMap (con Span), Reweight, ScoreFunction
  • Informa elementos no reconocidos para que sepas qué necesita trabajo manual

Mejorado: Ayuda y documentación

  • get_rosetta_help ahora acepta cualquier tema: movers por nombre ("FastRelax"), conceptos ("constraints", "docking") o funciones de puntuación ("ref2015") -- obtiene automáticamente documentación en vivo de rosettacommons.org
  • Respaldo de search_rosetta_web_docs: cuando DuckDuckGo está limitado por tasa, sondea URLs directas de documentación de Rosetta
  • get_cached_docs auto-cachea: no es necesario llamar a cache_cli_docs primero
  • Ayuda estática ampliada para score_functions, movers, filtros, xml y parámetros

Mejorado: Puntuación

  • pyrosetta_score: nueva opción per_residue devuelve desglose de energía por residuo
  • El parámetro scorefxn ahora funciona (se ignoraba en v1.1.8)
  • Mensajes de error adecuados para archivos faltantes en lugar de {} silencioso

Mejorado: Validación

  • validate_xml: nueva opción validate_against_schema verifica nombres de elementos contra el esquema XSD de Rosetta (detecta errores tipográficos como FastRleax)

Correcciones de cumplimiento de especificación MCP

  • Las respuestas de tools/call ahora usan el formato { content: [{ type: "text", text }] } correcto
  • Los errores de herramientas devuelven isError: true (no errores JSON-RPC)
  • Códigos de error JSON-RPC estándar (-32601, -32700, -32603)
  • Se eliminó la publicidad falsa de capacidad resources

Correcciones de seguridad

  • La entrada del usuario ya no se interpola en código Python (usa variables de entorno / stdin)
  • Los archivos temporales se escriben en os.tmpdir() (no en el directorio del módulo)

Limpieza

  • Se eliminaron 3 herramientas redundantes: list_functions (fusionada en get_rosetta_info), search_pyrosetta_wheels, cache_cli_docs (auto-cache en get_cached_docs)
  • Se eliminaron rutas personales codificadas
  • Se corrigieron variables sombreadas, anti-patrones asíncronos, código muerto
  • 18 herramientas (antes 21), todas con descripciones mejoradas orientadas a agentes

Ejemplo: hacer una pregunta ingenua

Esto es lo que hace poderoso al servidor MCP: un agente de IA puede responder preguntas de dominio llamando automáticamente a las herramientas correctas:

El usuario pregunta en Cursor: "¿Cómo relajo mi proteína y cuál es el equivalente en Biotite?"

El agente llama a dos herramientas MCP en segundo plano:

1. get_rosetta_help("FastRelax") devuelve más de 6000 caracteres de documentación en vivo:

FastRelax realiza relajación de todos los átomos usando el protocolo FastRelax. Los parámetros incluyen configuración de scorefxn, repeats, cartesian, disable_design, MoveMap...

2. rosetta_to_biotite("FastRelax") devuelve:

{
  "found": true,
  "results": [{
    "rosetta": { "name": "FastRelax", "example": ["relax = FastRelax()", "relax.set_scorefxn(get_score_function('ref2015'))", "relax.apply(pose)"] },
    "biotite": null,
    "equivalence": "none_from_biotite",
    "notes": "Biotite does NOT perform structure optimization. These are Rosetta-specific capabilities."
  }]
}

El agente sintetiza: "FastRelax es el protocolo de relajación de todos los átomos de Rosetta. Así es como se usa... Nota: Biotite es solo de análisis y no tiene equivalente -- necesitas PyRosetta para optimización de estructuras."

Sin el MCP, el agente adivinaría a partir de datos de entrenamiento y probablemente obtendría nombres de parámetros o firmas de API incorrectos.


Lo que obtienes (18 herramientas)

Descubrimiento y Ayuda

HerramientaDescripción
get_rosetta_infoTodas las funciones de puntuación, movers, filtros, selectores y parámetros disponibles
get_rosetta_helpAyuda para cualquier tema -- acepta nombres de movers, conceptos o funciones de puntuación
pyrosetta_introspectBúsqueda en vivo de API de PyRosetta con documentación y firmas

Documentación

HerramientaDescripción
search_rosetta_web_docsBuscar documentación en rosettacommons.org
get_rosetta_web_docObtener y leer una página específica de documentación
get_cached_docsBuscar ayuda de CLI en caché (auto-cachea en el primer uso)

Ejecución y Puntuación

HerramientaDescripción
run_rosetta_scriptsEjecutar un protocolo XML de RosettaScripts en un PDB
pyrosetta_scorePuntuar un PDB con desglose opcional por residuo

Traducción

HerramientaDescripción
xml_to_pyrosettaXML a Python de PyRosetta (37 tipos de elementos)
rosetta_to_biotiteEncontrar el equivalente en Biotite de una función de Rosetta
biotite_to_rosettaEncontrar el equivalente en Rosetta de una función de Biotite
translate_rosetta_script_to_biotiteTraducir scripts completos de Rosetta a Biotite

Validación y Esquema

HerramientaDescripción
validate_xmlVerificar sintaxis XML + validación de esquema opcional
rosetta_scripts_schemaGenerar esquema XSD y extraer nombres de elementos

Entorno

HerramientaDescripción
python_env_infoVersión de Python y paquetes instalados
check_pyrosettaVerificar que PyRosetta esté disponible
install_pyrosetta_installerAuto-instalar PyRosetta (10-30 min)
find_rosetta_scriptsLocalizar el binario rosetta_scripts

Inicio rápido

1. Instalar desde npm

npm install -g rosetta-mcp-server

2. Configurar el entorno de Python

# Create a venv with PyRosetta and Biotite
uv venv ~/.venvs/rosetta-mcp
~/.venvs/rosetta-mcp/bin/pip install pyrosetta-installer biotite
~/.venvs/rosetta-mcp/bin/python -c "import pyrosetta_installer as I; I.install_pyrosetta()"

O salta este paso -- PyRosetta se auto-instala en el primer uso (toma 10-30 min).

3. Configurar tu cliente MCP

Cursor (~/.cursor/mcp.json):

{
  "mcpServers": {
    "rosetta": {
      "command": "rosetta-mcp-server",
      "args": [],
      "env": {
        "ROSETTA_BIN": "/path/to/rosetta_scripts.default.macosclangrelease",
        "PYTHON_BIN": "/path/to/.venvs/rosetta-mcp/bin/python"
      }
    }
  }
}

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "rosetta": {
      "command": "rosetta-mcp-server",
      "env": {
        "ROSETTA_BIN": "/path/to/rosetta_scripts.default.macosclangrelease",
        "PYTHON_BIN": "/path/to/.venvs/rosetta-mcp/bin/python"
      }
    }
  }
}

Variables de entorno:

VariableRequeridaDescripción
ROSETTA_BINNoRuta al binario rosetta_scripts o su directorio. Si no se establece, busca en rutas comunes y PATH.
PYTHON_BINNoIntérprete de Python con PyRosetta/Biotite. Por defecto es python3.
MCP_DEBUGNoEstablecer a 1 para registro de depuración en stderr.

4. Reiniciar tu editor

Abre Configuración -> MCP. El servidor "rosetta" debería aparecer en verde con 18 herramientas.


Ejemplo de traducción de XML a PyRosetta

XML de entrada:

<ROSETTASCRIPTS>
  <SCOREFXNS>
    <ScoreFunction name="ref" weights="ref2015"/>
  </SCOREFXNS>
  <RESIDUE_SELECTORS>
    <Chain name="chainA" chains="A"/>
  </RESIDUE_SELECTORS>
  <MOVERS>
    <FastRelax name="relax" scorefxn="ref" repeats="5" cartesian="true"/>
  </MOVERS>
  <PROTOCOLS>
    <Add mover="relax"/>
  </PROTOCOLS>
</ROSETTASCRIPTS>

Código PyRosetta generado:

import pyrosetta
from pyrosetta import pose_from_pdb
from pyrosetta.rosetta.core.scoring import get_score_function
from pyrosetta.rosetta.core.select.residue_selector import *
from pyrosetta.rosetta.protocols.relax import *

pyrosetta.init("-mute all")

pose = pose_from_pdb("your_protein.pdb")

# Residue Selectors
chainSelector = ChainSelector()
chainSelector.set_chain_strings("A")

# Movers
fastRelax = FastRelax()
fastRelax.set_scorefxn(get_score_function("ref"))
fastRelax.set_default_repeats(5)
fastRelax.cartesian(True)

sfxn = get_score_function("ref2015")

# Apply movers
fastRelax.apply(pose)

pose.dump_pdb("output.pdb")
score = pose.energies().total_energy()
print(f"Final score: {score}")

Cobertura de mapeo Rosetta <-> Biotite

CategoríaRosettaBiotiteEquivalencia
E/S de Estructuraspose_from_pdbPDBFile.readCompleta
E/S de Estructuraspose.dump_pdbPDBFile.writeCompleta
E/S de Estructuraspose_from_file (CIF)CIFFile.readCompleta
Análisis de SuperficieSasaMetricbiotite.structure.sasaCompleta
AlineaciónSuperimposeMoverbiotite.structure.superimposeCompleta
RMSDall_atom_rmsdbiotite.structure.rmsdCompleta
Estructura SecundariaDsspMoverannotate_sseParcial
Secuenciapose.sequence()get_residuesCompleta
DistanciaAtomPairConstraintbiotite.structure.distanceCompleta
Ángulospose.phi/psi/omegabiotite.structure.dihedralCompleta
InterfazInterfaceAnalyzerMoversasa + selecciónParcial
Base de Datosrcsb.pose_from_rcsbrcsb.fetchCompleta
SelecciónChainSelector etc.indexación booleana numpyCompleta
Contactosmatrices de distanciaCellListParcial
Ramachandranpose.phi/psidihedral_backboneParcial
Enlaces HHBondSetbiotite.structure.hbondParcial
Factores Bpdb_info().bfactorAtomArray.b_factorCompleta
Centro de Masacenter_of_massmass_centerCompleta
PuntuaciónScoreFunctionNingunoSolo Rosetta
OptimizaciónFastRelaxNingunoSolo Rosetta
DiseñoFastDesignNingunoSolo Rosetta

Solución de problemas

  • El servidor aparece en rojo en Cursor: Reinicia Cursor. Usa ruta absoluta en la configuración (p. ej., /opt/homebrew/bin/rosetta-mcp-server). Asegúrate de tener Node 14+ y Python 3.8+.
  • run_rosetta_scripts falla: Verifica que ROSETTA_BIN apunte a un binario válido. Prueba "$ROSETTA_BIN" -help.
  • Las herramientas de PyRosetta dicen "no disponible": Instala vía pip install pyrosetta-installer y luego ejecuta el instalador, o deja que el servidor MCP auto-instale en el primer uso.
  • Las herramientas de Biotite no devuelven resultados: Instala Biotite en el mismo entorno de Python: pip install biotite
  • get_rosetta_help devuelve "No detailed help": Prueba con el nombre exacto de la clase de Rosetta (p. ej., "FastRelax" no "relax"). La herramienta resuelve alias comunes pero puede no detectar nombres inusuales.

Verificar desde la línea de comandos

# Check version
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05"}}' | rosetta-mcp-server 2>/dev/null | python3 -c "import sys,json; print(json.loads(sys.stdin.readline())['result']['serverInfo'])"

# List all tools
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | rosetta-mcp-server 2>/dev/null | python3 -c "import sys,json; [print(t['name']) for t in json.loads(sys.stdin.readline())['result']['tools']]"

Desarrollo

rosetta-mcp-server/
├── rosetta_mcp_wrapper.js   # Node MCP server (protocol + all 18 tools)
├── rosetta_mcp_server.py    # Python helper (static Rosetta data)
├── install_pyrosetta.js     # Standalone PyRosetta installer
├── package.json             # npm package config
└── README.md