UNPKG

@kaminaduck/scryfall-mcp-server

Version:

A Model Context Protocol (MCP) server that provides access to the Scryfall API for Magic: The Gathering card data

1,073 lines (832 loc) 29.2 kB
# Scryfall MCP Server [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Node.js](https://img.shields.io/badge/node.js-18.0+-green.svg)](https://nodejs.org/) [![TypeScript](https://img.shields.io/badge/typescript-5.3+-blue.svg)](https://www.typescriptlang.org/) [![npm](https://img.shields.io/npm/v/@kaminaduck/scryfall-mcp-server.svg)](https://www.npmjs.com/package/@kaminaduck/scryfall-mcp-server) [![GitHub](https://img.shields.io/badge/GitHub-Repository-blue.svg)](https://github.com/kaminaduck/scryfall-mcp) A Model Context Protocol (MCP) server that provides access to the Scryfall API for Magic: The Gathering card data. This server enables AI assistants and other MCP clients to search for cards, retrieve card information, download high-resolution images, and access comprehensive MTG data through a standardized interface. ## Quick Setup for Claude Desktop ### Option 1: NPM Package (Recommended - Works on all platforms) 1. **Install globally**: ```bash # Linux/macOS/Windows npm install -g @kaminaduck/scryfall-mcp-server ``` 2. **Add to Claude Desktop settings** (`claude_desktop_config.json`): ```json { "mcpServers": { "scryfall-server": { "command": "scryfall-mcp-server", "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` 3. **Restart Claude Desktop** - the server should now be available! ### Option 2: From Source 1. **Clone and build**: ```bash git clone https://github.com/kaminaduck/scryfall-mcp.git cd scryfall-mcp npm install && npm run build ``` 2. **Add to Claude Desktop settings** (`claude_desktop_config.json`): ```json { "mcpServers": { "scryfall-server": { "command": "node", "args": ["/full/path/to/scryfall-mcp/dist/index.js"], "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` 3. **Restart Claude Desktop** - the server should now be available! ## Features - **Card Search**: Search for Magic: The Gathering cards using Scryfall's powerful search syntax - **Card Details**: Retrieve detailed information about specific cards including prices, legality, and metadata - **Image Downloads**: Download high-resolution card images and art crops - **Database Operations**: Manage local card databases with integrity verification - **Set Information**: Access information about MTG sets and expansions - **Artwork Access**: Get high-quality card artwork and images in multiple formats - **Advanced Filtering**: Use Scryfall's advanced search operators for precise queries ## Installation ### Option 1: NPM Package (Recommended) Install the package from npm: ```bash npm install -g @kaminaduck/scryfall-mcp-server ``` Or run directly with npx: ```bash npx @kaminaduck/scryfall-mcp-server ``` ### Option 2: Install from Source ```bash git clone https://github.com/kaminaduck/scryfall-mcp.git cd scryfall-mcp npm install npm run build ``` **Important**: The build process creates an executable binary at `dist/index.js` and automatically sets execute permissions. ## Quick Start ### Running the Server If installed globally: ```bash scryfall-mcp-server ``` Using npx (no installation required): ```bash npx @kaminaduck/scryfall-mcp-server ``` From source code (after building): ```bash ./dist/index.js # or node dist/index.js ``` For development: ```bash npm run dev ``` ### Basic Usage The server provides several tools that can be used by MCP clients: #### Search for Cards ```javascript // Search for Lightning Bolt cards const result = await mcpSearchCards("lightning bolt"); // Search for red creatures with converted mana cost 3 const result = await mcpSearchCards("t:creature c:red cmc:3"); // Search for cards in a specific set const result = await mcpSearchCards("set:znr"); ``` #### Download Card Images ```javascript // Download a specific card image const result = await mcpDownloadCard("Lightning Bolt"); // Download from a specific set const result = await mcpDownloadCard("Lightning Bolt", "m10", "146"); // Force re-download const result = await mcpDownloadCard("Lightning Bolt", undefined, undefined, true); ``` #### Download Art Crops ```javascript // Download art crop for a card const result = await mcpDownloadArtCrop("Lightning Bolt"); // Download art crop from specific printing const result = await mcpDownloadArtCrop("Lightning Bolt", "m10", "146"); ``` ## Available Tools ### Search Tools - **`mcp_search_cards(query)`**: Search for cards using Scryfall syntax - **`mcp_get_card_artwork(card_id)`**: Get artwork URLs for a specific card ### Download Tools - **`mcp_download_card(card_name, set_code?, collector_number?, force_download?)`**: Download high-resolution card images - Returns: `filepath`, `resource_uri` for accessing the downloaded image - **`mcp_download_art_crop(card_name, set_code?, collector_number?, force_download?)`**: Download art crop images - Returns: `filepath`, `resource_uri` for the image, `metadata_uri` for JSON data ### Database Tools - **`mcp_verify_database()`**: Verify database integrity - **`mcp_scan_directory(directory, update_db?)`**: Scan directories for image files - **`mcp_clean_database(execute?)`**: Clean database of missing file references - **`mcp_database_report()`**: Generate comprehensive database report ## Available Resources ### Card Resources - **`resource://card/{card_id}`**: Get detailed card information by Scryfall ID - **`resource://card/name/{card_name}`**: Get detailed card information by name - **`resource://random_card`**: Get a random Magic: The Gathering card ### Download Resources (NEW) - **`resource://download/card/{file_id}`**: Access downloaded card images - **`resource://download/art/{file_id}`**: Access downloaded art crop images - **`resource://download/metadata/{file_id}`**: Access JSON metadata for downloaded cards ### Database Resources - **`resource://database/stats`**: Get database statistics and information ## Search Syntax The server supports Scryfall's powerful search syntax. Here are some examples: | Query | Description | |-------|-------------| | `lightning bolt` | Cards with "lightning bolt" in the name | | `t:creature` | All creature cards | | `c:red` | All red cards | | `cmc:3` | Cards with converted mana cost 3 | | `set:znr` | Cards from Zendikar Rising | | `r:mythic` | Mythic rare cards | | `pow>=4` | Creatures with power 4 or greater | | `o:"draw a card"` | Cards with "draw a card" in rules text | | `is:commander` | Cards that can be commanders | | `year:2023` | Cards printed in 2023 | <details> <summary>Advanced Search Examples</summary> ```javascript // Find all red creatures with power 4 or greater from recent sets await mcpSearchCards("t:creature c:red pow>=4 year>=2020"); // Find all planeswalkers that cost 3 mana await mcpSearchCards("t:planeswalker cmc:3"); // Find all cards with "flying" and "vigilance" await mcpSearchCards("o:flying o:vigilance"); // Find all legendary creatures that can be commanders await mcpSearchCards("t:legendary t:creature is:commander"); // Find all cards illustrated by a specific artist await mcpSearchCards("a:\"Rebecca Guay\""); ``` </details> ## Configuration ### File Storage The server adapts its storage location based on the execution environment: **MCP Mode** (when running as MCP server): - Uses system temp directory or XDG cache directory - Default: `/tmp/scryfall_downloads/` or `$XDG_CACHE_HOME/scryfall_mcp/` - Configurable via `SCRYFALL_DATA_DIR` environment variable **Standalone Mode** (when running scripts directly): - Uses traditional home directory storage - Card Images: `.local/scryfall_card_images/` - Art Crops: `.local/scryfall_images/` - Database: `.local/scryfall_database.db` ### Environment Variables - **`SCRYFALL_DATA_DIR`**: Override the default storage directory - **`MCP_ENABLE_FILE_DOWNLOADS`**: Enable file download functionality in MCP mode ### Claude Desktop Configuration To use this MCP server with Claude Desktop, add the following to your Claude Desktop settings file. #### Option 1: Global NPM Installation (Recommended) If you installed the package globally with `npm install -g @kaminaduck/scryfall-mcp-server`: ```json { "mcpServers": { "scryfall-server": { "command": "scryfall-mcp-server", "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` #### Option 2: Using NPX (No Installation Required) **⚠️ Windows Users:** NPX may have environment variable expansion issues with Claude Desktop. If you encounter errors, use Option 1 (Global Installation) or Option 2b (Windows Wrapper) instead. ```json { "mcpServers": { "scryfall-server": { "command": "npx", "args": ["@kaminaduck/scryfall-mcp-server"], "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` #### Option 2b: Using Windows Wrapper (Recommended for Windows) For Windows users experiencing environment variable issues with NPX: ```json { "mcpServers": { "scryfall-server": { "command": "scryfall-mcp-server-windows", "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` First install the package globally to get the wrapper: ```cmd npm install -g @kaminaduck/scryfall-mcp-server ``` #### Option 3: From Source (Node.js) If you built from source, use the absolute path to your built project: ```json { "mcpServers": { "scryfall-server": { "command": "node", "args": ["/full/path/to/scryfall-mcp/dist/index.js"], "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` #### Option 4: From Source (Direct Binary) ```json { "mcpServers": { "scryfall-server": { "command": "/full/path/to/scryfall-mcp/dist/index.js", "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` **Important**: For source options, replace `/full/path/to/scryfall-mcp` with the actual path where you cloned the repository. #### Claude Desktop Settings File Locations - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` - **Linux**: `~/.config/claude/claude_desktop_config.json` ## Error Handling All tools return structured responses with status indicators: ```typescript interface ToolResponse { status: "success" | "error"; message?: string; // Additional response data varies by tool [key: string]: any; } ``` ## Troubleshooting ### Common Claude Desktop Issues #### "Server transport closed unexpectedly" This error typically occurs when: 1. **Binary is not executable**: Ensure the binary has execute permissions: ```bash chmod +x dist/index.js ``` 2. **Incorrect path in configuration**: Verify the path in your Claude Desktop settings points to the correct location: ```bash # Check if the file exists and is executable ls -la /full/path/to/scryfall-mcp/dist/index.js ``` 3. **Missing Node.js**: If using the direct binary option, ensure the shebang line can find Node.js: ```bash which node # Should return a path like /usr/bin/node or /usr/local/bin/node ``` #### Windows-Specific Issues **Environment Variable Expansion Error with NPX** If you see errors like: ``` npm error path C:\Users\Username\AppData\Local\AnthropicClaude\app-0.11.6\${APPDATA} npm error enoent ENOENT: no such file or directory, lstat '...\${APPDATA}' ``` This occurs because Claude Desktop on Windows has trouble expanding environment variables when using npx. **Solutions in order of preference:** **Solution 1: Use Global Installation (Recommended for Windows)** ```json { "mcpServers": { "scryfall-server": { "command": "scryfall-mcp-server", "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` First install globally: ```cmd npm install -g @kaminaduck/scryfall-mcp-server ``` **Solution 2: Use Node.js with Global Package Path** ```json { "mcpServers": { "scryfall-server": { "command": "node", "args": ["%APPDATA%\\npm\\node_modules\\@kaminaduck\\scryfall-mcp-server\\dist\\index.js"], "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` Note: Replace `%APPDATA%` with your actual AppData path (usually `C:\\Users\\Username\\AppData\\Roaming`) if environment variable expansion doesn't work. **Solution 3: Use Full Path NPX** ```json { "mcpServers": { "scryfall-server": { "command": "C:\\Program Files\\nodejs\\npx.cmd", "args": ["@kaminaduck/scryfall-mcp-server"], "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` **Solution 4: Use PowerShell Wrapper** ```json { "mcpServers": { "scryfall-server": { "command": "powershell", "args": ["-Command", "npx @kaminaduck/scryfall-mcp-server"], "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` #### "Command not found" or "Permission denied" 1. **For NPM installations**: Ensure the package is installed correctly: ```bash npm install -g @kaminaduck/scryfall-mcp-server which scryfall-mcp-server ``` 2. **For NPX usage**: Try the full package name: ```json { "command": "npx", "args": ["@kaminaduck/scryfall-mcp-server"] } ``` 3. **For source builds**: Use full absolute paths and verify the binary exists: ```bash ls -la /full/path/to/scryfall-mcp/dist/index.js ``` 4. **Try the Node.js option** instead of direct binary execution: ```json { "command": "node", "args": ["/full/path/to/scryfall-mcp/dist/index.js"] } ``` #### "Module not found" errors 1. **Ensure all dependencies are installed**: ```bash cd /path/to/scryfall-mcp npm install ``` 2. **Rebuild the project** if you pulled new changes: ```bash npm run build chmod +x dist/index.js ``` #### Circular Dependency Issues If you encounter npm resolution errors related to circular dependencies: 1. **Check for self-references in package.json**: - The package should not depend on itself - Remove any entries like `"@kaminaduck/scryfall-mcp-server": "^1.0.x"` from dependencies 2. **Clear npm cache and reinstall**: ```bash npm cache clean --force rm -rf node_modules package-lock.json npm install ``` 3. **Use a fresh npm installation**: ```bash npm uninstall -g @kaminaduck/scryfall-mcp-server npm install -g @kaminaduck/scryfall-mcp-server ``` #### Enhanced ENOENT Error Troubleshooting If you see detailed ENOENT errors with unresolved environment variables: **Error Pattern:** ``` npm error path C:\Users\Username\AppData\Local\AnthropicClaude\app-0.11.6\${APPDATA} npm error errno -4058 npm error enoent ENOENT: no such file or directory, lstat '...\${APPDATA}' ``` **Root Cause:** Claude Desktop on Windows is not expanding environment variables properly when using npx. **Solutions:** 1. **Use global installation instead of npx** (most reliable): ```cmd npm install -g @kaminaduck/scryfall-mcp-server ``` Then use this Claude Desktop configuration: ```json { "mcpServers": { "scryfall-server": { "command": "scryfall-mcp-server", "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` 2. **Set explicit environment variables** in Claude Desktop config: ```json { "mcpServers": { "scryfall-server": { "command": "scryfall-mcp-server", "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true", "SCRYFALL_DATA_DIR": "C:\\Users\\%USERNAME%\\Documents\\scryfall_data" } } } } ``` Replace `%USERNAME%` with your actual Windows username. 3. **Use PowerShell wrapper** to handle environment variable expansion: ```json { "mcpServers": { "scryfall-server": { "command": "powershell", "args": ["-Command", "npx @kaminaduck/scryfall-mcp-server"], "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } } } ``` #### Windows Directory Permissions and APPDATA Issues **Setting up proper directory permissions on Windows:** 1. **Check directory permissions** for common paths: ```cmd icacls "%APPDATA%" /T /C icacls "%LOCALAPPDATA%" /T /C icacls "%USERPROFILE%\Documents" /T /C ``` 2. **Grant full permissions** to your user account if needed: ```cmd icacls "%APPDATA%\scryfall_mcp" /grant "%USERNAME%:F" /T ``` 3. **Create directories manually** if automatic creation fails: ```cmd mkdir "%APPDATA%\scryfall_mcp" mkdir "%USERPROFILE%\Documents\scryfall_data" ``` **Handling APPDATA path issues:** 1. **Verify APPDATA environment variable**: ```cmd echo %APPDATA% echo %LOCALAPPDATA% echo %USERPROFILE% ``` These should return actual paths, not `${APPDATA}` literals. 2. **Manual path configuration** if environment variables fail: ```json { "mcpServers": { "scryfall-server": { "command": "scryfall-mcp-server", "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true", "SCRYFALL_DATA_DIR": "C:\\Users\\[YourUsername]\\AppData\\Roaming\\scryfall_mcp" } } } } ``` Replace `[YourUsername]` with your actual Windows username. 3. **Alternative storage locations** for Windows: ```json { "env": { "SCRYFALL_DATA_DIR": "C:\\ProgramData\\scryfall_mcp" } } ``` Or use Documents folder: ```json { "env": { "SCRYFALL_DATA_DIR": "C:\\Users\\[YourUsername]\\Documents\\scryfall_data" } } ``` **Windows-specific antivirus considerations:** - Some antivirus software may block npm package execution - Add exclusions for: - `%APPDATA%\npm\` - `%LOCALAPPDATA%\npm\` - Your Node.js installation directory - The Claude Desktop application directory #### "Storage directory" errors 1. **Set a custom storage directory** in your Claude Desktop configuration: ```json { "env": { "SCRYFALL_DATA_DIR": "/tmp/scryfall_downloads", "MCP_ENABLE_FILE_DOWNLOADS": "true" } } ``` 2. **Ensure the directory is writable**: ```bash mkdir -p /tmp/scryfall_downloads chmod 755 /tmp/scryfall_downloads ``` ## Windows Quick Setup Script Windows users can use the provided setup script for automatic configuration: ```powershell # Download and run setup npm install -g @kaminaduck/scryfall-mcp-server scryfall-mcp-server-windows --setup # Or run setup manually after cloning git clone https://github.com/kaminaduck/scryfall-mcp.git cd scryfall-mcp npm install npm run setup:windows ``` The setup script will: - Create necessary directories - Set environment variables - Test permissions - Generate Claude Desktop configuration - Provide troubleshooting information See the [Windows Setup Guide](docs/WINDOWS_SETUP.md) for detailed Windows-specific configuration and troubleshooting. **Quick Windows Fix:** If you're experiencing `${APPDATA}` expansion errors: 1. Install globally: `npm install -g @kaminaduck/scryfall-mcp-server` 2. Use global command in Claude Desktop config: `"command": "scryfall-mcp-server"` #### macOS-Specific Issues **"Server transport closed unexpectedly" on macOS** If you see this error on macOS, it's typically due to file system permission restrictions. Claude Desktop on macOS runs with App Sandbox restrictions that may limit file access. **Common Causes:** 1. App Sandbox restrictions preventing directory creation 2. System Integrity Protection (SIP) blocking access to system directories 3. Standard Unix file permissions issues **Solutions:** **Solution 1: Set Custom Storage Directory (Recommended)** ```json { "mcpServers": { "scryfall-server": { "command": "scryfall-mcp-server", "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true", "SCRYFALL_DATA_DIR": "$HOME/Documents/scryfall_mcp" } } } } ``` **Solution 2: Use Temporary Directory** ```json { "mcpServers": { "scryfall-server": { "command": "scryfall-mcp-server", "env": { "MCP_SERVER_NAME": "scryfall-server", "MCP_ENABLE_FILE_DOWNLOADS": "true", "SCRYFALL_DATA_DIR": "/tmp/scryfall_mcp" } } } } ``` **Solution 3: Grant Claude Desktop File Access** 1. Open System Settings > Privacy & Security > Files and Folders 2. Find Claude or Claude Desktop in the list 3. Grant access to the folders you want to use for storage **macOS Permission Troubleshooting:** 1. **Check if running in sandboxed environment**: ```bash echo $HOME # If it shows /Library/Containers/..., you're sandboxed ``` 2. **Create and test a writable directory**: ```bash mkdir -p ~/Documents/scryfall_mcp chmod 755 ~/Documents/scryfall_mcp touch ~/Documents/scryfall_mcp/test && rm ~/Documents/scryfall_mcp/test # Should succeed without errors ``` 3. **Alternative storage locations for macOS**: - `~/Documents/scryfall_mcp` - Usually accessible - `~/Library/Caches/scryfall_mcp` - Good for temporary data - `/tmp/scryfall_mcp` - Always writable but cleared on restart - `~/Desktop/scryfall_mcp` - If other locations fail **Common macOS Error Codes:** - **EACCES**: Permission denied - try a different directory - **ENOENT**: Directory doesn't exist - ensure parent directory exists - **EROFS**: Read-only file system - you're trying to write to a protected location - **EPERM**: Operation not permitted - usually due to SIP or sandbox restrictions **Quick macOS Fix:** If you're experiencing file access issues: 1. Set `SCRYFALL_DATA_DIR` to a user-writable location: `"SCRYFALL_DATA_DIR": "$HOME/Documents/scryfall_mcp"` 2. Or disable file operations: `"MCP_ENABLE_FILE_DOWNLOADS": "false"` (API-only mode) ### Testing Your Configuration Before adding the server to Claude Desktop, test it manually: #### For NPM Installation: **Linux/macOS:** 1. **Test global installation**: ```bash which scryfall-mcp-server # Should return a path to the binary ``` 2. **Test server startup**: ```bash timeout 3s scryfall-mcp-server # Server should start silently (normal MCP behavior) ``` 3. **Test with environment variables**: ```bash MCP_SERVER_NAME="scryfall-server" timeout 3s scryfall-mcp-server # Should detect MCP mode and validate storage ``` **Windows:** 1. **Test global installation**: ```cmd where scryfall-mcp-server REM Should return a path to the binary ``` 2. **Test server startup**: ```cmd timeout /t 3 /nobreak && taskkill /f /im scryfall-mcp-server.exe 2>nul || scryfall-mcp-server REM Server should start silently (normal MCP behavior) ``` 3. **Test with environment variables**: ```cmd set MCP_SERVER_NAME=scryfall-server && timeout /t 3 /nobreak && taskkill /f /im scryfall-mcp-server.exe 2>nul || scryfall-mcp-server REM Should detect MCP mode and validate storage ``` #### For NPX Usage: **Linux/macOS:** 1. **Test npx execution**: ```bash timeout 3s npx @kaminaduck/scryfall-mcp-server # Should download and run the package ``` **Windows:** 1. **Test npx execution** (may fail due to environment issues): ```cmd timeout /t 3 /nobreak && taskkill /f /im node.exe 2>nul || npx @kaminaduck/scryfall-mcp-server REM May show environment variable expansion errors - this is expected ``` #### For Source Build: 1. **Test the binary directly**: ```bash cd /path/to/scryfall-mcp timeout 3s ./dist/index.js # Should start and show "Scryfall MCP server is running" ``` 2. **Test with environment variables**: ```bash MCP_SERVER_NAME="scryfall-server" timeout 3s ./dist/index.js # Should detect MCP mode and validate storage ``` #### Universal MCP Protocol Test: 3. **Test a simple MCP request** (works with any method): ```bash echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}' | scryfall-mcp-server # Should return a JSON response with available tools ``` ### Debugging Tips 1. **Check Claude Desktop logs** for specific error messages 2. **Use absolute paths** for all file references 3. **Test the server standalone** before configuring it with Claude Desktop 4. **Verify Node.js version** is 18.0 or higher: `node --version` 5. **Check file permissions** on the project directory and binary ### Getting Help If you continue to experience issues: 1. **Verify your configuration** matches the examples exactly 2. **Check the logs** for specific error messages 3. **Test the server manually** using the commands above 4. **Open an issue** with your configuration and error messages ## Requirements - Node.js 18.0+ - TypeScript 5.3+ (for development) - @modelcontextprotocol/sdk >= 0.4.0 > **Note**: This package is distributed as an ES module. It requires Node.js 18+ with ES module support. ## Development ### Setting up Development Environment ```bash git clone https://github.com/kaminaduck/scryfall-mcp.git cd scryfall-mcp npm install ``` ### Building the Project ```bash npm run build ``` ### Running Tests ```bash npm test ``` For watch mode: ```bash npm run test:watch ``` ### Code Quality ```bash # Lint the code npm run lint # Fix linting issues npm run lint:fix # Format code npm run format ``` ### Code Style This project follows TypeScript and ESLint best practices with Prettier for consistent formatting. All code includes comprehensive JSDoc documentation. ### Project Configuration This project uses ES modules (`"type": "module"` in package.json). Configuration files that must use CommonJS are named with `.cjs` extension: - `.eslintrc.cjs` - ESLint configuration - `jest.config.cjs` - Jest test configuration The TypeScript configuration uses `NodeNext` module resolution for optimal ES module compatibility. ## API Reference ### Using as a Library If you want to use this package programmatically as an ES module from the built source: ```javascript import { scryfallClient } from './dist/scryfallClient.js'; import { downloadManager } from './dist/downloadManager.js'; // Search for cards const cards = await scryfallClient.searchCards('lightning bolt'); // Download card images const results = await downloadManager.downloadCardImages(['Lightning Bolt']); ``` ### Tool Signatures ```typescript async function mcpSearchCards(query: string): Promise<SearchResult> async function mcpDownloadCard( cardName: string, setCode?: string, collectorNumber?: string, forceDownload?: boolean ): Promise<DownloadResult> async function mcpDownloadArtCrop( cardName: string, setCode?: string, collectorNumber?: string, forceDownload?: boolean ): Promise<DownloadResult> async function mcpGetCardArtwork(cardId: string): Promise<ArtworkResult> async function mcpVerifyDatabase(): Promise<DatabaseResult> async function mcpScanDirectory(directory: string, updateDb?: boolean): Promise<DatabaseResult> async function mcpCleanDatabase(execute?: boolean): Promise<DatabaseResult> async function mcpDatabaseReport(): Promise<DatabaseResult> ``` ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change. 1. Fork the repository 2. Create your feature branch (`git checkout -b feature/AmazingFeature`) 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) 4. Push to the branch (`git push origin feature/AmazingFeature`) 5. Open a Pull Request ## License This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details. ## Acknowledgments - [Scryfall](https://scryfall.com/) for providing the comprehensive Magic: The Gathering API - [Model Context Protocol](https://modelcontextprotocol.io/) for the standardized interface - The Magic: The Gathering community for their continued support ## Support If you encounter any issues or have questions: 1. Check the [Issues](https://github.com/kaminaduck/scryfall-mcp/issues) page 2. Create a new issue with detailed information about your problem 3. Include relevant error messages and system information --- **Note**: This is an unofficial tool and is not affiliated with Wizards of the Coast or Scryfall. Magic: The Gathering is a trademark of Wizards of the Coast LLC.