[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-firecrawl-firecrawl-developer-index":3,"mdc-n8lvxr-key":33,"related-org-firecrawl-firecrawl-developer-index":1171,"related-repo-firecrawl-firecrawl-developer-index":1353},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":31,"mdContent":32},"firecrawl-developer-index","answer developer questions from repository documentation","Answer a developer question — code behaviour, a library or framework, an API contract, an error message, a known bug — from issues, merged pull requests, repository READMEs, and curated documentation sites with Firecrawl Developer. Always use this skill for any programming question whose answer belongs in a primary source rather than a general web page.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"firecrawl","Firecrawl","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Ffirecrawl.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Documentation","documentation","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Search","search",{"name":21,"slug":22,"type":15},"Code Analysis","code-analysis",54,"https:\u002F\u002Fgithub.com\u002Ffirecrawl\u002Fskills","2026-08-06T06:09:15.380032",null,15,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":26},[],"https:\u002F\u002Fgithub.com\u002Ffirecrawl\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Ffirecrawl-developer-index","---\nname: firecrawl-developer-index\ndescription: Answer a developer question — code behaviour, a library or framework, an API contract, an error message, a known bug — from issues, merged pull requests, repository READMEs, and curated documentation sites with Firecrawl Developer. Always use this skill for any programming question whose answer belongs in a primary source rather than a general web page.\n---\n\n# Firecrawl Developer Index\n\nAnswer a developer question from the primary source: the issue where the bug was reported, the merged pull request that fixed it, the README or documentation page that states the contract. A blog post that describes a behaviour is a weaker answer than the passage that defines it, so reach for the index first and the open web second.\n\nThere is **no fixed recipe**. Read the question, decide what kind it is, and choose the approach below. A literal error string wants a different move than \"how do I do X\". Don't run machinery a question doesn't call for.\n\n## The tools, and what each is uniquely good at\n\n- HTTP: **`GET|POST https:\u002F\u002Fapi.firecrawl.dev\u002Fv2\u002Fsearch\u002Fdeveloper`**\n  MCP: **`firecrawl_developer_search(query, k?, skills?)`**\n  CLI: **`firecrawl developer \u003Cquery> [--limit \u003Cn>] [--skills-only]`**\n  Ranked results over the whole index. Each carries `id` (`issue:owner\u002Frepo#123`), `type` (`doc` | `issue` | `pull_request` | `readme`), `url`, `title`, and the **matched passages in markdown**, so tables and code blocks survive.\n  The default first move for a developer question. It is the only surface that returns the passages, which is what lets you answer instead of pointing at a page.\n  `k` \u002F `--limit` is 1–100 and defaults to 10. `skills=\"only\"` \u002F `--skills-only` restricts the search to agent-skill files.\n  Keyless; send `Authorization: Bearer $FIRECRAWL_API_KEY` for higher rate limits.\n\n- MCP: **`firecrawl_search(query, categories: [\"developer\"])`**\n  CLI: **`firecrawl search \u003Cquery> --categories developer`**\n  Developer hits in a `developer` group beside `web`, each with `url`, `title`, `description` (the matched passage), `position`, and `category: \"developer\"` — web results carry no `category`, so that is the field to key on when merging.\n  Use this when you are **already** running a web search and want developer sources weighed in the same call. It exposes none of the filters and no passage control.\n\n- MCP: **`firecrawl_scrape(url)` \u002F `firecrawl_search(query)`**\n  CLI: **`firecrawl scrape \u003Curl>` \u002F `firecrawl search \u003Cquery>`**\n  General web fetch and search, for what no primary source states: a comparison between two libraries, an outage, a migration write-up, a project with no public repository or indexed docs.\n  Also the follow-through when a hit is the right page but you need all of it — `scrape` the result's `url`.\n\n## Filters, and what each one costs you\n\nOnly the HTTP surface takes these. On `GET`, pass `types=issue,pull_request` or repeat the parameter; on `POST`, pass arrays. All are optional.\n\n- `types` — which of `doc`, `issue`, `pull_request`, `readme` to search. Defaults to all four. Narrowing here is the cheapest way to sharpen a query.\n- `repos` (`owner\u002Fname`) scopes the repository half, meaning `issue`, `pull_request`, and `readme`; `sources` (documentation source ids, at most 20) scopes the documentation half, meaning `doc`. Passing both **unions** the halves rather than intersecting them. Both echo back in the response with `indexed: true|false` — that is how you tell \"not in the index\" from \"found nothing\".\n- A filter that cannot match any requested `type` is a `400`, not an empty list: `repos` with no repository type in `types`, or `sources` without `doc`.\n- `passages` (1–5, default 1) is the *maximum* passages per result, not a guarantee. Raise it when one page is clearly the right page but the first passage is the wrong part of it.\n- `language`, `topic`, `license`, `min_stars`, `max_stars`, `archived`, `fork` describe a **repository**. Most documentation pages in the index have no repository behind them, so no repository fact can admit or exclude one. Send any of these without a `sources` scope and the response holds repository evidence only — `issue`, `pull_request`, `readme` — with `coverage` reporting `doc` as `unavailable`. That is the design, not an index fault: do not retry it and do not report the index broken. To keep documentation, drop the repository filters, or scope the documentation half with `sources` and read `coverage` to confirm `doc` answered.\n\n## Match the approach to the question\n\n- **Literal error message or stack-trace string** → search the string itself plus the library name, with `types=[\"issue\",\"pull_request\"]`. Whoever hit it filed it. If nothing matches, strip the volatile parts (paths, line numbers, ids, addresses) and retry — the invariant middle of the message is what is indexed.\n- **Conceptual \"how do I do X\"** → the full question in natural language, all four types. The answer is usually a `doc` or a `readme`; raise `passages` before raising `k`.\n- **Known bug** → the issue reports it, the merged pull request *fixes* it, and the fix is what you want. Search `types=[\"issue\",\"pull_request\"]`, then re-query the issue's own terms scoped to its repo with `types=[\"pull_request\"]`. A merged PR's passages tell you what changed and in which direction.\n- **API contract** (\"what does X return\", \"is Y required\", \"what is the default\") → `readme` and `doc` are authoritative and a blog post is not. Use `types=[\"readme\",\"doc\"]`. If the contract looks like it moved, follow up with `pull_request` for the change that moved it.\n- **Version-specific behaviour** → an issue's opening report describes the broken version; its resolution supersedes it. Raise `passages` to see further into the thread, and read the resolution and the linked pull request before answering. Never answer from an opening report alone.\n- **Scoped to one library** → `repos=[\"owner\u002Fname\"]` when you know the slug, plus `sources` if you want its docs in the same call. If a scoped search comes back empty, read the echoed `indexed` flag first: `false` means nothing from that repo or source can ever match and no rephrasing will help — drop the scope and search the whole index, or go to the web.\n- **Ecosystem-wide** (\"which libraries do X\", \"who else hit this\") → no scope. Use `language` \u002F `topic` \u002F `min_stars` to keep to maintained repositories, accepting that this gives up all `doc` results.\n- **Agent skills and tooling conventions** → `skills=\"only\"` \u002F `--skills-only`.\n- **Comparison, opinion, news, or an unindexed project** → the open web. `firecrawl_search`, then `firecrawl_scrape` whatever deserves a full read. Combining is often right: take the contract from the index and the trade-off from the web.\n\n## Principles\n\n- **Read `coverage` before concluding a source doesn't exist.** Every response reports `ok` | `degraded` | `unavailable` | `skipped` per type. `skipped` means your own `types` value did not ask for that type. `degraded` or `unavailable` means the gap came from the index **or from a filter you sent**, not from your query — drop the filter or widen, rather than retrying the same call or reporting that nothing exists. `ok` with no hits of that type is a genuine miss: rephrase.\n- **Quote the passage, cite the `url`.** The passages are the evidence; hand them over rather than paraphrasing them into a claim the reader can't check. `title` is frequently absent on `doc` results — fall back to `url`.\n- **A merge supersedes a report.** When an issue and a pull request disagree, the merged pull request is the current behaviour. Say which one you read.\n- **Scope last, not first.** Search the whole index, then narrow with `types`, `repos`, or `sources` once you know what the hits look like. Scoping first hides the result that would have told you where to look.\n- **Go to the web when the index has nothing to say.** Trade-offs, ecosystem opinion, and anything about an unindexed project are web questions. Don't force them through the index, and don't dress a general web page up as a primary source.\n",{"data":34,"body":35},{"name":4,"description":6},{"type":36,"children":37},"root",[38,46,52,65,72,377,383,412,714,720,990,996],{"type":39,"tag":40,"props":41,"children":42},"element","h1",{"id":4},[43],{"type":44,"value":45},"text","Firecrawl Developer Index",{"type":39,"tag":47,"props":48,"children":49},"p",{},[50],{"type":44,"value":51},"Answer a developer question from the primary source: the issue where the bug was reported, the merged pull request that fixed it, the README or documentation page that states the contract. A blog post that describes a behaviour is a weaker answer than the passage that defines it, so reach for the index first and the open web second.",{"type":39,"tag":47,"props":53,"children":54},{},[55,57,63],{"type":44,"value":56},"There is ",{"type":39,"tag":58,"props":59,"children":60},"strong",{},[61],{"type":44,"value":62},"no fixed recipe",{"type":44,"value":64},". Read the question, decide what kind it is, and choose the approach below. A literal error string wants a different move than \"how do I do X\". Don't run machinery a question doesn't call for.",{"type":39,"tag":66,"props":67,"children":69},"h2",{"id":68},"the-tools-and-what-each-is-uniquely-good-at",[70],{"type":44,"value":71},"The tools, and what each is uniquely good at",{"type":39,"tag":73,"props":74,"children":75},"ul",{},[76,230,323],{"type":39,"tag":77,"props":78,"children":79},"li",{},[80,82,92,94,103,105,114,116,122,124,130,132,138,139,145,147,153,154,160,161,167,168,174,176,182,184,189,191,197,199,205,207,213,214,220,222,228],{"type":44,"value":81},"HTTP: ",{"type":39,"tag":58,"props":83,"children":84},{},[85],{"type":39,"tag":86,"props":87,"children":89},"code",{"className":88},[],[90],{"type":44,"value":91},"GET|POST https:\u002F\u002Fapi.firecrawl.dev\u002Fv2\u002Fsearch\u002Fdeveloper",{"type":44,"value":93},"\nMCP: ",{"type":39,"tag":58,"props":95,"children":96},{},[97],{"type":39,"tag":86,"props":98,"children":100},{"className":99},[],[101],{"type":44,"value":102},"firecrawl_developer_search(query, k?, skills?)",{"type":44,"value":104},"\nCLI: ",{"type":39,"tag":58,"props":106,"children":107},{},[108],{"type":39,"tag":86,"props":109,"children":111},{"className":110},[],[112],{"type":44,"value":113},"firecrawl developer \u003Cquery> [--limit \u003Cn>] [--skills-only]",{"type":44,"value":115},"\nRanked results over the whole index. Each carries ",{"type":39,"tag":86,"props":117,"children":119},{"className":118},[],[120],{"type":44,"value":121},"id",{"type":44,"value":123}," (",{"type":39,"tag":86,"props":125,"children":127},{"className":126},[],[128],{"type":44,"value":129},"issue:owner\u002Frepo#123",{"type":44,"value":131},"), ",{"type":39,"tag":86,"props":133,"children":135},{"className":134},[],[136],{"type":44,"value":137},"type",{"type":44,"value":123},{"type":39,"tag":86,"props":140,"children":142},{"className":141},[],[143],{"type":44,"value":144},"doc",{"type":44,"value":146}," | ",{"type":39,"tag":86,"props":148,"children":150},{"className":149},[],[151],{"type":44,"value":152},"issue",{"type":44,"value":146},{"type":39,"tag":86,"props":155,"children":157},{"className":156},[],[158],{"type":44,"value":159},"pull_request",{"type":44,"value":146},{"type":39,"tag":86,"props":162,"children":164},{"className":163},[],[165],{"type":44,"value":166},"readme",{"type":44,"value":131},{"type":39,"tag":86,"props":169,"children":171},{"className":170},[],[172],{"type":44,"value":173},"url",{"type":44,"value":175},", ",{"type":39,"tag":86,"props":177,"children":179},{"className":178},[],[180],{"type":44,"value":181},"title",{"type":44,"value":183},", and the ",{"type":39,"tag":58,"props":185,"children":186},{},[187],{"type":44,"value":188},"matched passages in markdown",{"type":44,"value":190},", so tables and code blocks survive.\nThe default first move for a developer question. It is the only surface that returns the passages, which is what lets you answer instead of pointing at a page.\n",{"type":39,"tag":86,"props":192,"children":194},{"className":193},[],[195],{"type":44,"value":196},"k",{"type":44,"value":198}," \u002F ",{"type":39,"tag":86,"props":200,"children":202},{"className":201},[],[203],{"type":44,"value":204},"--limit",{"type":44,"value":206}," is 1–100 and defaults to 10. ",{"type":39,"tag":86,"props":208,"children":210},{"className":209},[],[211],{"type":44,"value":212},"skills=\"only\"",{"type":44,"value":198},{"type":39,"tag":86,"props":215,"children":217},{"className":216},[],[218],{"type":44,"value":219},"--skills-only",{"type":44,"value":221}," restricts the search to agent-skill files.\nKeyless; send ",{"type":39,"tag":86,"props":223,"children":225},{"className":224},[],[226],{"type":44,"value":227},"Authorization: Bearer $FIRECRAWL_API_KEY",{"type":44,"value":229}," for higher rate limits.",{"type":39,"tag":77,"props":231,"children":232},{},[233,235,244,245,254,256,262,264,270,272,277,278,283,284,290,292,298,300,306,308,314,316,321],{"type":44,"value":234},"MCP: ",{"type":39,"tag":58,"props":236,"children":237},{},[238],{"type":39,"tag":86,"props":239,"children":241},{"className":240},[],[242],{"type":44,"value":243},"firecrawl_search(query, categories: [\"developer\"])",{"type":44,"value":104},{"type":39,"tag":58,"props":246,"children":247},{},[248],{"type":39,"tag":86,"props":249,"children":251},{"className":250},[],[252],{"type":44,"value":253},"firecrawl search \u003Cquery> --categories developer",{"type":44,"value":255},"\nDeveloper hits in a ",{"type":39,"tag":86,"props":257,"children":259},{"className":258},[],[260],{"type":44,"value":261},"developer",{"type":44,"value":263}," group beside ",{"type":39,"tag":86,"props":265,"children":267},{"className":266},[],[268],{"type":44,"value":269},"web",{"type":44,"value":271},", each with ",{"type":39,"tag":86,"props":273,"children":275},{"className":274},[],[276],{"type":44,"value":173},{"type":44,"value":175},{"type":39,"tag":86,"props":279,"children":281},{"className":280},[],[282],{"type":44,"value":181},{"type":44,"value":175},{"type":39,"tag":86,"props":285,"children":287},{"className":286},[],[288],{"type":44,"value":289},"description",{"type":44,"value":291}," (the matched passage), ",{"type":39,"tag":86,"props":293,"children":295},{"className":294},[],[296],{"type":44,"value":297},"position",{"type":44,"value":299},", and ",{"type":39,"tag":86,"props":301,"children":303},{"className":302},[],[304],{"type":44,"value":305},"category: \"developer\"",{"type":44,"value":307}," — web results carry no ",{"type":39,"tag":86,"props":309,"children":311},{"className":310},[],[312],{"type":44,"value":313},"category",{"type":44,"value":315},", so that is the field to key on when merging.\nUse this when you are ",{"type":39,"tag":58,"props":317,"children":318},{},[319],{"type":44,"value":320},"already",{"type":44,"value":322}," running a web search and want developer sources weighed in the same call. It exposes none of the filters and no passage control.",{"type":39,"tag":77,"props":324,"children":325},{},[326,327,343,344,360,362,368,370,375],{"type":44,"value":234},{"type":39,"tag":58,"props":328,"children":329},{},[330,336,337],{"type":39,"tag":86,"props":331,"children":333},{"className":332},[],[334],{"type":44,"value":335},"firecrawl_scrape(url)",{"type":44,"value":198},{"type":39,"tag":86,"props":338,"children":340},{"className":339},[],[341],{"type":44,"value":342},"firecrawl_search(query)",{"type":44,"value":104},{"type":39,"tag":58,"props":345,"children":346},{},[347,353,354],{"type":39,"tag":86,"props":348,"children":350},{"className":349},[],[351],{"type":44,"value":352},"firecrawl scrape \u003Curl>",{"type":44,"value":198},{"type":39,"tag":86,"props":355,"children":357},{"className":356},[],[358],{"type":44,"value":359},"firecrawl search \u003Cquery>",{"type":44,"value":361},"\nGeneral web fetch and search, for what no primary source states: a comparison between two libraries, an outage, a migration write-up, a project with no public repository or indexed docs.\nAlso the follow-through when a hit is the right page but you need all of it — ",{"type":39,"tag":86,"props":363,"children":365},{"className":364},[],[366],{"type":44,"value":367},"scrape",{"type":44,"value":369}," the result's ",{"type":39,"tag":86,"props":371,"children":373},{"className":372},[],[374],{"type":44,"value":173},{"type":44,"value":376},".",{"type":39,"tag":66,"props":378,"children":380},{"id":379},"filters-and-what-each-one-costs-you",[381],{"type":44,"value":382},"Filters, and what each one costs you",{"type":39,"tag":47,"props":384,"children":385},{},[386,388,394,396,402,404,410],{"type":44,"value":387},"Only the HTTP surface takes these. On ",{"type":39,"tag":86,"props":389,"children":391},{"className":390},[],[392],{"type":44,"value":393},"GET",{"type":44,"value":395},", pass ",{"type":39,"tag":86,"props":397,"children":399},{"className":398},[],[400],{"type":44,"value":401},"types=issue,pull_request",{"type":44,"value":403}," or repeat the parameter; on ",{"type":39,"tag":86,"props":405,"children":407},{"className":406},[],[408],{"type":44,"value":409},"POST",{"type":44,"value":411},", pass arrays. All are optional.",{"type":39,"tag":73,"props":413,"children":414},{},[415,451,518,565,584],{"type":39,"tag":77,"props":416,"children":417},{},[418,424,426,431,432,437,438,443,444,449],{"type":39,"tag":86,"props":419,"children":421},{"className":420},[],[422],{"type":44,"value":423},"types",{"type":44,"value":425}," — which of ",{"type":39,"tag":86,"props":427,"children":429},{"className":428},[],[430],{"type":44,"value":144},{"type":44,"value":175},{"type":39,"tag":86,"props":433,"children":435},{"className":434},[],[436],{"type":44,"value":152},{"type":44,"value":175},{"type":39,"tag":86,"props":439,"children":441},{"className":440},[],[442],{"type":44,"value":159},{"type":44,"value":175},{"type":39,"tag":86,"props":445,"children":447},{"className":446},[],[448],{"type":44,"value":166},{"type":44,"value":450}," to search. Defaults to all four. Narrowing here is the cheapest way to sharpen a query.",{"type":39,"tag":77,"props":452,"children":453},{},[454,460,461,467,469,474,475,480,481,486,488,494,496,501,503,508,510,516],{"type":39,"tag":86,"props":455,"children":457},{"className":456},[],[458],{"type":44,"value":459},"repos",{"type":44,"value":123},{"type":39,"tag":86,"props":462,"children":464},{"className":463},[],[465],{"type":44,"value":466},"owner\u002Fname",{"type":44,"value":468},") scopes the repository half, meaning ",{"type":39,"tag":86,"props":470,"children":472},{"className":471},[],[473],{"type":44,"value":152},{"type":44,"value":175},{"type":39,"tag":86,"props":476,"children":478},{"className":477},[],[479],{"type":44,"value":159},{"type":44,"value":299},{"type":39,"tag":86,"props":482,"children":484},{"className":483},[],[485],{"type":44,"value":166},{"type":44,"value":487},"; ",{"type":39,"tag":86,"props":489,"children":491},{"className":490},[],[492],{"type":44,"value":493},"sources",{"type":44,"value":495}," (documentation source ids, at most 20) scopes the documentation half, meaning ",{"type":39,"tag":86,"props":497,"children":499},{"className":498},[],[500],{"type":44,"value":144},{"type":44,"value":502},". Passing both ",{"type":39,"tag":58,"props":504,"children":505},{},[506],{"type":44,"value":507},"unions",{"type":44,"value":509}," the halves rather than intersecting them. Both echo back in the response with ",{"type":39,"tag":86,"props":511,"children":513},{"className":512},[],[514],{"type":44,"value":515},"indexed: true|false",{"type":44,"value":517}," — that is how you tell \"not in the index\" from \"found nothing\".",{"type":39,"tag":77,"props":519,"children":520},{},[521,523,528,530,536,538,543,545,550,552,557,559,564],{"type":44,"value":522},"A filter that cannot match any requested ",{"type":39,"tag":86,"props":524,"children":526},{"className":525},[],[527],{"type":44,"value":137},{"type":44,"value":529}," is a ",{"type":39,"tag":86,"props":531,"children":533},{"className":532},[],[534],{"type":44,"value":535},"400",{"type":44,"value":537},", not an empty list: ",{"type":39,"tag":86,"props":539,"children":541},{"className":540},[],[542],{"type":44,"value":459},{"type":44,"value":544}," with no repository type in ",{"type":39,"tag":86,"props":546,"children":548},{"className":547},[],[549],{"type":44,"value":423},{"type":44,"value":551},", or ",{"type":39,"tag":86,"props":553,"children":555},{"className":554},[],[556],{"type":44,"value":493},{"type":44,"value":558}," without ",{"type":39,"tag":86,"props":560,"children":562},{"className":561},[],[563],{"type":44,"value":144},{"type":44,"value":376},{"type":39,"tag":77,"props":566,"children":567},{},[568,574,576,582],{"type":39,"tag":86,"props":569,"children":571},{"className":570},[],[572],{"type":44,"value":573},"passages",{"type":44,"value":575}," (1–5, default 1) is the ",{"type":39,"tag":577,"props":578,"children":579},"em",{},[580],{"type":44,"value":581},"maximum",{"type":44,"value":583}," passages per result, not a guarantee. Raise it when one page is clearly the right page but the first passage is the wrong part of it.",{"type":39,"tag":77,"props":585,"children":586},{},[587,593,594,600,601,607,608,614,615,621,622,628,629,635,637,642,644,649,651,656,657,662,663,668,670,676,678,683,685,691,693,698,700,705,707,712],{"type":39,"tag":86,"props":588,"children":590},{"className":589},[],[591],{"type":44,"value":592},"language",{"type":44,"value":175},{"type":39,"tag":86,"props":595,"children":597},{"className":596},[],[598],{"type":44,"value":599},"topic",{"type":44,"value":175},{"type":39,"tag":86,"props":602,"children":604},{"className":603},[],[605],{"type":44,"value":606},"license",{"type":44,"value":175},{"type":39,"tag":86,"props":609,"children":611},{"className":610},[],[612],{"type":44,"value":613},"min_stars",{"type":44,"value":175},{"type":39,"tag":86,"props":616,"children":618},{"className":617},[],[619],{"type":44,"value":620},"max_stars",{"type":44,"value":175},{"type":39,"tag":86,"props":623,"children":625},{"className":624},[],[626],{"type":44,"value":627},"archived",{"type":44,"value":175},{"type":39,"tag":86,"props":630,"children":632},{"className":631},[],[633],{"type":44,"value":634},"fork",{"type":44,"value":636}," describe a ",{"type":39,"tag":58,"props":638,"children":639},{},[640],{"type":44,"value":641},"repository",{"type":44,"value":643},". Most documentation pages in the index have no repository behind them, so no repository fact can admit or exclude one. Send any of these without a ",{"type":39,"tag":86,"props":645,"children":647},{"className":646},[],[648],{"type":44,"value":493},{"type":44,"value":650}," scope and the response holds repository evidence only — ",{"type":39,"tag":86,"props":652,"children":654},{"className":653},[],[655],{"type":44,"value":152},{"type":44,"value":175},{"type":39,"tag":86,"props":658,"children":660},{"className":659},[],[661],{"type":44,"value":159},{"type":44,"value":175},{"type":39,"tag":86,"props":664,"children":666},{"className":665},[],[667],{"type":44,"value":166},{"type":44,"value":669}," — with ",{"type":39,"tag":86,"props":671,"children":673},{"className":672},[],[674],{"type":44,"value":675},"coverage",{"type":44,"value":677}," reporting ",{"type":39,"tag":86,"props":679,"children":681},{"className":680},[],[682],{"type":44,"value":144},{"type":44,"value":684}," as ",{"type":39,"tag":86,"props":686,"children":688},{"className":687},[],[689],{"type":44,"value":690},"unavailable",{"type":44,"value":692},". That is the design, not an index fault: do not retry it and do not report the index broken. To keep documentation, drop the repository filters, or scope the documentation half with ",{"type":39,"tag":86,"props":694,"children":696},{"className":695},[],[697],{"type":44,"value":493},{"type":44,"value":699}," and read ",{"type":39,"tag":86,"props":701,"children":703},{"className":702},[],[704],{"type":44,"value":675},{"type":44,"value":706}," to confirm ",{"type":39,"tag":86,"props":708,"children":710},{"className":709},[],[711],{"type":44,"value":144},{"type":44,"value":713}," answered.",{"type":39,"tag":66,"props":715,"children":717},{"id":716},"match-the-approach-to-the-question",[718],{"type":44,"value":719},"Match the approach to the question",{"type":39,"tag":73,"props":721,"children":722},{},[723,741,778,810,849,866,907,943,964],{"type":39,"tag":77,"props":724,"children":725},{},[726,731,733,739],{"type":39,"tag":58,"props":727,"children":728},{},[729],{"type":44,"value":730},"Literal error message or stack-trace string",{"type":44,"value":732}," → search the string itself plus the library name, with ",{"type":39,"tag":86,"props":734,"children":736},{"className":735},[],[737],{"type":44,"value":738},"types=[\"issue\",\"pull_request\"]",{"type":44,"value":740},". Whoever hit it filed it. If nothing matches, strip the volatile parts (paths, line numbers, ids, addresses) and retry — the invariant middle of the message is what is indexed.",{"type":39,"tag":77,"props":742,"children":743},{},[744,749,751,756,758,763,765,770,772,777],{"type":39,"tag":58,"props":745,"children":746},{},[747],{"type":44,"value":748},"Conceptual \"how do I do X\"",{"type":44,"value":750}," → the full question in natural language, all four types. The answer is usually a ",{"type":39,"tag":86,"props":752,"children":754},{"className":753},[],[755],{"type":44,"value":144},{"type":44,"value":757}," or a ",{"type":39,"tag":86,"props":759,"children":761},{"className":760},[],[762],{"type":44,"value":166},{"type":44,"value":764},"; raise ",{"type":39,"tag":86,"props":766,"children":768},{"className":767},[],[769],{"type":44,"value":573},{"type":44,"value":771}," before raising ",{"type":39,"tag":86,"props":773,"children":775},{"className":774},[],[776],{"type":44,"value":196},{"type":44,"value":376},{"type":39,"tag":77,"props":779,"children":780},{},[781,786,788,793,795,800,802,808],{"type":39,"tag":58,"props":782,"children":783},{},[784],{"type":44,"value":785},"Known bug",{"type":44,"value":787}," → the issue reports it, the merged pull request ",{"type":39,"tag":577,"props":789,"children":790},{},[791],{"type":44,"value":792},"fixes",{"type":44,"value":794}," it, and the fix is what you want. Search ",{"type":39,"tag":86,"props":796,"children":798},{"className":797},[],[799],{"type":44,"value":738},{"type":44,"value":801},", then re-query the issue's own terms scoped to its repo with ",{"type":39,"tag":86,"props":803,"children":805},{"className":804},[],[806],{"type":44,"value":807},"types=[\"pull_request\"]",{"type":44,"value":809},". A merged PR's passages tell you what changed and in which direction.",{"type":39,"tag":77,"props":811,"children":812},{},[813,818,820,825,827,832,834,840,842,847],{"type":39,"tag":58,"props":814,"children":815},{},[816],{"type":44,"value":817},"API contract",{"type":44,"value":819}," (\"what does X return\", \"is Y required\", \"what is the default\") → ",{"type":39,"tag":86,"props":821,"children":823},{"className":822},[],[824],{"type":44,"value":166},{"type":44,"value":826}," and ",{"type":39,"tag":86,"props":828,"children":830},{"className":829},[],[831],{"type":44,"value":144},{"type":44,"value":833}," are authoritative and a blog post is not. Use ",{"type":39,"tag":86,"props":835,"children":837},{"className":836},[],[838],{"type":44,"value":839},"types=[\"readme\",\"doc\"]",{"type":44,"value":841},". If the contract looks like it moved, follow up with ",{"type":39,"tag":86,"props":843,"children":845},{"className":844},[],[846],{"type":44,"value":159},{"type":44,"value":848}," for the change that moved it.",{"type":39,"tag":77,"props":850,"children":851},{},[852,857,859,864],{"type":39,"tag":58,"props":853,"children":854},{},[855],{"type":44,"value":856},"Version-specific behaviour",{"type":44,"value":858}," → an issue's opening report describes the broken version; its resolution supersedes it. Raise ",{"type":39,"tag":86,"props":860,"children":862},{"className":861},[],[863],{"type":44,"value":573},{"type":44,"value":865}," to see further into the thread, and read the resolution and the linked pull request before answering. Never answer from an opening report alone.",{"type":39,"tag":77,"props":867,"children":868},{},[869,874,876,882,884,889,891,897,899,905],{"type":39,"tag":58,"props":870,"children":871},{},[872],{"type":44,"value":873},"Scoped to one library",{"type":44,"value":875}," → ",{"type":39,"tag":86,"props":877,"children":879},{"className":878},[],[880],{"type":44,"value":881},"repos=[\"owner\u002Fname\"]",{"type":44,"value":883}," when you know the slug, plus ",{"type":39,"tag":86,"props":885,"children":887},{"className":886},[],[888],{"type":44,"value":493},{"type":44,"value":890}," if you want its docs in the same call. If a scoped search comes back empty, read the echoed ",{"type":39,"tag":86,"props":892,"children":894},{"className":893},[],[895],{"type":44,"value":896},"indexed",{"type":44,"value":898}," flag first: ",{"type":39,"tag":86,"props":900,"children":902},{"className":901},[],[903],{"type":44,"value":904},"false",{"type":44,"value":906}," means nothing from that repo or source can ever match and no rephrasing will help — drop the scope and search the whole index, or go to the web.",{"type":39,"tag":77,"props":908,"children":909},{},[910,915,917,922,923,928,929,934,936,941],{"type":39,"tag":58,"props":911,"children":912},{},[913],{"type":44,"value":914},"Ecosystem-wide",{"type":44,"value":916}," (\"which libraries do X\", \"who else hit this\") → no scope. Use ",{"type":39,"tag":86,"props":918,"children":920},{"className":919},[],[921],{"type":44,"value":592},{"type":44,"value":198},{"type":39,"tag":86,"props":924,"children":926},{"className":925},[],[927],{"type":44,"value":599},{"type":44,"value":198},{"type":39,"tag":86,"props":930,"children":932},{"className":931},[],[933],{"type":44,"value":613},{"type":44,"value":935}," to keep to maintained repositories, accepting that this gives up all ",{"type":39,"tag":86,"props":937,"children":939},{"className":938},[],[940],{"type":44,"value":144},{"type":44,"value":942}," results.",{"type":39,"tag":77,"props":944,"children":945},{},[946,951,952,957,958,963],{"type":39,"tag":58,"props":947,"children":948},{},[949],{"type":44,"value":950},"Agent skills and tooling conventions",{"type":44,"value":875},{"type":39,"tag":86,"props":953,"children":955},{"className":954},[],[956],{"type":44,"value":212},{"type":44,"value":198},{"type":39,"tag":86,"props":959,"children":961},{"className":960},[],[962],{"type":44,"value":219},{"type":44,"value":376},{"type":39,"tag":77,"props":965,"children":966},{},[967,972,974,980,982,988],{"type":39,"tag":58,"props":968,"children":969},{},[970],{"type":44,"value":971},"Comparison, opinion, news, or an unindexed project",{"type":44,"value":973}," → the open web. ",{"type":39,"tag":86,"props":975,"children":977},{"className":976},[],[978],{"type":44,"value":979},"firecrawl_search",{"type":44,"value":981},", then ",{"type":39,"tag":86,"props":983,"children":985},{"className":984},[],[986],{"type":44,"value":987},"firecrawl_scrape",{"type":44,"value":989}," whatever deserves a full read. Combining is often right: take the contract from the index and the trade-off from the web.",{"type":39,"tag":66,"props":991,"children":993},{"id":992},"principles",[994],{"type":44,"value":995},"Principles",{"type":39,"tag":73,"props":997,"children":998},{},[999,1086,1122,1132,1161],{"type":39,"tag":77,"props":1000,"children":1001},{},[1002,1014,1016,1022,1023,1029,1030,1035,1036,1042,1044,1049,1051,1056,1058,1063,1065,1070,1072,1077,1079,1084],{"type":39,"tag":58,"props":1003,"children":1004},{},[1005,1007,1012],{"type":44,"value":1006},"Read ",{"type":39,"tag":86,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":44,"value":675},{"type":44,"value":1013}," before concluding a source doesn't exist.",{"type":44,"value":1015}," Every response reports ",{"type":39,"tag":86,"props":1017,"children":1019},{"className":1018},[],[1020],{"type":44,"value":1021},"ok",{"type":44,"value":146},{"type":39,"tag":86,"props":1024,"children":1026},{"className":1025},[],[1027],{"type":44,"value":1028},"degraded",{"type":44,"value":146},{"type":39,"tag":86,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":44,"value":690},{"type":44,"value":146},{"type":39,"tag":86,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":44,"value":1041},"skipped",{"type":44,"value":1043}," per type. ",{"type":39,"tag":86,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":44,"value":1041},{"type":44,"value":1050}," means your own ",{"type":39,"tag":86,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":44,"value":423},{"type":44,"value":1057}," value did not ask for that type. ",{"type":39,"tag":86,"props":1059,"children":1061},{"className":1060},[],[1062],{"type":44,"value":1028},{"type":44,"value":1064}," or ",{"type":39,"tag":86,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":44,"value":690},{"type":44,"value":1071}," means the gap came from the index ",{"type":39,"tag":58,"props":1073,"children":1074},{},[1075],{"type":44,"value":1076},"or from a filter you sent",{"type":44,"value":1078},", not from your query — drop the filter or widen, rather than retrying the same call or reporting that nothing exists. ",{"type":39,"tag":86,"props":1080,"children":1082},{"className":1081},[],[1083],{"type":44,"value":1021},{"type":44,"value":1085}," with no hits of that type is a genuine miss: rephrase.",{"type":39,"tag":77,"props":1087,"children":1088},{},[1089,1100,1102,1107,1109,1114,1116,1121],{"type":39,"tag":58,"props":1090,"children":1091},{},[1092,1094,1099],{"type":44,"value":1093},"Quote the passage, cite the ",{"type":39,"tag":86,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":44,"value":173},{"type":44,"value":376},{"type":44,"value":1101}," The passages are the evidence; hand them over rather than paraphrasing them into a claim the reader can't check. ",{"type":39,"tag":86,"props":1103,"children":1105},{"className":1104},[],[1106],{"type":44,"value":181},{"type":44,"value":1108}," is frequently absent on ",{"type":39,"tag":86,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":44,"value":144},{"type":44,"value":1115}," results — fall back to ",{"type":39,"tag":86,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":44,"value":173},{"type":44,"value":376},{"type":39,"tag":77,"props":1123,"children":1124},{},[1125,1130],{"type":39,"tag":58,"props":1126,"children":1127},{},[1128],{"type":44,"value":1129},"A merge supersedes a report.",{"type":44,"value":1131}," When an issue and a pull request disagree, the merged pull request is the current behaviour. Say which one you read.",{"type":39,"tag":77,"props":1133,"children":1134},{},[1135,1140,1142,1147,1148,1153,1154,1159],{"type":39,"tag":58,"props":1136,"children":1137},{},[1138],{"type":44,"value":1139},"Scope last, not first.",{"type":44,"value":1141}," Search the whole index, then narrow with ",{"type":39,"tag":86,"props":1143,"children":1145},{"className":1144},[],[1146],{"type":44,"value":423},{"type":44,"value":175},{"type":39,"tag":86,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":44,"value":459},{"type":44,"value":551},{"type":39,"tag":86,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":44,"value":493},{"type":44,"value":1160}," once you know what the hits look like. Scoping first hides the result that would have told you where to look.",{"type":39,"tag":77,"props":1162,"children":1163},{},[1164,1169],{"type":39,"tag":58,"props":1165,"children":1166},{},[1167],{"type":44,"value":1168},"Go to the web when the index has nothing to say.",{"type":44,"value":1170}," Trade-offs, ecosystem opinion, and anything about an unindexed project are web questions. Don't force them through the index, and don't dress a general web page up as a primary source.",{"items":1172,"total":1352},[1173,1200,1216,1228,1241,1256,1269,1281,1296,1308,1325,1340],{"slug":1174,"name":1174,"fn":1175,"description":1176,"org":1177,"tags":1178,"stars":1197,"repoUrl":1198,"updatedAt":1199},"convert-documents-to-markdown","convert documents to GitHub-Flavored Markdown","Convert Word (.doc, .docx), PowerPoint (.ppt, .pptx), Excel (.xls, .xlsx), OpenDocument (.odt, .ods, .odp), RTF, EPUB, CSV, and PDF files to GitHub-Flavored Markdown. Use when a task needs the contents of an office document, spreadsheet, presentation, ebook, or PDF you cannot read directly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1179,1182,1185,1188,1191,1194],{"name":1180,"slug":1181,"type":15},"Documents","documents",{"name":1183,"slug":1184,"type":15},"DOCX","docx",{"name":1186,"slug":1187,"type":15},"Excel","excel",{"name":1189,"slug":1190,"type":15},"Markdown","markdown",{"name":1192,"slug":1193,"type":15},"PDF","pdf",{"name":1195,"slug":1196,"type":15},"PowerPoint","powerpoint",5629,"https:\u002F\u002Fgithub.com\u002Ffirecrawl\u002Fanydoc","2026-08-06T06:09:23.91045",{"slug":1201,"name":1201,"fn":1202,"description":1203,"org":1204,"tags":1205,"stars":1213,"repoUrl":1214,"updatedAt":1215},"competitor-analysis","analyze competitors across features and pricing","Compare two or more companies, products, or platforms across pricing, features, positioning, and docs. Use this skill whenever the user says \"compare X vs Y\", \"how does X stack up against Y\", \"alternatives to X\", \"competitive landscape of …\", \"X vs Y vs Z\", or asks for a competitor matrix. Uses search to discover competitors when the user only names a category, then scrape for each competitor's homepage, pricing page, and features\u002Fdocs. Returns a normalized comparison matrix as JSON.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1206,1209,1210],{"name":1207,"slug":1208,"type":15},"Competitive Intelligence","competitive-intelligence",{"name":9,"slug":8,"type":15},{"name":1211,"slug":1212,"type":15},"Research","research",1130,"https:\u002F\u002Fgithub.com\u002Ffirecrawl\u002Fweb-agent","2026-04-17T05:00:44.623049",{"slug":1217,"name":1217,"fn":1218,"description":1219,"org":1220,"tags":1221,"stars":1213,"repoUrl":1214,"updatedAt":1227},"deep-research","conduct multi-source deep research","Multi-source research with source triangulation and fact-checking. Use for any research task requiring 3+ sources.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1222,1223,1226],{"name":9,"slug":8,"type":15},{"name":1224,"slug":1225,"type":15},"Knowledge Management","knowledge-management",{"name":1211,"slug":1212,"type":15},"2026-04-17T05:00:45.852512",{"slug":1229,"name":1229,"fn":1230,"description":1231,"org":1232,"tags":1233,"stars":1213,"repoUrl":1214,"updatedAt":1240},"e-commerce","extract product data from e-commerce sites","Navigate e-commerce sites to extract products, pricing, categories, and inventory. Handles pagination, variants, and JS-heavy storefronts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1234,1236,1237],{"name":1235,"slug":1229,"type":15},"E-commerce",{"name":9,"slug":8,"type":15},{"name":1238,"slug":1239,"type":15},"Web Scraping","web-scraping","2026-05-15T06:15:30.880268",{"slug":1242,"name":1242,"fn":1243,"description":1244,"org":1245,"tags":1246,"stars":1213,"repoUrl":1214,"updatedAt":1255},"financial-research","pull financial data for public companies","Pull company financials, SEC filings, and analyst consensus for a public company. Use this skill whenever the user says \"10-K\", \"10-Q\", \"earnings\", \"revenue of\", \"financials for\", \"analyst rating for\", \"price target for\", or provides a stock ticker. Combines SEC EDGAR for official filings with Yahoo Finance \u002F TipRanks for analyst data. Search + scrape only; no interact needed.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1247,1250,1251,1252],{"name":1248,"slug":1249,"type":15},"Finance","finance",{"name":9,"slug":8,"type":15},{"name":1211,"slug":1212,"type":15},{"name":1253,"slug":1254,"type":15},"SEC Filings","sec-filings","2026-05-15T06:15:33.293957",{"slug":1257,"name":1257,"fn":1258,"description":1259,"org":1260,"tags":1261,"stars":1213,"repoUrl":1214,"updatedAt":1268},"pricing-tracker","track and compare vendor pricing tiers","Extract and normalize pricing tiers from any SaaS, API, cloud, or LLM vendor's pricing page. Use this skill whenever the user says \"pricing for X\", \"how much does X cost\", \"pricing tiers\", \"cost comparison\", provides a URL ending in `\u002Fpricing` or `\u002Fplans`, or asks to monitor pricing over time. Pairs well with `exportSkill` to turn a run into a cron-friendly workflow. Scrape-driven; no interact needed for typical pricing pages.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1262,1263,1264,1265],{"name":1207,"slug":1208,"type":15},{"name":9,"slug":8,"type":15},{"name":1211,"slug":1212,"type":15},{"name":1266,"slug":1267,"type":15},"SaaS","saas","2026-04-17T05:00:43.349332",{"slug":1270,"name":1270,"fn":1271,"description":1272,"org":1273,"tags":1274,"stars":1213,"repoUrl":1214,"updatedAt":1280},"structured-extraction","extract structured data from websites","Extract structured data matching a JSON schema from websites. Handles complex nested schemas, arrays, pagination, and validation. Always outputs via formatOutput.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1275,1278,1279],{"name":1276,"slug":1277,"type":15},"Data Engineering","data-engineering",{"name":9,"slug":8,"type":15},{"name":1238,"slug":1239,"type":15},"2026-05-15T06:15:32.092034",{"slug":1282,"name":1282,"fn":1283,"description":1284,"org":1285,"tags":1286,"stars":1293,"repoUrl":1294,"updatedAt":1295},"firecrawl-company-directories","extract company directories with Firecrawl","Extract structured company lists from directories with Firecrawl. Use for scraping YC, Crunchbase, Product Hunt, G2, startup directories, category directories, or custom company databases into JSON, CSV, CRM-ready lists, or research tables.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1287,1290,1291,1292],{"name":1288,"slug":1289,"type":15},"Automation","automation",{"name":1276,"slug":1277,"type":15},{"name":9,"slug":8,"type":15},{"name":1238,"slug":1239,"type":15},99,"https:\u002F\u002Fgithub.com\u002Ffirecrawl\u002Ffirecrawl-workflows","2026-06-30T07:02:21.468",{"slug":1297,"name":1297,"fn":1298,"description":1299,"org":1300,"tags":1301,"stars":1293,"repoUrl":1294,"updatedAt":1295},"firecrawl-competitive-intel","monitor competitor product changes with Firecrawl","Monitor competitor pricing, features, changelogs, dashboards, and product changes with Firecrawl. Use for recurring competitive intelligence, pricing tier extraction, feature change tracking, or structured competitor alerts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1302,1303,1304,1307],{"name":1207,"slug":1208,"type":15},{"name":9,"slug":8,"type":15},{"name":1305,"slug":1306,"type":15},"Marketing","marketing",{"name":1238,"slug":1239,"type":15},{"slug":1309,"name":1309,"fn":1310,"description":1311,"org":1312,"tags":1313,"stars":1293,"repoUrl":1294,"updatedAt":1295},"firecrawl-dashboard-reporting","pull metrics from analytics dashboards","Pull metrics from analytics dashboards and internal web tools with Firecrawl browser. Use when the user needs dashboard reporting, cross-platform metric summaries, authenticated analytics extraction, date-range reports, or structured metrics from web dashboards.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1314,1317,1320,1321,1324],{"name":1315,"slug":1316,"type":15},"Analytics","analytics",{"name":1318,"slug":1319,"type":15},"Dashboards","dashboards",{"name":9,"slug":8,"type":15},{"name":1322,"slug":1323,"type":15},"Reporting","reporting",{"name":1238,"slug":1239,"type":15},{"slug":1326,"name":1326,"fn":1327,"description":1328,"org":1329,"tags":1330,"stars":1293,"repoUrl":1294,"updatedAt":1295},"firecrawl-deep-research","conduct deep research with Firecrawl","Produce an intensive, cited analytical report: executive summary, multi-angle\nfindings, contrarian views, open questions, and full sources. Use only when the\nuser needs rigorous synthesis of a complex topic (scientific, technical, policy,\nor market-analytical) that cannot be answered with a short search, and wants\na formal written report, not a recommendation list.\n\nDo not use for product picks, top-N lists, quick lookups, or routine \"find out\nabout X\" tasks. If the request does not clearly need this kind of report, do\nnot use this skill.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1331,1332,1335,1336,1339],{"name":9,"slug":8,"type":15},{"name":1333,"slug":1334,"type":15},"Firecrawl Research","firecrawl-research",{"name":1211,"slug":1212,"type":15},{"name":1337,"slug":1338,"type":15},"Summarization","summarization",{"name":1238,"slug":1239,"type":15},{"slug":1341,"name":1341,"fn":1342,"description":1343,"org":1344,"tags":1345,"stars":1293,"repoUrl":1294,"updatedAt":1295},"firecrawl-demo-walkthrough","generate product walkthroughs with Firecrawl","Walk through a product's key flows with Firecrawl browser and produce a structured UX\u002Fproduct walkthrough. Use for signup, onboarding, pricing, docs, dashboard, product demo prep, UX teardown, and first-run experience analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1346,1347,1348,1351],{"name":1288,"slug":1289,"type":15},{"name":9,"slug":8,"type":15},{"name":1349,"slug":1350,"type":15},"UX Design","ux-design",{"name":1238,"slug":1239,"type":15},38,{"items":1354,"total":1428},[1355,1370,1385,1398,1409,1416],{"slug":1356,"name":1356,"fn":1357,"description":1358,"org":1359,"tags":1360,"stars":23,"repoUrl":24,"updatedAt":1369},"firecrawl-build-interact","integrate Firecrawl interact for browser actions","Integrate Firecrawl `\u002Finteract` into product code for dynamic pages and browser actions after scraping. Use when a feature needs clicks, form fills, pagination, authentication-aware flows, or other multi-step interactions that plain `\u002Fscrape` cannot complete.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1361,1364,1367,1368],{"name":1362,"slug":1363,"type":15},"API Development","api-development",{"name":1365,"slug":1366,"type":15},"Browser Automation","browser-automation",{"name":9,"slug":8,"type":15},{"name":1238,"slug":1239,"type":15},"2026-04-09T04:48:12.802517",{"slug":1371,"name":1371,"fn":1372,"description":1373,"org":1374,"tags":1375,"stars":23,"repoUrl":24,"updatedAt":1384},"firecrawl-build-onboarding","configure Firecrawl credentials and SDK","Get Firecrawl credentials and SDK setup into a project. Use when an application needs `FIRECRAWL_API_KEY`, when an agent should add Firecrawl to `.env`, when the user wants to authenticate Firecrawl for app code, or when choosing the first SDK and docs for a new Firecrawl integration. This skill includes its own browser auth flow, so it does not depend on the website onboarding skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1376,1377,1380,1381],{"name":1362,"slug":1363,"type":15},{"name":1378,"slug":1379,"type":15},"Authentication","authentication",{"name":9,"slug":8,"type":15},{"name":1382,"slug":1383,"type":15},"SDK","sdk","2026-04-09T04:48:11.560192",{"slug":1386,"name":1386,"fn":1387,"description":1388,"org":1389,"tags":1390,"stars":23,"repoUrl":24,"updatedAt":1397},"firecrawl-build-scrape","integrate Firecrawl scrape for page extraction","Integrate Firecrawl `\u002Fscrape` into product code for single-page extraction. Use when an app already has a URL and needs markdown, HTML, links, screenshots, metadata, or structured page output. Prefer this skill over broader crawl patterns when the feature is page-level.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1391,1392,1393,1396],{"name":1362,"slug":1363,"type":15},{"name":9,"slug":8,"type":15},{"name":1394,"slug":1395,"type":15},"Frontend","frontend",{"name":1238,"slug":1239,"type":15},"2026-04-09T04:48:09.157956",{"slug":1399,"name":1399,"fn":1400,"description":1401,"org":1402,"tags":1403,"stars":23,"repoUrl":24,"updatedAt":1408},"firecrawl-build-search","integrate Firecrawl search for discovery","Integrate Firecrawl `\u002Fsearch` into product code and agent workflows. Use when an app needs discovery before extraction, when the feature starts with a query instead of a URL, or when the system should search the web and optionally hydrate result content.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1404,1405,1406,1407],{"name":1362,"slug":1363,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":1238,"slug":1239,"type":15},"2026-04-09T04:48:10.362305",{"slug":4,"name":4,"fn":5,"description":6,"org":1410,"tags":1411,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1412,1413,1414,1415],{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"slug":1417,"name":1417,"fn":1418,"description":1419,"org":1420,"tags":1421,"stars":23,"repoUrl":24,"updatedAt":1427},"firecrawl-research-index","find research papers with semantic search","Find the papers that answer a research query with Firecrawl Research, using semantic search, semantic and structural expansion, and in-body verification. Always use this skill for any literature-finding \u002F paper-retrieval task — single-paper lookups or full multi-paper sets.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1422,1423,1424,1425,1426],{"name":9,"slug":8,"type":15},{"name":1333,"slug":1334,"type":15},{"name":1211,"slug":1212,"type":15},{"name":18,"slug":19,"type":15},{"name":1238,"slug":1239,"type":15},"2026-06-17T08:17:26.76664",6]