Un CAD que maneja una IA: qué es MCP y cómo usarlo con LinceCAD
Los asistentes de IA ya no solo responden preguntas: también pueden usar programas, si el programa les ofrece una forma de hacerlo. Esa forma es, cada vez más, MCP. LinceCAD trae un servidor MCP, de modo que un asistente puede abrir un DWG, consultarlo, dibujar, acotar y guardar mientras tú decides qué cambios acepta. En este artículo explicamos qué es MCP, qué permite exactamente el servidor de LinceCAD y cómo es una sesión real.
Qué es MCP
El Model Context Protocol es un protocolo abierto, publicado por Anthropic en noviembre de 2024, para conectar aplicaciones de IA con programas y datos. Tiene dos partes:
- El cliente es la aplicación de IA: Claude Desktop, Claude Code u otra que admita MCP.
- El servidor es el programa que se deja manejar. Declara herramientas (acciones con parámetros), recursos (datos que se pueden leer) y prompts (instrucciones preparadas para tareas habituales).
Los mensajes son JSON-RPC 2.0 y viajan por la entrada y la salida estándar (el cliente arranca el servidor) o por HTTP. El modelo de IA elige qué herramienta llamar y con qué datos; el cliente hace la llamada y le devuelve el resultado. El servidor no necesita saber qué modelo hay al otro lado.
Qué permite el servidor MCP de LinceCAD
El servidor se arranca con lince --mcp y habla por la entrada y la salida estándar. Con LinceCAD
abierto se puede activar además un servidor MCP por HTTP, solo en 127.0.0.1. Admite las versiones del
protocolo 2025-06-18, 2025-03-26 y 2024-11-05, y ofrece 23 herramientas:
| Para | Herramientas |
|---|---|
| Dibujos | list_drawings, open_drawing, new_drawing, save_drawing, drawing_summary |
| Consultar | query_entities, get_entity, list_layers, list_blocks, list_block_library, get_variable, capture_view |
| Cambiar | create_entities, modify_entity, delete_entities, manage_layer, set_variable, add_dimension, insert_block |
| Comandos y AutoLISP | run_command, eval_lisp |
| Salida y control | plot_pdf, undo |
Algunos detalles que importan en la práctica:
capture_viewdevuelve una imagen PNG de la vista, así que el asistente puede ver el plano y comprobar lo que ha dibujado.run_commandejecuta cualquier comando con sus respuestas, con el nombre inglés precedido de guion bajo (_LINE,_DIMLINEAR), que funciona en cualquier idioma.- Cada herramienta se marca como de solo lectura o destructiva, para que el cliente sepa cuáles pedir confirmar.
- Los recursos dan el resumen, las entidades, las capas, los bloques y las variables de cada
dibujo abierto (
lince://drawing/{id}/summary…), y las páginas de la ayuda de LinceCAD en español e inglés (lince://help/{lang}/{id}) como documentación para el asistente. - Hay tres prompts:
review_drawing(revisar el plano sin cambiarlo),dimension_floor_plan(acotar una planta) yclean_layers(proponer una limpieza de capas y esperar confirmación).
Cómo conectarlo
Claude Desktop, en %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"lince": { "command": "C:\\Program Files\\lince\\lince.exe", "args": ["--mcp"] }
}
}
Claude Code, sin ventana y en un proyecto:
claude mcp add --scope project lince -- "C:\Program Files\lince\lince.exe" --mcp
Con LinceCAD abierto: en OPCIONES, pestaña Automatización, activa
la automatización y el servidor MCP por HTTP. La ficha (la contraseña que presentan los clientes) está en
api.toml, en %APPDATA%\lince en Windows o ~/.config/lince en Linux:
claude mcp add --transport http lince http://127.0.0.1:7341/mcp --header "Authorization: Bearer <ficha>"
Cualquier otro cliente MCP que arranque un servidor por la entrada y la salida estándar se configura igual: la
orden es lince.exe y el argumento, --mcp.
Un ejemplo real
Para ver qué pasa por debajo, hemos hecho de cliente con un script de Python, sin IA de por medio: arranca
lince.exe --mcp, se presenta, pide la lista de herramientas y hace las llamadas que haría un asistente
ante una orden como «crea la capa MUROS en rojo, dibuja un rectángulo de 8 × 5 m, acota el lado de abajo y guárdalo
como planta.dwg». Las coordenadas van en milímetros.
import json, subprocess
lince = subprocess.Popen([r"C:\Program Files\lince\lince.exe", "--mcp"],
stdin=subprocess.PIPE, stdout=subprocess.PIPE)
n = 0
def send(method, params=None, notify=False):
global n
msg = {"jsonrpc": "2.0", "method": method, "params": params or {}}
if not notify:
n += 1
msg["id"] = n
lince.stdin.write((json.dumps(msg) + "\n").encode())
lince.stdin.flush()
return None if notify else json.loads(lince.stdout.readline())["result"]
def tool(tool_name, /, **args):
r = send("tools/call", {"name": tool_name, "arguments": args})
return r["content"][0]["text"]
info = send("initialize", {"protocolVersion": "2025-06-18", "capabilities": {},
"clientInfo": {"name": "blog", "version": "1"}})
send("notifications/initialized", notify=True)
print(info["serverInfo"])
print(len(send("tools/list")["tools"]), "tools")
tool("manage_layer", action="create", name="MUROS", color=1)
print(tool("create_entities", entities=[{"type": "LWPOLYLINE", "layer": "MUROS", "closed": True,
"vertices": [[0, 0], [8000, 0], [8000, 5000], [0, 5000]]}]))
tool("add_dimension", kind="linear", points=[[0, 0], [8000, 0]],
textPosition=[4000, -800], layer="COTAS")
print(tool("drawing_summary"))
print(tool("save_drawing", path=r"C:\planos\planta.dwg"))
lince.stdin.close()
lince.wait()
Esta es la salida real con LinceCAD 0.9.8-rc3 (solo hemos cambiado la ruta del archivo guardado por la del ejemplo):
{'name': 'lince', 'title': 'LinceCAD', 'version': '0.9.8-rc3'}
23 tools
{"handles":["51"]}
{"document":{"id":1,"name":"Dibujo1.dwg","path":null,"modified":true,"active":true,"version":"AC1032","entities":2},"extents":[[0.0,-801.25],[8000.0,5000.0]],"units":0,"byType":{"DIMENSION":1,"LWPOLYLINE":1},"byLayer":{"COTAS":1,"MUROS":1},"layers":3,"blocks":0,"currentLayer":"COTAS"}
{"path":"C:\\planos\\planta.dwg","version":"AC1032"}
El resumen confirma lo que se pidió: una polilínea en la capa MUROS, una cota en COTAS y tres capas en total (la
0 y las dos nuevas). La cota la crea add_dimension ejecutando ACOLINEAL, el mismo
comando que usarías a mano. En las pruebas de desarrollo, Claude Code hizo de cliente real: creó un círculo y una
línea y leyó el resumen del dibujo.
Qué controla el usuario
- Aprobación de cambios. Con LinceCAD abierto y la confirmación activada, cada cambio que pide
el asistente espera en la paleta
ACCIONESIAhasta que pulsas Aceptar o Rechazar. Aceptar todo en esta sesión deja de preguntar hasta cerrar el programa. Las lecturas no se preguntan. - Un paso de deshacer por llamada. Todo lo que cambia una llamada se deshace con un solo
DESHACER, y el asistente tiene su propia herramientaundo. - Solo lectura y carpetas permitidas. En
OPCIONESpuedes impedir cualquier cambio o limitar las carpetas donde se abre, se guarda y se traza. Sin ventana (--mcp) no se pregunta nada, pero valen esas dos limitaciones. - Registro. La paleta guarda las últimas 500 llamadas, con la hora y el error si lo hubo.
- Todo local. LinceCAD no envía nada fuera del equipo. Ten en cuenta, eso sí, que lo que lee el asistente (resúmenes, entidades, capturas) llega al servicio de IA que use tu cliente, según sus condiciones.
Límites
- Las entidades se crean y se consultan en el espacio modelo. El color verdadero se lee, pero no se escribe.
eval_lispfalla si la rutina pide datos al usuario (getpoint,entsel…).- El servidor HTTP no guarda la sesión MCP entre peticiones. En Linux,
lince --mcpnecesita una sesión gráfica (oxvfb-run). - El asistente puede equivocarse: revisa los cambios antes de aceptarlos y trabaja sobre copias mientras LinceCAD esté en beta.
Preguntas frecuentes
¿Necesito saber programar? No para MCP: configuras el cliente una vez y das las órdenes en lenguaje normal. Si prefieres scripts, lee automatizar dibujos DWG con Python.
¿Dónde está la referencia completa? En el tema Automatización (API y MCP) del manual.
¿Sirve como alternativa a AutoCAD LT? Depende de tu trabajo; lo repasamos en LinceCAD frente a AutoCAD LT.
El servidor MCP, la API local y AutoLISP vienen en LinceCAD, con licencia perpetua. Descargas · Ver precios · Automatización y el resto de funciones.