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 +21 -0
- package/README.md +228 -0
- package/index.mjs +81 -0
- package/package.json +38 -0
- package/tools.json +1 -0
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
|
+
[](https://crawlora.net/mcp)
|
|
4
|
+
[](https://crawlora.net/docs)
|
|
5
|
+
[](https://modelcontextprotocol.io)
|
|
6
|
+
[](https://smithery.ai/servers/crawlora/crawlora)
|
|
7
|
+
[](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
|
+
}
|