From 573bed613cba3ed80c483c0f2aa01521ca30670d Mon Sep 17 00:00:00 2001 From: Nicolas <20311743+nickscamara@users.noreply.github.com> Date: Fri, 2 Oct 2026 11:42:43 -0700 Subject: [PATCH] fix: make objective optional in Alexandria session feedback 3.27.1 required objective at runtime while the advertised tool schema marked it optional, so agents that omitted it had their feedback rejected before it reached the API. The API already accepts feedback without an objective. Bump to 3.27.3. Co-authored-by: Cursor --- README.md | 2 +- gemini-extension.json | 2 +- package.json | 2 +- src/alexandria-feedback.ts | 1 - tests/mcp-smoke.test.mjs | 6 +++++- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8ce8c809..2e1f0bdc 100644 --- a/README.md +++ b/README.md @@ -1287,7 +1287,7 @@ The existing `firecrawl_feedback` tool accepts `endpoint: "alexandria"`: } ``` -`objective` is the underlying goal of the session: what the agent or its user was ultimately trying to accomplish, beyond the single website in `requestedWebsite`. +The optional `objective` is the underlying goal of the session: what the agent or its user was ultimately trying to accomplish, beyond the single website in `requestedWebsite`. This uses authenticated `POST /v2/feedback`, without a job ID, job-age deadline, or credit refund. Optional `providerFeedback` and `capabilityFeedback` arrays describe coverage gaps and execution issues; the tool schema lists supported issue values. A `new_capability_request` requires `requestedFunctionality`; `missing_capability` (the provider exists but lacks the capability) does not. Existing feedback opt-out and authentication controls apply. diff --git a/gemini-extension.json b/gemini-extension.json index 2c8d4fa8..15a06afd 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,6 +1,6 @@ { "name": "firecrawl", - "version": "3.27.2", + "version": "3.27.3", "description": "Official Firecrawl MCP for web search, scraping, crawling, and structured data extraction.", "mcpServers": { "firecrawl": { diff --git a/package.json b/package.json index 372bca4c..0b07fd58 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "firecrawl-mcp", - "version": "3.27.2", + "version": "3.27.3", "description": "MCP server for Firecrawl — search, scrape, and interact with the web, and search scientific papers. Supports both cloud and self-hosted instances. Features include web search, scraping, page interaction, batch processing, LLM-powered content analysis, and research paper search over biomedical and arXiv literature (PubMed, bioRxiv, medRxiv, arXiv) with citation-graph expansion and full-text reading.", "type": "module", "mcpName": "io.github.firecrawl/firecrawl-mcp-server", diff --git a/src/alexandria-feedback.ts b/src/alexandria-feedback.ts index bc4871dc..9976865e 100644 --- a/src/alexandria-feedback.ts +++ b/src/alexandria-feedback.ts @@ -102,5 +102,4 @@ export const alexandriaSessionFeedbackSchema = z.strictObject({ ...alexandriaFeedbackFields, requestedWebsite: alexandriaFeedbackFields.requestedWebsite.unwrap(), rationale: detail, - objective: detail, }); diff --git a/tests/mcp-smoke.test.mjs b/tests/mcp-smoke.test.mjs index 69cf13c5..47afff78 100644 --- a/tests/mcp-smoke.test.mjs +++ b/tests/mcp-smoke.test.mjs @@ -1891,10 +1891,14 @@ test('stdio transport calls Firecrawl API through a tool end to end', async (t) assert.notEqual(missingCapabilityResult.isError, true); const sentMissingCapability = fakeApi.requests.filter(request => request.url === '/v2/feedback').at(-1).body; assert.deepEqual(sentMissingCapability, { ...missingCapabilityFeedback, origin: sentMissingCapability.origin }); + const { objective: _objective, ...withoutObjective } = sessionFeedback; + const withoutObjectiveResult = await client.request('tools/call', { name: 'firecrawl_feedback', arguments: withoutObjective }); + assert.notEqual(withoutObjectiveResult.isError, true); + const sentWithoutObjective = fakeApi.requests.filter(request => request.url === '/v2/feedback').at(-1).body; + assert.deepEqual(sentWithoutObjective, { ...withoutObjective, origin: sentWithoutObjective.origin }); for (const invalid of [ { endpoint: 'scrape', rating: 'good' }, { endpoint: 'alexandria', rating: 'good' }, - { ...sessionFeedback, objective: undefined }, { ...sessionFeedback, objective: ' ' }, { ...sessionFeedback, jobId: '00000000-0000-4000-8000-000000000010' }, { ...sessionFeedback, capabilityFeedback: [{ name: 'attachments', provider: 'example', issue: 'new_capability_request', why: 'Missing attachments' }] },