Modal MCP Server
by smehmood
# Modal MCP Server
An MCP server implementation for interacting with Modal volumes and deploying Modal applications from within Cursor.
## Installation
1. Clone this repository:
```bash
git clone https://github.com/smehmood/modal-mcp-server.git
cd modal-mcp-server
```
2. Install dependencies using `uv`:
```bash
uv sync
```
## Configuration
To use this MCP server in Cursor, add the following configuration to your `~/.cursor/mcp.json`:
```json
{
"mcpServers": {
"modal-mcp-server": {
"command": "uv",
"args": [
"--project", "/path/to/modal-mcp-server",
"run", "/path/to/modal-mcp-server/src/modal_mcp/server.py"
]
}
}
}
```
Replace `/path/to/modal-mcp-server` with the absolute path to your cloned repository.
## Requirements
- Python 3.11 or higher
- `uv` package manager
- Modal CLI configured with valid credentials
- For Modal deploy support:
- Project being deployed must use `uv` for dependency management
- Modal must be installed in the project's virtual environment
## Supported Tools
### Modal Volume Operations
1. **List Modal Volumes** (`list_modal_volumes`)
- Lists all Modal volumes in your environment
- Returns JSON-formatted volume information
- Parameters: None
2. **List Volume Contents** (`list_modal_volume_contents`)
- Lists files and directories in a Modal volume
- Parameters:
- `volume_name`: Name of the Modal volume
- `path`: Path within volume (default: "/")
3. **Copy Files** (`copy_modal_volume_files`)
- Copies files within a Modal volume
- Parameters:
- `volume_name`: Name of the Modal volume
- `paths`: List of paths where last path is destination
- Example: `["source.txt", "dest.txt"]` or `["file1.txt", "file2.txt", "dest_dir/"]`
4. **Remove Files** (`remove_modal_volume_file`)
- Deletes a file or directory from a Modal volume
- Parameters:
- `volume_name`: Name of the Modal volume
- `remote_path`: Path to file/directory to delete
- `recursive`: Boolean flag for recursive deletion (default: false)
5. **Upload Files** (`put_modal_volume_file`)
- Uploads a file or directory to a Modal volume
- Parameters:
- `volume_name`: Name of the Modal volume
- `local_path`: Path to local file/directory to upload
- `remote_path`: Path in volume to upload to (default: "/")
- `force`: Boolean flag to overwrite existing files (default: false)
6. **Download Files** (`get_modal_volume_file`)
- Downloads files from a Modal volume
- Parameters:
- `volume_name`: Name of the Modal volume
- `remote_path`: Path to file/directory in volume to download
- `local_destination`: Local path to save downloaded files (default: current directory)
- `force`: Boolean flag to overwrite existing files (default: false)
- Note: Use "-" as `local_destination` to write file contents to stdout
### Modal Deployment
1. **Deploy Modal App** (`deploy_modal_app`)
- Deploys a Modal application
- Parameters:
- `absolute_path_to_app`: Absolute path to the Modal application file
- Note: The project containing the Modal app must:
- Use `uv` for dependency management
- Have the `modal` CLI installed in its virtual environment
## Response Format
All tools return responses in a standardized format, with slight variations depending on the operation type:
```python
# JSON operations (list volumes, list contents):
{
"success": True,
"data": {...} # JSON data from Modal CLI
}
# File operations (put, get, copy, remove):
{
"success": True,
"message": "Operation successful message",
"command": "executed command string",
"stdout": "command output", # if any
"stderr": "error output" # if any
}
# Error case (all operations):
{
"success": False,
"error": "Error message describing what went wrong",
"command": "executed command string", # for file operations
"stdout": "command output", # if available
"stderr": "error output" # if available
}
```
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.