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>
This commit is contained in:
@@ -2,12 +2,10 @@
|
||||
"id": "firecrawl",
|
||||
"name": "Firecrawl",
|
||||
"type": "mcp_local",
|
||||
"launch_command": "npx -y firecrawl-mcp",
|
||||
"transport": "stdio",
|
||||
"requires": [
|
||||
"NODE"
|
||||
"NODE",
|
||||
"API_KEY"
|
||||
],
|
||||
"dependencies": [],
|
||||
"env": [
|
||||
{
|
||||
"name": "FIRECRAWL_API_KEY",
|
||||
@@ -19,9 +17,9 @@
|
||||
}
|
||||
],
|
||||
"setup_instructions": [
|
||||
"Ensure Node.js is installed.",
|
||||
"Requires Node.js 22+ on the host that runs the connector.",
|
||||
"Get an API key from https://www.firecrawl.dev/app/api-keys.",
|
||||
"No pip install needed \u2014 Firecrawl MCP runs via npx."
|
||||
"Dependencies are installed automatically by Skald from package.json."
|
||||
],
|
||||
"docs": [
|
||||
{
|
||||
@@ -34,14 +32,11 @@
|
||||
"type": "api_key"
|
||||
},
|
||||
"mcp_config": {
|
||||
"command": "npx",
|
||||
"command": "node",
|
||||
"args": [
|
||||
"-y",
|
||||
"firecrawl-mcp"
|
||||
"index.js"
|
||||
],
|
||||
"env": {
|
||||
"FIRECRAWL_API_KEY": "{SECRET:FIRECRAWL_API_KEY}"
|
||||
}
|
||||
"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) }\"",
|
||||
@@ -60,9 +55,9 @@
|
||||
"browser",
|
||||
"research"
|
||||
],
|
||||
"version": 2,
|
||||
"version_string": "1.0.1",
|
||||
"version_release_date": "2026-07-21",
|
||||
"version": 5,
|
||||
"version_string": "1.1.0",
|
||||
"version_release_date": "2026-08-10",
|
||||
"tools": [
|
||||
{
|
||||
"name": "firecrawl_scrape",
|
||||
@@ -76,6 +71,10 @@
|
||||
"name": "firecrawl_search",
|
||||
"display_name": "Web Search"
|
||||
},
|
||||
{
|
||||
"name": "firecrawl_developer_search",
|
||||
"display_name": "Developer Search"
|
||||
},
|
||||
{
|
||||
"name": "firecrawl_search_feedback",
|
||||
"display_name": "Search Feedback"
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
"icon_large": "firecrawl/icon_lg.png",
|
||||
"user_description": "Web scraping, crawling, search, deep research, and autonomous browsing \u2014 extract content from any website.",
|
||||
"requires": [
|
||||
"NODE"
|
||||
"NODE",
|
||||
"API_KEY"
|
||||
],
|
||||
"tags": [
|
||||
"scraping",
|
||||
@@ -22,9 +23,9 @@
|
||||
"type": "api_key"
|
||||
},
|
||||
"folder": "firecrawl",
|
||||
"version": 4,
|
||||
"version_string": "1.0.3",
|
||||
"version_release_date": "2026-07-21",
|
||||
"version": 5,
|
||||
"version_string": "1.1.0",
|
||||
"version_release_date": "2026-08-10",
|
||||
"tools": [
|
||||
{
|
||||
"name": "firecrawl_scrape",
|
||||
@@ -38,6 +39,10 @@
|
||||
"name": "firecrawl_search",
|
||||
"display_name": "Web Search"
|
||||
},
|
||||
{
|
||||
"name": "firecrawl_developer_search",
|
||||
"display_name": "Developer Search"
|
||||
},
|
||||
{
|
||||
"name": "firecrawl_search_feedback",
|
||||
"display_name": "Search Feedback"
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
// Skald connector entry point.
|
||||
//
|
||||
// The MCP server itself is the upstream `firecrawl-mcp` package, pinned in
|
||||
// package.json and installed by Skald beside this file (`npm ci --omit=dev`,
|
||||
// falling back to `npm install --omit=dev`).
|
||||
//
|
||||
// This file exists because Skald launches a `mcp_local` connector as
|
||||
// `<command> <mcp_config.args[0]>`, where args[0] is rewritten to the absolute
|
||||
// path of a *shipped* file — so `npx -y <package>` cannot be expressed: args[0]
|
||||
// would be taken as the entry file's name. Importing the package's server module
|
||||
// for its side effect (it starts the stdio JSON-RPC loop at import time) is the
|
||||
// whole of the wrapper.
|
||||
//
|
||||
// The API key arrives as FIRECRAWL_API_KEY in the process environment, collected
|
||||
// from the manifest's env[] form.
|
||||
import "firecrawl-mcp/dist/index.js";
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "skald-connector-firecrawl",
|
||||
"version": "1.1.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"description": "Skald connector wrapper around the firecrawl-mcp MCP server.",
|
||||
"dependencies": {
|
||||
"firecrawl-mcp": "3.23.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=22"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user