extracto-mcp
Click on "Install 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., "@extracto-mcppull the title, language and star count from github.com/facebook/react"
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.
extracto-mcp
Model Context Protocol server for Extracto. 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.
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):
{
"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
claude mcp add extracto -e EXTRACTO_API_KEY=exa_live_your_key_here -- npx -y extracto-mcpRestart 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."
Related MCP server: agent-api-gateway-mcp
Tools
Tool | What it does |
| Synchronous extraction from a single URL (up to ~90s). Returns |
| Submit an async job for heavy or anti-bot pages. Returns a job id immediately. |
| Poll an async job for status and result. |
| 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" } }
{
"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 |
| yes | Your key from app.getextracto.dev/keys. |
| no | Override the API host (defaults to |
| no | Per-request timeout in ms (default |
Development
npm install
npm run dev # run from source with tsx
npm run typecheck
npm run build # bundle to dist/ with tsupRelated
extracto— the official TypeScript/JavaScript SDK.getextracto.dev — docs and API reference.
License
MIT
Available Tools
4 toolsextractExtract structured data from a URLARead-only
Extract structured data from a public web page and return it as validated, typed JSON. Extracto renders the page (JavaScript included), runs a schema-constrained extraction, and returns ONLY fields that match the schema. Missing data comes back as null rather than a hallucinated guess. Best for a single known URL. This call is synchronous (up to ~90s); for heavy or anti-bot pages prefer extract_async.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The public HTTPS URL to extract from. | |
| schema | Yes | An object mapping each field name to a type. A type is one of the literals "string", "number", "boolean", "array", "object"; OR a one-element array for a list (e.g. ["string"] for a list of strings, or [{ "title": "string", "price": "number" }] for a list of objects); OR a nested object (e.g. { "author": { "name": "string" } }). Use the most specific shape you can. Example: { "title": "string", "price": "number", "tags": ["string"], "reviews": [{ "user": "string", "stars": "number" }] }. | |
| examples | No | Up to 3 few-shot examples to anchor the output format. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, openWorldHint), the description discloses JavaScript rendering, schema-constrained extraction, return of only matching fields, null for missing data, and synchronous behavior with ~90s timeout. No contradictions.
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?
The description is concise at about 5 sentences, front-loaded with the main purpose, and each sentence adds essential information without redundancy.
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?
Given there is no output schema, the description adequately explains return format (validated typed JSON), missing data handling, and execution constraints. All three parameters are thoroughly described in the schema, making the description complete for a tool of this complexity.
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. The description adds value by clarifying that only schema-matching fields are returned and missing data is null, enhancing understanding of parameter behavior beyond 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?
The description clearly states the tool extracts structured data from a public web page and returns validated typed JSON. It distinguishes from sibling tool 'extract_async' by noting this is synchronous and best for a single known URL.
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?
The description provides explicit context: 'Best for a single known URL' and recommends 'extract_async' for heavy or anti-bot pages. It does not address when to use other siblings like 'get_job' or 'list_jobs', but those have different purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_asyncSubmit an async extraction jobARead-only
Submit an asynchronous extraction job for a heavy, slow, or anti-bot-protected page. Returns a job id immediately; poll it with get_job until status is "success" or "failed". Use this instead of extract when a page is large or likely to need stealth rendering.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The public HTTPS URL to extract from. | |
| schema | Yes | An object mapping each field name to a type. A type is one of the literals "string", "number", "boolean", "array", "object"; OR a one-element array for a list (e.g. ["string"] for a list of strings, or [{ "title": "string", "price": "number" }] for a list of objects); OR a nested object (e.g. { "author": { "name": "string" } }). Use the most specific shape you can. Example: { "title": "string", "price": "number", "tags": ["string"], "reviews": [{ "user": "string", "stars": "number" }] }. | |
| examples | No | Up to 3 few-shot examples. | |
| webhookUrl | No | Optional URL to receive a signed callback when the job completes. | |
| idempotencyKey | No | Optional key; a retry with the same key replays the original job. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds async behavior and polling pattern beyond the annotations. Annotations declare readOnlyHint: true and openWorldHint: true, which are consistent. The description provides valuable behavioral context without contradiction.
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?
Two sentences, front-loaded with purpose, immediately followed by usage guidance. No redundant or vague language.
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?
Captures the key aspects: async submission, polling flow, alternatives, and mentions status outcomes. Sufficient for an async job tool with sibling context and schema coverage.
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. The description does not add extra meaning beyond what the schema provides, but it implies the 'url' and 'schema' are for extraction. Adequate.
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?
The description clearly states the action ('Submit') and resource ('asynchronous extraction job'), and specifies the context ('heavy, slow, or anti-bot-protected page'). It distinguishes from sibling tools by naming 'extract' as the alternative.
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 guidance on when to use this tool (heavy/slow/anti-bot pages) and when to use alternatives (use 'extract' for simpler pages). Also explains polling flow with 'get_job'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jobGet an extraction jobARead-only
Fetch the current status and (once complete) the result of an async extraction job created with extract_async. Status is one of pending, processing, success, failed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The job id returned by `extract_async`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and description confirms read-only nature (fetching, not modifying). Adds status values and async context beyond annotations.
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?
Two sentences, efficient, front-loaded with purpose. No unnecessary words.
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?
No output schema, but description covers what is returned (status and result) and lists status values. Adequate for simple poll operation.
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 100%, description mentions job id implicitly. Baseline score; description adds no extra semantics beyond 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?
Description clearly states it fetches status and result of an async extraction job, specifically for jobs created with extract_async, distinguishing it from sync extract and list_jobs.
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?
Explicitly states this tool is for jobs from extract_async and lists status values. Provides clear context but no explicit when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jobsList recent extraction jobsARead-only
List your recent async extraction jobs, newest first.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true; description adds ordering behavior (newest first) beyond what annotations provide, enhancing transparency.
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?
Single sentence is highly concise, front-loading the purpose and ordering, with no wasted words.
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 simple list tool with no parameters and clear annotations, the description fully covers the needed context.
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?
No parameters in schema (baseline 4). Description adds no parameter details, but none are needed.
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?
Description clearly states it lists recent async extraction jobs in newest-first order, distinguishing it from sibling tools like extract_async (starts jobs) and get_job (single job).
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?
Description implies use for listing recent jobs but does not explicitly state when to use or when not to use this tool versus alternatives like get_job for a specific job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool serves a distinct purpose: synchronous extraction, async submission, polling, and listing. No overlap or ambiguity.
Names are mostly lowercase and descriptive, but 'extract_async' breaks the verb_noun pattern seen in 'get_job' and 'list_jobs'. Minor inconsistency.
With 4 tools covering sync/async extraction and job management, the count is well-scoped for a focused extraction service.
Covers core extraction workflows, but lacks a cancel job or delete job tool. Minor gap for a complete surface.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Turn any website into structured JSON data matching your custom schema.
Turns any URL into SEO metadata, contacts, tech stack, and AI-ready Markdown, in one call.
Web scraping for AI agents. Converts URLs to clean, LLM-ready Markdown with anti-bot bypass.
AI web extraction: send URLs + a JSON Schema, get clean structured data. Pay-per-use via x402.
Related MCP Servers
- AlicenseAqualityDmaintenanceStructured web context infrastructure for AI agents. Extract reliable schema-guided JSON from websites using Claude-powered parsing, Browserless fallback rendering, and MCP-native workflows.11MIT
- AlicenseAqualityBmaintenanceMCP server that extracts structured JSON from public URLs for AI agents using schemas like product, article, and company.645MIT
- FlicenseNot gradedqualityBmaintenanceEnables live web retrieval through MCP, allowing Claude to fetch and extract current web information with validations, SSRF protections, and structured results for grounded responses.
- FlicenseNot gradedqualityBmaintenanceEnables MCP-compatible AI clients to extract live web content and convert it into structured Markdown for LLM ingestion, RAG pipelines, and agentic workflows.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/massanaRoger/extracto-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server