Skip to main content
Glama
Firecrawl MCP Server

Firecrawl MCP Server

Firecrawl search feedback

firecrawl_search_feedback

Records schema-validated quality feedback for a prior search ID to rate useful results, flag missing content, and check credit refund eligibility.

Instructions

Records schema-validated quality feedback for a prior firecrawl_search UUID searchId. A good rating requires a valuable result or a valuable source, partial either of those or at least one missingContent entry, and bad at least one missingContent entry or a query suggestion; caps are 50 valuableResults, 50 valuableSources, and 20 missingContent entries.

Eligibility is limited to successful searches within the feedback age window. The record is idempotent per search ID. Eligible first feedback for a search can refund 1 credit; refunds are subject to the team's daily cap. The response reports whether a refund was applied, along with submission and daily-cap status.

Mark useful returned results in valuableResults as {"source", "position"} copied off the result. Groups are numbered from 1 independently, so {"source":"web","position":1} and {"source":"news","position":1} are different results. Be exhaustive — results you do not list are treated as not useful. Reserve valuableSources for useful URLs that were NOT among the returned results; never report one result in both fields.

Input Schema

NameRequiredDescriptionDefault
ratingYes
searchIdYes
missingContentNoArray of specific pieces of content the agent expected to find but did not. One entry per distinct topic. Each entry has a short `topic` and optional longer `description`.
valuableResultsNoEvery result that was actually useful, copied from the `source` and `position` stamped on each result. Each group is numbered from 1 independently, so the source is required — `{"source":"web","position":1}` and `{"source":"news","position":1}` are different results. Be exhaustive — unlisted results are treated as not useful. Do not also list the same results in valuableSources.
valuableSourcesNo
querySuggestionsNo

Output Schema

NameRequiredDescriptionDefault
rawNoResponse body when it was not JSON.
dataNoPayload returned with the accepted feedback.
errorNoError message or error object when the call did not succeed.
statusNoHTTP status when the submission was rejected.
messageNoHuman-readable result of the submission.
successNoWhether the API call succeeded.
warningNoNon-fatal warning about the result.
retryableNoWhether retrying the submission can succeed.
feedbackIdNoIdentifier of the recorded feedback.
dailyRefundCapNoThe team's daily refund cap in credits.
creditsRefundedNoCredits refunded for this submission, when eligible.
dailyCapReachedNoWhether the daily refund cap is reached; further feedback today still records but refunds nothing.
alreadySubmittedNoWhether feedback for this job was already recorded.
feedbackErrorCodeNoMachine-readable reason the submission was rejected.
websiteCapReachedNoAlexandria only: whether this website's daily refund cap is reached; feedback about other websites can still refund.
creditsRefundedTodayNoCredits refunded to the team so far this UTC day.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changedv1.0.2
    • changedInput schema / $schema
      Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
    • removedInput schema / properties / missingContent / items / additionalProperties
      Removed value: -false
    • addedInput schema / properties / valuableResults
      Added value: +{
      +  "description": "Every result that was actually useful, copied from the `source` and `position` stamped on each result. Each group is numbered from 1 independently, so the source is required — `{\"source\":\"web\",\"position\":1}` and `{\"source\":\"news\",\"position\":1}` are different results. Be exhaustive — unlisted results are treated as not useful. Do not also list the same results in valuableSources.",
      +  "items": {
      +    "properties": {
      +      "position": {
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "type": "integer"
      +      },
      +      "reason": {
      +        "maxLength": 1000,
      +        "type": "string"
      +      },
      +      "source": {
      +        "enum": [
      +          "web",
      +          "images",
      +          "news"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "source",
      +      "position"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 50,
      +  "type": "array"
      +}
    • removedInput schema / properties / valuableSources / items / additionalProperties
      Removed value: -false
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "description": "Result of submitting feedback.",
      +  "properties": {
      +    "alreadySubmitted": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Whether feedback for this job was already recorded."
      +    },
      +    "creditsRefunded": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Credits refunded for this submission, when eligible."
      +    },
      +    "creditsRefundedToday": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Credits refunded to the team so far this UTC day."
      +    },
      +    "dailyCapReached": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Whether the daily refund cap is reached; further feedback today still records but refunds nothing."
      +    },
      +    "dailyRefundCap": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The team's daily refund cap in credits."
      +    },
      +    "data": {
      +      "description": "Payload returned with the accepted feedback."
      +    },
      +    "error": {
      +      "description": "Error message or error object when the call did not succeed."
      +    },
      +    "feedbackErrorCode": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Machine-readable reason the submission was rejected."
      +    },
      +    "feedbackId": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Identifier of the recorded feedback."
      +    },
      +    "message": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Human-readable result of the submission."
      +    },
      +    "raw": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Response body when it was not JSON."
      +    },
      +    "retryable": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Whether retrying the submission can succeed."
      +    },
      +    "status": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "HTTP status when the submission was rejected."
      +    },
      +    "success": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Whether the API call succeeded."
      +    },
      +    "warning": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Non-fatal warning about the result."
      +    },
      +    "websiteCapReached": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Alexandria only: whether this website's daily refund cap is reached; feedback about other websites can still refund."
      +    }
      +  },
      +  "type": "object"
      +}
  2. First observedv1.0.1

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing idempotency, credit-refund eligibility with a daily team cap, and what the response reports (refund applied, submission and daily-cap status). It also warns of a consequential side effect of the data model — unlisted results are treated as not useful — which an agent could not infer from `destructiveHint: false` alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense paragraphs, front-loaded with purpose and eligibility before the field mechanics. Some material (the source/position grouping explanation) duplicates the schema's own `valuableResults` description, which is mild redundancy rather than bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter tool with an output schema, the description covers eligibility, rating validity, caps, refund behavior, and the two main array fields. The unused `querySuggestions` parameter and the `reason` sub-fields remain undocumented, a modest gap given the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 33% schema description coverage, the description compensates well: it explains the `{source, position}` pairing for `valuableResults`, the independent numbering per source group, and the rule that `valuableSources` is reserved for URLs not among returned results. It leaves `querySuggestions` and the `reason` fields unexplained, so coverage is strong but not complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — records schema-validated quality feedback — and ties it to a prior `firecrawl_search` UUID `searchId`, which separates it from the generic `firecrawl_feedback` sibling. An agent can identify the operation and its input source without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit preconditions (must follow a successful search, within the feedback age window, idempotent per search ID) and defines the criteria that make a `good`, `partial`, or `bad` rating valid. It does not explicitly route against the sibling `firecrawl_feedback` tool, so the alternative-selection guidance is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.