Files
DanieleandClaude Opus 5 ecb6835fa5 http-fetch/firecrawl: replace npx launch with a shipped wrapper (v5 / 1.1.0)
Both connectors declared `mcp_config: {command: "npx", args: ["-y", "<pkg>"]}`
and shipped no code at all. Skald treats a mcp_local `args[0]` as the *name of
the file to run*, not as an argument: install stores `script_path = "<id>/-y"`
and global_enable launches `npx /…/connectors/<id>/-y`, a path that does not
exist. The server never answered `initialize`, so start_server failed — and
since global_enable still returns 200 with an `error` in the body, the UI showed
the connector as enabled while `render_mcp_list` (built from the live runtime)
left it out of the agent's system context entirely.

Ship a two-file wrapper instead: a package.json pinning the upstream package
(mcp-fetch-server@1.1.2, firecrawl-mcp@3.23.7) and an index.js importing it for
its side effect, so `node index.js` is a real local_script and
ensure_installed_host installs the deps beside it. No node_modules, no lockfile.

Also: drop the legacy `launch_command` / top-level `transport` / `dependencies`
fields; drop firecrawl's inert `mcp_config.env` placeholder (same case as gmaps
— tokens are only substituted in the URL); add firecrawl_developer_search to
firecrawl's tools[] and API_KEY to its requires; realign manifest and fragment
versions to 5 / 1.1.0 (they were 2 vs 4, so no Update badge could ever appear).

Verified end-to-end against the shipped files by reproducing Skald's own path:
`npm ci || npm install --omit=dev` then `node <abs>/index.js` — initialize,
tools/list and a real tools/call, JSON-RPC only on stdout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 14:14:36 +01:00

171 lines
4.9 KiB
JSON

{
"id": "firecrawl",
"name": "Firecrawl",
"type": "mcp_local",
"requires": [
"NODE",
"API_KEY"
],
"env": [
{
"name": "FIRECRAWL_API_KEY",
"label": "Firecrawl API key",
"description": "Create one at https://www.firecrawl.dev (dashboard \u2192 API Keys).",
"required": true,
"secret": true,
"example": "fc-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
],
"setup_instructions": [
"Requires Node.js 22+ on the host that runs the connector.",
"Get an API key from https://www.firecrawl.dev/app/api-keys.",
"Dependencies are installed automatically by Skald from package.json."
],
"docs": [
{
"lang": "en",
"description": "Web scraping, crawling, search, deep research, and autonomous browsing \u2014 extract content from any website via Firecrawl. Scrape single URLs into clean Markdown, map site structures, crawl entire domains with scheduling, search the web, extract structured data with LLM-powered extraction, and run autonomous research agents. Includes monitoring for crawl changes.",
"llm_short_description": "Web scraping and research \u2014 scrape, crawl, search, extract structured data, run autonomous browsing, and monitor page changes on any website."
}
],
"auth": {
"type": "api_key"
},
"mcp_config": {
"command": "node",
"args": [
"index.js"
],
"transport": "stdio"
},
"verify": {
"command": "node -e \"const k = process.env.FIRECRAWL_API_KEY; if (!k || k.length < 10) { process.exit(1); } try { fetch('https://api.firecrawl.dev/v1/scrape', {method:'POST', headers:{'Content-Type':'application/json','Authorization':'Bearer '+k}, body:JSON.stringify({url:'https://example.com',formats:['markdown']})}).then(r=>r.json()).then(d=>{if(d.success) {console.log(JSON.stringify({ok:true,message:'Firecrawl API key valid \u2014 scrape probe successful'}))} else {console.log(JSON.stringify({ok:false,message:d.error||'API probe failed'}));process.exit(1)}}).catch(e=>{console.log(JSON.stringify({ok:false,message:e.message}));process.exit(1)}) } catch(e) { console.log(JSON.stringify({ok:false,message:e.message})); process.exit(1) }\"",
"timeout_secs": 20
},
"homepage": "https://www.firecrawl.dev",
"icon_small": "icon_sm.png",
"icon_large": "icon_lg.png",
"scope": "global",
"tags": [
"scraping",
"crawling",
"search",
"mcp",
"local",
"browser",
"research"
],
"version": 5,
"version_string": "1.1.0",
"version_release_date": "2026-08-10",
"tools": [
{
"name": "firecrawl_scrape",
"display_name": "Scrape URL"
},
{
"name": "firecrawl_map",
"display_name": "Map Site"
},
{
"name": "firecrawl_search",
"display_name": "Web Search"
},
{
"name": "firecrawl_developer_search",
"display_name": "Developer Search"
},
{
"name": "firecrawl_search_feedback",
"display_name": "Search Feedback"
},
{
"name": "firecrawl_feedback",
"display_name": "Feedback"
},
{
"name": "firecrawl_crawl",
"display_name": "Crawl Site"
},
{
"name": "firecrawl_check_crawl_status",
"display_name": "Check Crawl Status"
},
{
"name": "firecrawl_extract",
"display_name": "Extract Data"
},
{
"name": "firecrawl_agent",
"display_name": "Research Agent"
},
{
"name": "firecrawl_agent_status",
"display_name": "Agent Status"
},
{
"name": "firecrawl_interact",
"display_name": "Interact with Page"
},
{
"name": "firecrawl_interact_stop",
"display_name": "Stop Interact"
},
{
"name": "firecrawl_parse",
"display_name": "Parse"
},
{
"name": "firecrawl_monitor_create",
"display_name": "Create Monitor"
},
{
"name": "firecrawl_monitor_list",
"display_name": "List Monitors"
},
{
"name": "firecrawl_monitor_get",
"display_name": "Get Monitor"
},
{
"name": "firecrawl_monitor_update",
"display_name": "Update Monitor"
},
{
"name": "firecrawl_monitor_delete",
"display_name": "Delete Monitor"
},
{
"name": "firecrawl_monitor_run",
"display_name": "Run Monitor"
},
{
"name": "firecrawl_monitor_checks",
"display_name": "List Checks"
},
{
"name": "firecrawl_monitor_check",
"display_name": "Get Check"
},
{
"name": "firecrawl_research_search_papers",
"display_name": "Search Papers"
},
{
"name": "firecrawl_research_inspect_paper",
"display_name": "Inspect Paper"
},
{
"name": "firecrawl_research_related_papers",
"display_name": "Related Papers"
},
{
"name": "firecrawl_research_read_paper",
"display_name": "Read Paper"
},
{
"name": "firecrawl_research_search_github",
"display_name": "Search GitHub"
}
]
}