Turn any website or API into structured JSON with LLM-authored declarative scraping configs.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Inspect callable tools, capabilities, and parameters exposed to AI agents by Fitter.
fitter_runRun a Fitter config passed inline (JSON or YAML string) and return the extracted data as JSON. Accepts an optional `input` value available in the config via `{{{FromInput=.}}}` / `{{{FromInput=json.path}}}
fitter_run_fileSame as `fitter_run` but reads the config from a local `.json`/`.yaml` file
fitter_run_urlSame as `fitter_run` but downloads the config from an HTTP(S) URL, e.g. a raw GitHub link
fitter_validate_configValidate a config without executing it (structure, `response_type`, connector data source, model). Useful while iterating on a config
fitter_config_referenceReturn a condensed reference of the whole config format (connectors, parsers, model/field schema, placeholders, notifiers, references, limits) with working examples, so the model can author configs without external docs
Fitter turns any website or API into structured JSON β declaratively. One JSON/YAML config describes where the data lives (HTTP request, headless browser, file, static value) and what to extract (JSON paths, CSS selectors, XPath). No code, no brittle scraping scripts.
π Try it in your browser β the real engine compiled to WebAssembly: live examples, a visual config builder, no install.
Because configs are plain data, LLMs can author them. The built-in MCP server lets Claude Code, Claude Desktop, or any MCP client write and run scraping pipelines on your machine, on demand:
"Get the top 5 HackerNews stories with titles and scores" β the model authors a fitter config, validates it, runs it locally, and gets clean JSON back.
One engine, five ways to use it:
| π€ Fitter MCP | MCP server exposing fitter to Claude Code, Claude Desktop and any MCP client |
| π§ Fitter Agent | AI-powered CLI: natural language β config β executed result |
| π₯ Fitter CLI | run configs locally for test/debug/home usage |
| π¦ Fitter Lib | embed the engine in your own Go program |
| βοΈ Fitter | long-running service mode with scheduling & notifications |
Why fitter for AI agents?
Fitter MCP is a Model Context Protocol server (stdio transport) which lets any MCP client β Claude Code, Claude Desktop, IDE assistants, custom agents β run Fitter configs and get structured JSON back.
Download fitter-mcp-<os>-<arch>.mcpb from the release page and open it β Claude Desktop installs the server automatically.
Then just ask:
Get the top 5 HackerNews stories with titles and scores using fitter
The model calls fitter_config_reference, authors a config, optionally checks it with fitter_validate_config and executes it via fitter_run β all data fetching happens locally on your machine. For a ready-made pipeline try examples/config_morning_briefing.json:
Run examples/config_morning_briefing.json with fitter and give me the briefing
The .mcpb bundle and native binary ship without browsers: HTTP, static and file connectors work out of the box, but browser configs (the playwright connector) need Playwright's browsers. A few ways to get them:
.mcpb): set "install": true in the playwright connector β fitter downloads the driver + browser matching its built-in playwright-go version on first use (one-time, cached), so no separate install step is needed.playwright-go version fitter is built against (check go.mod, currently v0.6100.0):
The version must match go.mod exactly β playwright-go refuses to run against a mismatched driver. Then run configs without "install": true.ghcr.io/pxyup/fitter-mcp:playwright image, which bundles Chromium, Firefox and WebKit preinstalled (no "install": true needed).| Tool | Description |
|---|---|
fitter_run | Run a Fitter config passed inline (JSON or YAML string) and return the extracted data as JSON. Accepts an optional input value available in the config via {{{FromInput=.}}} / {{{FromInput=json.path}}} |
fitter_run_file | Same as fitter_run but reads the config from a local .json/.yaml file |
fitter_run_url | Same as fitter_run but downloads the config from an HTTP(S) URL, e.g. a raw GitHub link |
fitter_inspect_url | Fetch a URL and return a compact structure outline + candidate selectors/paths (gjson paths for JSON; repeated-element/list-row selectors for HTML) so the model authors a config first-try instead of guessing selectors and getting nulls. Detects client-rendered SPAs and can render them in a headless browser. Read-only β does not extract |
fitter_validate_config | Validate a config without executing it (structure, response_type, connector data source, model). Useful while iterating on a config |
fitter_config_reference | Return a condensed reference of the whole config format (connectors, parsers, model/field schema, placeholders, notifiers, references, limits) with working examples, so the model can author configs without external docs |
The reference is also exposed as MCP resource fitter://config-reference for clients that support resources.
The config format is exactly the same as for Fitter_CLI: a top-level object with item (required), limits and references. Notifiers work too (the result is additionally pushed to http/telegram/redis/file/console); trigger_config and http_server are service-mode only and are ignored in MCP calls.
By default fitter_mcp talks stdio. Pass --http to serve the streamable HTTP transport instead β for a shared team server, a container, or any remote deployment:
--http <addr> (env FITTER_MCP_HTTP_ADDR) β listen address; stdio mode when emptyFITTER_MCP_AUTH_TOKEN β when set, every /mcp request must send Authorization: Bearer <token>; without it the endpoint is unauthenticated, so bind to localhost or put it behind a proxy--stateless (env FITTER_MCP_STATELESS=true) β no per-session state, so replicas can sit behind a load balancer without sticky sessions--metrics-addr <addr> (env FITTER_MCP_METRICS_ADDR) β serve Prometheus metrics on a separate address (e.g. 127.0.0.1:9091); works in stdio mode too; empty disables. Exposes MCP request counts by method, tool call durations by tool and outcome, and outbound HTTP request durations by host, method and status. The endpoint is unauthenticated β bind it to localhost or a private interfaceThe server shuts down gracefully on SIGINT/SIGTERM.
A slim multi-arch image (linux/amd64 + linux/arm64) ships with every release:
The slim image contains only the fitter binary and CA certificates: server/static/file connectors work, browser connectors (chromium/docker/playwright) do not.
For browser-based configs use the playwright variant, which bundles Playwright with Chromium, Firefox and WebKit (matched to the playwright-go version fitter is built against, so no "install": true is needed in configs):
It is built from Dockerfile.mcp-playwright; build with --build-arg PLAYWRIGHT_BROWSERS=chromium for a smaller Chromium-only image.
Both images ship fitter_cli, so the one-time OAuth2 login can run inside the container. Store the token on a volume mounted at /tokens (pre-created writable in the image) and share it with the MCP server:
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/fitter)<a href="https://allmcps.com/mcp/fitter"><img src="https://allmcps.com/api/badge/fitter?style=directory" alt="Fitter on AllMCPs" /></a>