A Model Context Protocol (MCP) server that provides AI with a secure workspace for file management and Python script execution. Designed to run on Vercel as a serverless function.
- create_file - Create new files with content
- read_file - Read file contents
- update_file - Update existing files
- delete_file - Delete files
- list_files - List files and directories
- create_directory - Create new directories
- execute_python - Execute Python scripts with arguments (30-second timeout)
npm install -g vercelYour project should look like this:
ai-workspace-mcp/
├── api/
│ └── mcp.py # Serverless function
├── vercel.json # Vercel configuration
├── requirements.txt # Python dependencies
└── README.md # This file
- Go to vercel.com
- Click "Add New" → "Project"
- Import your Git repository (or upload files)
- Vercel will auto-detect Python and deploy
# Login to Vercel
vercel login
# Deploy
vercel
# Deploy to production
vercel --prodAfter deployment, Vercel will give you a URL like:
https://your-project-name.vercel.app
Once deployed, your server will have these endpoints:
Returns server information and status
curl https://your-project.vercel.app/Health check endpoint
curl https://your-project.vercel.app/healthList all available tools
curl https://your-project.vercel.app/toolsExecute a tool
curl -X POST https://your-project.vercel.app/execute \
-H "Content-Type: application/json" \
-d '{
"tool": "create_file",
"arguments": {
"filepath": "hello.py",
"content": "print(\"Hello World!\")"
}
}'Add this to your Claude Desktop config:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"ai-workspace": {
"command": "curl",
"args": [
"-X", "POST",
"https://your-project.vercel.app/execute",
"-H", "Content-Type: application/json",
"-d", "@-"
]
}
}
}You can integrate this with any AI that supports HTTP tool calling:
import requests
# Create a file
response = requests.post(
"https://your-project.vercel.app/execute",
json={
"tool": "create_file",
"arguments": {
"filepath": "script.py",
"content": "print('Hello from AI!')"
}
}
)
print(response.json())
# Execute the file
response = requests.post(
"https://your-project.vercel.app/execute",
json={
"tool": "execute_python",
"arguments": {
"filepath": "script.py"
}
}
)
print(response.json())- Sandboxed Workspace: All file operations are restricted to
/tmp/workspace - Path Validation: Prevents directory traversal attacks
- Execution Timeout: Python scripts are limited to 30 seconds
- CORS Enabled: Allows cross-origin requests
- Serverless Isolation: Each request runs in an isolated environment
# Create a file
curl -X POST https://your-project.vercel.app/execute \
-H "Content-Type: application/json" \
-d '{
"tool": "create_file",
"arguments": {
"filepath": "hello.py",
"content": "print(\"Hello from Vercel!\")"
}
}'
# Execute it
curl -X POST https://your-project.vercel.app/execute \
-H "Content-Type: application/json" \
-d '{
"tool": "execute_python",
"arguments": {
"filepath": "hello.py"
}
}'curl -X POST https://your-project.vercel.app/execute \
-H "Content-Type: application/json" \
-d '{
"tool": "list_files",
"arguments": {}
}'curl -X POST https://your-project.vercel.app/execute \
-H "Content-Type: application/json" \
-d '{
"tool": "create_directory",
"arguments": {
"dirpath": "scripts"
}
}'All tool executions return JSON:
Success Response:
{
"success": true,
"message": "Successfully created file: hello.py\nSize: 26 bytes"
}Error Response:
{
"success": false,
"error": "File not found: nonexistent.py"
}Execute Python Response:
{
"success": true,
"exit_code": 0,
"stdout": "Hello from Vercel!\n",
"stderr": ""
}- Temporary Storage: Files in
/tmpare ephemeral and cleared between invocations - 10-second timeout: Vercel functions timeout after 10 seconds on free tier (25s on Pro)
- Cold Starts: First request may be slower due to cold start
- No Persistent State: Each function invocation starts fresh
If you need persistent file storage, consider:
- Using Vercel KV, Postgres, or Blob storage
- Integrating with AWS S3, Google Cloud Storage, etc.
- Using a database to store file contents
You can set environment variables in Vercel Dashboard:
WORKSPACE_PATH- Custom workspace path (default:/tmp/workspace)EXECUTION_TIMEOUT- Python execution timeout in seconds (default: 30)
Test locally before deploying:
# Install dependencies
pip install -r requirements.txt
# Run with Python's built-in server
cd api
python -m http.server 8000
# Or use Vercel CLI
vercel devThen test with:
curl http://localhost:8000/healthEnsure requirements.txt is in the project root and contains all dependencies.
- Reduce Python script complexity
- Upgrade to Vercel Pro for longer timeouts
- Use async operations where possible
Remember: /tmp storage is ephemeral on Vercel. Files won't persist between invocations.
class VercelMCPClient:
def __init__(self, base_url):
self.base_url = base_url
def call_tool(self, tool_name, arguments):
response = requests.post(
f"{self.base_url}/execute",
json={"tool": tool_name, "arguments": arguments}
)
return response.json()
def list_tools(self):
response = requests.get(f"{self.base_url}/tools")
return response.json()
# Usage
client = VercelMCPClient("https://your-project.vercel.app")
result = client.call_tool("create_file", {
"filepath": "test.py",
"content": "print('test')"
})Feel free to extend this server with additional tools:
- Add tool definition to
get_tools() - Implement handler in
execute_tool() - Update documentation
MIT License - modify and use as needed.
- Vercel Docs: vercel.com/docs
- MCP Protocol: modelcontextprotocol.io
- Issues: Open an issue or modify the code as needed