Pybullet MCP Server
Un servidor mcp para la librería pybullet, soporta 20 herramientas (ej: creación de simulaciones, pasos, carga de robots urdf, etc.)
Documentación
Servidor MCP de PyBullet
Un servidor de Protocolo de Contexto de Modelo (MCP) que permite a los asistentes de IA interactuar con simulaciones de física de PyBullet. Crea proyectos basados en física mediante interacciones en lenguaje natural con agentes de IA.
Características
- 37 Herramientas MCP: API integral para el control de simulaciones de física, incluido el control de articulaciones de robots
- Gestión de Simulaciones: Crea y gestiona múltiples simulaciones de física independientes con gravedad configurable
- Manipulación de Objetos: Añade formas primitivas (caja, esfera, cilindro, cápsula) y modelos URDF con control completo de propiedades
- Control de Robots: Consulta información de articulaciones, controla motores (posición/velocidad/torque) y calcula cinemática inversa
- Control de Física: Aplica fuerzas, torques y avanza en las simulaciones con pasos de tiempo configurables
- Persistencia de Estado: Guarda y carga estados completos de simulación desde/hacia archivos JSON
- Restricciones: Crea articulaciones entre objetos (fijas, prismáticas, esféricas)
- Detección de Colisiones: Consulta puntos de contacto con información detallada de colisiones
- Visualización: Modo GUI opcional con visualización de depuración y control de cámara
- Manejo de Errores: Validación integral con mensajes de error descriptivos
Notas Importantes
- Requisitos de Coordenadas: Todos los vectores deben proporcionarse como coordenadas 3D completas [x, y, z]
- Gravedad:
[0, 0, -9.81](no[-9.81]) - Posiciones:
[x, y, z](no[x, y]ni[x]) - Fuerzas/Torques:
[fx, fy, fz](no[fx]) - Orientaciones:
[x, y, z, w]cuaternión (no[w])
- Gravedad:
- Restricción de Masa: La masa del objeto debe ser positiva (masa > 0). Usa masa grande (ej., 1000) para objetos estáticos
- Limitación de GUI: Solo una simulación GUI puede estar activa a la vez (limitación de PyBullet)
- Rutas URDF: Usa rutas absolutas o rutas relativas al directorio de trabajo del servidor
- Articulaciones Revolutas:
create_constraintno admite"revolute"— usagenerate_revolute_joint+load_urdfen su lugar. Siempre pasa unoutput_pathexplícito dentro del espacio de trabajo agenerate_revolute_joint, de lo contrario el URDF generado termina en/tmp/yload_urdflo rechazará.
Instalación
Requisitos Previos
- Python 3.9 o superior
- Gestor de paquetes pip
- Entorno virtual (recomendado)
Instalar Dependencias
- Crea y activa un entorno virtual:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
- Instala FastMCP y PyBullet:
pip install fastmcp pybullet
- Para desarrollo (incluye herramientas de prueba):
pip install fastmcp pybullet pytest hypothesis pytest-cov
Verificar Instalación
Comprueba que los paquetes requeridos estén instalados:
python -c "import pybullet; import mcp; print('Installation successful!')"
Inicio Rápido
Ejecutar el Servidor
Consulta QUICKSTART.md para instrucciones detalladas sobre:
- Iniciar el servidor
- Configurar Claude Desktop
- Ejemplos de indicaciones para explorar todas las funciones
- Flujos de trabajo comunes y casos de uso
Comando rápido:
source venv/bin/activate # On Windows: venv\Scripts\activate
python -m src.server
El servidor se iniciará y escuchará conexiones de protocolo MCP desde asistentes de IA.
Ejemplo de Uso con Cliente MCP
Una vez conectado a un cliente MCP (como Claude Desktop), puedes interactuar mediante lenguaje natural:
1. Crear una simulación:
Create a new physics simulation with Earth gravity
Esto llama a create_simulation con gravedad [0, 0, -9.81].
Importante: La gravedad debe ser un vector 3D. El servidor acepta notación abreviada como [-9.81] y la expande a [0, 0, -9.81].
2. Añadir objetos:
Add a red box at position (0, 0, 1) with dimensions 0.5x0.5x0.5 and mass 1.0
Esto llama a add_box para crear un objeto de caja. La posición se expande automáticamente a [0, 0, 1].
Add a sphere at (2, 0, 1) with radius 0.3
Esto llama a add_sphere para crear una esfera.
Nota: La masa debe ser positiva. Para objetos estáticos (como planos de suelo), usa valores de masa grandes (ej., 1000).
3. Ejecutar la simulación:
Step the simulation forward 100 times
Esto llama a step_simulation con steps=100.
4. Consultar el estado del objeto:
What is the position and velocity of object 0?
Esto llama a get_object_state para recuperar posición, orientación y velocidades.
5. Aplicar fuerzas:
Apply a force of [10, 0, 0] to object 0
Esto llama a apply_force para empujar el objeto.
6. Guardar la simulación:
Save the current simulation state to simulation.json
Esto llama a save_simulation para persistir el estado.
7. Cargar una simulación:
Load the simulation from simulation.json
Esto llama a load_simulation para restaurar el estado guardado.
Configuración MCP
Para usar este servidor con Cursor o cualquier otro cliente compatible con MCP, añade lo siguiente a tu archivo de configuración MCP:
{
"mcpServers": {
"pybullet": {
"url": "http://localhost:8000/mcp",
"disabled": false
}
}
}
El servidor ejecuta transporte HTTP por defecto. Puedes cambiar el método de transporte editando el punto de entrada en server.py:
if __name__ == "__main__":
mcp.run(transport="http", port=8000)
Reinicia tu cliente MCP después de actualizar la configuración.
Herramientas Disponibles
El servidor expone 37 herramientas a través del protocolo MCP:
Gestión de Simulaciones (5 herramientas)
-
create_simulation: Inicializa una nueva simulación de física con gravedad configurable y GUI opcional- Parámetros:
gravity(list[float], predeterminado: [0, 0, -9.81]),gui(bool, predeterminado: false) - Devuelve: simulation_id, gravity, gui_enabled
- Parámetros:
-
list_simulations: Obtiene todos los IDs de simulaciones activas- Devuelve: lista de IDs de simulaciones
-
destroy_simulation: Limpia y elimina una simulación- Parámetros:
sim_id(str) - Devuelve: mensaje de confirmación
- Parámetros:
-
step_simulation: Avanza la simulación uno o más pasos de tiempo- Parámetros:
sim_id(str),steps(int, predeterminado: 1) - Devuelve: simulation_id, steps_taken, current_time
- Parámetros:
-
set_timestep: Configura la duración del paso de tiempo para una simulación- Parámetros:
sim_id(str),timestep(float) - Devuelve: mensaje de confirmación
- Parámetros:
Operaciones con Objetos (9 herramientas)
-
add_box: Añade una forma de caja a la simulación- Parámetros:
sim_id,dimensions(list[float]),position(list[float]),mass(float, predeterminado: 1.0),color(list[float], opcional) - Devuelve: object_id, shape, position
- Parámetros:
-
add_sphere: Añade una forma de esfera a la simulación- Parámetros:
sim_id,radius(float),position(list[float]),mass(float, predeterminado: 1.0),color(list[float], opcional) - Devuelve: object_id, shape, position
- Parámetros:
-
add_cylinder: Añade una forma de cilindro a la simulación- Parámetros:
sim_id,radius(float),height(float),position(list[float]),mass(float, predeterminado: 1.0),color(list[float], opcional) - Devuelve: object_id, shape, position
- Parámetros:
-
add_capsule: Añade una forma de cápsula a la simulación- Parámetros:
sim_id,radius(float),height(float),position(list[float]),mass(float, predeterminado: 1.0),color(list[float], opcional) - Devuelve: object_id, shape, position
- Parámetros:
-
load_urdf: Carga un modelo de robot desde un archivo URDF- Parámetros:
sim_id,file_path(str),position(list[float]),orientation(list[float], opcional) - Devuelve: object_id, file_path, position
- Parámetros:
-
set_object_pose: Actualiza la posición y orientación del objeto- Parámetros:
sim_id,object_id(int),position(list[float]),orientation(list[float]) - Devuelve: mensaje de confirmación
- Parámetros:
-
get_object_state: Consulta el estado completo del objeto- Parámetros:
sim_id,object_id(int) - Devuelve: position, orientation, linear_velocity, angular_velocity
- Parámetros:
-
apply_force: Aplica un vector de fuerza a un objeto- Parámetros:
sim_id,object_id(int),force(list[float]),position(list[float], opcional) - Devuelve: mensaje de confirmación
- Parámetros:
-
apply_torque: Aplica fuerza rotacional a un objeto- Parámetros:
sim_id,object_id(int),torque(list[float]) - Devuelve: mensaje de confirmación
- Parámetros:
-
set_object_velocity: Establece la velocidad lineal y/o angular de un objeto directamente- Parámetros:
sim_id,object_id(int),linear_velocity(list[float], opcional),angular_velocity(list[float], opcional) - Devuelve: mensaje de confirmación
- Parámetros:
-
change_dynamics: Modifica las propiedades físicas del objeto en tiempo de ejecución- Parámetros:
sim_id,object_id(int),link_index(int, predeterminado: -1),mass(float, opcional),lateral_friction(float, opcional),spinning_friction(float, opcional),rolling_friction(float, opcional),restitution(float, opcional),linear_damping(float, opcional),angular_damping(float, opcional),contact_stiffness(float, opcional),contact_damping(float, opcional) - Devuelve: mensaje de confirmación
- Parámetros:
-
get_dynamics_info: Consulta las propiedades dinámicas actuales de un objeto- Parámetros:
sim_id,object_id(int),link_index(int, predeterminado: -1) - Devuelve: mass, lateral_friction, local_inertia_diagonal, restitution, rolling_friction, spinning_friction, contact_damping, contact_stiffness, body_type, collision_margin
- Parámetros:
Lanzamiento de Rayos (2 herramientas)
-
ray_test: Lanza un solo rayo para detectar obstáculos y medir distancias- Parámetros:
sim_id,ray_from(list[float]),ray_to(list[float]) - Devuelve: hit (bool), object_id, link_index, hit_fraction, hit_position, hit_normal
- Parámetros:
-
ray_test_batch: Lanza múltiples rayos eficientemente para simulación de lidar/sensores- Parámetros:
sim_id,rays_from(list[list[float]]),rays_to(list[list[float]]) - Devuelve: lista de resultados de impacto (mismos campos que ray_test por rayo)
- Parámetros:
Renderizado de Cámara (4 herramientas)
-
compute_view_matrix: Calcula la matriz de vista a partir de vectores de ojo/objetivo/arriba de la cámara- Parámetros:
camera_eye_position(list[float]),camera_target_position(list[float]),camera_up_vector(list[float]) - Devuelve: matriz de vista como lista de 16 flotantes
- Parámetros:
-
compute_view_matrix_from_yaw_pitch: Calcula la matriz de vista a partir de coordenadas esféricas (cámara orbital)- Parámetros:
distance(float),yaw(float),pitch(float),target_position(list[float]),up_axis_index(int, predeterminado: 2) - Devuelve: matriz de vista como lista de 16 flotantes
- Parámetros:
-
compute_projection_matrix: Calcula la matriz de proyección a partir de parámetros de cámara- Parámetros:
fov(float),aspect(float),near_plane(float),far_plane(float) - Devuelve: matriz de proyección como lista de 16 flotantes
- Parámetros:
-
get_camera_image: Renderiza imágenes RGB, de profundidad y de segmentación desde una cámara virtual- Parámetros:
sim_id,width(int),height(int),view_matrix(list[float]),projection_matrix(list[float]),renderer(str, predeterminado: "ER_BULLET_HARDWARE_OPENGL") - Devuelve: width, height, rgb (PNG en base64), depth (list[float]), segmentation (list[int])
- Parámetros:
Gestión de Restricciones (2 herramientas)
-
create_constraint: Crea una articulación entre dos objetos- Parámetros:
sim_id,parent_id(int),child_id(int),joint_type(str),joint_axis(list[float], opcional),parent_frame_position(list[float], opcional),child_frame_position(list[float], opcional) - Tipos de articulación: "fixed", "prismatic", "spherical"
- Devuelve: constraint_id, joint_type
- Nota:
"revolute"NO se admite aquí — usagenerate_revolute_joint+load_urdfen su lugar.
- Parámetros:
-
remove_constraint: Elimina una restricción de la simulación- Parámetros:
sim_id,constraint_id(int) - Devuelve: mensaje de confirmación
- Parámetros:
Articulaciones Revolutas (Bisagra) — Solución Alternativa
La API de restricciones en tiempo de ejecución de PyBullet no admite articulaciones revolutas. La solución alternativa es un proceso de dos pasos usando estas dos herramientas:
Paso 1 — Generar un URDF con la articulación revoluta:
generate_revolute_joint: Genera un archivo URDF que contiene dos formas conectadas por una articulación revoluta- Parámetros:
parent_shape(str: "box"/"sphere"/"cylinder"),child_shape(str),parent_dimensions(list[float]),child_dimensions(list[float]),parent_mass(float),child_mass(float),joint_axis(list[float]),joint_origin(list[float], opcional),joint_lower_limit(float, predeterminado: -π),joint_upper_limit(float, predeterminado: π),max_effort(float),max_velocity(float),output_path(str) - Devuelve: urdf_path, parent_shape, child_shape, joint_type, joint_axis, joint_limits
output_pathdebe establecerse en una ruta dentro del directorio de trabajo del servidor. Si se omite, el archivo se escribe en el directorio temporal del sistema (/tmp/), que está fuera de la ruta permitida y hará queload_urdffalle con un error de acceso denegado.
- Parámetros:
Paso 2 — Cargar el URDF generado:
- Llame a
load_urdfcon elurdf_pathdevuelto porgenerate_revolute_joint - Luego use
set_joint_motor_controlpara accionar la articulación
Detección de Colisiones (2 herramientas)
-
get_all_collisions: Consulta todos los puntos de contacto en la simulación- Parámetros:
sim_id - Devuelve: lista de puntos de contacto con posiciones, normales, fuerzas
- Parámetros:
-
get_collisions_for_pair: Consulta puntos de contacto entre objetos específicos- Parámetros:
sim_id,obj_a(int),obj_b(int) - Devuelve: lista de puntos de contacto para el par
- Parámetros:
Visualización (2 herramientas)
-
enable_debug_visualization: Habilita el renderizado de depuración de puntos de contacto y marcos- Parámetros:
sim_id,show_contacts(bool, predeterminado: true),show_frames(bool, predeterminado: false) - Devuelve: mensaje de confirmación
- Parámetros:
-
set_camera: Configura la posición de la cámara y el objetivo para el modo GUI- Parámetros:
sim_id,distance(float),yaw(float),pitch(float),target(list[float]) - Devuelve: mensaje de confirmación
- Parámetros:
Persistencia (2 herramientas)
-
save_simulation: Guarda el estado de la simulación en un archivo JSON- Parámetros:
sim_id,file_path(str) - Devuelve: confirmación con la ruta del archivo
- Parámetros:
-
load_simulation: Carga el estado de la simulación desde un archivo JSON- Parámetros:
file_path(str),gui(bool, predeterminado: false) - Devuelve: nuevo simulation_id, file_path
- Parámetros:
Control de Robots (5 herramientas)
-
get_num_joints: Consulta el número de articulaciones en un modelo URDF- Parámetros:
sim_id(str),object_id(int) - Devuelve: número de articulaciones (int)
- Parámetros:
-
get_joint_info: Obtiene propiedades detalladas de la articulación- Parámetros:
sim_id(str),object_id(int),joint_index(int) - Devuelve: joint_name, joint_type, lower_limit, upper_limit, max_force, max_velocity, joint_axis
- Parámetros:
-
get_joint_state: Obtiene el estado actual de la articulación- Parámetros:
sim_id(str),object_id(int),joint_index(int) - Devuelve: joint_position, joint_velocity, reaction_forces, motor_torque
- Parámetros:
-
set_joint_motor_control: Controla las articulaciones del robot- Parámetros:
sim_id(str),object_id(int),joint_index(int),control_mode(str),target_position(float, opcional),target_velocity(float, opcional),force(float, opcional),position_gain(float, opcional),velocity_gain(float, opcional) - Modos de control: "POSITION_CONTROL", "VELOCITY_CONTROL", "TORQUE_CONTROL"
- Devuelve: mensaje de confirmación
- Parámetros:
-
calculate_inverse_kinematics: Calcula los ángulos de articulación para la pose objetivo del efector final- Parámetros:
sim_id(str),object_id(int),end_effector_link_index(int),target_position(list[float]),target_orientation(list[float], opcional),lower_limits(list[float], opcional),upper_limits(list[float], opcional),joint_ranges(list[float], opcional),rest_poses(list[float], opcional) - Devuelve: lista de posiciones de articulación
- Parámetros:
Flujos de Trabajo de Ejemplo
Caja Cayendo Básica
Cree una simulación simple con una caja cayendo bajo gravedad:
# Through MCP client (natural language):
"Create a simulation with Earth gravity"
"Add a box at position (0, 0, 5) with dimensions 1x1x1"
"Step the simulation 200 times"
"What is the position of object 0?"
Objetos Apilados
Cree una pila de objetos:
"Create a simulation"
"Add a box at (0, 0, 0.5) with dimensions 10x10x1 and mass 1000" # Ground
"Add a box at (0, 0, 1.5) with dimensions 1x1x1"
"Add a sphere at (0, 0, 3) with radius 0.5"
"Step the simulation 300 times"
"Get all collisions"
Objetos Restringidos
Cree objetos conectados por una articulación:
"Create a simulation"
"Add a box at (0, 0, 2) with dimensions 1x1x1" # Object 0
"Add a sphere at (2, 0, 2) with radius 0.5" # Object 1
"Create a fixed constraint between object 0 and object 1"
"Apply a torque of [0, 0, 10] to object 1"
"Step the simulation 200 times"
Guardar y Cargar
Persista una simulación:
"Create a simulation"
"Add a box at (0, 0, 1)"
"Add a sphere at (1, 0, 1)"
"Step the simulation 50 times"
"Save the simulation to my_sim.json"
# Later...
"Load the simulation from my_sim.json"
"Step the simulation 50 more times"
Simulación de Robot
Cargue y controle un modelo de robot URDF:
"Create a simulation with GUI enabled"
"Load URDF from /path/to/robot.urdf at position (0, 0, 1)"
"How many joints does object 0 have?"
"Get information about joint 0 of object 0"
"Get the current state of joint 0"
"Set joint 0 to position 1.57 with position control and force 100"
"Step the simulation 100 times"
"Get the state of joint 0 again to see it moved"
"Calculate inverse kinematics for object 0 end-effector link 6 at position [0.5, 0, 0.5]"
Características de Control de Robot:
- Consultar número de articulaciones y propiedades de articulación (tipo, límites, eje)
- Leer estados de articulación (posición, velocidad, fuerzas, torque)
- Controlar articulaciones con tres modos:
- Control de posición: Mover la articulación al ángulo/posición objetivo
- Control de velocidad: Girar la articulación a la velocidad objetivo
- Control de torque: Aplicar torque directo a la articulación
- Calcular cinemática inversa para el posicionamiento del efector final
Formato de Archivo de Persistencia
Los estados de simulación se guardan como archivos JSON con la siguiente estructura:
{
"gravity": [0.0, 0.0, -9.81],
"timestep": 0.01,
"objects": [
{
"object_id": 0,
"type": "primitive",
"shape": "box",
"dimensions": [0.5, 0.5, 0.5],
"position": [0.0, 0.0, 1.0],
"orientation": [0.0, 0.0, 0.0, 1.0],
"linear_velocity": [0.0, 0.0, -0.98],
"angular_velocity": [0.0, 0.0, 0.0],
"mass": 1.0,
"color": [1.0, 0.0, 0.0, 1.0]
},
{
"object_id": 1,
"type": "urdf",
"urdf_path": "/path/to/model.urdf",
"position": [2.0, 0.0, 0.5],
"orientation": [0.0, 0.0, 0.0, 1.0],
"linear_velocity": [0.0, 0.0, 0.0],
"angular_velocity": [0.0, 0.0, 0.0]
}
],
"constraints": [
{
"constraint_id": 0,
"parent_id": 0,
"child_id": 1,
"joint_type": "fixed"
}
]
}
Notas de Compatibilidad
- IDs de Objetos: Los IDs de objetos se reasignan al cargar (pueden diferir de los IDs guardados)
- Archivos URDF: Las rutas de archivos URDF deben ser válidas al cargar. Use rutas absolutas para mayor confiabilidad
- ID de Simulación: Se genera un nuevo ID de simulación al cargar
- Versión de Formato: El formato actual es compatible con PyBullet 3.2.5+
- Restricciones: Las restricciones se serializan y restauran completamente
Problemas Comunes y Soluciones
Errores de Coordenadas
Problema: "force needs a 3 coordinates [x,y,z]" o errores similares
Solución: Siempre proporcione vectores 3D completos:
# Wrong
gravity = [-9.81]
position = [1, 2]
force = [10]
# Correct
gravity = [0, 0, -9.81]
position = [1, 2, 0]
force = [10, 0, 0]
Error de Validación de Masa
Problema: "Mass must be positive, got 0.0"
Solución: PyBullet requiere masa positiva. Para objetos estáticos, use masa grande:
# Wrong
add_box(mass=0) # Error!
# Correct
add_box(mass=1000) # Heavy static object
La Ventana GUI No Aparece
Problema: La ventana GUI no se muestra cuando gui=true
Solución:
- Solo se permite una simulación GUI por instancia de servidor
- Destruya la simulación GUI existente antes de crear una nueva
- Algunos entornos (Docker, SSH sin X11) no admiten GUI
- En Linux, asegúrese de que X11 esté disponible:
echo $DISPLAY
La Carga de URDF Falla
Problema: "Failed to load URDF: File not found"
Solución:
- Use rutas absolutas:
/full/path/to/robot.urdf - O use rutas relativas al directorio de trabajo del servidor
- Verifique que el archivo exista:
ls -la /path/to/robot.urdf - Compruebe que los archivos de malla referenciados en el URDF también sean accesibles
Los Objetos Caen a Través del Suelo
Problema: Los objetos atraviesan el plano del suelo
Solución:
- Asegúrese de estar avanzando la simulación:
step_simulation(steps=100) - Use un paso de tiempo apropiado (el predeterminado 0.01 suele ser bueno)
- Dé al plano del suelo dimensiones grandes y masa alta (por ejemplo, 1000)
- Verifique que los objetos tengan masa positiva
Solución de Problemas
Problemas Comunes
1. Errores de importación al iniciar el servidor
ModuleNotFoundError: No module named 'mcp' or 'pybullet'
Solución: Asegúrese de que su entorno virtual esté activado y las dependencias estén instaladas:
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install fastmcp pybullet
2. Errores de versión de Python
SyntaxError or version compatibility issues
Solución: Verifique la versión de Python (debe ser 3.9+):
python --version
Si es necesario, cree un venv con una versión específica de Python:
python3.9 -m venv venv
3. GUI de PyBullet no se muestra
GUI window doesn't appear when gui=true
Solución:
- El modo GUI debe estar habilitado explícitamente:
create_simulation(gui=true) - Algunos sistemas (servidores, Docker) no admiten el modo GUI: use el modo headless en su lugar
- En Linux, asegúrese de que X11 esté disponible:
echo $DISPLAY
4. Errores de permisos de archivo
PermissionError when saving/loading simulations
Solución:
- Asegúrese de tener permisos de escritura en el directorio de destino
- Use rutas absolutas:
/full/path/to/simulation.json - Verifique el espacio en disco:
df -h
5. El cliente MCP no puede conectarse al servidor
Server not responding
Solución:
- Verifique que el servidor esté ejecutándose:
python -m src.server - Compruebe que la URL en su configuración MCP coincida con el puerto del servidor (predeterminado:
http://localhost:8000/mcp) - Reinicie su cliente MCP después de cambios de configuración
- Revise la salida del terminal del servidor para ver mensajes de error
6. La simulación se comporta inesperadamente
Objects fall through the ground or constraints don't work
Solución:
- Asegúrese de estar avanzando la simulación:
step_simulation(sim_id, steps=100) - Verifique el valor del paso de tiempo (el predeterminado 0.01 suele ser bueno)
- Verifique que las masas de los objetos sean positivas
- Para planos de suelo, use una caja con dimensiones grandes y masa=1000
7. La carga de URDF falla
ToolError: Failed to load URDF
Solución:
- Verifique que la ruta del archivo URDF sea correcta y accesible
- Use rutas absolutas para archivos URDF
- Compruebe que los archivos de malla referenciados en el URDF también sean accesibles
- Valide la sintaxis del URDF directamente con PyBullet
Modo de Depuración
Para ver mensajes de error detallados, revise la salida del servidor en su terminal. El servidor registra todas las operaciones y errores.
Obtener Ayuda
Si encuentra problemas no cubiertos aquí:
- Revise los registros del servidor para ver mensajes de error detallados
- Verifique la configuración de su cliente MCP
- Pruebe el servidor directamente con Python para aislar problemas de MCP vs. PyBullet
- Revise la documentación de PyBullet para preguntas específicas de física
Arquitectura
El servidor sigue una arquitectura en capas:
MCP Client (Claude Desktop)
↓
MCP Protocol
↓
FastMCP Server (37 tools)
↓
Manager Classes (helpers)
↓
PyBullet Physics Engine
Componentes Clave:
- Servidor FastMCP (
src/server.py): Expone 37 herramientas MCP usando decoradores@mcp.tool - SimulationManager: Gestiona clientes de física PyBullet y el ciclo de vida de la simulación
- ObjectManager: Maneja la creación, manipulación y consulta de estado de objetos
- ConstraintManager: Crea y gestiona articulaciones entre objetos
- PersistenceHandler: Serializa/deserializa el estado de la simulación a JSON
- CollisionQueryHandler: Consulta puntos de contacto e información de colisiones
Cada herramienta MCP valida entradas, llama al gestor apropiado y devuelve objetos Python (dict/list/str/int) directamente: FastMCP maneja la conversión del protocolo MCP automáticamente.
Contribuciones
¡Las contribuciones son bienvenidas! Por favor, asegúrese de:
- Todas las pruebas pasen:
pytest - El código esté formateado:
black src tests - El código pase el linting:
ruff check src tests - Los type hints sean correctos:
mypy src - Las nuevas características incluyan pruebas (unitarias + basadas en propiedades)
- La documentación esté actualizada
Agradecimientos
- Construido con FastMCP por Jeremiah Lowin
- Simulación de física impulsada por PyBullet
- Pruebas basadas en propiedades con Hypothesis
Soporte
Para problemas, preguntas o contribuciones:
- Revise este README y la sección de solución de problemas
- Revise la documentación de PyBullet para preguntas específicas de física