Fusion MCP para Codex
by ffelipev2
README.md
# Fusion MCP para Codex
Este proyecto contiene un plugin local para Codex y un add-in para Fusion 360. La idea es que Codex pueda inspeccionar y automatizar Autodesk Fusion 360 a traves de MCP.
## Arquitectura
- `server/main.py`: servidor MCP local que Codex inicia por `stdio`
- `fusion_addin/FusionCodexBridge/`: add-in de Fusion 360 que expone un bridge HTTP local en `127.0.0.1:19851`
- `.mcp.json`: indica a Codex como iniciar el servidor MCP local
El servidor MCP se comunica con el add-in de Fusion por HTTP autenticado. El instalador genera un token local privado y ambos procesos lo leen desde `%LOCALAPPDATA%\FusionMCP\credentials.json`; el add-in rechaza requests que no presenten el token. El add-in ejecuta el trabajo autorizado en el hilo principal de Fusion usando un evento personalizado. El manifest instala `FusionCodexBridge` con `runOnStartup=true` para que el bridge arranque automaticamente al abrir Fusion. Los cuerpos JSON de requests POST tienen un limite predeterminado de 1 MiB y `fusion_run_script` permanece desactivado salvo opt-in explicito.
El endpoint `/health` devuelve la version del bridge y `protocolVersion`. El cliente MCP hace una comprobacion de compatibilidad antes de ejecutar tools normales y entrega un error guiado si Fusion sigue corriendo un add-in viejo; `fusion_ping` y `fusion_reload_bridge` quedan disponibles para diagnosticar y recargar.
## Herramientas que expone el MCP
- `fusion_ping`
- `fusion_status`
- `fusion_reload_bridge`
- `fusion_list_documents`
- `fusion_active_design_summary`
- `fusion_list_user_parameters`
- `fusion_list_all_parameters`
- `fusion_find_entities`
- `fusion_resolve_entity_token`
- `fusion_list_bodies`
- `fusion_list_surface_bodies`
- `fusion_list_mesh_bodies`
- `fusion_printability_report`
- `fusion_list_sketches`
- `fusion_list_sketch_curves`
- `fusion_list_sketch_profiles`
- `fusion_inspect_sketch`
- `fusion_list_components`
- `fusion_list_construction_planes`
- `fusion_list_construction_geometry`
- `fusion_list_available_appearances`
- `fusion_list_available_materials`
- `fusion_list_body_topology`
- `fusion_inspect_body_physical_properties`
- `fusion_upsert_user_parameter`
- `fusion_delete_user_parameter`
- `fusion_create_rectangle_sketch`
- `fusion_create_circle_sketch`
- `fusion_create_line_sketch`
- `fusion_create_arc_sketch`
- `fusion_create_ellipse_sketch`
- `fusion_create_fitted_spline_sketch`
- `fusion_create_text_sketch`
- `fusion_create_conic_sketch`
- `fusion_create_polyline_sketch`
- `fusion_create_polygon_sketch`
- `fusion_create_slot_sketch`
- `fusion_offset_sketch_curves`
- `fusion_trim_sketch_curve`
- `fusion_extend_sketch_curve`
- `fusion_fillet_sketch_curves`
- `fusion_chamfer_sketch_lines`
- `fusion_project_entities_to_sketch`
- `fusion_intersect_entities_with_sketch_plane`
- `fusion_project_curves_to_surface`
- `fusion_move_sketch_entities`
- `fusion_copy_sketch_entities`
- `fusion_mirror_sketch_entities`
- `fusion_rectangular_pattern_sketch_entities`
- `fusion_circular_pattern_sketch_entities`
- `fusion_add_sketch_constraint`
- `fusion_add_sketch_dimension`
- `fusion_set_sketch_dimension_expression`
- `fusion_delete_sketch_constraint`
- `fusion_delete_sketch_dimension`
- `fusion_create_offset_construction_plane`
- `fusion_create_midplane`
- `fusion_create_angled_construction_plane`
- `fusion_create_construction_point_from_sketch_point`
- `fusion_create_construction_axis_by_two_points`
- `fusion_create_construction_plane_by_three_points`
- `fusion_rename_construction_entity`
- `fusion_delete_construction_entity`
- `fusion_revolve_profile`
- `fusion_sweep_profile`
- `fusion_loft_profiles`
- `fusion_scale_bodies`
- `fusion_split_body`
- `fusion_preview_boundary_fill_cells`
- `fusion_create_boundary_fill`
- `fusion_create_silhouette_split`
- `fusion_merge_faces`
- `fusion_create_emboss`
- `fusion_create_derive`
- `fusion_split_faces`
- `fusion_delete_faces`
- `fusion_draft_faces`
- `fusion_thread_faces`
- `fusion_thicken_faces`
- `fusion_replace_faces`
- `fusion_patch_profile`
- `fusion_stitch_surface_bodies`
- `fusion_unstitch_faces`
- `fusion_extend_surface_edges`
- `fusion_create_ruled_surface`
- `fusion_untrim_surface_faces`
- `fusion_trim_surfaces`
- `fusion_rename_mesh_body`
- `fusion_set_mesh_body_visibility`
- `fusion_set_mesh_body_appearance`
- `fusion_delete_mesh_body`
- `fusion_import_mesh`
- `fusion_convert_mesh_to_brep`
- `fusion_reduce_mesh`
- `fusion_repair_mesh`
- `fusion_combine_mesh_bodies`
- `fusion_list_sheet_metal_rules`
- `fusion_create_sheet_metal_rule`
- `fusion_activate_sheet_metal_rule`
- `fusion_create_open_hem`
- `fusion_create_sheet_metal_rip`
- `fusion_create_box`
- `fusion_create_plate_with_holes`
- `fusion_create_printable_svg_plate`
- `fusion_create_cylinder`
- `fusion_extrude_profile`
- `fusion_create_hole`
- `fusion_fillet_edges`
- `fusion_chamfer_edges`
- `fusion_combine_bodies`
- `fusion_shell_body`
- `fusion_mirror_bodies`
- `fusion_rectangular_pattern_bodies`
- `fusion_circular_pattern_bodies`
- `fusion_translate_bodies`
- `fusion_rotate_bodies`
- `fusion_rename_sketch`
- `fusion_set_sketch_visibility`
- `fusion_delete_sketch`
- `fusion_delete_body`
- `fusion_set_body_appearance`
- `fusion_set_face_appearance`
- `fusion_set_body_material`
- `fusion_rename_body`
- `fusion_set_body_visibility`
- `fusion_rename_construction_plane`
- `fusion_delete_construction_plane`
- `fusion_create_component`
- `fusion_list_component_entities`
- `fusion_rename_component`
- `fusion_set_component_visibility`
- `fusion_activate_component`
- `fusion_delete_component`
- `fusion_translate_component`
- `fusion_create_box_in_component`
- `fusion_create_cylinder_in_component`
- `fusion_extrude_component_profile`
- `fusion_list_assembly_tree`
- `fusion_list_occurrence_entities`
- `fusion_list_occurrence_topology`
- `fusion_create_nested_component`
- `fusion_move_occurrence_to_component`
- `fusion_copy_paste_bodies`
- `fusion_cut_paste_bodies`
- `fusion_translate_occurrence`
- `fusion_set_occurrence_grounded`
- `fusion_create_rigid_group`
- `fusion_analyze_assembly_interference`
- `fusion_create_joint`
- `fusion_create_joint_origin`
- `fusion_list_joint_origins`
- `fusion_activate_manufacture_workspace`
- `fusion_manufacture_status`
- `fusion_list_cam_setups`
- `fusion_create_milling_setup`
- `fusion_list_cam_strategies`
- `fusion_generate_toolpaths`
- `fusion_list_cam_parameters`
- `fusion_set_cam_parameter`
- `fusion_rename_cam_setup`
- `fusion_delete_cam_setup`
- `fusion_rename_cam_operation`
- `fusion_set_cam_operation_suppression`
- `fusion_delete_cam_operation`
- `fusion_list_document_cam_tools`
- `fusion_list_cam_tool_library`
- `fusion_create_cam_operation`
- `fusion_list_cam_post_processors`
- `fusion_list_nc_programs`
- `fusion_create_nc_program`
- `fusion_postprocess_nc_program`
- `fusion_list_cam_machines`
- `fusion_assign_cam_machine`
- `fusion_drawing_status`
- `fusion_export_drawing_pdf`
- `fusion_list_workspaces`
- `fusion_activate_workspace`
- `fusion_viewport_status`
- `fusion_set_camera`
- `fusion_set_viewport_visual_style`
- `fusion_toggle_mesh_face_groups`
- `fusion_capture_viewport`
- `fusion_start_local_render`
- `fusion_list_render_jobs`
- `fusion_capture_parameter_animation`
- `fusion_create_document`
- `fusion_list_cloud_projects`
- `fusion_save_document_as`
- `fusion_activate_document`
- `fusion_save_document`
- `fusion_close_document`
- `fusion_list_timeline`
- `fusion_rename_timeline_object`
- `fusion_set_timeline_suppression`
- `fusion_delete_timeline_object`
- `fusion_inspect_timeline_dependencies`
- `fusion_export_step`
- `fusion_export_stl`
- `fusion_export_printable_stl`
- `fusion_import_step`
- `fusion_export_sketch_dxf`
- `fusion_import_dxf`
- `fusion_import_svg`
- `fusion_export_cad`
- `fusion_import_cad`
- `fusion_run_script`
Las tools de creacion de sketch pueden trabajar sobre planos de origen (`xy`, `xz`, `yz`) o sobre un plano de construccion personalizado usando `construction_plane_index`.
`fusion_find_entities` busca bodies, sketches, componentes y planos personalizados por nombre. Admite `exact`, `contains` y `fuzzy`, y devuelve el selector con el indice que esperan las demas tools.
Las respuestas de inspeccion incluyen `entityToken` cuando Fusion lo soporta. `fusion_resolve_entity_token` permite recuperar la entidad y su indice actual despues de cambios en el timeline.
Para agregar constraints o cotas, usa primero `fusion_list_sketch_curves` y `fusion_inspect_sketch`; sus indices pueden cambiar tras una edicion. `fusion_list_sketch_profiles` lista perfiles extruibles con area, centroide, bounding box y loops; usalo para elegir `profile_indices` cuando un SVG o logo complejo genera muchas regiones. `fusion_add_sketch_constraint` cubre horizontal, vertical, paralelo, perpendicular, igual, tangente, concentrico, colineal, coincident, midpoint, symmetry, smooth, fix y unfix. `fusion_add_sketch_dimension` cubre longitud, horizontal, vertical, alineada, angular, diametro y radio mediante expresiones de Fusion; las cotas lineales aceptan una linea o dos puntos, y la angular requiere dos lineas. Usa `fusion_set_sketch_dimension_expression` para editar una cota y las tools `fusion_delete_sketch_*` para borrar la cota o constraint seleccionada.
`fusion_save_document` guarda una nueva version de un documento previamente guardado. Para el primer guardado o para crear una copia usa `fusion_list_cloud_projects` y luego `fusion_save_document_as` con el `project_id` y la ruta de una carpeta existente en Fusion Team.
Las tools de timeline pueden afectar features y geometria dependiente. Conviene ejecutar `fusion_list_timeline` antes de suprimir o borrar un elemento.
`fusion_inspect_body_physical_properties` devuelve masa, densidad, centro de masa y momentos de inercia de un body raiz. La precision puede ser `low` (±1%), `medium` (±0,5%), `high` (±0,1%) o `very_high` (±0,01%); una precision mayor tarda mas.
`fusion_inspect_timeline_dependencies` devuelve features enlazadas y relaciones entre parametros asociados al elemento.
Los errores HTTP conservan ahora el mensaje detallado generado dentro de Fusion. Si el bridge no esta activo, Codex indica directamente como iniciar `FusionCodexBridge`. Despues de reinstalar cambios del add-in, `fusion_reload_bridge` programa un reinicio del bridge dentro de Fusion para cargar la version instalada; si Codex todavia no muestra tools nuevas, reinicia Codex o reabre el selector del plugin para refrescar el catalogo MCP.
`fusion_thread_faces`, `fusion_thicken_faces` y `fusion_replace_faces` trabajan con indices obtenidos desde `fusion_list_body_topology`. Fusion no ofrece actualmente una API publica para crear Rib/Web; `RibFeatures` solo permite inspeccionar features existentes.
`fusion_export_cad` y `fusion_import_cad` admiten `iges`, `sat` y `smt`. Para DXF se usan tools separadas porque el formato se aplica a sketches y planos 2D. `fusion_export_printable_stl` corre checks basicos de imprimibilidad antes de exportar STL del componente raiz o de un body especifico, y devuelve el reporte junto al archivo generado. `fusion_import_svg` importa un SVG a un sketch nuevo sobre un plano de origen o construccion, con desplazamiento y escala. Para una placa imprimible directa, `fusion_create_printable_svg_plate` crea una base rectangular solida, importa el SVG sobre la cara superior y extruye sus perfiles como relieve unido, relieve separado o corte. En SVG complejos puede usar `profile_selection` (`all`, `largest`, `area_desc`, `outer_only`) y `min_profile_area_cm2` para descartar ruido; `profile_indices` sigue disponible para seleccion manual exacta.
Las operaciones dentro de componentes no raiz cubren caja, cilindro y extrude de perfiles. Para ensamblajes anidados usa `fusion_list_assembly_tree`: devuelve `fullPathName`, el selector estable que consumen las tools de inspeccion, creacion, movimiento y traslacion de occurrences anidados. `fusion_copy_paste_bodies` y `fusion_cut_paste_bodies` usan indices locales del componente origen; deja la ruta vacia para el componente raiz. Cut/Paste mueve los cuerpos y exige `allow_move_bodies=true`. Una occurrence representa una definicion de componente: cuando esa definicion tiene varias instancias, copiar o mover cuerpos puede afectar a todas; la tool exige confirmacion adicional antes de hacerlo. Antes de crear un joint usa `fusion_list_occurrence_topology` para obtener indices de caras dentro del contexto de cada occurrence. El MVP de `fusion_create_joint` admite caras planas y joints `rigid` o `revolute`; el segundo occurrence puede reposicionarse al crear el joint. `fusion_set_occurrence_grounded`, `fusion_create_rigid_group` y `fusion_analyze_assembly_interference` trabajan sobre rutas de occurrences y la ultima no modifica el diseño.
Surface permite listar superficies, patch, stitch, unstitch, extend, ruled surface, trim, untrim y reutilizar `fusion_thicken_faces`. En `fusion_trim_surfaces`, usa primero `selected_cell_indices=[]` para obtener la vista previa de indices y luego repite la llamada con las celdas que deben eliminarse.
Mesh permite importar STL/OBJ/3MF, inspeccionar y administrar bodies, asignar apariencias, ademas de convertir, reducir, reparar y combinar. `fusion_printability_report` revisa condiciones geometricas basicas para impresion 3D en cuerpos raiz visibles: B-Rep solido o mesh cerrada/orientada con volumen positivo. Sirve para detectar casos visuales como mallas abiertas con `volumeCm3` cero, pero la validacion final sigue siendo del slicer. `fusion_create_printable_svg_plate` devuelve ese reporte despues de crear la placa para evitar terminar con geometria solo visual. Las cuatro operaciones de modificacion usan APIs preview de Autodesk y pueden no estar disponibles en todas las instalaciones; en ese caso la tool devuelve una instruccion guiada.
El mapeo inicial de Sheet Metal cubre reglas, activacion de reglas, hem abierto y rip sobre un cuerpo de chapa existente. Autodesk no expone actualmente creacion de base flange/flange en la API publica.
Manufacture permite activar el workspace, inspeccionar setups/operaciones/parametros, crear setups de fresado, editar expresiones CAM, renombrar/suprimir/borrar elementos, descubrir estrategias compatibles y generar toolpaths. Tambien permite consultar herramientas del documento o de una biblioteca por URL, crear cualquier `strategy` compatible con tool y expresiones, consultar/asignar maquinas, buscar posts, crear `NCProgram` y postprocesar.
Flujo CAM recomendado: crea o inspecciona un setup, consulta `fusion_list_cam_strategies`, elige una herramienta con `fusion_list_document_cam_tools` o `fusion_list_cam_tool_library`, crea la operacion con `fusion_create_cam_operation` y genera su toolpath. Para codigo NC, descubre una maquina/post, crea el programa y revisa su indice antes de ejecutar `fusion_postprocess_nc_program` con `confirm_postprocess=true`. El directorio de salida debe existir y la validacion final de maquina, herramientas, origen y colisiones sigue siendo responsabilidad del operador.
Drawing permite inspeccionar el documento/hoja activa y exportar todas las hojas o un rango a PDF. La API publica de Drawing no expone todavia una coleccion completa para crear y editar programaticamente todas las hojas, vistas y anotaciones.
Render/Animation incluye lectura y control de camara, control de estilo visual del viewport, capturas del viewport, render local asincrono y seguimiento de jobs. `fusion_capture_viewport` sin `output_path` devuelve un PNG inline de hasta 20 MiB y elimina el archivo temporal antes de terminar; es el modo recomendado para inspeccion visual. Para conservar una captura o generar una imagen mayor, pasa un `output_path` explicito y `persist=true`; por compatibilidad, las llamadas antiguas que ya entregan una ruta siguen persistiendo. Los renders asincronos y las animaciones todavia escriben en las rutas explicitas indicadas por el usuario. `fusion_toggle_mesh_face_groups` permite apagar/encender la visualizacion de grupos de caras de malla cuando Fusion oculta materiales y muestra colores de face groups. `fusion_capture_parameter_animation` interpola expresiones de un parametro, puede orbitar la camara, escribe una secuencia PNG y restaura el parametro/camara originales; el ensamblado final de video queda fuera de Fusion.
`fusion_list_workspaces` y `fusion_activate_workspace` permiten descubrir y activar workspaces por ID. En Simulation esto solo cubre navegacion: Autodesk no publica actualmente un modelo de API para crear y resolver estudios equivalente a `adsk.cam`.
`fusion_split_body` hoy usa como herramienta de corte un plano de origen o un plano de construccion existente. Mas adelante se puede extender a perfiles, caras o cuerpos como splitting tool.
Para Boundary Fill, primero usa `fusion_preview_boundary_fill_cells` con selectors de `body` y/o `construction_plane`: devuelve volumen, area, caras y bounding box de cada celda temporal. Repite enseguida los mismos selectors, en el mismo orden, con `fusion_create_boundary_fill` y los `selected_cell_indices` que quieres **conservar**. Esos indices son temporales y no deben reutilizarse despues de editar el modelo. `operation` admite `new_body`, `join`, `cut` o `intersect`; `remove_tool_bodies` exige ademas `allow_remove_tools=true` porque borra los bodies usados como herramientas.
`fusion_create_silhouette_split` calcula una linea de particion de silueta sobre un body solido raiz. La direccion acepta un `construction_axis`, `construction_plane`, edge lineal o face planar; `faces_only` es el modo no destructivo por defecto, mientras `shelled_body` y `solid_body` dividen el cuerpo. Fusion limita esta feature a cuerpos compatibles; una esfera es un caso sencillo para comprobar el flujo.
`fusion_merge_faces` une caras conectadas de un mismo body solido o de superficie, pero solamente en un diseño Direct Modeling. Es una edicion B-Rep directa: no crea feature ni entrada en timeline, por lo que exige `allow_direct_modification=true`. Usa `is_chain_selection=true` para ampliar una cara semilla por la cadena conectada compatible.
`fusion_create_emboss` mapea un perfil de sketch a una cara de un body raiz. Usa profundidad positiva para relieve y negativa para grabado; las expresiones aceptan unidades o parametros de Fusion. El MVP expone un perfil y una cara por llamada, con offsets y rotacion opcionales. Requiere la API Emboss introducida por Fusion en septiembre de 2025; si no esta disponible, devuelve una indicacion guiada.
`fusion_create_derive` crea un vinculo derivado desde otro documento de diseño ya abierto y guardado en Fusion. Usa `fusion_list_documents` para identificar `source_document_index`; como entidades fuente acepta `root_component`, `body`, `mesh_body`, `sketch`, `construction_plane` u `occurrence`. El documento activo es siempre el destino y no puede derivarse a si mismo. La tool requiere la API Derive introducida en enero de 2026.
`fusion_split_faces` acepta como herramienta un selector de `body`, `face`, `sketch_curve` o `construction_plane`; admite los modos `surface_intersection`, `closest_point` y `along_vector`. `fusion_delete_faces` usa `heal` por defecto para que Fusion intente reparar el cuerpo. El modo `surface` elimina sin reparar y requiere `allow_make_surface=true` porque puede dejar un cuerpo de superficie abierto. Todas las tools `fusion_delete_*` exigen ahora el selector de destino y `confirm_delete=true`; lista o inspecciona el objetivo inmediatamente antes de confirmar. Cerrar sin guardar exige `save_changes=false` y `confirm_discard_changes=true`.
`fusion_draft_faces` aplica draft sobre caras de un body usando un plano neutral. Lo normal es usar `fusion_list_body_topology` primero para obtener los `face_indices`.
## Pruebas locales
Para correr las pruebas unitarias y de contrato disponibles sin abrir Fusion:
```powershell
python -m unittest discover -s tests
```
Ese conjunto tambien verifica que la lista de tools del README, el conteo del ROADMAP, la version del bridge/plugin/manifest y el protocolo MCP queden sincronizados.
Para una verificacion rapida de sintaxis en los dos entrypoints Python principales:
```powershell
python -m py_compile server/main.py fusion_addin/FusionCodexBridge/FusionCodexBridge.py
```
Para correr el smoke test real de impresion 3D contra Fusion abierto con el bridge activo:
```powershell
python .\scripts\smoke_printable_svg.py
```
Ese smoke test crea un documento desechable, genera una placa desde SVG, exporta un STL con `fusion_export_printable_stl`, verifica que el archivo exista y cierra el documento sin guardar. Los artefactos quedan en `scratch/fusion-smoke`.
Para correr un smoke test real de sketches basicos contra Fusion abierto con el bridge activo:
```powershell
python .\scripts\smoke_sketch_basics.py
```
Ese smoke test crea un documento desechable, genera sketches de rectangulo, circulo, linea, arco, polilinea, poligono y slot, prueba offset, constraints, cotas e inspeccion, y cierra el documento sin guardar.
## Requisitos
- Windows con Python 3.10 o posterior disponible como `python` en `PATH`
- Autodesk Fusion 360
## Configuracion de seguridad
- `fusion_run_script` esta desactivado por defecto. Para habilitarlo deliberadamente, define `FUSION_MCP_ENABLE_RUN_SCRIPT=1` tanto para el proceso MCP como para Fusion 360 y reinicia ambos. El script se ejecuta con los permisos completos del usuario, por lo que deben preferirse las tools dedicadas.
- `FUSION_MCP_MAX_REQUEST_BODY_BYTES` ajusta el limite de los payloads JSON del bridge. El valor predeterminado es 1 MiB y el maximo aceptado es 16 MiB.
- Las operaciones de borrado, descarte de cambios y postprocesado requieren sus flags de confirmacion explicitos; esos flags no sustituyen la inspeccion previa del objetivo.
## Instalacion recomendada en Windows
Si ya tienes este repositorio localmente, la forma mas rapida de instalarlo es:
```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\install-fusion-mcp.ps1
```
Ese instalador hace lo siguiente:
- genera o conserva una credencial aleatoria privada para autenticar MCP con Fusion
- protege el archivo de credenciales y, cuando crea su carpeta dedicada, limita tambien los permisos de esa carpeta al usuario actual; no altera los ACL de una carpeta padre preexistente
- construye el plugin desde una lista permitida de archivos y lo copia en `~/plugins/fusion-mcp`, sin incluir capturas, backups, CAD ni otros artefactos del workspace
- valida por manifest los destinos del plugin y del add-in; rechaza solapamientos con el repositorio, carpetas no reconocidas, junctions y archivos de estado dentro de destinos administrados
- publica el runtime mediante candidato + respaldo y restaura la version anterior si falla el marketplace
- actualiza `~/.agents/plugins/marketplace.json` mediante un reemplazo atomico despues de publicar el runtime
- instala las dependencias de `requirements.txt`
- copia el add-in de Fusion en `%APPDATA%\Autodesk\Autodesk Fusion 360\API\AddIns\FusionCodexBridge` si esa carpeta existe; si no, usa `%APPDATA%\Autodesk\Autodesk Fusion\API\AddIns\FusionCodexBridge`
- sincroniza esas carpetas de instalacion y elimina archivos obsoletos de versiones anteriores
- avisa si encuentra otra copia de `FusionCodexBridge` en la ruta alternativa de Autodesk, porque Fusion podria estar cargando una copia vieja
Si solo quieres instalar la parte de Codex y todavia no copiar el add-in de Fusion, puedes usar:
```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\install-fusion-mcp.ps1 -SkipFusionAddIn
```
## Paso a paso para dejarlo funcionando
1. Abre una terminal en la raiz del repositorio.
2. Ejecuta el instalador:
```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\install-fusion-mcp.ps1
```
3. Abre Fusion 360.
4. En Fusion, entra a **Utilities > Add-Ins > Scripts and Add-Ins**.
5. Ve a la pestaña **Add-Ins**.
6. Si la lista aparece vacia, limpia los filtros antes de asumir que falta el add-in.
7. Busca `FusionCodexBridge` y ejecutalo con **Run**.
8. Si `FusionCodexBridge` no aparece en la lista, usa el boton `+` y apunta manualmente a una de estas carpetas:
- `%APPDATA%\Autodesk\Autodesk Fusion 360\API\AddIns\FusionCodexBridge`
- `%APPDATA%\Autodesk\Autodesk Fusion\API\AddIns\FusionCodexBridge`
9. Verifica que el bridge local de Fusion este corriendo:
```powershell
$credential = Get-Content "$env:LOCALAPPDATA\FusionMCP\credentials.json" -Raw | ConvertFrom-Json
Invoke-RestMethod http://127.0.0.1:19851/health -Headers @{ Authorization = "Bearer $($credential.token)" }
```
Deberias recibir una respuesta JSON con `"ok": true`.
10. Reinicia Codex o recarga la ventana de VS Code si hace falta.
11. Si usas Codex CLI o la app de Codex, registra el servidor MCP una sola vez:
```powershell
codex mcp add fusion-local -- python "$HOME\plugins\fusion-mcp\server\main.py"
```
12. Comprueba que el servidor quedo registrado:
```powershell
codex mcp list
```
13. Vuelve a Codex y prueba con una instruccion simple, por ejemplo:
- `revisa el diseño activo en Fusion`
- `haz un fusion_status`
- `crea una caja de 10x6x3 cm`
## Instalacion manual
La instalacion manual tambien requiere que MCP y Fusion compartan un token de al menos 32 caracteres mediante `FUSION_MCP_TOKEN` o un archivo JSON indicado por `FUSION_MCP_CREDENTIALS_FILE`. Para evitar errores de permisos y configuracion se recomienda ejecutar el instalador al menos una vez.
Si no quieres usar el instalador, puedes hacer el proceso a mano:
1. Instala las dependencias de Python:
```powershell
pip install -r requirements.txt
```
2. Copia `fusion_addin/FusionCodexBridge/` a una carpeta de Add-Ins de Fusion:
- `%APPDATA%\Autodesk\Autodesk Fusion 360\API\AddIns\`
- o `%APPDATA%\Autodesk\Autodesk Fusion\API\AddIns\`
3. Registra el servidor MCP en Codex:
```powershell
codex mcp add fusion-local -- python "$PWD\server\main.py"
```
4. Abre Fusion 360 y ejecuta `FusionCodexBridge` desde **Utilities > Add-Ins > Scripts and Add-Ins**.
## Solucion de problemas
- Si Fusion muestra la lista de add-ins vacia, primero limpia los filtros de la ventana **Scripts and Add-Ins**.
- Si VS Code muestra `No MCP Servers found`, ejecuta **Developer: Reload Window** y luego vuelve a usar **MCP: List Servers**.
- No busques `fusion-local` en el Marketplace de extensiones de VS Code. Es un servidor MCP local, no una extension del marketplace.
- Si Codex ve el servidor pero las acciones contra Fusion fallan, usa el comando de verificacion de `/health` de arriba o ejecuta `fusion_ping`; todos los endpoints requieren el Bearer token local.
- Si Codex informa que el bridge es incompatible o falta `protocolVersion`, ejecuta `powershell -ExecutionPolicy Bypass -File .\scripts\install-fusion-mcp.ps1` y luego `fusion_reload_bridge` o reinicia Fusion.
- Si el instalador avisa que existe otra copia de `FusionCodexBridge`, abre **Scripts and Add-Ins** y confirma que estas ejecutando la carpeta actualizada que imprimio el instalador.
- Si recibes `Unauthorized Fusion MCP request`, vuelve a ejecutar el instalador y reinicia Codex y el add-in para que ambos usen la misma credencial.
- Si el instalador rechaza un archivo de credenciales existente, revisa que `CredentialPath` sea correcto. Para regenerar una credencial realmente corrupta, mueve o elimina ese archivo de forma explicita y vuelve a ejecutar el instalador; el instalador no sobrescribe archivos desconocidos.
- No copies ni publiques `%LOCALAPPDATA%\FusionMCP\credentials.json`; el instalador nunca muestra el token.
## Notas
- `fusion_run_script` ejecuta Python dentro de Fusion con acceso completo a la API y esta desactivado por defecto. Usalo solo con codigo confiable y mediante opt-in explicito.
- Todos los endpoints, incluido `/health`, requieren el Bearer token generado durante la instalacion.
- La herramienta de script devuelve el valor asignado a la variable `result`.
- Si el bridge no esta corriendo, empieza probando con `fusion_ping` o `fusion_status` despues de iniciar el add-in.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues