extracto-mcp
by massanaRoger
README.md
# extracto-mcp
[Model Context Protocol](https://modelcontextprotocol.io) server for [Extracto](https://getextracto.dev). It gives Claude, Cursor, Claude Code, and any MCP client the ability to turn a URL plus a schema into validated, typed JSON — no prompt engineering, no HTML parsing, and no hallucinated fields (missing data comes back as `null`).
## Quick start
You need an Extracto API key. Get one at [app.getextracto.dev/keys](https://app.getextracto.dev/keys).
The server runs over stdio and is published to npm, so most clients just need this config block.
### Claude Desktop
Edit `claude_desktop_config.json` (Settings → Developer → Edit Config):
```json
{
"mcpServers": {
"extracto": {
"command": "npx",
"args": ["-y", "extracto-mcp"],
"env": { "EXTRACTO_API_KEY": "exa_live_your_key_here" }
}
}
}
```
### Cursor
Add to `~/.cursor/mcp.json` (or the project `.cursor/mcp.json`) with the same block.
### Claude Code
```bash
claude mcp add extracto -e EXTRACTO_API_KEY=exa_live_your_key_here -- npx -y extracto-mcp
```
Restart the client and ask it to extract something, e.g. _"Use extracto to pull the title, language and star count from github.com/facebook/react."_
## Tools
| Tool | What it does |
| --------------- | ------------ |
| `extract` | Synchronous extraction from a single URL (up to ~90s). Returns `{ data, meta }`. |
| `extract_async` | Submit an async job for heavy or anti-bot pages. Returns a job id immediately. |
| `get_job` | Poll an async job for status and result. |
| `list_jobs` | List your recent async jobs. |
### The `schema` argument
A schema is an object mapping field names to types. A type is:
- a literal: `"string"`, `"number"`, `"boolean"`, `"array"`, `"object"`
- a one-element array for a list: `["string"]`, or `[{ "title": "string" }]`
- a nested object: `{ "author": { "name": "string" } }`
```json
{
"title": "string",
"price": "number",
"tags": ["string"],
"reviews": [{ "user": "string", "stars": "number" }]
}
```
Only fields that are actually found on the page are returned; anything missing is `null` rather than guessed.
## Configuration
All configuration is via environment variables passed by your MCP client:
| Variable | Required | Description |
| -------------------- | -------- | ----------- |
| `EXTRACTO_API_KEY` | yes | Your key from [app.getextracto.dev/keys](https://app.getextracto.dev/keys). |
| `EXTRACTO_BASE_URL` | no | Override the API host (defaults to `https://app.getextracto.dev`). |
| `EXTRACTO_TIMEOUT_MS`| no | Per-request timeout in ms (default `90000`). |
## Development
```bash
npm install
npm run dev # run from source with tsx
npm run typecheck
npm run build # bundle to dist/ with tsup
```
## Related
- [`extracto`](https://www.npmjs.com/package/extracto) — the official TypeScript/JavaScript SDK.
- [getextracto.dev](https://getextracto.dev) — docs and API reference.
## License
MIT
TDQS
A4.4/5.0
Scored across 4 tools
Disambiguation5/5
Each tool serves a distinct purpose: synchronous extraction, async submission, polling, and listing. No overlap or ambiguity.
Naming Consistency4/5
Names are mostly lowercase and descriptive, but 'extract_async' breaks the verb_noun pattern seen in 'get_job' and 'list_jobs'. Minor inconsistency.
Tool Count5/5
With 4 tools covering sync/async extraction and job management, the count is well-scoped for a focused extraction service.
Completeness4/5
Covers core extraction workflows, but lacks a cancel job or delete job tool. Minor gap for a complete surface.
Maintenance
ActivityInactive
ResponsivenessNo issues