manage_decks
Create, delete, list, configure, and organize Anki decks. Move cards between decks and manage deck settings for effective flashcard organization.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| operation | Yes | Deck management operation | |
| deckName | No | Deck name | |
| deckNames | No | Deck names (for batch operations) | |
| deleteCards | No | Delete cards when deleting deck | |
| cardIds | No | Card IDs to move | |
| targetDeck | No | Target deck for moving cards | |
| configId | No | Config ID to apply |
Implementation Reference
- src/tools/consolidated.ts:484-619 (registration)Registration of the 'manage_decks' tool with the MCP server inside registerConsolidatedTools function. Includes schema and handler.server.tool( 'manage_decks', { operation: z .enum(['create', 'delete', 'list', 'get_stats', 'move_cards', 'get_config', 'set_config']) .describe('Deck management operation'), deckName: z.string().optional().describe('Deck name'), deckNames: z.array(z.string()).optional().describe('Deck names (for batch operations)'), deleteCards: z.boolean().optional().describe('Delete cards when deleting deck'), cardIds: z.array(z.number()).optional().describe('Card IDs to move'), targetDeck: z.string().optional().describe('Target deck for moving cards'), configId: z.number().optional().describe('Config ID to apply'), }, async ({ operation, deckName, deckNames, deleteCards, cardIds, targetDeck, configId }) => { try { switch (operation) { case 'create': { if (!deckName) { throw new Error('create requires deckName'); } const result = await ankiClient.deck.createDeck({ deck: deckName }); return { content: [ { type: 'text', text: `✓ Created deck "${deckName}" (ID: ${result})`, }, ], }; } case 'delete': { if (!deckNames || deckNames.length === 0) { throw new Error('delete requires deckNames'); } await ankiClient.deck.deleteDecks({ decks: deckNames, cardsToo: (deleteCards ?? true) as true, }); return { content: [ { type: 'text', text: `✓ Deleted deck(s): ${deckNames.join(', ')}${deleteCards !== false ? ' (including cards)' : ''}`, }, ], }; } case 'list': { const decks = await ankiClient.deck.deckNamesAndIds(); const deckList = Object.entries(decks) .map(([name, id]) => ` • ${name} (ID: ${id})`) .join('\n'); return { content: [ { type: 'text', text: `Decks (${Object.keys(decks).length}):\n${deckList}`, }, ], }; } case 'get_stats': { if (!deckName) { throw new Error('get_stats requires deckName'); } const stats = await ankiClient.deck.getDeckStats({ decks: [deckName] }); return { content: [ { type: 'text', text: `Statistics for "${deckName}":\n${JSON.stringify(stats, null, 2)}`, }, ], }; } case 'move_cards': { if (!cardIds || !targetDeck) { throw new Error('move_cards requires cardIds and targetDeck'); } await ankiClient.deck.changeDeck({ cards: cardIds, deck: targetDeck }); return { content: [ { type: 'text', text: `✓ Moved ${cardIds.length} card(s) to "${targetDeck}"`, }, ], }; } case 'get_config': { if (!deckName) { throw new Error('get_config requires deckName'); } const config = await ankiClient.deck.getDeckConfig({ deck: deckName }); return { content: [ { type: 'text', text: `Config for "${deckName}":\n${JSON.stringify(config, null, 2)}`, }, ], }; } case 'set_config': { if (!deckNames || !configId) { throw new Error('set_config requires deckNames and configId'); } await ankiClient.deck.setDeckConfigId({ configId, decks: deckNames }); return { content: [ { type: 'text', text: `✓ Applied config ${configId} to: ${deckNames.join(', ')}`, }, ], }; } default: throw new Error(`Unknown operation: ${operation}`); } } catch (error) { throw new Error( `manage_decks failed: ${error instanceof Error ? error.message : String(error)}` ); } }
- src/tools/consolidated.ts:500-618 (handler)Handler function implementing deck management operations: create, delete, list decks, get stats, move cards, manage config.async ({ operation, deckName, deckNames, deleteCards, cardIds, targetDeck, configId }) => { try { switch (operation) { case 'create': { if (!deckName) { throw new Error('create requires deckName'); } const result = await ankiClient.deck.createDeck({ deck: deckName }); return { content: [ { type: 'text', text: `✓ Created deck "${deckName}" (ID: ${result})`, }, ], }; } case 'delete': { if (!deckNames || deckNames.length === 0) { throw new Error('delete requires deckNames'); } await ankiClient.deck.deleteDecks({ decks: deckNames, cardsToo: (deleteCards ?? true) as true, }); return { content: [ { type: 'text', text: `✓ Deleted deck(s): ${deckNames.join(', ')}${deleteCards !== false ? ' (including cards)' : ''}`, }, ], }; } case 'list': { const decks = await ankiClient.deck.deckNamesAndIds(); const deckList = Object.entries(decks) .map(([name, id]) => ` • ${name} (ID: ${id})`) .join('\n'); return { content: [ { type: 'text', text: `Decks (${Object.keys(decks).length}):\n${deckList}`, }, ], }; } case 'get_stats': { if (!deckName) { throw new Error('get_stats requires deckName'); } const stats = await ankiClient.deck.getDeckStats({ decks: [deckName] }); return { content: [ { type: 'text', text: `Statistics for "${deckName}":\n${JSON.stringify(stats, null, 2)}`, }, ], }; } case 'move_cards': { if (!cardIds || !targetDeck) { throw new Error('move_cards requires cardIds and targetDeck'); } await ankiClient.deck.changeDeck({ cards: cardIds, deck: targetDeck }); return { content: [ { type: 'text', text: `✓ Moved ${cardIds.length} card(s) to "${targetDeck}"`, }, ], }; } case 'get_config': { if (!deckName) { throw new Error('get_config requires deckName'); } const config = await ankiClient.deck.getDeckConfig({ deck: deckName }); return { content: [ { type: 'text', text: `Config for "${deckName}":\n${JSON.stringify(config, null, 2)}`, }, ], }; } case 'set_config': { if (!deckNames || !configId) { throw new Error('set_config requires deckNames and configId'); } await ankiClient.deck.setDeckConfigId({ configId, decks: deckNames }); return { content: [ { type: 'text', text: `✓ Applied config ${configId} to: ${deckNames.join(', ')}`, }, ], }; } default: throw new Error(`Unknown operation: ${operation}`); } } catch (error) { throw new Error( `manage_decks failed: ${error instanceof Error ? error.message : String(error)}` ); }
- src/tools/consolidated.ts:486-499 (schema)Zod schema defining input parameters for the manage_decks tool.{ operation: z .enum(['create', 'delete', 'list', 'get_stats', 'move_cards', 'get_config', 'set_config']) .describe('Deck management operation'), deckName: z.string().optional().describe('Deck name'), deckNames: z.array(z.string()).optional().describe('Deck names (for batch operations)'), deleteCards: z.boolean().optional().describe('Delete cards when deleting deck'), cardIds: z.array(z.number()).optional().describe('Card IDs to move'), targetDeck: z.string().optional().describe('Target deck for moving cards'), configId: z.number().optional().describe('Config ID to apply'), },