Skip to main content
Glama

SheetsData MCP

npm MCP Badge sheetsdata-mcp MCP server

sheetsdata-mcp MCP server

Electronic component datasheets for AI agents — pinouts, specs, package info and design checks from manufacturer PDFs.

SheetsData is a hosted MCP server. Your agent finds parts across JLCPCB, Mouser and DigiKey, reads any section of a part's datasheet as text and tables, compares parts, checks a BOM, and checks your operating conditions against the datasheet's ratings. The agent never sees a PDF, and you don't have to find or paste one.

Server URL:  https://mcp.sheetsdata.com/mcp   (Streamable HTTP)
Sign-in:     MCP OAuth (browser), or an API key as "Authorization: Bearer <key>"

This repository holds the install configs, the @sheetsdata/mcp stdio proxy for clients that only start local servers, and the Claude Desktop bundle. The server itself is a hosted service.

What it looks like

"Is the TPS54302 fine with 24 V in and 2.5 A out?"

check_design_fit("TPS54302", input_voltage=24, output_current=2.5)

overall: WARNING
  input_voltage  24 V  PASS  within the recommended range 4.5–28 V (14.3% margin)
                             datasheet row: "| V I |  | 4.5 | 28 | V |"
  unmatched: output_current

A condition the tool can't find a limit for is listed as unmatched and keeps the verdict at WARNING: a clean PASS means every condition was checked against the datasheet.

"Buck converters that take 24 V in and give at least 2 A" (free):

find_parts("buck converter", constraints=[vin_max >= 24 V, iout >= 2 A])

AP63357DV-7       32 V  3.5 A  pass@digikey   stock: DigiKey 49,457   datasheet: ready
LM2596S-5.0/NOPB  40 V  3 A    pass@digikey   stock: DigiKey 4,460    datasheet: ready
LMR33630ADDAR     36 V  3 A    pass@digikey   stock: JLCPCB 17,768    datasheet: ready
read_datasheet("TPS54302", section="pinout")
→ GND (1), SW (2), VIN (3), FB (4), EN (5), BOOT (6)

Related MCP server: Nexar MCP Server

Tools

Prices are per call and the same on every plan. A call that fails is not charged. Current prices are on sheetsdata.com/pricing.

Tool

Price

What it does

search_parts

Free

Find parts by part number or keyword across JLCPCB, Mouser and DigiKey, merged by MPN, with stock, price and datasheet status from each.

find_parts

Free

Find parts that meet numeric specs with units (e.g. Vin ≥ 24 V, Iout ≥ 2 A), package or stock; each constraint reports pass, fail or unknown with its source.

get_part_details

3¢

A part's key parameters, package, pricing, stock and datasheet status, by MPN or LCSC number.

check_bom

3¢

Check up to 20 BOM lines for lifecycle, stock against quantity, single-distributor sourcing, datasheet status and stale prices.

prefetch_datasheets

1¢

Start reading up to 20 datasheets at once, so a whole BOM is ready before you ask about it.

check_extraction_status

Free

Report how far a datasheet that is still being read has got.

read_datasheet

10¢

Any section of a datasheet as text and tables (summary, pinout, electrical, absolute maximum ratings, package, or any heading), or a search within one datasheet.

search_datasheets

2¢

Search every datasheet read so far by meaning, e.g. "LDO with PSRR above 70 dB".

compare_parts

8¢

Compare 2–5 parts side by side: parameters, package, pricing, stock and datasheet summaries.

find_alternative

6¢

Find drop-in and functional substitutes for a part, ranked by spec, package and stock match.

check_design_fit

12¢

Check operating conditions against the absolute maximum and recommended ratings: PASS, WARNING or FAIL per condition, with the datasheet row it used.

analyze_image

10¢

Read values off a datasheet figure: a characteristic graph, package drawing or pin diagram.

request_datasheet_upload

Free

Get a private upload link for a datasheet PDF we couldn't find.

confirm_datasheet_upload

50¢

Verify the uploaded PDF (hash, valid PDF, MPN on page one) and read it into your organisation's private library. Not charged if the file fails the checks.

Pass manufacturer part numbers (TPS54302, STM32F446RCT6) or LCSC numbers (C2837938), not values like 100nF or reference designators like R1. A datasheet nobody has asked for yet is read on first request (poll check_extraction_status); after that it is cached for everyone.

Prompts

Built-in prompts that walk the agent through common hardware tasks:

Prompt

What it does

component-selection

Select a component: define requirements, search candidates, compare specs, validate design fit.

bom-review

Review a bill of materials: look up each part, check stock and lifecycle, flag risks, suggest alternatives.

datasheet-deep-dive

Summarise a part and extract its pinout, electrical specs, absolute maximum ratings and application circuit.

design-validation

Check each component against its operating conditions and flag out-of-spec parameters.

second-source

Find second-source alternatives that match package, specs and availability.

interface-check

Check electrical and protocol compatibility between two ICs on a shared bus (SPI, I2C, UART): logic levels, timing, pull-ups, level shifters.

firmware-kickstart

Extract the register map, initialisation sequence and protocol details of a peripheral IC into a firmware integration guide.

thermal-review

Thermal and derating analysis: absolute maximum and recommended limits, junction temperature from RθJA, SOA derating, exposed-pad needs.

Resources

Resource

What it holds

sheetsdata://workflow

The recommended tool order for component selection and design validation.

sheetsdata://tips/datasheet-pitfalls

The eight most common datasheet reading mistakes: absolute maximum vs recommended, typical vs worst case, thermal derating, logic levels, I2C/SPI gotchas, decoupling, exposed pads, lifecycle.

sheetsdata://tips/design-review-checklist

A hardware design review checklist (power, signal interfaces, component selection, firmware), pointing at the tool or prompt for each check.

Pricing

  • Free to start. A new account gets $5 of credit, no card needed ($20 more when you add a card). Searching (search_parts, find_parts) is free.

  • Trial is pay as you go from a prepaid balance: 5 new datasheets a day (datasheets already read are unlimited), 30 requests a minute.

  • Pro is $39 a month minimum, with your calls counting toward it: no daily cap on new datasheets, higher rate limits and a private parts library.

Plans, limits and fees: sheetsdata.com/pricing.

Authentication

Use whichever your client supports; both bill the same organisation.

OAuth (recommended)

API key

Best for

Interactive clients

CI, scripts, headless agents, clients without MCP OAuth

What you do

Add the URL, then sign in to SheetsData in the browser tab that opens

Create a key at sheetsdata.com/dashboard/keys and send Authorization: Bearer <key>

Standards

OAuth 2.1 with PKCE, dynamic client registration (RFC 7591), discovery (RFC 8414, RFC 9728)

Bearer token (RFC 6750)

Revoke

Per app, from the dashboard

Delete the key

If a client asks how to register an OAuth client, choose automatic (dynamic) registration; SheetsData doesn't support client ID metadata documents yet.

Install

One-click installs (sign in on first use):

Install in Cursor Install in VS Code Install in VS Code Insiders Install in Kiro Download .mcpb for Claude Desktop

Every client below was checked against its own documentation on 2026-10-16 (linked in each section). In the snippets, replace YOUR_API_KEY with a key from sheetsdata.com/dashboard/keys.

Claude (claude.ai and Claude Desktop)

Custom connector (OAuth). Open Customize → Connectors, click + Add, then Add custom connector. Name it SheetsData, paste https://mcp.sheetsdata.com/mcp and click Continue. Under OAuth client, choose Register automatically: SheetsData doesn't support the default "Use Claude's published identity" option yet. Click Add, then Connect, and sign in to SheetsData in the browser tab that opens. On Team and Enterprise plans an owner adds it under Organization settings → Connectors → Add → Custom → Web. Free plans can add one custom connector.

Claude Desktop bundle. Download sheetsdata-x.y.z.mcpb from the latest release and drop it onto the Claude Desktop window. Leave the API key field blank to sign in with OAuth, or paste a key.

In the custom connector dialog, add the request header Authorization: Bearer YOUR_API_KEY. Or, in Claude Desktop, open Settings → Developer → Edit Config and add the stdio proxy (needs Node.js 20.18.1 or later; claude_desktop_config.json only starts local servers, so it cannot hold the remote URL):

{
  "mcpServers": {
    "sheetsdata": {
      "command": "npx",
      "args": ["-y", "@sheetsdata/mcp"],
      "env": { "SHEETSDATA_API_KEY": "YOUR_API_KEY" }
    }
  }
}

Restart Claude. The proxy sends the key in a header, never on the command line.

Docs: Custom connectors using remote MCP

Claude Code

claude mcp add --transport http sheetsdata https://mcp.sheetsdata.com/mcp

Start Claude Code, run /mcp, choose sheetsdata → Authenticate and sign in (or run claude mcp login sheetsdata from your shell). Add --scope user to have SheetsData in every project.

claude mcp add --transport http sheetsdata https://mcp.sheetsdata.com/mcp \
  --header "Authorization: Bearer YOUR_API_KEY"

In a project's .mcp.json, give the entry "type": "http"; an entry without a type is treated as a local server.

Docs: Claude Code MCP

ChatGPT

On the web, open chatgpt.com/plugins, click +, then Add custom MCP server. Name it SheetsData, paste https://mcp.sheetsdata.com/mcp and choose OAuth. Accept the warning, choose Create as a plugin, install it and sign in to SheetsData. Your plan and workspace settings decide whether custom servers are available. ChatGPT cannot send an API key.

Docs: Custom MCP servers in ChatGPT

OpenAI Codex

codex mcp add sheetsdata --url https://mcp.sheetsdata.com/mcp
codex mcp login sheetsdata

The second command opens your browser to sign in. The Codex IDE extension and app read the same ~/.codex/config.toml.

Add to ~/.codex/config.toml, and set SHEETSDATA_API_KEY in your shell:

[mcp_servers.sheetsdata]
url = "https://mcp.sheetsdata.com/mcp"
bearer_token_env_var = "SHEETSDATA_API_KEY"

Docs: Codex MCP

Cursor

Click Install in Cursor, or add to ~/.cursor/mcp.json (every project) or .cursor/mcp.json (one project):

{
  "mcpServers": {
    "sheetsdata": {
      "url": "https://mcp.sheetsdata.com/mcp"
    }
  }
}

Cursor opens your browser to sign in when it first connects.

{
  "mcpServers": {
    "sheetsdata": {
      "url": "https://mcp.sheetsdata.com/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

Docs: Cursor MCP

VS Code (GitHub Copilot)

Click Install in VS Code, run code --add-mcp '{"name":"sheetsdata","type":"http","url":"https://mcp.sheetsdata.com/mcp"}', or add to .vscode/mcp.json (run MCP: Open User Configuration for every workspace):

{
  "servers": {
    "sheetsdata": {
      "type": "http",
      "url": "https://mcp.sheetsdata.com/mcp"
    }
  }
}

Start the server; VS Code asks you to sign in. Use it from Copilot Chat in agent mode.

VS Code asks for the key the first time the server starts and keeps it out of the file:

{
  "inputs": [
    { "type": "promptString", "id": "sheetsdata-key", "description": "SheetsData API key", "password": true }
  ],
  "servers": {
    "sheetsdata": {
      "type": "http",
      "url": "https://mcp.sheetsdata.com/mcp",
      "headers": { "Authorization": "Bearer ${input:sheetsdata-key}" }
    }
  }
}

Docs: VS Code MCP configuration

GitHub Copilot CLI

copilot mcp add --transport http sheetsdata https://mcp.sheetsdata.com/mcp

Or run /mcp add in a session, choose HTTP and paste the URL. Copilot CLI signs in with OAuth when the server asks.

copilot mcp add --transport http sheetsdata https://mcp.sheetsdata.com/mcp \
  --header "Authorization: Bearer YOUR_API_KEY"

Docs: Adding MCP servers to Copilot CLI

Gemini CLI

gemini mcp add --transport http --scope user sheetsdata https://mcp.sheetsdata.com/mcp

Start Gemini CLI, run /mcp auth sheetsdata and sign in.

gemini mcp add --transport http --scope user \
  --header "Authorization: Bearer YOUR_API_KEY" \
  sheetsdata https://mcp.sheetsdata.com/mcp

Editing ~/.gemini/settings.json by hand? Use "httpUrl" for the address; "url" means the older SSE transport.

Docs: Gemini CLI MCP servers

Google Antigravity

Open the … menu → MCP Servers → Manage MCP Servers → View raw config (~/.gemini/config/mcp_config.json, or .agents/mcp_config.json in a workspace) and add:

{
  "mcpServers": {
    "sheetsdata": {
      "serverUrl": "https://mcp.sheetsdata.com/mcp"
    }
  }
}

Antigravity needs serverUrl; it rejects url. Then open Agent settings → Customizations and click Authenticate next to sheetsdata. For an API key, add "headers": { "Authorization": "Bearer YOUR_API_KEY" } to the entry.

Docs: Antigravity MCP

Windsurf (Devin Desktop)

In the Cascade panel, open the … menu → MCPs → Open MCP config file (~/.config/devin/mcp_config.json; %APPDATA%\devin\mcp_config.json on Windows; older Windsurf versions use ~/.codeium/windsurf/mcp_config.json) and add:

{
  "mcpServers": {
    "sheetsdata": {
      "serverUrl": "https://mcp.sheetsdata.com/mcp"
    }
  }
}

You sign in to SheetsData in your browser when it connects. For an API key, add "headers": { "Authorization": "Bearer YOUR_API_KEY" } to the entry.

Docs: Cascade MCP

Zed

Add to your Zed settings.json (or Settings → AI → MCP Servers → Add Server → Add Remote Server):

{
  "context_servers": {
    "sheetsdata": {
      "url": "https://mcp.sheetsdata.com/mcp"
    }
  }
}

Zed asks you to sign in. For an API key, add "headers": { "Authorization": "Bearer YOUR_API_KEY" } to the entry.

Docs: Zed MCP

Cline

Open MCP Servers → Remote Servers, name it SheetsData, paste https://mcp.sheetsdata.com/mcp, choose Streamable HTTP and click Add Server; complete the browser sign-in when prompted. In Cline CLI, run cline mcp and choose Authorize OAuth for sheetsdata.

Open MCP Servers → Configure → Configure MCP Servers (cline_mcp_settings.json) and add the entry below. Without "type", Cline assumes SSE.

{
  "mcpServers": {
    "sheetsdata": {
      "type": "streamableHttp",
      "url": "https://mcp.sheetsdata.com/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

Or from Cline CLI: cline mcp add sheetsdata https://mcp.sheetsdata.com/mcp --transport http --header "Authorization: Bearer YOUR_API_KEY" --yes

Docs: Cline MCP

Roo Code

Roo Code's docs don't describe MCP OAuth, so use an API key. Open MCP → Edit Global MCP (mcp_settings.json) or the project's .roo/mcp.json:

{
  "mcpServers": {
    "sheetsdata": {
      "type": "streamable-http",
      "url": "https://mcp.sheetsdata.com/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

Docs: Using MCP in Roo Code

Continue

Continue's docs don't describe MCP OAuth, so use an API key. Save as .continue/mcpServers/sheetsdata.yaml in your workspace and add SHEETSDATA_API_KEY to your Continue secrets:

name: SheetsData
version: 0.0.1
schema: v1
mcpServers:
  - name: SheetsData
    type: streamable-http
    url: https://mcp.sheetsdata.com/mcp
    requestOptions:
      headers:
        Authorization: "Bearer ${{ secrets.SHEETSDATA_API_KEY }}"

Docs: Continue MCP

Goose

In Goose Desktop, open Extensions → Add custom extension and choose Streamable HTTP with the URL https://mcp.sheetsdata.com/mcp; in the CLI, run goose configure → Add Extension → Remote Extension (Streamable HTTP). Goose runs the OAuth sign-in when it connects. Or add to ~/.config/goose/config.yaml:

extensions:
  sheetsdata:
    name: SheetsData
    type: streamable_http
    uri: https://mcp.sheetsdata.com/mcp
    enabled: true
    timeout: 300

For an API key, add headers: { Authorization: "Bearer YOUR_API_KEY" } to the entry.

Docs: Using extensions in Goose

Amp

amp mcp add sheetsdata https://mcp.sheetsdata.com/mcp

Amp opens your browser to sign in.

Add to ~/.config/amp/settings.json (or .amp/settings.json in a project, then run amp mcp approve sheetsdata):

{
  "amp.mcpServers": {
    "sheetsdata": {
      "url": "https://mcp.sheetsdata.com/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

Docs: Amp MCP

Kiro

Click Install in Kiro, or add to ~/.kiro/settings/mcp.json (or .kiro/settings/mcp.json in a workspace):

{
  "mcpServers": {
    "sheetsdata": {
      "url": "https://mcp.sheetsdata.com/mcp"
    }
  }
}

Kiro asks you to sign in. For an API key, add "headers": { "Authorization": "Bearer YOUR_API_KEY" } to the entry.

Docs: Kiro MCP configuration

JetBrains (Junie and AI Assistant)

Junie (IDE and CLI): add to ~/.junie/mcp/mcp.json (or .junie/mcp/mcp.json in a project), then run /mcp and choose Authorize. For an API key, add "headers": { "Authorization": "Bearer YOUR_API_KEY" }.

{
  "mcpServers": {
    "sheetsdata": {
      "url": "https://mcp.sheetsdata.com/mcp"
    }
  }
}

AI Assistant: its docs describe neither OAuth nor headers for remote servers, so run the local proxy. Open Settings → Tools → AI Assistant → Model Context Protocol (MCP) → Add and paste the stdio entry below.

Docs: Junie MCP, AI Assistant MCP

opencode

Add to opencode.json:

{
  "mcp": {
    "sheetsdata": {
      "type": "remote",
      "url": "https://mcp.sheetsdata.com/mcp",
      "enabled": true
    }
  }
}

opencode signs in automatically, or run opencode mcp auth sheetsdata. For an API key, add "headers": { "Authorization": "Bearer YOUR_API_KEY" } to the entry.

Docs: opencode MCP servers

LM Studio

LM Studio's docs don't describe MCP OAuth, so use an API key. Open the Program tab → Install → Edit mcp.json:

{
  "mcpServers": {
    "sheetsdata": {
      "url": "https://mcp.sheetsdata.com/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

Docs: LM Studio MCP

Warp

Open Settings → Agents → MCP servers → + Add and paste:

{
  "sheetsdata": {
    "url": "https://mcp.sheetsdata.com/mcp"
  }
}

Warp opens your browser to sign in when the server starts. For an API key, add "headers": { "Authorization": "Bearer YOUR_API_KEY" } to the entry.

Docs: Warp MCP

Any client that only starts local servers

The @sheetsdata/mcp package (Node.js 20.18.1 or later) proxies stdio to the hosted server. Without SHEETSDATA_API_KEY it opens your browser to sign in with OAuth and caches the token.

{
  "mcpServers": {
    "sheetsdata": {
      "command": "npx",
      "args": ["-y", "@sheetsdata/mcp"],
      "env": { "SHEETSDATA_API_KEY": "YOUR_API_KEY" }
    }
  }
}

From a shell: SHEETSDATA_API_KEY=YOUR_API_KEY npx -y @sheetsdata/mcp, or npx -y @sheetsdata/mcp --api-key YOUR_API_KEY.

Your own code

Connect with the MCP TypeScript SDK over Streamable HTTP (the SDK can also run the OAuth flow):

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const transport = new StreamableHTTPClientTransport(new URL("https://mcp.sheetsdata.com/mcp"), {
  requestInit: { headers: { Authorization: "Bearer YOUR_API_KEY" } },
});
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(transport);

const result = await client.callTool({ name: "search_parts", arguments: { query: "TPS54302" } });
1. search_parts / find_parts → candidates by part number, keyword or spec
2. get_part_details          → parameters, package, pricing, stock
3. read_datasheet            → "summary" first, then the sections you need
4. check_design_fit          → your operating conditions against the ratings
5. find_alternative          → substitutes, if needed
6. compare_parts             → finalists side by side
7. check_bom                 → lifecycle, stock and sourcing for the whole BOM

Support

Disclaimer

Data is extracted from publicly available manufacturer datasheets by automated tools, including AI. It may contain errors, omissions or inaccuracies.

SheetsData and Octoco Ltd provide this data on an "as is" basis and make no warranties, express or implied, regarding its accuracy, completeness or fitness for any particular purpose. Always verify critical specifications against the official manufacturer datasheet before making design, purchasing or manufacturing decisions.

By using this service, you acknowledge that:

  • Extracted data may differ from the original manufacturer datasheet

  • SheetsData is not a substitute for reviewing official documentation

  • Octoco Ltd is not liable for any damages, losses, or design failures arising from the use of this data

  • Features, APIs and pricing may change

For terms of use, see sheetsdata.com/terms.

License

MIT (this repository: install configs, the npm proxy and the Claude Desktop bundle). The hosted service is covered by the terms of use.

Available Tools

14 tools
analyze_imageAnalyze Datasheet ImageA
Read-onlyIdempotent
Inspect

Costs 5¢ per call. Reads a datasheet image with vision AI: a graph, package drawing, pin diagram or schematic that read_datasheet returned. Pass the image_key from that response (the storage path in the image URL), optionally with a question. For exact electrical values prefer read_datasheet's text tables; use this for what only the picture shows (package dimensions, pin assignments, curve trends, approximate values off a curve). Example: analyze_image(part_number='IRFZ44N', image_key='images/abc123.png', question='What is the drain current at Vgs=5V?')

NameRequiredDescriptionDefault
questionNoOptional question about the image (e.g. 'What are the package dimensions?')
image_keyYesImage storage path from read_datasheet output (e.g. 'images/abc123.png')
part_numberYesMPN of the component

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/non-destructive; the description adds real value beyond them with a cost disclosure ('Costs 5¢ per call'), the vision-AI processing model, and the precondition that image_key must come from a prior read_datasheet response. It does not describe the response shape, though idempotency is confirmed 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.

Conciseness4/5

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

Dense and front-loaded with cost and core action before the routing guidance and example. Every sentence carries information, though the example and the parenthetical field explanations make it slightly longer than strictly necessary.

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, idempotent vision tool with no output schema, the definition covers purpose, cost, precondition, and selection guidance against its main sibling. What it does not state is the shape of the returned answer, 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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning: image_key is described as 'the storage path in the image URL' sourced from read_datasheet, and question is framed as optional with an inline call example. This goes beyond the schema's terse field docs.

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 (reads with vision AI) and resource (datasheet image: graph, package drawing, pin diagram, schematic), and explicitly ties it to read_datasheet output. An agent can distinguish it from read_datasheet 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 routes: 'For exact electrical values prefer read_datasheet's text tables; use this for what only the picture shows (package dimensions, pin assignments, curve trends, approximate values off a curve).' Both the when and the when-not, plus the named alternative, are stated.

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

check_bomCheck BOMA
Read-onlyIdempotent
Inspect

Costs 2¢ per call. Check up to 20 BOM lines for lifecycle, stock against quantity, observed single-distributor sourcing, datasheet status and stale/missing prices. Accepts MPNs or LCSC numbers; duplicate MPN quantities are aggregated. Uses exact identities, catalogue snapshots and available distributor details. Unknown remains unknown; single_source does not prove only one supplier exists. Compact columns/rows by default; verbose returns objects. No extraction.

NameRequiredDescriptionDefault
linesYes
verboseNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is low, yet the description adds substantial operational context: a 2¢ per-call cost, duplicate-MPN quantity aggregation, the data sources used (exact identities, catalogue snapshots, distributor details), and epistemic caveats that 'unknown remains unknown' and single_source does not prove exclusivity.

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?

Cost is front-loaded, followed immediately by the checked dimensions, then input formats, then output-format behavior. Sentences are terse with no filler; even short clauses like 'No extraction.' carry exclusions rather than padding.

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?

No output schema exists, and the description still covers return shape (compact columns/rows by default vs verbose objects), input limits, accepted identifiers, aggregation behavior, data provenance, and cost. An agent has everything needed to invoke and interpret the result 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?

With 0% schema description coverage, the description must compensate, and it largely does: it explains that the mpn field accepts either MPNs or LCSC numbers, that duplicate MPNs aggregate quantities, and that verbose returns objects vs default compact columns/rows. It omits the qty bounds and the 20-item minimum (schema minItems=1), leaving minor gaps.

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 (check BOM lines) plus the exact scope of what is checked: lifecycle, stock vs quantity, single-distributor sourcing, datasheet status, stale/missing prices. This clearly separates it from siblings like check_design_fit, find_alternative, or check_extraction_status.

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 usage context: it operates on up to 20 BOM lines, accepts MPNs or LCSC numbers, and explicitly excludes extraction ('No extraction.'), routing that need elsewhere. It never names a sibling alternative (e.g. find_alternative for substitutions) or states when-not-to-use, so it falls short of full routing guidance.

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

check_design_fitCheck Design FitA
Read-only
Inspect

Costs 5¢ per call. Checks your operating conditions against the part's absolute maximum ratings and recommended operating conditions; returns PASS / WARNING / FAIL / INSUFFICIENT_DATA per condition and overall. Conditions by part type: converters and LDOs take input_voltage, output_voltage, output_current, ambient_temp, efficiency; MOSFETs take supply_voltage (VDS), output_current (ID), ambient_temp, power_dissipation; logic ICs take supply_voltage (VCC). Verdicts:

  • PASS: inside the recommended range, or at or below the derated limit. By default input_voltage and supply_voltage must stay at or below 80% of the absolute-maximum rating when no recommended maximum is known (inside a recommended range is a PASS), and output_current at or below 80% of its tightest rating; derating_pct changes this. Zero headroom on a rated current always warns. This is a screening policy; derating_reference cites the reliability guidance and its limits. Each check reports margin_pct against the raw limit, derating_pct and derated_limit.

  • WARNING: within the limit but above the derated limit, above the recommended maximum but below the absolute maximum, or within 10% of an absolute maximum that isn't derated.

  • FAIL: outside the range or over the limit.

  • INSUFFICIENT_DATA: not safely checkable, usually an ambient_temp that could not be turned into a junction-temperature check. It never counts as a PASS. Each check has limit_type (max / min / range / fixed); checks read from the datasheet text (source='llm') carry source_quote, the row the limit came from. A condition with no limit is listed in unmatched and holds the overall verdict at WARNING. If the ratings came from a different MPN than you asked for, resolved_as and data_quality_warning lead the response. Temperature: ambient_temp is never silently compared with a junction limit. When the part's own dissipation is known, the tool estimates Tj = Ta + Pd × RθJA (RθJA from the datasheet's thermal table) and judges Tj against the junction limits, reported as 'temperature (junction est.)'. Pd by part type: LDO (Vin - Vout) × Iout; switching converter Vout × Iout × (1/η - 1), which needs efficiency; anything else, pass power_dissipation (for a MOSFET, ID² × RDS(on)). Without these the check is INSUFFICIENT_DATA and its note says what to pass. Current ratings are read at ambient_temp (a MOSFET's 25 °C drain current is derated towards its maximum junction temperature). temperature_basis says which basis was used. Stored parameters answer instantly; anything else is read from the datasheet's ratings tables (validation_method says which). A part not yet extracted starts extraction and returns status='extracting' (not charged). A datasheet nobody has read before usually takes 1-3 minutes, 5 or more for a large one or a busy queue. These are estimates, not deadlines. Not for: transient or full thermal analysis (the junction estimate is a steady-state screen), MOSFET SOA curves (analyze_image the SOA graph), passives with no ratings table. Example: check_design_fit('TPS54302', input_voltage=24, output_voltage=5, output_current=2.5, ambient_temp=70, efficiency=0.92)

NameRequiredDescriptionDefault
efficiencyNoConverter efficiency at this operating point, as a fraction (0.92) or a percentage (92). Lets the tool estimate a switching converter's junction temperature.
part_numberYesSpecific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1').
ambient_tempNoAmbient temperature TA (°C).
derating_pctNoPercent below a rating a PASS must stay, for input_voltage, supply_voltage and output_current. Default 20 (run at no more than 80% of the rating). 0 turns optional derating off; no current headroom still warns.
input_voltageNoInput voltage / VIN (V). For converters.
output_currentNoOutput current / IOUT (A). For MOSFETs, this is drain current ID.
output_voltageNoOutput voltage / VOUT (V). For converters/LDOs.
supply_voltageNoSupply voltage / VCC / VDD (V). For MOSFETs, VDS; compared against VDS(max) only.
power_dissipationNoThe part's own power dissipation (W), if you have worked it out (e.g. ID² × RDS(on) for a MOSFET). Used for the junction-temperature estimate.
switching_frequencyNoSwitching frequency FSW (kHz). For converters.

TDQS

A4.8/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: a 5¢ per-call cost, extraction triggered for unread parts (uncharged), 1-3 minute latency estimates, the default 80% derating screening policy, junction-temperature estimation logic, and the rule that unmatched conditions hold the verdict at WARNING. These are exactly the operational traits annotations do not carry.

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?

Front-loaded with cost, purpose, and return values, and most sentences earn their place given the tool's genuine complexity. It is nonetheless long and sprawling, with the temperature and verdict details somewhat interleaved, so it falls short of ideal tightness.

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 10-parameter tool with no output schema, the description fully specifies the response shape (per-condition verdicts, margin_pct, derated_limit, limit_type, source_quote, unmatched, resolved_as, data_quality_warning, temperature_basis, status='extracting') and the screening policy. 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.

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds real meaning: which parameters apply to which part type, that efficiency is required for a switching converter's Tj estimate, and the Pd formulas per part type (LDO (Vin-Vout)×Iout, MOSFET ID²×RDS(on)). It stops short of documenting derating_pct's full interaction beyond what the schema already states.

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 (checks operating conditions against a part's ratings) and the exact return vocabulary (PASS/WARNING/FAIL/INSUFFICIENT_DATA per condition and overall). It also delineates scope against siblings with an explicit 'Not for' list naming analyze_image for SOA curves and excluding transient/thermal analysis and passives.

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?

Gives explicit when-to-use guidance by mapping required conditions to part type (converters/LDOs vs MOSFETs vs logic ICs) and provides a worked example call. The 'Not for' section names alternatives (analyze_image for SOA) and exclusions, so an agent can route correctly.

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

check_extraction_statusCheck Datasheet StatusA
Read-onlyIdempotent
Inspect

Free. Extraction status of 1-20 parts. A part being read reports current_step, elapsed_seconds, estimated_remaining_seconds with a range, and poll_after_seconds; a failed one reports its error; a part that isn't ready may list related_ready part numbers whose datasheet is readable now. A datasheet nobody has read before usually takes 1-3 minutes, 5 or more for a large one or a busy queue. These are estimates, not deadlines. A part whose PDF is still being looked for reads 'resolving'. Not final. Keep polling while the status is 'resolving', 'queued', 'pending' or 'extracting' (after poll_after_seconds); stop at 'ready', 'failed', 'no_source' or 'unsupported'. datasheet_status: 'ready' → read it; 'extracting' / 'queued' / 'pending' / 'resolving' → poll check_extraction_status; 'not_extracted' → prefetch_datasheets; 'no_source' / 'unsupported' → request_datasheet_upload. Full list in the server instructions.

NameRequiredDescriptionDefault
part_numbersYes1-20 parts. Specific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1').

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover safety (readOnly, idempotent, non-destructive), and the description adds substantial behavioral context beyond them: it is free to call, expected latency is 1-3 minutes (5+ for large files or busy queues), timings are estimates not deadlines, and 'resolving' means the PDF is still being located. It also enumerates the fields returned per part state.

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?

Front-loaded with the most important fact ('Free', scope of 1-20 parts), and nearly every sentence carries operational value. The middle section is dense and semi-colon heavy, which slightly reduces scanability but not substance.

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?

There is no output schema, so the description carries the burden and does so: it describes per-state return fields (current_step, elapsed_seconds, estimated_remaining_seconds, poll_after_seconds, error, related_ready). Combined with the polling and routing rules, an agent has everything needed to call and interpret 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 coverage is 100% and the schema already documents the MPN/LCSC format and the 'not a value/designator' constraint. The description only restates the 1-20 bound, adding no format or syntax detail beyond the schema, so the baseline of 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 resource (datasheet extraction status) for a bounded set of 1-20 parts, with the verb 'check' implied by the name. It distinguishes itself from siblings by explicitly mapping status values to the tools to use next (read_datasheet, prefetch_datasheets, request_datasheet_upload).

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?

Explicit when-to-poll rules: keep polling on 'resolving', 'queued', 'pending', 'extracting' (after poll_after_seconds); stop at 'ready', 'failed', 'no_source', 'unsupported'. It also routes each terminal status to the correct alternative tool, 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.

compare_partsCompare PartsA
Read-onlyIdempotent
Inspect

Costs 2¢ per call. Compares 2-5 parts you already know side by side in one call (find candidates with search_parts or find_alternative first). Returns each part's details (per-provider specs, price breaks and links, the cached datasheet summary), a comparison table of parameters × parts built from each part's own provider data, and per-part flags: lifecycle (obsolete, NRND, last-time-buy), stock, datasheet_status, and resolved_as when a lookup landed on a different MPN. compact=true returns only the flags and the table, a much shorter answer; add include_summaries=true for the summaries. Never starts extraction: prefetch_datasheets first if you need summaries. If any input is not a real part number, the whole call is rejected with a 'rejected' map; a valid MPN no provider knows still gets a column, with an error. Example: compare_parts(['TPS54302', 'LM2596', 'MP2359']) datasheet_status: 'ready' → read it; 'extracting' / 'queued' / 'pending' / 'resolving' → poll check_extraction_status; 'not_extracted' → prefetch_datasheets; 'no_source' / 'unsupported' → request_datasheet_upload. Full list in the server instructions.

NameRequiredDescriptionDefault
compactNoReturn the shorter answer: per-part flags and the comparison table, without per-provider detail or summaries. Default false: the full answer.
part_numbersYes2-5 parts. Specific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1').
include_summariesNoWith compact=true, also return each part's cached datasheet summary (about 2-4k characters each). The full answer always has them.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, non-destructive, open-world, so the bar is lower; the description still adds real behavioral context beyond them: a 2¢ per-call cost, the all-or-nothing rejection of non-MPN inputs, the error column for valid-but-unknown MPNs, the resolved_as flag when a lookup lands on a different MPN, and the fact that it never itself starts extraction.

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?

Long but front-loaded: cost, then what it does, then the return shape, then the routing table, then the compact/mode behavior. Nearly every clause is actionable, though the routing enumeration is dense enough that it could be tightened without losing information.

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?

No output schema exists, yet the description fully characterizes the return payload (per-provider specs, price breaks and links, cached datasheet summary, a parameters × parts table, and per-part lifecycle/stock/datasheet_status/resolved_as flags) plus the mode variants, so an agent knows both when and what to expect.

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 100%, so the baseline is 3; however the description adds meaning the schema does not, notably that include_summaries only applies with compact=true and that compact mode still retains the flags and comparison table. It restates the 2-5 bound and the 'not a value/reference designator' constraint that the schema already gives, so it does not reach 5.

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 ('Compares 2-5 parts ... side by side in one call') and explicitly scopes it to parts you already know, naming search_parts and find_alternative as the candidate-discovery siblings. An agent can distinguish this from every sibling 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?

Gives explicit when-to-use and prerequisites: find candidates with search_parts/find_alternative first, prefetch_datasheets before expecting summaries. It also routes on results (datasheet_status 'ready' → read it; 'extracting' → poll check_extraction_status; 'not_extracted' → prefetch_datasheets; 'no_source' → request_datasheet_upload), which is unusually actionable.

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

confirm_datasheet_uploadConfirm Datasheet UploadA
Destructive
Inspect

Costs 10¢ per call. That is the upload fee, charged only when the file passes its checks. Confirms an upload started with request_datasheet_upload: pass its upload_token. The server re-hashes the uploaded bytes, checks it is a PDF with the MPN on the first page, adds it to your organisation's private library and queues extraction. Success returns document_id, mpn, sha256, file_size_bytes and status='pending'; poll check_extraction_status with the MPN. A datasheet nobody has read before usually takes 1-3 minutes, 5 or more for a large one or a busy queue. These are estimates, not deadlines. Failures (not charged): 'upload_not_found' (no bytes yet; retry the PUT), 'sha256_mismatch' (re-hash and re-request), 'invalid_pdf', 'mpn_not_in_pdf' (wrong file, or scanned image-only), 'token_expired' (older than 15 minutes; start again).

NameRequiredDescriptionDefault
upload_tokenYesOpaque token returned by request_datasheet_upload.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses a 10¢ charge levied only on success, the fact that bytes are re-hashed and validated as a PDF containing the MPN, that the file is added to the organisation's private library, expected latency (1-3 min, up to 5+), and a full enumeration of failure codes with remedies. This is exactly the kind of cost/side-effect/timing context annotations 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.

Conciseness4/5

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

Front-loaded with the cost and the core action, then success payload, then failure modes. Dense but nearly every sentence carries operational value; the timing-estimate caveat sentence is the only slightly marginal addition.

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 no output schema, the description still enumerates the success return fields (document_id, mpn, sha256, file_size_bytes, status='pending'), the follow-up tool, and all error states. Nothing an agent needs to invoke and handle the result 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 100%, so the baseline is 3, but the description adds real meaning: it ties the token to its originating tool and documents a 15-minute validity window via the 'token_expired' failure, which the schema does not mention.

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 ('Confirms an upload started with request_datasheet_upload') and names the exact input to carry over. It is clearly distinguishable from siblings like request_datasheet_upload and check_extraction_status by identifying itself as the second step of the upload flow.

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 says when to call it (after request_datasheet_upload, pass its upload_token) and what to do next (poll check_extraction_status with the MPN). Failure branches even prescribe concrete retry actions, so the agent knows when to retry vs. abandon.

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

find_alternativeFind Alternative PartsA
Read-onlyIdempotent
Inspect

Costs 2¢ per call. Finds alternative and second-source parts for an MPN that is out of stock, end of life or too expensive, ranked by match_score with match_notes. Candidates come from provider search and from parts with the same function in our own datasheet index; they must do the same job (an accelerometer is not offered for a 6-axis IMU) and are compared on named electrical specs. Each has a lifecycle, stock and datasheet_status; obsolete and NRND parts rank last. Constraints: 'same_package' (fuzzy: SOT-23 ≡ SOT23, SOIC-8 ≡ SOP-8), 'in_stock', 'jlcpcb'. They are never relaxed silently: a candidate that fails one is left out of alternatives, removed_by_constraints counts what each removed, and when that leaves too few, relaxed_matches lists the best ones with the constraints they failed. When nothing matches at all, the call returns error_type 'not_found' (not charged) with the parts that would match without the constraints, under matches_without_constraints. The part's own family is also searched among datasheets already read (e.g. CH340C for CH340G). A score is similarity, not verified pin or electrical compatibility: check pinout and limits before substituting. Eval boards and modules are excluded. compact=true gives shorter rows (no per-source data or price breaks) and leaves out the reference part's summary unless include_original_summary=true. For a head-to-head of candidates you already have, use compare_parts. Example: find_alternative('TPS54302', constraints=['same_package', 'in_stock']) datasheet_status: 'ready' → read it; 'extracting' / 'queued' / 'pending' / 'resolving' → poll check_extraction_status; 'not_extracted' → prefetch_datasheets; 'no_source' / 'unsupported' → request_datasheet_upload. Full list in the server instructions.

NameRequiredDescriptionDefault
limitNoMax alternatives to return (default 5, max 20).
compactNoReturn the shorter answer: one short row per candidate (identity, lifecycle, stock, cheapest price, providers, match notes) and no reference-part summary. Default false: the full answer.
constraintsNoOptional filters. 'in_stock' = known non-zero stock at some provider. 'same_package' = same footprint (fuzzy). 'jlcpcb' = orderable at JLCPCB (also limits the provider search to JLCPCB).
part_numberYesSpecific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1').
include_original_summaryNoWith compact=true, also return the reference part's cached datasheet summary (about 2-3k characters). The full answer always has it.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the readOnly/openWorld/idempotent annotations: it discloses the 2¢ per-call cost, that constraints are never relaxed silently, that failures surface in removed_by_constraints/relaxed_matches, that not_found is not charged, and that match_score is similarity not verified compatibility. This is exactly the behavioral context an agent needs before invoking.

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?

Front-loaded with cost and purpose, and nearly every sentence earns its place. It is dense and slightly sprawling toward the end (datasheet_status branching plus a pointer to server instructions), which keeps it just below a perfect score.

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 no output schema, the description carries the return-shape burden and does so fully: match_score/match_notes, lifecycle/stock/datasheet_status, removed_by_constraints, relaxed_matches, and the not_found error with matches_without_constraints. An agent has everything required to call and interpret it.

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

Parameters5/5

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

Schema coverage is already 100%, but the description adds real meaning beyond it: fuzzy package equivalence examples (SOT-23 ≡ SOT23, SOIC-8 ≡ SOP-8), the non-silent-relaxation semantics of constraints, and the compact/include_original_summary interaction ('leaves out the reference part's summary unless include_original_summary=true').

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 with the triggering conditions: 'Finds alternative and second-source parts for an MPN that is out of stock, end of life or too expensive.' It also explicitly differentiates from the sibling compare_parts ('for a head-to-head of candidates you already have, use compare_parts').

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?

Names when to use it (out of stock, EOL, too expensive) and routes to the alternative tool compare_parts for a different need. It even documents the downstream branching per datasheet_status, telling the agent which sibling to call next.

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

find_partsFind Parts by SpecA
Read-onlyIdempotent
Inspect

Free. Find candidates by function and numeric specs with units, package or stock. Example: query='buck converter', constraints=[{parameter:'vin_max',op:'>=',value:'24 V'}, {parameter:'iout',op:'>=',value:'2 A'}]. Also accepts vds, rds_on, canonical parameter names and text constraints (interface contains I2C). Uses catalogue/JLCPCB parameters and DigiKey parametric filters when configured. Ranks pass/fail/unknown evidence; unknown is unverified. Values retain sources and test conditions. Compact columns/rows by default; verbose returns objects. Does not validate design fit.

NameRequiredDescriptionDefault
limitNo
queryYesFunction, e.g. buck converter, N-channel MOSFET, 6-axis IMU
packageNo
verboseNo
in_stockNoRequire positive stock observed within 24h; refresh at most six candidates.
constraintsNo

TDQS

A4.2/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/openWorld safety, and the description adds real behavioral context on top: evidence ranking semantics (pass/fail/unknown, unknown = unverified), source and test-condition retention, compact-vs-verbose return shape, 'Free' cost signal, and the DigiKey/JLCPCB configuration dependency. This is meaningful disclosure beyond the structured fields.

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?

Front-loaded with the cheapest useful fact ('Free') followed by the core action, and every sentence carries distinct information about constraints, ranking, or output format. It is dense and the inline example fattens the prose, but nothing is truly 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?

For a 6-parameter filtering tool with no output schema, the description covers result ranking, evidence reliability, and return shape (compact vs verbose), which is what the agent most needs. Remaining gaps are minor: limit/pagination behavior and package filtering semantics are left to the schema defaults.

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 only 33% schema coverage, the description compensates well: it shows the constraints object shape via example, clarifies value format ('24 V', '10 mΩ'), mentions text operators like 'contains', and explains verbose toggles output objects vs compact rows. It omits semantics for limit (1-20, default 5) and leaves package unelaborated, so not quite 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 ('Find candidates by function and numeric specs') plus scope modifiers (units, package, stock) that differentiate it from a plain keyword lookup. It implicitly separates itself from check_design_fit via 'Does not validate design fit,' but never names search_parts or find_alternative, so sibling differentiation is incomplete.

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?

Provides a concrete usage example with query + constraints, explains what parameter naming schemes are accepted (vds, rds_on, canonical names, text constraints), and states a clear when-not boundary ('Does not validate design fit'). It stops short of routing the agent to alternatives like search_parts or find_alternative, so it is not a full 5.

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

get_part_detailsGet Part DetailsA
Read-only
Inspect

Free. Full details for one part: provider specs, price, stock and lifecycle, the per-MPN structured values (specialized_specs), the cached datasheet summary, and datasheet_status with available_sections when ready. If any of it is for a different MPN than you asked for (an orderable variant, a base part, a sibling's datasheet), resolved_as and data_quality_warning at the top of the response say so, and prose written for another part is labelled as such at the start of datasheet_summary (family_summary with compact=true): trust specialized_specs for numbers. prefetch_datasheet=true starts extraction at no extra charge. Use after search_parts to drill into one result. datasheet_status: 'ready' → read it; 'extracting' / 'queued' / 'pending' / 'resolving' → poll check_extraction_status; 'not_extracted' → prefetch_datasheets; 'no_source' / 'unsupported' → request_datasheet_upload. Full list in the server instructions.

NameRequiredDescriptionDefault
compactNoReturn the shorter answer: prose written for another part comes back as family_summary instead of a labelled datasheet_summary. Default false: the full answer.
verboseNoReturn every available_sections entry. By default the first 50 are returned, plus a '_truncated' entry saying how many more exist.
providerNoWhich provider's sources to show (default 'all').all
part_numberYesSpecific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1').
prefetch_datasheetNoStart background datasheet extraction (no extra charge).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/destructive/openWorld and cost, so the bar is lower, yet the description adds substantial context: cost ('Free', and prefetch 'at no extra charge'), MPN-mismatch disclosure via resolved_as/data_quality_warning, labelling of foreign prose in datasheet_summary, and a trust rule ('trust specialized_specs for numbers'). That is real behavior beyond structured fields.

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?

Front-loads the highest-value facts ('Free. Full details for one part: ...') and every sentence carries information, including the status routing rules. It is a dense single paragraph with some repetition ('Free' vs 'no extra charge') and is long enough that a reader must scan carefully, which is a minor structural cost.

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?

No output schema exists, so the description carries the full burden of describing returns, and it does so by naming the key response fields (specialized_specs, datasheet_summary, datasheet_status, resolved_as, data_quality_warning). Combined with the status routing and the pointer to server instructions, an agent has everything needed to call and interpret this 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 100%, so the schema already documents all five parameters and baseline is 3. The description nonetheless adds meaning: the effect of compact (family_summary vs labelled datasheet_summary), the no-extra-charge property of prefetch_datasheet, and the 'trust specialized_specs for numbers' guidance tied to compact. The provider enum and verbose are not elaborated in prose, keeping it short of a 5.

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 ('Full details for one part') and enumerates exactly what comes back: provider specs, price, stock/lifecycle, specialized_specs, datasheet summary, datasheet_status with available_sections. It also distinguishes itself from search_parts by positioning itself as the drill-down step, so an agent can tell it apart from sibling search 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 says 'Use after search_parts to drill into one result', then provides a status-to-alternative routing table ('extracting' → check_extraction_status, 'not_extracted' → prefetch_datasheets, 'no_source' → request_datasheet_upload). This is textbook when-to-use/when-to-use-something-else guidance naming the exact sibling tools.

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

prefetch_datasheetsPrefetch DatasheetsA
Read-only
Inspect

Free. Starts background extraction for up to 20 parts at once, e.g. a BOM, so they are ready before you read them. Returns immediately with each part's status. A datasheet nobody has read before usually takes 1-3 minutes, 5 or more for a large one or a busy queue. These are estimates, not deadlines. Poll check_extraction_status (free). A part without a known datasheet comes back 'queued' while we look for its PDF, and reads 'resolving' until the search ends; only then is 'no_source' final: check the part number, or attach the PDF with request_datasheet_upload (org-private). The Free plan has a daily cap on new datasheets ('trial_limit'). MPNs or LCSC numbers only; resolve value-only BOM rows with search_parts first. Example: prefetch_datasheets(['TPS54302', 'ADS1115', 'LP5907']) datasheet_status: 'ready' → read it; 'extracting' / 'queued' / 'pending' / 'resolving' → poll check_extraction_status; 'not_extracted' → prefetch_datasheets; 'no_source' / 'unsupported' → request_datasheet_upload. Full list in the server instructions.

NameRequiredDescriptionDefault
part_numbersYes1-20 parts. Specific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1').

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint/openWorldHint/destructiveHint) by disclosing timing expectations (1-3 minutes, 5+ for large or busy queue), that these are estimates not deadlines, the Free-plan daily cap ('trial_limit'), and the meaning of each status including that 'no_source' is only final after 'resolving' ends.

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?

Front-loads the essential facts (free, up to 20 parts, returns immediately) and every sentence carries operational information. It is long and the status list partially repeats itself in the worked example, which costs it the top score.

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 no output schema, the description fully covers the return contract: it returns immediately with per-part status and maps each status value to the next action. Combined with timing, cap, and failure-path guidance, an agent has everything needed to call it 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 100%, so the parameter is already documented, but the description still adds value by reinforcing 'MPNs or LCSC numbers only' and directing agents to resolve value-only BOM rows with search_parts first. That cross-tool guidance exceeds the schema's own note about not passing values.

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?

Opens with a specific verb and resource ('Starts background extraction for up to 20 parts at once') plus the key behavioral fact that it returns immediately. It clearly separates itself from siblings by naming check_extraction_status for polling and read_datasheet for the actual read.

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?

Gives explicit routing: poll check_extraction_status after prefetching, resolve value-only BOM rows with search_parts first, and use request_datasheet_upload when a part is 'no_source'. It also states the accepted identifier types (MPNs or LCSC numbers only), leaving little to inference.

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

read_datasheetRead DatasheetA
Read-only
Inspect

Costs 2¢ per call. Reads a part's datasheet. Section mode (default): start with section='summary' for an overview and available_sections, then ask for any section by name; names come from the datasheet's own headings (e.g. 'register_map', 'i2c_interface'); an unknown name returns the nearest section names and pages. Use max_chars and the returned next_offset to continue a long read. Search mode (mode='search' with a query): semantic search within this datasheet, for targeted questions such as a register bit field or an I2C address. Prefer specific sections to section='all', which can fill your context. The first read of a new part starts extraction and returns status='extracting' (not charged). A datasheet nobody has read before usually takes 1-3 minutes, 5 or more for a large one or a busy queue. These are estimates, not deadlines. For microcontrollers, register-level programming detail usually lives in a separate reference manual, not the datasheet; available_sections shows what is present. datasheet_status: 'ready' → read it; 'extracting' / 'queued' / 'pending' / 'resolving' → poll check_extraction_status; 'not_extracted' → prefetch_datasheets; 'no_source' / 'unsupported' → request_datasheet_upload. Full list in the server instructions.

NameRequiredDescriptionDefault
modeNo'section' (default) returns a named section, 'search' does semantic searchsection
limitNoMax search results in search mode (default 3). Each result includes adjacent context chunks.
queryNoSearch query; required when mode='search', ignored otherwise. Example: 'charge voltage register', 'I2C address'.
offsetNoContinue a section using next_offset from the previous read.
sectionNoSection name for section mode. Start with 'summary' to discover available sections. Common: summary, pinout, electrical, abs_max, register_map, timing, package. Any heading in the datasheet works (slugified).summary
max_charsNoText budget; a whole sentence or table row may exceed it.
part_numberYesSpecific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1').

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare read-only/non-destructive, but the description adds substantial behavioral context beyond them: a 2¢ per-call cost, that the first read triggers extraction and is not charged, 1-3 minute (or longer) extraction estimates flagged as estimates not deadlines, and the context-filling risk of section='all'. This is genuine disclosure an agent needs to plan around.

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 but front-loaded with the cost and the core read behavior before the mode details and status routing. Nearly every sentence carries actionable information, though the status→tool mapping could be compressed since it overlaps with server instructions.

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 7-parameter read tool with no output schema, the description covers return-relevant signals (available_sections, next_offset, status='extracting'), continuation mechanics, cost, and failure routing. 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?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: section names come from the datasheet's own slugified headings, an unknown name returns nearest section names and pages, next_offset drives continuation, and query is only meaningful with mode='search'. This goes beyond the schema's field-level 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 and resource ('Reads a part's datasheet') and immediately distinguishes two operating modes (section vs search). An agent can tell this apart from siblings like search_datasheets or get_part_details 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 routes the agent: start with section='summary', use section mode for named sections, search mode for targeted questions, prefer specific sections over 'all'. It also maps every datasheet_status value to a concrete next tool (check_extraction_status, prefetch_datasheets, request_datasheet_upload), which is textbook when/when-not guidance.

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

request_datasheet_uploadRequest Datasheet UploadAInspect

Free. The upload fee is charged by confirm_datasheet_upload, after the file is checked. Gives a signed URL to upload a datasheet PDF we don't have: use it when datasheet_status is 'no_source' (once the search has finished: not while it is 'resolving') or 'unsupported'. Three steps:

  1. Call this with the MPN, the file's SHA-256 and its byte size; you get upload_url, upload_method ('PUT'), upload_headers and an upload_token.

  2. Upload the bytes: curl -X PUT -H 'Content-Type: application/pdf' --data-binary @file.pdf "$UPLOAD_URL" (plus any upload_headers).

  3. Call confirm_datasheet_upload with the upload_token. Checked at confirm (nothing charged if a check fails): a parseable PDF, the SHA-256 and size you declared, and the MPN or its stem on the first page (scanned image-only PDFs fail this). Max 50 MB; the part's datasheet, not a dev-kit manual, schematic or app note. Uploaded datasheets are private to your organisation. Tokens expire after 15 minutes; request a new one if needed.

NameRequiredDescriptionDefault
size_bytesYesSize of the PDF in bytes (1,024 to 50,000,000).
part_numberYesMPN the PDF belongs to. Not a value or description.
manufacturerNoOptional manufacturer name (e.g. 'Texas Instruments') when the MPN alone is ambiguous.
expected_sha256YesLowercase hex SHA-256 of the PDF bytes (64 chars), e.g. from `shasum -a 256 file.pdf`.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare it is a write with no destruction; the description adds substantial non-obvious behavior: it is free but the fee is charged at confirm, validation rules (parseable PDF, declared hash/size, MPN on first page, image-only PDFs fail), 50 MB limit, org-private results, and 15-minute token expiry.

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?

Front-loaded with the key cost fact ('Free.') and organized as a numbered three-step flow, so structure is strong. It is long and slightly repetitive (fee and checks restated), which keeps it from a 5, but almost every sentence carries actionable information.

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?

There is no output schema, yet the description enumerates the returned fields (upload_url, upload_method, upload_headers, upload_token) and the full two-step follow-through, so an agent has everything needed to complete the workflow.

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 already 100%, so the baseline is 3, but the description adds real meaning by explaining what the SHA-256 and byte size are checked against at confirm time and by clarifying the MPN-or-stem matching rule on page one. It does not add syntactic detail beyond the schema's examples.

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: obtaining a signed URL to upload a datasheet PDF. It clearly distinguishes itself from siblings by naming confirm_datasheet_upload as the follow-up and by scoping to cases where the datasheet is absent.

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?

Gives explicit trigger conditions (datasheet_status 'no_source' after search completes, or 'unsupported'), an explicit exclusion (not while 'resolving'), and routes the agent to confirm_datasheet_upload as the required next step. Nothing is left to inference.

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

search_datasheetsSearch DatasheetsA
Read-onlyIdempotent
Inspect

Costs 2¢ per call. Semantic search across every datasheet already extracted (not every part that exists), for spec-based discovery such as 'low-noise LDO with PSRR above 70dB'. Returns matching chunks with part_number and a 0-100 relevance_score. To find a specific part by number, use search_parts.

NameRequiredDescriptionDefault
limitNoMax results (default 3)
queryYesNatural language search query
section_typeNoOptional: limit search to a specific section typeall

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint, non-destructive), but the description adds genuinely new operational facts: a 2¢ per-call cost and the shape of the return ('matching chunks with part_number and a 0-100 relevance_score'). It does not discuss empty-result behavior or how limit affects result quality, which keeps 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?

Four short sentences, all front-loaded: cost first, then scope, then return shape, then the alternative. Every sentence carries a distinct fact and none restates the name or 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?

There is no output schema, yet the description still supplies the return shape and relevance scale, plus corpus scope, cost, and the disambiguation rule. An agent has everything needed to decide between this and search_parts and to interpret the response.

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 100%, so the baseline is 3, but the description adds real meaning for the required query parameter by showing the expected style (spec-based natural-language phrase rather than a part number). The limit and section_type parameters are left 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?

States a specific verb (semantic search) and resource (extracted datasheets) and immediately bounds the corpus with 'not every part that exists'. It also names the sibling it is not: search_parts for lookup by part number, so an agent can distinguish it 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?

Gives the positive trigger with a concrete example ('low-noise LDO with PSRR above 70dB') and an explicit when-not rule routing part-number lookups to search_parts. Both the condition and the alternative are 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.

search_partsSearch PartsA
Read-onlyIdempotent
Inspect

Free. Start here. Searches components by part number or keyword (e.g. 'STM32F103', 'buck converter 3A') across JLCPCB, Mouser and DigiKey in parallel. Results are merged by MPN with indicative price and stock per source and a datasheet_status. For an MPN query, eval boards and dev kits come back separately as related_kits. Parts in your organisation's private library whose MPN, manufacturer, description, type, category or tag matches are appended with source='private_library' and their tags. For spec-based discovery in plain language, use search_datasheets. datasheet_status: 'ready' → read it; 'extracting' / 'queued' / 'pending' / 'resolving' → poll check_extraction_status; 'not_extracted' → prefetch_datasheets; 'no_source' / 'unsupported' → request_datasheet_upload. Full list in the server instructions.

NameRequiredDescriptionDefault
limitNoMax results per provider (default 20). With providers='all' the total can be up to 3× this.
queryYesSearch query (part number or keyword)
providersNoWhich providers to query (default 'all').all

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover safety (readOnly, idempotent, openWorld, non-destructive), but the description adds substantial behavior the annotations cannot: queries run in parallel across three providers, results are merged by MPN, eval boards/kits are split out as related_kits for MPN queries, and private-library matches are appended with source='private_library'. That is exactly the kind of pre-call context an agent needs.

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?

Front-loaded with the cheapest signal ('Free. Start here.') and then builds from core behavior to return shape to routing. The datasheet_status mapping is dense but each mapping earns its place; the trailing 'Full list in the server instructions' is the only mild redundancy.

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?

There is no output schema, and the description carries the full burden, describing merged-by-MPN results with per-source price and stock, datasheet_status, related_kits and private_library entries with tags. Combined with the status-to-tool routing table, an agent has everything needed to call it and act on the response.

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%, with limit, query and providers all documented including the 3× multiplier caveat for providers='all'. The description adds no syntax or format detail beyond that, so the baseline 3 applies; it does implicitly hint that private-library results are appended regardless of the provider selection.

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 ('Searches components by part number or keyword') plus the exact scope (JLCPCB, Mouser, DigiKey, in parallel). It explicitly contrasts itself with the closest sibling: 'For spec-based discovery in plain language, use search_datasheets,' so an agent can route 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 Guidelines5/5

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

'Free. Start here.' gives an explicit entry-point recommendation, and the description names the alternative (search_datasheets) with the condition that selects it (spec-based plain-language discovery). It further routes downstream work: poll check_extraction_status, prefetch_datasheets, request_datasheet_upload, each keyed to a concrete datasheet_status value.

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. 13 tool updatesv1.4.0
    • Changedanalyze_image1 field changed
      • changedInput schema / properties / question / description
        Previous value: -"Optional specific question about the image (e.g. 'What are the package dimensions?')"New value: +"Optional question about the image (e.g. 'What are the package dimensions?')"
    • Addedcheck_bom
    • Changedcheck_design_fit5 fields changed
      • addedInput schema / properties / derating_pct
        Added value: +{
        +  "description": "Percent below a rating a PASS must stay, for input_voltage, supply_voltage and output_current. Default 20 (run at no more than 80% of the rating). 0 turns optional derating off; no current headroom still warns.",
        +  "maximum": 50,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / efficiency
        Added value: +{
        +  "description": "Converter efficiency at this operating point, as a fraction (0.92) or a percentage (92). Lets the tool estimate a switching converter's junction temperature.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 100,
        +  "type": "number"
        +}
      • changedInput schema / properties / part_number / description
        Previous value: -"Specific manufacturer part number to validate. Not a value or description."New value: +"Specific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1')."
      • addedInput schema / properties / power_dissipation
        Added value: +{
        +  "description": "The part's own power dissipation (W), if you have worked it out (e.g. ID² × RDS(on) for a MOSFET). Used for the junction-temperature estimate.",
        +  "maximum": 1000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / supply_voltage / description
        Previous value: -"Supply voltage / VCC / VDD (V). For MOSFETs, this is VDS (drain-source voltage). NOT used for power dissipation — compared against VDS(max) only."New value: +"Supply voltage / VCC / VDD (V). For MOSFETs, VDS; compared against VDS(max) only."
    • Changedcheck_extraction_status1 field changed
      • changedInput schema / properties / part_numbers / description
        Previous value: -"1-20 MPNs to check. Must be specific manufacturer part numbers, not values or descriptions."New value: +"1-20 parts. Specific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1')."
    • Changedcompare_parts3 fields changed
      • addedInput schema / properties / compact
        Added value: +{
        +  "default": false,
        +  "description": "Return the shorter answer: per-part flags and the comparison table, without per-provider detail or summaries. Default false: the full answer.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_summaries
        Added value: +{
        +  "default": false,
        +  "description": "With compact=true, also return each part's cached datasheet summary (about 2-4k characters each). The full answer always has them.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / part_numbers / description
        Previous value: -"2-5 specific manufacturer part numbers or LCSC numbers to compare head-to-head. Must be real MPNs — the call is rejected upfront if any entry is a value, description, or reference designator."New value: +"2-5 parts. Specific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1')."
    • Changedfind_alternative4 fields changed
      • addedInput schema / properties / compact
        Added value: +{
        +  "default": false,
        +  "description": "Return the shorter answer: one short row per candidate (identity, lifecycle, stock, cheapest price, providers, match notes) and no reference-part summary. Default false: the full answer.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / constraints / description
        Previous value: -"Optional filters to narrow alternatives. 'in_stock' = only parts with non-zero stock at any provider. 'same_package' = package footprint must match (fuzzy). 'jlcpcb' = must be available at JLCPCB (useful for JLCPCB-assembled boards — also restricts the provider search to JLCPCB)."New value: +"Optional filters. 'in_stock' = known non-zero stock at some provider. 'same_package' = same footprint (fuzzy). 'jlcpcb' = orderable at JLCPCB (also limits the provider search to JLCPCB)."
      • addedInput schema / properties / include_original_summary
        Added value: +{
        +  "default": false,
        +  "description": "With compact=true, also return the reference part's cached datasheet summary (about 2-3k characters). The full answer always has it.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / part_number / description
        Previous value: -"The MPN to find alternatives for"New value: +"Specific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1')."
    • Addedfind_parts
    • Changedget_part_details5 fields changed
      • addedInput schema / properties / compact
        Added value: +{
        +  "default": false,
        +  "description": "Return the shorter answer: prose written for another part comes back as family_summary instead of a labelled datasheet_summary. Default false: the full answer.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / part_number / description
        Previous value: -"Specific manufacturer part number (MPN) or LCSC number (e.g. 'C2837938'). Not a value or description."New value: +"Specific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1')."
      • changedInput schema / properties / prefetch_datasheet / description
        Previous value: -"Trigger background datasheet extraction (no extra charge). Default false."New value: +"Start background datasheet extraction (no extra charge)."
      • changedInput schema / properties / provider / description
        Previous value: -"Which provider to query: 'all' (default), 'jlcpcb', 'mouser', or 'digikey'"New value: +"Which provider's sources to show (default 'all')."
      • addedInput schema / properties / verbose
        Added value: +{
        +  "default": false,
        +  "description": "Return every available_sections entry. By default the first 50 are returned, plus a '_truncated' entry saying how many more exist.",
        +  "type": "boolean"
        +}
    • Changedprefetch_datasheets1 field changed
      • changedInput schema / properties / part_numbers / description
        Previous value: -"List of MPNs to prefetch (max 20). Must be specific manufacturer part numbers, not values or descriptions."New value: +"1-20 parts. Specific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1')."
    • Changedread_datasheet7 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -10New value: +3
      • changedInput schema / properties / limit / description
        Previous value: -"Max search results for search mode (default 10). Each result includes adjacent context chunks for continuity."New value: +"Max search results in search mode (default 3). Each result includes adjacent context chunks."
      • addedInput schema / properties / max_chars
        Added value: +{
        +  "description": "Text budget; a whole sentence or table row may exceed it.",
        +  "maximum": 60000,
        +  "minimum": 500,
        +  "type": "integer"
        +}
      • changedInput schema / properties / mode / description
        Previous value: -"Reading mode: 'section' (default) returns a named section, 'search' does semantic search"New value: +"'section' (default) returns a named section, 'search' does semantic search"
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Continue a section using next_offset from the previous read.",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / part_number / description
        Previous value: -"Specific manufacturer part number (MPN) or LCSC number. Not a value or description."New value: +"Specific manufacturer part number (MPN) or LCSC number (e.g. 'TPS54302DDCR', 'C2837938'). Not a value ('100nF'), description or reference designator ('R1')."
      • changedInput schema / properties / query / description
        Previous value: -"Search query — REQUIRED when mode='search', ignored when mode='section'. Example: 'charge voltage register', 'I2C address'."New value: +"Search query; required when mode='search', ignored otherwise. Example: 'charge voltage register', 'I2C address'."
    • Changedrequest_datasheet_upload4 fields changed
      • changedInput schema / properties / expected_sha256 / description
        Previous value: -"Lowercase hex SHA-256 of the PDF bytes (64 chars). Used both as the storage key (content-addressed) and to detect tampering. Compute with `shasum -a 256 file.pdf`."New value: +"Lowercase hex SHA-256 of the PDF bytes (64 chars), e.g. from `shasum -a 256 file.pdf`."
      • changedInput schema / properties / manufacturer / description
        Previous value: -"Optional. Manufacturer name (e.g. 'Texas Instruments') if the MPN alone doesn't disambiguate."New value: +"Optional manufacturer name (e.g. 'Texas Instruments') when the MPN alone is ambiguous."
      • changedInput schema / properties / part_number / description
        Previous value: -"Manufacturer part number the PDF belongs to. Must be a real MPN, not a value or description."New value: +"MPN the PDF belongs to. Not a value or description."
      • changedInput schema / properties / size_bytes / description
        Previous value: -"Size of the PDF in bytes. Must be ≤ 50_000_000 (50MB) and > 1024."New value: +"Size of the PDF in bytes (1,024 to 50,000,000)."
    • Changedsearch_datasheets2 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -15New value: +3
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (default 15)"New value: +"Max results (default 3)"
    • Changedsearch_parts2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per provider (default 20). With providers='all', total results can be up to 3× this value (one set per provider)."New value: +"Max results per provider (default 20). With providers='all' the total can be up to 3× this."
      • changedInput schema / properties / providers / description
        Previous value: -"Which providers to query: 'all' (default), 'jlcpcb', 'mouser', or 'digikey'"New value: +"Which providers to query (default 'all')."
  2. 9 tool updatesv1.3.2
    • Changedcheck_design_fit18 fields changed
      • changedInput schema / properties / ambient_temp / description
        Previous value: -"Ambient temperature (C)"New value: +"Ambient temperature TA (°C)."
      • addedInput schema / properties / ambient_temp / maximum
        Added value: +200
      • addedInput schema / properties / ambient_temp / minimum
        Added value: +-65
      • changedInput schema / properties / input_voltage / description
        Previous value: -"Input voltage (V)"New value: +"Input voltage / VIN (V). For converters."
      • addedInput schema / properties / input_voltage / maximum
        Added value: +1500
      • addedInput schema / properties / input_voltage / minimum
        Added value: +0
      • changedInput schema / properties / output_current / description
        Previous value: -"Output current (A)"New value: +"Output current / IOUT (A). For MOSFETs, this is drain current ID."
      • addedInput schema / properties / output_current / maximum
        Added value: +500
      • addedInput schema / properties / output_current / minimum
        Added value: +0
      • changedInput schema / properties / output_voltage / description
        Previous value: -"Output voltage (V)"New value: +"Output voltage / VOUT (V). For converters/LDOs."
      • addedInput schema / properties / output_voltage / maximum
        Added value: +1500
      • addedInput schema / properties / output_voltage / minimum
        Added value: +0
      • changedInput schema / properties / supply_voltage / description
        Previous value: -"Supply voltage (V)"New value: +"Supply voltage / VCC / VDD (V). For MOSFETs, this is VDS (drain-source voltage). NOT used for power dissipation — compared against VDS(max) only."
      • addedInput schema / properties / supply_voltage / maximum
        Added value: +1500
      • addedInput schema / properties / supply_voltage / minimum
        Added value: +0
      • changedInput schema / properties / switching_frequency / description
        Previous value: -"Switching frequency (kHz)"New value: +"Switching frequency FSW (kHz). For converters."
      • addedInput schema / properties / switching_frequency / maximum
        Added value: +10000000
      • addedInput schema / properties / switching_frequency / minimum
        Added value: +0
    • Changedcheck_extraction_status1 field changed
      • changedInput schema / properties / part_numbers / description
        Previous value: -"List of MPNs to check (max 20)"New value: +"1-20 MPNs to check. Must be specific manufacturer part numbers, not values or descriptions."
    • Changedcompare_parts1 field changed
      • changedInput schema / properties / part_numbers / description
        Previous value: -"List of 2-5 specific manufacturer part numbers to compare. Not values or descriptions."New value: +"2-5 specific manufacturer part numbers or LCSC numbers to compare head-to-head. Must be real MPNs — the call is rejected upfront if any entry is a value, description, or reference designator."
    • Addedconfirm_datasheet_upload
    • Changedfind_alternative6 fields changed
      • changedInput schema / properties / constraints / default
        Previous value: -""New value: +[]
      • changedInput schema / properties / constraints / description
        Previous value: -"Optional constraints: 'in_stock' (only parts in stock), 'same_package' (must match package), 'jlcpcb' (available at JLCPCB). Comma-separated."New value: +"Optional filters to narrow alternatives. 'in_stock' = only parts with non-zero stock at any provider. 'same_package' = package footprint must match (fuzzy). 'jlcpcb' = must be available at JLCPCB (useful for JLCPCB-assembled boards — also restricts the provider search to JLCPCB)."
      • addedInput schema / properties / constraints / items
        Added value: +{
        +  "enum": [
        +    "in_stock",
        +    "same_package",
        +    "jlcpcb"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / constraints / type
        Previous value: -"string"New value: +"array"
      • changedInput schema / properties / limit / description
        Previous value: -"Max alternatives to return (default 5)"New value: +"Max alternatives to return (default 5, max 20)."
      • addedInput schema / properties / limit / maximum
        Added value: +20
    • Changedread_datasheet3 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -5New value: +10
      • changedInput schema / properties / limit / description
        Previous value: -"Max search results for search mode (default 5)"New value: +"Max search results for search mode (default 10). Each result includes adjacent context chunks for continuity."
      • changedInput schema / properties / query / description
        Previous value: -"Search query for search mode (e.g. 'charge voltage register', 'I2C address')"New value: +"Search query — REQUIRED when mode='search', ignored when mode='section'. Example: 'charge voltage register', 'I2C address'."
    • Addedrequest_datasheet_upload
    • Changedsearch_datasheets2 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -10New value: +15
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (default 10)"New value: +"Max results (default 15)"
    • Changedsearch_parts1 field changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per provider (default 20)"New value: +"Max results per provider (default 20). With providers='all', total results can be up to 3× this value (one set per provider)."
  3. 10 tool updatesv1.0.0
    • First observedanalyze_image
    • First observedcheck_design_fit
    • First observedcheck_extraction_status
    • First observedcompare_parts
    • First observedfind_alternative
    • First observedget_part_details
    • First observedprefetch_datasheets
    • First observedread_datasheet
    • First observedsearch_datasheets
    • First observedsearch_parts

TDQS

A4.5/5.0

Scored across 14 tools

Disambiguation4/5

The three search tools (search_parts, find_parts, search_datasheets) share the 'find parts' space, but the descriptions explicitly cross-reference each other and carve out distinct modes (part number/keyword vs parametric constraints vs semantic datasheet content), so misselection is unlikely. Lifecycle tools (prefetch_datasheets vs check_extraction_status vs read_datasheet) and the two-step upload pair are also clearly delineated. Only minor residual overlap between keyword search and functional search keeps it from a 5.

Naming Consistency5/5

Every tool follows a consistent snake_case verb_noun pattern (search_parts, get_part_details, read_datasheet, compare_parts, check_design_fit, analyze_image, find_alternative, request/confirm_datasheet_upload). No casing or verb-style deviations appear.

Tool Count5/5

14 tools sits squarely in the well-scoped range, and each maps to a distinct step in the component-research lifecycle (discover, extract, poll, read, compare, verify, source alternatives, upload). Nothing looks redundant or missing for the workflow size.

Completeness4/5

The surface covers discovery (three search modes), detail retrieval, datasheet reading and image analysis, comparison, design-fit checking, alternatives, BOM checking, the extraction lifecycle, and datasheet upload. Minor gaps exist (no explicit private-library listing/browsing or BOM export/order hand-off), but core CRUD/lifecycle operations for the domain are present.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables natural language search and exploration of KiCad component symbol libraries with fast full-text search across 20,000+ components including metadata like datasheets, footprints, and descriptions.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables searching for electronic components, comparing prices across distributors, checking availability, and retrieving datasheets through the Nexar/Octopart API with specialized tools for resistors, capacitors, inductors, semiconductors, crystals, and connectors.
    11
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables searching and filtering over 1.5 million electronic components across JLCPCB, Mouser, and DigiKey using parametric queries and smart parsing. It supports finding alternative parts, accessing pinout data, and downloading KiCad footprints directly through AI coding assistants.
    11
    134
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Spacecraft component specifications read from vendor datasheets (2,500+ products, 24 categories): search by engineering requirements, compare, budget mass and power, read datasheet digests and facts, find data gaps, and assemble a bus around parts you lock. Every value cites its datasheet page; missing data is named, never guessed.
    11 npm
    1
    MIT