Electronics Docs MCP Server
Provides tools for searching, indexing, and retrieving official STMicroelectronics PDF documentation, enabling grounded answers from datasheets and technical reference manuals.
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., "@Electronics Docs MCP Server look up TMP117 temperature sensor specs"
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.
Electronics Docs MCP Server
An MCP (Model Context Protocol) server that gives LLMs direct access to official vendor PDF documentation (Texas Instruments, STMicroelectronics, and Analog Devices), with a local SQLite full-text index (FTS5 + BM25) so answers can be grounded in real datasheet and TRM text.
Tools
Tool | Role |
| Part + question: FTS on the local index only; if no match, returns |
| List PDF links for a part (metadata only). |
| Index a PDF by direct URL — use for |
| BM25 search; each hit includes |
| Full indexed text for page or page range ( |
When to use: lookup for index check + suggested URLs; **read_doc** to index; **read_doc_page** after query_doc_content when you need full page text. TI symlink datasheets often need read_doc directly. See [src/resources/tool-usage-guide.md](src/resources/tool-usage-guide.md).
Related MCP server: ContextPull
MCP resources
URI | Content |
| Markdown guide: when to use each tool, how to phrase queries, limits. Source: |
The server advertises **instructions** on initialize pointing agents to this resource.
Cursor skill (optional)
Project skills: electronics-docs-mcp, electronics-docs-mcp-ti, electronics-docs-mcp-st, electronics-docs-mcp-adi. Copy to ~/.cursor/skills/ if you want them globally.
Supported vendors
Vendor ID | Name | Status |
| Texas Instruments | Supported |
| STMicroelectronics | Supported |
| Analog Devices | Supported |
Recent changes (server v2.7.x)
Analog Devices (
ADI): NewAnalogDevicesProvider— PDF discovery fromanalog.com/en/products/<slug>.html, slug fallbacks on 404,lookup_docfilters PCN andmds.analog.comfrom suggestions only; same MCP tools as TI/ST.Vendor list: Supported vendors are derived from the
vendorsmap inmcpServerFactory.ts(includinglist_indexed_documentsvalidation). Tool schemas list all supported IDs.STMicroelectronics (
ST): Removed the blind “canonical datasheet” URL fallback that could suggestst.com/.../datasheet/<slug>.pdffor non‑ST parts. Legacy DB rows matching that synthetic pattern are skipped when mergingsearch_docsresults.PDF download (
read_doc): Retries on transient errors (502/503/504, timeouts, etc.); longer default timeout foranalog.com;Accept-Languageon Analog PDF requests;Refererfor native fetch chosen by host (analog.com,ti.com,st.com).
Adding a new vendor (hot plug)
Create
src/providers/YourVendorProvider.tsextendingVendorProvider.Implement
searchDocs,readDoc,queryContent, and optionally override**lookupDoc**and**getDocumentPageText**for orchestrated behavior and page reads.Register the provider in
[src/mcpServerFactory.ts](src/mcpServerFactory.ts)undervendors(supported vendor IDs and tool descriptions follow this map automatically).Rebuild:
npm run buildand restart the MCP process.
Development
npm install
npm run build # compiles TS → build/ and copies src/resources/*.md to build/resources/
npm start # stdio MCP server (for Cursor / Claude Desktop)
npm run start:http # HTTP MCP server on port 3000 (for network / remote use)Transport modes
This server supports two transports that share identical tools and resources:
Mode | Entry point | Transport | Use case |
stdio |
|
| Cursor, Claude Desktop (local) |
HTTP |
|
| LAN testing, remote deployment, multi-client |
The shared logic lives in src/mcpServerFactory.ts — both entry points call createMcpServer().
stdio mode (local — Cursor / Claude Desktop)
How "local" works
This server speaks MCP over stdio, not HTTP. The IDE spawns node …/build/index.js (or Docker with -i) and talks to the process over pipes. There is nothing to "open in the browser"; exposure = registering the command in Cursor / Claude so they start the binary for each session.
The SQLite index lives at ~/.electronics-docs-mcp/docs.db on the host (or /root/.electronics-docs-mcp/ inside Linux containers unless you mount a volume).
Cursor MCP config (Node — recommended)
Use an absolute path to build/index.js. Adjust the drive/path for your machine.
{
"mcpServers": {
"electronics-docs": {
"command": "node",
"args": ["D:/Projects Cursor/mcp-docs/build/index.js"]
}
}
}After editing MCP settings, reload the window or restart the MCP server so it picks up rebuilds.
Cursor MCP config (Docker)
Build the image first (npm run build is required so build/ exists before docker build).
npm run build
docker build -t electronics-docs-mcp .Cursor runs the container with -i so stdin stays open for the stdio protocol. Persist the index on a named volume (maps to /root/.electronics-docs-mcp in the image):
{
"mcpServers": {
"electronics-docs": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "electronics-docs-mcp-data:/root/.electronics-docs-mcp",
"electronics-docs-mcp"
]
}
}
}On first run Docker creates the volume electronics-docs-mcp-data. To reset the index: remove the volume (docker volume rm electronics-docs-mcp-data) or delete docs.db inside it.
Claude Desktop
Same command / args as Cursor in claude_desktop_config.json (e.g. %APPDATA%\Claude on Windows).
HTTP mode (LAN / remote)
The HTTP server exposes the same MCP tools and resources over MCP Streamable HTTP (POST /mcp).
Each request is fully independent — no session state is kept in memory.
Quick start
# Development (tsx, auto-reload)
npm run start:http
# Production (compiled)
npm run build
npm run start:http:prodDefault: http://0.0.0.0:3000/mcp
Environment variables
Variable | Default | Description |
|
| TCP port to listen on |
|
| Interface to bind ( |
| (unset) | When set, all requests must carry |
Health check
curl http://localhost:3000/health
# {"status":"ok","server":"electronics-docs-mcp","version":"2.7.0"}Test a tool call (curl)
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}'With auth token:
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer mysecret" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Cursor mcp.json (remote Streamable HTTP)
Cursor reads MCP settings from a JSON file at the user level (not per-project):
OS | Path |
Windows |
|
macOS / Linux |
|
Merge the block below into the top-level "mcpServers" object (alongside any other servers you already use).
Required fields for this server
Field | Value |
|
|
| Full URL ending in |
| Only if the server was started with |
Example — LAN (no auth on server)
{
"mcpServers": {
"electronics-docs-remote": {
"type": "streamableHttp",
"url": "http://192.168.1.100:3000/mcp"
}
}
}Example — LAN or tunnel with MCP_AUTH_TOKEN
{
"mcpServers": {
"electronics-docs-remote": {
"type": "streamableHttp",
"url": "http://192.168.1.100:3000/mcp",
"headers": {
"Authorization": "Bearer YOUR_SECRET_TOKEN"
}
}
}
}Example — Cloudflare quick tunnel (cloudflared tunnel --url http://localhost:3000)
The printed URL must include /mcp. Quick tunnels get a new *.trycloudflare.com hostname each run — update url whenever you restart cloudflared without a named tunnel.
{
"mcpServers": {
"electronics-docs-remote": {
"type": "streamableHttp",
"url": "https://random-name.trycloudflare.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_SECRET_TOKEN"
}
}
}
}After editing mcp.json, reload the Cursor window (or restart MCP) so the config is picked up.
Claude Desktop uses its own file (e.g. claude_desktop_config.json on Windows under %APPDATA%\Claude\) — same url / headers ideas apply if the client supports HTTP MCP.
Exposing to the internet
Option A — ngrok (fastest, for short-term testing)
npm install -g ngrok
ngrok http 3000
# → https://abc123.ngrok.io (public HTTPS tunnel to localhost:3000)Set in Cursor (~/.cursor/mcp.json or %USERPROFILE%\.cursor\mcp.json on Windows):
{
"mcpServers": {
"electronics-docs-remote": {
"type": "streamableHttp",
"url": "https://abc123.ngrok.io/mcp",
"headers": { "Authorization": "Bearer mysecret" }
}
}
}Option B — Cloudflare Tunnel (free, stable, no open port)
# Install: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/
cloudflared tunnel --url http://localhost:3000
# → https://some-name.trycloudflare.comOption C — Docker + VPS / cloud (permanent deployment)
Build a production image that starts the HTTP server:
# Add to Dockerfile (replace the existing CMD)
CMD ["node", "build/server-http.js"]Deploy on any Node-capable platform:
# Railway / Fly.io / Render — set env vars in dashboard:
# PORT=3000 (usually auto-set by platform)
# MCP_AUTH_TOKEN=<your-secret>
# Fly.io example
fly launch --name electronics-docs-mcp
fly secrets set MCP_AUTH_TOKEN=mysecret
fly deployOption D — Docker Compose (self-hosted server)
# docker-compose.yml
services:
mcp-http:
build: .
command: node build/server-http.js
ports:
- "3000:3000"
environment:
- PORT=3000
- MCP_AUTH_TOKEN=mysecret
volumes:
- mcp-data:/root/.electronics-docs-mcp
restart: unless-stopped
volumes:
mcp-data:npm run build
docker compose up -dOption E — Vercel (serverless)
The repo includes api/index.ts and vercel.json so the HTTP MCP runs as a Vercel Node function. The build runs npm run build (TypeScript → build/, resources copied, then scripts/ensure-public-dir.cjs so a public/ directory exists). vercel.json sets outputDirectory: public so Vercel does not fail with “No Output Directory named public”. If the dashboard overrides this, set Output Directory to public or leave it empty and rely on vercel.json.
Install the CLI:
npm i -g vercelFrom the project root:
vercel(link the project) thenvercel --prodfor production.In the Vercel dashboard → your project → Settings → Environment Variables, add:
Name | Value | Environments |
| Your secret (same value you use in | Production, Preview |
|
| Production, Preview |
Redeploy after changing env vars.
URLs after deploy
MCP (Streamable HTTP):
https://<your-project>.vercel.app/mcp— rewrites invercel.jsonmap/mcp→/api/mcp.Health:
https://<your-project>.vercel.app/healthDirect function path (same behavior):
https://<your-project>.vercel.app/api/mcp
Cursor mcp.json
{
"mcpServers": {
"electronics-docs-vercel": {
"type": "streamableHttp",
"url": "https://YOUR_PROJECT.vercel.app/mcp",
"headers": {
"Authorization": "Bearer YOUR_MCP_AUTH_TOKEN"
}
}
}
}Caveats
Serverless timeouts: Default Hobby limit is 10s per invocation; long PDF indexing may hit it. Pro allows longer functions (see
vercel.jsonmaxDuration). Prefer indexing heavy PDFs locally or on a long-running host.SQLite: The index lives under
ELECTRONICS_DOCS_DB_DIR(e.g./tmp). On serverless, storage is ephemeral — the DB may reset when the function cold-starts or scales. For a durable index, use self-hosted Option D or a VM.better-sqlite3: Native module; if the build fails on Vercel, check Node version in Project Settings and build logs.Secrets: Never commit tokens to git. Set
MCP_AUTH_TOKENonly in the Vercel UI orvercel env add.
Project structure
api/
└── index.ts # Vercel serverless: Express app → /api/mcp, /api/health
src/
├── index.ts # stdio entry point (Cursor / Claude Desktop)
├── httpApp.ts # Express app factory (shared: local HTTP + Vercel)
├── server-http.ts # HTTP entry point (LAN / remote / cloud)
├── mcpServerFactory.ts # shared MCP server logic (tools + resources)
├── resources/
│ └── tool-usage-guide.md # Copied to build/resources/ on build
├── cache/
│ └── DocumentCache.ts # SQLite + FTS5
└── providers/
├── VendorProvider.ts
├── TexasInstrumentsProvider.ts
└── StMicroelectronicsProvider.tsIndexed data is stored under ~/.electronics-docs-mcp/docs.db.
Testing
npm test
# build + run.ts all (see run-default-smoke.cjs)scripts/agent-flow/run.ts covers resource, search, lookup (TI + ST), and optionally read/query/page/flow. By default RUN_E2E_NETWORK is false in that script, so PDF downloads are skipped. Set RUN_E2E_NETWORK = true in run.ts for full read/query/page (network required).
npx tsx scripts/agent-flow/run.ts --tool search --vendor STAvailable Tools
6 toolslist_indexed_documentsA
List indexed PDF metadata from the local database (no web fetch). Returns count and documents (id, part, title, docType, url, indexedAt). Optional part filters to that part number (normalized like other tools). Omit part to list all documents for the vendor.
Inputs: vendor (required), part.
lookup_docA
Part number + question: FTS over the local index only — does not download or index PDFs. If the index matches, returns chunks; otherwise returns suggestedDocuments (prioritized PDF URLs from the vendor site). Next step: read_doc on a chosen URL, then query_doc_content. TI symlink datasheets may be missing from suggestions — use read_doc if you already have the PDF URL. See resource electronics-docs://guide/tool-usage.
Inputs: vendor (required), part (required), question (required), maxDocsToIndex.
query_doc_contentA
BM25 full-text search over indexed chunks. Each hit includes docUrl and pageNum — use them with read_doc_page for full page text. Requires PDFs indexed via read_doc (lookup alone does not index).
Inputs: vendor (required), query (required), part, docType, +1 more.
read_docA
Download and index a PDF by direct URL (required for TI /lit/ds/symlink/....pdf links and any PDF not found via lookup). Often works better than lookup when you already have the exact PDF link. Pass part when known. Then use query_doc_content or read_doc_page.
Inputs: vendor (required), docIdOrUrl (required), part, title.
read_doc_pageA
Return full indexed plain text for one PDF page or a page range (after query_doc_content gives you pageNum). Requires the document to already be indexed. Pass docUrl exactly as in search results (or the PDF URL used with read_doc). Use this when snippets are too short for tables or register maps.
Inputs: vendor (required), docUrl (required), page (required), pageEnd, +1 more.
search_docsA
Primitive: list PDF links (datasheet, TRM, app notes) for a part from the vendor site. Does not index. After lookup returns only suggestions, you can use this for a fuller link list.
Inputs: vendor (required), query (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Tools have distinct purposes: listing indexed docs, lookup/search over index, fetching/indexing PDFs, reading pages, and searching for links. Some overlap exists between lookup_doc and search_docs, but descriptions clarify their roles.
Most tool names follow verb_noun pattern with underscores, but 'list_indexed_documents' uses full 'documents' while others use 'doc', and 'lookup_doc' uses 'lookup' as verb. Minor inconsistency, but overall pattern is clear.
Six tools cover the core workflow of finding, indexing, and reading PDFs. The count feels appropriate for the domain, though a tool for managing the index (e.g., delete) could be added.
The tool set covers listing, searching, indexing, and reading documents. Missing operations like deleting indexed documents are minor gaps; the main user workflows are well-supported.
Maintenance
Related MCP Connectors
Turn datasheets into source-backed JSON contracts, pinout matrices, and KiCad CAD for AI agents.
PDF and image tools for AI agents: compress, merge, split, OCR, sign. Runs locally, never uploads.
Page-cited retrieval for embedded docs, datasheets, MISRA, CMSIS, and RTOS references.
Ingest, manage, and retrieve documents for RAG-powered AI applications
Related MCP Servers
- AlicenseAqualityBmaintenanceProvides AI agents with instant, structured access to electronic component datasheets, pinouts, and electrical specifications without requiring PDF uploads. It enables seamless part searching, design validation, and side-by-side component comparisons across major hardware providers.1495 npm12MIT
- AlicenseNot gradedqualityBmaintenanceTurns a local folder of documents into a queryable index that an LLM agent can pull from on demand, keeping only a compact table of contents in context. Exposes five tools (index, search, read, grep, neighbours) over a single offline SQLite FTS5 store so the model retrieves exact, citable sections instead of being handed whole files.MIT
- AlicenseNot gradedqualityBmaintenanceEnables agents to run full-text search inside Word, PowerPoint, Excel, PDF, and plain-text files by extracting their contents into a single local SQLite FTS5 index. Exposes tools to search documents with ranked highlighted snippets and human-readable locators, list indexed files, and incrementally build or refresh the index.MIT
- AlicenseNot gradedqualityBmaintenanceEnables agents to search local component-manual corpora via hybrid semantic, full-text, and substring retrieval with table recognition and OCR fallback for scanned pages. Provides tools for literal/regex grepping, reading single or multiple pages, navigating bookmarks and outlines, listing categories and indexed files, and checking index and dependency status.AGPL 3.0