Skills
Chapter 6 of 7
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…
5 minutes · 1,032 words · 4 sections
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.
There 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.
HTTP: GET|POST https://api.firecrawl.dev/v2/search/developer
MCP: firecrawl_developer_search(query, k?, skills?)
CLI: firecrawl developer <query> [--limit <n>] [--skills-only]
Ranked results over the whole index. Each carries id (issue:owner/repo#123), type (doc | issue | pull_request | readme), url, title, and the matched passages in markdown, so tables and code blocks survive.
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.
k / --limit is 1–100 and defaults to 10. skills="only" / --skills-only restricts the search to agent-skill files.
Keyless; send Authorization: Bearer $FIRECRAWL_API_KEY for higher rate limits.
MCP: firecrawl_search(query, categories: ["developer"])
CLI: firecrawl search <query> --categories developer
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.
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.
MCP: firecrawl_scrape(url) / firecrawl_search(query)
CLI: firecrawl scrape <url> / firecrawl search <query>
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.
Also the follow-through when a hit is the right page but you need all of it — scrape the result’s url.
Only the HTTP surface takes these. On GET, pass types=issue,pull_request or repeat the parameter; on POST, pass arrays. All are optional.
types — which of doc, issue, pull_request, readme to search. Defaults to all four. Narrowing here is the cheapest way to sharpen a query.repos (owner/name) 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”.type is a 400, not an empty list: repos with no repository type in types, or sources without doc.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.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.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.doc or a readme; raise passages before raising k.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.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.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.repos=["owner/name"] 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.language / topic / min_stars to keep to maintained repositories, accepting that this gives up all doc results.skills="only" / --skills-only.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.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.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.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.Install this repository
npx skills add firecrawl/skills/plugin marketplace add firecrawl/skillsSkills install per repository, not per chapter — the CLI has no documented per-skill form, so we do not print one.
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.
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
main, last pushed 6 August 2026.SKILL.md, not by matching a directory convention. One layout observed: skills/*/SKILL.md.h1 and no skipped levels:.claude-plugin/marketplace.json by Firecrawl, declaring 1 plugin. It is read for editorial metadata only — never as the skill index, which is always the repository tree./firecrawl/skills.md, and each chapter at its own .md URL.