Skip to main content
Glama
oaslananka
by oaslananka

easyeda-mcp-pro

Ask DeepWiki


Trust and Supply Chain

easyeda-mcp-pro keeps historical OpenSSF Best Practices evidence in docs/OPENSSF_BEST_PRACTICES.md and its security assurance case in docs/SECURITY_ASSURANCE_CASE.md. The header badges link to current workflow-backed signals only: CI, generated docs deployment, the project security policy, and the OpenSSF Scorecard. Release integrity evidence (npm provenance, signed-release status) is tracked in docs/RELEASE_VERIFICATION.md. Coverage, Test Analytics, and extension bundle monitoring are documented in docs/CODECOV_ANALYTICS.md.

Licensing note: the repository is now source-available under PolyForm Noncommercial 1.0.0 rather than an OSI-approved open-source license. Historical OpenSSF evidence remains for audit history and must not be treated as a current FLOSS-license claim.


Related MCP server: mcp-server-kicad

Quick Start

The fastest way to install and configure easyeda-mcp-pro for your favorite AI assistant or IDE:

  1. Auto-configure your MCP client:

    npx easyeda-mcp-pro setup all

    This detects and configures Claude Desktop, Cursor, VS Code, Windsurf, Cline, Gemini, Zed, etc. to run the MCP server automatically. (Or run for a specific client, e.g., npx easyeda-mcp-pro setup claude)

  2. Locate and install the EasyEDA Pro bridge extension:

    npx easyeda-mcp-pro extension --open

    This opens the folder containing the extension package easyeda-bridge-extension.eext. Import it via EasyEDA Pro → Settings → Extensions → Extension Manager.

  3. Connect the bridge: In EasyEDA Pro, click MCP Bridge → Connect in the menu bar.

For advanced configurations, manual instructions, and specific clients, see Installation & Client Configuration.


Overview

easyeda-mcp-pro is a Model Context Protocol (MCP) server that bridges AI assistants with hardware design workflows in EasyEDA Pro. It exposes up to 119 profile-gated MCP tools for schematic inspection and editing, controlled EasyEDA Pro API calls, BOM management, design rule checks, PCB board analysis, fabrication exports, diagnostics, and supplier integration.

The server connects to EasyEDA Pro via a WebSocket bridge extension, enabling real-time access to open project data. It integrates with JLCPCB, LCSC, Mouser, and DigiKey for BOM sourcing and pricing.

Key Capabilities

Area

What you can do

Schematic

List nets/components, search and place devices, edit wires/primitives

BOM

Generate, validate, export, and source bill of materials

DRC/ERC

Run design rule and electrical rule checks

Board

Inspect layers, stackup, dimensions, features

Export

Export Gerbers, pick-and-place, PDF, netlist

Diagnostics

Health check, bridge status, API inventory, capabilities, self-test


Prerequisites

  • Node.js: Node.js 24.x is required; repository automation is pinned to 24.21.0.

  • pnpm: local development and automation require exactly 11.28.0.

Prepare the supported runtime before installing dependencies:

nvm install 24.21.0
nvm use 24.21.0
corepack enable
corepack prepare pnpm@11.28.0 --activate
node scripts/check-runtime.mjs --require-pnpm
  • EasyEDA Pro with the bundled bridge extension installed and running

  • For supplier integration: API credentials from JLCPCB, LCSC, Mouser, or DigiKey


Installation & Client Configuration

Stable v1 is published. If you are upgrading from a pre-v1 release, follow Migrating to v1.

You can configure easyeda-mcp-pro automatically or manually.

1. Automatic Configuration (CLI)

The CLI setup automates editing the configuration files for your client:

# Configure all detected clients automatically
npx easyeda-mcp-pro setup all

# Or configure a specific client
npx easyeda-mcp-pro setup <client>

Supported Client Keys:

  • claude (Claude Desktop)

  • cursor (Cursor IDE)

  • vscode (VS Code Copilot)

  • windsurf (Windsurf)

  • cline (Cline)

  • gemini (Gemini CLI / Antigravity)

  • zed (Zed Editor)

  • amazonq (Amazon Q Developer)

  • continue (Continue.dev)

Options:

  • --profile <name>: Specify the tool profile. Options: core (default), pro, full, dev. Example: npx easyeda-mcp-pro setup cursor --profile full

2. Extension Installation

To bridge the MCP server with EasyEDA Pro:

# Open the directory containing the .eext extension package in your file manager
npx easyeda-mcp-pro extension --open

# Or copy it to a specific directory
npx easyeda-mcp-pro extension --copy /path/to/destination

Installation steps in EasyEDA Pro:

  1. Open EasyEDA Pro.

  2. Go to Settings → Extensions → Extension Manager.

  3. Click Import Extension and select the easyeda-bridge-extension.eext file.

  4. Ensure Allow External Interaction is enabled for the extension.

  5. Click MCP Bridge → Connect in the menu bar.


3. Manual Client Configurations

If you prefer to configure your clients manually, add the following configuration to the respective settings files:

Config Path:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "easyeda-mcp-pro": {
      "command": "npx",
      "args": ["-y", "easyeda-mcp-pro@latest"],
      "env": {
        "TOOL_PROFILE": "core"
      }
    }
  }
}

Config Path: Project-specific .cursor/mcp.json or global ~/.cursor/mcp.json

{
  "mcpServers": {
    "easyeda-mcp-pro": {
      "command": "npx",
      "args": ["-y", "easyeda-mcp-pro@latest"],
      "env": {
        "TOOL_PROFILE": "pro"
      }
    }
  }
}

Config Path: %APPDATA%\Code\User\mcp.json (Windows), ~/Library/Application Support/Code/User/mcp.json (macOS), or ~/.config/Code/User/mcp.json (Linux)

{
  "servers": {
    "easyeda-mcp-pro": {
      "command": "npx",
      "args": ["-y", "easyeda-mcp-pro@latest"],
      "env": {
        "TOOL_PROFILE": "pro"
      }
    }
  }
}

Config Path: ~/.codeium/windsurf/mcp_config.json

{
  "mcpServers": {
    "easyeda-mcp-pro": {
      "command": "npx",
      "args": ["-y", "easyeda-mcp-pro@latest"],
      "env": {
        "TOOL_PROFILE": "pro"
      }
    }
  }
}

Config Path: Cline VS Code extension global storage (cline_mcp_settings.json)

{
  "mcpServers": {
    "easyeda-mcp-pro": {
      "command": "npx",
      "args": ["-y", "easyeda-mcp-pro@latest"],
      "env": {
        "TOOL_PROFILE": "pro"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}

Config Path: ~/.gemini/settings.json or ~/.gemini/config/mcp_config.json

{
  "mcpServers": {
    "easyeda-mcp-pro": {
      "command": "npx",
      "args": ["-y", "easyeda-mcp-pro@latest"],
      "env": {
        "TOOL_PROFILE": "pro"
      }
    }
  }
}

Config Path: ~/.config/zed/settings.json

{
  "context_servers": {
    "easyeda-mcp-pro": {
      "command": {
        "path": "npx",
        "args": ["-y", "easyeda-mcp-pro@latest"]
      },
      "settings": {}
    }
  }
}

Config Path: ~/.continue/config.json

{
  "mcpServers": {
    "easyeda-mcp-pro": {
      "command": "npx",
      "args": ["-y", "easyeda-mcp-pro@latest"],
      "env": {
        "TOOL_PROFILE": "pro"
      }
    }
  }
}

Config Path: ~/.aws/amazonq/mcp.json

{
  "mcpServers": {
    "easyeda-mcp-pro": {
      "command": "npx",
      "args": ["-y", "easyeda-mcp-pro@latest"],
      "env": {
        "TOOL_PROFILE": "pro"
      }
    }
  }
}

4. Running from Source (Development)

If you are developing or running a modified local build:

git clone https://github.com/oaslananka/easyeda-mcp-pro.git
cd easyeda-mcp-pro
cp .env.example .env
pnpm install

# Build the server and the bridge extension package
pnpm build
pnpm build:extension

To configure your clients to use the local development build:

# Print instructions and local config block pointing to dist/index.js
node dist/index.js --setup-local

Local Diagnostics & Health Check

You can diagnose your environment and bridge connectivity at any time:

pnpm doctor

This checks:

  1. Node.js version compatibility.

  2. Runtime mode: source checkout, installed package, or production runtime.

  3. The CLI entry shebang and the .eext extension package checksum.

  4. Bridge port availability. Note: The bridge status will show as offline until an MCP client starts the server and connects to the EasyEDA Pro extension.

pnpm is required only for a source checkout and must match the repository pin. pnpm is not required for an installed package or production runtime, including the hardened Docker image. Doctor exits with status 1 for unsupported required runtimes, invalid configuration, or missing/corrupt runtime artifacts; an offline bridge by itself remains informational.


Configuration

Copy .env.example to .env and edit. All variables have safe defaults — only configure what you need.

Boolean environment variables use strict literals: true / 1 enable a setting and false / 0 disable it. Matching is case-insensitive and surrounding whitespace is ignored. Other values—including yes, no, on, off, enabled, disabled, empty strings, and misspellings—fail startup validation and report the offending variable. Leave a variable unset to use its documented default.

Essential

Variable

Default

Description

NODE_ENV

development

Set to production in production

LOG_LEVEL

info

Pino log level: trace, debug, info, warn, error, fatal, silent

TOOL_PROFILE

core

Tool set: core, pro, full, dev, experimental

TOOL_SCOPES

empty

Optional capability allowlist such as schematic:read,bom:read

MCP_PROTOCOL_VERSION

2025-11-25

MCP protocol version string

MCP_BRIDGE_BACKEND

local_bridge

Bridge backend: local_bridge or experimental remote_relay

MCP_REMOTE_SESSION_ID

empty

Optional fixed Remote Relay session id for remote_relay backend

TRANSPORT

stdio

Server transport: stdio (default) or http

For Remote Relay experiments, run npx easyeda-mcp-pro doctor --fix after setting MCP_BRIDGE_BACKEND=remote_relay; the doctor output validates HTTP transport, session selection, OAuth, and loopback-only development auth settings.

Bridge (EasyEDA Pro connection)

Variable

Default

Description

BRIDGE_HOST

127.0.0.1

Bridge WebSocket host

BRIDGE_PORT

49620

Primary bridge port

BRIDGE_PORT_SCAN

49620-49629

Port scan spec (comma/range)

BRIDGE_TIMEOUT_MS

15000

Bridge call timeout (ms)

BRIDGE_HEARTBEAT_MS

10000

Heartbeat interval (ms)

BRIDGE_WAIT_FOR_EDA_MS

30000

Wait for EasyEDA Pro on startup (ms)

BRIDGE_MAX_PAYLOAD_SIZE

1048576

Max bridge payload (bytes, default 1 MiB)

BRIDGE_TOKEN

''

Session token for extension auth

BRIDGE_RAW_EXEC_ENABLED

false

First explicit gate for raw EasyEDA runtime JavaScript execution

MCP_RAW_EXEC_EXPERIMENTAL

false

Second experimental gate required before easyeda_execute is registered

Storage

Variable

Default

Description

DATA_DIR

~/.easyeda-mcp-pro

Base directory for writable local state

SQLITE_PATH

<DATA_DIR>/easyeda-mcp-pro.sqlite

SQLite database path

ARTIFACT_DIR

<DATA_DIR>/artifacts

Artifact export directory

CACHE_DIR

<DATA_DIR>/cache

Cache directory

Storage paths are resolved in two stages. DATA_DIR is resolved first; each subordinate path is then derived from it with the current operating system's native path separator unless that variable was explicitly supplied. Setting only DATA_DIR therefore relocates the default database, artifact, and cache paths together. Explicit overrides are applied independently and retain their supplied absolute or relative semantics; relative paths remain relative to the MCP process working directory. Changing these settings does not migrate existing data automatically.

Supplier integration

Enable suppliers by setting their credentials. All suppliers are disabled by default.

  • JLCPCB: JLCPCB_MODE=approved_api + client ID/secret

  • LCSC: JLCSEARCH_ENABLED=true (default, no key required for basic search)

  • Mouser: MOUSER_ENABLED=true + API key

  • DigiKey: DIGIKEY_ENABLED=true + OAuth2 client ID/secret

Shared sourcing behavior is controlled independently of any one vendor:

Variable

Default

Description

KEYLESS_SOURCING_ENABLED

true

Allow supported public keyless fallbacks when credentials are absent

SOURCING_CACHE_TTL_SECONDS

21600

Cache sourcing responses for six hours (0 disables cache reuse)

VENDOR_MIN_REQUEST_INTERVAL_MS

150

Minimum delay between outbound requests to the same sourcing vendor

Reserved AI configuration

No in-process AI provider client is currently implemented. The AI_* variables remain accepted for configuration compatibility but are reported as reserved, are always ineffective, and must not be used to infer that the server sends design data to an AI provider. Do not supply an API key.

Variable

Default

Current behavior

AI_PROVIDER

none

Reserved; no provider client is invoked

AI_MODEL

''

Reserved; no model is selected

AI_API_KEY

''

Reserved; no credential consumer exists

AI_MAX_TOKENS

8000

Reserved compatibility setting

AI_TIMEOUT_MS

60000

Reserved compatibility setting

AI_ALLOW_DESIGN_MUTATIONS

false

Reserved; cannot enable AI-originated design mutation

Use easyeda_get_feature_flags or easyeda_get_capabilities to inspect configured, effective, and maturity values for optional settings.

HTTP transport

When using TRANSPORT=http:

Variable

Default

Description

HTTP_HOST

127.0.0.1

Bind address; non-loopback requires OAuth

HTTP_PORT

3000

Port

HTTP_AUTH_DISABLED

false

Disable HTTP auth for non-production loopback only

HTTP_RATE_LIMIT_MAX

100

Max requests per minute per IP

CORS_ORIGIN

''

Legacy allowed origin for loopback browser clients

ALLOWED_ORIGINS

''

Explicit remote origin allowlist; * is rejected

Remote HTTP Security

Every non-loopback HTTP deployment requires OAuth 2.0 / OpenID Connect authentication, regardless of NODE_ENV:

Variable

Default

Description

OAUTH_ENABLED

false

Enable Bearer token validation

OAUTH_ISSUER

''

Expected token issuer (iss claim)

OAUTH_AUDIENCE

easyeda-mcp-pro

Expected token audience (aud claim)

OAUTH_JWKS_URI

''

JWKS endpoint for token signature validation

OAUTH_REQUIRED_SCOPES

easyeda:read

Required token scope

When OAUTH_ENABLED=true, every request to /mcp must include an Authorization: Bearer <token> header unless HTTP_AUTH_DISABLED=true is explicitly set for non-production loopback development. Tokens are verified against OAUTH_JWKS_URI, iss/aud claims are validated, and OAUTH_REQUIRED_SCOPES is enforced against scope, scp, permissions, or roles claims.

The server enforces startup safety checks in every environment: non-loopback HTTP_HOST without OAuth is rejected, OAUTH_JWKS_URI / OAUTH_ISSUER / OAUTH_AUDIENCE are required, wildcard ALLOWED_ORIGINS=* is rejected, and HTTP_AUTH_DISABLED=true remains limited to non-production loopback development. Requests without an Origin header still require a valid bearer token on authenticated deployments; CORS is not an authentication boundary.

Docker defaults

The Docker image starts in HTTP mode with HTTP_HOST=127.0.0.1 so the default container boot path is safe and passes the same startup safety checks as local HTTP mode. For an externally reachable container, override the bind address and configure OAuth plus an explicit, non-wildcard origin allowlist:

docker run --rm \
  -e HTTP_HOST=0.0.0.0 \
  -e ALLOWED_ORIGINS=https://your-client.example.com \
  -e OAUTH_ENABLED=true \
  -e OAUTH_ISSUER=https://issuer.example.com/ \
  -e OAUTH_JWKS_URI=https://issuer.example.com/.well-known/jwks.json \
  -e OAUTH_AUDIENCE=easyeda-mcp-pro \
  -p 127.0.0.1:3000:3000 \
  ghcr.io/oaslananka/easyeda-mcp-pro:latest

Do not expose non-loopback HTTP without OAuth. ALLOWED_ORIGINS restricts browsers but never replaces authentication. Use a reverse proxy or platform gateway for TLS termination and external access.

HTTP Security Features

  • Rate limiting: Per-IP sliding window (configurable via HTTP_RATE_LIMIT_MAX), returns 429 Too Many Requests with retry-after header

  • Security headers: X-Content-Type-Options: nosniff, X-Frame-Options: DENY, X-XSS-Protection: 0, Referrer-Policy: strict-origin-when-cross-origin

  • Health endpoints: /healthz (liveness) and /readyz (readiness) return JSON status

See .env.example for the complete list of configuration variables.


MCP Tools

The server registers profile-gated tools according to the active TOOL_PROFILE. The table below is generated from the same registry used at runtime:

Profile

Registered tools

core

73

pro

100

full

114

dev

119

experimental

119

core exposes the standard workflow tools, pro adds manufacturing exports, full adds controlled documented EasyEDA API calls, and dev adds runtime probes for debugging.

Capability scopes add a second authorization layer when TOOL_SCOPES is set. Leave it empty for the default local all-capabilities mode, or restrict it with comma/space separated scopes such as diagnostics:read, schematic:read, schematic:write, bom:read, bom:source, checks:read, pcb:read, pcb:write, export:write, api:read, api:write, and bridge:execute.

Raw JavaScript execution is intentionally not part of the default dev tool set. easyeda_execute is registered only when both BRIDGE_RAW_EXEC_ENABLED=true and MCP_RAW_EXEC_EXPERIMENTAL=true are set; when TOOL_SCOPES is set it also requires bridge:execute.

L0 — Diagnostics (core)

Tool

Description

easyeda_health_check

Server health, runtime version, profile, bridge state

easyeda_bridge_status

Bridge connection status, version, capabilities

easyeda_get_capabilities

Available profiles, features, supported operations

easyeda_get_server_config

Safe/redacted server configuration

easyeda_get_tool_profiles

Available tool profiles

easyeda_get_feature_flags

Current feature flags

easyeda_run_self_test

Internal self-test

easyeda_api_inventory

Live EasyEDA API classes, runtime paths, and methods

L0 — Full-control and dev probes

Tool

Profile

Description

easyeda_api_call

full

Call a documented EasyEDA Class.method path through the bridge

easyeda_bridge_probe_methods

dev

Probe bridge method availability

easyeda_component_probe

dev

Inspect live schematic component runtime objects and state getters

easyeda_api_call is intentionally not raw JavaScript execution. It only accepts documented EasyEDA Pro API class prefixes (DMT_, SCH_, PCB_, LIB_) and a direct method name such as SCH_PrimitiveWire.getAll. Methods that can mutate project state, such as create, delete, modify, openProject, save, import, or export, require confirmWrite=true.

To enable the controlled full-control API tool in your MCP client, set:

TOOL_PROFILE=full

L1 — Schematic (core)

Tool

Description

easyeda_schematic_nets

List all nets with node connections

easyeda_schematic_components

List components with ref, value, footprint, LCSC, datasheet

easyeda_schematic_net_detail

Full detail for a specific net

easyeda_schematic_search_device

Search EasyEDA library devices

easyeda_schematic_place_component

Place a library component on the active schematic sheet

easyeda_schematic_add_wire

Add a schematic wire segment

easyeda_schematic_delete_primitive

Delete schematic components or wires by primitive ID

easyeda_schematic_modify_primitive

Modify schematic component or wire properties

The schematic write APIs use EasyEDA Pro extension APIs that EasyEDA currently marks as beta. The bridge checks for the documented API class names at runtime and returns an explicit error when the installed EasyEDA Pro build does not expose a required method.

L1 — BOM (core)

Tool

Description

easyeda_bom_generate

Generate bill of materials

easyeda_bom_validate

Validate BOM against LCSC inventory

easyeda_bom_export

Export BOM to file

easyeda_bom_sourcing

Pricing and availability from suppliers

L1 — DRC/ERC (core)

Tool

Description

easyeda_drc_run

Design rule check for PCB

easyeda_erc_run

Electrical rule check for schematic

easyeda_rule_check_summary

Combined DRC + ERC summary

L1 — Board (core)

Tool

Description

easyeda_board_layers

List PCB layers with type, color, visibility

easyeda_board_stackup

Layer stackup with thickness, material

easyeda_board_dimensions

Board outline, shape, mounting holes

easyeda_board_features

Counts of vias, tracks, zones, pads, components

L1 — Export (core/pro)

Tool

Profile

Description

easyeda_export_gerbers

core

Export Gerber files for fabrication

easyeda_export_pick_place

pro

Export pick-and-place centroid file

easyeda_export_pdf

pro

Export schematic/board to PDF

easyeda_export_netlist

pro

Export netlist


Architecture

┌─────────────────┐     WebSocket      ┌─────────────────────┐
│   AI Assistant   │ ◄──── MCP ──────► │  easyeda-mcp-pro    │
│  (Claude, etc.)  │     Protocol      │  (MCP Server)       │
└─────────────────┘                    │                     │
                                       │  ┌───────────────┐  │
┌─────────────────┐     WebSocket      │  │  BridgeManager │──┼──► EasyEDA Pro
│  EasyEDA Pro     │ ◄── Bridge ──────►│  │  (WS Client)   │  │   (Plugin)
│  (via Plugin)    │     Protocol      │  └───────────────┘  │
└─────────────────┘                    │  ┌───────────────┐  │
                                       │  │  ToolRegistry  │  │
                                       │  │ (up to 119 tools) │ │
                                       │  └───────────────┘  │
                                       │  ┌───────────────┐  │
                                       │  │    Storage     │──┼──► SQLite
                                       │  │  (Cache/DB)   │  │
                                       │  └───────────────┘  │
                                       │  ┌───────────────┐  │
                                       │  │   Vendors     │──┼──► JLCPCB/LCSC/
                                       │  │ (API Clients) │  │    Mouser/DigiKey
                                       │  └───────────────┘  │
                                       └─────────────────────┘

Transports

  • stdio (default): Standard MCP transport — works with Claude Desktop, Cursor, and most MCP clients

  • HTTP: Streamable HTTP transport with /healthz, /readyz, /mcp endpoints, CORS, and optional OAuth — suitable for remote deployments

Deployment modes

Beyond local stdio/HTTP, the server supports a hosted remote runtime (gateway, session router, and approval-scoped relay under src/remote/) for managed connector deployments such as Claude Web or ChatGPT app integrations, plus a self-hosted remote mode for user-managed endpoints. See Remote MCP Modes for the full mode matrix and network/security boundaries of each.

Bridge extension

pnpm build:extension
pnpm verify:extension

The extension build writes easyeda-bridge-extension.eext at the repository root. It contains extension.json, the bundled browser script, and the image assets required by EasyEDA Pro.

Installation: Open EasyEDA Pro → Settings → Extensions → Extension Manager... → Import Extension, then select the .eext file. Make sure Allow External Interaction is enabled for the extension.

For local bridge development, an experimental loopback-only CDP transport is documented in the CDP Bridge guide. The extension remains the recommended transport for normal use. Public delivery targets and milestone lifecycle rules are maintained in the roadmap.


Agent plugin and skills

This repository owns the product-level agent plugin and EasyEDA-specific skills for EasyEDA MCP Pro. The central agent-tools repository should catalog this plugin, but the manifest and workflow instructions live here so they stay synchronized with the actual MCP server, bridge extension, tool profiles, and EasyEDA runtime behavior.

File

Purpose

.claude-plugin/plugin.json

Claude Code-valid plugin manifest for compatible agent runtimes and marketplace catalogs.

.mcp.json

Project-local Claude Code MCP server configuration.

.codex/config.example.toml

Codex CLI MCP configuration example.

.vscode/mcp.example.json

VS Code / GitHub Copilot workspace MCP configuration example.

opencode.example.jsonc

OpenCode project MCP configuration example.

.opencode/skills/

OpenCode-native mirrored skill definitions.

docs/agent-runtime-config.md

Agent runtime setup and validation matrix.

skills/easyeda-workflow/SKILL.md

End-to-end EasyEDA setup, inspection, controlled write, export, and reporting workflow.

skills/component-search/SKILL.md

Component search, BOM review, sourcing, pricing, availability, and part-risk workflow.

skills/design-validation/SKILL.md

DRC/ERC, semantic ERC, PCB constraints, production QA, export, and release-validation workflow.

Agent setup

EasyEDA MCP Pro can be launched with the published npm package or from a source checkout:

npx easyeda-mcp-pro
TRANSPORT=http HTTP_HOST=127.0.0.1 HTTP_PORT=3000 npx easyeda-mcp-pro
pnpm build && node dist/index.js

For live EasyEDA Pro workflows, install the EasyEDA bridge extension and confirm the bridge is reachable with easyeda_health_check and easyeda_bridge_status. Tool availability depends on TOOL_PROFILE and optional TOOL_SCOPES restrictions.

For source checkouts, run the normal validation path before publishing plugin changes:

python3 -m json.tool .claude-plugin/plugin.json >/dev/null
claude plugin validate .
pnpm format:check
pnpm typecheck
pnpm test
pnpm build
pnpm check:metadata

Validation workflow

Before listing this plugin as active from agent-tools, verify at least one compatible agent runtime can:

  1. Discover .claude-plugin/plugin.json.

  2. Launch or connect to easyeda-mcp-pro over stdio or HTTP.

  3. Call easyeda_health_check, easyeda_bridge_status, or easyeda_get_capabilities.

  4. Load a skill from skills/ and follow the workflow without referencing missing tools.

  5. Report bridge state, tool profile, ERC, DRC, BOM, export artifacts, assumptions, and human-review requirements separately.

EasyEDA MCP Pro is an engineering assistant, not an autonomous manufacturing sign-off authority. Generated designs, component selections, and fabrication outputs require qualified human review before purchase, fabrication, or assembly.

Development

Prerequisites

  • Node.js: Node.js 24.x is required; repository automation is pinned to 24.21.0.

  • pnpm: local development and automation require exactly 11.28.0.

Prepare the supported runtime before installing dependencies:

nvm install 24.21.0
nvm use 24.21.0
corepack enable
corepack prepare pnpm@11.28.0 --activate
node scripts/check-runtime.mjs --require-pnpm
  • Go Task (optional, for Taskfile commands)

Quick Start

# Setup
pnpm install
cp .env.example .env

# All quality gates (lint + format + typecheck + test + build)
pnpm verify

# Or, if you use Go Task:
task verify

# Use focused checks while iterating:
pnpm format:check          # Prettier
pnpm typecheck             # TypeScript
pnpm lint                  # ESLint

# Test
pnpm test                  # Vitest suite
pnpm test:coverage         # With coverage report

# Golden E2E fixture smoke tests are included in `pnpm test`
# See docs/golden-fixtures.md for fixture architecture

# Build & run
pnpm build                 # tsc -> dist/
pnpm build:extension       # Bundle EasyEDA Pro extension
pnpm verify:extension      # Verify extension package contents
pnpm dev                   # Hot-reload dev mode
pnpm start                 # Run compiled build

# MCP Inspector (debug UI)
pnpm inspector

Available Taskfile Commands

This project includes a Taskfile.yml with the following commands:

Command

Description

task install

Install dependencies

task lint

Run ESLint

task format

Check formatting with Prettier

task typecheck

Run TypeScript type checking

task test

Run tests

task build

Build the project

task verify

Run all quality gates via Taskfile

The package also exposes pnpm verify, which runs the same CI-equivalent local gate without requiring Go Task.

Install Go Task to use these commands.

Project structure

src/
├── index.ts                 # Entry point (stdio or HTTP)
├── bridge/                  # EasyEDA Pro WebSocket bridge protocol
│   ├── manager.ts, protocol.ts, types.ts
├── cli/                     # Client auto-setup (setup/extension CLI commands)
├── config/                  # Environment, tool profiles, feature flags
│   ├── env.ts, profiles.ts, feature-flags.ts, version.ts
├── remote/                  # Hosted/self-hosted remote MCP gateway, session router, scopes
├── schemas/                 # Shared Zod schemas
├── server/                  # MCP server core
│   ├── factory.ts, resources-prompts.ts
│   └── transports/
│       ├── http.ts                    # HTTP/Streamable HTTP transport
│       └── oauth-resource-metadata.ts
├── storage/                 # Node.js sqlite storage (cache, artifacts)
├── tools/                   # Up to 115 profile-gated MCP tool definitions
│   ├── register.ts, registry.ts, types.ts, transaction.ts
│   ├── L0_diagnostics_core.ts, L0_diagnostics_api.ts
│   ├── L1_schematic_read.ts, L1_schematic_write.ts
│   ├── L1_bom_core.ts, L1_bom_sourcing.ts
│   └── L1_drc_erc.ts, L1_board.ts, L1_export.ts, L1_pcb_constraints.ts, L1_pcb_write.ts
├── vendors/                 # Supplier API clients (lcsc/, jlcpcb/, mouser/, digikey/)
└── ...                      # circuit, pcb-layout, net-validation, power-tree, production-qa,
                              # quote-gating, safety, observability, catalog, bom-quality,
                              # export-manifest, live, easyeda-runtime

easyeda-bridge-extension/    # EasyEDA Pro bridge extension workspace package

Security

See Security Architecture & Threat Model for the complete security reference, including deployment modes, authentication, tool safety controls, secrets management, safe defaults, supplier API security, threat scenarios, and deployment checklists.

  • Network safety: Validates config at startup in every environment — rejects non-loopback HTTP without complete OAuth and an explicit non-wildcard origin allowlist

  • OAuth/JWKS: Bearer token validation via JWKS endpoint for HTTP transport (see OAuth section)

  • Rate limiting: Per-IP sliding window rate limiter on HTTP transport (default 100 req/min)

  • Path traversal protection: All file export paths validated against ARTIFACT_DIR

  • Secret redaction: API keys, tokens, passwords are redacted from logs and diagnostic output

  • Branch protection: Governance policy requires code reviews and status checks on the main branch (see Repository Governance)

  • Code scanning: CodeQL analysis runs on every push and PR (security-extended + security-and-quality queries)

  • Dependency management: Renovate policy is configured in-repository; hosted-provider activity is verified through a Renovate Dependency Dashboard or Renovate-authored update activity. Dependency Audit, Dependency Review, Socket, and CodeQL provide independent security signals.

  • Supply-chain hygiene: pnpm workspace build, pinned GitHub Actions, and no native SQLite addon dependency

  • Reporting: See SECURITY.md for vulnerability disclosure


Release & Dependency Automation

This repository uses automated workflows to manage dependencies and releases:

  • Renovate: .github/renovate.json defines the repository's dependency-update policy. Hosted Renovate is an account-level prerequisite; treat a Dependency Dashboard or Renovate-authored update activity as proof that the provider is active. See Repository Governance.

  • Release Please: Automates stable version bumps, release metadata, and CHANGELOG.md. Numbered rc.N candidates use the isolated prerelease path. See the Release Policy and Release Process.

  • Secure Publishing: The release workflow rebuilds and verifies all assets, publishes npm with provenance to channel-safe latest or next dist-tags, uploads the extension and SBOM to the matching GitHub Release, and keeps GHCR/MCP Registry promotion aligned with the selected channel.


Support the project

If this project helps you save time while working with EasyEDA Pro, BOM workflows, or MCP integrations, you can support ongoing development via the Buy me a coffee button at the top of this README.


License

Current project-authored source is licensed under PolyForm Noncommercial 1.0.0. Commercial use requires a separate written license; see Commercial Licensing. Earlier MIT releases keep the MIT rights that applied when published. See Licensing.


Available Tools

73 tools
easyeda_api_inventoryEasyEDA API inventoryB
Read-onlyIdempotent

Inspect the live EasyEDA extension runtime and list available documented API classes, runtime paths, and methods.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
totalYes
classesYes
not_availableNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds that it inspects the 'live' runtime rather than static docs, which is mildly useful, but says nothing about cost, pagination, or what 'documented' excludes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the action and resource, no filler. It is arguably too terse rather than too long, but structurally clean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, but the undocumented 'filter' parameter and the absence of any tie-breaker against seven other introspection-style siblings leave the definition not quite complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'filter' parameter has 0% schema description coverage, and the description never mentions it or explains its syntax (substring? glob? class-name match?). With a real parameter present and no schema help, the description should compensate but does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list/inspect) and a distinct resource (documented API classes, runtime paths, methods) in the live EasyEDA extension runtime. This is clearly separable from siblings like easyeda_get_capabilities or easyeda_get_feature_flags, though the description never names those siblings to reinforce the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No indication of when to use this versus easyeda_get_capabilities, easyeda_get_tool_profiles, or the other introspection siblings. The agent is left to infer the distinction from the resource noun alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_board_dimensionsGet board dimensionsB
Read-onlyIdempotent

Get the PCB board outline dimensions, shape, and mounting hole information.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
shapeNo
area_mm2No
width_mmNo
height_mmNo
project_idYes
has_outlineYes
not_availableNo
mounting_hole_countYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds the useful scope of returned content (dimensions, shape, mounting holes) but says nothing about units, coordinate systems, or behavior when a board outline is undefined. With annotations carrying the safety burden, this is adequate but thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with the resource front-loaded and no wasted words. It is appropriately sized for a simple read tool, though it is arguably too terse to cover the parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the read-only safety profile. However, for a tool whose only input is an undocumented projectId, the description leaves the caller without guidance on the identifier, keeping it at minimum-viable completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one required parameter (projectId) with 0% description coverage, and the description never mentions it or clarifies what form the project identifier takes. Contrasted with the zero-parameter baseline of 4, a single undocumented required param that the description ignores is a real gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Get) and resource (PCB board outline dimensions, shape, mounting hole info), which is clearly distinct from sibling read tools like board_layers, board_stackup, and board_features. It is clear but never explicitly names or contrasts a sibling, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no indication of when to use this tool versus alternatives such as easyeda_board_features or easyeda_pcb_components, no prerequisites, and no exclusions. The agent must infer its place from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_board_featuresGet board featuresA
Read-onlyIdempotent

Get counts of board features. zones counts copper Pour boundaries only; native Fill and Region primitives are reported separately as fills and regions.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
padsYes
viasYes
fillsYes
zonesYes
tracksYes
regionsYes
componentsNo
project_idYes
not_availableNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so safety is covered. The description adds real semantic disclosure beyond that: it defines what 'zones' counts (copper Pour boundaries only) versus native Fill and Region primitives, which prevents misreading the counts. It does not discuss cost, limits, or scope beyond this.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core action and followed by the disambiguating semantics. No filler or restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return formatting needn't be explained, and the description supplies the one piece of non-obvious context an agent needs — the zones/fills/regions distinction. For a single-parameter read tool this is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single required parameter (projectId) is never mentioned in the description. However, with only one obvious identifier parameter, the description's silence is a minor gap rather than a serious one, so it sits at the baseline for a simple tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get counts of board features.' The second sentence sharpens what is being counted (zones = copper Pour boundaries only) and distinguishes those from fills and regions, which map to sibling tools easyeda_pcb_fills and easyeda_pcb_regions. It is clear, though it doesn't name those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied — this is a summary/counting tool — and the note that fills and regions are reported separately hints at when to use this versus the dedicated fill/region tools. There is no explicit when-to-use or when-not-to-use statement, and no prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_board_layersList PCB layersB
Read-onlyIdempotent

List all layers in the PCB design including signal, power, plane, and mechanical layers.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
totalYes
layersYes
project_idYes
not_availableNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds useful context by naming the kinds of layers returned, but says nothing about scoping, permissions, or what an empty/partial layer list would mean.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource, with the enumeration of layer types packed in at the end. Nothing wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and annotations cover safety. For a simple read-only list tool the description is nearly sufficient, missing only the projectId linkage and a disambiguation from board_stackup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions projectId or any parameter. The single required parameter name is self-explanatory, but with zero coverage the description is expected to compensate and does not do so.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (PCB layers) and enumerates the layer categories returned (signal, power, plane, mechanical). It does not, however, distinguish itself from the nearby easyeda_board_stackup sibling, which an agent could easily confuse with this one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites, and no pointer to alternatives such as easyeda_board_stackup for stackup-specific questions. The agent is left to infer the tool's place in the PCB inspection family.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_board_stackupGet board stackupB
Read-onlyIdempotent

Get the PCB layer stackup including thickness, material, and dielectric constants.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
layersYes
project_idYes
data_sourceNo
total_layersYes
not_availableNo
board_thickness_mmNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds the payload contents (thickness, material, dielectric constants), a small but genuine addition; it says nothing about scoping or failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact sentence, front-loaded with the verb and resource, with no filler. Efficient, though it could have spent a clause on the projectId requirement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, and the annotations cover the read-only nature. However, the required projectId is left completely unexplained, which for a one-parameter tool is the main thing an agent needs in order to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%: projectId is typed only as a plain string with no description, and the tool description never explains what projectId refers to, its format, or how to obtain it. For the sole required parameter this is a real gap the description should have closed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (PCB layer stackup) and enumerates the returned content (thickness, material, dielectric constants), which separates it from the nearby easyeda_board_layers sibling. It is clear but never explicitly distinguishes itself from that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement of when to use this tool versus easyeda_board_layers, easyeda_board_dimensions, or easyeda_board_features, nor any prerequisites. The agent must infer the context entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_bom_exportExport BOMC

Export the bill of materials to a file on disk in the specified format.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNocsv
filePathYes
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
formatYes
exportedYes
file_pathYes
project_idYes
entry_countNo
not_availableNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=false, destructiveHint=false) already tell the agent this performs a non-destructive write, and the description confirms it writes a file to disk. It does not disclose whether an existing file is overwritten, whether directories are created, or permission requirements — meaningful gaps for a file-writing tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-formed sentence with no wasted words and the action front-loaded. It is efficient, though the terseness is a consequence of under-specification rather than deliberate density.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Return values are covered by the output schema, but the description leaves the required projectId parameter and format options entirely unexplained, and gives no usage context among four-plus BOM siblings. For a 3-parameter write tool with 0% schema coverage, this is inadequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the load. It hints at 'specified format' (the format enum) and 'file on disk' (filePath) but never explains the required projectId, what project identity means here, or the allowed format values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (export), resource (bill of materials), and destination (a file on disk), which is more than a restatement of the name. It does not name or contrast with the adjacent siblings (easyeda_bom_generate, easyeda_bom_validate, easyeda_bom_quality_report), so an agent must infer the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance at all. Given several BOM-related siblings (generate, validate, sourcing, quality_report), the description should say when to export vs. generate, but it offers no selection criteria or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_bom_generateGenerate BOMC
Read-onlyIdempotent

Generate a bill of materials for the project with grouping and formatting options.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNojson
groupByNovalue
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
formatYes
entriesYes
group_byYes
project_idYes
not_availableNo
total_entriesYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so safety/idempotency are covered structurally. The description adds no behavioral context beyond that: nothing about whether the BOM is persisted, written to disk, or only returned, and nothing about defaults or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the core action front-loaded. Nothing is wasted, though the phrase 'with grouping and formatting options' could be more specific about what those options do.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the read-only profile is covered by annotations. Still, for a tool sitting in a cluster of five other BOM tools, the description leaves the selection decision and parameter meaning underspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the schema documents only enums and defaults, not meaning. The description's 'grouping and formatting options' loosely maps to groupBy and format, which is some added value, but it says nothing about the semantics of the grouping modes or format choices, and projectId is entirely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Generate a bill of materials for the project') and hints at the two adjustable axes (grouping, formatting). However, it never differentiates from close siblings like easyeda_bom_export, easyeda_bom_validate, or easyeda_bom_quality_report, so an agent must guess which BOM tool to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no exclusions, and no mention of the alternatives (bom_export, bom_validate, bom_quality_report, bom_sourcing) despite heavy sibling overlap. The agent gets no help deciding between generation and export.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_bom_quality_reportBOM Quality ReportB
Read-onlyIdempotent

Generate a BOM quality report that identifies unavailable, single-source, missing-MPN, missing-footprint, and low-stock items across configured suppliers.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes
require_mpnNo
require_footprintNo
low_stock_thresholdNo
minimum_quality_scoreNo
stale_vendor_data_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
bom_idYes
entriesYes
summaryYes
generated_atYes
not_availableNo
total_entriesYes
has_supplier_errorsYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds that the report spans 'configured suppliers', hinting at an external/supplier-data dependency, but says nothing about whether live supplier queries occur, latency, or failures when no suppliers are configured.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence with the action front-loaded and the diagnostic categories trailing for scanning. It is efficient, though the five-item list is somewhat comma-heavy without indicating which checks are default-on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape need not be described. However, for a 6-parameter tool with zero schema descriptions, an agent cannot determine the units or effect of minimum_quality_score or stale_vendor_data_seconds from either source, leaving a real gap before invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 6 parameters, so the description carries the burden. Its checklist ('missing-MPN', 'missing-footprint', 'low-stock items') implicitly maps to require_mpn, require_footprint, and low_stock_threshold, but minimum_quality_score and stale_vendor_data_seconds are left entirely undefined in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Generate a BOM quality report') and enumerates the exact defect classes it surfaces (unavailable, single-source, missing-MPN, missing-footprint, low-stock). This separates it functionally from easyeda_bom_generate, easyeda_bom_export and easyeda_bom_validate, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The enumerated check categories imply when the tool is useful (pre-sourcing BOM audit), but there is no statement of when to prefer it over easyeda_bom_validate or easyeda_bom_sourcing, and no prerequisites or exclusions are given. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_bom_sourcingGet BOM sourcing infoC
Read-onlyIdempotent

Retrieve pricing and availability information for all parts in the project BOM from specified suppliers.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes
suppliersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
partsYes
project_idYes
total_partsYes
not_availableNo
keyless_sourcing_enabledNo

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds almost no behavioral context beyond that: it does not say what happens if 'suppliers' is omitted (all suppliers? default set?), whether it hits an external network/API, or how stale the pricing data may be. The phrase 'from specified suppliers' is the only added detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler or redundancy. It is appropriately sized, though it is perhaps too terse given the parameter ambiguity it leaves unresolved.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value structure need not be described. Still, for a tool with 0% schema parameter coverage, the description omits the supplier-value format and default behavior, which are needed to invoke it correctly. Adequate but with a clear gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden for both parameters. It implies projectId (the BOM project) and suppliers, but gives no guidance on supplier identifier format (names? IDs? enum values?) or whether the suppliers list is optional with a default. This leaves genuine ambiguity for the caller.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Retrieve') and resource ('pricing and availability information for all parts in the project BOM'), which is clearly distinguishable from siblings like easyeda_bom_validate, easyeda_bom_export, and easyeda_bom_quality_report. However, it never explicitly names or contrasts itself with those siblings, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says nothing about when to use this tool versus the other BOM tools (validate, export, generate, quality_report), nor any prerequisites such as whether the BOM must already exist. Usage must be inferred entirely from the name and purpose sentence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_bom_validateValidate BOMB
Read-onlyIdempotent

Validate the project BOM against LCSC inventory to identify missing, obsolete, or alternate parts.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
obsoleteYes
validatedYes
project_idYes
total_partsYes
valid_countYes
invalid_lcscYes
missing_lcscYes
not_availableNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds that validation is performed against external LCSC inventory (an external dependency) and enumerates the finding types, but says nothing about permissions, whether the check is cached/live, or latency expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with no filler, leading with the verb and resource. It is efficient, though a touch terse given the tool sits among several near-neighbor BOM tools.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers the operation and its finding categories. However it omits the when-to-use routing among the BOM siblings and any meaning for the sole parameter, leaving genuine gaps for an agent choosing between tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter (projectId) is undocumented in the schema. The description only alludes to it via 'the project BOM,' adding negligible meaning; a low-coverage single param deserves at least a note on what identifier is expected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (validate), resource (project BOM), and data source (LCSC inventory), plus the concrete finding categories (missing, obsolete, alternate parts). This distinguishes it from easyeda_bom_quality_report and easyeda_bom_sourcing in substance, though it never names a sibling to sharpen the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The LCSC-inventory framing implies the scenario (checking procurement readiness of a BOM), so usage is inferable, but there is no explicit when-to-use, no prerequisite, and no guidance on choosing this over easyeda_bom_quality_report or easyeda_bom_sourcing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_bridge_statusBridge statusA
Read-onlyIdempotent

Check EasyEDA Pro bridge connection status, version, and capabilities.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dev_modeNo
connectedYes
owner_pidNo
uptime_msNo
owner_portNo
diagnosticsNo
capabilitiesNo
status_errorNo
bridge_versionNo
easyeda_versionNo
last_heartbeat_msNo
blocked_by_other_instanceNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds that version and capabilities are included in the response, a small amount of context beyond the structured fields, but no detail on what 'capabilities' means or connection failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence that front-loads the primary purpose and appends the secondary returns. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be detailed in prose, and a zero-parameter read-only status tool is inherently simple. Slight gap: no hint about what the bridge status values mean or how to react to a disconnected state.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema imposes no semantic burden and the baseline is 4. Nothing in the description is required to explain inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Check') and resource ('EasyEDA Pro bridge connection status') plus the fields returned (version, capabilities). However, it does not distinguish itself from adjacent siblings like easyeda_health_check or easyeda_get_capabilities, which cover overlapping ground.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when this should be used versus easyeda_health_check, easyeda_get_feature_flags, or easyeda_get_capabilities, all of which appear to query related state. The agent must infer the distinction from names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_canvas_captureCapture canvas imageA
Read-only

Capture the visible EasyEDA schematic/PCB canvas as PNG. Captures the given tab or last-focused tab. Oversized PNGs are downsampled without cropping and report original/final dimensions.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
capturedYes
file_nameNo
mime_typeNo
byte_lengthNo
downsampledNo
image_base64No
not_availableNo
image_dimensionsNo
payload_budget_bytesNo
original_image_dimensionsNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=false; the description adds real behavioral context beyond that: oversized PNGs are downsampled without cropping and original/final dimensions are reported. This is useful, non-obvious behavior for a capture tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no wasted words; the core action is front-loaded and the downsampling caveat follows immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, yet the description still notes what gets reported (original/final dimensions). For a single-param capture tool this is nearly complete; only sibling differentiation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and there is one optional parameter (tabId). The description compensates by explaining that the tab is either the given one or the last-focused tab, which clarifies the optional/default semantics beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: captures the visible EasyEDA schematic/PCB canvas as PNG. This clearly distinguishes it from most siblings, though it does not explicitly contrast with the close sibling easyeda_canvas_capture_region (which implies a sub-region capture).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides implied context via 'the given tab or last-focused tab', telling the agent the capture target defaults to the active tab. However, it gives no explicit when-to-use guidance nor routes the agent between this tool and easyeda_canvas_capture_region or easyeda_canvas_locate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_canvas_capture_regionCapture canvas region imageA
Read-only

Zoom to a rectangular document/canvas region and capture it as PNG. This moves the visible viewport. Oversized PNGs are downsampled without cropping, preserving the complete requested region.

ParametersJSON Schema
NameRequiredDescriptionDefault
topYesFirst vertical edge in document/canvas coordinates.
leftYesFirst horizontal edge in document/canvas coordinates.
rightYesSecond horizontal edge; either edge order is accepted.
tabIdNo
bottomYesSecond vertical edge; either edge order is accepted.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
capturedYes
file_nameNo
mime_typeNo
byte_lengthNo
downsampledNo
image_base64No
not_availableNo
image_dimensionsNo
payload_budget_bytesNo
original_image_dimensionsNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds two behavioral facts that annotations do not carry: the call mutates viewport state ('This moves the visible viewport'), which explains the idempotentHint=false, and oversized results are downsampled rather than cropped, so the requested region is preserved. It stops short of stating any size threshold or resolution cap for the downsampling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each carrying a distinct fact (what it does, the viewport side effect, the downsampling guarantee), with the core action front-loaded. No filler or repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a capture tool with an output schema to describe the returned image, the description covers action, side effect, and result-fidelity behavior adequately. The only remaining gap is how the tab scope (tabId) interacts with the capture, which neither schema nor description explains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80% and the coordinate parameters are already documented in the schema (including edge-order tolerance); the description adds no coordinate semantics of its own. The undocumented tabId remains unexplained in both places, so the baseline 3 holds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource+output format ('Zoom to a rectangular document/canvas region and capture it as PNG'), which cleanly separates it from the sibling easyeda_canvas_capture (full canvas) and easyeda_canvas_locate. An agent can distinguish it from every other canvas/board tool without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied by the region-capture framing, but there is no explicit when-to-use-vs-alternatives guidance: nothing says to prefer easyeda_canvas_capture for whole-canvas shots or easyeda_canvas_locate for coordinate lookup. The viewport-move warning is a helpful hint but not routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_canvas_locateZoom canvas to coordinateA
Read-only

Zoom the EasyEDA canvas to a coordinate/scale (document/canvas coordinates), returning the resulting viewport rectangle. Useful to frame a location before calling easyeda_canvas_capture, or standalone to navigate the user's view to a point of interest.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
tabIdNo
scaleRatioNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
topNo
leftNo
errorNo
rightNo
bottomNo
locatedYes
not_availableNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=false), and the description adds context beyond them: it clarifies the coordinate space (document/canvas coordinates) and discloses that the call has a visible side effect on the user's viewport, which is what makes idempotentHint=false intelligible. It does not describe rate limits or how tabId scoping behaves, so it falls short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences, with the core action front-loaded and the usage routing second. No filler or restated name/title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description needn't detail the return value, though it helpfully summarizes it as the resulting viewport rectangle. Combined with the disclosed coordinate space and sibling routing, an agent has enough to call it correctly; only the tabId parameter remains opaque.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It does clarify the meaning of x/y ('coordinate', 'document/canvas coordinates') and scale, which is real added value, but tabId is left completely unexplained and no format or default values are given for the optional parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Zoom) + resource (EasyEDA canvas) + input semantics (coordinate/scale) + return value (viewport rectangle). It also distinguishes itself from easyeda_canvas_capture by naming that sibling directly, so an agent can tell them apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states both usage modes: 'to frame a location before calling easyeda_canvas_capture, or standalone to navigate the user's view to a point of interest.' The alternative and the condition selecting it are both named, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_design_rules_lookupLook up engineering design-rule reference guidanceA
Read-onlyIdempotent

Look up generic engineering reference guidance: IPC-2221 trace-width/current-capacity, clearance bands, protocol routing data (USB/RS-485/I2C/SPI/UART/Ethernet), decoupling recipes and bulk capacitance sizing, and a static DFM checklist. Every result cites a source and caveat: these are estimates, not certified values.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoOptional DFM checklist item id.
layerNoRequired for trace-width and max-current. Conductor layer location.
loadANoRequired when topic is bulk-capacitance. Load current in amperes.
topicYesReference topic to look up.
categoryNoOptional category filter for decoupling or dfm-checklist.
currentANoRequired when topic is trace-width. Load current in amperes.
locationNoRequired when topic is clearance. Clearance location.
protocolNoOptional protocol filter when topic is protocol-routing.
voltageVNoRequired when topic is clearance. Working voltage in volts.
copperWeightOzNoRequired for trace-width and max-current. Copper weight in oz/ft².
traceWidthMilsNoRequired when topic is max-current. Trace width in mils.
temperatureRiseCNoRequired for trace-width and max-current. Allowed temperature rise in °C.
minBulkCapacitanceUfNoOptional absolute minimum bulk capacitance in µF.
minBulkCapacitanceUfPerANoOptional minimum bulk capacitance per ampere in µF/A.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
topicYes
clearanceNo
decouplingNo
maxCurrentNo
traceWidthNo
dfmChecklistNo
decouplingListNo
bulkCapacitanceNo
protocolRoutingNo
dfmChecklistItemNo
protocolRoutingListNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: results cite a source and caveat, and the values are explicitly estimates rather than certified — important for an agent deciding how much to trust the output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the verb and resource, dense with the covered domains, and ending on the critical trust caveat. No filler and nothing repeated from the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, and it correctly focuses on scope and trust limits. Combined with full schema coverage and read-only annotations, an agent has everything needed to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (topic, layer, loadA, currentA, protocol, etc.) is already documented in the schema, setting the baseline at 3. The description enumerates topic domains that map onto the topic enum but adds no format, conditional-requirement, or unit nuance beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Look up") plus the exact resource (generic engineering reference guidance) and enumerates the covered domains: IPC-2221 trace-width/current-capacity, clearance bands, protocol routing, decoupling, bulk capacitance, DFM checklist. This clearly separates it from sibling check tools like easyeda_drc_run and easyeda_erc_run, which evaluate an actual board rather than return static reference data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys the reference/estimates nature and contrasts against certified values, which implicitly signals when to use it over real DRC/ERC checks. However, it never names an alternative tool or states an explicit condition for choosing this over a live rule check, so the routing guidance is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_drc_runRun design rule checkA
Idempotent

Run EasyEDA Pro's native PCB DRC and refresh its visible DRC panel. Requires a PCB document to be focused; otherwise returns an indeterminate not_available result with an actionable focus error. Returns coarse severity counts; per-violation detail stays in EasyEDA Pro.

ParametersJSON Schema
NameRequiredDescriptionDefault
rulesNo
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
passedYes
project_idYes
violationsYes
error_countYes
not_availableNo
warning_countYes
total_violationsYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is partly covered. The description adds genuinely new context: the focus prerequisite, the not_available failure mode, and the fact that only coarse severity counts come back while per-violation detail stays inside EasyEDA Pro. It does not explain the non-read-only side effect beyond 'refreshing the panel'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action, then the precondition, then the return-shape caveat. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description is not obligated to spell out return values, and it usefully notes the coarse-count limitation. However, the two input parameters, especially the 'rules' override array, are entirely unexplained, leaving an agent unable to use the tool's filtering capability confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions either parameter, including the required projectId or the optional 'rules' filter array. With zero documentation in the schema, the description needed to compensate and does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: running EasyEDA Pro's native PCB DRC and refreshing the visible DRC panel. This is clearly distinguishable from neighboring diagnostic tools such as easyeda_pcb_constraint_check and easyeda_rule_check_summary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition ('Requires a PCB document to be focused') and the consequence of not meeting it (indeterminate not_available with a focus error). It does not name or exclude sibling alternatives like pcb_constraint_check, so it falls short of a full when/when-not routing statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_erc_runRun electrical rule checkA
Idempotent

Run native schematic ERC and supplement aggregate counts with inferred_floating_pins. Requires a focused schematic. Explicit focused is supported; page/all_pages fail closed on EasyEDA Pro 3.2.149. Native counts remain authoritative; unavailable focus returns not_available.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo
checksNo
pageUuidNo
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
passedYes
error_codeNo
error_dataNo
project_idYes
read_scopeNo
violationsYes
error_countYes
detail_sourceNo
not_availableNo
warning_countYes
total_violationsYes
inferred_floating_pinsNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly false, idempotent true, destructive false), so the description's added value is the failure behavior: fail-closed scopes, native counts being authoritative, and 'not_available' on unavailable focus. That is meaningful beyond structured fields, though the version-specific 'fails closed' condition is narrow.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the action and its precondition, then failure modes. Dense but every sentence carries information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, and the scope/failure behavior is covered. However, with four parameters and zero schema description coverage, the description leaves checks and pageUuid entirely unexplained, which is a real gap for a tool the agent must configure correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explains the scope enum semantics well (focused works, page/all_pages fail on this version), but says nothing about checks, pageUuid, or the required projectId, leaving half the parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run native schematic ERC') and adds that it supplements aggregate counts with inferred_floating_pins, so the agent knows it is a native ERC plus an extra inferred metric. The 'native' qualifier implicitly separates it from easyeda_semantic_erc_validate/auto, but those siblings are never named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear precondition ('Requires a focused schematic') and states which scope values work versus fail ('explicit focused is supported; page/all_pages fail closed on EasyEDA Pro 3.2.149'). No alternative tool is named for cases where focus is unavailable, which is the only gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_export_gerbersExport Gerber filesC
Idempotent

Export PCB design to Gerber files for PCB fabrication.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathNo
ledPanelNo
projectIdYes
drillFormatNo
excludeLayerNo
productionReviewNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
exportedYes
file_countNo
project_idYes
byte_lengthNo
artifact_pathNo
not_availableNo
production_reviewNo
blocked_by_production_reviewNo

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, which covers the safety profile, but the description adds nothing behavioral. It does not say whether files are overwritten, what filePath defaults to, or what productionReview mode 'block' does — the only non-obvious behavior in this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler or redundancy. Brevity is appropriate in form, though it is brevity achieved by omission rather than by tight editing of necessary content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter, nested-object tool with no schema descriptions and 0% coverage, the description leaves the parameters entirely undocumented (the output schema handles return values). The core call — what filePath, drillFormat, excludeLayer, and productionReview do — is not addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% across 6 parameters, including an enum (drillFormat), an array (excludeLayer), and a nested object (productionReview with mode/boardData). The description explains none of them, so an agent gets no help on drill format, layer exclusion, or review mode semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Export PCB design to Gerber files', with the end goal (PCB fabrication) named. It is clearly distinguishable from siblings like easyeda_bom_export or easyeda_pcb_production_review, though it does not explicitly contrast with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use context, no prerequisites (e.g. must the PCB be synced from schematic first?), and no alternatives such as easyeda_pcb_production_review. The 'for PCB fabrication' phrase hints at intent but is not actionable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_get_capabilitiesGet capabilitiesB
Read-onlyIdempotent

Return server capabilities, including available profiles, enabled feature flags, and supported operations.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
profilesYes
transportsYes
server_nameYes
feature_flagsYes
server_versionYes
current_profileYes
feature_maturityYes
protocol_versionYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds what is returned (profiles, flags, operations), but since an output schema exists, that content is largely redundant rather than additive behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. Slightly padded by listing return contents that the output schema already documents, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, no-arg invocation, and annotations covering safety, the description supplies enough for an agent to call it correctly. The only real omission is how it relates to the narrower sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so there is nothing to disambiguate; the baseline for a no-param tool is 4. The description correctly implies no input is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (server capabilities) and enumerates the contents: profiles, feature flags, supported operations. However, it does not differentiate itself from close siblings like easyeda_get_feature_flags, easyeda_get_tool_profiles, and easyeda_get_server_config, which cover overlapping ground.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to call this versus the more targeted siblings (get_feature_flags, get_tool_profiles, get_server_config). An agent must infer that this is the broad aggregate call rather than the narrow one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_get_feature_flagsGet feature flagsB
Read-onlyIdempotent

Return current feature flag values.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
flagsYes
maturityYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so safety is covered. The description adds nothing beyond that — no note on whether flags are per-project, cached, or mutable server-side state, which is the kind of context that would justify a higher score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with no filler, and the resource is front-loaded. It is efficient, though it is arguably under-specified rather than deliberately tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and an output schema present, return-value explanation is unnecessary, so the description is close to sufficient. The remaining gap is routing: nothing tells the agent how this differs from the other easyeda_get_* introspection tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return ... feature flag values'), so an agent knows it reads runtime feature-flag state rather than design data. However, it offers no differentiation from nearby read-only siblings such as easyeda_get_capabilities, easyeda_get_server_config, or easyeda_get_tool_profiles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus the other introspection tools, nor any prerequisite or exclusion. The agent must infer usage purely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_get_server_configGet server configB
Read-onlyIdempotent

Return safe (redacted) server configuration. Secrets are never exposed.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_flagsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
flagsNo
profileYes
node_envYes
log_levelYes
transportYes
bridge_hostYes
bridge_portYes
feature_maturityYes
mcp_protocol_versionYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered structurally. The description adds a genuine behavioral guarantee beyond that ('secrets are never exposed', output is redacted), which is useful for deciding whether the result is safe to surface. However, it says nothing about the shape or size of the config returned, or whether any config classes are withheld entirely.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, and the most important fact (redaction) is front-loaded. It is efficient, though the extreme brevity is part of why the parameter gap above goes unexplained.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described here, and the read-only nature is carried by annotations. The remaining gaps are the undocumented 'include_flags' parameter and the absence of any routing versus sibling introspection tools, leaving this definition only minimally adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter 'include_flags' (boolean, default false) is never explained in the description. An agent cannot tell from either source what flags would be included or how the output changes when it is set. With one undocumented parameter, the description should have compensated and does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Return server configuration') and adds a meaningful scope qualifier ('safe/redacted'). It is clear enough to act on, but it does not differentiate itself from closely related siblings such as get_feature_flags, get_capabilities, or get_tool_profiles, which also read server-side metadata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance is given. The description does not say under which circumstances an agent should call this instead of the adjacent introspection tools, nor does it state any prerequisites. The only hint of applicability is the implicit 'debugging/inspection' framing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_get_tool_profilesGet tool profilesB
Read-onlyIdempotent

List available tool profiles and their descriptions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
currentYes
profilesYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds nothing beyond that: it does not say whether profiles are static or dynamic, what a 'profile' represents, or whether the list is exhaustive or filtered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence that is front-loaded with the verb and resource, with nothing wasted. It is arguably under-specified rather than verbose, but structurally clean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. Still, the key concept ('tool profile') is left undefined and undistinguished from sibling introspection tools, so the description is only minimally complete for a discovery call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, and the description correctly implies no input is required. With no parameters to document, the baseline of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List available tool profiles and their descriptions'), so an agent knows exactly what the tool returns. However, it offers no differentiation from nearby introspection siblings such as easyeda_get_capabilities, easyeda_get_feature_flags, or easyeda_api_inventory, leaving the agent to guess which listing is relevant.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this versus the many other capability/inventory tools. No prerequisites, no context, no exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_health_checkHealth checkA
Read-onlyIdempotent

Return server health status in one call: runtime version, active profile, bridge state, EasyEDA version, keyless sourcing state, and starter catalog size. Intended as the single actionable status check after first connecting the bridge extension.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
upsYes
statusYes
profileYes
versionYes
owner_pidNo
transportYes
owner_portNo
node_versionYes
status_errorNo
easyeda_versionNo
bridge_connectedYes
extension_versionNo
registry_mismatchYes
catalog_device_countYes
keyless_sourcing_enabledYes
blocked_by_other_instanceNo
extension_version_mismatchYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so safety is covered. The description adds the meaningful behavioral trait that this consolidates six signals 'in one call,' which is the reason to pick it over several narrower probes; it stops short of noting cost or refresh characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The payload list comes first and the usage cue second, so the agent gets the 'what' before the 'when' with nothing wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Zero parameters, full annotation coverage, and an output schema that carries the return shape, so the description only needed to state the aggregate scope and the entry-point role — both are present. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric this is the baseline 4. The description correctly implies a no-argument call ('in one call') and there is nothing further the schema leaves ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('return server health status') and enumerates the exact payload (runtime version, profile, bridge state, EasyEDA version, keyless sourcing, catalog size), so it reads as an aggregate status roll-up. It does not explicitly differentiate itself from close siblings like easyeda_bridge_status or easyeda_get_server_config, so the agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear situational trigger: 'the single actionable status check after first connecting the bridge extension.' That tells the agent when to reach for it rather than a narrower sibling, but it never names an alternative or states exclusions (e.g. after the bridge is already healthy, prefer bridge_status).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_observability_reportObservability reportA
Read-onlyIdempotent

Return latency budgets, runtime metrics, cache/vendor timing snapshot, and storage retention policy for performance diagnostics.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeRecentEventsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
budgetsYes
metricsYes
retentionYes
generated_atYes
server_versionYes
timeout_policyYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the description need not restate them. It adds useful context about what data is returned (timing snapshots, retention policy), though it doesn't describe freshness, scope, or whether data is aggregated vs. live.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that lists exactly what the tool returns with no filler. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return value details are not required in the description. Annotations cover safety. The main gap is the undocumented `includeRecentEvents` parameter, but for a read-only diagnostics tool this is a minor completeness issue.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the single parameter `includeRecentEvents` is undocumented in the schema. The description does not mention this parameter at all, leaving its semantics (default true, what events are included) unexplained. Baseline 3 for a one-parameter tool with no compensating description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (latency budgets, runtime metrics, cache/vendor timing, storage retention policy), clearly identifying this as a diagnostics/observability tool. However, it does not explicitly differentiate from siblings like easyeda_health_check, easyeda_bridge_status, or easyeda_get_server_config, which also serve operational/status purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like easyeda_health_check or easyeda_get_server_config. The phrase 'for performance diagnostics' hints at context but does not name conditions or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_pcb_componentsList PCB componentsA
Read-onlyIdempotent

List components placed on the active PCB layout: primitiveId, designator, footprint identity, position/rotation/layer. Requires a focused PCB tab in EasyEDA Pro — returns an empty list (not an error) if none is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
totalYes
componentsYes
project_idYes
not_availableNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint and idempotentHint already provided, the description adds useful behavioral context: the focused-tab prerequisite and the fact that an empty list is returned rather than an error when no PCB tab is active. It does not cover pagination or permission details beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and returned fields, followed by a compact prerequisite/behavior note. It is appropriately sized with no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values need not be fully explained, and the annotations cover safety traits. However, with zero schema description coverage, the missing parameter documentation (projectId, limit, offset) leaves a meaningful gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for all three parameters, and the description does not explain projectId, limit, or offset. It mentions returned fields, not input parameters, so it fails to compensate for the undocumented schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (List) and resource (components placed on the active PCB layout), and it names the returned identity fields. It clearly distinguishes this PCB component listing from sibling tools like pcb_tracks and schematic_components by specifying 'active PCB layout'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: the tool requires a focused PCB tab in EasyEDA Pro, and it describes the no-active-tab behavior. However, it does not explicitly compare against alternatives or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_pcb_constraint_checkCheck PCB constraintsC
Read-onlyIdempotent

Run PCB constraint validation against the board design. Checks board outline, layer stackup, net classes, clearance rules, keepout areas, placement zones, mounting holes, fiducials, and manufacturing constraints.

ParametersJSON Schema
NameRequiredDescriptionDefault
boardDataNo
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYes
errorsYes
summaryYes
warningsYes
project_idYes
not_availableNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description usefully enumerates the validation categories, but does not say what a failing check does, whether it merely reports or blocks, or how results are surfaced, so it adds limited behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and followed by a scannable list of checks. No filler, though the long enumeration is dense rather than informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, but with 0% schema coverage on a large nested input object the description is far too thin on inputs. For a tool of this complexity it should explain the boardData contract.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the tool takes a complex nested boardData object with dozens of undocumented fields plus projectId. The description names validation categories that only loosely imply some fields but explains no parameter meaning or required structure, so it fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Run ... validation') and resource ('PCB constraint') and enumerates exactly what is checked. However, it never distinguishes itself from close siblings like easyeda_pcb_constraint_report or easyeda_drc_run, leaving an agent to guess which validation entry point to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus easyeda_drc_run, easyeda_rule_check_summary, or easyeda_pcb_constraint_report, nor any stated prerequisites. The agent is left to infer usage entirely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_pcb_constraint_reportPCB constraint reportB
Read-onlyIdempotent

Generate a human-readable report explaining which PCB constraints were applied and which require manual review.

ParametersJSON Schema
NameRequiredDescriptionDefault
boardDataNo
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
checkedYes
verdictYes
project_idYes
not_availableNo
manualReviewRequiredYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds that the output explains applied constraints and flags items needing manual review, which is useful context about the result shape, but nothing about scope limits, data sourcing, or how boardData is consumed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler; the report's purpose and its two-part content (applied constraints, manual-review items) are stated immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. However, given a 2-parameter schema that is 0% documented and a heavily nested boardData object, the description leaves the agent without enough context to supply the request body correctly or to choose this tool over the constraint-check sibling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and boardData is a large nested object with ~40 undocumented fields, yet the description says nothing about what projectId or boardData must contain. An agent has no textual hint about required vs. optional board data or which fields drive the analysis.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Generate) + resource (PCB constraint report) with the output framed as a human-readable explanation of applied vs. manually-reviewed constraints. It is distinguishable from the sibling easyeda_pcb_constraint_check, though the description never explicitly says how it differs from a 'check'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, prerequisites, or alternatives. With easyeda_pcb_constraint_check and easyeda_pcb_production_review as siblings, the agent gets no signal about which to call for a constraint audit versus a report.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_pcb_fillsList PCB fillsA
Read-onlyIdempotent

List native PCB Fill primitives separately from copper pours/zones, including net/layer, fill mode, line width, lock state, and a bounded normalized polygon representation. Netless fills are returned explicitly with netless=true. Read-only; no Fill mutation is exposed.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
fillsYes
totalYes
project_idYes
not_availableNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnlyHint, idempotentHint), but the description adds substantive context: no Fill mutation is exposed, netless fills are returned rather than skipped, and polygons are emitted in a 'bounded normalized' form. This is value beyond the annotations, though pagination/rate behavior is unmentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, front-loaded with the discriminating scope before the detail about netless fills and the read-only guarantee. Every clause carries information; nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shapes need not be restated, and the description still summarizes the notable ones. The one real gap is undocumented pagination parameters, which leaves an agent guessing about result-set bounds.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions projectId, limit, or offset. The presence of limit/offset pagination parameters is a meaningful behavior an agent must know about, and neither the schema nor the description explains them, so the description does not compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (native PCB Fill primitives) and explicitly separates it from copper pours/zones, which is exactly the sibling confusion risk with easyeda_pcb_regions. It also enumerates the fields returned, so an agent knows what it gets without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context: use this for native Fill primitives, not pours/zones, and it notes that netless fills are surfaced explicitly with netless=true (a real selection gotcha). It does not name a sibling tool outright or state when-not to call it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_pcb_production_reviewRun PCB production reviewA
Read-onlyIdempotent

Run fabrication, assembly, and testability production review rules for PCB handoff. Reports severity-ranked DFM/DFA/DFT findings with actionable remediation before Gerber export or manufacturing submission.

ParametersJSON Schema
NameRequiredDescriptionDefault
gateModeNowarn
boardDataNo
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorsYes
passedYes
blockedYes
summaryYes
warningsYes
gate_modeYes
project_idYes
not_availableNo
severity_countsYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=true, idempotent=true, destructive=false, so the safety profile is covered. The description adds that output is severity-ranked findings with remediation, which is useful. But it never explains the gateMode semantics (warn vs block vs off), which is the one behaviorally significant aspect of this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with zero padding; purpose and placement in the workflow are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and annotations cover safety. But with 0% schema coverage and a deep nested parameter object, an agent cannot tell what inputs to supply or how gateMode changes behavior. The description is complete on purpose but incomplete on invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description mentions no parameter at all. Three parameters, one of which is a large nested boardData object with ~35 fields, are left entirely undocumented. gateMode's warn/block/off values in particular have behavioral meaning that the description should explain but does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (run) and resource (fabrication/assembly/testability production review rules) with scope clarified as PCB handoff, and the DFM/DFA/DFT framing plus 'before Gerber export' distinguishes it from easyeda_drc_run and easyeda_pcb_constraint_check. It stops short of naming those siblings explicitly, so a 4 rather than a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly places the tool in the workflow: 'before Gerber export or manufacturing submission.' That is real when-to-use context. However, it never names the alternative checks (DRC, constraint check) an agent should skip in favor of this one, so it lacks exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_pcb_regionsList PCB constraint regionsA
Read-onlyIdempotent

List native PCB Region primitives separately from copper pours/zones, including layer, region rule types/name, line width, lock state, and a bounded normalized polygon representation. Read-only; no Region mutation is exposed.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
totalYes
regionsYes
project_idYes
not_availableNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already assert readOnlyHint and idempotentHint, and the description harmonizes with them rather than contradicting ('Read-only; no Region mutation is exposed'). It adds real behavioral context beyond the annotations: the polygon is 'bounded normalized', and regions are 'native' vs. pour-derived geometry, which shapes how an agent interprets results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the core identity (native regions, not pours) front-loaded and the read-only guarantee trailing. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-format explanation is not owed. However, the pagination and projectId parameters are undocumented anywhere, and no note on large result sets or default limit (100, max 200) is given, leaving a real gap for a listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions limit, offset, or projectId. For a 3-parameter tool with an undocumented pagination pair and a required projectId, the description should compensate for the schema gap and does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (native PCB Region primitives) and explicitly scopes it against copper pours/zones, which distinguishes it from siblings like easyeda_pcb_fills, easyeda_pcb_tracks, and easyeda_pcb_vias. The listed attributes (layer, rule type/name, line width, lock state, polygon) further pin down the content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'separately from copper pours/zones' implies the boundary against the copper-fill siblings, but no tool is named and no when/when-not condition is stated. Usage is inferable rather than explicit, which is the definition of an implied-usage 3.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_pcb_tracksList PCB tracksA
Read-onlyIdempotent

List copper track segments on the active PCB layout: primitiveId, net, layer, start/end coordinates, width. A multi-point track drawn by add_track appears as several consecutive segments sharing one net. Returns an empty list (not an error) if no PCB tab is focused.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
totalYes
tracksYes
project_idYes
not_availableNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only/idempotent safety profile, and the description adds genuinely non-obvious behavior: a multi-point track surfaces as several segments sharing one net, and an unfocused PCB tab yields an empty list rather than an error. That empty-list contract is exactly the kind of disclosure that prevents agent confusion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the resource and scope, with the segment-grouping caveat and empty-list contract following. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the field list is somewhat redundant, but the empty-list behavior is useful. The gap is the undocumented limit/offset pagination semantics for a list tool, which an agent needs to page correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions projectId, limit, or offset. The fields it lists are return values, not parameters, so the three inputs remain undocumented in both schema and prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List copper track segments on the active PCB layout') and enumerates the returned fields, which cleanly distinguishes it from siblings like easyeda_pcb_vias, easyeda_pcb_fills, and easyeda_pcb_regions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly scopes usage to the active PCB layout and notes that tracks come from add_track, but it never says when to pick this over the neighboring PCB-primitive listers. Usage context is implied rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_pcb_viasList PCB viasB
Read-onlyIdempotent

List vias on the active PCB layout: primitiveId, net, position, hole/outer diameter (native unit, same scale as x/y — not independently verified against a known physical dimension). Requires a focused PCB tab — returns an empty list (not an error) if none is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
viasYes
errorNo
totalYes
project_idYes
not_availableNo

TDQS

B3.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and idempotent, so the safety profile is covered. The description adds valuable non-obvious traits: it requires a focused PCB tab, returns an empty list rather than an error when no tab is active, and caveats that the hole/outer diameter unit is not independently verified against a physical dimension. This goes well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and returned fields, then adds prerequisite and caveat information. It is fairly dense but every element serves a purpose. The parenthetical caveat about the diameter unit is a bit long but still earns its place by flagging a data-quality limitation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not detail return values, yet it helpfully enumerates them. However, for a tool requiring a projectId and offering limit/offset, the absence of any parameter guidance and the lack of explicit tie between the 'active PCB layout' and the projectId leave an important gap. The behavioral caveats are good, but the description is incomplete on how to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description mentions none of the three input parameters (projectId, limit, offset). It only lists output fields, leaving the agent with no information about the required projectId or how pagination via limit/offset behaves. The description does not compensate for the missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (List) and resource (vias on the active PCB layout), and it enumerates the returned fields. It clearly distinguishes this tool from sibling PCB list tools such as easyeda_pcb_tracks, easyeda_pcb_components, and easyeda_pcb_fills, which cover different primitives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only usage-relevant statement is a prerequisite (focused PCB tab) and an edge-case behavior (empty list instead of error). There is no explicit guidance on when to choose this tool over alternatives, nor any condition or exclusion that would help an agent decide between this and other PCB inspection tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_post_write_qaClassify post-write schematic QA resultsA
Idempotent

Run and classify post-write schematic QA after generated edits. Combines native DRC/ERC results with policy-aware classification so duplicate net names, free networks, and unconnected pins are reported as pass/fail/inconclusive instead of raw warning counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
drcNoOptional explicit DRC result override for tests or log ingestion
ercNoOptional explicit ERC result override for tests or log ingestion
policyNocircuit
projectIdYes
useNativeChecksNo
manualDrcMessagesNoOptional user-copied EasyEDA DRC log lines for classification when native details are unavailable
manualErcMessagesNoOptional user-copied EasyEDA ERC log lines for classification when native details are unavailable

Output Schema

ParametersJSON Schema
NameRequiredDescription
issuesYes
passedYes
policyYes
statusYes
summaryYes
categoriesYes
project_idYes
fatal_countYes
issue_countYes
detail_sourceNo
warning_countYes
inconclusive_countYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and the description is consistent with an idempotent, non-destructive re-check. It usefully adds that output is normalized to pass/fail/inconclusive and covers duplicate nets, free networks, and unconnected pins, but says nothing about cost, timeouts, or what happens when native details are unavailable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and the value proposition, no filler. Every clause carries information about what is combined and why the classification matters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the overall intent is covered. But for a 7-parameter tool with nested DRC/ERC override objects and only 57% schema coverage, the description does not explain the manual-log path or policy variants, leaving gaps an agent must resolve from the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 57%, and the description only obliquely touches parameters ('native DRC/ERC results' for useNativeChecks, 'policy-aware classification' for policy). The manual message overrides, the projectId scoping, and the policy enum values are left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (run/classify) and resource (post-write schematic QA) and distinguishes itself from the raw easyeda_drc_run / easyeda_erc_run siblings by explaining it layers policy-aware classification on top of native DRC/ERC output. An agent can tell this is not the same as the plain rule-check tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'after generated edits' implies when to use it, but no alternatives are named the way a 5 would (e.g. 'use easyeda_drc_run for raw results'). No when-not guidance or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_power_tree_analyzeAnalyze power-tree current and thermal budgetB
Read-onlyIdempotent

Analyze supply sources, regulators, loads, protection, bulk capacitance, current budget, dropout, and regulator thermal risk. Returns machine-readable issues and a human-readable summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
loadsNo
railsYes
limitsNo
sourcesNo
projectIdNo
capacitorsNo
regulatorsNo
protectionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
railsYes
issuesYes
passedYes
summaryYes
project_idYes
regulatorsYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds the analysis scope but no operational context such as required inputs, whether the tool depends on a loaded project, or failure modes. The return-shape sentence is redundant given an output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the analysis scope front-loaded and the return statement trailing. Well sized for the amount of information it conveys.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter tool with nested objects and zero schema description coverage, the description should carry far more weight. It omits parameter semantics and usage conditions, and its return-value sentence is unnecessary because an output schema is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 8 parameters (rails, loads, sources, regulators, capacitors, protections, limits, projectId). The description names several conceptual categories that loosely map to those parameters, but it provides no format, required-vs-optional, or unit semantics to compensate for the total absence of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Analyze) and resource (power tree) and enumerates the analyzed domains: sources, regulators, loads, protection, bulk capacitance, current budget, dropout, thermal risk. This clearly distinguishes it from the schematic/BOM/board siblings. It stops short of naming the alternatives or conditions that select it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no mention of alternatives. The agent must infer from the name alone that this is the power-integrity analysis entry point rather than, say, a DRC or ERC check.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_project_begin_transactionBegin project transactionA

Open an in-memory, document-scoped transaction for snapshot-backed schematic writes. Only tools passed transactionId participate; standalone schematic writes are not auto-captured. Only one active transaction is allowed per document. Beginning a transaction does not modify EasyEDA.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNo
projectIdYes
ttlSecondsNo
maxOperationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
detailsNo
successYes
error_codeNo
transactionNo
failed_operation_idsNo
restored_operation_idsNo

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations establish that this is not read-only, not idempotent, and not destructive, while the description adds substantive context: the transaction is in-memory, document-scoped, snapshot-backed, only one may be active per document, and beginning one does not modify EasyEDA. These details go well beyond the annotations and are crucial for correct use.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four tight sentences with no waste. Scope and key constraints are front-loaded, and the final sentence clarifies a common misconception about modification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. However, for a transaction tool with lifecycle parameters like ttlSeconds and maxOperations, the description omits how those affect the transaction, which is important for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the burden for all four parameters. It mentions document scope, implying projectId, but says nothing about label, ttlSeconds, or maxOperations, leaving their behavior and defaults entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Open an in-memory, document-scoped transaction for snapshot-backed schematic writes.' It also distinguishes this from standalone schematic writes, which are not auto-captured. An agent can identify the tool's purpose without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: only tools passed transactionId participate, standalone writes are not captured, and only one active transaction is allowed per document. It does not explicitly name commit/rollback alternatives or state when not to begin a transaction, but the surrounding transactional workflow is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_project_commit_transactionCommit project transactionA

Finalize a transaction after its writes and validation gates succeed. Commit removes rollback eligibility and releases the document transaction lock.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmWriteYes
transactionIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose write behavior (readOnlyHint=false), non-idempotency, and non-destructiveness. The description adds key behavioral facts beyond annotations: committing removes rollback eligibility and releases the document transaction lock, which informs the agent of irreversible state changes and lock management.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the core action and condition, then the state effects. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the commit action, its preconditions, and its post-conditions (lock release, rollback loss). An output schema exists so return values need not be explained. It leaves minor gaps around failure modes and authentication, but is largely complete for a transaction commit tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain either parameter. It does not clarify what transactionId should reference or why confirmWrite must be true beyond what the schema's const already enforces, leaving a meaningful gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Finalize/Commit) and resource (transaction), plus the conditions under which it applies (after writes and validation gates succeed). It differentiates from rollback by noting that commit removes rollback eligibility, so an agent can distinguish it from siblings like rollback_transaction and validate_transaction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use it after writes and validation gates succeed, providing clear context. However, it does not name alternatives (rollback, validate) or state when not to use it, so the guidance is contextual but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_project_get_transaction_statusGet project transaction statusB
Read-onlyIdempotent

Read transaction state, validation results, operation hashes, and rollback status without exposing captured primitive snapshots.

ParametersJSON Schema
NameRequiredDescriptionDefault
transactionIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
detailsNo
successYes
error_codeNo
transactionNo
failed_operation_idsNo
restored_operation_idsNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds one behavioral detail—that captured primitive snapshots are not exposed—but says nothing about auth requirements, rate limits, or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no wasted words. It lists the key return categories immediately and appends the snapshot-exclusion caveat efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be fully explained, and annotations cover the safety profile. However, the description omits how to obtain the transactionId and when in the transaction lifecycle this read is useful, leaving notable gaps for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage for the single required parameter transactionId. The description does not explain where the transaction ID comes from, its format, or its relationship to begin_transaction, so it fails to compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Read') and a precise resource ('transaction state, validation results, operation hashes, and rollback status'). It clearly distinguishes the status-inspection role from begin/commit/rollback siblings, though it never explicitly names those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this tool versus validate_transaction, commit_transaction, or rollback_transaction. The description only describes the payload, leaving the agent to infer the transactional workflow context entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_project_rollback_transactionRollback project transactionA
Destructive

Controlled write: restore applied schematic primitive snapshots in reverse order, verify each restored hash, and report partial rollback explicitly instead of hiding inconsistencies.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmWriteYes
transactionIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered; the description earns credit for adding real behavioral detail beyond that — reverse-order restoration, per-snapshot hash verification, and explicit partial-rollback reporting rather than silent inconsistency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence with the key qualifier ('Controlled write') front-loaded and no wasted words. Tight and appropriately sized for the operation it describes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and annotations cover the destructive/safety profile. The description supplies the mutation semantics; only the transactional preconditions and relationship to the commit/begin siblings are left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden, and it only partially compensates: 'Controlled write' loosely signals the confirmWrite guard, but neither transactionId nor the mandatory confirmation is explained. The const:true on confirmWrite is self-documenting, keeping this at a baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (restore/rollback) and resource (applied schematic primitive snapshots) plus mechanism (reverse order, hash verification). It is clearly distinct from the begin/commit siblings by wording, though it never names them explicitly to sharpen the contrast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied through the transaction vocabulary — an agent infers this is the undo path within the begin/commit/validate family, but the description never states when to prefer rollback over commit or what preconditions (an open transactionId) apply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_project_saveSave projectA

Explicitly save the current EasyEDA Pro project. This ensures all netlist changes, net flags, pin connections, and other mutations are persisted to the project file. Save is never implicit — the caller must explicitly request it. Requires confirmWrite.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesThe project/schematic ID to save
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and idempotentHint=false, so safety profile is partly covered; the description adds valuable context by enumerating the mutation classes that get persisted and by stating that saving is never implicit. It does not describe failure modes, conflict behavior, or whether a save can be undone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with purpose and followed by scope, the explicit-save rule, and the confirmWrite prerequisite. Minor redundancy between 'Requires confirmWrite' and the schema's own const/description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations and an output schema present, the description only needs to add behavioral context, which it does: what is persisted and the explicit-save contract. The remaining gap is its relationship to the project transaction lifecycle, which is left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the schema; the description's mention that confirmWrite is required merely restates that constraint. Baseline 3 is appropriate since the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Explicitly save the current EasyEDA Pro project') and enumerates what gets persisted (netlist changes, net flags, pin connections). It does not, however, differentiate itself from the closely related sibling easyeda_project_commit_transaction, which an agent would reasonably confuse with a persist operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when this tool is needed: 'Save is never implicit — the caller must explicitly request it,' which tells the agent it must be called after mutations. It stops short of naming alternatives or exclusions, notably the transaction tools (begin/commit/rollback) that could also persist work.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_project_validate_transactionValidate project transactionA
Read-onlyIdempotent

Run transaction consistency gates before commit: bridge availability, pending/failed operation checks, optional expected operation count, and optional requirement for at least one applied write.

ParametersJSON Schema
NameRequiredDescriptionDefault
transactionIdYes
expectedOperationCountNo
requireBridgeConnectedNo
requireAppliedOperationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
detailsNo
successYes
error_codeNo
transactionNo
failed_operation_idsNo
restored_operation_idsNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/non-destructive, and the description adds real value by listing the specific pre-commit gates performed. It still doesn't say how failure is surfaced (exception vs. structured report), though the output schema may cover the result shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that puts the core action and timing first, then enumerates the gates. Dense but no wasted clauses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only validation gate with an output schema present, the description identifies what is checked and when it runs, which is sufficient for correct invocation. The only minor gap is the failure-signaling behavior, which the output schema likely documents.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description compensates well: 'bridge availability' maps to requireBridgeConnected, 'optional expected operation count' to expectedOperationCount, and 'optional requirement for at least one applied write' to requireAppliedOperations. Only transactionId is left unexplained, but its meaning is self-evident.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Run transaction consistency gates before commit', and it enumerates the gates (bridge availability, pending/failed operation checks, optional operation count, optional applied-write requirement). This clearly distinguishes it from the commit/begin/rollback transaction siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'before commit' gives clear timing/context for when to invoke it, implicitly positioning it ahead of easyeda_project_commit_transaction. It stops short of explicitly naming the alternative call or stating what to do when validation fails.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_rule_check_summaryGet rule check summaryB
Read-onlyIdempotent

Get a summary of all design and electrical rule check results for the project.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
drcYes
ercYes
errorNo
project_idYes
not_availableNo
overall_passedYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds that the result aggregates ALL design and electrical checks for the project (not a single rule or net), which is useful scoping context, but it discloses nothing about freshness, caching, or result structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler; every word carries scope information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations cover the safety profile, so the description needn't explain return values. For a single-parameter read tool, this is nearly complete; only the relationship to the drc_run/erc_run siblings is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single projectId parameter. The description's phrase 'for the project' implicitly ties projectId to the target project's scope, but adds no format, type, or example beyond that minimal hint.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('a summary of all design and electrical rule check results') scoped to the project. However, it does not distinguish itself from siblings like easyeda_drc_run / easyeda_erc_run, leaving the agent to infer whether this aggregate read differs from running the checks themselves.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance about when to call this versus easyeda_drc_run, easyeda_erc_run, or easyeda_pcb_constraint_report, and no prerequisites or exclusions are stated. Usage is only implied by the tool name and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_run_self_testRun self testB

Run internal self-test to verify server integrity, config, and bridge connectivity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksYes
passedYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and idempotentHint=false, meaning this 'self-test' is neither a pure read nor repeat-safe, yet the description frames it as a harmless verification with no note of what state it touches or why it is non-idempotent. With annotations present the bar is lower, but the mutation/non-idempotent aspect goes entirely undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact sentence that front-loads the action and lists the verification targets with zero filler. Nothing redundant or buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and with no parameters the description needn't cover arguments. What is missing is differentiation from the several sibling diagnostic tools and any hint of the non-idempotent behavior the annotations flag.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so there is nothing for the description to explain beyond what the empty schema already conveys. Baseline 4 applies; no parameter-level gaps exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Run') and resource ('internal self-test') and enumerates what it verifies: server integrity, config, and bridge connectivity. However, it does not distinguish itself from close siblings like easyeda_health_check or easyeda_bridge_status, which the described checks overlap with substantially.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to run this versus easyeda_health_check, easyeda_bridge_status, or easyeda_observability_report, and no prerequisites or expected cost/duration. The agent must guess which diagnostic tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_add_circleAdd schematic circleB

Draw a circle on the schematic sheet — decorative marker or custom symbol element. Cosmetic only, no electrical meaning. fillColor "none" leaves it unfilled.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNo
radiusYes
centerXYes
centerYYes
lineTypeNo
fillColorNoFill color, hex string, or "none" for unfilled
fillStyleNo
lineWidthNo
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and idempotentHint=false, so the agent already knows this mutates state. The description usefully adds that the result carries no electrical meaning, but says nothing about the confirmWrite confirmation gate, persistence, or undo behavior, which matter for a write tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short clauses, front-loaded with the action and its classification. No filler, though the trailing fillColor note is the one piece that merely echoes structured data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and annotations cover the safety profile. Still, for a 4-required-parameter write operation with 22% schema coverage, the definition leaves the geometry parameters and the write-confirmation requirement unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 22% across 9 parameters. The description explains only fillColor 'none' — which the schema already documents verbatim — and says nothing about centerX/centerY coordinate space, radius units, lineWidth, lineStyle, or the required confirmWrite boolean.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Draw a circle on the schematic sheet') and immediately classifies it as cosmetic, which separates it in kind from its electrical siblings like add_wire or create_net_flag. It does not explicitly name the add_rectangle/add_polygon alternatives, but the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'decorative marker or custom symbol element' implies when to reach for this tool, and 'Cosmetic only, no electrical meaning' signals when not to. However, it never routes the agent to a sibling primitive tool or states any precondition, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_add_polygonAdd schematic polygonA

Draw a closed polygon on the schematic sheet from 3+ vertices — custom decorative shapes, callout arrows, or block diagram elements. Cosmetic only, no electrical meaning.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNo
pointsYes
lineTypeNo
fillColorNoFill color, hex string, or "none" for unfilled
lineWidthNo
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and idempotentHint=false. The description adds real value beyond them: that the output is purely cosmetic with no electrical meaning, which tells the agent this write cannot affect the netlist. It does not mention the confirmWrite gate or any permission/idempotency nuance beyond what annotations already imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence plus a short clause; every word earns its place, and the shape/scope constraint comes first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating primitive-drawing tool with annotations and an output schema, the description covers purpose, constraint, and cosmetic scope. It leaves the write-confirmation and styling parameters to the schema, which is acceptable but slightly thin given the low schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% across 6 parameters. The description compensates partially by stating '3+ vertices', reinforcing the points/minItems constraint, but says nothing about color, lineType, lineWidth, or fillColor. The confirmWrite semantics live only in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource+scope: 'Draw a closed polygon on the schematic sheet from 3+ vertices'. It is clearly distinguishable from the sibling primitives (add_rectangle, add_circle) because it names the shape and its drawing constraint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage contexts ('custom decorative shapes, callout arrows, or block diagram elements') and a critical exclusion ('Cosmetic only, no electrical meaning'), which steers the agent away from using this for electrical intent. It does not, however, name the alternative primitive tools to use for other shapes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_add_rectangleAdd schematic rectangleA

Draw a rectangle on the schematic sheet — section dividers/grouping boxes for organizing a busy schematic into labeled functional blocks (pair with add_text for the title). Cosmetic only. x/y is the top-left corner; fillColor "none" leaves it unfilled.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesTop-left X coordinate
yYesTop-left Y coordinate
colorNoBorder/line color, hex string (e.g. "#FF0000")
widthYes
heightYes
lineTypeNo
rotationNo
fillColorNoFill color, hex string, or "none" for unfilled
fillStyleNo
lineWidthNo
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.
cornerRadiusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the mutation profile (readOnlyHint=false, idempotentHint=false), so the bar is lower. The description adds genuinely useful non-schematic behavior — 'Cosmetic only', meaning no electrical/netlist impact — plus the top-left anchoring convention and the fillColor="none" semantic. It does not mention the confirmWrite gate, but that is documented in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with zero filler; the purpose is front-loaded, then the cosmetic constraint, then the two most ambiguous parameter semantics. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return-value description is unnecessary, and the description covers purpose, cosmetic-only behavior, and key geometry semantics. With 12 parameters at 42% schema coverage, several numeric/optional parameters remain undocumented, which is the only material gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 42% across 12 parameters, so the description must compensate. It adds real meaning for x/y (top-left corner) and fillColor ("none" = unfilled), but leaves lineType, rotation, fillStyle, lineWidth, and cornerRadius completely unexplained in both places — only a fraction of the gap is closed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Draw) and resource (rectangle on the schematic sheet) and immediately names the intent — section dividers/grouping boxes for functional blocks. Its cosmetic-drawing role clearly distinguishes it from siblings like add_wire, add_text, and place_component.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when to use it (organizing a busy schematic into labeled blocks) and a concrete companion action ('pair with add_text for the title'), plus the critical constraint 'Cosmetic only'. It stops short of explicit when-not-to-use guidance, but the usage context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_add_textAdd schematic text labelA

Place free-standing text on the schematic sheet (section headers, notes, block labels) — cosmetic/organizational, not a net label. color must be a hex string and fontName a real font (e.g. "Arial") — untyped placeholders create nothing despite returning ok.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYes
yYes
boldNo
colorNo
italicNo
contentYes
fontNameNo
fontSizeNo
rotationNo
alignModeNo
underlineNo
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover readOnlyHint=false and idempotentHint=false. The description adds a genuinely valuable behavioral warning ('untyped placeholders create nothing despite returning ok'), disclosing a silent-failure mode the annotations don't. It doesn't cover permission or transaction requirements, but that is meaningful added context for a write tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense and front-loaded: the purpose comes first, then the net-label distinction, then the parameter traps. No filler sentences, though the parenthetical example list is slightly crowded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, non-idempotent write gated by confirmWrite, the description covers purpose and two parameter pitfalls but omits several opaque fields (alignMode range, rotation semantics) and any note on the required-coordinate convention. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 8% (essentially just confirmWrite), so the schema is nearly silent on 12 parameters. The description partially compensates by mandating hex for color and a real font for fontName, but it says nothing about alignMode (1-9), rotation, or fontSize, leaving most parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Place free-standing text on the schematic sheet') plus concrete use cases (section headers, notes, block labels), and explicitly distinguishes it from a net label. An agent can differentiate it from create_net_flag/create_net_port without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when to use it ('cosmetic/organizational, not a net label'), which implicitly routes net-labeling needs to the net flag/port siblings. No explicit 'use X instead' or exclusion list, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_add_wireAdd schematic wireB

Add a wire connecting schematic coordinates/pins — real native connectivity. Same netName connects pins globally: separate stubs sharing one name merge into one net (no label needed). NET_COLLISION guards touched points against a foreign net's wire, pin, or flag/port — not mid-segment crossings.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNo
pointsYes
netNameNo
lineTypeNo
lineWidthNo
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and idempotentHint=false; the description adds real behavioral context beyond that: the global net-merging semantics of netName and the NET_COLLISION guard, including the precise boundary of what it protects ('touched points... not mid-segment crossings'). It stops short of stating permission requirements or failure/rollback behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight clauses with no filler, front-loaded on the core action and connectivity model. Slightly dense/packed but every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the collision/netName semantics are covered. But for a non-idempotent write tool with confirmWrite gating, style parameters go unexplained and there is no mention of permission or side-effect scope, leaving meaningful gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 17%, so the description bears most of the burden. It explains netName semantics well, but color, lineType, lineWidth are entirely undocumented in both schema and description, and the points structure is only hinted at via 'coordinates/pins'. A majority of parameters remain ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add a wire connecting schematic coordinates/pins') and clarifies it produces real native connectivity, which differentiates it from a purely visual line tool. It does not explicitly contrast itself with nearby siblings like easyeda_schematic_connect_pin_to_net or connect_pins_by_net, so an agent must infer the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The netName semantics ('same netName connects pins globally; separate stubs merge into one net, no label needed') implicitly tells the agent when this tool is the right choice for building nets. However it never names or compares against the alternative connection tools in the sibling list, leaving the when-to-use-this-vs-that decision to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_audit_imported_designAudit imported schematic designA
Read-onlyIdempotent

Read the live schematic without modifying it, build a canonical model, and report imported net aliases, duplicate or missing references, unresolved metadata expressions, missing values/footprints, and ambiguous BOM classification. Includes a preview only; it never renames nets or changes components.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesThe project/schematic ID to audit
includeInfoNoInclude informational imported-alias and power-flag findings
componentLimitNoMaximum number of component records to read from the live bridge

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
sourceYes
statusYes
summaryYes
findingsYes
read_onlyYes
project_idYes
model_summaryYes
not_availableNo
safe_to_normalizeYes
audit_schema_versionYes
normalization_previewYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description still earns credit by adding substantive behavior: it builds a canonical model, itemizes the finding classes, and explicitly states it only previews and never renames nets or changes components. It omits any note on limits or failure modes (e.g. what happens at the component ceiling), which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, and the read-only constraint is front-loaded before the finding list. The enumeration is long but every item is a distinct audit category that earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description is not obligated to explain return values, and it instead covers the scope, the read-only guarantee, and the categories of findings. For a read-only diagnostic with full annotation and schema coverage, nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so projectId, includeInfo, and componentLimit are already documented with defaults and bounds in the schema. The description adds no format, constraint, or interpretation detail beyond what the structured fields provide, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (audit) plus resource (imported schematic design), and the description enumerates exactly what the audit surfaces: imported net aliases, duplicate/missing references, unresolved metadata expressions, missing values/footprints, and ambiguous BOM classification. It clearly reads the live schematic and builds a canonical model, which separates it from the write-side normalization tools. It stops short of naming which sibling to prefer for follow-up work, so it lands at 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The read-only/preview framing implies this is a diagnostic step rather than a fix step, so an agent can infer usage. However, it never states when to reach for this versus easyeda_schematic_preview_imported_normalization, easyeda_bom_validate, or easyeda_schematic_validate_netlist, and there are no exclusions or prerequisites. Usage is implied, not spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_batch_writeAtomic schematic batch writeA
Destructive

Apply up to 200 validated schematic create, modify, pin no-connect, and delete operations in one snapshot-backed transaction. Any failure rolls the whole transaction back. Delete is limited to safely recreatable drawing primitives.

ParametersJSON Schema
NameRequiredDescriptionDefault
atomicNo
dryRunNo
projectIdYes
operationsYes
confirmWriteYes
transactionIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false, but the description adds real behavioral context beyond them: snapshot-backed atomicity, full rollback on any failure, the 200-op cap, and the restriction that delete only applies to safely recreatable drawing primitives. It does not mention the confirmWrite gate (covered by the schema's const) or dryRun behaviour.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action and scope, then rollback semantics, then the delete caveat. Every sentence adds distinct information; nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and the description covers the essential transaction and operation semantics. The only shortfall is that the confirmWrite/dryRun safety flags are left entirely to a schema with no property descriptions, which is a small but real gap for a destructive tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description has to carry the burden. It conveys the operations array semantics (four action kinds, 200-item limit) and the delete restriction, but says nothing about the flag parameters confirmWrite, dryRun, atomic, or transactionId. Partial compensation for a six-parameter schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (batch write/apply), the resource (schematic), the operation kinds it supports (create, modify, pin no-connect, delete), and the scope (up to 200 ops, one transaction). An agent can immediately distinguish this atomic batch tool from the single-op siblings like easyeda_schematic_add_wire or easyeda_schematic_delete_primitive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The atomic/transaction framing implies when this tool is appropriate (multi-operation edits that must succeed or fail together), but it never explicitly says when to prefer it over the single-operation siblings or over the easyeda_project_begin/commit/rollback_transaction family. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_check_collisionsCheck for pin-coordinate collisions across the sheetA
Read-onlyIdempotent

Scan every component's real pin coordinates and report any (x,y) shared by two or more components — a silent-short risk the native NET_COLLISION guard misses for never-wired pins. Run after manual placement outside easyeda_workflow_* tools (which reconcile this automatically).

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesThe project/schematic ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
successYes
collisionsYes
project_idYes
scan_completeYes
collision_countYes
scan_diagnosticsNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered, but the description adds genuine domain context beyond that: it explains what a collision means (a silent-short risk) and why the native guard is insufficient for never-wired pins. It does not describe output format or pagination, but the output schema exists to cover that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences that front-load the operation, then the diagnostic rationale, then the usage condition. No filler clauses; every phrase contributes to selection or invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only diagnostic with an output schema, the description supplies everything an agent needs: what it scans, what it returns conceptually, the risk it addresses, and when to run it. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single well-documented projectId parameter, so the schema carries the burden and the baseline is 3. The description adds no syntax or format detail about the parameter itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific operation ('Scan every component's real pin coordinates') and a concrete output ('report any (x,y) shared by two or more components'), and frames it against the native NET_COLLISION guard so the agent knows this is not a duplicate of a built-in check. Differentiates clearly from the many sibling diagnostics tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the triggering condition ('Run after manual placement outside easyeda_workflow_* tools') and the exclusion ('which reconcile this automatically'), so an agent knows both when to call it and when the workflow tools already cover it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_component_pinsGet component pinsA
Read-onlyIdempotent

Get exact pin primitive IDs, numbers, names, coordinates, native no-connect state, and pinType for a schematic component by its primitive ID. pinType is EasyEDA's own symbol-library field and is unreliably authored (often "Undefined" even on real ICs) — treat it as a weak hint, not ground truth.

ParametersJSON Schema
NameRequiredDescriptionDefault
primitiveIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
pinsYes
errorNo
successYes
primitiveIdYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds genuine value beyond that by warning that the returned pinType field is unreliably authored and often "Undefined" even on real ICs, telling the agent not to trust it as ground truth — a caveat no structured field conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the returned fields and followed by the reliability caveat, with no filler. The enumeration of return fields partially overlaps the existing output schema, which is slight redundancy rather than waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema already documents the return shape and annotations cover safety, so the description need not explain returns in depth. It still adds the key pinType caveat, leaving only minor gaps (ID provenance, behavior on an invalid ID) that are not essential to correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With one parameter and 0% schema description coverage, the description must carry the load, and it does: primitiveId is explained as identifying "a schematic component." It could add format details (where the ID comes from), but the core meaning of the parameter is supplied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Get ... pins for a schematic component") and enumerates exactly what is returned: primitive IDs, numbers, names, coordinates, no-connect state, pinType. This clearly separates it from easyeda_schematic_components (lists components) and easyeda_schematic_nets (nets), so an agent can pick it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description scopes usage to "a schematic component by its primitive ID," which implies you need a component ID first, but it never states when to choose this over siblings such as easyeda_schematic_components or easyeda_schematic_net_detail, nor lists any exclusions. Usage is inferable but not spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_componentsList schematic componentsA
Read-onlyIdempotent

List schematic components with IDs, references, values, footprints, placement, and project-instance device IDs. Omitted scope preserves legacy all-pages; focused/all_pages are supported, pageUuid is not. Project-instance device IDs are not valid place_component deviceItem values; use schematic_search_device.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
scopeNo
offsetNo
pageUuidNo
projectIdYesThe project/schematic ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
totalYes
componentsYes
error_codeNo
error_dataNo
project_idYes
read_scopeNo
not_availableNo
read_consistencyNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and idempotent, so safety is covered; the description adds non-obvious behavior — that omitting scope silently preserves a legacy all-pages mode — plus the warning that returned project-instance device IDs are not valid place_component deviceItem inputs. That is meaningful disclosure beyond the annotations, though pagination/ordering behavior is unaddressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, front-loaded with the tool's purpose and return payload, followed by the scope caveats and the cross-tool warning. No filler or restated boilerplate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is optional, yet the description still names the payload fields. Combined with the scope-default and pageUuid caveats, an agent has enough to call this read-only list tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 20% (just projectId), so the description must compensate, and it does the most valuable part: it clarifies the scope enum's semantics and flatly states pageUuid is not supported despite appearing in the schema. limit and offset remain undocumented in both places, keeping it below a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List schematic components') and enumerates returned fields (IDs, references, values, footprints, placement, device IDs), which separates it from sibling readers like schematic_nets or schematic_wires. It does not explicitly contrast with the closest sibling, schematic_component_pins, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives real usage context for the scope parameter (omitted = legacy all-pages, focused/all_pages supported) and redirects one case to schematic_search_device when place_component device IDs are needed. However, it never states when to choose this tool over alternatives such as schematic_component_pins or component_pins for detailed per-component work.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_connect_pins_by_netConnect pins by netA

Bulk variant of connect_pin_to_net: draws a real wire stub from each pin, tagged with netName, so all listed pins (and anything else already on that net) merge into one net. Visible to ERC, ratsnest, and autorouting. A pin that fails (e.g. collision) is reported in failures rather than aborting the batch.

ParametersJSON Schema
NameRequiredDescriptionDefault
pinsYesList of component pins to connect to the net
netNameYesThe net name to assign pins to
projectIdYesThe project/schematic ID
stubLengthNoLength of the wire stub drawn outward from each pin. Defaults to 10.
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare this is a write (readOnlyHint=false, idempotentHint=false), so the safety profile is covered. The description adds genuine behavioral context beyond that: it draws real wires visible to ERC/ratsnest/autorouting, merges into existing net membership, and uses partial-failure (non-atomic) semantics. It does not describe permission/confirmWrite preconditions or reversibility, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, front-loaded with the bulk-difference and the core effect, followed by the failure-handling contract. No filler, every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and is referenced ('reported in failures'), and the write/partial-failure behavior is described, so an agent has what it needs for a batch mutation. The only minor gap is that it does not restate the confirmWrite gate, though the schema covers it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema documents all five parameters including stubLength's default and confirmWrite's literal-true constraint. The description adds only marginal meaning (netName is the tag that merges pins), so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Connect pins', drawings wires tagged with netName) and explicitly positions itself as the 'Bulk variant of connect_pin_to_net', naming the sibling it differs from. An agent can distinguish it from the single-pin tool without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly indicates when this tool is appropriate: multiple pins at once, and any pin that fails is reported in failures rather than aborting the batch. It names the single-pin alternative but does not spell out a rule for choosing between them (e.g., use this for >N pins), so it's clear context without explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_connect_pin_to_netConnect pin to netA

Create real EasyEDA connectivity for a pin: draws a short wire stub from its exact coordinate, tagged with netName. Same-netName wires merge globally, so this joins the pin to everything else on that net — visible to ERC, ratsnest, and autorouting.

ParametersJSON Schema
NameRequiredDescriptionDefault
netNameYesThe net name to connect the pin to (e.g. VCC, GND, DATA0)
pinNumberYesThe pin number or pin name on the component (e.g. "1", "VCC", "GND")
projectIdYesThe project/schematic ID
stubLengthNoLength of the wire stub drawn outward from the pin. Defaults to 10.
primitiveIdYesThe primitive ID of the component
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only give readOnlyHint=false and idempotentHint=false. The description adds real behavioral context the annotations lack: that a wire stub is physically drawn, that same-netName wires merge globally, and that the result is visible to ERC, ratsnest, and autorouting. It does not mention transaction/prerequisite needs (confirmWrite is covered by the schema), keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the verb and mechanism, and the consequence ('joins the pin to everything else on that net') follows immediately. The trailing ERC/ratsnest/autorouting clause earns its place but is the only slightly expendable phrase.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and the schema carries the confirmWrite guard. The description supplies the connectivity semantics an agent needs to call it correctly. It stops short of noting whether this must run inside a transaction or be followed by easyeda_schematic_verify_write, which would make it fully complete for a write tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters including stubLength's default and confirmWrite's literal-true constraint. The description adds no parameter-level detail beyond echoing netName, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('connect a pin to a net') and goes further by explaining the mechanism: a wire stub drawn from the pin's exact coordinate, tagged with netName. This cleanly separates it from siblings like easyeda_schematic_connect_pins_by_net (bulk) and easyeda_schematic_add_wire (raw geometry).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the mechanism ('joins the pin to everything else on that net'), but there is no explicit when-to-use or when-not-to-use guidance. It never names alternatives such as easyeda_schematic_connect_pins_by_net for batch connects, easyeda_schematic_add_wire, or easyeda_schematic_create_net_flag, so the agent must infer routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_create_net_flagCreate net flagA

Create a named net flag/label. With identification (Power/Ground/AnalogGround/ProtectGround) it places a power-flag symbol binding to a coincident pin (use for VCC/GND). Without it, a generic net label — cosmetic only; connect pins with add_wire stubs sharing one netName.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesX coordinate on the schematic canvas
yYesY coordinate on the schematic canvas
netNameYesThe net name to assign (e.g. VCC, GND, TEST_NET)
rotationNoRotation in degrees (0, 90, 180, 270)
projectIdYesThe project/schematic ID
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.
identificationNoPower-flag identification. When set, places an EasyEDA power/ground flag symbol of this type. When omitted, places a generic named net label instead.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag readOnlyHint=false and idempotentHint=false. The description adds real behavioral context beyond that: a power flag binds to a coincident pin, whereas a generic label is cosmetic-only and does not electrically connect. It does not mention the confirmWrite gate, but that is documented in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with the default case and the branching case front-loaded. Every clause carries meaning (mode, symbol type, binding behavior, cosmetic caveat, alternative).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and 100% schema coverage, the description need only cover mode selection and the cosmetic-connectivity gotcha, both of which it handles. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both `identification` and the coordinate/name params are already documented. The description restates the identification semantics (power-flag vs generic label) that the schema's own description already captures, so it adds little beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (create a named net flag/label) and cleanly distinguishes its two operating modes by the presence or absence of `identification`. An agent can tell this apart from siblings like add_wire or create_net_port without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly conditions usage: use `identification` with VCC/GND power flags pinning to a coincident pin, and without it a cosmetic label. It also names the alternative path (add_wire stubs sharing one netName) for actually connecting pins.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_create_net_portCreate net portA

Place a hierarchical net port (off-sheet connector) on the schematic. Net ports create named connections that span multiple schematic sheets, appearing as real SCH_Net entries in the netlist.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesX coordinate on the schematic canvas
yYesY coordinate on the schematic canvas
netNameYesThe net name for the port (e.g. VCC, GND, DATA_BUS)
portTypeNoElectrical type of the port
rotationNoRotation in degrees (0, 90, 180, 270)
projectIdYesThe project/schematic ID
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and idempotentHint=false, so the write nature is known. The description adds genuinely useful context that the port becomes a real SCH_Net entry in the netlist, but it omits prerequisites, undo semantics, and does not mention the confirmWrite gate (left to the schema).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler, and the core action is front-loaded before the netlist-effect detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and 100% schema coverage, the description need not explain returns or params. It covers the action and its netlist consequence adequately; only the routing versus sibling tools (e.g. net_flag) is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 7 parameters (including enum portType and the literal-true confirmWrite) are fully documented in the schema. The description adds no parameter syntax or constraints beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Place a hierarchical net port') and clarifies what the object is ('off-sheet connector'). It implies scope differentiation by noting the port spans multiple sheets, which conceptually separates it from the sibling create_net_flag, but it never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is only implied via 'span multiple schematic sheets' – an agent can infer this is for multi-sheet designs, but there is no explicit when-to-use or when-to-prefer-this-over-alternatives guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_delete_primitiveDelete schematic primitivesA

Delete components, wires, or other drawing objects by primitive UUID. Pass projectId + transactionId for rollback-backed deletion of safely recreatable drawing primitives; unsupported transactional delete kinds fail before mutation. Without transactionId the write is standalone.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdNoRequired when transactionId is supplied; must match the transaction document.
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.
primitiveIdsYes
transactionIdNoOptional snapshot-backed project transaction ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and idempotentHint=false. The description goes further, disclosing rollback-backed semantics, that unsupported transactional delete kinds fail before any mutation, and that omitting transactionId yields a non-transactional standalone write. These are meaningful behavioral traits beyond the annotations, though confirmation requirements and reversibility outside a transaction are not spelled out.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, zero filler, and the core action plus addressing scheme are front-loaded before the transaction-mode caveats. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the mutation's safety profile is covered by the description plus annotations. Remaining minor gap: it does not state the consequences of a standalone (non-transactional) delete being unrecoverable, but overall it is sufficient to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, with projectId, confirmWrite and transactionId already documented. The description adds the semantic relationship between the parameters (projectId required alongside transactionId, transactionId enabling rollback) and clarifies that deletion targets primitives by UUID, going beyond the raw schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Delete) plus the resource set (components, wires, other drawing objects) and the addressing key (primitive UUID). It is clearly separable from the sibling easyeda_schematic_modify_primitive and the add_* tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit conditional: use projectId + transactionId for rollback-backed deletion, or omit transactionId for a standalone write. That is clear context for selecting the mode, though it does not name an alternative sibling tool for cases where deletion is the wrong operation (e.g. modify_primitive).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_modify_primitiveModify schematic primitiveA

Safely modify a schematic primitive while preserving omitted fields. With transactionId and projectId, capture before/after snapshots and automatically restore the prior state if the write or post-write read fails. Component moves keep connected wires attached.

ParametersJSON Schema
NameRequiredDescriptionDefault
propertyYes
projectIdNoRequired when transactionId is supplied; must match the transaction document.
primitiveIdYes
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.
transactionIdNoOptional snapshot-backed project transaction ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing merge semantics (omitted fields preserved), automatic before/after snapshots with rollback if the write or post-write read fails, and that component moves keep connected wires attached. These are exactly the behavioral traits an agent needs for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly packed sentences, each earning its place: safety/merge behavior first, transactional rollback second, wire-preservation third. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter mutation tool with an output schema and only partial schema coverage, the description covers the critical rollback, merge, and connectivity semantics. It omits primitiveId semantics and any note about what property keys are valid, so it's strong but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60%; the description compensates by explaining that property is a partial update that preserves omitted fields, and by clarifying the transactionId/projectId snapshot pairing. primitiveId remains undocumented, keeping it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (modify) and resource (schematic primitive), and adds the key constraint that omitted fields are preserved, which distinguishes it from add/delete siblings. It does not explicitly name alternatives like batch_write, so it lacks full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: single-primitive partial modification, optionally wrapped in a snapshot-backed transaction. The description explains the transactional mode but gives no explicit when-to-use/when-not guidance or named alternatives (e.g., batch_write for multiple primitives).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_net_detailGet schematic net detailB
Read-onlyIdempotent

Get full details for a specific net in the current schematic context including connected pins and components. Explicit focused scope is supported; page/all_pages scopes fail closed on EasyEDA Pro 3.2.149.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo
netNameYes
pageUuidNo
projectIdYesThe project/schematic ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
nodesYes
net_nameYes
timed_outNo
error_codeNo
error_dataNo
node_countYes
project_idYes
read_scopeNo
not_availableNo
timeout_stageNo
timeout_componentNo

TDQS

B3.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already declaring readOnlyHint and idempotentHint, the description adds a meaningful behavioral constraint: page and all_pages scopes fail closed on EasyEDA Pro 3.2.149. This warns the agent of a non-obvious failure mode beyond the safety profile covered by annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no waste: the first states purpose and returned content, the second front-loads the critical scope constraint. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. However, with four parameters at 25% schema coverage, the description leaves netName and pageUuid semantics unclear and does not fully compensate for the low structured documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25%, and the description compensates only partially by clarifying that the 'focused' scope value works while 'page' and 'all_pages' fail. It says nothing about netName, pageUuid, or what 'focused' actually means, leaving most parameters unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('Get full details') and resource ('specific net in the current schematic context') and lists the included content ('connected pins and components'). It is clearly distinct from sibling list tools like easyeda_schematic_nets, though it does not explicitly name any sibling as an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus siblings such as easyeda_schematic_nets or easyeda_schematic_component_pins. It only states a scope constraint ('focused scope is supported; page/all_pages scopes fail closed'), which is a parameter behavior note rather than a use-case routing rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_netsList schematic netsA
Read-onlyIdempotent

List nets from the current schematic context. Explicit focused scope is supported; page/all_pages scopes fail closed on EasyEDA Pro 3.2.149.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo
pageUuidNo
projectIdYesThe project/schematic ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
netsYes
errorNo
totalYes
error_codeNo
error_dataNo
project_idYes
read_scopeNo
not_availableNo
read_consistencyNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds beyond that by disclosing a version-specific behavioral constraint: page/all_pages scopes fail closed on EasyEDA Pro 3.2.149, warning the agent that those scopes will not return data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with zero filler. The core purpose comes first and the important scope caveat follows immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. The description covers scope behavior and the version caveat, which are the main risks, but omits what focused scope means, how pageUuid interacts with scope, and the default when scope is omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%, so the description must compensate. It adds meaningful semantics for the scope enum (focused works; page/all_pages fail closed) but leaves pageUuid and the default/omitted-scope behavior entirely undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (nets) with a clear context (current schematic). It implies a list-vs-detail distinction relative to the sibling easyeda_schematic_net_detail, but does not explicitly name or contrast with that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful scope-selection guidance: focused scope is supported while page/all_pages fail closed on EasyEDA Pro 3.2.149. However, it never states when to use this tool versus alternatives like easyeda_schematic_net_detail, leaving tool selection to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_place_componentPlace schematic componentA

Place a searched library device on the active schematic. Use deviceItem from schematic_search_device; project-local identities from schematic_components are invalid. On timeout inspect reconciled/unconfirmed before retrying. projectId + transactionId enables rollback; without transactionId the write is standalone.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYes
yYes
dryRunNo
mirrorNo
rotationNo
projectIdNoRequired when transactionId is supplied; must match the transaction document.
addIntoBomNo
addIntoPcbNo
deviceItemYes
subPartNameNo
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.
transactionIdNoOptional snapshot-backed project transaction ID.
collisionRadiusNo
verifyAfterWriteNo
checkPlacementCollisionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint=false/idempotentHint=false annotations, the description discloses transactional behavior: projectId+transactionId enables rollback while omitting transactionId makes the write standalone. This is exactly the non-obvious mutation semantics an agent needs, and it also flags real vs phantom timeout state via reconciled/unconfirmed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, each load-bearing and front-loaded: purpose first, then input provenance, then failure handling, then transaction semantics. No filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description covers the critical mutation/rollback/collision-safety concerns for a write tool. It falls short of 5 only because coordinate-space semantics and several write-affecting flags are left entirely to an under-documented schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 20% schema coverage across 15 params, the description usefully clarifies deviceItem origin, the projectId/transactionId coupling, and confirmWrite intent. However, the majority of parameters (x/y units, mirror, rotation, addIntoBom, addIntoPcb, subPartName, collisionRadius, verifyAfterWrite, checkPlacementCollision) remain undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Place) and resource (schematic component) with the scope qualifier 'searched library device on the active schematic'. It also implicitly distinguishes itself from read/list siblings like schematic_components and schematic_search_device by naming the source of deviceItem.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: deviceItem must come from schematic_search_device, and project-local identities from schematic_components are declared invalid. It also gives timeout-recovery guidance (inspect reconciled/unconfirmed before retrying), covering both when-to-use and failure handling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_plan_safe_regionPlan safe schematic drawing regionA
Read-onlyIdempotent

Compute a safe schematic drawing region before placing components. Uses live sheet info when available, assumes EasyEDA bottom-left coordinates, reserves the default lower-right title-block keep-out, and returns an anchor/bounds plan that avoids title-block overlap.

ParametersJSON Schema
NameRequiredDescriptionDefault
marginNo
projectIdNo
contentWidthYesEstimated width of the planned circuit block in EasyEDA coordinates
contentHeightYesEstimated height of the planned circuit block in EasyEDA coordinates
preferredRegionNoupper-left
titleBlockKeepoutNoOptional explicit title-block keep-out rectangle when the sheet template is known

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
sheetYes
anchorYes
boundsYes
issuesYes
blockedYes
keepoutsYes
warningsYes
project_idNo
not_availableNo
usable_boundsYes
preferred_regionYes
requested_boundsYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly and idempotent behavior, so the bar is lower, and the description still adds real context: live sheet info is used 'when available' (fallback behavior), coordinates follow EasyEDA bottom-left convention, and a default title-block keep-out is reserved. It does not describe output shape, but the output schema exists to carry that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that leads with the action, then stacks constraints. Efficient and free of filler, though the string of clauses makes it dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only planning tool with an output schema, the return plan does not need describing, and the coordinate assumptions plus keep-out defaults are the key operational facts. Minor gaps remain around the optional margin and preferredRegion semantics but nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, so the description should compensate but only partly does. It clarifies the title-block keep-out default and the coordinate convention, yet says nothing about 'margin', 'projectId', or 'preferredRegion', leaving half the parameters undocumented beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Compute a safe schematic drawing region before placing components.' An agent can distinguish this planning tool from siblings like easyeda_schematic_place_component and easyeda_schematic_check_collisions without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Phrases the timing explicitly ('before placing components'), which gives clear context for when to invoke it. It stops short of naming an alternative sibling or stating exclusions, so it does not reach the top tier.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_preview_imported_normalizationPreview imported schematic normalizationA
Read-onlyIdempotent

Read the live schematic and produce a deterministic, read-only normalization plan with a stable plan ID, model hash, proposed net-name/reference/metadata operations, validation gates, warnings, and blockers. This tool never writes to EasyEDA.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesThe project/schematic ID to preview
componentLimitNo
normalizeNetNamesNo
annotateReferencesNo
componentOverridesNo
resolveMetadataExpressionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
planYes
errorNo
sourceYes
project_idYes
not_availableNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description still adds real value beyond that: determinism, a stable plan ID, a model hash, and the presence of validation gates/warnings/blockers all describe the output contract and behavior, which the structured fields do not.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, front-loaded with the core action and output artifacts, closing with the critical read-only guarantee. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not needed, and the behavioral contract (deterministic, read-only, plan ID, gates) is well covered. But for a 6-parameter tool with 17% schema coverage, the description leaves the parameter semantics entirely unaddressed, which is a meaningful completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 17% (just projectId is documented), so the description must compensate for the other five parameters (componentLimit, normalizeNetNames, annotateReferences, componentOverrides, resolveMetadataExpressions) and it does not mention any of them. An agent gets no elaboration on what these toggles or overrides do.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb+resource (read the live schematic, produce a normalization plan) and enumerates the concrete artifacts produced: stable plan ID, model hash, proposed operations, validation gates, warnings, blockers. This clearly distinguishes it from write/apply siblings and from the audit tool, since it is explicitly a read-only planning step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The read-only, never-writes framing implies this is the preview/plan step taken before an actual normalization write, and the 'plan ID' hints at a follow-up commit. However, no sibling alternative is named (e.g., audit_imported_design) and there is no explicit when/when-not guidance, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_search_deviceSearch library deviceA
Read-onlyIdempotent

Search for schematic symbols/devices in the EasyEDA library by keywords. Full results carry the library's complete metadata object per device; pass minimal:true to get back only uuid/libraryUuid/name/pin_count/symbol_type when that is all you need.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesSearch keyword(s), matched against device name/description in the library
pageNo
minimalNoWhen true, return only uuid/libraryUuid/name/pin_count/symbol_type per device instead of the full library metadata object — use this when the goal is just picking a deviceItem for place_component, to avoid paying for fields you will not read.
symbolTypeNo
itemsOfPageNo
libraryUuidNo
classificationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
totalYes
devicesYes
not_availableNo
provider_tierNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds that full results carry the library's complete metadata object versus a slimmed set under minimal:true, which is useful payload-weight context, but it says nothing about pagination behavior or limits on a 7-parameter, paged search.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the core purpose front-loaded and the minimal:true caveat following. Slightly dense in the second clause but every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since an output schema exists, return-value explanation is not required, and the minimal:true behavior is covered. But for a 7-parameter search with low schema coverage, the definition leaves too many filtering and paging parameters unexplained for an agent to invoke it confidently across use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is low (29%), so the description should compensate — and it only meaningfully explains 'minimal' (already documented in the schema) plus the keyword intent behind 'key'. Five parameters (page, symbolType, itemsOfPage, libraryUuid, classification) remain undocumented in both places, so the gap is only partially closed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Search for schematic symbols/devices in the EasyEDA library by keywords.' It also implicitly distinguishes itself from the write-side sibling easyeda_schematic_place_component by noting the deviceItem-picking use case, so an agent can tell search from placement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives conditional guidance for one path — use minimal:true when the goal is just picking a deviceItem for place_component — which is genuinely useful routing. However, it offers no broader when-to-use/when-not guidance relative to other library or component-listing tools, leaving the general invocation context implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_set_pin_no_connectSet native pin No Connect stateA
Idempotent

Set or clear EasyEDA Pro's native No Connect marker on one exact component pin. This changes the component pin noConnected state; it does not create a net, label, power flag, or short-circuit flag. The bridge rejects missing/ambiguous pins and verifies the native readback after the write.

ParametersJSON Schema
NameRequiredDescriptionDefault
pinNumberYesThe exact component pin number
projectIdYesThe project/schematic ID
noConnectedNotrue places the native No Connect marker; false removes it
primitiveIdYesThe component primitive ID
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already supply readOnlyHint=false and idempotentHint=true, so safety and repeatability are covered. The description adds genuinely useful behavior beyond that: the bridge rejects missing/ambiguous pins and verifies native readback after the write, plus the explicit note that it mutates noConnected rather than creating connectivity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, all front-loaded with the operation and scope first, then the negative disambiguation, then the validation behavior. Every sentence earns its place with no repetition of the name or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present (return values need not be explained), full schema coverage, and annotations covering safety and idempotency, the description is complete: it covers purpose, disambiguation, mutation scope, and rejection/readback behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all five parameters (including confirmWrite's literal-true requirement and the noConnected default), which sets the baseline at 3. The description confirms the single-pin granularity but adds no syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair ('set or clear') and precise resource ('native No Connect marker on one exact component pin'), then explicitly rules out what it is not (net, label, power flag, short-circuit flag), which separates it from siblings like easyeda_schematic_create_net_flag and easyeda_schematic_connect_pin_to_net without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The single-pin scope and the negative disambiguation ('does not create a net, label, power flag, or short-circuit flag') tell the agent when this tool is the right choice versus sibling flag/connect tools. It stops short of naming an explicit alternative or stating a when-not condition, so it is clear context rather than full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_set_title_blockSet schematic title block fieldsA

Update schematic title block text fields (Company, Version, Drawn, Reviewed, Page Size). Only these 5 are exposed — writing Symbol/Border/Device/etc once corrupted a real title block; those are read-only natively and must be fixed via the EasyEDA Pro UI.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYesMap of title block field name to the sub-fields to change, e.g. { "Company": { "value": "ACME", "showValue": true } }
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.
showTitleBlockNoShow/hide the whole title block

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint=false and idempotentHint=false. The description layers on the crucial behavioral fact that writing non-exposed fields (Symbol/Border/Device) previously corrupted a title block and that those are natively read-only, which is exactly the risk context an agent needs before invoking a mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The scope statement comes first and the historical corruption warning follows immediately as justification, so an agent gets the actionable constraint before the rationale.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with nested objects, a required confirmWrite guard, and an output schema, the description covers the highest-risk area (field scope) well and the schema covers the confirmWrite mechanics. It is essentially complete, with only minor room to note side effects or idempotency behavior beyond the annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the propertyNames enum already enumerates the five allowed field names, so the description repeats rather than extends that. It adds no syntax detail for the nested value/showTitle/showValue sub-objects or for the required confirmWrite flag.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update schematic title block text fields') and enumerates exactly which fields are in scope. The parenthetical list plus the explicit note about which fields are excluded makes it distinguishable from any sibling without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly communicates the operating envelope: only these 5 fields are writable and the rest must be changed in the EasyEDA Pro UI because a prior write corrupted a real title block. It stops short of naming a sibling alternative or stating when a caller should prefer this over another write path, but the practical constraint is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_sheet_infoGet schematic sheet infoA
Read-onlyIdempotent

Return read-only schematic sheet metadata. Supports focused, pageUuid/page, and all_pages page-list reads without changing EasyEDA focus; aggregate geometry is never invented.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo
pageUuidNo
projectIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNo
gridNo
errorNo
frameNo
pagesNo
sheetNo
originNo
warningNo
page_sizeNo
error_codeNo
error_dataNo
project_idNo
read_scopeNo
diagnosticsNo
not_availableNo
metadata_sourceNo
focused_documentNo
geometry_availableYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds useful behavioral context beyond that: it says the read does not change EasyEDA focus and that aggregate geometry is never invented, though return format and pagination behavior remain unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose, and no obvious filler. The phrase 'aggregate geometry is never invented' is concise but somewhat cryptic, keeping it from a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, and the annotations already cover read-only and idempotent behavior. It is nearly complete for a read-only metadata tool, though leaving projectId undocumented is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It mentions focused, pageUuid/page, and all_pages reads, which loosely maps to the scope enum and pageUuid parameter, but projectId is never explained and the scope modes are not defined semantically beyond their names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: return read-only schematic sheet metadata. This is clear against siblings like nets, components, and wires, but it does not explicitly name an alternative or more precisely define what 'metadata' includes, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says the tool supports focused, pageUuid/page, and all_pages reads, but this describes invocation modes rather than when to use this tool instead of siblings. There is no explicit when-to-use, when-not-to-use, or alternative-tool guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_sync_to_pcbRequest schematic-to-PCB sync (needs human approval)A
Idempotent

Request a schematic-to-PCB sync (SCH_Document.importChanges). CAUTION (live-verified): opens a confirmation dialog in EasyEDA Pro's UI a HUMAN must approve — success here only means the request was sent, not that components appeared. Ask the user to approve the dialog, then verify with pcb_components.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdNo
confirmWriteYesMust be the literal boolean true (not the string "true") to allow this write.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond the annotations: a human approval dialog in the EasyEDA Pro UI blocks completion, and a successful return only means the request was sent, not that components were applied. This is exactly the kind of side-effect/latency disclosure annotations (readOnlyHint false, idempotentHint true) cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the action front-loaded and the caution immediately after it; the verification pointer closes the loop. No filler, and the most important caveat is not buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write tool with an output schema already present, the description covers the critical unknowns: human-in-the-loop approval and the need to confirm the result separately. An agent has everything required to call it and interpret the response correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

confirmWrite is documented in the schema (must be literal boolean true), but projectId has no description in either the schema or the description, giving only 50% coverage. The description adds no parameter-level detail, so it neither compensates for the gap nor exceeds the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Request a schematic-to-PCB sync') and even names the underlying API call (SCH_Document.importChanges), which no sibling tool duplicates. An agent can tell this apart from the read-only schematic inspection tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operating context: the user must approve a dialog, and the agent should then verify with pcb_components. It does not explicitly state when NOT to use it or name a competing sync path, but no sibling offers an alternative sync, so context is effectively complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_validate_netlistValidate netlistA
Read-onlyIdempotent

Validate inferred nets/floating pins and cross-check native ERC. Only native noConnected=true excludes a pin; unavailable/malformed state stays visible. valid requires clean inference and zero native errors. Explicit focused is supported; page/all_pages fail closed on EasyEDA Pro 3.2.149.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo
pageUuidNo
projectIdYesThe project/schematic ID
includeWireCheckNoWhen true, also check for graphical wires without netlist connectivity

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
validYes
netlistYes
warningsYes
error_codeNo
error_dataNo
native_ercNo
project_idYes
read_scopeNo
total_netsYes
floating_pinsYes
not_availableNo
wires_without_netlistNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent), so the bar is lower, and the description still adds substantive behavior: only native noConnected=true excludes a pin, unavailable/malformed state remains visible, and `valid` requires clean inference plus zero native errors. This clarifies the pass/fail semantics beyond structured fields, though it omits error/partial-result handling detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tightly packed sentences, front-loaded with the purpose and leading into behavioral rules. Dense but each sentence carries information; minor jargon ('fail closed') slightly reduces immediate readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering safety, the description needn't explain return values. It supplies the pass/fail rules and scope constraints an agent needs, leaving only the pageUuid/scope interplay under-specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: projectId and includeWireCheck are documented in-schema, but scope has an enum with no schema description and pageUuid is undocumented. The description partially compensates by explaining scope behavior (focused works, page/all_pages fail closed), but leaves pageUuid's relationship to scope and its requiredness unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: validating inferred nets/floating pins and cross-checking native ERC. This distinguishes it from a plain ERC run, though it never names the sibling tools (easyeda_erc_run, easyeda_semantic_erc_validate) it competes with, so the differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a version-conditioned constraint ('Explicit focused is supported; page/all_pages fail closed on EasyEDA Pro 3.2.149') which is useful for choosing scope, but offers no explicit when-to-use guidance relative to the other ERC/validation siblings. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_verify_writeVerify schematic write resultA
Read-onlyIdempotent

Read back schematic state after an agent-authored write. Returns component-count delta evidence and optional netlist validation so agents can confirm a placement or connection before continuing.

ParametersJSON Schema
NameRequiredDescriptionDefault
netNameNo
projectIdNo
includeWireCheckNo
beforeComponentCountNo
expectedComponentCountDeltaNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
net_nameNo
warningsYes
project_idNo
component_countNo
netlist_availableYes
netlist_validationNo
components_availableYes
component_count_deltaNo
component_delta_matchesNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint and idempotentHint, so safety is covered. The description adds genuine behavioral context beyond that: this is a verification read performed post-write (not a mutation), and it discloses the evidence returned (component-count delta, optional netlist check). It stops short of noting the zero-parameter-requirement nuance or what a failed validation looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, purpose front-loaded, no filler. Every clause ('read back state', 'returns delta evidence', 'optional netlist validation', 'before continuing') earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, and the read-only safety profile is annotated. The remaining gap is the undocumented parameter set, which the description only partially addresses. Otherwise complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 5 parameters, so the description must carry the load. It does convey the intent of the delta/evidence parameters and the netlist-validation option, but never explains projectId, netName, or how beforeComponentCount pairs with expectedComponentCountDelta. Partial compensation only.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: it reads back schematic state after an agent-authored write and returns component-count delta plus optional netlist validation. An agent understands what it does at a glance. It does not, however, explicitly distinguish itself from close siblings such as easyeda_post_write_qa or easyeda_schematic_validate_netlist.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the usage context ('after an agent-authored write ... before continuing'), which is useful framing, but it never names an alternative or states when NOT to use it. With siblings like post_write_qa and validate_netlist in the same space, an agent is left to infer the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_schematic_wiresList schematic wiresA
Read-onlyIdempotent

List wire segments with primitiveId, coordinates, net, color, and style; paginate past 50 with offset. Explicit focused is supported; page/all_pages fail closed on EasyEDA Pro 3.2.149. primitiveId is required by delete_primitive/modify_primitive.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
scopeNo
offsetNo
pageUuidNo
projectIdYesThe project/schematic ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
totalYes
wiresYes
error_codeNo
error_dataNo
project_idYes
read_scopeNo
not_availableNo
read_consistencyNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds real behavioral value beyond them: the 50-item pagination cap, the offset mechanism, and the version-specific fail-closed behavior for page/all_pages scopes. Return format detail is partly covered by the existing output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight semicolon-separated clauses with no filler, and the core purpose plus returned fields are front-loaded. Information density is high and every clause earns its place, though the version-pinned fail-closed note adds prose weight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, return values need not be re-explained, yet the description still summarizes the key fields. Combined with pagination and scope caveats, an agent has enough to call this correctly; only pageUuid semantics remain unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 20%, so the description must compensate, and it does: it explains the limit/offset pagination relationship, which scope value is viable ('focused') and which fail closed, and clarifies the role of primitiveId downstream. Only pageUuid and the explicit limit default of 50 are left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('List wire segments') and enumerates the returned fields (primitiveId, coordinates, net, color, style). It is clearly distinguishable from siblings like easyeda_schematic_add_wire and easyeda_schematic_delete_primitive without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete usage context: paginate past 50 with offset, only 'focused' scope works while page/all_pages fail closed on EasyEDA Pro 3.2.149, and the returned primitiveId is the input required by delete_primitive/modify_primitive. That last point is excellent cross-tool routing, though it stops short of naming explicit read-alternative siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_semantic_erc_autoAuto-extract netlist and run semantic ERCA
Read-onlyIdempotent

Extract nets/devices/pins from the LIVE schematic and run semantic ERC — no hand-authored netlist needed. Net/pin electrical types are INFERRED from naming conventions, not verified — treat findings as a first-pass signal, not a substitute for semantic_erc_validate.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
errorsYes
passedYes
warningsYes
project_idYes
error_countYes
total_issuesYes
not_availableNo
warning_countYes
inferred_net_countYes
inferred_device_countYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds meaningful behavioral context beyond that: it reads the LIVE schematic, infers net/pin electrical types from naming conventions rather than verifying them, and warns findings are a first-pass signal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action, with the caveat placed after. Every clause earns its place — no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering safety and an output schema covering return values, the description only needs to convey purpose and the inference caveat, which it does well. It stops just short of noting prerequisites (e.g., an open/live project) for the extraction step.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter (projectId) is undocumented in both schema and description. The name is largely self-explanatory, so this is not a severe gap, but the description adds no meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb+resource pair ('Extract nets/devices/pins from the LIVE schematic') plus the analysis it performs ('run semantic ERC'), and explicitly names the sibling it complements ('semantic_erc_validate'). An agent can distinguish it from schematic_nets or erc_run without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for use ('no hand-authored netlist needed') and routes the agent to semantic_erc_validate for verified results. It implies but does not fully spell out the when-to-use boundary versus the plain semantic_erc_validate sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

easyeda_semantic_erc_validateRun semantic ERC validationC
Read-onlyIdempotent

Run semantic electrical-rule validation over a netlist with pin electrical types to detect output contention, floating inputs, power conflicts, missing power pins, missing decoupling, and voltage-domain mismatches.

ParametersJSON Schema
NameRequiredDescriptionDefault
netsYes
devicesNo
projectIdNo
interfacesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorsYes
passedYes
warningsYes
project_idYes
error_countYes
total_issuesYes
warning_countYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the detection scope (contention, floating inputs, power conflicts, decoupling, voltage-domain mismatches), which is genuinely useful behavioral context, but says nothing about the input being required to be complete or what happens on malformed nets.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the purpose verb comes first and the check list follows. The enumeration is long but each item is a distinct detection capability, so it earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, but for a 4-parameter tool with deeply nested net/device/interface objects and 0% schema coverage the description is far too thin. It never explains what input completeness is required nor how the three optional collections interact.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across all 4 parameters, so the description carries the burden — yet it only vaguely gestures at 'a netlist with pin electrical types'. The roles of devices, interfaces, and projectId, and which fields drive each check, are never explained in text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('semantic electrical-rule validation over a netlist') and enumerates the exact defect classes it detects, which is far more informative than a tautology. It does not, however, distinguish itself from close siblings like easyeda_erc_run or easyeda_semantic_erc_auto, so an agent must still guess which of the three ERC-family tools applies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no mention of the alternatives in a sibling list containing at least three ERC-related tools (easyeda_erc_run, easyeda_semantic_erc_auto, easyeda_schematic_validate_netlist). The reader is left to infer usage entirely from the purpose sentence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 73 tool updatesv0.19.2
    • Changedeasyeda_api_inventory2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_board_dimensions2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_board_features5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / fills
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / regions
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "project_id",
        -  "vias",
        -  "tracks",
        -  "zones",
        -  "pads"
        -]New value: +[
        +  "project_id",
        +  "vias",
        +  "tracks",
        +  "zones",
        +  "fills",
        +  "regions",
        +  "pads"
        +]
    • Changedeasyeda_board_layers2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_board_stackup2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_bom_export2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_bom_generate2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_bom_quality_report2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_bom_sourcing2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_bom_validate2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_bridge_status8 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / blocked_by_other_instance
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / diagnostics / properties / blocked_by_other_instance
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / diagnostics / properties / owner_pid
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / diagnostics / properties / owner_port
        Added value: +{
        +  "maximum": 65535,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / owner_pid
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / owner_port
        Added value: +{
        +  "maximum": 65535,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedeasyeda_canvas_capture6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / downsampled
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / image_dimensions
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "height": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    "width": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "width",
        +    "height"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / original_image_dimensions
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "height": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    "width": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "width",
        +    "height"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / payload_budget_bytes
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
    • Changedeasyeda_canvas_capture_region6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / downsampled
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / image_dimensions
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "height": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    "width": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "width",
        +    "height"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / original_image_dimensions
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "height": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    "width": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "width",
        +    "height"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / payload_budget_bytes
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
    • Changedeasyeda_canvas_locate2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_design_rules_lookup2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_drc_run5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / passed / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / passed / type
        Removed value: -"boolean"
    • Changedeasyeda_erc_run10 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / pageUuid
        Added value: +{
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / scope
        Added value: +{
        +  "enum": [
        +    "focused",
        +    "page",
        +    "all_pages"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / error_code
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / error_data
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focusedPageUuid": {
        +      "type": "string"
        +    },
        +    "missingCapability": {
        +      "type": "string"
        +    },
        +    "operation": {
        +      "type": "string"
        +    },
        +    "pageUuid": {
        +      "type": "string"
        +    },
        +    "requestedScope": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / passed / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / passed / type
        Removed value: -"boolean"
      • addedOutput schema / properties / read_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focus_changed": {
        +      "const": false,
        +      "type": "boolean"
        +    },
        +    "focused_page_uuid": {
        +      "type": "string"
        +    },
        +    "page_uuid": {
        +      "type": "string"
        +    },
        +    "requested": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "resolved": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "source": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "resolved",
        +    "focus_changed",
        +    "source"
        +  ],
        +  "type": "object"
        +}
    • Changedeasyeda_export_gerbers3 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / projectId / minLength
        Added value: +1
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_get_capabilities4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / feature_maturity
        Added value: +{
        +  "additionalProperties": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "configured": {
        +        "type": "boolean"
        +      },
        +      "effective": {
        +        "type": "boolean"
        +      },
        +      "maturity": {
        +        "enum": [
        +          "implemented",
        +          "experimental",
        +          "reserved"
        +        ],
        +        "type": "string"
        +      },
        +      "note": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "maturity",
        +      "configured",
        +      "effective",
        +      "note"
        +    ],
        +    "type": "object"
        +  },
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "server_name",
        -  "server_version",
        -  "protocol_version",
        -  "profiles",
        -  "current_profile",
        -  "feature_flags",
        -  "transports"
        -]New value: +[
        +  "server_name",
        +  "server_version",
        +  "protocol_version",
        +  "profiles",
        +  "current_profile",
        +  "feature_flags",
        +  "feature_maturity",
        +  "transports"
        +]
    • Changedeasyeda_get_feature_flags4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / maturity
        Added value: +{
        +  "additionalProperties": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "configured": {
        +        "type": "boolean"
        +      },
        +      "effective": {
        +        "type": "boolean"
        +      },
        +      "maturity": {
        +        "enum": [
        +          "implemented",
        +          "experimental",
        +          "reserved"
        +        ],
        +        "type": "string"
        +      },
        +      "note": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "maturity",
        +      "configured",
        +      "effective",
        +      "note"
        +    ],
        +    "type": "object"
        +  },
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "flags"
        -]New value: +[
        +  "flags",
        +  "maturity"
        +]
    • Changedeasyeda_get_server_config4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / feature_maturity
        Added value: +{
        +  "additionalProperties": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "configured": {
        +        "type": "boolean"
        +      },
        +      "effective": {
        +        "type": "boolean"
        +      },
        +      "maturity": {
        +        "enum": [
        +          "implemented",
        +          "experimental",
        +          "reserved"
        +        ],
        +        "type": "string"
        +      },
        +      "note": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "maturity",
        +      "configured",
        +      "effective",
        +      "note"
        +    ],
        +    "type": "object"
        +  },
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "node_env",
        -  "log_level",
        -  "profile",
        -  "transport",
        -  "bridge_host",
        -  "bridge_port",
        -  "mcp_protocol_version"
        -]New value: +[
        +  "node_env",
        +  "log_level",
        +  "profile",
        +  "transport",
        +  "bridge_host",
        +  "bridge_port",
        +  "mcp_protocol_version",
        +  "feature_maturity"
        +]
    • Changedeasyeda_get_tool_profiles2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_health_check6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / blocked_by_other_instance
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / owner_pid
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / owner_port
        Added value: +{
        +  "maximum": 65535,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / status_error
        Added value: +{
        +  "type": "string"
        +}
    • Changedeasyeda_observability_report2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_pcb_components2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_pcb_constraint_check2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_pcb_constraint_report2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedeasyeda_pcb_fills
    • Changedeasyeda_pcb_production_review2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedeasyeda_pcb_regions
    • Changedeasyeda_pcb_tracks2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_pcb_vias2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_post_write_qa2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_power_tree_analyze2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_project_begin_transaction4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedOutput schema / properties / transaction / properties / operations / items / properties / target_type / const
        Removed value: -"schematic-primitive"
      • addedOutput schema / properties / transaction / properties / operations / items / properties / target_type / enum
        Added value: +[
        +  "schematic-primitive",
        +  "pcb-primitive"
        +]
    • Changedeasyeda_project_commit_transaction2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_project_get_transaction_status4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedOutput schema / properties / transaction / properties / operations / items / properties / target_type / const
        Removed value: -"schematic-primitive"
      • addedOutput schema / properties / transaction / properties / operations / items / properties / target_type / enum
        Added value: +[
        +  "schematic-primitive",
        +  "pcb-primitive"
        +]
    • Changedeasyeda_project_rollback_transaction2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_project_save2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_project_validate_transaction4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedOutput schema / properties / transaction / properties / operations / items / properties / target_type / const
        Removed value: -"schematic-primitive"
      • addedOutput schema / properties / transaction / properties / operations / items / properties / target_type / enum
        Added value: +[
        +  "schematic-primitive",
        +  "pcb-primitive"
        +]
    • Changedeasyeda_rule_check_summary13 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / drc / properties / error
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / drc / properties / not_available
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / drc / properties / passed / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / drc / properties / passed / type
        Removed value: -"boolean"
      • addedOutput schema / properties / erc / properties / error
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / erc / properties / not_available
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / erc / properties / passed / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / erc / properties / passed / type
        Removed value: -"boolean"
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / overall_passed / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / overall_passed / type
        Removed value: -"boolean"
    • Changedeasyeda_run_self_test2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_add_circle2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_add_polygon2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_add_rectangle2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_add_text2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_add_wire2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_audit_imported_design2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_batch_write3 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "anyOf": [
        -      {
        -        "properties": {
        -          "action": {
        -            "const": "create",
        -            "type": "string"
        -          },
        -          "addIntoBom": {
        -            "type": "boolean"
        -          },
        -          "addIntoPcb": {
        -            "type": "boolean"
        -          },
        -          "deviceItem": {
        -            "additionalProperties": {},
        -            "properties": {
        -              "libraryUuid": {
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "uuid": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "libraryUuid",
        -              "uuid"
        -            ],
        -            "type": "object"
        -          },
        -          "mirror": {
        -            "type": "boolean"
        -          },
        -          "operationId": {
        -            "maxLength": 120,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "primitiveKind": {
        -            "const": "component",
        -            "type": "string"
        -          },
        -          "rotation": {
        -            "type": "number"
        -          },
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "operationId",
        -          "action",
        -          "primitiveKind",
        -          "deviceItem",
        -          "x",
        -          "y"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "properties": {
        -          "action": {
        -            "const": "create",
        -            "type": "string"
        -          },
        -          "color": {
        -            "type": "string"
        -          },
        -          "lineType": {
        -            "maximum": 9007199254740991,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          "lineWidth": {
        -            "exclusiveMinimum": 0,
        -            "type": "number"
        -          },
        -          "netName": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "operationId": {
        -            "maxLength": 120,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "points": {
        -            "items": {
        -              "properties": {
        -                "x": {
        -                  "type": "number"
        -                },
        -                "y": {
        -                  "type": "number"
        -                }
        -              },
        -              "required": [
        -                "x",
        -                "y"
        -              ],
        -              "type": "object"
        -            },
        -            "maxItems": 500,
        -            "minItems": 2,
        -            "type": "array"
        -          },
        -          "primitiveKind": {
        -            "const": "wire",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "operationId",
        -          "action",
        -          "primitiveKind",
        -          "points",
        -          "netName"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "properties": {
        -          "action": {
        -            "const": "create",
        -            "type": "string"
        -          },
        -          "alignMode": {
        -            "maximum": 9,
        -            "minimum": 1,
        -            "type": "integer"
        -          },
        -          "bold": {
        -            "type": "boolean"
        -          },
        -          "color": {
        -            "type": "string"
        -          },
        -          "content": {
        -            "maxLength": 10000,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "fontName": {
        -            "type": "string"
        -          },
        -          "fontSize": {
        -            "exclusiveMinimum": 0,
        -            "type": "number"
        -          },
        -          "italic": {
        -            "type": "boolean"
        -          },
        -          "operationId": {
        -            "maxLength": 120,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "primitiveKind": {
        -            "const": "text",
        -            "type": "string"
        -          },
        -          "rotation": {
        -            "type": "number"
        -          },
        -          "underline": {
        -            "type": "boolean"
        -          },
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "operationId",
        -          "action",
        -          "primitiveKind",
        -          "x",
        -          "y",
        -          "content"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "properties": {
        -          "action": {
        -            "const": "create",
        -            "type": "string"
        -          },
        -          "color": {
        -            "type": "string"
        -          },
        -          "cornerRadius": {
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          "fillColor": {
        -            "type": "string"
        -          },
        -          "fillStyle": {
        -            "type": "string"
        -          },
        -          "height": {
        -            "exclusiveMinimum": 0,
        -            "type": "number"
        -          },
        -          "lineType": {
        -            "maximum": 9007199254740991,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          "lineWidth": {
        -            "exclusiveMinimum": 0,
        -            "type": "number"
        -          },
        -          "operationId": {
        -            "maxLength": 120,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "primitiveKind": {
        -            "const": "rectangle",
        -            "type": "string"
        -          },
        -          "rotation": {
        -            "type": "number"
        -          },
        -          "width": {
        -            "exclusiveMinimum": 0,
        -            "type": "number"
        -          },
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "operationId",
        -          "action",
        -          "primitiveKind",
        -          "x",
        -          "y",
        -          "width",
        -          "height"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "properties": {
        -          "action": {
        -            "const": "create",
        -            "type": "string"
        -          },
        -          "centerX": {
        -            "type": "number"
        -          },
        -          "centerY": {
        -            "type": "number"
        -          },
        -          "color": {
        -            "type": "string"
        -          },
        -          "fillColor": {
        -            "type": "string"
        -          },
        -          "fillStyle": {
        -            "type": "string"
        -          },
        -          "lineType": {
        -            "maximum": 9007199254740991,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          "lineWidth": {
        -            "exclusiveMinimum": 0,
        -            "type": "number"
        -          },
        -          "operationId": {
        -            "maxLength": 120,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "primitiveKind": {
        -            "const": "circle",
        -            "type": "string"
        -          },
        -          "radius": {
        -            "exclusiveMinimum": 0,
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "operationId",
        -          "action",
        -          "primitiveKind",
        -          "centerX",
        -          "centerY",
        -          "radius"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "properties": {
        -          "action": {
        -            "const": "create",
        -            "type": "string"
        -          },
        -          "color": {
        -            "type": "string"
        -          },
        -          "fillColor": {
        -            "type": "string"
        -          },
        -          "lineType": {
        -            "maximum": 9007199254740991,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          "lineWidth": {
        -            "exclusiveMinimum": 0,
        -            "type": "number"
        -          },
        -          "operationId": {
        -            "maxLength": 120,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "points": {
        -            "items": {
        -              "properties": {
        -                "x": {
        -                  "type": "number"
        -                },
        -                "y": {
        -                  "type": "number"
        -                }
        -              },
        -              "required": [
        -                "x",
        -                "y"
        -              ],
        -              "type": "object"
        -            },
        -            "maxItems": 500,
        -            "minItems": 3,
        -            "type": "array"
        -          },
        -          "primitiveKind": {
        -            "const": "polygon",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "operationId",
        -          "action",
        -          "primitiveKind",
        -          "points"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "properties": {
        -          "action": {
        -            "const": "create",
        -            "type": "string"
        -          },
        -          "identification": {
        -            "enum": [
        -              "Power",
        -              "Ground",
        -              "AnalogGround",
        -              "ProtectGround"
        -            ],
        -            "type": "string"
        -          },
        -          "netName": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "operationId": {
        -            "maxLength": 120,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "primitiveKind": {
        -            "const": "netflag",
        -            "type": "string"
        -          },
        -          "rotation": {
        -            "type": "number"
        -          },
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "operationId",
        -          "action",
        -          "primitiveKind",
        -          "netName",
        -          "x",
        -          "y",
        -          "identification"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "properties": {
        -          "action": {
        -            "const": "create",
        -            "type": "string"
        -          },
        -          "netName": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "operationId": {
        -            "maxLength": 120,
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "portType": {
        -            "enum": [
        -              "input",
        -              "output",
        -              "bidirectional",
        -              "triState",
        -              "passive"
        -            ],
        -            "type": "string"
        -          },
        -          "primitiveKind": {
        -            "const": "netport",
        -            "type": "string"
        -          },
        -          "rotation": {
        -            "type": "number"
        -          },
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "operationId",
        -          "action",
        -          "primitiveKind",
        -          "netName",
        -          "x",
        -          "y"
        -        ],
        -        "type": "object"
        -      }
        -    ]
        -  },
        -  {
        -    "properties": {
        -      "action": {
        -        "const": "modify",
        -        "type": "string"
        -      },
        -      "operationId": {
        -        "maxLength": 120,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "primitiveId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "property": {
        -        "additionalProperties": {},
        -        "propertyNames": {
        -          "type": "string"
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "operationId",
        -      "action",
        -      "primitiveId",
        -      "property"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "action": {
        -        "const": "delete",
        -        "type": "string"
        -      },
        -      "operationId": {
        -        "maxLength": 120,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "primitiveId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "operationId",
        -      "action",
        -      "primitiveId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "anyOf": [
        +      {
        +        "properties": {
        +          "action": {
        +            "const": "create",
        +            "type": "string"
        +          },
        +          "addIntoBom": {
        +            "type": "boolean"
        +          },
        +          "addIntoPcb": {
        +            "type": "boolean"
        +          },
        +          "deviceItem": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "libraryUuid": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "uuid": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "libraryUuid",
        +              "uuid"
        +            ],
        +            "type": "object"
        +          },
        +          "mirror": {
        +            "type": "boolean"
        +          },
        +          "operationId": {
        +            "maxLength": 120,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "primitiveKind": {
        +            "const": "component",
        +            "type": "string"
        +          },
        +          "rotation": {
        +            "type": "number"
        +          },
        +          "x": {
        +            "type": "number"
        +          },
        +          "y": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "operationId",
        +          "action",
        +          "primitiveKind",
        +          "deviceItem",
        +          "x",
        +          "y"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "action": {
        +            "const": "create",
        +            "type": "string"
        +          },
        +          "color": {
        +            "type": "string"
        +          },
        +          "lineType": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "lineWidth": {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          "netName": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "operationId": {
        +            "maxLength": 120,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "points": {
        +            "items": {
        +              "properties": {
        +                "x": {
        +                  "type": "number"
        +                },
        +                "y": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "x",
        +                "y"
        +              ],
        +              "type": "object"
        +            },
        +            "maxItems": 500,
        +            "minItems": 2,
        +            "type": "array"
        +          },
        +          "primitiveKind": {
        +            "const": "wire",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "operationId",
        +          "action",
        +          "primitiveKind",
        +          "points",
        +          "netName"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "action": {
        +            "const": "create",
        +            "type": "string"
        +          },
        +          "alignMode": {
        +            "maximum": 9,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "bold": {
        +            "type": "boolean"
        +          },
        +          "color": {
        +            "type": "string"
        +          },
        +          "content": {
        +            "maxLength": 10000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "fontName": {
        +            "type": "string"
        +          },
        +          "fontSize": {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          "italic": {
        +            "type": "boolean"
        +          },
        +          "operationId": {
        +            "maxLength": 120,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "primitiveKind": {
        +            "const": "text",
        +            "type": "string"
        +          },
        +          "rotation": {
        +            "type": "number"
        +          },
        +          "underline": {
        +            "type": "boolean"
        +          },
        +          "x": {
        +            "type": "number"
        +          },
        +          "y": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "operationId",
        +          "action",
        +          "primitiveKind",
        +          "x",
        +          "y",
        +          "content"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "action": {
        +            "const": "create",
        +            "type": "string"
        +          },
        +          "color": {
        +            "type": "string"
        +          },
        +          "cornerRadius": {
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          "fillColor": {
        +            "type": "string"
        +          },
        +          "fillStyle": {
        +            "type": "string"
        +          },
        +          "height": {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          "lineType": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "lineWidth": {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          "operationId": {
        +            "maxLength": 120,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "primitiveKind": {
        +            "const": "rectangle",
        +            "type": "string"
        +          },
        +          "rotation": {
        +            "type": "number"
        +          },
        +          "width": {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          "x": {
        +            "type": "number"
        +          },
        +          "y": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "operationId",
        +          "action",
        +          "primitiveKind",
        +          "x",
        +          "y",
        +          "width",
        +          "height"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "action": {
        +            "const": "create",
        +            "type": "string"
        +          },
        +          "centerX": {
        +            "type": "number"
        +          },
        +          "centerY": {
        +            "type": "number"
        +          },
        +          "color": {
        +            "type": "string"
        +          },
        +          "fillColor": {
        +            "type": "string"
        +          },
        +          "fillStyle": {
        +            "type": "string"
        +          },
        +          "lineType": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "lineWidth": {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          "operationId": {
        +            "maxLength": 120,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "primitiveKind": {
        +            "const": "circle",
        +            "type": "string"
        +          },
        +          "radius": {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "operationId",
        +          "action",
        +          "primitiveKind",
        +          "centerX",
        +          "centerY",
        +          "radius"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "action": {
        +            "const": "create",
        +            "type": "string"
        +          },
        +          "color": {
        +            "type": "string"
        +          },
        +          "fillColor": {
        +            "type": "string"
        +          },
        +          "lineType": {
        +            "maximum": 9007199254740991,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "lineWidth": {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          "operationId": {
        +            "maxLength": 120,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "points": {
        +            "items": {
        +              "properties": {
        +                "x": {
        +                  "type": "number"
        +                },
        +                "y": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "x",
        +                "y"
        +              ],
        +              "type": "object"
        +            },
        +            "maxItems": 500,
        +            "minItems": 3,
        +            "type": "array"
        +          },
        +          "primitiveKind": {
        +            "const": "polygon",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "operationId",
        +          "action",
        +          "primitiveKind",
        +          "points"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "action": {
        +            "const": "create",
        +            "type": "string"
        +          },
        +          "identification": {
        +            "enum": [
        +              "Power",
        +              "Ground",
        +              "AnalogGround",
        +              "ProtectGround"
        +            ],
        +            "type": "string"
        +          },
        +          "netName": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "operationId": {
        +            "maxLength": 120,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "primitiveKind": {
        +            "const": "netflag",
        +            "type": "string"
        +          },
        +          "rotation": {
        +            "type": "number"
        +          },
        +          "x": {
        +            "type": "number"
        +          },
        +          "y": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "operationId",
        +          "action",
        +          "primitiveKind",
        +          "netName",
        +          "x",
        +          "y",
        +          "identification"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "action": {
        +            "const": "create",
        +            "type": "string"
        +          },
        +          "netName": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "operationId": {
        +            "maxLength": 120,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "portType": {
        +            "enum": [
        +              "input",
        +              "output",
        +              "bidirectional",
        +              "triState",
        +              "passive"
        +            ],
        +            "type": "string"
        +          },
        +          "primitiveKind": {
        +            "const": "netport",
        +            "type": "string"
        +          },
        +          "rotation": {
        +            "type": "number"
        +          },
        +          "x": {
        +            "type": "number"
        +          },
        +          "y": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "operationId",
        +          "action",
        +          "primitiveKind",
        +          "netName",
        +          "x",
        +          "y"
        +        ],
        +        "type": "object"
        +      }
        +    ]
        +  },
        +  {
        +    "properties": {
        +      "action": {
        +        "const": "modify",
        +        "type": "string"
        +      },
        +      "operationId": {
        +        "maxLength": 120,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "primitiveId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "property": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "operationId",
        +      "action",
        +      "primitiveId",
        +      "property"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "action": {
        +        "const": "setPinNoConnect",
        +        "type": "string"
        +      },
        +      "noConnected": {
        +        "default": true,
        +        "type": "boolean"
        +      },
        +      "operationId": {
        +        "maxLength": 120,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "pinNumber": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "primitiveId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "operationId",
        +      "action",
        +      "primitiveId",
        +      "pinNumber"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "action": {
        +        "const": "delete",
        +        "type": "string"
        +      },
        +      "operationId": {
        +        "maxLength": 120,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "primitiveId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "operationId",
        +      "action",
        +      "primitiveId"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_check_collisions5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / scan_complete
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / scan_diagnostics
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "component_count": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "component_enumeration_ms": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "components_scanned": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "concurrency": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    "duration_ms": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "failed_component_count": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "failed_components": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "error": {
        +            "type": "string"
        +          },
        +          "primitive_id": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "primitive_id",
        +          "error"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "overall_timeout_ms": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    "per_call_timeout_ms": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    "pin_lookup_ms": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "stage": {
        +      "enum": [
        +        "complete",
        +        "component_enumeration",
        +        "pin_lookup"
        +      ],
        +      "type": "string"
        +    },
        +    "stage_error": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "stage",
        +    "component_count",
        +    "components_scanned",
        +    "failed_component_count",
        +    "failed_components",
        +    "duration_ms",
        +    "component_enumeration_ms",
        +    "pin_lookup_ms",
        +    "concurrency",
        +    "per_call_timeout_ms",
        +    "overall_timeout_ms"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "project_id",
        -  "collisions",
        -  "collision_count",
        -  "success"
        -]New value: +[
        +  "project_id",
        +  "collisions",
        +  "collision_count",
        +  "scan_complete",
        +  "success"
        +]
    • Changedeasyeda_schematic_component_pins4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / pins / items / properties / noConnected
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / pins / items / properties / primitiveId
        Added value: +{
        +  "type": "string"
        +}
    • Changedeasyeda_schematic_components7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / pageUuid
        Added value: +{
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / scope
        Added value: +{
        +  "enum": [
        +    "focused",
        +    "page",
        +    "all_pages"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / error_code
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / error_data
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focusedPageUuid": {
        +      "type": "string"
        +    },
        +    "missingCapability": {
        +      "type": "string"
        +    },
        +    "operation": {
        +      "type": "string"
        +    },
        +    "pageUuid": {
        +      "type": "string"
        +    },
        +    "requestedScope": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / read_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focus_changed": {
        +      "const": false,
        +      "type": "boolean"
        +    },
        +    "focused_page_uuid": {
        +      "type": "string"
        +    },
        +    "page_uuid": {
        +      "type": "string"
        +    },
        +    "requested": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "resolved": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "source": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "resolved",
        +    "focus_changed",
        +    "source"
        +  ],
        +  "type": "object"
        +}
    • Changedeasyeda_schematic_connect_pin_to_net2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_connect_pins_by_net2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_create_net_flag2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_create_net_port2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_delete_primitive6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / primitiveIds / items / minLength
        Added value: +1
      • addedInput schema / properties / primitiveIds / minItems
        Added value: +1
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Required when transactionId is supplied; must match the transaction document.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / transactionId
        Added value: +{
        +  "description": "Optional snapshot-backed project transaction ID.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_modify_primitive2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_net_detail11 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / pageUuid
        Added value: +{
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / scope
        Added value: +{
        +  "enum": [
        +    "focused",
        +    "page",
        +    "all_pages"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / error_code
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / error_data
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focusedPageUuid": {
        +      "type": "string"
        +    },
        +    "missingCapability": {
        +      "type": "string"
        +    },
        +    "operation": {
        +      "type": "string"
        +    },
        +    "pageUuid": {
        +      "type": "string"
        +    },
        +    "requestedScope": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / read_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focus_changed": {
        +      "const": false,
        +      "type": "boolean"
        +    },
        +    "focused_page_uuid": {
        +      "type": "string"
        +    },
        +    "page_uuid": {
        +      "type": "string"
        +    },
        +    "requested": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "resolved": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "source": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "resolved",
        +    "focus_changed",
        +    "source"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / timed_out
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / timeout_component
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / timeout_stage
        Added value: +{
        +  "type": "string"
        +}
    • Changedeasyeda_schematic_nets7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / pageUuid
        Added value: +{
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / scope
        Added value: +{
        +  "enum": [
        +    "focused",
        +    "page",
        +    "all_pages"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / error_code
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / error_data
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focusedPageUuid": {
        +      "type": "string"
        +    },
        +    "missingCapability": {
        +      "type": "string"
        +    },
        +    "operation": {
        +      "type": "string"
        +    },
        +    "pageUuid": {
        +      "type": "string"
        +    },
        +    "requestedScope": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / read_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focus_changed": {
        +      "const": false,
        +      "type": "boolean"
        +    },
        +    "focused_page_uuid": {
        +      "type": "string"
        +    },
        +    "page_uuid": {
        +      "type": "string"
        +    },
        +    "requested": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "resolved": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "source": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "resolved",
        +    "focus_changed",
        +    "source"
        +  ],
        +  "type": "object"
        +}
    • Changedeasyeda_schematic_place_component4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Required when transactionId is supplied; must match the transaction document.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / transactionId
        Added value: +{
        +  "description": "Optional snapshot-backed project transaction ID.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_plan_safe_region2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_preview_imported_normalization2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_search_device2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedeasyeda_schematic_set_pin_no_connect
    • Changedeasyeda_schematic_set_title_block2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_sheet_info14 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / pageUuid
        Added value: +{
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / scope
        Added value: +{
        +  "enum": [
        +    "focused",
        +    "page",
        +    "all_pages"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / diagnostics
        Added value: +{}
      • addedOutput schema / properties / error_code
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / error_data
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focusedPageUuid": {
        +      "type": "string"
        +    },
        +    "missingCapability": {
        +      "type": "string"
        +    },
        +    "operation": {
        +      "type": "string"
        +    },
        +    "pageUuid": {
        +      "type": "string"
        +    },
        +    "requestedScope": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / focused_document
        Added value: +{}
      • addedOutput schema / properties / geometry_available
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata_source
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / pages
        Added value: +{
        +  "items": {},
        +  "type": "array"
        +}
      • addedOutput schema / properties / read_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focus_changed": {
        +      "const": false,
        +      "type": "boolean"
        +    },
        +    "focused_page_uuid": {
        +      "type": "string"
        +    },
        +    "page_uuid": {
        +      "type": "string"
        +    },
        +    "requested": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "resolved": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "source": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "resolved",
        +    "focus_changed",
        +    "source"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / required
        Added value: +[
        +  "geometry_available"
        +]
    • Changedeasyeda_schematic_sync_to_pcb2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_validate_netlist7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / pageUuid
        Added value: +{
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / scope
        Added value: +{
        +  "enum": [
        +    "focused",
        +    "page",
        +    "all_pages"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / error_code
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / error_data
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focusedPageUuid": {
        +      "type": "string"
        +    },
        +    "missingCapability": {
        +      "type": "string"
        +    },
        +    "operation": {
        +      "type": "string"
        +    },
        +    "pageUuid": {
        +      "type": "string"
        +    },
        +    "requestedScope": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / read_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focus_changed": {
        +      "const": false,
        +      "type": "boolean"
        +    },
        +    "focused_page_uuid": {
        +      "type": "string"
        +    },
        +    "page_uuid": {
        +      "type": "string"
        +    },
        +    "requested": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "resolved": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "source": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "resolved",
        +    "focus_changed",
        +    "source"
        +  ],
        +  "type": "object"
        +}
    • Changedeasyeda_schematic_verify_write2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_schematic_wires7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / pageUuid
        Added value: +{
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / scope
        Added value: +{
        +  "enum": [
        +    "focused",
        +    "page",
        +    "all_pages"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / error_code
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / error_data
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focusedPageUuid": {
        +      "type": "string"
        +    },
        +    "missingCapability": {
        +      "type": "string"
        +    },
        +    "operation": {
        +      "type": "string"
        +    },
        +    "pageUuid": {
        +      "type": "string"
        +    },
        +    "requestedScope": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / read_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "focus_changed": {
        +      "const": false,
        +      "type": "boolean"
        +    },
        +    "focused_page_uuid": {
        +      "type": "string"
        +    },
        +    "page_uuid": {
        +      "type": "string"
        +    },
        +    "requested": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "resolved": {
        +      "enum": [
        +        "focused",
        +        "page",
        +        "all_pages"
        +      ],
        +      "type": "string"
        +    },
        +    "source": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "resolved",
        +    "focus_changed",
        +    "source"
        +  ],
        +  "type": "object"
        +}
    • Changedeasyeda_semantic_erc_auto2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedeasyeda_semantic_erc_validate2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 50 tool updatesv0.19.1
    • Changedeasyeda_board_dimensions3 fields changed
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / has_outline
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "project_id",
        -  "mounting_hole_count"
        -]New value: +[
        +  "project_id",
        +  "mounting_hole_count",
        +  "has_outline"
        +]
    • Changedeasyeda_board_layers1 field changed
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
    • Changedeasyeda_board_stackup2 fields changed
      • addedOutput schema / properties / data_source
        Added value: +{
        +  "enum": [
        +    "physical_stackup",
        +    "copper_layer_count_only"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
    • Changedeasyeda_bom_sourcing6 fields changed
      • addedOutput schema / properties / keyless_sourcing_enabled
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / parts / items / properties / sourcing / items / properties / cache_age_seconds
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / parts / items / properties / sourcing / items / properties / classification
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / parts / items / properties / sourcing / items / properties / from_cache
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / parts / items / properties / sourcing / items / properties / tier
        Added value: +{
        +  "enum": [
        +    "keyless",
        +    "authenticated"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / parts / items / properties / sourcing / items / required
        Previous value: -[
        -  "supplier",
        -  "in_stock"
        -]New value: +[
        +  "supplier",
        +  "tier",
        +  "in_stock"
        +]
    • Addedeasyeda_canvas_capture
    • Addedeasyeda_canvas_capture_region
    • Addedeasyeda_canvas_locate
    • Addedeasyeda_design_rules_lookup
    • Changedeasyeda_erc_run2 fields changed
      • addedOutput schema / properties / detail_source
        Added value: +{
        +  "enum": [
        +    "inferred_partial",
        +    "native_aggregate_only"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / inferred_floating_pins
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "designator": {
        +        "type": "string"
        +      },
        +      "pinNumber": {
        +        "type": "string"
        +      },
        +      "primitiveId": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "primitiveId",
        +      "designator",
        +      "pinNumber"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedeasyeda_export_gerbers3 fields changed
      • addedInput schema / properties / filePath
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / byte_length
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
    • Changedeasyeda_health_check7 fields changed
      • addedOutput schema / properties / catalog_device_count
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / easyeda_version
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / extension_version
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / extension_version_mismatch
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / keyless_sourcing_enabled
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / registry_mismatch
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "status",
        -  "version",
        -  "node_version",
        -  "profile",
        -  "transport",
        -  "bridge_connected",
        -  "ups"
        -]New value: +[
        +  "status",
        +  "version",
        +  "node_version",
        +  "profile",
        +  "transport",
        +  "bridge_connected",
        +  "extension_version_mismatch",
        +  "registry_mismatch",
        +  "keyless_sourcing_enabled",
        +  "catalog_device_count",
        +  "ups"
        +]
    • Addedeasyeda_pcb_components
    • Addedeasyeda_pcb_tracks
    • Addedeasyeda_pcb_vias
    • Addedeasyeda_post_write_qa
    • Addedeasyeda_project_begin_transaction
    • Addedeasyeda_project_commit_transaction
    • Addedeasyeda_project_get_transaction_status
    • Addedeasyeda_project_rollback_transaction
    • Changedeasyeda_project_save1 field changed
      • addedInput schema / properties / confirmWrite / description
        Added value: +"Must be the literal boolean true (not the string \"true\") to allow this write."
    • Addedeasyeda_project_validate_transaction
    • Addedeasyeda_schematic_add_circle
    • Addedeasyeda_schematic_add_polygon
    • Addedeasyeda_schematic_add_rectangle
    • Addedeasyeda_schematic_add_text
    • Changedeasyeda_schematic_add_wire1 field changed
      • addedInput schema / properties / confirmWrite / description
        Added value: +"Must be the literal boolean true (not the string \"true\") to allow this write."
    • Addedeasyeda_schematic_audit_imported_design
    • Addedeasyeda_schematic_batch_write
    • Addedeasyeda_schematic_check_collisions
    • Changedeasyeda_schematic_component_pins1 field changed
      • addedOutput schema / properties / pins / items / properties / pinType
        Added value: +{
        +  "type": "string"
        +}
    • Changedeasyeda_schematic_components19 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project/schematic ID"
      • addedOutput schema / properties / components / items / properties / annotated
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / components / items / properties / bom_eligible
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / components / items / properties / component_kind
        Added value: +{
        +  "enum": [
        +    "part",
        +    "power-symbol",
        +    "power-flag",
        +    "net-label",
        +    "net-port",
        +    "sheet-frame",
        +    "annotation",
        +    "helper",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / components / items / properties / deviceLibraryUuid
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / components / items / properties / deviceName
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / components / items / properties / deviceUuid
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / components / items / properties / electrical_eligible
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / components / items / properties / manufacturerId
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / components / items / properties / primitiveId
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / components / items / properties / raw_footprint
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / components / items / properties / raw_value
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / components / items / properties / rotation
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / components / items / properties / symbolName
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / components / items / properties / symbol_source
        Added value: +{
        +  "enum": [
        +    "native",
        +    "imported",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / components / items / properties / x
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / components / items / properties / y
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / properties / components / items / required
        Previous value: -[
        -  "reference",
        -  "value",
        -  "footprint"
        -]New value: +[
        +  "reference",
        +  "value",
        +  "footprint",
        +  "component_kind",
        +  "bom_eligible",
        +  "electrical_eligible",
        +  "annotated",
        +  "symbol_source",
        +  "raw_value",
        +  "raw_footprint"
        +]
      • addedOutput schema / properties / read_consistency
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "attempts": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    "stable": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "stable",
        +    "attempts"
        +  ],
        +  "type": "object"
        +}
    • Changedeasyeda_schematic_connect_pin_to_net2 fields changed
      • addedInput schema / properties / confirmWrite / description
        Added value: +"Must be the literal boolean true (not the string \"true\") to allow this write."
      • addedInput schema / properties / stubLength
        Added value: +{
        +  "description": "Length of the wire stub drawn outward from the pin. Defaults to 10.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
    • Changedeasyeda_schematic_connect_pins_by_net2 fields changed
      • addedInput schema / properties / confirmWrite / description
        Added value: +"Must be the literal boolean true (not the string \"true\") to allow this write."
      • addedInput schema / properties / stubLength
        Added value: +{
        +  "description": "Length of the wire stub drawn outward from each pin. Defaults to 10.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
    • Changedeasyeda_schematic_create_net_flag2 fields changed
      • addedInput schema / properties / confirmWrite / description
        Added value: +"Must be the literal boolean true (not the string \"true\") to allow this write."
      • addedInput schema / properties / identification
        Added value: +{
        +  "description": "Power-flag identification. When set, places an EasyEDA power/ground flag symbol of this type. When omitted, places a generic named net label instead.",
        +  "enum": [
        +    "Power",
        +    "Ground",
        +    "AnalogGround",
        +    "ProtectGround"
        +  ],
        +  "type": "string"
        +}
    • Changedeasyeda_schematic_create_net_port1 field changed
      • addedInput schema / properties / confirmWrite / description
        Added value: +"Must be the literal boolean true (not the string \"true\") to allow this write."
    • Changedeasyeda_schematic_delete_primitive1 field changed
      • addedInput schema / properties / confirmWrite / description
        Added value: +"Must be the literal boolean true (not the string \"true\") to allow this write."
    • Changedeasyeda_schematic_modify_primitive3 fields changed
      • addedInput schema / properties / confirmWrite / description
        Added value: +"Must be the literal boolean true (not the string \"true\") to allow this write."
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Required when transactionId is supplied; must match the transaction document.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / transactionId
        Added value: +{
        +  "description": "Optional snapshot-backed project transaction ID.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Changedeasyeda_schematic_net_detail1 field changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project/schematic ID"
    • Changedeasyeda_schematic_nets9 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project/schematic ID"
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / nets / items / properties / canonical_net_name
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / nets / items / properties / imported_alias
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / nets / items / properties / net_kind
        Added value: +{
        +  "enum": [
        +    "signal",
        +    "power",
        +    "ground",
        +    "power-flag",
        +    "unnamed"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / nets / items / properties / normalization_rules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / nets / items / properties / raw_net_name
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / nets / items / required
        Previous value: -[
        -  "net_name",
        -  "node_count",
        -  "nodes"
        -]New value: +[
        +  "net_name",
        +  "raw_net_name",
        +  "canonical_net_name",
        +  "net_kind",
        +  "normalization_rules",
        +  "imported_alias",
        +  "node_count",
        +  "nodes"
        +]
      • addedOutput schema / properties / read_consistency
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "attempts": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    "stable": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "stable",
        +    "attempts"
        +  ],
        +  "type": "object"
        +}
    • Changedeasyeda_schematic_place_component5 fields changed
      • addedInput schema / properties / checkPlacementCollision
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / collisionRadius
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / confirmWrite / description
        Added value: +"Must be the literal boolean true (not the string \"true\") to allow this write."
      • addedInput schema / properties / dryRun
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / verifyAfterWrite
        Added value: +{
        +  "type": "boolean"
        +}
    • Addedeasyeda_schematic_plan_safe_region
    • Addedeasyeda_schematic_preview_imported_normalization
    • Changedeasyeda_schematic_search_device6 fields changed
      • addedInput schema / properties / key / description
        Added value: +"Search keyword(s), matched against device name/description in the library"
      • addedInput schema / properties / minimal
        Added value: +{
        +  "description": "When true, return only uuid/libraryUuid/name/pin_count/symbol_type per device instead of the full library metadata object — use this when the goal is just picking a deviceItem for place_component, to avoid paying for fields you will not read.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / devices / items / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / devices / items / properties
        Added value: +{
        +  "pin_count": {
        +    "maximum": 9007199254740991,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "symbol_type": {
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / devices / items / type
        Added value: +"object"
      • addedOutput schema / properties / provider_tier
        Added value: +{
        +  "const": "local_library",
        +  "type": "string"
        +}
    • Addedeasyeda_schematic_set_title_block
    • Addedeasyeda_schematic_sheet_info
    • Addedeasyeda_schematic_sync_to_pcb
    • Changedeasyeda_schematic_validate_netlist2 fields changed
      • addedOutput schema / properties / floating_pins / items / properties / designator
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / native_erc
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "error_count": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "passed": {
        +      "type": "boolean"
        +    },
        +    "warning_count": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "error_count",
        +    "warning_count",
        +    "passed"
        +  ],
        +  "type": "object"
        +}
    • Addedeasyeda_schematic_verify_write
    • Addedeasyeda_schematic_wires
    • Addedeasyeda_semantic_erc_auto
  3. 42 tool updatesv0.19.0
    • First observedeasyeda_api_inventory
    • First observedeasyeda_board_dimensions
    • First observedeasyeda_board_features
    • First observedeasyeda_board_layers
    • First observedeasyeda_board_stackup
    • First observedeasyeda_bom_export
    • First observedeasyeda_bom_generate
    • First observedeasyeda_bom_quality_report
    • First observedeasyeda_bom_sourcing
    • First observedeasyeda_bom_validate
    • First observedeasyeda_bridge_status
    • First observedeasyeda_drc_run
    • First observedeasyeda_erc_run
    • First observedeasyeda_export_gerbers
    • First observedeasyeda_get_capabilities
    • First observedeasyeda_get_feature_flags
    • First observedeasyeda_get_server_config
    • First observedeasyeda_get_tool_profiles
    • First observedeasyeda_health_check
    • First observedeasyeda_observability_report
    • First observedeasyeda_pcb_constraint_check
    • First observedeasyeda_pcb_constraint_report
    • First observedeasyeda_pcb_production_review
    • First observedeasyeda_power_tree_analyze
    • First observedeasyeda_project_save
    • First observedeasyeda_rule_check_summary
    • First observedeasyeda_run_self_test
    • First observedeasyeda_schematic_add_wire
    • First observedeasyeda_schematic_component_pins
    • First observedeasyeda_schematic_components
    • First observedeasyeda_schematic_connect_pin_to_net
    • First observedeasyeda_schematic_connect_pins_by_net
    • First observedeasyeda_schematic_create_net_flag
    • First observedeasyeda_schematic_create_net_port
    • First observedeasyeda_schematic_delete_primitive
    • First observedeasyeda_schematic_modify_primitive
    • First observedeasyeda_schematic_net_detail
    • First observedeasyeda_schematic_nets
    • First observedeasyeda_schematic_place_component
    • First observedeasyeda_schematic_search_device
    • First observedeasyeda_schematic_validate_netlist
    • First observedeasyeda_semantic_erc_validate

TDQS

B3.1/5.0

Scored across 73 tools

Disambiguation2/5

Many tools have overlapping purposes: health_check, bridge_status, get_capabilities, get_server_config, get_tool_profiles, observability_report, run_self_test, and get_feature_flags all provide status/config/diagnostic information. Multiple ERC/netlist validation tools (schematic_validate_netlist, semantic_erc_validate, semantic_erc_auto, erc_run, post_write_qa, rule_check_summary) are difficult to tell apart, and BOM tools (generate, export, validate, sourcing, quality_report) also overlap. An agent could easily misselect among these clusters.

Naming Consistency4/5

All names use snake_case with a consistent easyeda_ prefix and domain grouping (schematic, pcb, board, bom, project, canvas). However, the action convention is not uniform: some tools use verb_noun (e.g. add_wire, create_net_flag), while others use noun-only list forms (e.g. schematic_nets, pcb_components) or noun_phrase_report forms. Still, the pattern is predictable enough for an agent to parse.

Tool Count1/5

73 tools is far beyond the typical 3-15 range and exceeds the 50+ threshold for an extreme mismatch. Even for a broad EDA automation server, the count suggests redundancy, especially among status, diagnostic, ERC/validation, and BOM tools. This volume makes the set unwieldy for an agent to navigate reliably.

Completeness3/5

The server covers a wide schematic lifecycle (read, search, place, wire, validate, transaction rollback) and many PCB read/analysis/export operations, plus BOM and documentation checks. However, there are notable gaps: no PCB write/edit tools (place components, add tracks/vias/zones), no project-open/create, no library management, and PCB editing transactions are absent. These gaps could block agent workflows that require modifying a PCB layout.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    MCP server for AI-assisted PCB design with EasyEDA Pro, enabling inspection, review, and automation of schematics, PCBs, and manufacturing export.
    1
    4
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    MCP servers for KiCad schematic, PCB, symbol, footprint, and project automation, enabling AI-assisted electronic design via tools for read/write, analysis, and exports.
    109
    409 PyPI
    13
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    An MCP server that enables AI assistants to analyze schematics, inspect PCBs, trace connections, validate designs, and generate embedded code for KiCad projects.
    39
    139
    MIT