Future Electronics MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Future Electronics MCPlook up pricing and inventory for part STM32F103C8T6"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Future Electronics MCP
An MCP server that exposes the Future Electronics Product Information API to MCP clients such as Claude Code, so an assistant can look up parts, pricing, inventory, lead times, documents, and images by manufacturer part number.
Status: Pre-release (0.1.0). Work is tracked in GitHub issues.
Pricing returned by the Future API matches the website and is not an official quote.
Upstream API
The details in this section are summarized from the official Future Electronics API documentation [1].
Search | Method | Endpoint |
Single | GET |
|
Multiple | POST |
|
Auth:
x-orbweaver-licensekeyheader. You request a key at https://www.futureelectronics.com/api-solutions.Single lookup takes
part_number(3 or more alphanumeric characters) andlookup_type(default,exact,contains, orstarts_with).Batch lookup takes
{"parts": [...]}and runs an exact match on each part. The API allows up to 300 parts per request.Errors: 400 (bad part number or lookup type), 401 (invalid key), 402 (purchase required), 403 (not authorized), 406 (key expired), and 429 (rate limited).
Related MCP server: DigiKey MCP Server
Install
You need Node.js 22.12 or later and a Future Electronics license key (see References).
Claude Code (recommended)
Run these two commands inside Claude Code:
/plugin marketplace add Reid-n0rc/future-electronics-mcp
/plugin install future-electronics@future-electronics-mcpClaude Code asks for your Future Electronics API key during the install
(when the plugin is enabled).
The input is masked, and Claude Code keeps the key in its secure storage (the
OS keychain or credential store), never in a settings file or in this repo.
The plugin passes it to the server as FUTURE_API_KEY. No clone, build, or
npm install is needed: the plugin runs the self-contained bundle
server/future-electronics-mcp.mjs with your node.
The marketplace installs from the master branch, so you get released code
only. To pick up a new release, run
/plugin marketplace update future-electronics-mcp.
Developer install (from a clone)
For development, or for MCP clients other than Claude Code, build from a clone:
git clone https://github.com/Reid-n0rc/future-electronics-mcp.git
cd future-electronics-mcp
npm ci
npm run build # produces dist/index.jsTo load your working copy as a plugin, run
claude --plugin-dir /path/to/future-electronics-mcp. Claude Code then asks
for the key the same way as a marketplace install. The plugin runs the
committed bundle, so run npm run bundle after changing src/.
Or register the built server directly with claude mcp add:
claude mcp add future-electronics --scope user \
-e FUTURE_API_KEY="$FUTURE_API_KEY" \
-- node /path/to/future-electronics-mcp/dist/index.jsYour shell expands $FUTURE_API_KEY, so this copies the key's value into your
Claude Code user config (~/.claude.json, outside this repo). If you would
rather not store it there, use the plugin install. For other MCP clients, run
node /path/to/future-electronics-mcp/dist/index.js over stdio with
FUTURE_API_KEY in its environment.
Check the connection with claude mcp list, or /mcp inside Claude Code.
Claude Desktop
Claude Desktop installs the server in one click from an MCP Bundle
(.mcpb). It needs no clone, no build, and no separate Node.js install,
because Claude Desktop ships its own Node.js runtime.
Download
future-electronics-mcp.mcpbfrom the latest release.Double-click the file, or drag it onto Claude Desktop (you can also use Settings → Extensions). Claude Desktop shows an install dialog.
Click Install, then enter your Future Electronics API key when asked. Claude Desktop stores the key in its secure storage and passes it to the server as
FUTURE_API_KEY. The key is never written to the bundle or to this repo.
To change the key later, open Settings → Extensions → Future Electronics
Part Lookup. To build the bundle yourself, run npm ci && npm run pack:mcpb.
That writes build/future-electronics-mcp.mcpb.
Configuration
Variable | Required | Purpose |
| Yes, for lookups | License key, sent as the |
| No | Override the API origin (default |
| No | Most requests in flight to the Future API at once, across all tool calls. Integer 1–32, default |
| No | Minimum gap between request starts, in ms. Integer 0–60000, default |
| No | Absolute path of the workspace folder for BOM files and exports. |
| No | Most tokens one tool result may use, estimated as characters / 4. Integer 1000–100000, default |
The server starts without a key. The key is read the first time a tool is
called, and a missing key fails only that call, with a clear error. With the
plugin install, Claude Code sets FUTURE_API_KEY from the key you entered at
install. Otherwise, keep the key in your environment or a secret manager (for
example 1Password); never put it in a committed file.
Future Electronics publishes no numeric rate limit; its docs only say that a
429 Too Many Requests means "please wait and try again". The server therefore
caps parallel requests (FUTURE_MAX_CONCURRENCY) and does not pace them by
default. After a 429, it pauses every new request, server-wide, for the
Retry-After period (seconds or an HTTP date) or the backoff delay. Requests
already in flight finish normally. Invalid values for either setting fail the
first tool call with a clear error.
Workspace folder
The server reads BOM files from, and writes exports to, one workspace folder. That lets file-based BOM workflows run in Claude Desktop without a separate filesystem connector.
Default:
~/Documents/Future Electronics MCP, or~/Future Electronics MCPif you have no Documents folder.Change it: in Claude Desktop, open Settings → Extensions → Future Electronics Part Lookup and pick a folder. With the Claude Code plugin, set the optional Workspace folder option (leave it blank for the default). Anywhere else, set
FUTURE_WORKSPACE_DIRto an absolute path.The folder is created, readable only by you (mode
0700), the first time something is saved there. The server never creates it at startup.The server only reads and writes inside this folder. It rejects
..paths, absolute paths elsewhere, and symlinks that lead outside it.
MCP tools
All tools are read-only. future_list_bom_files is described under
BOM files. Every summary carries a note saying that pricing is
not an official quote.
Output budget
Tool results are compact JSON (no whitespace), and no result is longer than
FUTURE_MAX_OUTPUT_TOKENS (default 8000 tokens, estimated as characters / 4).
When a result would be longer, rows are dropped from the end of its lists
(offers, the issues or parts table rows, or raw batches) and a
truncated: {omitted, hint} field says how many were dropped. Nothing is ever
cut silently. If even the result without those lists is too long, the tool
returns {error: "output_budget_exceeded", message} with isError: true
instead of partial JSON.
future_lookup_part
Look up one part by manufacturer part number (GET /lookup).
Input | Type | Default | Limits and notes |
| string | required | At least 3 alphanumeric characters (punctuation allowed but not counted). |
| enum |
|
|
| integer | none | Positive. Adds |
| integer |
| 1 to 50. Offers beyond this are dropped; |
| boolean |
| Return the untouched upstream response (offers still truncated to |
Output (subject to the output budget, which drops
offers from the end): lookup_value, lookup_results, note, total_offers,
quantity (when given), and offers[]. Each offer can have mpn,
seller_part_number, web_url, quantity_available, quantity_on_order,
quantity_minimum, order_mult_qty, lead_time (for example "12 Weeks",
or "CALL"), currency_code, pricing_type, price_breaks[]
({from, to?, unit_price}, sorted by from), package_type, mpq, rohs,
date_code, datasheet_url, and price_at_quantity. Fields missing upstream
are omitted. price_at_quantity is either {price_break: {...}} or
{price_break: null, reason}, where reason is below_minimum (with
quantity_minimum), no_pricing, or no_matching_break.
Example, from the synthetic test fixture (part_number: "TEST-1234",
quantity: 5000, max_offers: 1), pretty-printed here:
{
"lookup_value": "TEST-1234",
"lookup_results": "2 Offers found",
"note": "Pricing is not an official quote. Confirm price and availability with Future Electronics before ordering.",
"total_offers": 2,
"offers": [
{
"mpn": "TEST-1234",
"seller_part_number": "9999999",
"web_url": "https://example.com/p/9999999",
"quantity_available": 12000,
"quantity_on_order": 5000,
"quantity_minimum": 1000,
"order_mult_qty": 1000,
"lead_time": "12 Weeks",
"currency_code": "USD",
"pricing_type": "Preferred",
"price_breaks": [
{ "from": 1000, "to": 4999, "unit_price": 0.42 },
{ "from": 5000, "unit_price": 0.37 }
],
"package_type": "REEL",
"mpq": "1000",
"rohs": "Y",
"datasheet_url": "https://example.com/docs/test-1234.pdf",
"price_at_quantity": { "price_break": { "from": 5000, "unit_price": 0.37 } }
}
],
"quantity": 5000
}future_lookup_parts
Look up many parts at once, for example a BOM (POST /batch/lookup, exact
match).
Input | Type | Default | Limits and notes |
| array | one of | 1 to 2000 items. Each is a string ( |
| object | one of | Read the parts from a CSV/TSV file in the workspace folder instead. See BOM files. |
| enum |
|
|
| boolean |
| Return the untouched upstream batch responses instead of the summary. Far larger, so the budget usually drops whole batches. |
Behavior:
Part numbers are trimmed and deduplicated case-insensitively. The first spelling wins, and the quantities of duplicates are summed. Parts with no quantity are priced at quantity 1.
Parts with fewer than 3 alphanumeric characters are reported as
errorand never sent.The rest are sent in batches of up to 300. Up to
FUTURE_MAX_CONCURRENCYbatches (default 4) run in parallel, started in input order; the output order never depends on which batch finishes first. A failed batch marks only its own parts aserror; the other batches still run.If a batch still gets HTTP 429 after the client's retries, the lookup stops early: no new batch starts, batches already running finish and are reported normally, and the parts of batches never started get status
not_attempted.totals.rate_limitedis thentrue, andnot_attempted_notesays to retry those parts later.The call is flagged as an error only when nothing succeeded (every batch failed or was not attempted, or every part was invalid).
Output is problems-first, so its size grows with the number of problems, not with the size of the BOM. Each part is judged on its best offer (the one with the most stock) at its quantity (1 when none was given):
result_id: the id of the full stored result. Pass it tofuture_query_resultsto read any other rows or columns without calling the API again.noteandtotals:requested,unique,found,not_found,errors,not_attempted,short_stock,below_moq,call_for_leadtime,batches, andrate_limited.extended_cost: quantity × the unit price of the applicable price break, summed over found parts, per currency code (for example{"USD": 1234.5, "EUR": 80}), rounded to cents.unpriced: found parts with no applicable price break (for example below the first break), left out ofextended_cost.max_lead_time: the longest lead time among found parts, as reported ("CALL"lead times are counted incall_for_leadtimeinstead).issues: a table,{columns, rows}, of only the parts with problems, in input order. Columns:part_number,status,reason,quantity,available,lead_time. Parts with no problem appear only in the counts.
Problem reasons (a part can have several, joined by ; in reason):
Reason | When |
|
|
| A given quantity < the offer's |
| The factory lead time is |
| No offer for the part. |
| The part was invalid, or its batch failed. |
| Its batch never started because of the rate limit. |
With detail: "all" the issues table is replaced by a parts table with a
row for every part: part_number, mpn, status, reason (empty when
none), quantity, available, moq, lead_time, currency, and
unit_price (null when no price break applies). Long tables are cut by the
output budget, with a truncated note.
With raw: true the output is result_id, note, totals, batches[] in input order
(each {part_numbers, response}, {part_numbers, error}, or
{part_numbers, not_attempted: true, error} for a batch skipped after a rate
limit), and invalid_parts[] when any were rejected. A 300-part raw batch is
far larger than the default budget, so raw output is only practical for a
small batch.
Example, from the synthetic batch fixture (parts: ["TEST-0000", {"part_number": "TEST-5678", "quantity": 500}]), pretty-printed here:
{
"result_id": "3f0c2a9e-5b7d-4c1e-9a8f-2d6b1e4c7a90",
"note": "Pricing is not an official quote. Confirm price and availability with Future Electronics before ordering.",
"totals": {
"requested": 2, "unique": 2, "found": 1, "not_found": 1, "errors": 0,
"not_attempted": 0, "short_stock": 1, "below_moq": 0, "call_for_leadtime": 0,
"batches": 1, "rate_limited": false
},
"extended_cost": { "EUR": 45 },
"unpriced": 0,
"max_lead_time": "8 Weeks",
"issues": {
"columns": ["part_number", "status", "reason", "quantity", "available", "lead_time"],
"rows": [
["TEST-0000", "not_found", "not_found", 1, null, null],
["TEST-5678", "found", "short_stock", 500, 250, "8 Weeks"]
]
}
}BOM files
Instead of listing thousands of part numbers in the tool call, save the BOM
as a .csv or .tsv file in the workspace folder and
name it:
Claude Desktop: save
bom.csvin the workspace folder (by defaultDocuments/Future Electronics MCP), then ask "look up bom.csv". No filesystem connector is needed.Claude Code: copy the file into the workspace folder the same way, then ask "look up bom.csv".
The model can call future_list_bom_files to see the files there. It takes no
input and returns a files table with name, size_bytes and modified
(ISO 8601).
bom_file fields:
Field | Default | Notes |
| required | File name in the workspace folder (a subfolder path is fine). |
| auto-detect | Header name (case-insensitive) or 1-based column number. |
| auto-detect | Header name or 1-based column number. |
|
| Without a header, the part number is column 1 and there is no quantity unless |
| auto-detect |
|
Column detection compares headers ignoring case and extra spaces:
Part number:
mpn,manufacturer part number,part number,part_number,mfr part,pnQuantity:
qty,quantity,quantity per,count
If no part column matches, or more than one header matches either list, the
call fails with a message listing the headers it found; name the column with
part_column or quantity_column. With no quantity column, parts are priced
at quantity 1.
Reading rules: files must be UTF-8 (a byte-order mark is fine) and at most
5 MB. Quoted fields, "" escapes, delimiters and line breaks inside quotes,
and CRLF line ends are all handled (RFC 4180). Blank rows are ignored. Rows
with an empty part number are skipped and counted. A quantity must be empty or
a whole number from 1 to 1,000,000,000 (100.00 is fine); any other value
fails the call, naming the rows. The 2000-part limit applies after
duplicates are merged. Errors name the file only as you gave it, never the
workspace path.
The result also carries source: {file, rows_read, rows_skipped, part_column, quantity_column} so you can check how the file was read.
future_query_results
Read any part of a stored future_lookup_parts result by its result_id,
without calling the Future API. Use it to page through every part, pull
extra columns, or filter a BOM instead of re-running the lookup.
Input | Type | Default | Limits and notes |
| string | required | From a |
| string[] | none | Keep parts with any of: |
| number | none | Keep parts whose lead time is at least this many weeks. |
| boolean | none |
|
| boolean | none |
|
| string[] | none | Keep these part numbers (case-insensitive). |
| string[] | all | Columns to return, in order: |
| integer |
| Matching rows to skip. |
| integer |
| 1 to 500 rows. |
Filters combine with AND. The output is result_id, note,
total_matching (after filters, before paging), offset, next_offset
(null on the last page), and a {columns, rows} table in input order. It is
capped by the output budget; when rows are dropped,
truncated says so and next_offset points at the first dropped row.
Results live in memory only, never on disk. Each expires 60 minutes after
it was last stored or queried, at most 20 are kept (the least recently used is
evicted first), and all are lost when the server restarts. An unknown or
expired result_id returns an isError result saying to run
future_lookup_parts again. The id is a random UUID.
Errors
Tool errors come back as MCP results with isError: true and a message that
never contains the key. For HTTP errors, the API's own message is appended
when it sends one.
Cause | Message starts with |
|
|
Part number too short |
|
Bad |
|
HTTP 400 |
|
HTTP 401 |
|
HTTP 402 |
|
HTTP 403 |
|
HTTP 406 |
|
HTTP 429 |
|
Other HTTP status |
|
No response in 30 s |
|
Connection failure |
|
Unexpected response body |
|
Troubleshooting
FUTURE_API_KEY is not set. The server started, but the key did not reach it. For the plugin, make sure you entered a key at the install prompt, then restart Claude Code. Forclaude mcp add, remove and re-add the server with-e FUTURE_API_KEY=…(claude mcp get future-electronicsshows what is configured).401 (invalid key) or 406 (expired key). Check for a typo, stray quotes, or whitespace in the key. An expired key has to be replaced: request a new one from Future Electronics, update your environment or secret manager, and restart Claude Code.
402 (purchase required) or 403 (not authorized). The key is valid but your account does not include this request. Contact Future Electronics about your API access; changing the key's format won't help.
429 (rate limited). The client already retries twice, honoring
Retry-After(capped at 30 s) or backing off exponentially. If you still get 429, wait before retrying and send fewer calls.future_lookup_partsstops starting new batches after such a 429 and marks the restnot_attempted; retry just those parts later. Prefer one large call over many small ones. If 429s keep happening, lowerFUTURE_MAX_CONCURRENCY(for example to1or2) or setFUTURE_MIN_REQUEST_INTERVAL_MS(for example500) to space requests out, then restart the server.The server doesn't start, or
dist/index.jsis not found. Runnpm ci && npm run buildin the clone, and checknode --versionis 22.12 or later.
Live check (opt-in)
npm run live-check makes one real exact lookup of part 292230-6 and prints
the summarized result. It reads FUTURE_API_KEY from the environment, never
prints it, and exits non-zero with a clear message when the key is missing or
the call fails. It is not part of npm test.
FUTURE_API_KEY="…" npm run live-checkGitHub Actions also runs it as the live-check job, but only for releases:
Release PRs (
dev→master) from this repo, inci.yml. It is a required check, so a release PR cannot merge until it passes. PRs intodevand fork PRs skip it.Published releases, in
release.yml. The.mcpbis attached only after the check passes against the tagged commit.Manual runs, by dispatching the
CIworkflow.
The key comes from the FUTURE_API_KEY secret of the live-api GitHub
Environment, which requires the maintainer's approval for each run. It is not a
repository secret, so no other job can read it.
Development
The stack is TypeScript, Node.js 22.12 or later, @modelcontextprotocol/sdk, zod, and vitest.
npm install
npm run build
npm testWorkflow
masterholds releases only. It changes only through pull requests fromdev.devis the integration branch. It changes only through pull requests.PRs from anyone other than an admin need approval from the maintainer or another admin (a code owner) before they merge.
Every piece of work has a GitHub issue. Anyone can file a bug report or feature request without a plan, but before work starts the issue needs a software plan, and the maintainer must approve it.
Every issue gets its own branch cut from
dev, namedissue-<number>-<short-slug>.Every function has thorough tests. Every code change runs regression tests, and a release ships only after the full regression suite passes.
See AGENTS.md for the full process and SECURITY.md for key handling.
References
Future Electronics. Future Electronics API's (Postman API documentation). https://documenter.getpostman.com/view/18706946/UzBvFhcj. Accessed 2026-09-29.
Future Electronics. API Solutions (API key requests). https://www.futureelectronics.com/api-solutions.
Disclaimer
This is an unofficial, community project. It is not affiliated with, endorsed by, or supported by Future Electronics. "Future Electronics" is used only to identify the API this server connects to, and any trademarks belong to their owners. API behavior, endpoints, and field definitions are summarized from the documentation cited above. If anything here conflicts with that documentation, the documentation is authoritative. Pricing returned by the API is not an official quote.
License
Copyright (C) 2026 Reid Crowe
Licensed under the GNU Affero General Public License v3.0 or later
(AGPL-3.0-or-later). If you run a modified version of this server and let
users interact with it over a network, you must make your modified source
available to those users.
Available Tools
2 toolsfuture_lookup_partFuture Electronics part lookupARead-only
Look up one electronic component in the Future Electronics catalog by manufacturer part number (MPN). Returns a compact JSON summary: lookup_value, lookup_results, total_offers (offers found before truncation), and up to max_offers offers. Each offer lists MPN, Future part number, product URL, stock (quantity_available, quantity_on_order), minimum and order multiple, lead time, currency, price breaks, package type, MPQ, RoHS, date code, and datasheet URL when known. When quantity is given, each offer also has price_at_quantity: the price break that applies to that quantity, or a reason there is none (below_minimum, no_pricing, no_matching_break). Pricing matches the Future website and is NOT an official quote: Pricing is not an official quote. Confirm price and availability with Future Electronics before ordering. lookup_type defaults to exact, which matches the full part number. Use starts_with when you know only the beginning of the MPN (for example a base part without its packaging or temperature suffix), and contains when you know a fragment from the middle. Those return more, less precise offers, so check the mpn of each result. Set raw to true only when you need upstream fields the summary omits; it returns the untouched API response (offers still truncated to max_offers) and ignores quantity. Output is compact JSON capped at FUTURE_MAX_OUTPUT_TOKENS: if offers must be dropped to fit, the last ones go and truncated {omitted, hint} says how many. For many parts at once, use future_lookup_parts instead.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Return the untouched upstream response instead of the summary. | |
| quantity | No | Optional order quantity; reports the applicable price break per offer. | |
| max_offers | No | Maximum offers to return, 1-50 (default 10). | |
| lookup_type | No | Match mode: exact (default), starts_with, contains, or default (the API's own default). | exact |
| part_number | Yes | Manufacturer part number, at least 3 alphanumeric characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover read-only/open-world, and the description adds real behavioral context beyond them: the truncation behavior (last offers dropped, truncated {omitted, hint}), the FUTURE_MAX_OUTPUT_TOKENS cap, the exact return shape, and the critical caveat that pricing is not an official quote and must be confirmed before ordering. It also notes raw ignores quantity. Slight deduction only for not restating auth/rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then proceeds through return shape, pricing caveat, lookup modes, raw behavior, and truncation in a logical order. Dense but each clause carries information; the repetition of 'Pricing is not an official quote' is the only minor waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with no output schema, the description supplies everything an agent needs: the return structure, field-level offer contents, pricing caveat, lookup-mode semantics, raw-mode tradeoffs, and truncation signaling. No meaningful gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaning the schema does not: what price_at_quantity contains and its failure reasons (below_minimum, no_pricing, no_matching_break), the practical distinction between starts_with and contains, and the fact that raw ignores quantity. That is genuine value on top of the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (look up) and resource (one electronic component in the Future Electronics catalog), names the required key (MPN), and explicitly distinguishes from the sibling: 'For many parts at once, use future_lookup_parts instead.' An agent can pick this versus the batch tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use for each lookup_type (exact for full MPN, starts_with for known prefixes, contains for middle fragments), plus the warning that those return 'more, less precise offers, so check the mpn of each result.' Also scopes raw to true 'only when you need upstream fields the summary omits' and routes multi-part queries to the sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
future_lookup_partsFuture Electronics BOM lookupARead-only
Look up many Future Electronics parts at once, e.g. a whole bill of materials (BOM). Accepts up to 2000 part numbers, each optionally with a quantity. Part numbers are trimmed and de-duplicated case-insensitively (quantities of duplicates are summed), then sent in batches of 300, several batches in parallel. Each part is judged on its best offer (the most stock) at the requested quantity (1 when none is given). By default it returns exceptions and totals, not every part: totals (requested, unique, found, not_found, errors, not_attempted, short_stock, below_moq, call_for_leadtime, batches, rate_limited), extended_cost (quantity x applicable unit price, summed per currency), unpriced (found parts with no applicable price break, left out of extended_cost), max_lead_time, and an issues table {columns, rows} listing ONLY problem parts. Problems: short_stock (available < quantity), below_moq (a given quantity < the minimum order), call_for_leadtime (lead time "CALL"), not_found, error, not_attempted; one part can have several, joined by ";" in its reason. Parts with no problem appear only in the counts. detail "all" returns a parts table with a row for every part instead. Output is capped at FUTURE_MAX_OUTPUT_TOKENS: when rows are dropped, truncated {omitted, hint} says so. If one batch fails, its parts get the error and the rest are still returned. If the API rate limit is still hit after retries, the lookup stops early: batches already running finish, and parts in batches not yet started are "not_attempted" (retry them later; totals.rate_limited is true). Prices are not an official quote. Use the single-part lookup tool for full offer details of one part.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Return the untouched upstream batch responses instead of the summary. Far larger, so whole batches are usually dropped by the output budget; use only for one small batch. | |
| parts | Yes | 1-2000 manufacturer part numbers. Each item is a string ("LM317T") or {"part_number": "LM317T", "quantity": 500}. Quantity is optional (positive integer) and selects the price break; duplicates are merged and their quantities summed. | |
| detail | No | "summary" (default): totals plus a table of problem parts only. "all": a table row for every part. Both are capped by the output budget. | summary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, yet the description discloses far more: batch size (300) and parallelism, case-insensitive de-duplication with quantity summing, partial-failure semantics ('If one batch fails, its parts get the error and the rest are still returned'), rate-limit early stop with 'not_attempted' handling, and output-budget truncation via {omitted, hint}. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose before diving into mechanics, and every sentence carries information (dedup rules, batching, totals fields, failure modes). It is long and dense to the point of being a wall of text, but for a tool with this much hidden behavior the length is largely earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 full burden of explaining returns — and it does, enumerating totals fields, extended_cost, unpriced, max_lead_time, the issues table, the detail='all' alternative, and truncation behavior. Nothing an agent needs to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 beyond the schema: each part is judged on its best offer (most stock) and quantity defaults to 1 when omitted, which explains how the quantity parameter actually changes the result. The 'raw' and 'detail' semantics largely duplicate the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('look up many Future Electronics parts at once, e.g. a whole bill of materials') and explicitly distinguishes itself from the sibling by directing single-part needs to 'the single-part lookup tool'. An agent can route between future_lookup_parts and future_lookup_part 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative tool and the condition that selects it ('Use the single-part lookup tool for full offer details of one part'), and gives conditional guidance for the detail enum ('all' returns every part vs the default summary). It also advises raw is only for one small batch.
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.
2 tool updates
v0.1.0- First observed
future_lookup_part - First observed
future_lookup_parts
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: future_lookup_part for a single part with full offer details, and future_lookup_parts for bulk/BOM lookups. The descriptions explicitly guide the agent to use the correct tool for each scenario, eliminating ambiguity.
Both tools follow a consistent snake_case pattern with the 'future_lookup_' prefix. This is predictable and easy to understand.
Two tools cover the core lookup operations (single and bulk) well, which is appropriate for a focused catalog lookup service. However, the count is on the lower side compared to typical servers, making it slightly thin.
The server provides complete coverage for its apparent domain of electronic component lookup: single-part detailed lookup and bulk BOM processing with exception handling, totals, and pricing. No obvious gaps exist for the stated purpose.
Maintenance
Related MCP Connectors
Search multi-merchant supply, checkout, and track orders via MCP.
Remote MCP server for product discovery catalog and retrieving product details.
MCP server for IT hardware parts research: normalize PNs, search listings, get subs/comps.
MCP server for Product Management
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceMCP server for looking up product information by UPC, EAN, GTIN barcodes and PLU produce codes.-
- FlicenseNot gradedqualityDmaintenanceEnables searching and retrieving product information from DigiKey's API, including part lookup, keyword search, product details, and pricing.-
- AlicenseBqualityDmaintenanceRead-only MCP server for finding, comparing, and shortlisting engineering parts from distributor and marketplace APIs.6MIT
- FlicenseNot gradedqualityCmaintenanceA read-only MCP server for querying product inventory, providing tools to retrieve product details and stock quantities.-