OCCTMCP
Interacción analítica con modelos CAD construidos sobre el núcleo CAD OCCT
Documentación
OCCTMCP
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
| Herramienta | Propósito |
|---|---|
execute_script | Escribir y ejecutar código Swift CAD arbitrario (API completa de OCCTSwift) |
get_script | Leer el código fuente del script más reciente |
get_api_reference | Explorar la API de OCCTSwift por categoría |
Lecturas de escena
| Herramienta | Propósito |
|---|---|
get_scene | Leer el manifiesto de escena actual (cuerpos, colores, materiales) |
export_model | Listar rutas de archivos BREP / STEP / STL / OBJ exportados |
compare_versions | Diferenciar la escena actual vs. N ejecuciones atrás (añadido / eliminado / apariencia / archivo cambiado) |
Mutación de escena
| Herramienta | Propósito |
|---|---|
remove_body | Eliminar un cuerpo de la escena (manifiesto + archivo BREP) |
clear_scene | Borrar todos los cuerpos, opcionalmente conservar el historial de diferencias |
rename_body | Cambiar el id de un cuerpo |
set_appearance | Actualizar color / opacidad / rugosidad / metálico / nombre de visualización |
Introspección
| Herramienta | Propósito |
|---|---|
validate_geometry | Validación de topología por cuerpo (isValid, conteos de errores) |
compute_metrics | Volumen, área, centroide, caja delimitadora, ejes principales |
query_topology | Encontrar 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_distance | Distancia mínima + contactos entre dos cuerpos |
measure_deviation | Desviació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_features | Bolsillos y agujeros mediante heurísticas AAG |
inspect_assembly | Recorrer un árbol de ensamblaje XCAF (STEP / IGES / XBF) |
Construcción
| Herramienta | Propósito |
|---|---|
apply_feature | Taladrar / redondear / chaflanar / extruir / revolver / roscar / booleano (FeatureSpec) |
transform_body | Trasladar / rotar / escalar uniformemente (registra historial de identidad para remapeo) |
boolean_op | Unión / resta / intersección / dividir (registra historial por entrada para remapeo) |
mirror_or_pattern | Reflejar / patrón lineal / circular → N cuerpos nuevos |
Análisis de ingeniería
| Herramienta | Propósito |
|---|---|
check_thickness | Análisis de espesor de pared con banderas de región delgada |
analyze_clearance | Interferencia por pares / holgura mínima |
heal_shape | Sanar 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:
| Familia | Mide hasta | ¿Movida por signMode? |
|---|---|---|
Sin signo — max / rms / mean / p95 / worstPoint / symmetricHausdorff / maxAbs / withinTolerance | la superficie de referencia más cercana, sea cual sea | No — mismo significado que pre-v1.17 |
Firmada — signedMean / signedMin / signedMax / sections / cubos de histograma / colores de mapa de calor | la superficie a la que la muestra corresponde | Sí |
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.
| Herramienta | Propósito |
|---|---|
deviation_histogram | Distribució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_compare | Rebanar 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_heatmap | Renderizar 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_render | Renderizar 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.
| Herramienta | Propósito |
|---|---|
segment_mesh_zones | Dividir 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_sweep | Barrer 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_zones | Inspeccionar el registro de zonas (<output_dir>/zones.json) |
clear_zones | Borrar 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.
| Herramienta | Propósito |
|---|---|
mesh_diagnose | Informe 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_thickness | Espesor 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_symmetry | Detectar 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_curvature | Curvatura 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
| Herramienta | Propósito |
|---|---|
select_topology | Seleccionar 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_selection | Llevar 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_correspondences | Mapear 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_feature | Selección masiva por tipo de característica (por ejemplo, todos los bordes de agujeros) |
list_selections | Inspeccionar el registro de selección en memoria |
clear_selections | Limpiar 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
| Herramienta | Propósito |
|---|---|
add_dimension | Agregar una dimensión lineal / angular / radial; se representa en render_preview |
add_scene_primitive | Agregar triedro / plano de trabajo / eje / nube de puntos / caja delimitadora / marcador de diferencia |
auto_dimension | Colocación heurística de dimensiones para las extensiones principales |
show_bounding_box | Agregar el AABB de un cuerpo como superposición |
diff_overlay | Visualizar la diferencia entre dos instantáneas |
remove_scene_annotation | Eliminar una dimensión o primitiva por id |
list_annotations | Inspeccionar el archivo lateral de anotaciones |
E/S
| Herramienta | Propósito |
|---|---|
read_brep | Cargar un .brep desde el disco a la escena (allowInvalid carga una forma de cara suelta / inválida para medición) |
import_file | Importación multi-formato (STEP / IGES / STL / OBJ); ensamblaje XCAF opcional; allowInvalid para reconstrucciones en curso |
export_scene | Exportar a STEP / IGES / BREP / STL / OBJ / glTF / GLB |
set_assembly_metadata | Modificar documento XCAF o metadatos por componente |
Malla y visualización
| Herramienta | Propósito |
|---|---|
generate_mesh | Teselar a triángulos + métricas de calidad |
simplify_mesh | Decimación de malla QEM a .stl/.obj — envuelve el Mesh.simplified de OCCTSwiftMesh (meshoptimizer incluido) |
render_preview | Representació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_point | Lanzar un rayo enmarcado por render_preview a través de un píxel → punto de superficie mundial + selectionId (utilizable como ancla add_dimension) |
generate_drawing | Dibujo 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)
| Herramienta | Propósito |
|---|---|
graph_validate | Validar el grafo de topología de un BREP (ruta sin procesar) |
graph_compact | Eliminar nodos de grafo no referenciados; escribir BREP reconstruido |
graph_dedup | Deduplicar geometría de superficie / curva compartida |
graph_ml | Exportar topología + muestras UV/borde como JSON amigable para ML |
graph_select | Adyacencia / selección local de grafo: vecinos de cara (+ convexidad), caras de borde, bordes de vértice, adyacencia de cara (gAAG), clases de borde |
feature_recognize | Bolsillos + 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í.
| Herramienta | Propósito |
|---|---|
reconstruct_get_graph | Exportar 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_decision | Anotar el decidedBy de un nodo (geométrico / ml / humano) y/o aceptar-rechazar un ajuste propuesto |
reconstruct_force_fit | Anular el tipo de superficie ajustada de un nodo (por ejemplo, forzar cylinder) |
reconstruct_confirm_instances | Confirmar / rechazar un clúster de congruencia ("estos N nodos son una definición de pieza") |
reconstruct_export_session | Escribir la instantánea de sesión al disco (JSON estable en bytes) |
reconstruct_import_session | Recargar 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 CLIocctkitpara 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
occtkitesté en$PATH(omake 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.