Koskamo

MakeViral MCP

An official MCP server provided by MakeViral that allows AI agents to generate faceless short videos using trend templates and AI models. It supports creating videos from prompts, scripts, or URLs, including formats like Reddit stories, fake text messages, and AI story videos, with outputs tailored for TikTok, Instagram Reels, and YouTube Shorts.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

MakeViral MCP logo, by MakeViralVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by MakeViral
You need:OAuth or API keyEvery run uses credits from the user's MakeViral account
MCP endpoint (Streamable HTTP)
https://www.makeviral.ai/mcp
Vendor documentation

What you can do with it

  • Generate faceless short videos from text prompts or scripts
  • Create AI narrated videos with voiceover and captions
  • Convert Reddit stories or URLs into vertical video content
  • Produce fake text message videos with gameplay backgrounds

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
makeviral 1.0.0
MCP protocol
2025-06-18
Tools
14 advertised
Resources
5 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "events": {},
  "resources": {
    "subscribe": false,
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

MakeViral makes trend videos and photos from the user's own photos with ready-made templates, and AI images and videos from the user's own prompt with a chosen model (MakeViral Create). Each run uses credits from the user's MakeViral account, and a failed run returns them. Tell the user the price in credits before a run. Use only photos of the user or of adults who agreed, never photos of children or public figures. Templates: search_templates, get_template, then run_template. For a video, call get_run with wait true until it is done. Own prompt: list_models, get_model, then create_image or create_video. For a video, call get_creation with wait true until it is ready.

Tools

14 advertised

search_templates — Find trend templates
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find MakeViral trend templates: viral AI video and photo trends (knight cat, hotel lobby walk, Halloween costumes, dance reels...) that turn the user's own photos of themselves, their partner, friends or pets into a short video or photo. Use it when the user wants a trend video, asks what they can make from a photo, or names a TikTok or Instagram trend. Results are sorted by popularity and show an example clip, the photos needed and the price in MakeViral credits. With no query it returns the most popular templates. Suggest a few that fit and say that each one costs credits from the user's MakeViral account, then use get_template when the user picks one.

search_templates input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "default": 8,
      "maximum": 30,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "description": "Words for the trend or idea, e.g. 'knight cat', 'halloween couple', 'dance'"
    },
    "output": {
      "enum": [
        "photo",
        "video"
      ],
      "type": "string"
    },
    "season": {
      "type": "string",
      "description": "e.g. 'halloween'"
    },
    "subject": {
      "enum": [
        "person",
        "pet",
        "couple",
        "group",
        "product"
      ],
      "type": "string",
      "description": "Who or what is in the photos (product = a brand ad from a product photo and a logo)"
    }
  },
  "additionalProperties": false
}
search_templates output schema
{
  "type": "object",
  "required": [
    "templates"
  ],
  "properties": {
    "account": {
      "type": "object",
      "required": [
        "credits"
      ],
      "properties": {
        "credits": {
          "type": "number"
        }
      }
    },
    "templates": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "slug",
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "outputs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "pageUrl": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "subjects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "versions": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "alsoKnownAs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "fromCredits": {
            "type": "number"
          }
        }
      }
    }
  }
}
search_templates annotations
{
  "title": "Find trend templates",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_template — Show a template
Advertised by the server during the last successful anonymous check.
Advertised read-only

Show one MakeViral template: what it makes, its versions (for example solo, with a friend, with a pet), the photos each version needs in order, quality options, optional 'make it yours' fields, the price in credits, the user's credit balance when signed in, and an example clip. Use it when the user names or picks one template. Call it before run_template so you pass the right version and photos, and tell the user the price in credits.

get_template input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "description": "Template slug from search_templates, e.g. 'knight-cat-ai-video'"
    }
  },
  "additionalProperties": false
}
get_template output schema
{
  "type": "object",
  "required": [
    "template"
  ],
  "properties": {
    "account": {
      "type": "object",
      "required": [
        "credits"
      ],
      "properties": {
        "credits": {
          "type": "number"
        }
      }
    },
    "template": {
      "type": "object"
    }
  }
}
get_template annotations
{
  "title": "Show a template",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
run_template — Make a trend video or photo
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Make a MakeViral trend video or photo from the user's photos. It spends the version's credits from the user's MakeViral account (a failed run gives them all back). A photo is usually ready in this call and the result has the link. A video takes a few minutes: then call get_run with wait true until it is ready, and give the user the link. Before calling: 1) pick the template and version with get_template, 2) tell the user the price in credits, 3) ask for exactly the photos that version needs, in its order, 4) ask the user to confirm the people in the photos are them or people who agreed, and that no one in them is a child. Photos: pass the files the user attached in this chat as `photos`, OR public image links as `photoUrls`, OR an `uploadId` from create_upload_link when the user cannot attach files here. Never use photos of a public figure or of someone who did not agree.

run_template input schema
{
  "type": "object",
  "required": [
    "template",
    "photosConsent"
  ],
  "properties": {
    "fields": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "value"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "maxItems": 20,
      "description": "Optional 'make it yours' values: one { id, value } per field id that get_template lists"
    },
    "object": {
      "type": "object",
      "properties": {
        "pick": {
          "type": "string"
        },
        "text": {
          "type": "string",
          "maxLength": 60
        }
      },
      "description": "Knight sword swap only: the object one knight hands the other",
      "additionalProperties": false
    },
    "photos": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "download_url",
          "file_id"
        ],
        "properties": {
          "file_id": {
            "type": "string"
          },
          "file_name": {
            "type": "string"
          },
          "mime_type": {
            "type": "string"
          },
          "download_url": {
            "type": "string",
            "description": "Temporary link to the file"
          }
        },
        "additionalProperties": false
      },
      "maxItems": 4,
      "description": "The user's photos attached in the chat, in the version's photo order"
    },
    "quality": {
      "type": "string",
      "description": "Quality option id from get_template. Default: the template's default option (listed first)."
    },
    "version": {
      "type": "string",
      "description": "Version id from get_template. Default 'main'."
    },
    "template": {
      "type": "string",
      "description": "Template slug, e.g. 'knight-cat-ai-video'"
    },
    "uploadId": {
      "type": "string",
      "description": "The id from create_upload_link, after the user added the photos there"
    },
    "photoUrls": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 4,
      "description": "Public https links to the photos (JPEG, PNG or WebP), in the version's photo order"
    },
    "requestId": {
      "type": "string",
      "description": "Optional id (8-64 letters, digits, - or _). The same id never charges twice. Without it, the same request within 10 minutes returns the first run; pass a new id to make it again with the same photos."
    },
    "photosConsent": {
      "type": "boolean",
      "description": "true only after the user confirmed that everyone in the photos is the user or agreed to it, and that no one is a child"
    }
  },
  "additionalProperties": false
}
run_template output schema
{
  "type": "object",
  "required": [
    "run"
  ],
  "properties": {
    "run": {
      "type": "object",
      "required": [
        "id",
        "status",
        "template",
        "name",
        "output"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "error": {
          "type": "string"
        },
        "appUrl": {
          "type": "string"
        },
        "output": {
          "enum": [
            "photo",
            "video"
          ],
          "type": "string"
        },
        "status": {
          "enum": [
            "processing",
            "completed",
            "failed"
          ],
          "type": "string"
        },
        "saveUrl": {
          "type": "string"
        },
        "version": {
          "type": "string"
        },
        "template": {
          "type": "string"
        },
        "resultUrl": {
          "type": "string"
        },
        "etaMinutes": {
          "type": "number"
        },
        "previewUrl": {
          "type": "string"
        },
        "creditsCharged": {
          "type": "number"
        },
        "silentVideoUrl": {
          "type": "string"
        },
        "creditsRefunded": {
          "type": "number"
        }
      }
    }
  }
}
run_template annotations
{
  "title": "Make a trend video or photo",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
get_run — Check a run
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check a MakeViral run started with run_template: its status, minutes left, and the finished video or photo link when it is ready. With wait true the call waits up to 40 seconds for the run to finish, so you can wait for the result in the same answer and then give the user the link.

get_run input schema
{
  "type": "object",
  "required": [
    "runId"
  ],
  "properties": {
    "wait": {
      "type": "boolean",
      "description": "Wait up to 40 seconds for the run to finish before answering. Default false."
    },
    "runId": {
      "type": "string",
      "description": "The run id from run_template, e.g. 'tr_ag...'"
    }
  },
  "additionalProperties": false
}
get_run output schema
{
  "type": "object",
  "required": [
    "run"
  ],
  "properties": {
    "run": {
      "type": "object",
      "required": [
        "id",
        "status",
        "template",
        "name",
        "output"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "error": {
          "type": "string"
        },
        "appUrl": {
          "type": "string"
        },
        "output": {
          "enum": [
            "photo",
            "video"
          ],
          "type": "string"
        },
        "status": {
          "enum": [
            "processing",
            "completed",
            "failed"
          ],
          "type": "string"
        },
        "saveUrl": {
          "type": "string"
        },
        "version": {
          "type": "string"
        },
        "template": {
          "type": "string"
        },
        "resultUrl": {
          "type": "string"
        },
        "etaMinutes": {
          "type": "number"
        },
        "previewUrl": {
          "type": "string"
        },
        "creditsCharged": {
          "type": "number"
        },
        "silentVideoUrl": {
          "type": "string"
        },
        "creditsRefunded": {
          "type": "number"
        }
      }
    }
  }
}
get_run annotations
{
  "title": "Check a run",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_runs — List my runs
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the user's latest MakeViral template runs (newest first) with their status and result links.

list_runs input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 20,
      "minimum": 1
    }
  },
  "additionalProperties": false
}
list_runs output schema
{
  "type": "object",
  "required": [
    "runs"
  ],
  "properties": {
    "runs": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
list_runs annotations
{
  "title": "List my runs",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_models — List AI image and video models
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the AI models of MakeViral Create (makeviral.ai/create): image models (Nano Banana, GPT Image, Seedream, Flux...) and video models (Seedance, Kling, Veo, Wan, Grok Imagine, MiniMax...) with what each takes and its lowest price in MakeViral credits. Use it when the user asks MakeViral for an image or a video from their own idea (not a trend template), wants a specific model such as Kling, Veo or Seedance, or asks which MakeViral model to use. Then use get_model for one model's full rules and prices, and create_image or create_video to make it.

list_models input schema
{
  "type": "object",
  "properties": {
    "kind": {
      "enum": [
        "image",
        "video"
      ],
      "type": "string",
      "description": "Only image models or only video models"
    }
  },
  "additionalProperties": false
}
list_models output schema
{
  "type": "object",
  "required": [
    "models"
  ],
  "properties": {
    "models": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "kind",
          "name",
          "fromCredits"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "image",
              "video"
            ],
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "maker": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "fromCredits": {
            "type": "number"
          }
        }
      }
    },
    "account": {
      "type": "object",
      "required": [
        "credits"
      ],
      "properties": {
        "credits": {
          "type": "number"
        }
      }
    }
  }
}
list_models annotations
{
  "title": "List AI image and video models",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_model — Show a model and its prices
Advertised by the server during the last successful anonymous check.
Advertised read-only

Show one MakeViral Create model: the shapes, sizes and lengths it makes, the photos, clips and sounds it takes, special inputs (end frame, multi-shot, elements, motion style), and the price in credits for every size and length. With resolution, durationSec and count it also gives the exact price of that choice, so you can tell the user before create_image or create_video.

get_model input schema
{
  "type": "object",
  "required": [
    "model"
  ],
  "properties": {
    "count": {
      "type": "integer",
      "maximum": 4,
      "minimum": 1,
      "description": "Optional, how many to price"
    },
    "model": {
      "enum": [
        "nano-banana-pro",
        "nano-banana-2-1",
        "nano-banana-2",
        "gpt-image-2-5",
        "seedream-5-pro",
        "flux-2-pro",
        "z-image",
        "seedance-2-5",
        "kling-3-pro",
        "kling-3-omni",
        "veo-3-1-fast",
        "wan-3",
        "minimax-h3",
        "seedance-2",
        "veo-3-1-quality",
        "veo-3-1-lite",
        "seedance-2-fast",
        "grok-imagine",
        "seedance-2-mini"
      ],
      "type": "string",
      "description": "Model id from list_models"
    },
    "resolution": {
      "type": "string",
      "description": "Optional, to price one choice: e.g. '2K' (image) or '720p' (video)"
    },
    "clipSeconds": {
      "type": "number",
      "maximum": 120,
      "minimum": 0,
      "description": "Optional, seconds of a reference clip (they add to the price)"
    },
    "durationSec": {
      "type": "integer",
      "maximum": 60,
      "minimum": 1,
      "description": "Optional, video length to price"
    },
    "referencePhotos": {
      "type": "integer",
      "maximum": 20,
      "minimum": 0,
      "description": "Optional, video reference photos (one model charges for more than 5)"
    }
  },
  "additionalProperties": false
}
get_model output schema
{
  "type": "object",
  "required": [
    "model",
    "prices"
  ],
  "properties": {
    "model": {
      "type": "object"
    },
    "quote": {
      "type": "object",
      "properties": {
        "credits": {
          "type": "number"
        }
      }
    },
    "prices": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "account": {
      "type": "object",
      "required": [
        "credits"
      ],
      "properties": {
        "credits": {
          "type": "number"
        }
      }
    }
  }
}
get_model annotations
{
  "title": "Show a model and its prices",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_image — Make an AI image
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Make AI images from the user's prompt with a chosen MakeViral Create model, from text or from the user's photos (edit a photo, put a person in a new scene, combine photos). It spends credits from the user's MakeViral account (a failed image gives them back) and usually returns the finished image link in this call. Before calling: 1) pick the model (get_model gives its sizes and prices), 2) tell the user the price in credits, 3) when photos are used, ask the user to confirm the people in them are them or agreed, and that no one is a child. Photos: pass the files the user attached in this chat as `photos`, or public image links as `photoUrls`. Never use photos of a public figure or of someone who did not agree. Calling again with the same input within 10 minutes returns the first result; pass a new requestId to make more.

create_image input schema
{
  "type": "object",
  "required": [
    "model",
    "prompt"
  ],
  "properties": {
    "count": {
      "type": "integer",
      "maximum": 4,
      "minimum": 1,
      "description": "How many images (each one is charged). Default 1."
    },
    "model": {
      "enum": [
        "nano-banana-pro",
        "nano-banana-2-1",
        "nano-banana-2",
        "gpt-image-2-5",
        "seedream-5-pro",
        "flux-2-pro",
        "z-image"
      ],
      "type": "string",
      "description": "Image model id (list_models). nano-banana-2 is a good default."
    },
    "aspect": {
      "enum": [
        "9:16",
        "16:9",
        "1:1",
        "4:3",
        "3:4",
        "4:5",
        "3:2",
        "2:3",
        "21:9",
        "5:4"
      ],
      "type": "string",
      "description": "Shape. Default 9:16 (vertical, for TikTok and Reels)."
    },
    "photos": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "download_url",
          "file_id"
        ],
        "properties": {
          "file_id": {
            "type": "string"
          },
          "file_name": {
            "type": "string"
          },
          "mime_type": {
            "type": "string"
          },
          "download_url": {
            "type": "string",
            "description": "Temporary link to the file"
          }
        },
        "additionalProperties": false
      },
      "maxItems": 10,
      "description": "The user's photos attached in the chat (references to edit or follow)"
    },
    "prompt": {
      "type": "string",
      "description": "What the image shows, in the user's words, made clear and specific"
    },
    "photoUrls": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 10,
      "description": "Public https links to photos (JPEG, PNG or WebP)"
    },
    "requestId": {
      "type": "string",
      "description": "Optional id (8-64 letters, digits, - or _). The same id never charges twice."
    },
    "resolution": {
      "enum": [
        "1K",
        "2K",
        "4K"
      ],
      "type": "string",
      "description": "Size. Default: the model's smallest (1K)."
    },
    "photosConsent": {
      "type": "boolean",
      "description": "Needed with photos: true only after the user confirmed everyone in them is the user or agreed, and no one is a child"
    },
    "transparentBackground": {
      "type": "boolean",
      "description": "GPT Image only, text only: a transparent background"
    }
  },
  "additionalProperties": false
}
create_image output schema
{
  "type": "object",
  "required": [
    "creations"
  ],
  "properties": {
    "creations": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "kind",
          "status",
          "model",
          "modelName"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "image",
              "video"
            ],
            "type": "string"
          },
          "error": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "sound": {
            "type": "boolean"
          },
          "appUrl": {
            "type": "string"
          },
          "aspect": {
            "type": "string"
          },
          "prompt": {
            "type": "string"
          },
          "status": {
            "enum": [
              "processing",
              "completed",
              "failed"
            ],
            "type": "string"
          },
          "saveUrl": {
            "type": "string"
          },
          "modelName": {
            "type": "string"
          },
          "etaMinutes": {
            "type": "number"
          },
          "previewUrl": {
            "type": "string"
          },
          "resolution": {
            "type": "string"
          },
          "durationSec": {
            "type": "number"
          },
          "creditsCharged": {
            "type": "number"
          },
          "creditsRefunded": {
            "type": "number"
          }
        }
      }
    }
  }
}
create_image annotations
{
  "title": "Make an AI image",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
create_video — Make an AI video
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Make an AI video from the user's prompt with a chosen MakeViral Create model (Seedance, Kling, Veo, Wan, Grok Imagine, MiniMax...): from text, from a start frame photo (and an end frame on some models), or from references (photos, clips and sounds), with Kling multi-shot and elements. It spends credits from the user's MakeViral account (a failed video gives them back). A video takes a few minutes: this call returns at once, then call get_creation with wait true until it is ready and give the user the link. Before calling: 1) pick the model and check what it takes with get_model, 2) tell the user the price in credits, 3) with photos or clips, ask the user to confirm the people in them are them or agreed, and that no one is a child. Files: pass files the user attached in this chat (startFrame, endFrame, referencePhotos, referenceSounds), or public https links in the *Url fields. Clips must be links (MP4 or MOV). Never use photos of a public figure or of someone who did not agree. Calling again with the same input within 10 minutes returns the first video; pass a new requestId to make another.

create_video input schema
{
  "type": "object",
  "required": [
    "model"
  ],
  "properties": {
    "seed": {
      "type": "integer",
      "minimum": 0,
      "description": "Wan only: repeat a result"
    },
    "count": {
      "type": "integer",
      "maximum": 2,
      "minimum": 1,
      "description": "How many videos (each one is charged). Default 1."
    },
    "model": {
      "enum": [
        "seedance-2-5",
        "kling-3-pro",
        "kling-3-omni",
        "veo-3-1-fast",
        "wan-3",
        "minimax-h3",
        "seedance-2",
        "veo-3-1-quality",
        "veo-3-1-lite",
        "seedance-2-fast",
        "grok-imagine",
        "seedance-2-mini"
      ],
      "type": "string",
      "description": "Video model id (list_models). seedance-2-5 is a good default."
    },
    "shots": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "prompt",
          "durationSec"
        ],
        "properties": {
          "prompt": {
            "type": "string"
          },
          "durationSec": {
            "type": "integer",
            "maximum": 15,
            "minimum": 1
          }
        },
        "additionalProperties": false
      },
      "maxItems": 6,
      "minItems": 2,
      "description": "Kling multi-shot: each shot's prompt and length; they add up to the video length"
    },
    "sound": {
      "type": "boolean",
      "description": "Sound on or off where the model has the choice. Default on."
    },
    "aspect": {
      "enum": [
        "9:16",
        "3:4",
        "1:1",
        "4:3",
        "16:9",
        "21:9",
        "2:3",
        "3:2"
      ],
      "type": "string",
      "description": "Shape. Default 9:16 (vertical). With a start frame most models follow the photo's shape."
    },
    "motion": {
      "enum": [
        "normal",
        "fun"
      ],
      "type": "string",
      "description": "Grok Imagine only"
    },
    "prompt": {
      "type": "string",
      "description": "What happens in the video. With references, name them as get_model says (e.g. [Image 1])."
    },
    "clipMode": {
      "enum": [
        "edit",
        "reference"
      ],
      "type": "string",
      "description": "Kling Omni with a clip: 'edit' changes the clip itself (default), 'reference' makes a new video from it"
    },
    "elements": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "description"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Lower case, e.g. 'mia'; write @mia in the prompt"
          },
          "photoUrls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 4,
            "description": "2-4 public photo links of it"
          },
          "photoCount": {
            "type": "integer",
            "maximum": 4,
            "minimum": 1,
            "description": "How many of elementPhotos belong to it, in order"
          },
          "description": {
            "type": "string",
            "description": "Who or what it is, in a few words"
          }
        },
        "additionalProperties": false
      },
      "maxItems": 3,
      "description": "Kling 3.0 elements: people or things from 2-4 photos each"
    },
    "endFrame": {
      "type": "object",
      "required": [
        "download_url",
        "file_id"
      ],
      "properties": {
        "file_id": {
          "type": "string"
        },
        "file_name": {
          "type": "string"
        },
        "mime_type": {
          "type": "string"
        },
        "download_url": {
          "type": "string",
          "description": "Temporary link to the file"
        }
      },
      "description": "The last frame (models with an end frame), with a start frame",
      "additionalProperties": false
    },
    "autoShots": {
      "type": "boolean",
      "description": "Kling Omni: the model plans the shots itself"
    },
    "requestId": {
      "type": "string",
      "description": "Optional id (8-64 letters, digits, - or _). The same id never charges twice."
    },
    "webSearch": {
      "type": "boolean",
      "description": "Seedance, text to video only: look things up online"
    },
    "resolution": {
      "enum": [
        "480p",
        "720p",
        "1080p",
        "4k",
        "768p",
        "2k"
      ],
      "type": "string",
      "description": "Size. Default: the model's smallest."
    },
    "startFrame": {
      "type": "object",
      "required": [
        "download_url",
        "file_id"
      ],
      "properties": {
        "file_id": {
          "type": "string"
        },
        "file_name": {
          "type": "string"
        },
        "mime_type": {
          "type": "string"
        },
        "download_url": {
          "type": "string",
          "description": "Temporary link to the file"
        }
      },
      "description": "The first frame: a photo the user attached in the chat",
      "additionalProperties": false
    },
    "durationSec": {
      "type": "integer",
      "maximum": 30,
      "minimum": 1,
      "description": "Length in seconds (get_model lists them). Default: the model's default."
    },
    "endFrameUrl": {
      "type": "string",
      "description": "The last frame as a public https photo link"
    },
    "elementPhotos": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "download_url",
          "file_id"
        ],
        "properties": {
          "file_id": {
            "type": "string"
          },
          "file_name": {
            "type": "string"
          },
          "mime_type": {
            "type": "string"
          },
          "download_url": {
            "type": "string",
            "description": "Temporary link to the file"
          }
        },
        "additionalProperties": false
      },
      "maxItems": 12,
      "description": "The element photos attached in the chat, element by element in order"
    },
    "keepClipSound": {
      "type": "boolean",
      "description": "With a clip: put the clip's own sound on the result"
    },
    "photosConsent": {
      "type": "boolean",
      "description": "Needed with photos or clips: true only after the user confirmed everyone in them is the user or agreed, and no one is a child"
    },
    "startFrameUrl": {
      "type": "string",
      "description": "The first frame as a public https photo link"
    },
    "referenceClips": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "download_url",
          "file_id"
        ],
        "properties": {
          "file_id": {
            "type": "string"
          },
          "file_name": {
            "type": "string"
          },
          "mime_type": {
            "type": "string"
          },
          "download_url": {
            "type": "string",
            "description": "Temporary link to the file"
          }
        },
        "additionalProperties": false
      },
      "maxItems": 3,
      "description": "Reference clips (MP4 or MOV) as files, where the chat can attach them"
    },
    "referencePhotos": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "download_url",
          "file_id"
        ],
        "properties": {
          "file_id": {
            "type": "string"
          },
          "file_name": {
            "type": "string"
          },
          "mime_type": {
            "type": "string"
          },
          "download_url": {
            "type": "string",
            "description": "Temporary link to the file"
          }
        },
        "additionalProperties": false
      },
      "maxItems": 9,
      "description": "Reference photos attached in the chat (people, products, a style). Never with frames."
    },
    "referenceSounds": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "download_url",
          "file_id"
        ],
        "properties": {
          "file_id": {
            "type": "string"
          },
          "file_name": {
            "type": "string"
          },
          "mime_type": {
            "type": "string"
          },
          "download_url": {
            "type": "string",
            "description": "Temporary link to the file"
          }
        },
        "additionalProperties": false
      },
      "maxItems": 3,
      "description": "Reference sounds (MP3 or WAV) attached in the chat"
    },
    "referenceClipUrls": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 3,
      "description": "Reference clips as public https links to an MP4 or MOV file"
    },
    "referencePhotoUrls": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 9,
      "description": "Reference photos as public https links"
    },
    "referenceSoundUrls": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 3,
      "description": "Reference sounds as public https links"
    }
  },
  "additionalProperties": false
}
create_video output schema
{
  "type": "object",
  "required": [
    "creations"
  ],
  "properties": {
    "creations": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "kind",
          "status",
          "model",
          "modelName"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "image",
              "video"
            ],
            "type": "string"
          },
          "error": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "sound": {
            "type": "boolean"
          },
          "appUrl": {
            "type": "string"
          },
          "aspect": {
            "type": "string"
          },
          "prompt": {
            "type": "string"
          },
          "status": {
            "enum": [
              "processing",
              "completed",
              "failed"
            ],
            "type": "string"
          },
          "saveUrl": {
            "type": "string"
          },
          "modelName": {
            "type": "string"
          },
          "etaMinutes": {
            "type": "number"
          },
          "previewUrl": {
            "type": "string"
          },
          "resolution": {
            "type": "string"
          },
          "durationSec": {
            "type": "number"
          },
          "creditsCharged": {
            "type": "number"
          },
          "creditsRefunded": {
            "type": "number"
          }
        }
      }
    }
  }
}
create_video annotations
{
  "title": "Make an AI video",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
get_creation — Check an image or video
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check images or videos started with create_image or create_video: status, minutes left, and the finished link when ready. With wait true the call waits up to 40 seconds for them to finish, so you can wait for the result in the same answer and then give the user the link.

get_creation input schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "One id (instead of ids)"
    },
    "ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 4,
      "minItems": 1,
      "description": "Ids from create_image or create_video, e.g. 'vid_...'"
    },
    "wait": {
      "type": "boolean",
      "description": "Wait up to 40 seconds for them to finish. Default false."
    }
  },
  "additionalProperties": false
}
get_creation output schema
{
  "type": "object",
  "required": [
    "creations"
  ],
  "properties": {
    "creations": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "kind",
          "status",
          "model",
          "modelName"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "image",
              "video"
            ],
            "type": "string"
          },
          "error": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "sound": {
            "type": "boolean"
          },
          "appUrl": {
            "type": "string"
          },
          "aspect": {
            "type": "string"
          },
          "prompt": {
            "type": "string"
          },
          "status": {
            "enum": [
              "processing",
              "completed",
              "failed"
            ],
            "type": "string"
          },
          "saveUrl": {
            "type": "string"
          },
          "modelName": {
            "type": "string"
          },
          "etaMinutes": {
            "type": "number"
          },
          "previewUrl": {
            "type": "string"
          },
          "resolution": {
            "type": "string"
          },
          "durationSec": {
            "type": "number"
          },
          "creditsCharged": {
            "type": "number"
          },
          "creditsRefunded": {
            "type": "number"
          }
        }
      }
    }
  }
}
get_creation annotations
{
  "title": "Check an image or video",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_creations — List my images and videos
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the user's latest MakeViral Create images and videos (newest first) with their status and links. Template runs are in list_runs.

list_creations input schema
{
  "type": "object",
  "properties": {
    "kind": {
      "enum": [
        "image",
        "video"
      ],
      "type": "string"
    },
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 20,
      "minimum": 1
    }
  },
  "additionalProperties": false
}
list_creations output schema
{
  "type": "object",
  "required": [
    "creations"
  ],
  "properties": {
    "creations": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "kind",
          "status",
          "model",
          "modelName"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "image",
              "video"
            ],
            "type": "string"
          },
          "error": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "sound": {
            "type": "boolean"
          },
          "appUrl": {
            "type": "string"
          },
          "aspect": {
            "type": "string"
          },
          "prompt": {
            "type": "string"
          },
          "status": {
            "enum": [
              "processing",
              "completed",
              "failed"
            ],
            "type": "string"
          },
          "saveUrl": {
            "type": "string"
          },
          "modelName": {
            "type": "string"
          },
          "etaMinutes": {
            "type": "number"
          },
          "previewUrl": {
            "type": "string"
          },
          "resolution": {
            "type": "string"
          },
          "durationSec": {
            "type": "number"
          },
          "creditsCharged": {
            "type": "number"
          },
          "creditsRefunded": {
            "type": "number"
          }
        }
      }
    }
  }
}
list_creations annotations
{
  "title": "List my images and videos",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_account — Show my credits
Advertised by the server during the last successful anonymous check.
Advertised read-only

Show the signed-in MakeViral account: its first name and credit balance. Every run uses credits, so use it before a run when the price might be more than the balance.

get_account input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
get_account output schema
{
  "type": "object",
  "required": [
    "credits"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "credits": {
      "type": "number"
    },
    "infoUrl": {
      "type": "string"
    }
  }
}
get_account annotations
{
  "title": "Show my credits",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_upload_link — Get a photo upload link
Advertised by the server during the last successful anonymous check.

Make a one-hour link where the user adds the photos for a template on makeviral.ai (on any device). Use it when the user cannot attach photos in this chat. Give the user the link, wait until they say they are done, then call run_template with the returned uploadId.

create_upload_link input schema
{
  "type": "object",
  "required": [
    "template"
  ],
  "properties": {
    "version": {
      "type": "string",
      "description": "Version id. Default 'main'."
    },
    "template": {
      "type": "string",
      "description": "Template slug"
    }
  },
  "additionalProperties": false
}
create_upload_link output schema
{
  "type": "object",
  "required": [
    "uploadId",
    "url"
  ],
  "properties": {
    "url": {
      "type": "string"
    },
    "slots": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "uploadId": {
      "type": "string"
    }
  }
}
create_upload_link annotations
{
  "title": "Get a photo upload link",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
suggest_template — Suggest a new template
Advertised by the server during the last successful anonymous check.

Send MakeViral a trend or idea that has no template yet, so the team can add it. Use it when search_templates finds nothing that fits what the user wants, and only after the user agrees. Include the TikTok or Instagram link of the trend when the user has one.

suggest_template input schema
{
  "type": "object",
  "required": [
    "idea"
  ],
  "properties": {
    "idea": {
      "type": "string",
      "description": "The trend or idea in one or two sentences"
    },
    "link": {
      "type": "string",
      "description": "Optional https link to an example of the trend"
    }
  },
  "additionalProperties": false
}
suggest_template output schema
{
  "type": "object",
  "required": [
    "received"
  ],
  "properties": {
    "received": {
      "type": "boolean"
    }
  }
}
suggest_template annotations
{
  "title": "Suggest a new template",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

5 advertised

templates — MakeViral templates

Advertised by the server during the last successful anonymous check.

Trend template cards with example clips, and all templates in full screen

templates URI
ui://makeviral/templates-v2.html

MIME type: text/html;profile=mcp-app

template — MakeViral template

Advertised by the server during the last successful anonymous check.

One template: its example, versions, prices and the user's credits

template URI
ui://makeviral/template-v2.html

MIME type: text/html;profile=mcp-app

run — MakeViral run

Advertised by the server during the last successful anonymous check.

A run's progress and the finished video or photo

run URI
ui://makeviral/run-v2.html

MIME type: text/html;profile=mcp-app

creation — MakeViral creation

Advertised by the server during the last successful anonymous check.

AI images and videos from the user's prompt: progress, then the finished files

creation URI
ui://makeviral/create-v1.html

MIME type: text/html;profile=mcp-app

library — MakeViral creations

Advertised by the server during the last successful anonymous check.

The user's latest template runs and Create images and videos, each with a Save button

library URI
ui://makeviral/library-v1.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
844 ms
95th percentile latency
844 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 844 ms · metadata changed · 14 tool(s), 5 resource(s), 0 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http makeviral-mcp https://www.makeviral.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add makeviral-mcp --url https://www.makeviral.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable makeviral-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "makeviral-mcp": {
      "url": "https://www.makeviral.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "makeviral-mcp": {
      "type": "streamableHttp",
      "url": "https://www.makeviral.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start makeviral-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "makeviral-mcp": {
      "type": "http",
      "url": "https://www.makeviral.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http makeviral-mcp https://www.makeviral.ai/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "makeviral-mcp": {
      "url": "https://www.makeviral.ai/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "makeviral-mcp": {
      "serverUrl": "https://www.makeviral.ai/mcp"
    }
  }
}

Let your agent find its tools

Find servers like MakeViral MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run MakeViral MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing