Observer-first MCP server for KLayout layout inspection.
Project description
klayout-mcp
Read-only MCP server for KLayout. It opens GDS/OAS layouts, inspects geometry and hierarchy, renders deterministic PNGs, and runs batch DRC with structured JSON output.
Install
Fastest one-off run:
uvx klayout-mcp@latest
Install once:
uv tool install klayout-mcp
Traditional Python install:
python -m pip install klayout-mcp
For batch DRC, the klayout executable must be on PATH or exposed through KLAYOUT_BIN.
export KLAYOUT_BIN=/Applications/klayout.app/Contents/MacOS/klayout
Quick Start
klayout-mcp is a stdio MCP server. The default launch shape is:
command: uvx
args: klayout-mcp@latest
If your client cannot use uvx, install the tool once and launch klayout-mcp directly.
Typical workflow:
open_layoutlist_layerslist_cellsordescribe_cellquery_regionmeasure_geometryanalyze_waveguiderender_viewrun_drc_scriptextract_markersclose_session
Client Setup
More copy-paste examples live in examples/mcp/README.md.
Codex
[mcp_servers.klayout]
command = "uvx"
args = ["klayout-mcp@latest"]
[mcp_servers.klayout.env]
KLAYOUT_BIN = "/Applications/klayout.app/Contents/MacOS/klayout"
Or add it with the CLI:
codex mcp add klayout \
--env KLAYOUT_BIN=/Applications/klayout.app/Contents/MacOS/klayout \
-- uvx klayout-mcp@latest
Claude Code
{
"mcpServers": {
"klayout": {
"command": "uvx",
"args": ["klayout-mcp@latest"],
"env": {
"KLAYOUT_BIN": "/Applications/klayout.app/Contents/MacOS/klayout"
}
}
}
}
Or add it with the CLI:
claude mcp add --transport stdio klayout \
--scope project \
--env KLAYOUT_BIN=/Applications/klayout.app/Contents/MacOS/klayout \
-- uvx klayout-mcp@latest
Cursor
Cursor is file-config based:
{
"mcpServers": {
"klayout": {
"command": "uvx",
"args": ["klayout-mcp@latest"],
"env": {
"KLAYOUT_BIN": "/Applications/klayout.app/Contents/MacOS/klayout"
}
}
}
}
OpenCode
OpenCode is file-config based:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"klayout": {
"type": "local",
"command": ["uvx", "klayout-mcp@latest"],
"enabled": true,
"environment": {
"KLAYOUT_BIN": "/Applications/klayout.app/Contents/MacOS/klayout"
}
}
}
}
Other MCP Hosts
Use:
command:uvxargs:["klayout-mcp@latest"]env:KLAYOUT_BINwhen needed
Tools
- Session:
open_layout,close_session - Structure:
list_layers,list_cells,describe_cell - Geometry:
query_region,measure_geometry,analyze_waveguide - View:
set_view,render_view - DRC:
run_drc_script,extract_markers
Configuration
| Variable | Purpose | Default |
|---|---|---|
KLAYOUT_MCP_ARTIFACT_ROOT |
Root directory for runtime artifacts | <repo>/.artifacts |
KLAYOUT_MCP_SESSION_TTL_SECONDS |
Session inactivity timeout | 3600 |
KLAYOUT_BIN |
KLayout batch executable for DRC | klayout |
Behavior:
- any absolute local path can be used for layouts and DRC scripts
- artifact paths returned by tools are absolute
- sessions expire lazily after inactivity
close_sessionremoves the session artifact directory
Artifacts And Errors
Artifacts are stored under .artifacts/sessions/<session_id>/ and include renders, DRC reports, marker crops, and logs.
Tool failures return structured JSON such as:
{
"code": "FILE_NOT_FOUND",
"message": "Layout file does not exist",
"details": {
"path": "/abs/path/to/missing.gds"
}
}
Common codes: FILE_NOT_FOUND, SESSION_NOT_FOUND, INVALID_BOX, INVALID_LAYER, INVALID_TARGET, DRC_RUN_FAILED.
Development
For a source checkout:
uv sync --extra dev
uv run klayout-mcp
If an MCP client needs to launch the checkout directly:
command: uv
args: --directory /abs/path/to/klayout-mcp run klayout-mcp
Contributor workflow is in CONTRIBUTING.md. Release notes are in CHANGELOG.md.
Releases
Normal releases are automated with release-please.
- merge Conventional Commits to
main release-pleaseopens or updates a release PR- merging that release PR updates
pyproject.toml,CHANGELOG.md, creates the tag and GitHub release, and publishes to PyPI
To let the release PR run normal CI under branch protection, configure a repository secret named RELEASE_PLEASE_TOKEN with a GitHub token that can open pull requests. Without it, release-please falls back to github.token, which may not trigger PR workflows.
The manual release.yml workflow remains available for TestPyPI validation and recovery publishing.
Reference
- docs/specs/2026-03-05-klayout-observer-mcp-contract.md
- docs/plans/2026-03-05-klayout-observer-mcp-design.md
- docs/plans/2026-03-05-klayout-observer-mcp-implementation-plan.md
Documentation Site
The repository is configured for Read the Docs with MkDocs.
Build the docs locally:
uv run --extra docs mkdocs build --strict
Serve the docs locally:
uv run --extra docs mkdocs serve
After importing the GitHub repository into Read the Docs, it can build directly from the default branch using .readthedocs.yaml.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file klayout_mcp-0.2.0.tar.gz.
File metadata
- Download URL: klayout_mcp-0.2.0.tar.gz
- Upload date:
- Size: 31.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1398df5fcbdff3b84d552df8c415e1b0f9188f881913ba1f611d88ee7f4afeb1
|
|
| MD5 |
da4c064badcbb5ae49606f1cef5b57b8
|
|
| BLAKE2b-256 |
d16b431d14fddba7d4fe85fe7388f31cf7a62cb49511ede487b2e58418db7d9e
|
Provenance
The following attestation bundles were made for klayout_mcp-0.2.0.tar.gz:
Publisher:
release.yml on aycandv/klayout-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
klayout_mcp-0.2.0.tar.gz -
Subject digest:
1398df5fcbdff3b84d552df8c415e1b0f9188f881913ba1f611d88ee7f4afeb1 - Sigstore transparency entry: 1052791197
- Sigstore integration time:
-
Permalink:
aycandv/klayout-mcp@98bc749cf5d97bc074b12ff3a26d58ad7b61affd -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/aycandv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@98bc749cf5d97bc074b12ff3a26d58ad7b61affd -
Trigger Event:
release
-
Statement type:
File details
Details for the file klayout_mcp-0.2.0-py3-none-any.whl.
File metadata
- Download URL: klayout_mcp-0.2.0-py3-none-any.whl
- Upload date:
- Size: 30.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ee14f19f70896e6d5e13690416aedc19fc5e5e7f7459e94fa6b01e37e18a246
|
|
| MD5 |
3ffb4974e4508837fd6d744d2e554851
|
|
| BLAKE2b-256 |
0dcf380e903087d60f336c99b763efbbf63ed1548858bef2579a2166b316ef27
|
Provenance
The following attestation bundles were made for klayout_mcp-0.2.0-py3-none-any.whl:
Publisher:
release.yml on aycandv/klayout-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
klayout_mcp-0.2.0-py3-none-any.whl -
Subject digest:
4ee14f19f70896e6d5e13690416aedc19fc5e5e7f7459e94fa6b01e37e18a246 - Sigstore transparency entry: 1052791200
- Sigstore integration time:
-
Permalink:
aycandv/klayout-mcp@98bc749cf5d97bc074b12ff3a26d58ad7b61affd -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/aycandv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@98bc749cf5d97bc074b12ff3a26d58ad7b61affd -
Trigger Event:
release
-
Statement type: