Skip to main content
Glama

Codex MCP Server

by cexll
fetch-chunk.md7.24 kB
# fetch-chunk Tool Retrieve cached chunks from large changeMode responses. ## Overview The `fetch-chunk` tool handles pagination for large structured edit responses. When a changeMode request returns more data than can be sent in a single response, it's split into chunks that can be retrieved sequentially. ## Syntax ```javascript { "name": "fetch-chunk", "arguments": { "cacheKey": "string", // Required "chunkIndex": "number" // Required } } ``` ## Parameters ### cacheKey (required) - **Type:** `string` - **Description:** The cache key provided in the initial changeMode response - **Example:** `"a3f2c8d1"` - **Source:** Returned from initial `ask-codex` call with `changeMode: true` ### chunkIndex (required) - **Type:** `number` - **Minimum:** `1` (1-based indexing) - **Description:** Which chunk to retrieve - **Example:** `2` for the second chunk ## How Chunking Works ### 1. Initial Request Large refactoring request: ```javascript { "name": "ask-codex", "arguments": { "prompt": "refactor all components to use TypeScript", "changeMode": true } } ``` ### 2. Initial Response ```javascript { "status": "partial", "cacheKey": "refactor-2024-abc123", "totalChunks": 5, "currentChunk": 1, "content": "... first chunk of edits ...", "hasMore": true } ``` ### 3. Fetch Remaining Chunks ```javascript // Get chunk 2 { "name": "fetch-chunk", "arguments": { "cacheKey": "refactor-2024-abc123", "chunkIndex": 2 } } // Get chunk 3 { "name": "fetch-chunk", "arguments": { "cacheKey": "refactor-2024-abc123", "chunkIndex": 3 } } // Continue until all chunks retrieved ``` ## Examples ### Complete Refactoring Flow ```javascript // Step 1: Start refactoring const initial = { name: 'ask-codex', arguments: { prompt: 'convert @src/**/*.js to TypeScript', changeMode: true, model: 'gpt-5', }, }; // Returns: { cacheKey: "ts-convert-xyz", totalChunks: 8, ... } // Step 2: Retrieve all chunks for (let i = 2; i <= 8; i++) { const chunk = { name: 'fetch-chunk', arguments: { cacheKey: 'ts-convert-xyz', chunkIndex: i, }, }; // Process each chunk } ``` ### Handling Large Codebase Analysis ```javascript // Initial analysis { "name": "ask-codex", "arguments": { "prompt": "add comprehensive JSDoc to @src/", "changeMode": true } } // Returns: { cacheKey: "jsdoc-abc", totalChunks: 12, ... } // Fetch specific chunk { "name": "fetch-chunk", "arguments": { "cacheKey": "jsdoc-abc", "chunkIndex": 5 } } ``` ## Response Format The fetch-chunk tool returns formatted text (not JSON) containing the edits for the requested chunk: ### Successful Chunk Retrieval ``` [CHANGEMODE OUTPUT - Chunk 2 of 5] This chunk contains 8 complete edits that can be applied independently. Edit 1 of 8: FILE: src/components/Button.tsx:15 OLD: class Button extends React.Component { render() { return <button>{this.props.label}</button>; } } NEW: const Button: React.FC<{label: string}> = ({label}) => { return <button>{label}</button>; }; [Additional edits...] Next Step: To fetch the next chunk, use: fetch-chunk cacheKey=abc12345 chunkIndex=3 ``` ### Final Chunk ``` [CHANGEMODE OUTPUT - Chunk 5 of 5] This is the final chunk containing 3 edits. [Edit details...] All edits have been provided. Total: 42 modifications across 5 chunks. ``` ### Error Response ``` Error: Cache key not found or expired The chunks for this operation are no longer available. Please re-run the original request to generate new chunks. ``` ## Cache Management ### Cache Duration - Chunks are cached for **10 minutes** after creation - Cache persists until TTL expires (not auto-cleared after retrieval) - Cache cleared on server restart ### Cache Key Format - Format: First 8 characters of SHA-256 hash of the prompt - Example: `a3f2c8d1` - Deterministic based on prompt content ### Cache Limits - Maximum 50 cache files system-wide - Automatic cleanup of expired caches (10-minute TTL) - Cache stored in temporary directory ## Best Practices ### 1. Sequential Retrieval Retrieve chunks in order: ```javascript // Good: Sequential for (let i = 2; i <= totalChunks; i++) { await fetchChunk(cacheKey, i); } // Avoid: Random access await fetchChunk(cacheKey, 5); // May miss context ``` ### 2. Handle Expiration ```javascript try { const chunk = await fetchChunk(cacheKey, index); } catch (error) { if (error.includes('expired')) { // Re-run original request const fresh = await askCodex(originalPrompt); } } ``` ### 3. Process Incrementally Apply changes as chunks arrive: ```javascript // Process each chunk immediately const processChunk = chunk => { applyEdits(chunk.content); if (chunk.hasMore) { fetchNext(); } }; ``` ## Common Scenarios ### Large File Refactoring ```javascript // Refactor large file { "name": "ask-codex", "arguments": { "prompt": "split @src/monolith.ts into modules", "changeMode": true } } // Expect multiple chunks for file splits ``` ### Codebase-wide Changes ```javascript // Update imports across codebase { "name": "ask-codex", "arguments": { "prompt": "update all imports to use path aliases", "changeMode": true } } // May return 10+ chunks for large codebases ``` ### Documentation Generation ```javascript // Generate docs for entire API { "name": "ask-codex", "arguments": { "prompt": "document all endpoints in @src/api/", "changeMode": true } } // Chunks split by file or module ``` ## Error Handling ### Common Errors | Error | Cause | Solution | | ------------------------- | ---------------------- | ----------------------- | | `Cache key not found` | Key expired or invalid | Re-run original request | | `Invalid chunk index` | Index out of range | Check totalChunks value | | `Cache expired` | 10-minute timeout | Re-run original request | | `Chunk already retrieved` | Duplicate request | Continue to next chunk | ### Recovery Strategy ```javascript const safeChunkFetch = async (cacheKey, index, originalRequest) => { try { return await fetchChunk(cacheKey, index); } catch (error) { console.log('Cache miss, restarting...'); return await askCodex(originalRequest); } }; ``` ## Performance Tips ### 1. Chunk Size Optimization - Average chunk: ~50KB of edit data - Large files split across multiple chunks - Small edits may fit in single response ### 2. Parallel Processing ```javascript // Process while fetching const pipeline = async (cacheKey, total) => { const fetcher = fetchAllChunks(cacheKey, total); const processor = processChunks(fetcher); await Promise.all([fetcher, processor]); }; ``` ### 3. Memory Management - Clear processed chunks from memory - Stream to file for very large operations - Monitor memory usage for long sessions ## Related Tools - [ask-codex](./ask-codex.md) - Initial changeMode requests - [timeout-test](./timeout-test.md) - Test long operations ## See Also - [How It Works](../../concepts/how-it-works.md) - [Advanced Usage](../../examples/advanced-usage.md) - [API Reference](../tools/ask-codex.md)

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cexll/codex-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server