Skip to content
Draft
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
1b0eb40
feat(mcp): bound tool response outputs with response_format and conti…
chenxin-yan Aug 20, 2026
a6d966b
feat(mcp): structured agent-legible errors and in-band empty-result f…
chenxin-yan Aug 20, 2026
8c1bf20
fix(mcp): local keyless tools/list matches the callable tool set
chenxin-yan Aug 20, 2026
b8c22e2
fix(mcp): preserve zod parameter descriptions in tools/list serializa…
chenxin-yan Aug 20, 2026
2ea6f6c
docs(mcp): describe all tool parameters in agent-visible schemas
chenxin-yan Aug 20, 2026
11f8520
refactor(mcp): trim tool descriptions to lean coverage and boundaries
chenxin-yan Aug 20, 2026
928222a
fix(mcp): enforce total output caps and harden error classification
chenxin-yan Aug 20, 2026
8223468
fix(mcp): provide offset continuation for single-page crawl truncation
chenxin-yan Aug 20, 2026
dcf19a8
fix(mcp): classify domain-policy rejections as UNSUPPORTED_SITE
chenxin-yan Aug 21, 2026
4bf7792
fix(mcp): bound crawl continuation pages and make partial pages resum…
chenxin-yan Aug 21, 2026
cf6a932
refactor(mcp): apply type-safety and dedup review fixes to index
chenxin-yan Aug 21, 2026
e926b70
refactor(mcp): dedup monitor research developer and test helpers
chenxin-yan Aug 21, 2026
1589d0c
fix(mcp): restore tsc gate after dedup refactor
chenxin-yan Aug 21, 2026
1f18740
fix(mcp): give AUTH_REQUIRED recovery an agent-actionable fallback
chenxin-yan Aug 21, 2026
366cb7b
refactor(mcp): remove response_format, keep single bounded output pro…
chenxin-yan Aug 22, 2026
f98fe9c
fix(mcp): non-idempotent tools no longer advertise retryable on uncla…
chenxin-yan Aug 22, 2026
32701e4
fix(mcp): restore non-empty queries qualifier; await SIGKILL in test …
chenxin-yan Aug 22, 2026
d77be3e
fix(mcp): classify threat-protection blocks as UNSUPPORTED_SITE
chenxin-yan Aug 22, 2026
e6b8c44
fix(mcp): never return next:null on truncated crawls; classify errors…
chenxin-yan Aug 22, 2026
1690f93
fix(mcp): widen non-idempotent set; classify threat-protection by sta…
chenxin-yan Aug 22, 2026
dc552cf
refactor(mcp): remove duplicated types and test boilerplate flagged b…
chenxin-yan Aug 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
"@mendable/firecrawl-js": "4.25.2",
"dotenv": "^17.2.2",
"fastmcp": "4.3.2",
"zod": "^4.1.5"
"zod": "4.1.13"
},
"engines": {
"node": ">=22.0.0"
Expand Down
71 changes: 31 additions & 40 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions pnpm-workspace.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,8 @@ allowBuilds:
esbuild: true
tldjs: true

overrides:
Comment thread
chenxin-yan marked this conversation as resolved.
zod: 4.1.13

patchedDependencies:
fastmcp@4.3.2: patches/fastmcp@4.3.2.patch
25 changes: 6 additions & 19 deletions src/developer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,30 +12,19 @@

import { z } from 'zod';
import type { FastMCP } from 'fastmcp';
import {
type ClientLike,
type GetClient,
ORIGIN_HEADERS,
} from './research';

interface SessionData {
firecrawlApiKey?: string;
[key: string]: unknown;
}

/** Whatever `getClient` returns — we only touch its `http.get`. */
type ClientLike = {
http: {
get: <T = unknown>(
endpoint: string,
headers?: Record<string, string>
) => Promise<{ data: T; status: number }>;
};
};

// `getClient` returns a FirecrawlApp whose `http` member is private, so we type
// the callback loosely and narrow to `ClientLike` at each call site.
type GetClient = (session?: SessionData) => unknown;

// The other mount, /v2/developer/search, may be withdrawn.
const BASE = '/v2/search/developer';
const ORIGIN_HEADERS = { 'X-Origin': 'mcp-fastmcp' };


interface DeveloperHit {
/** Stable result id, e.g. `issue:owner/repo#123` or `doc:<hash>`. */
Expand Down Expand Up @@ -87,9 +76,7 @@ export function registerDeveloperTools(
destructiveHint: false, // Query-only; no writes to external sources or the developer index.
},
description: `
For a developer question — code behaviour, a library or framework, an API contract, an error message, or a known bug — search an index built for coding agents. The index covers GitHub issues, merged pull requests, repository READMEs, and curated documentation sites. Set skills to "only" to limit the search to agent-skill files.

Returns ranked results with an ID, source type, URL, title, and the matched passages in markdown.
Search indexed GitHub issues, merged pull requests, READMEs, and documentation for a developer question. Use this for code behavior, API contracts, errors, or known bugs rather than general web results.
`,
parameters: z.object({
query: z
Expand Down
Loading