Open Platform · vibe-ic v1.4.67 + mcp-eda v1.0.0

Plug in your device,
your IP, your knowledge.

Manifest-driven auto-registration. Drop a folder, edit a manifest, restart the server — no core code changes. Five extension surfaces, one open contract.

Platform architecture

Plugin-centric: one install of the vibe-ic plugin (v1.4.67) brings the whole flow — it bundles and auto-registers the MCP server (48 EDA + 7 device + 1 health tools) alongside 60 skills + 918 deterministic programs, the IP catalog, and the benchmark harness. The marketplace is the open-platform layer around it: partners add sibling plugins, devices, IP, and community backlog through five manifest-driven surfaces.

vibe-ic plugin (bundles MCP) inside the marketplace open-platform Claude Code AI host (CLI / IDE / web) MCP · Plugin protocol Marketplace · marketplace.json open-platform layer — ties partner plugins ★ vibe-ic plugin v1.4.67 · one install, bundles everything MCP (mcp/) 48 EDA + 7 device + 1 health auto-registered on install 60 skills · 918 programs ip-catalog · benchmark tools · agents · commands partner plugin(s) partner-<vendor>-<topic> siblings under marketplace same skeleton · own plugin.json 5 open contribution surfaces 01 Device mcp/src/devices/ manifest.json 02 EDA Tool mcp/src/index.js server.tool() 03 IC IP ip-catalog/ ip_metadata.yaml 04 Partner Plugin templates/partner- plugin-skeleton/ 05 Backlog + PR community/ backlogs/*.yaml one plugin install · MCP auto-registers · no manual setup partners extend via 5 manifest-driven surfaces — drop a folder, open a PR.

01 Device Hardware

Lab instruments — scopes, FPGAs, testers, cameras, logic analyzers, signal generators, power supplies, DMMs. Drop a folder, the server auto-registers every tool you declare.

Folder layout
mcp/src/devices/
└── <category>/
    └── <vendor-device>/
        ├── manifest.json     # required
        ├── driver.py         # required (stdin JSON / stdout JSON)
        ├── README.md         # required
        ├── udev/*.rules      # optional
        └── tests/            # recommended

# 13 canonical categories:
fpga · scope · tester · camera ·
logic-analyzer · fgen · dcpwr ·
acpwr · dmm · specan · rfsiggen ·
swtch · pwrmeter · counter
Manifest schema
{
  "vendor": "keysight",
  "device_class": "oscilloscope",
  "ivi_class": "IviScope",
  "supported_platforms": ["linux"],
  "permissions": ["require_group:plugdev"],
  "tools": [{
    "name": "device_scope_capture",
    "description": "Capture a window from the scope.",
    "driver": "driver.py",
    "tool_mode": "capture",
    "mode": "hw",
    "timeout_sec": 60,
    "schema": {
      "channel": {"type":"integer","default":4},
      "span_ms": {"type":"number","default":50},
      "trigger": {"type":"string","enum":["rising","falling"]}
    }
  }],
  "resources": [/* optional MCP resources */]
}
Reference: Terasic DE10-Lite (3 tools), Keysight DSO-X (2 tools). All auto-registered by mcp/src/devices/_registry.js at server start.

02 EDA Tool

Software tools — Yosys, OpenROAD, KLayout, SymbiYosys, OpenSTA, ngspice, Magic, Verilator, iverilog, xschem, Xyce, cocotb, Fault, Netgen. Core tools execute inside the IIC-OSIC-TOOLS Docker image (TU Wien).

Where 48 EDA tools live
mcp/src/index.js
├── server.tool("eda_lint", ...)
├── server.tool("eda_synth", ...)
├── server.tool("eda_simulate", ...)
├── server.tool("eda_formal", ...)
├── server.tool("eda_pnr", ...)
├── server.tool("eda_gds", ...)
├── server.tool("eda_sta", ...)
├── server.tool("eda_drc_klayout", ...)
├── server.tool("eda_lvs", ...)
├── server.tool("eda_ir_drop", ...)
├── server.tool("eda_spice", ...)
├── server.tool("eda_fpga_compile", ...)
└── ... (48 total)

# Single Docker image
hpretl/iic-osic-tools:latest
Add a partner-specific tool
# Don't fork core. Use the same manifest
# contract as a device — but pointing at
# your own EDA binary or shell script.

partner-acme-synth/
└── mcp/src/devices/
    └── synth/acme-syn-pro/
        ├── manifest.json
        ├── driver.py     # invokes your tool
        └── README.md

# manifest.json declares tools[] just like
# any device — auto-registered at startup.
# Core src/index.js never changes.
Built-in open PDKs: SKY130 (130nm) + GF180MCU (180nm) + IHP SG13G2 (130nm) for sign-off, plus NanGate45 (45nm) and ASAP7 (7nm predictive) as research / education enablements with educational DRC decks — not tapeout-capable. Your own PDK is project-scoped via input/pdk/ or pdk_local/<vendor>/ — never rebuilt into the image.

03 IC IP Block

Reusable verified IP blocks — UART, SPI, I2C, CRC engines, FIFO, arbiters, FSMs. Each contribution carries metadata + RTL/macro deliverable + a list of historical bug classes the IP has seen, so future agents borrow the lesson.

Folder layout
vibe-ic-marketplace/
└── reference-plugins/
    └── <your-ip>/
        ├── ip_metadata.yaml   # required
        ├── plugin.yaml        # plugin manifest
        └── files/             # RTL · macro · netlist
            ├── rtl/
            ├── lef/
            ├── gds/
            └── lib/

# Reference (already shipped):
reference-plugins/example-ip/
└── tiny-uart (8-N-1, MIT)
ip_metadata.yaml schema
ip_id: tiny-uart
vendor: example-org
license_tag: open-source-mit
deliverable_kind: soft-ip   # or hard-ip

interface:
  bus: APB-like
  data_width: 8
  clock_domain_required: single
  reset_polarity: active-low

constraints:
  max_freq_mhz: 50
  pdk: any   # any | sky130 | gf180mcu | ihp-sg13g2 | nangate45 | ...

known_issues: []
historical_failure_modes:
  # bug classes this IP has seen — for
  # future agents to borrow the lesson
  - "Baud divider must be set before TX"
integration_notes:
  - "Simple 8-N-1 UART; no flow control."

04 Partner Plugin

One bundle for vendors who want to ship the full stack: slash commands, NL skills, deterministic gates, MCP device drivers, and foundry-specific PDK files — all in a single plugin folder.

Skeleton layout
vibe-ic-marketplace/templates/
└── partner-plugin-skeleton/
    ├── .claude-plugin/
    │   └── plugin.json     # name · version · author
    ├── commands/           # slash commands (optional)
    │   └── <your-command>.md
    ├── skills/             # NL skills (optional)
    │   └── <your-skill>/SKILL.md
    ├── programs/           # deterministic Py (optional)
    │   └── <your-class>_check.py
    ├── mcp/     # device drivers (optional)
    │   └── src/devices/<class>/<vendor>/
    │       ├── manifest.json
    │       └── driver.py
    ├── pdk_local/<vendor>/ # foundry PDK (optional)
    │   ├── liberty/
    │   ├── lef/
    │   ├── gds/
    │   ├── drc/
    │   └── lvs/
    └── README.md
Registration steps
# 1. Copy the skeleton
cp -r vibe-ic-marketplace/templates/\
  partner-plugin-skeleton \
  vibe-ic-marketplace/plugins/\
  partner-<vendor>-<topic>

# 2. Edit .claude-plugin/plugin.json
{
  "name": "partner-acme-i2c-ip",
  "version": "0.1.0",
  "author": "ACME Semiconductor",
  "description": "I2C master/slave IP + ..."
}

# 3. Add one entry to root marketplace.json
{
  "plugins": [
    ...,
    { "name": "partner-acme-i2c-ip",
      "path": "plugins/partner-acme-i2c-ip" }
  ]
}

# 4. Open a PR
git push origin partner-acme-i2c-ip
gh pr create
Audience: EDA vendors · foundries · IP houses · design service companies. Each can ship its full domain expertise without forking core.

05 Community Backlog + PR

When an agent finds a bug in real silicon, it must NOT just patch the bug. It must look back at the plugin and ask: What general gate would catch this whole class of bugs? That answer — the enhancement opportunity, IC-AGNOSTIC — gets recorded back to the community. The plugin gets professional with every contribution.

There are two ways to contribute back — and they are not either/or: file a backlog (a report of the gap, no code) or open a PR (the same report with your proposed fix). Both must be IC-AGNOSTIC and are auto-sanitized; the maintainer (repo-gatekeeper) triages backlogs and reviews & lands PRs into the next version.

The generality rule (NON-NEGOTIABLE)
✅ Record (enhancement) ❌ Skip (specific bug)
"Plugin lacks a gate for protocols where CRC init / update happen on the same cycle" "Our IC's CRC output is wrong because crc_init and crc_update overlap"
"No program checks that wake signals have ≥2 clear paths" "Wake register only clears on rst_n, missing soft-reset"

Sanitize automatically: chip names → "a cable-side ID IC"; vendor names → "the vendor"; OTP hex dumps → "OTP content".

Two ways to contribute
# ── A. BACKLOG — a report, no code ──
# Inside a design session, invoke the skill:
claude "use community-backlog-submit
        skill to record this gap"

# writes  community/backlogs/<class-tag>.yaml
# backlog_sanitize_check.py auto-strips:
#   chip / vendor names, OTP hex, PDF names

# ── B. PR — a report WITH your fix ──
# the skill also emits a PR-ready diff;
# open a PR carrying the gate/program change
# (the actual code), not just the report.

# EITHER path: a passing sanitize-check is
# REQUIRED to merge — chip-AGNOSTIC enforced
# by code, not honor system. The maintainer
# (repo-gatekeeper) triages backlogs + lands
# PRs into the next version.

Submit a contribution

Pick a surface, follow the manifest contract, then file a backlog or open a pull request.

View on GitHub

Apache License 2.0 — Free and open source