fetch_json
Retrieve JSON data from a specified URL using the Fetch MCP Server. Supports optional headers, character limits, and start indices for precise content extraction.
Instructions
Fetch a JSON file from a URL
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| headers | No | Optional headers to include in the request | |
| max_length | No | Maximum number of characters to return (default: 5000) | |
| start_index | No | Start content from this character index (default: 0) | |
| url | Yes | URL of the JSON to fetch |
Implementation Reference
- src/Fetcher.ts:67-89 (handler)The primary handler function that fetches the JSON from the provided URL, parses it into an object, stringifies it back to apply length limits if specified, and returns the content wrapped in the expected MCP format or an error message.static async json(requestPayload: RequestPayload) { try { const response = await this._fetch(requestPayload); const json = await response.json(); let jsonString = JSON.stringify(json); // Apply length limits jsonString = this.applyLengthLimits( jsonString, requestPayload.max_length ?? 5000, requestPayload.start_index ?? 0 ); return { content: [{ type: "text", text: jsonString }], isError: false, }; } catch (error) { return { content: [{ type: "text", text: (error as Error).message }], isError: true, }; }
- src/index.ts:148-150 (registration)Registers the tool handler by dispatching calls to 'fetch_json' to the Fetcher.json method after validation.if (request.params.name === "fetch_json") { const fetchResult = await Fetcher.json(validatedArgs); return fetchResult;
- src/index.ts:109-134 (schema)Tool registration in the listTools response, including the name, description, and input schema definition for fetch_json.{ name: "fetch_json", description: "Fetch a JSON file from a URL", inputSchema: { type: "object", properties: { url: { type: "string", description: "URL of the JSON to fetch", }, headers: { type: "object", description: "Optional headers to include in the request", }, max_length: { type: "number", description: `Maximum number of characters to return (default: ${downloadLimit})`, }, start_index: { type: "number", description: "Start content from this character index (default: 0)", }, }, required: ["url"], }, },
- src/types.ts:5-10 (schema)Zod schema used to validate and parse the input arguments for the fetch_json tool (and others).export const RequestPayloadSchema = z.object({ url: z.string().url(), headers: z.record(z.string()).optional(), max_length: z.number().int().min(0).optional().default(downloadLimit), start_index: z.number().int().min(0).optional().default(0), });
- src/Fetcher.ts:15-44 (helper)Shared helper method for performing the actual HTTP fetch with security checks (blocks private IPs) and error handling, used by all fetch tools including json.private static async _fetch({ url, headers, }: RequestPayload): Promise<Response> { try { if (is_ip_private(url)) { throw new Error( `Fetcher blocked an attempt to fetch a private IP ${url}. This is to prevent a security vulnerability where a local MCP could fetch privileged local IPs and exfiltrate data.`, ); } const response = await fetch(url, { headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", ...headers, }, }); if (!response.ok) { throw new Error(`HTTP error: ${response.status}`); } return response; } catch (e: unknown) { if (e instanceof Error) { throw new Error(`Failed to fetch ${url}: ${e.message}`); } else { throw new Error(`Failed to fetch ${url}: Unknown error`); } } }