Skip to main content
Glama

WEFT — WEFT Elaborates FPGA Toolchains

Un servidor MCP que ofrece a un cliente LLM una interfaz segura y estructurada para un flujo FPGA Intel Quartus Prime 25.1: lint y simulación en segundos, compilación asíncrona, y lectura de resultados como JSON en lugar de megabytes de registro.

El nombre es un acrónimo recursivo al estilo GNU. La trama es el hilo que se teje a lo largo de la urdimbre para formar el tejido, y enrutar la lógica en el tejido FPGA es precisamente el trabajo.

Estado

WEFT está en construcción, hito a hito. Lo que está terminado hoy:

Herramienta

Estado

lint

funcionando — Verilator para Verilog y SystemVerilog, GHDL para VHDL

simulate

funcionando — Verilator, Icarus o GHDL, con captura de formas de onda

Proyectos Quartus

funcionando — create_project, set_assignments, get_project_info, list_projects

Compilación Quartus

funcionando — start_compile como trabajo persistente, get_job_status, get_job_log, cancel_job

parse_reports

funcionando — recursos, tiempos por reloj, mensajes clasificados

Indexación de fuentes

funcionando — index_project, get_module_info, get_hierarchy, search_code

RAG de documentos con OCR

aún no

Generación de documentación

aún no

Programación de dispositivos

aún no

Ambos transportes funcionan: stdio para un cliente local, Streamable HTTP detrás de un token Bearer estático para un cliente en la LAN.

Related MCP server: fpgaZeroMCP

Para qué sirve esto, si MCP es nuevo para ti

Supón que un banco de pruebas falla y quieres la ayuda de un modelo. Hoy copias el archivo en una ventana de chat, ejecutas Verilator tú mismo, pegas una pantalla llena de %Warning-WIDTHEXPAND después, lees la respuesta, aplicas la corrección a mano, y vuelves a empezar. El diseño tiene tres archivos de profundidad, así que o pegas los tres o el modelo adivina los dos que omitiste — y adivinará, con seguridad. La respuesta que obtienes trata sobre el texto que pegaste, que no es necesariamente lo que hay en el disco.

MCP, el Model Context Protocol, elimina el trasiego. Un servidor anuncia una lista de herramientas y los argumentos que acepta cada una. Un cliente LLM — Claude Desktop, Claude Code, o cualquier otra cosa que hable el protocolo — pone esa lista delante del modelo. Tú sigues escribiendo prosa. El modelo elige una herramienta, rellena los argumentos, y el cliente envía la llamada. WEFT es el servidor en el otro extremo. No contiene ningún modelo, no ejecuta inferencia, y no hace llamadas de red en tiempo de ejecución.

Cuando el modelo llama a lint, WEFT resuelve cada ruta contra la raíz de tu espacio de trabajo, rechaza cualquier cosa que se escape de ella, y ejecuta aproximadamente esto:

podman run --rm --network=none -v <workspace>:/work -w /work weft-tools \
    verilator --lint-only -Isrc src/updown_counter.sv

Verilator imprime lo que siempre imprime. WEFT convierte eso en registros — archivo, línea, gravedad, mensaje — y el contenedor desaparece. simulate es el mismo bucle alrededor de Verilator, Icarus o GHDL, devolviendo aprobado/fallido, una cola del registro y la ruta a la forma de onda.

El límite importa más que la fontanería: el modelo elige qué intentar, WEFT elige qué puede ejecutarse. No hay shell en el otro extremo. El modelo no puede inventar una opción, no puede alcanzar una ruta que no le hayas abierto, y no puede ejecutar nada que no esté en la lista.

La otra razón para envolver las herramientas es el tamaño. Una compilación de Quartus deja megabytes de .rpt detrás, y lo que querías de ella era una línea de recursos, un Fmax por dominio de reloj, y los dos avisos que importaban. Los resultados de las herramientas aquí son unos pocos kilobytes de JSON; los registros brutos permanecen en el disco y se obtienen por nombre cuando algo realmente los necesita.

Nada de esto diseña nada. No escribirá tu RTL, no cerrará tu temporización, ni sabrá qué placa hay en tu escritorio. Ejecuta los comandos que tú habrías ejecutado, y devuelve algo lo bastante pequeño como para razonar sobre ello.

Cómo está montado

Quartus se ejecuta en el host — WEFT maneja la instalación que ya tienes y nunca intenta instalarla o contenerizarla. Todo lo demás que WEFT ejecuta vive en una imagen de Podman, weft-tools: Verilator, Icarus Verilog, GHDL y Verible para trabajo HDL, Tesseract y Poppler para leer documentos. El contenedor se ejecuta con --network=none y no ve nada más que tu espacio de trabajo.

Cada ruta que un cliente MCP proporciona se resuelve y se comprueba contra la raíz del espacio de trabajo configurada antes de llegar al sistema de archivos, tanto en el host como dentro del contenedor.

Nada llega a la red en tiempo de ejecución, y nada reporta telemetría.

El diseño completo — los argumentos y la forma de retorno de cada herramienta, los hitos, y el razonamiento detrás de las partes incómodas — está en PROJECT.md.

Requisitos

  • Quartus Prime 25.1 (Lite, Standard o Pro) instalado y licenciado por ti

  • Podman, rootless

  • Python 3.11 o más reciente

  • jtagd para programar hardware, cuando ese hito llegue

Inicio rápido

Arch Linux

sudo pacman -S --needed podman python git

git clone https://github.com/FPGArtktic/weft-mcp.git
cd weft-mcp
podman build -t weft-tools -f containers/Containerfile.weft-tools .
pip install --user .

Ubuntu 24.04 LTS

sudo apt update
sudo apt install podman uidmap python3 python3-pip git

git clone https://github.com/FPGArtktic/weft-mcp.git
cd weft-mcp
podman build -t weft-tools -f containers/Containerfile.weft-tools .
pip install --user .

uidmap es solo un Recommends de podman, así que un apt install simple lo incluye, pero --no-install-recommends no. Podman rootless lo necesita.

Ubuntu 22.04 incluye Python 3.10, que está por debajo de lo que WEFT necesita. O bien muévete a 24.04 o instala un intérprete más reciente, por ejemplo con uv:

uv venv --python 3.12 && uv pip install .

Construir la imagen

La imagen nunca se distribuye — la construyes tú, lo que mantiene la distribución de WEFT como código solo GPL-3.0 y evita enviar un agregado de binarios de terceros bajo licencias mixtas. podman build es el único paso que necesita acceso a la red; todo lo demás se ejecuta sin conexión.

GHDL se compila desde el código fuente durante la construcción, así que espera que tarde un buen rato la primera vez.

Configuración

WEFT lee un único archivo TOML, por defecto ~/.config/weft/weft.toml:

[workspace]
# Nothing outside this directory can be read or written.
root = "/home/you/fpga"

[container]
image = "weft-tools"

[quartus]
edition = "lite"          # omit when only one edition is configured

[quartus.lite]
root = "/home/you/intelFPGA_lite/25.1std/quartus"

[quartus.pro]
root = "/opt/intelFPGA_pro/25.1/quartus"
# FlexLM variables are passed through to every Pro invocation.
env = { LM_LICENSE_FILE = "1800@licence-server" }

[jobs]
timeout_s = 7200

[http]
host = "127.0.0.1"
port = 8080
token = "put-a-long-random-string-here"

Las rutas de Quartus siempre vienen de aquí. WEFT nunca las adivina y nunca busca en PATH. Una máquina sin Quartus simplemente omite la sección — lint y simulate no la necesitan.

Las claves desconocidas se rechazan en lugar de ignorarse, así que un error tipográfico falla al inicio en lugar de no hacer nada silenciosamente.

Ejecución

Cliente local, a través de stdio:

weft --transport stdio

Para Claude Desktop o Claude Code, regístralo como servidor MCP:

{
  "mcpServers": {
    "weft": {
      "command": "weft",
      "args": ["--transport", "stdio", "--config", "/home/you/.config/weft/weft.toml"]
    }
  }
}

En la LAN, a través de Streamable HTTP:

weft --transport http

Cada solicitud debe llevar Authorization: Bearer <token>; cualquier otra cosa recibe un 401. Establece un token real en la configuración — el transporte HTTP se niega a arrancar sin uno.

Por qué existe un transporte HTTP

Un cliente local no lo necesita; stdio es más simple y no tiene token que pueda filtrarse. HTTP existe porque es el punto de traspaso para ejecutar esto detrás de un modelo que alojas tú mismo, en una red sin salida. Un modelo así, servido tras un endpoint compatible con OpenAI, habla con el mismo endpoint /mcp, y nada cambia en el lado del servidor. WEFT ya no hace llamadas de red en tiempo de ejecución, así que un servidor instalado no necesita nada más.

Construir ese despliegue — el clúster de inferencia, la pila de servicio, llevar la imagen y las ruedas a través de la brecha — no forma parte de este repositorio. El Apéndice A de PROJECT.md registra lo que haría falta y se detiene ahí, deliberadamente.

El proyecto de demostración

examples/counter/ es un pequeño contador MAX 10 escrito en SystemVerilog, Verilog-2001 y VHDL a la vez. Los tres lenguajes son el punto: ningún simulador de código abierto lee más de uno, así que el proyecto es una prueba justa de si una herramienta realmente maneja una jerarquía mixta o solo lo afirma.

Contribuciones

Los parches son bienvenidos. WEFT sigue las costumbres del kernel de Linux: un cambio lógico por commit, asuntos subsystem: summary, un cuerpo que explique el porqué, rebase en lugar de merge, y una línea Signed-off-by: en todo. Consulta CONTRIBUTING.md.

Autor

WEFT está escrito y mantenido por Mateusz Okulanisfpgartktic.github.io, @FPGArtktic, FPGArtktic@outlook.com.

Los informes de errores, los parches y los desacuerdos son todos bienvenidos — especialmente los últimos, si has llevado esta cadena de herramientas más lejos de lo que yo lo he hecho.

Licencia

Copyright (C) 2026 Mateusz Okulanis.

GPL-3.0-only. El texto completo está en COPYING.

WEFT invoca a Quartus y a las herramientas contenerizadas como programas separados y no distribuye ninguna de ellas.

Marcas comerciales

Intel, Altera y Quartus son marcas comerciales de sus respectivos propietarios. Este proyecto no está afiliado a Intel o Altera, ni respaldado ni patrocinado por ellos. No contiene código, archivos ni documentación de Intel o Altera, y no instala ni redistribuye su software.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Provides programmatic access to Arcas OnlineEDA platform for electronic design automation, enabling formal verification, equivalence checking, power analysis, security verification, and FPGA design through natural language and automated workflows.
    5
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides AI assistants with a complete FPGA toolchain for HDL linting, simulation, synthesis, and place-and-route across various hardware targets. It features a GitHub-backed IP core registry that enables users to search for and import MIT-licensed cores directly through their chat interface.
    15
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Wraps Quartus II 9.1 command-line tools into MCP tools, enabling AI agents to create projects, assign pins, generate simulation waveforms, run simulations, compile, read reports, and program devices.
    16
    4
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to drive Xilinx Vivado, Intel Quartus, and Anlogic TangDynasty for FPGA development, including project creation, synthesis, implementation, timing closure, and hardware programming through natural language.
    MIT

View all related MCP servers

Related MCP Connectors

  • Deterministic validation for AI-generated artifacts: JSON Schema, OpenAPI response, SQL syntax.

  • Proves AI-generated Python does what you asked: lint, types, security, sandbox run, exact fixes.

  • Compiles structured specs into SCORM 1.2/2004 e-learning packages. 30 tools, quality gate, no LLM.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/FPGArtktic/weft-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server