csb_parse_deck_text
Parse plain-text decklists into Magic: The Gathering cards using Commander Spellbook to identify cards from text entries.
Instructions
Parse a plain-text decklist into cards using Commander Spellbook.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Plain-text deck list, e.g. '1x Sol Ring' per line |
Implementation Reference
- src/mcp-server.ts:433-436 (handler)The main handler function for the csb_parse_deck_text tool, which calls CSB.parseCardListFromText to parse the deck text and returns structured content.async ({ text }: { text: string }) => { const res = (await CSB.parseCardListFromText(text)) as any; return { structuredContent: res } as any; }
- src/mcp-server.ts:418-424 (schema)Input schema (deck text string) and output schema (arrays of cards with quantities for main and optional commanders).const csbParseDeckInput = { text: z.string().min(1).describe("Plain-text deck list, e.g. '1x Sol Ring' per line") } as const; const csbParseDeckOutput = { main: z.array(z.object({ card: z.string(), quantity: z.number().int().positive() })), commanders: z.array(z.object({ card: z.string(), quantity: z.number().int().positive() })).optional() } as const;
- src/mcp-server.ts:425-437 (registration)Registers the csb_parse_deck_text tool in the MCP server with schema, description, and handler function.server.registerTool( "csb_parse_deck_text", { title: "CSB: Parse deck text", description: "Parse a plain-text decklist into cards using Commander Spellbook.", inputSchema: csbParseDeckInput, outputSchema: csbParseDeckOutput }, async ({ text }: { text: string }) => { const res = (await CSB.parseCardListFromText(text)) as any; return { structuredContent: res } as any; } );
- src/csb.ts:110-110 (helper)CSB client method that performs POST request to CSB API endpoint /card-list-from-text with the deck text.parseCardListFromText: (text: string) => postText("/card-list-from-text", text),
- src/csb.ts:71-107 (helper)Helper function postText used by CSB methods to send POST requests to CSB API with rate limiting and retries.async function postText(path: string, body: string) { const base = process.env.CSB_BASE_URL || DEFAULT_BASE_URL; const url = new URL(path, base); const maxRetries = Number(process.env.CSB_MAX_RETRIES || 3); const retryBaseMs = Number(process.env.CSB_RETRY_BASE_MS || 250); for (let attempt = 0; attempt <= maxRetries; attempt++) { await acquireSlot(); const res = await fetch(url, { method: "POST", headers: { "Content-Type": "text/plain", "User-Agent": "scryfall-mcp/0.1 (commanderspellbook client)" }, body }); if (res.status === 429) { const retryAfter = Number(res.headers.get("Retry-After") || 0); const backoff = retryAfter > 0 ? retryAfter * 1000 : retryBaseMs * Math.pow(2, attempt); if (attempt < maxRetries) { await sleep(backoff); continue; } } if (!res.ok) { const text = await res.text().catch(() => ""); throw new Error(`CSB request failed: ${res.status} ${res.statusText} - ${text}`); } return res.json() as Promise<unknown>; } throw new Error("CSB request failed after retries"); }