crawlora-mcp 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Crawlora
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,228 @@
1
+ # Crawlora MCP
2
+
3
+ [![Website](https://img.shields.io/badge/website-crawlora.net-2563eb)](https://crawlora.net/mcp)
4
+ [![Docs](https://img.shields.io/badge/docs-crawlora.net%2Fdocs-555)](https://crawlora.net/docs)
5
+ [![MCP](https://img.shields.io/badge/MCP-Streamable%20HTTP-7c3aed)](https://modelcontextprotocol.io)
6
+ [![smithery badge](https://smithery.ai/badge/crawlora/crawlora)](https://smithery.ai/servers/crawlora/crawlora)
7
+ [![crawlora-mcp MCP server](https://glama.ai/mcp/servers/Crawlora-org/crawlora-mcp/badges/score.svg)](https://glama.ai/mcp/servers/Crawlora-org/crawlora-mcp)
8
+
9
+ **Crawlora MCP** is a **hosted** Model Context Protocol server that gives AI clients and
10
+ agents **445 structured public‑web‑data tools** across 30+ categories — search, maps,
11
+ e‑commerce, social, finance, travel, app stores, media, and reviews — each returning clean,
12
+ normalized **JSON** instead of HTML to parse.
13
+
14
+ > **Two ways to use it:** connect any MCP client to the **hosted** endpoint
15
+ > (`https://mcp.crawlora.net/mcp`), or run the small **open‑source local server** in this repo
16
+ > (`npx` / Docker, stdio) — both expose the same tools and authenticate with your Crawlora API
17
+ > key. Start free with **2,000 credits/month** (no card) at **[crawlora.net](https://crawlora.net)**.
18
+
19
+ ## Connection
20
+
21
+ | | |
22
+ |---|---|
23
+ | **Endpoint** | `https://mcp.crawlora.net/mcp` |
24
+ | **Transport** | Streamable HTTP |
25
+ | **Auth** | `Authorization: Bearer <CRAWLORA_API_KEY>` (preferred) — `x-api-key: <key>` also accepted |
26
+ | **Get a key** | https://crawlora.net (free 2,000 credits/mo) |
27
+ | **Server card** | https://crawlora.net/.well-known/mcp/server-card.json |
28
+
29
+ A missing or invalid API key returns `401`.
30
+
31
+ ## Connect your client
32
+
33
+ Crawlora MCP works with any MCP‑capable client. Pick yours below — they all point at the same
34
+ hosted endpoint (`https://mcp.crawlora.net/mcp`, Streamable HTTP) and authenticate with your
35
+ `CRAWLORA_API_KEY`. Prefer keeping the key in an environment variable over pasting it literally,
36
+ and never commit it. Ready‑to‑paste files for each client live in [`examples/`](examples/).
37
+
38
+ ### Claude Code (CLI)
39
+
40
+ ```bash
41
+ claude mcp add --transport http crawlora https://mcp.crawlora.net/mcp \
42
+ --header "Authorization: Bearer ${CRAWLORA_API_KEY}"
43
+ ```
44
+
45
+ Adds at `local` scope by default. Use `--scope user` to make it available in every project, or
46
+ `--scope project` to write a shared `.mcp.json`. Confirm with `claude mcp list`.
47
+
48
+ ### Claude Desktop
49
+
50
+ Settings → Developer → **Edit Config**, then add to `claude_desktop_config.json`:
51
+
52
+ ```json
53
+ {
54
+ "mcpServers": {
55
+ "crawlora": {
56
+ "url": "https://mcp.crawlora.net/mcp",
57
+ "transport": "streamable-http",
58
+ "headers": { "Authorization": "Bearer YOUR_CRAWLORA_API_KEY" }
59
+ }
60
+ }
61
+ }
62
+ ```
63
+
64
+ ### Cursor
65
+
66
+ Project‑local `.cursor/mcp.json` (or `~/.cursor/mcp.json` for all projects):
67
+
68
+ ```json
69
+ {
70
+ "mcpServers": {
71
+ "crawlora": {
72
+ "url": "https://mcp.crawlora.net/mcp",
73
+ "headers": { "Authorization": "Bearer ${CRAWLORA_API_KEY}" }
74
+ }
75
+ }
76
+ }
77
+ ```
78
+
79
+ ### Codex CLI
80
+
81
+ ```bash
82
+ codex mcp add crawlora \
83
+ --url https://mcp.crawlora.net/mcp \
84
+ --bearer-token-env-var CRAWLORA_API_KEY
85
+ ```
86
+
87
+ ### VS Code (GitHub Copilot)
88
+
89
+ `.vscode/mcp.json` (project) or your user `mcp.json`:
90
+
91
+ ```json
92
+ {
93
+ "servers": {
94
+ "crawlora": {
95
+ "type": "http",
96
+ "url": "https://mcp.crawlora.net/mcp",
97
+ "headers": { "Authorization": "Bearer ${env:CRAWLORA_API_KEY}" }
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ ### Windsurf
104
+
105
+ `~/.codeium/windsurf/mcp_config.json` (note the `serverUrl` key):
106
+
107
+ ```json
108
+ {
109
+ "mcpServers": {
110
+ "crawlora": {
111
+ "serverUrl": "https://mcp.crawlora.net/mcp",
112
+ "headers": { "Authorization": "Bearer ${env:CRAWLORA_API_KEY}" }
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ ### Gemini CLI
119
+
120
+ `~/.gemini/settings.json` (note the `httpUrl` key):
121
+
122
+ ```json
123
+ {
124
+ "mcpServers": {
125
+ "crawlora": {
126
+ "httpUrl": "https://mcp.crawlora.net/mcp",
127
+ "headers": { "Authorization": "Bearer YOUR_CRAWLORA_API_KEY" }
128
+ }
129
+ }
130
+ }
131
+ ```
132
+
133
+ ### Cline / Roo Code
134
+
135
+ Add to `cline_mcp_settings.json` using the generic remote shape — full walkthrough in
136
+ [`llms-install.md`](llms-install.md):
137
+
138
+ ```json
139
+ {
140
+ "mcpServers": {
141
+ "crawlora": {
142
+ "url": "https://mcp.crawlora.net/mcp",
143
+ "transport": "streamable-http",
144
+ "headers": { "Authorization": "Bearer ${CRAWLORA_API_KEY}" }
145
+ }
146
+ }
147
+ }
148
+ ```
149
+
150
+ ### Other clients
151
+
152
+ Any client that speaks **Streamable HTTP** can use the generic config in
153
+ [`examples/mcp.json`](examples/mcp.json). **stdio‑only** clients (e.g. Zed) should run the
154
+ [local server](#run-it-locally-open-source-server) below and point at its `npx` command.
155
+
156
+ ## Run it locally (open‑source server)
157
+
158
+ This repo also ships a small **stdio** MCP server (`index.mjs`) that exposes the same **445
159
+ tools**, each wrapping the Crawlora REST API (`https://api.crawlora.net/api/v1`) with your
160
+ `CRAWLORA_API_KEY`. Useful if you'd rather run the server yourself than use the hosted endpoint.
161
+
162
+ ```bash
163
+ # Node 20+ (no install)
164
+ CRAWLORA_API_KEY=your-key npx -y crawlora-mcp
165
+
166
+ # or from a clone
167
+ npm install && CRAWLORA_API_KEY=your-key node index.mjs
168
+
169
+ # or Docker
170
+ docker build -t crawlora-mcp . && docker run -i -e CRAWLORA_API_KEY=your-key crawlora-mcp
171
+ ```
172
+
173
+ Client config (stdio):
174
+
175
+ ```json
176
+ {
177
+ "mcpServers": {
178
+ "crawlora": {
179
+ "command": "npx",
180
+ "args": ["-y", "crawlora-mcp"],
181
+ "env": { "CRAWLORA_API_KEY": "your-key" }
182
+ }
183
+ }
184
+ }
185
+ ```
186
+
187
+ The tool definitions in [`tools.json`](tools.json) are generated from Crawlora's published API
188
+ catalog; each carries its real input schema and maps to a single REST endpoint.
189
+
190
+ ## What you can call (445 tools / 30+ categories)
191
+
192
+ | Category | Tools | Examples |
193
+ |---|---|---|
194
+ | **Finance & crypto** | 142 | Yahoo Finance, Google Finance, CoinGecko, Polymarket, Kalshi, Metaculus — quotes, financials, screeners, markets, trending, coins, prediction markets |
195
+ | **Media & entertainment** | 113 | Spotify, Spotify Podcasts, Apple Podcasts, JustWatch, IMDb, Rotten Tomatoes, Box Office Mojo — tracks, artists, charts, episodes, where‑to‑watch, titles, ratings, box office |
196
+ | **Social & video** | 54 | YouTube, TikTok, Instagram, Reddit, LinkedIn — search, profiles, posts, comments, transcripts, trends |
197
+ | **E‑commerce** | 36 | Amazon, eBay, Shopify, Shop.app — product, search, sellers, collections, reviews |
198
+ | **Search & web** | 27 | Google, Bing, Brave, Google Trends, Web Scrape — SERPs, suggestions, news, videos, images, interest‑over‑time, URL‑to‑markdown |
199
+ | **App stores** | 20 | App Store, Google Play — app details, reviews, rankings, similar apps |
200
+ | **Reviews & companies** | 18 | Trustpilot, Product Hunt — business reviews, launches, makers, leaderboards |
201
+ | **Travel & real estate** | 18 | Airbnb, TripAdvisor, Zillow, Redfin — listings, calendars, hotels, property data, estimates, region trends |
202
+ | **Data & utility** | 12 | Datasets, SimilarWeb, usage — curated datasets, website intelligence, account usage |
203
+ | **Maps & places** | 5 | Google Maps, Geocoding — place search, details, forward/reverse geocoding |
204
+
205
+ Full, always‑current tool list with parameters, response examples, and a live Playground:
206
+ **https://crawlora.net/docs**.
207
+
208
+ ## Why Crawlora
209
+
210
+ - **Normalized JSON per tool** — ship data features, not scraper infrastructure.
211
+ - **No proxies, browsers, or parsers** to maintain.
212
+ - **Pay on success** — credit‑based, billed only on `2xx` responses.
213
+ - **One key, 445 tools** — search, commerce, social, finance, and more behind a single MCP endpoint.
214
+
215
+ A good alternative to stitching together SerpApi, Firecrawl, ScraperAPI, or ScrapingBee.
216
+
217
+ ## Links
218
+
219
+ - Website: https://crawlora.net/mcp
220
+ - Docs & Playground: https://crawlora.net/docs · https://crawlora.net/playground
221
+ - Pricing: https://crawlora.net/pricing
222
+ - Server card: https://crawlora.net/.well-known/mcp/server-card.json
223
+ - Official MCP registry manifest: [`server.json`](server.json)
224
+
225
+ ## License
226
+
227
+ See [`LICENSE`](LICENSE). The Crawlora MCP service itself is a hosted SaaS governed by the
228
+ [Crawlora terms](https://crawlora.net); this repository contains connection docs and manifests.
package/index.mjs ADDED
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env node
2
+ // Crawlora MCP — local stdio MCP server.
3
+ // Exposes 445 structured web-data tools, each wrapping the Crawlora REST API
4
+ // (https://api.crawlora.net/api/v1) with your CRAWLORA_API_KEY. Get a free key
5
+ // (2,000 credits/month, no card) at https://crawlora.net.
6
+ //
7
+ // tools.json is generated from Crawlora's published API catalog; each tool
8
+ // carries its real input schema and maps to a single REST endpoint.
9
+
10
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
11
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
12
+ import {
13
+ ListToolsRequestSchema,
14
+ CallToolRequestSchema,
15
+ } from "@modelcontextprotocol/sdk/types.js";
16
+ import { readFileSync } from "node:fs";
17
+ import { fileURLToPath } from "node:url";
18
+ import { dirname, join } from "node:path";
19
+
20
+ const HERE = dirname(fileURLToPath(import.meta.url));
21
+ const TOOLS = JSON.parse(readFileSync(join(HERE, "tools.json"), "utf8"));
22
+ const BY_NAME = new Map(TOOLS.map((t) => [t.name, t]));
23
+
24
+ const API_BASE = (process.env.CRAWLORA_API_BASE || "https://api.crawlora.net/api/v1").replace(/\/+$/, "");
25
+ const API_KEY = process.env.CRAWLORA_API_KEY || "";
26
+
27
+ const server = new Server(
28
+ { name: "crawlora-mcp", version: "1.0.0" },
29
+ { capabilities: { tools: {} } }
30
+ );
31
+
32
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
33
+ tools: TOOLS.map(({ name, description, inputSchema }) => ({ name, description, inputSchema })),
34
+ }));
35
+
36
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
37
+ const tool = BY_NAME.get(req.params.name);
38
+ if (!tool) {
39
+ return { isError: true, content: [{ type: "text", text: `Unknown tool: ${req.params.name}` }] };
40
+ }
41
+ if (!API_KEY) {
42
+ return {
43
+ isError: true,
44
+ content: [{ type: "text", text: "Missing CRAWLORA_API_KEY. Get a free key (2,000 credits/mo, no card) at https://crawlora.net." }],
45
+ };
46
+ }
47
+
48
+ const args = req.params.arguments || {};
49
+ const { method, path, query, body } = tool._http;
50
+
51
+ let url = API_BASE + path.replace(/\{([^}]+)\}/g, (_, k) => encodeURIComponent(String(args[k] ?? "")));
52
+ const qs = new URLSearchParams();
53
+ for (const q of query) {
54
+ const v = args[q];
55
+ if (v !== undefined && v !== null && v !== "") qs.append(q, String(v));
56
+ }
57
+ const qstr = qs.toString();
58
+ if (qstr) url += (url.includes("?") ? "&" : "?") + qstr;
59
+
60
+ const headers = { "x-api-key": API_KEY, accept: "application/json" };
61
+ let payload;
62
+ if (body && args[body] !== undefined) {
63
+ headers["content-type"] = "application/json";
64
+ payload = JSON.stringify(args[body]);
65
+ }
66
+
67
+ try {
68
+ const res = await fetch(url, { method, headers, body: payload });
69
+ const text = await res.text();
70
+ if (!res.ok) {
71
+ return { isError: true, content: [{ type: "text", text: `HTTP ${res.status} ${res.statusText}\n${text}` }] };
72
+ }
73
+ return { content: [{ type: "text", text }] };
74
+ } catch (e) {
75
+ return { isError: true, content: [{ type: "text", text: `Request failed: ${e?.message || e}` }] };
76
+ }
77
+ });
78
+
79
+ const transport = new StdioServerTransport();
80
+ await server.connect(transport);
81
+ console.error(`crawlora-mcp ready — ${TOOLS.length} tools (REST base ${API_BASE})`);
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "crawlora-mcp",
3
+ "version": "1.1.0",
4
+ "description": "Local MCP server for Crawlora — 321 structured public web-data tools (search, maps, commerce, social, finance) wrapping the Crawlora REST API.",
5
+ "type": "module",
6
+ "main": "index.mjs",
7
+ "bin": {
8
+ "crawlora-mcp": "index.mjs"
9
+ },
10
+ "files": [
11
+ "index.mjs",
12
+ "tools.json"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20"
16
+ },
17
+ "scripts": {
18
+ "start": "node index.mjs",
19
+ "test": "node scripts/smoke-test.mjs"
20
+ },
21
+ "dependencies": {
22
+ "@modelcontextprotocol/sdk": "^1.12.0"
23
+ },
24
+ "keywords": [
25
+ "mcp",
26
+ "model-context-protocol",
27
+ "crawlora",
28
+ "web-scraping",
29
+ "serp",
30
+ "data-extraction"
31
+ ],
32
+ "homepage": "https://crawlora.net/mcp",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/Crawlora-org/crawlora-mcp.git"
36
+ },
37
+ "license": "MIT"
38
+ }