start_session
Start a persistent Vivado TCL session. Must be called before project/design tools. Vivado startup is ~30s; the session is reused across tool calls.
vivado_path
io.github.sinemortalPublished by GitHub account sinemortalv0.5.0Updated Nov 7, 2026
Drive AMD Vivado from AI assistants, with Red Pitaya STEMlab 125-14 build and deploy flows.
Vivado Red's local MCP server; no sign-in required; STDIO; 93 tools.
No AI overview yet: these facts come from the registry entry and the server itself.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
An MCP server that lets an AI assistant such as Claude drive AMD/Xilinx Vivado directly: create projects, build block designs, synthesize, implement, simulate, read timing/utilization reports and generate bitstreams — without opening the Vivado GUI.
It has first-class support for the Red Pitaya STEMlab 125-14 (Zynq
xc7z010clg400-1): you can go from a natural-language description to a
.bit.bin running on the board, using either pure RTL or the official
RedPitaya-FPGA PS+PL (ARM + FPGA) backbone, and deploy it over SSH.
Forked from coreyhahn/vivado_mcp and heavily extended (93 tools): block design / IP Integrator, IP catalog, Hardware Manager, advanced reports, Red Pitaya RTL and PS+PL flows, SSH deploy.
Current version: 0.5.0 — see What's new and CHANGELOG.md.
Not to be confused with the unrelated
vivado-mcppackage on PyPI. This project isvivado-red-mcp: Python modulevivado_red_mcp, commandvivado-red-mcp.
.bit.bin generation, SSH deploy.The RedPitaya-FPGA tutorials in prj/Examples (Led_blink, Knight_rider, Stopwatch,
Frequency_counter) build to a bitstream through the server. Led_blink and
Knight_rider rebuilt from scratch with MCP tools only produce byte-identical
bitstreams to the tutorials' own scripts.
xc7z010).
When installing, you only need Vivado and, under devices, SoCs → Zynq-7000;
Vitis Model Composer and DocNav are not needed.a valid license was not found):
<Vivado>/bin/vlm.bat on Windows, vlm on Linux);Xilinx.lic with Load License → Copy License.PATH (Linux: source <Vivado>/settings64.sh; Windows: add
<Vivado>\bin to PATH), orstart_session
(e.g. C:\AMDDesignTools\2026.1\Vivado\bin\vivado.bat).pexpect (Linux/macOS) or pywinpty (Windows) is installed automatically.
pip pins the MCP SDK to 1.x by itself. Do not upgrade mcp to 2.x: the server
would not start ('Server' object has no attribute 'list_tools').
Once, for all your projects:
If vivado-red-mcp is not on PATH when Claude Code starts (typical with a virtual
environment), point to the venv's Python instead:
Or share it with a single project through a .mcp.json at the project root:
Check it with claude mcp list: vivado should show as connected.
On startup the server downloads the RedPitaya-FPGA repo (source zip) into its
working directory if it is missing, for the PS+PL flow. Set the
environment variable VIVADO_MCP_NO_AUTOFETCH=1 to turn this off; the
rp_fetch_repo tool can still download it on demand.
Talk to Claude in plain language, for example:
PATH)C:/work/my_proj/my_proj.xpr"Claude picks the tools; you never have to call them by name.
Two flows, depending on whether you need the ARM processor:
Example prompt:
Make an LED blinker at 1 Hz for the Red Pitaya using the 125 MHz ADC clock on
led_o[0], build it and give me the.bit.bin.
To load the result on the board, ask Claude to use deploy_to_redpitaya (SSH,
default credentials root/root; works with OS 1.04 xdevcfg and OS 2.00
fpgautil), or copy it yourself:
PS+PL and the RedPitaya-FPGA repo. The current upstream master targets
Vivado 2025.1; older checkouts targeted 2020.1. Both layouts are supported.
rp_setup_workspace copies the repo into a separate workspace and patches only
that copy, so the scripts run on the Vivado you have installed (their exported
block-design/IP scripts otherwise refuse any other release) and without a git
checkout. Your downloaded repo is never modified. Details:
get_vivado_doc redpitaya_ps_pl_flow.
Bundled board data (data/boards/):
red_pitaya_125_14_full.xdc — full pinout (ADC, DAC, LEDs, expansion
connector, XADC), port names as in the official red_pitaya_top
(adc_dat_i[ch][bit], dac_dat_o, exp_p_io, …); checked pin by pin against
upstream sdc/red_pitaya.xdc.red_pitaya_125_14_leds_min.xdc — 125 MHz differential ADC clock + 8 LEDs, for
hello-world designs.red_pitaya_125_14_info.json — part number and board metadata.The RedPitaya tutorials (prj/Examples) use different port names
(adc_dat_a_i, adc_clk_p_i, …) and a PS7 preset (cfg/red_pitaya.xml); use
their own cfg/ files when rebuilding them.
More Italian prompt examples and the step-by-step low-level flow: USAGE.md.
Renamed to vivado-red-mcp (package, Python module vivado_red_mcp, command
vivado-red-mcp), so it no longer clashes with the unrelated vivado-mcp package on
PyPI. If you installed an earlier version, reinstall it and re-register it with
Claude Code using the new command (see Installation).
Works on Vivado 2026.1 and with the current RedPitaya-FPGA repo.
Fixed:
Spawn failed) → fixed.run_tcl was silently corrupted on Windows → fixed.get_timing_summary always returned empty values; get_utilization misread
newer reports → both parse current Vivado output.No open design) → the
latest completed run is opened automatically.get_synthesis_errors_parsed always returned 0 errors → now reads the run logs,
including failed IP runs.launch_simulation modes rejected by recent Vivado → fixed.generate_bitstream timed out after 300 s and didn't check the result → now
verified, returns the .bit path.red_pitaya_125_14_full.xdc had 6 wrong pins (ADC channel A MSB and
dac_dat_o[8..12]) → corrected.New tools: create_bd_port, add_module_to_bd, configure_bd_cell,
set_run_strategy. Full list in CHANGELOG.md.
start_session - Start a persistent Vivado Tcl session (optional vivado_path)stop_session - Stop the Vivado sessionsession_status - Session statisticscheck_session_health - Detect a hung/dead session, optionally recoverget_host_status - Host CPU/memory statuscreate_project - Create a project on disk (default part xc7z010clg400-1)open_project / close_project - Open or close an .xprget_project_info - Part, directory, top, …add_sources / add_constraints - Attach HDL and XDC filesrun_synthesis - Run synthesis (verified run status)run_implementation - Run place and route (verified run status)generate_bitstream - Generate the bitstream (verified status + .bit path)set_run_strategy - Set the synthesis/implementation run strategyReport tools open the latest completed run automatically if no design is open.
get_timing_summary - WNS, TNS, WHS, THS, pulse width, met / not metget_timing_paths - Detailed timing paths for failing/critical pathsget_utilization - LUTs, FFs, BRAMs, DSPs, IOsget_clocks - Clock informationget_messages - Synthesis/implementation messagesget_design_hierarchy - Module/instance hierarchyget_ports - Top-level portsget_nets / get_cells - Search nets and cellsset_simulation_top - Set the testbench modulelaunch_simulation - Behavioral, post-synthesis or post-implementation
(functional/timing)run_simulation / step_simulation / restart_simulation / close_simulationget_simulation_timeget_signal_value / get_signal_values - Read signalsget_simulation_objects / get_scopes - Browse the hierarchyadd_signals_to_waveadd_breakpoint / remove_breakpointsget_simulation_messagescreate_block_design - Create a block design and make it currentcreate_bd_port - Scalar, vector or interface portsadd_ip_to_bd - Add an IP core (VLNV) with CONFIG.* propertiesadd_module_to_bd - Add an RTL module as a module-reference cellconfigure_bd_cell - Set CONFIG.* on an existing cell (e.g. PS7 board preset import)connect_bd_net / connect_bd_intf_net - Wire pins/ports and AXI interfacesauto_connect_axi - apply_bd_automation for AXI master ↔ slaveapply_ps7_preset - Zynq PS7 automation (FIXED_IO/DDR external)validate_block_design - Run BD DRCassign_bd_address - Auto-assign AXI address rangesregenerate_bd_layout - Tidy the layoutsave_bd_design / close_bd_design - Persist or close the BDlist_bd_cells - List cellsgenerate_bd_wrapper - make_wrapper + add to fileset + set as topcreate_ip / configure_ip - Create and configure catalog IPsgenerate_ip_target / synth_ip - Output products, out-of-context synthesisupgrade_ip / report_ip_status - Upgrade and audit IP versionsopen_hw_manager / close_hw_managerconnect_hw_server - Connect to hw_server (default localhost:3121)program_device - Program a .bit over JTAGrefresh_hw_device - Re-read the JTAG chainreport_power - Total/dynamic/static powerreport_drc - DRC violations grouped by severityreport_methodology - UltraFast methodology checksreport_qor_assessment - QoR scorereport_clock_interaction - Cross-clock pathsgenerate_full_report / read_report_section - Full reports to file, read them in pieceslist_boards / get_board_info - Bundled board metadata and XDC paths (no Vivado needed)load_board_xdc - Add a bundled board XDC to the projectcreate_redpitaya_project_rtl - One-shot RTL build; returns bit_path,
bin_path, parsed timing_summary and utilizationgenerate_cfgmem - .bit → .bit.bin for /dev/xdevcfg / fpgautilget_synthesis_errors_parsed - Structured errors from the run logs, including
failed IP runsrp_fetch_repo - Download RedPitaya-FPGA (source zip, no git needed)rp_setup_workspace - Isolated, patched copy of the repo to build inrp_list_projects - List prj/* projects, flag the Z10-capable onesrp_workspace_info - Which projects are already builtrp_create_custom_project - Clone a base project for your own PL logicrp_build_project - Setup → synth → impl → bitstream → .bit.bin, with parsed timingdeploy_to_redpitaya - Upload a .bit.bin and load it (xdevcfg on OS 1.04,
fpgautil on OS 2.00)ssh_redpitaya_exec - Run a shell command on the boardlist_vivado_docs / get_vivado_doc - Bundled topics (block_design,
ps7_zynq, timing_constraints, synthesis_strategies, simulation_xsim,
red_pitaya_125_14, redpitaya_ps_pl_flow, tcl_quoting, hw_manager,
ip_integrator, pitfalls_2020_1), each with links to the AMD user guidesrun_tcl - Run any Tcl command or multi-line scriptrun_tcl_script - Source a .tcl filerequest_feature / list_feature_requestsThe server keeps one Vivado process in Tcl mode and talks to it through a
pseudo-terminal, using the Vivado% prompt to know when a command has finished.
Each tool family lives in its own module under tools/; see CLAUDE.md
for the design conventions and known Vivado Tcl pitfalls.
Issues and pull requests are welcome. There is no automated Vivado test in CI (it only checks that every tool has a handler); changes to the Vivado-facing code should be validated against a real Vivado install.
MIT — see LICENSE. Bundled third-party material (Red Pitaya board XDC
files, 3-clause BSD) is listed in THIRD-PARTY-NOTICES.md.
Source: README.md at commit 79ff546
Start a persistent Vivado TCL session. Must be called before project/design tools. Vivado startup is ~30s; the session is reused across tool calls.
vivado_pathStop the Vivado TCL session and free resources.
Takes no parameters.
Get statistics for the current Vivado session (commands run, timing, errors).
Takes no parameters.
Verify the Vivado process is responsive. With auto_recover=true the session is restarted if it hangs.
auto_recoverGet host hostname, free memory, and session state. Useful to check there is enough RAM before launching synthesis/implementation.
Takes no parameters.
Open an existing Vivado project (.xpr file).
project_pathrequiredClose the currently open project.
Takes no parameters.
Get name, part, target language, directory of the open project.
Takes no parameters.
Create a new Vivado project on disk in project mode. Defaults to the Red Pitaya STEMlab 125-14 part (xc7z010clg400-1). Call add_sources / add_constraints next, then run_synthesis.
namerequiredpartforcedirectoryrequiredtarget_languageAdd HDL source files (.v/.sv/.vhd) to the current project. Optionally sets the top module and updates compile order.
filesrequiredfilesetset_topAdd XDC constraint files to the current project.
filesrequiredfilesetList boards with bundled XDC + metadata. No Vivado session required.
Takes no parameters.
Get bundled metadata for a board: part, LED pinout, absolute XDC paths, default synth flags. Use the returned absolute_path values with add_constraints. No Vivado session required.
boardrequiredRun synthesis on the current project (reset_run -> launch_runs synth_1 -> wait_on_run). Returns ground-truth status from the run object, not just text parsing.
jobstimeoutRun implementation (opt_design -> place_design -> route_design). Returns ground-truth status from the impl_1 run object.
jobstimeoutGenerate bitstream — `launch_runs impl_1 -to_step write_bitstream` -> wait_on_run. Returns ground-truth run status and the .bit path.
timeoutSet the strategy of a synthesis or implementation run (e.g. synth_1 'Flow_PerfOptimized_high', impl_1 'Performance_NetDelay_high'). On an unknown name, Vivado's error lists the valid strategies.
runrequiredstrategyrequiredGet timing summary (WNS, TNS, WHS, THS). Returns parsed metrics by default. Use generate_full_report for raw output.
report_typedetail_levelGet failing/critical timing paths. Returns structured summary by default; use detail_level=standard|full for the raw text too.
clockto_pinthroughfrom_pinnum_pathspath_typedetail_levelslack_thresholdResource utilization (LUT/FF/BRAM/DSP/IO). Parsed only by default.
detail_levelhierarchicalmodule_filterthreshold_percentGet clock information and constraints (report_clocks).
Takes no parameters.
Get Vivado messages filtered by severity (error/critical/warning/all).
severityGet the design hierarchy (modules and instances), optionally filtered.
max_depthinstance_patternGet top-level I/O ports of the design.
Takes no parameters.
Search for nets by pattern (default '*').
limitpatternSearch for cells/instances by pattern.
limitpatternLaunch xsim in behavioral/post-synth/post-impl mode.
modeRun the simulation for a specified time (e.g. 100ns, 1us, all).
timerequiredRestart the simulation from time 0.
Takes no parameters.
Close the current simulation.
Takes no parameters.
Get the current simulation time (current_time).
Takes no parameters.
Get current value of a signal in simulation.
radixsignalrequiredGet values of multiple signals matching a wildcard pattern (max 50).
radixpatternrequiredAdd signals to the waveform viewer.
signalsrequiredSet the top-level testbench module for simulation.
filesettop_modulerequiredList simulation objects in a scope (signals/ports/internal).
scopefilterList child scopes (hierarchy) in the simulation.
parentStep simulation by delta cycles.
countAdd a breakpoint on signal edge or change.
signalrequiredconditionRemove all breakpoints (remove_bps -all).
Takes no parameters.
Get simulation log messages filtered by severity.
severityExecute a raw TCL command in Vivado. Use for advanced ops not covered by other tools.
commandrequiredtimeoutSource a .tcl script file in the Vivado session (uses `source` under the hood). Helpful for replaying canonical Red Pitaya / Xilinx reference scripts.
pathrequiredtimeoutCreate a new block design and make it current. Optionally sets the board_part property on the project beforehand (board_part requires the BSP to be installed in Vivado).
namerequiredboard_partSave the currently open block design to disk.
Takes no parameters.
Close the currently open block design (without deleting).
Takes no parameters.
List cells in the current block design (optionally filtered).
filterAdd an IP core to the current block design (`create_bd_cell -type ip -vlnv ...`). If `config` is provided, the CONFIG.* keys are applied via set_property -dict.
vlnvrequiredconfigcell_namerequiredCreate a top-level port on the current block design. Scalar or vector (`from`/`to`) via create_bd_port, or an interface port when `vlnv` is given (create_bd_intf_port, e.g. the XADC 'xilinx.com:interface:diff_analog_io_rtl:1.0'). Port names must match the constraints (XDC) of the board.
tofrommodenamerequiredtypevlnvdirectionAdd an RTL module (Verilog/VHDL already in the project, see add_sources) to the current block design as a module-reference cell (`create_bd_cell -type module -reference`). Optional `config` sets its parameters, e.g. {'CONFIG.WIDTH': '8'}; string parameters keep their quotes, e.g. {'CONFIG.init': '"0011"'}.
configmodulerequiredcell_namerequiredSet CONFIG.* properties on an existing block-design cell (set_property -dict). Use for settings that must be applied after creation or in a separate step, e.g. importing a PS7 board preset: {'CONFIG.PCW_IMPORT_BOARD_PRESET': '<path>/red_pitaya.xml'}.
configrequiredcell_namerequiredConnect two scalar pins/ports in the current block design.
pin_torequiredpin_fromrequiredConnect two AXI/interface pins in the current block design.
intf_torequiredintf_fromrequiredUse `apply_bd_automation -rule xilinx.com:bd_rule:axi4` to wire an AXI master to a slave (inserts AXI interconnect + clock/reset hookups).
slaverequiredmasterrequiredoptionsApply the Zynq-7000 processing_system7 board preset to a PS7 cell — wires FIXED_IO / DDR / clocks per the board definition. Equivalent to clicking 'Run Block Automation' on a freshly added PS7 in the GUI.
cellapply_board_presetRun validate_bd_design and return parsed status. Failures include unconnected pins, conflicting CONFIG values, or missing assignments.
Takes no parameters.
Regenerate the block design layout (cosmetic; useful before save).
Takes no parameters.
Auto-assign addresses in the BD address editor (assign_bd_address).
Takes no parameters.
Generate the HDL wrapper for a block design and (by default) add it to sources_1 and set it as project top. Implements the canonical pattern: make_wrapper -files <bd> -top; add_files -norecurse <wrapper>; set_property top <wrapper> [current_fileset]; update_compile_order.
bd_namerequiredset_topCreate an IP from the Xilinx IP catalog. Generates a .xci file in the project's IP sources fileset. Use configure_ip + generate_ip_target afterwards, then run synth_ip if you want out-of-context synthesis.
vendorip_namerequiredlibraryversionmodule_namerequiredSet CONFIG.* properties on an existing IP via set_property -dict.
configrequiredmodule_namerequiredGenerate IP output products (synthesis + simulation by default).
targetsmodule_namerequiredRun out-of-context (OOC) synthesis on an IP.
module_namerequiredUpgrade IP version (no-op if already at latest).
module_nameGet a structured snapshot of the project's IP and their upgrade status.
Takes no parameters.
Open the Hardware Manager (no JTAG connection yet).
Takes no parameters.
Close the Hardware Manager.
Takes no parameters.
Connect to a hw_server (cs_server). Default URL is localhost:3121 — the value Vivado uses when running hw_server locally.
urlRefresh the currently selected hardware device (re-reads JTAG chain state). Call after re-plugging a cable.
Takes no parameters.
Program a .bit onto the first device on the JTAG chain. Sequence: open_hw_target -> set PROGRAM.FILE -> program_hw_devices. The hardware must already be connected (`open_hw_manager` + `connect_hw_server`).
bit_filerequiredprobes_fileRun report_power and return parsed totals (total/dynamic/static W) + a truncated raw block. Full output stored at /tmp/vivado_red_mcp/.
Takes no parameters.
Run report_drc and return parsed violations list (severity/code/message). Use after place_design/route_design to catch design-rule problems.
Takes no parameters.
Run report_methodology (UltraFast methodology checks). Returns violation list grouped by severity.
Takes no parameters.
Run report_qor_assessment (overall design quality score).
Takes no parameters.
Run report_clock_interaction to find cross-clock paths (timed/async/unconstrained).
Takes no parameters.
Resolve a bundled board XDC and attach it to the current project. Standalone wrapper over get_board_info + add_constraints.
boardrequiredvariantConvert a .bit into a raw binary image (.bit.bin) loadable via /dev/xdevcfg on the Red Pitaya. Use after generate_bitstream.
outputbit_filerequiredReturn structured errors and critical warnings from a run's log (default: synth_1), plus those of every failed run (e.g. out-of-context IP runs). Use after run_synthesis fails to get a clean actionable list.
runmax_itemsOne-shot composite: create project -> add HDL sources -> apply XDC -> synth -> impl -> write_bitstream -> generate .bit.bin. Stops on the first failing stage and returns a structured payload.
jobsnamerequiredboarddirectoryrequiredtop_modulerequiredsynth_flagsxdc_variantimpl_timeoutsynth_timeoutverilog_filesrequiredextra_xdc_filesDownload the RedPitaya-FPGA repo from GitHub as a source zip and extract it (no git required, stdlib only). Returns repo_path to feed into rp_setup_workspace. Idempotent — pass force=true to redownload. No Vivado session required.
refurlforcetimeoutdest_pathCopy a RedPitaya-FPGA repo into an isolated workspace so builds don't touch the pristine checkout. The copy is patched to run on the installed Vivado release (block-design version check) and without git. Idempotent — pass force=true to recopy. No Vivado session required.
forcerepo_pathrequiredworkspace_pathList projects under prj/ of a RedPitaya workspace or repo. Flags which are Z10-capable (have ip/system.tcl or legacy ip/systemZ10.tcl). No Vivado session required.
pathrequiredReport workspace state: projects present and which already have a built bitstream.
workspace_pathrequiredClone an existing prj/<base> into prj/<name> inside the workspace, ready for custom PL logic. Returns the rtl/ dir and red_pitaya_top path to edit. No Vivado session required.
namerequiredbase_projectrequiredworkspace_pathrequiredBuild a RedPitaya PS+PL project end-to-end: run the repo's project setup TCL (creates the PS7 block design from ip/system.tcl), then synthesis, implementation and write_bitstream, then generate the .bit.bin. Returns {stage, xpr_path, bit_path, bin_path, timing}. Requires start_session first.
jobsmodeldefinesprojectrequiredsynth_flagsimpl_timeoutsetup_timeoutsynth_timeoutworkspace_pathrequiredCopy a .bit.bin to a Red Pitaya over SSH/SCP and load it into the FPGA. Uses /dev/xdevcfg (works on Red Pitaya OS 1.04 + 2.00) or fpgautil (OS 2.00). No Vivado session required.
hostrequiredportusermethodpasswordkeep_remoteremote_pathbit_bin_pathrequiredkey_filenameconnect_timeoutRun an arbitrary shell command on a Red Pitaya over SSH and return stdout/stderr/exit code. Useful for status checks, dmesg reads, manual loader invocations.
hostrequiredportusercommandrequiredpasswordexec_timeoutkey_filenameconnect_timeoutLook up a topical Vivado documentation summary bundled with this server. Returns markdown content + upstream URL. Known topics: block_design, ps7_zynq, timing_constraints, synthesis_strategies, simulation_xsim, red_pitaya_125_14, redpitaya_ps_pl_flow, tcl_quoting, hw_manager, ip_integrator, pitfalls_2020_1.
topicrequiredversionList the bundled Vivado documentation topics.
Takes no parameters.
Submit a feature request for the Vivado MCP server (persisted on disk).
titlerequiredpriorityuse_casedescriptionrequiredList all submitted feature requests.
Takes no parameters.
Generate a full Vivado report to a file. Use when inline reports get truncated or you need the complete output. Returns a report_id usable with read_report_section.
optionsoutput_filereport_typerequiredRead a section of a previously generated report. Provide report_id (from generate_full_report) or a direct file_path.
file_pathnum_linesreport_idstart_linesearch_pattern90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
git clone https://github.com/sinemortal/vivado-red-mcp.gitcd vivado-red-mcppython -m venv .venv# Windows: .venv\Scripts\activate# Linux/macOS: source .venv/bin/activatepip install -e .claude mcp add --transport stdio --scope user vivado -- vivado-red-mcp# Windowsclaude mcp add --transport stdio --scope user vivado -- "C:\path\to\vivado-red-mcp\.venv\Scripts\python.exe" -m vivado_red_mcp# Linux/macOSclaude mcp add --transport stdio --scope user vivado -- /path/to/vivado-red-mcp/.venv/bin/python -m vivado_red_mcp{ "mcpServers": { "vivado": { "type": "stdio", "command": "vivado-red-mcp" } }}scp led_blinker.bit.bin [email protected]:/tmp/ssh [email protected] 'cat /tmp/led_blinker.bit.bin > /dev/xdevcfg'┌─────────────────┐ MCP (JSON-RPC) ┌─────────────────┐│ Claude Code │◄──────over stdio──────►│ vivado-red-mcp ││ (AI client) │ │ server │└─────────────────┘ └────────┬────────┘ │ pexpect (Linux) │ pywinpty/ConPTY (Windows) ▼ ┌─────────────────┐ │ Vivado process │ │ (-mode tcl) │ └─────────────────┘