Veo
HTTPv1.0.0Credential RequiredJan 22, 2026
A stateless Python MCP server for Google's Vertex AI Veo API ā generate videos from text, images, first/last frames, and extend existing videos. Built with fastmcp, following the same patterns as the Google Meet, Google Business, and Zomato MCP servers.
| Category | Tools |
|---|---|
| š¬ Video Generation | generate_video_from_text, generate_video_from_image, generate_video_from_first_and_last_frame, extend_video, generate_video_with_style_reference |
| š Operations | get_operation_status, list_available_models |
Total: 7 tools
| Key | Model ID | Status | Best for |
|---|---|---|---|
veo-3.1 | veo-3.1-generate-preview | Preview | Latest quality, native audio, subject reference |
veo-3.0 | veo-3.0-generate-preview | Preview | Stable preview |
veo-2.0 | veo-2.0-generate-001 | GA ā | Production workloads |
veo-2.0-exp | veo-2.0-generate-exp | Experimental | Style reference images |
Every tool accepts a VeoAuth object:
{
"project_id": "your-google-cloud-project-id",
"location": "us-central1",
"access_token": "ya29.your_oauth2_access_token"
}Option 1 ā gcloud CLI (easiest for testing):
gcloud auth login
gcloud auth print-access-tokenOption 2 ā Service Account (recommended for production):
gcloud iam service-accounts create veo-mcp-sa
gcloud projects add-iam-policy-binding YOUR_PROJECT \
--member="serviceAccount:veo-mcp-sa@YOUR_PROJECT.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
gcloud iam service-accounts keys create service_account.json \
--iam-account=veo-mcp-sa@YOUR_PROJECT.iam.gserviceaccount.comThen get a token from the service account:
from google.oauth2 import service_account
import google.auth.transport.requests
creds = service_account.Credentials.from_service_account_file(
'service_account.json',
scopes=['https://www.googleapis.com/auth/cloud-platform']
)
creds.refresh(google.auth.transport.requests.Request())
print(creds.token)pip install -r requirements.txtpython veo_mcp_server.py --transport stdio{
"mcpServers": {
"veo": {
"command": "python",
"args": ["/absolute/path/to/veo_mcp_server.py", "--transport", "stdio"]
}
}
}{
"auth": { "project_id": "my-project", "location": "us-central1", "access_token": "ya29.xxx" },
"prompt": "A golden retriever running on a beach at sunset",
"model": "veo-2.0",
"aspect_ratio": "16:9",
"duration_seconds": 5,
"count": 1,
"output_gcs_uri":
{
"auth": { ... },
"prompt": "The flowers gently sway in the breeze",
"image_gcs_uri": "gs://my-bucket/flowers.jpg",
"image_mime_type": "image/jpeg",
"model": "veo-3.1",
"duration_seconds": 5
}{
"auth": { ... },
"prompt": "A smooth transition from sunrise to sunset",
"first_frame_gcs_uri": "gs://my-bucket/sunrise.jpg",
"last_frame_gcs_uri": "gs://my-bucket/sunset.jpg",
"duration_seconds": 8
}{
"auth": { ... },
"prompt": "Continue the scene, camera pans right",
"video_gcs_uri": "gs://my-bucket/input/clip.mp4",
"duration_seconds": 5,
"model": "veo-3.1"
}get_operation_status with the returned operation_name to check lateroutput_gcs_uri ā you must have a GCS bucket created in advance. If not provided, video bytes are returned inline in the responseveo-mcp/
āāā veo_mcp_server.py # Entry point
āāā veo_mcp/
ā āāā tools.py # All 7 tool definitions
ā āāā service.py # Vertex AI API client + operation polling
ā āāā schemas.py # VeoAuth TypedDict
ā āāā config.py # Model registry + logging
ā āāā cli.py # CLI args parser
ā āāā __init__.py
āāā requirements.txt
āāā Dockerfile
āāā railway.json
āāā .gitignore