OCCTMCP

Interacción analítica con modelos CAD construidos sobre el núcleo CAD OCCT

Documentación

OCCTMCP

Swift Platforms License: LGPL v2.1+

Servidor MCP que brinda a los LLM la capacidad de crear, inspeccionar e iterar sobre modelos CAD 3D con OpenCASCADE a través de la familia OCCTSwift.

Parte del ecosistema OCCTSwift — consulta el mapa del ecosistema para ver cómo este paquete se sitúa sobre las capas de kernel, viewport, bridge y AIS. Estable en SemVer desde v1.0.0.

La implementación en Swift llama a OCCT directamente en proceso (sin subprocesos, sin marshalling JSONL) y expone 79 herramientas MCP tipadas que cubren autoría, lecturas de escena, mutación, introspección, construcción, análisis, E/S, malla, dibujo, selección / remapeo, análisis de zonas de malla, inspección de malla, alineación, superposiciones de dimensiones y el puente de selección agente-a-host-de-viewport.

Cómo Funciona

LLM picks a typed tool (boolean_op, transform_body, render_preview, …)
  → OCCTMCP runs the OCCT operation directly via OCCTSwift / Tools / AIS / Mesh
  → Writes BREP/STEP/PNG + manifest.json + annotations.json
  → OCCTSwiftViewport (optional) auto-reloads the 3D model

Para geometría novedosa que las herramientas tipadas no cubren, el LLM recurre a execute_script: código Swift arbitrario con la API completa de OCCTSwift, compilado y ejecutado en proceso.

Herramientas

79 herramientas, organizadas a continuación. Llama a get_api_reference({ category: "mcp_tools" }) para volcar el JSON Schema de cada herramienta de una sola vez, útil para el auto-descubrimiento del LLM. La mayoría de los flujos pueden responder "¿cuál es el volumen?", "hazlo rojo", "resta booleana de estos", "renderiza una vista previa", "añade una dimensión entre estas dos caras", "exporta a STEP" y "dibuja esto" sin tocar nunca execute_script.

Autoría

HerramientaPropósito
execute_scriptEscribir y ejecutar código Swift CAD arbitrario (API completa de OCCTSwift)
get_scriptLeer el código fuente del script más reciente
get_api_referenceExplorar la API de OCCTSwift por categoría

Lecturas de escena

HerramientaPropósito
get_sceneLeer el manifiesto de escena actual (cuerpos, colores, materiales)
export_modelListar rutas de archivos BREP / STEP / STL / OBJ exportados
compare_versionsDiferenciar la escena actual vs. N ejecuciones atrás (añadido / eliminado / apariencia / archivo cambiado)

Mutación de escena

HerramientaPropósito
remove_bodyEliminar un cuerpo de la escena (manifiesto + archivo BREP)
clear_sceneBorrar todos los cuerpos, opcionalmente conservar el historial de diferencias
rename_bodyCambiar el id de un cuerpo
set_appearanceActualizar color / opacidad / rugosidad / metálico / nombre de visualización

Introspección

HerramientaPropósito
validate_geometryValidación de topología por cuerpo (isValid, conteos de errores)
compute_metricsVolumen, área, centroide, caja delimitadora, ejes principales
query_topologyEncontrar caras / aristas / vértices que coincidan con criterios, devolver IDs estables. Los resultados de aristas (#119) incluyen extremos (de todo tipo) más una dirección unitaria para aristas LINE, y circleCenter/radius/axis/startAngle/endAngle para aristas CIRCULAR. Solo-caras includeNeighbors (vecinas con convexidad, limitado por neighborLimit) y oppositeFaces (cara plana opuesta de asesoría, oppositeMethod exacta o por bbox) (#199)
measure_distanceDistancia mínima + contactos entre dos cuerpos
measure_deviationDesviación de superficie firmada y resuelta espacialmente entre dos cuerpos — máx / rms / media / p95 / signedMean (sesgo sistemático sobresaliente(+)/hundido(−)) en cada dirección + worstPoint, más un barrido opcional de media firmada por sección a lo largo de un eje. La métrica de certificar-una-reconstrucción (measure_distance es solo-mínimo). Ver signMode bajo QA de desviación y reconstrucción para saber qué vale el signo contra una referencia abierta de pared delgada
measure_vertex_fit (#118)Tabla de distancias exactas por vértice desde los vértices propios de un cuerpo de malla hasta la geometría BRep real de un cuerpo objetivo (Shape.vertex(at:).distance(to:), tipo de entidad más cercana vía distanceSolutionDetail): el instrumento de ajuste de vértices que ni measure_distance (cuerpo-a-cuerpo, limitado) ni measure_deviation (malla-a-malla, aproximado) proporcionan. Tabla peor-N por defecto; includeAllVertices: true para la tabla completa por vértice
recognize_featuresBolsillos y agujeros mediante heurísticas AAG
inspect_assemblyRecorrer un árbol de ensamblaje XCAF (STEP / IGES / XBF)

Construcción

HerramientaPropósito
apply_featureTaladrar / redondear / chaflanar / extruir / revolver / roscar / booleano (FeatureSpec)
transform_bodyTrasladar / rotar / escalar uniformemente (registra historial de identidad para remapeo)
boolean_opUnión / resta / intersección / dividir (registra historial por entrada para remapeo)
mirror_or_patternReflejar / patrón lineal / circular → N cuerpos nuevos

Análisis de ingeniería

HerramientaPropósito
check_thicknessAnálisis de espesor de pared con banderas de región delgada
analyze_clearanceInterferencia por pares / holgura mínima
heal_shapeSanar geometría importada / no estanca; estadísticas antes/después

QA de desviación y reconstrucción

Comparación firmada y resuelta espacialmente de una reconstrucción contra su malla fuente. Donde los escalares de measure_deviation pueden ocultar un error de forma sistemático (una sección transversal incorrecta que se promedia), estos exponen dónde y hacia qué lado se desvía el candidato. Renderizado puro en Swift — sin Python/matplotlib.

¿Hacia qué lado está afuera? measure_deviation, deviation_histogram y signed_deviation_heatmap comparten un mismo motor de distancia firmada, por lo que comparten un control signMode. El signo de una desviación depende de contra qué triángulo de referencia se juzga una muestra, y contra una referencia abierta, de pared delgada (un escaneo crudo / piel STL) el más cercano suele ser el equivocado: un flanco candidato situado 4.5 mm dentro de una pared de 2 mm está solo a 2.5 mm de la superficie interior de la pared, así que esa superficie gana por proximidad y — mirando hacia la cavidad — reporta +2.5 sobresaliente para una pieza que está 4.5 hundida. Lado equivocado, magnitud equivocada, nada que lo señale. signMode: "robust" (el predeterminado desde v1.17.0) rechaza triángulos de referencia cuya normal exterior se opone a la propia de la muestra antes de que gane el superviviente más cercano, recuperando ambas cifras; las muestras sin superficie compatible al alcance se reportan ambiguous y se excluyen de las estadísticas firmadas en lugar de adivinarse. signMode: "nearest" restaura el signo crudo de triángulo-más-cercano previo a v1.17, que es correcto contra una referencia estanca / de superficie única. Un ambiguousFraction cercano a 1.0 significa que el enrollado de la referencia probablemente está invertido respecto al cuerpo muestreado; donde nada tiene un signo confiable, las cifras firmadas vuelven null en lugar de un cero que se leería como "perfectamente centrado".

Las dos familias de números responden preguntas diferentes, y signMode mueve solo la segunda:

FamiliaMide hasta¿Movida por signMode?
Sin signo — max / rms / mean / p95 / worstPoint / symmetricHausdorff / maxAbs / withinTolerancela superficie de referencia más cercana, sea cual seaNo — mismo significado que pre-v1.17
Firmada — signedMean / signedMin / signedMax / sections / cubos de histograma / colores de mapa de calorla superficie a la que la muestra correspondeSí

Contra una referencia estanca estas son la misma superficie y las familias coinciden. Contra una abierta de pared delgada divergen a propósito: max: 2.5 junto a signedMin: -4.5 dice que la geometría de referencia más cercana es una pared interior a 2.5 de distancia mientras que la piel a la que pertenece ese flanco está 4.5 por encima. Ambas verdaderas. Una brecha entre ellas es en sí misma la señal de que la referencia es de pared delgada.

HerramientaPropósito
deviation_histogramDistribución de desviación firmada punto-a-superficie: μ / σ / mediana / p95 / extremos sobresaliente-hundido, porcentaje dentro de ±tolerancia, histograma de cubos + PNG opcional. Una media no nula o forma bimodal ⇒ error sistemático
cross_section_compareRebanar ambos cuerpos en N estaciones a lo largo de su solapamiento de extensión de eje compartido; media firmada / RMS / relación de área / desplazamiento de centroide por sección + un escalar de forma radial robusto a la pose, con PNGs superpuestos. El modo predeterminado outerEnvelope compara contra el límite exterior de la referencia por dirección angular para que los caminos de retorno de ventana interior / marco de una pieza de pared delgada o escaneada no contaminen el agregado; cada estación reporta axisCoord (posición mundial a lo largo del eje). Maneja referencias de carcasa abierta (escaneo crudo / piel STL) cuyas secciones son arcos abiertos, reporta el rango overlap y advierte en estaciones que rebanaron solo un cuerpo. El detector de mayor apalancamiento de una sección de forma incorrecta
symmetric_difference_volume (#122)La cifra directa de fidelidad geométrica que una desviación superficial media/RMS puede ocultar vía cancelación: los dos volúmenes unilaterales entre un candidato y una referencia (solo-exceso, solo-falta) y su suma, vía el número de enrollamiento generalizado de OCCTSwiftMesh (robusto contra una referencia abierta/no estanca/auto-intersecante, a diferencia de la resta de boolean_op, que falla rotundamente contra una). Muestreo Monte Carlo determinista de secuencia Halton; reporta un error estándar y una verificación cruzada de volumen BREP exacto donde esté disponible
signed_deviation_heatmapRenderizar la superficie candidata coloreada por distancia firmada (sobresaliente = rojo, hundido = azul) a través de un mapa de color divergente con leyenda de barra de color. Los triángulos cuyo signo no puede establecerse contra una referencia abierta/de pared delgada se renderizan en gris (ambiguousTriangles/ambiguousFraction, excluidos de signedMin/Max/Mean) en lugar de un rojo/azul de cara o cruz — ver signMode arriba
overlay_renderRenderizar la malla de referencia semitransparente sobre el sólido candidato opaco — ver la desviación en 3D

Análisis de malla (zonas)

La superficie de inspección de malla para escaneos crudos / pieles STL: dividir la malla de un cuerpo en zonas de superficie (plano / cilindro / esfera / cono, vía el crecimiento de regiones por ángulo diedro + fusión por ajuste de primitiva de OCCTSwiftMesh), luego medir cuán constante permanece la sección transversal propia de cada zona a lo largo de un eje (un mapa de extensión extruible). Ambos son composición de dominio puramente de malla — la lógica de agregación/veredicto aquí es independiente del motor propio de OCCTReconstruct, según la política de verificación analítica obligatoria.

HerramientaPropósito
segment_mesh_zonesDividir la malla de un cuerpo en zonas de superficie; cada zona obtiene un id zone:<bodyId>#<n> estable, una primitiva ajustada (tipo/parámetros/residual) y (opcionalmente) un render PNG categórico y/o su propio cuerpo de escena registrado
zone_continuity_sweepBarrer una zona (o cuerpo completo) a lo largo de un eje; reportar corridas máximas dentro de tolerancia (extensiones extruibles) e intervalos de desviación entre ellas, cada uno con tramos axisCoord mundiales y magnitudes
list_zonesInspeccionar el registro de zonas (<output_dir>/zones.json)
clear_zonesBorrar el registro de zonas, opcionalmente para un cuerpo
fit_primitives (#107)Informe de primitiva RANSAC estilo Schnabel (plano/cilindro/esfera/cono), reclamando inliers GLOBALES en lugar del crecimiento de regiones solo-adyacente-a-arista de segment_mesh_zones — para que pueda unificar una primitiva (p. ej. un cilindro interrumpido por un saliente) que la tabla de zonas mantiene dividida entre regiones. El zoneId opcional limita el ajuste a una zona; strategy: "auto" ejecuta un desempate diedro-vs-RANSAC y reporta cuál ganó. uncoveredFraction (triángulos que ninguna primitiva reclamó) y un tope maxPrimitives se reportan como advertencias estrictamente separadas

Inspección de malla

La superficie de lista-de-verificación / medición de dominio de malla (Fase 2 de la expansión de análisis de malla): diagnóstico de integridad, espesor de pared, detección de simetría reflectiva y alineación de dos cuerpos, todo trabajando directamente sobre la superficie teselada de un cuerpo en lugar de la topología BREP, para que no se degraden en carcasas de facetas (una importación STL cruda) como lo hace check_thickness.

HerramientaPropósito
mesh_diagnoseInforme de integridad de la lista de verificación de imprimibilidad: hermético, variedad de bordes/vértices, orientable, componentes conectados, bucles de contorno, característica de Euler / género, recuentos de triángulos duplicados/degenerados, señales de elementos delgados, además de un checks[] derivado de aprobado/advertencia/fallo. NO se verifica la auto-intersección (una limitación de OCCTSwiftMesh aguas arriba)
mesh_thicknessEspesor de pared del dominio de malla mediante el método de rayos (normal-opuesta, primer impacto, mediana promediada por cono opcional): el complemento de check_thickness para mallas sin procesar. Informa la distribución del espesor, una sección opcional por debajo del umbral y un PNG de histograma opcional
detect_symmetryDetectar simetría reflectante (plano espejo): 3 planos candidatos de PCA a través del centroide ponderado por área, cada uno verificado reflejando puntos muestreados y midiendo su distancia residual de regreso a la superficie. La detección de simetría rotacional/de eje se difiere a una fase posterior
align_bodies (#104)Alineación estilo GOM: registrar un cuerpo fuente sobre un cuerpo de referencia mediante ICP punto-a-plano (pre-alineación PCA + muestreo de espacio normal + correspondencia recortada). mode: "bestFit" (predeterminado, pipeline completo) o "preAlign" (solo pose gruesa de PCA/bbox). Devuelve la transformación recuperada (orden de fila mayor, traslación + rotación de eje-ángulo) y estadísticas residuales; apply: true la escribe en el cuerpo fuente en su lugar con la misma semántica de historial que transform_body. Las herramientas de desviación escaneo-vs-CAD necesitan esto antes de que sus números signifiquen algo
mesh_curvatureCurvatura discreta por vértice (tensor por cara de Rusinkiewicz) sobre la malla soldada de un cuerpo: curvaturas principales k1/k2, media, gaussiana, más una representación coloreada (colorBy) y estadísticas acotadas (medianas, fracción plana, fracción de alta curvatura). No se necesita cuerpo de referencia
detect_mesh_features (#108)Contornos de características de anillos de pliegue (puertas, paneles, retornos de ventanas, huecos) en una malla de escaneo sin procesar mediante detección de bordes plegados diedros: suelda la malla, encadena bordes plegados que exceden minAngleDegrees en anillos cerrados y rutas abiertas (primero los más grandes), para mallas donde recognize_features (BREP/AAG) no tiene estructura B-rep contra la cual trabajar. Consciente de uniones (las intersecciones Y/T se dividen limpiamente). Informa el containingZones de cada anillo cuando segment_mesh_zones ya se ha ejecutado para el cuerpo. includePoints: true (#120) también devuelve la polilínea de vértices ordenados en coordenadas mundiales de cada anillo. Representación opcional: la superficie más cada anillo como su propia superposición de estructura alámbrica coloreada categóricamente
fit_edge_chain (#121)Segmenta una cadena de puntos 3D ordenada (típicamente la polilínea de un anillo detect_mesh_features) en tramos de línea y arco circular: tipo por segmento, puntos finales, dirección unitaria (línea) o centro/radio/eje/ángulo inicial/ángulo final (arco), y residuales de ajuste. Un STL sin procesar no tiene bordes curvos por construcción; un arco existe en la malla solo como un ajuste sobre una cadena de bordes de facetas rectos, que ni fit_primitives ni segment_mesh_zones (ambos ajustan SUPERFICIES, no cadenas de bordes) proporcionan. Las cadenas de radio múltiple se dividen en segmentos separados en lugar de colapsar en un círculo promediado

Selección y reasignación

HerramientaPropósito
select_topologySeleccionar caras / bordes / vértices, obtener un selectionId estable. Los anclajes de borde (#119) llevan puntos finales (de todo tipo) más una dirección unitaria para bordes LINE, y centro de círculo/radio/eje/ángulo inicial/ángulo final para bordes CIRCULARES
remap_selectionLlevar selectionIds a través de mutaciones del mismo cuerpo (basado en historial para transformar / sanear / booleano / aplicar característica; heurística de centroide como respaldo en otros casos)
find_correspondencesMapear selectionIds de un cuerpo fuente a un cuerpo objetivo que es una transformación conocida del fuente — las salidas de mirror_or_pattern son el caso típico
select_by_featureSelección masiva por tipo de característica (por ejemplo, todos los bordes de agujeros)
list_selectionsInspeccionar el registro de selección en memoria
clear_selectionsLimpiar el registro
get_selection (#189)Leer la selección actual de un host de viewport en vivo (<output_dir>/selection.json + host.lock, según SecondMouseAU/OCCTSwiftInteraction#17). Resultado de tres estados: noHost vs hostRunning con una lista de selección vacía o poblada; cada entrada se resuelve contra la propia escena de este servidor de la misma manera que select_topology y acuña un selectionId componible
highlight_selection (#190)Pedir a un host de viewport en vivo que resalte una subforma (replace/add/remove/xor, reflejando OCCTSwiftAIS.SelectionScheme; target attention por defecto marca el marcador del propio agente, selection cambia el del humano). Escribe highlight_requests/<id>.json, consulta highlight_requests/handled/<id>.json para el resultado real applied/rejected/superseded del host, o un timeout/noHost explícito

Anotaciones y superposiciones

HerramientaPropósito
add_dimensionAgregar una dimensión lineal / angular / radial; se representa en render_preview
add_scene_primitiveAgregar triedro / plano de trabajo / eje / nube de puntos / caja delimitadora / marcador de diferencia
auto_dimensionColocación heurística de dimensiones para las extensiones principales
show_bounding_boxAgregar el AABB de un cuerpo como superposición
diff_overlayVisualizar la diferencia entre dos instantáneas
remove_scene_annotationEliminar una dimensión o primitiva por id
list_annotationsInspeccionar el archivo lateral de anotaciones

E/S

HerramientaPropósito
read_brepCargar un .brep desde el disco a la escena (allowInvalid carga una forma de cara suelta / inválida para medición)
import_fileImportación multi-formato (STEP / IGES / STL / OBJ); ensamblaje XCAF opcional; allowInvalid para reconstrucciones en curso
export_sceneExportar a STEP / IGES / BREP / STL / OBJ / glTF / GLB
set_assembly_metadataModificar documento XCAF o metadatos por componente

Malla y visualización

HerramientaPropósito
generate_meshTeselar a triángulos + métricas de calidad
simplify_meshDecimación de malla QEM a .stl/.obj — envuelve el Mesh.simplified de OCCTSwiftMesh (meshoptimizer incluido)
render_previewRepresentación PNG de una sola toma con etiquetas de medición y superposiciones de primitivas. Los cuerpos a escala de malla (escaneos importados, >10k bordes) se representan mediante una ruta lineal en segundos — superposiciones de bordes mantenidas hasta 100k bordes, solo superficie más allá
pick_surface_pointLanzar un rayo enmarcado por render_preview a través de un píxel → punto de superficie mundial + selectionId (utilizable como ancla add_dimension)
generate_drawingDibujo técnico DXF multi-vista ISO 128-30 — bodyId para una sola pieza, o bodyIds (2+) para una hoja de ensamblaje de disposición general con lista de piezas + globos

Grafo de topología (bajo nivel)

HerramientaPropósito
graph_validateValidar el grafo de topología de un BREP (ruta sin procesar)
graph_compactEliminar nodos de grafo no referenciados; escribir BREP reconstruido
graph_dedupDeduplicar geometría de superficie / curva compartida
graph_mlExportar topología + muestras UV/borde como JSON amigable para ML
graph_selectAdyacencia / selección local de grafo: vecinos de cara (+ convexidad), caras de borde, bordes de vértice, adyacencia de cara (gAAG), clases de borde
feature_recognizeBolsillos + agujeros (ruta BREP sin procesar; recognize_features es el envoltorio consciente de escena)

Grafo de reconstrucción (lectura/escritura)

LLM lectura/escritura sobre un grafo de reconstrucción atribuido — anotar decisiones por nodo y persistirlas. Respaldado por el NodeAttributeStore de OCCTSwift 1.2.0 + GraphSnapshot Codable. Los nodos se abordan como <kind>:<index> (por ejemplo, face:3). El motor de reconstrucción (ajuste de superficies, detección de congruencia) vive en OCCTReconstruct; estas herramientas son la capa de anotar-y-persistir — reconstruct_force_fit registra una anulación para que el motor la honre, no re-ajusta aquí.

HerramientaPropósito
reconstruct_get_graphExportar el grafo atribuido como JSON — recuentos de topología, nodos anotados (con atributos reconstruct.*), clústeres de instancias. Inicia una sesión desde un bodyId o lee una existente por sessionId
reconstruct_set_decisionAnotar el decidedBy de un nodo (geométrico / ml / humano) y/o aceptar-rechazar un ajuste propuesto
reconstruct_force_fitAnular el tipo de superficie ajustada de un nodo (por ejemplo, forzar cylinder)
reconstruct_confirm_instancesConfirmar / rechazar un clúster de congruencia ("estos N nodos son una definición de pieza")
reconstruct_export_sessionEscribir la instantánea de sesión al disco (JSON estable en bytes)
reconstruct_import_sessionRecargar un archivo de instantánea en una sesión

Implementaciones

Este repositorio incluye dos implementaciones lado a lado:

  • Swift (Sources/, Package.swift): el servidor principal. En proceso contra OCCTSwift / OCCTSwiftMesh / OCCTSwiftTools / OCCTSwiftAIS / DrawingComposer usando el SDK oficial de Swift MCP. 79 herramientas. macOS 15+ (la plataforma arm64 de OCCT.xcframework).
  • Node / TypeScript (src/, dist/) — la implementación original. Ejecuta el CLI occtkit para todo lo del lado Swift. 37 herramientas (la superficie previa a v0.4; selección / reasignación / anotaciones son solo Swift). Útil si no puedes ejecutar un binario de macOS.

Ambos hablan stdio MCP y leen/escriben el mismo formato de manifiesto.

Requisitos previos

  • macOS 15+ (para la implementación Swift)
  • Swift 6.1+ / Xcode 16+
  • Solo para la implementación Node: Node.js 18+, más un clon hermano de OCCTSwiftScripts para que occtkit esté en $PATH (o make install)

Configuración

Implementación Swift (recomendada)

git clone https://github.com/SecondMouseAU/OCCTMCP.git
cd OCCTMCP
swift build -c release

En el .mcp.json de Claude Code:

{
  "mcpServers": {
    "occtmcp": {
      "command": "/path/to/OCCTMCP/.build/release/occtmcp-server"
    }
  }
}

El paquete Swift está publicado en el Swift Package Index.

Implementación Node

git clone https://github.com/SecondMouseAU/OCCTMCP.git
cd OCCTMCP
npm install
npm run build

En .mcp.json:

{
  "mcpServers": {
    "occtmcp": {
      "command": "node",
      "args": ["/path/to/OCCTMCP/dist/index.js"]
    }
  }
}

Ejemplo

El LLM puede crear modelos CAD componiendo herramientas tipadas — la mayoría de los flujos cotidianos nunca tocan execute_script:

boolean_op(op: "subtract", aBodyId: "block", bBodyId: "hole", outputBodyId: "drilled")
  → "drilled" body added to the scene
select_topology(bodyId: "drilled", kind: "face", limit: 1)
  → returns selectionId "sel:drilled#face[12]"
add_dimension(kind: "linear", anchors: [...]) ; render_preview()

Para geometría novedosa, entra en execute_script con la API completa de OCCTSwift:

import OCCTSwift
import ScriptHarness

let ctx = ScriptContext()
let C = ScriptContext.Colors.self

let box = Shape.box(width: 40, height: 30, depth: 20)!
let hole = Shape.cylinder(radius: 5, height: 30)!
    .translated(by: SIMD3(20, -1, 10))!
let result = box.subtracting(hole)!
let filleted = result.filleted(radius: 2.0)!

try ctx.add(filleted, id: "part", color: C.steel, name: "Bracket")
try ctx.emit(description: "Filleted bracket with mounting hole")

Categorías de API

La herramienta get_api_reference proporciona documentación para:

  • primitivas — caja, cilindro, esfera, cono, toro, cuña
  • barridos — extrusión, revolución, barrido de tubería, loft, reglada
  • booleanos — unión, resta, intersección, sección
  • modificaciones — redondeo, chaflán, cáscara, desplazamiento, ángulo de salida, eliminación de características
  • transformaciones — trasladar, rotar, escalar, reflejar
  • alambres — rectángulo, círculo, polígono, spline, hélice, desplazamiento
  • curvas2d/3d — línea, arco, elipse, bspline, bezier, interpolar
  • superficies — plano, cilindro, cono, esfera, extrusión, revolución, placa
  • análisis — volumen, área, distancia, límites, validación
  • importar_exportar — STL, STEP, IGES, BREP, OBJ, PLY
  • herramientas_mcp — el JSON Schema de cada herramienta MCP (útil para el auto-descubrimiento del LLM)

Versionado

OCCTMCP sigue Semantic Versioning. El puerto Swift alcanzó v1.0.0 el 2026-05-09 — completo en características contra la implementación Node original, más una capa de herramientas de selección / reasignación / anotación que son solo Swift.

Las versiones están etiquetadas en GitHub. La rama main es la que SPI rastrea.

Licencia

LGPL-2.1-o posterior — igual que OCCTSwift.