Files
Himadri Mishra 2ca018dcf8 fix: disambiguate research paper tools from the research category (#368)
* fix(mcp): disambiguate research paper tools from the research category

Why: measured over 40 agent traces, two features answer to "research" —
the paper index reached via firecrawl_research_*, and firecrawl_search
with categories: ["research"], which is only a website filter. Agents
picked the website filter on biomedical tasks and never called the paper
tools.

Summary:
- categories enum describe now states that `research` filters ordinary
  web results to research-affiliated websites, separate from the paper
  tools.
- FULL, KEYLESS, and SEARCH profile instructions each gained a neutral
  boundary sentence naming the two surfaces.
- search_papers description restores biomedical coverage (PubMed,
  bioRxiv, medRxiv) alongside arXiv, plus a multi-framing line.
- related_papers title is no longer arXiv-specific.
- Escape-free rewrite of the boundary sentence in FULL/KEYLESS: the
  backticks around `research` terminated the enclosing template literal
  and broke the TypeScript parse. Uses the categories: ["research"] form
  already used by SEARCH_PROFILE_INSTRUCTIONS.

* fix(mcp): put the research disambiguation where agents can read it

Why: the categories enum `.describe()` never reaches an agent. Every
parameter description is stripped during schema serialization — a dump
of tools/list shows 0 of 156 property descriptions across all 26 tools
survive. The disambiguation therefore had no agent-visible carrier on
the firecrawl_search side.

Summary:
- Add a `categories: ["research"]` paragraph to the firecrawl_search
  tool description, mirroring the existing `["developer"]` paragraph.
  It states what the website filter does and that firecrawl_research_*
  is a separate surface over PubMed/bioRxiv/medRxiv/arXiv.
- Retarget the smoke-test assertion for search_papers onto the new
  biomedical coverage text, and pin both the tool description and the
  initialize instructions so the boundary cannot silently regress.

The categories `.describe()` edit is kept: it is correct, it documents
the field for readers of the source, and it costs nothing.

* docs(readme): separate paper research from the research website filter

Why: the README taught the exact confusion the tool metadata was fixing.
The worked firecrawl_search example was a paper-search query ("latest AI
research papers 2023") shown served by plain web search, the "How to
Choose a Tool" list had a bullet for every tool except research, and
Section 12 was the thinnest tool section with no statement of what the
paper index actually covers.

Summary:
- Replace the search worked example and its prompt example with a
  genuinely web-shaped query, and cross-reference the research tools.
- Add a research bullet to "How to Choose a Tool" that names the two
  surfaces.
- Section 12 gains a "Covers:" line (PubMed, bioRxiv, medRxiv, arXiv),
  per-tool bullets that say what each tool does, and a disambiguation
  sentence mirroring Section 14's developer-index pattern.

* chore: 3.24.0 — add research vocabulary to package metadata

Why: the npm and MCP-registry listings described only web search and
scraping, so the paper-search tools were invisible to anyone searching
for "pubmed", "arxiv", or "literature search". Registry copy is the
first discovery surface, before any tool description is ever loaded.

Summary:
- package.json description now names research paper search over
  biomedical and arXiv literature, citation-graph expansion, and
  full-text reading.
- Add research, paper-search, literature-search, biomedical, pubmed,
  and arxiv keywords.
- Minor bump to 3.24.0: agent-visible behaviour changes (tool
  descriptions and server instructions), no API change.
- server.json was stale at 3.23.6 in both the top-level and package
  version fields; both now track package.json at 3.24.0, and its
  description picks up the same vocabulary (83 chars, within the
  registry limit).

* docs(readme): describe search_github by what it actually indexes

Why: the bullet said "public code repositories", but the tool searches
indexed GitHub issue, pull-request, and README content. Matching the
tool description keeps the README from setting the wrong expectation.

* fix(mcp): keep keyless instructions accurate to the keyless tool surface

The boundary sentence added in 913341e told every reader of
KEYLESS_PROFILE_INSTRUCTIONS to reach for the firecrawl_research_* tools
on biomedical questions. That profile also serves keyless sessions, where
tools/list is exactly KEYLESS_TOOL_NAMES (firecrawl_scrape,
firecrawl_search, firecrawl_parse) and guardHostedTool rejects every
research call with KEYLESS_TOOL_NOT_AVAILABLE. The instructions were
recommending tools the client can neither see nor call.

Rewrite the keyless variant so it leads with the surface that is actually
reachable -- firecrawl_search with categories: ["research"] as a filter
over ordinary web results -- and presents the paper index as something an
OAuth connection or Authorization bearer API key makes available. The
condition is phrased on the credential, not on absence, so the same string
still reads correctly for the API-key sessions this profile also serves,
where the research tools do list and do run.

FULL_PROFILE_INSTRUCTIONS keeps its sentence unchanged: the account
surface exposes those tools.

The pinned smoke assertion is replaced by two, one per half of the
corrected boundary, so neither the reachable-now surface nor the
authentication gate can silently regress.

Verified: findAgentMetadataPolicyViolations returns [] for the new
sentence and for the whole string; npx tsc --noEmit clean; npm run lint
clean; npm test 71/71.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-12 21:11:18 +05:30

31 lines
850 B
JSON

{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "io.github.firecrawl/firecrawl-mcp-server",
"title": "Firecrawl MCP Server",
"description": "MCP server for Firecrawl — web search, scraping, and biomedical/arXiv paper search.",
"version": "3.24.0",
"repository": {
"url": "https://github.com/firecrawl/firecrawl-mcp-server.git",
"source": "github"
},
"packages": [
{
"registryType": "npm",
"identifier": "firecrawl-mcp",
"version": "3.24.0",
"transport": {
"type": "stdio"
},
"environmentVariables": [
{
"description": "Your API key for Firecrawl",
"isRequired": false,
"format": "string",
"isSecret": true,
"name": "FIRECRAWL_API_KEY"
}
]
}
]
}