Video tools for agents (trim, captions, 9:16, GIF/MP3) + hire us for fixed-price jobs. No API key.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Hire Gragg Robotics (a small US AI-automation company: an AI agent team plus its founder) to do a one-off job you or your user need done. Fixed prices: size="small" $99 (1-2 business days): a script, spreadsheet, data cleanup/conversion, research brief, video edit package, one-page site. size="medium" $349 (3-5 business days): custom tool or API integration, scraper, report, small web app, or a new hosted tool built for you. size="sprint" $750 (3-5 business days): one business automation deployed on the user's own accounts. Without contact_email you just get the quote. With contact_email (your user's, with their OK) the job is booked: a payment link is emailed, work starts once it is paid, full refund if we cannot deliver.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http agent-tools https://gragg-agent-tools.fly.dev/mcp
Hire Gragg Robotics (a small US AI-automation company: an AI agent team plus its founder) to do a one-off job you or your user need done. Fixed prices: size="small" $99 (1-2 business days): a script, spreadsheet, data cleanup/conversion, research brief, video edit package, one-page site. size="medium" $349 (3-5 business days): custom tool or API integration, scraper, report, small web app, or a new hosted tool built for you. size="sprint" $750 (3-5 business days): one business automation deployed on the user's own accounts. Without contact_email you just get the quote. With contact_email (your user's, with their OK) the job is booked: a payment link is emailed, work starts once it is paid, full refund if we cannot deliver.
| Argument | Type | Description |
|---|---|---|
| size | string | |
| task* | string | |
| deadline | string | |
| deliverable | string | |
| contact_name | string | |
| contact_email | string |
{
"type": "object",
"title": "hire_for_taskArguments",
"required": [
"task"
],
"properties": {
"size": {
"type": "string",
"title": "Size",
"default": "small"
},
"task": {
"type": "string",
"title": "Task"
},
"deadline": {
"type": "string",
"title": "Deadline",
"default": ""
},
"deliverable": {
"type": "string",
"title": "Deliverable",
"default": ""
},
"contact_name": {
"type": "string",
"title": "Contact Name",
"default": ""
},
"contact_email": {
"type": "string",
"title": "Contact Email",
"default": ""
}
}
}Ask for a hosted tool that does not exist here yet (anything from email to video/audio/document work). Say what it should do, give an example input, what you would pay per use, and how often you would use it. We build tools that have paying demand; with a contact_email we confirm the price before building and tell you when it is live.
| Argument | Type | Description |
|---|---|---|
| contact_email | string | |
| example_input | string | |
| uses_per_month | integer | |
| tool_description* | string | |
| price_per_use_usd | number |
{
"type": "object",
"title": "request_toolArguments",
"required": [
"tool_description"
],
"properties": {
"contact_email": {
"type": "string",
"title": "Contact Email",
"default": ""
},
"example_input": {
"type": "string",
"title": "Example Input",
"default": ""
},
"uses_per_month": {
"type": "integer",
"title": "Uses Per Month",
"default": 0
},
"tool_description": {
"type": "string",
"title": "Tool Description"
},
"price_per_use_usd": {
"type": "number",
"title": "Price Per Use Usd",
"default": 0
}
}
}Put a soundtrack on a video. mode = "replace" (new audio only) or "mix" (blend with the original). The audio is cut to the video's length. audio_volume 0.0-2.0 scales the added track.
| Argument | Type | Description |
|---|---|---|
| mode | string | |
| audio_url* | string | |
| video_url* | string | |
| audio_volume | number |
{
"type": "object",
"title": "video_add_audioArguments",
"required": [
"video_url",
"audio_url"
],
"properties": {
"mode": {
"type": "string",
"title": "Mode",
"default": "replace"
},
"audio_url": {
"type": "string",
"title": "Audio Url"
},
"video_url": {
"type": "string",
"title": "Video Url"
},
"audio_volume": {
"type": "number",
"title": "Audio Volume",
"default": 1
}
}
}Burn a text caption/title into a video (white text on a translucent dark box). position = "top", "center" or "bottom". font_size 0 = auto (about 1/18 of the frame height). start_s/end_s (optional) limit when the text shows; default is the whole video. Up to 300 characters; use \n for line breaks.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| text* | string | |
| end_s | number | |
| start_s | number | |
| position | string | |
| font_size | integer |
{
"type": "object",
"title": "video_captionArguments",
"required": [
"url",
"text"
],
"properties": {
"url": {
"type": "string",
"title": "Url"
},
"text": {
"type": "string",
"title": "Text"
},
"end_s": {
"type": "number",
"title": "End S",
"default": -1
},
"start_s": {
"type": "number",
"title": "Start S",
"default": -1
},
"position": {
"type": "string",
"title": "Position",
"default": "bottom"
},
"font_size": {
"type": "integer",
"title": "Font Size",
"default": 0
}
}
}Join 2-10 videos end to end into one MP4. Clips are scaled/letterboxed to one size: the first clip's size unless width/height are given. Clips without audio get silence so the result always has a track.
| Argument | Type | Description |
|---|---|---|
| urls* | array | |
| width | integer | |
| height | integer |
{
"type": "object",
"title": "video_concatArguments",
"required": [
"urls"
],
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string"
},
"title": "Urls"
},
"width": {
"type": "integer",
"title": "Width",
"default": 0
},
"height": {
"type": "integer",
"title": "Height",
"default": 0
}
}
}Convert media to another format. format = "mp4", "webm", "gif" (first 30 s, 480 px wide), "mp3", "m4a" or "wav" (the audio formats extract the soundtrack).
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| format* | string |
{
"type": "object",
"title": "video_convertArguments",
"required": [
"url",
"format"
],
"properties": {
"url": {
"type": "string",
"title": "Url"
},
"format": {
"type": "string",
"title": "Format"
}
}
}Grab still frames as PNG images. Either times_s = [seconds, ...] (up to 20) or count = N evenly spaced frames (1-20). Returns a list of image URLs, useful for thumbnails or for looking at a video.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| count | integer | |
| times_s | any |
{
"type": "object",
"title": "video_extract_framesArguments",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"title": "Url"
},
"count": {
"type": "integer",
"title": "Count",
"default": 0
},
"times_s": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"title": "Times S",
"default": null
}
}
}Inspect a video or audio file: duration, resolution, frame rate, codecs, and whether it has audio. url: public http(s) URL of the file (or an output_url from another tool here).
| Argument | Type | Description |
|---|---|---|
| url* | string |
{
"type": "object",
"title": "video_infoArguments",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"title": "Url"
}
}
}Resize or reframe a video. Either aspect = "9:16" (Shorts/Reels/TikTok), "16:9", "1:1", "4:5", "4:3", or an explicit width and height. mode = "crop" (fill the frame, trim edges) or "pad" (fit inside, black bars).
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| mode | string | |
| width | integer | |
| aspect | string | |
| height | integer |
{
"type": "object",
"title": "video_resizeArguments",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"title": "Url"
},
"mode": {
"type": "string",
"title": "Mode",
"default": "crop"
},
"width": {
"type": "integer",
"title": "Width",
"default": 0
},
"aspect": {
"type": "string",
"title": "Aspect",
"default": ""
},
"height": {
"type": "integer",
"title": "Height",
"default": 0
}
}
}Speed a video up or slow it down. factor 2.0 = twice as fast, 0.5 = half speed (0.25-4.0). Audio pitch is preserved.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| factor* | number |
{
"type": "object",
"title": "video_speedArguments",
"required": [
"url",
"factor"
],
"properties": {
"url": {
"type": "string",
"title": "Url"
},
"factor": {
"type": "number",
"title": "Factor"
}
}
}Cut a clip out of a video (frame-accurate). start_s / end_s are seconds from the beginning. Returns an MP4 (H.264/AAC) output_url.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| end_s* | number | |
| start_s* | number |
{
"type": "object",
"title": "video_trimArguments",
"required": [
"url",
"start_s",
"end_s"
],
"properties": {
"url": {
"type": "string",
"title": "Url"
},
"end_s": {
"type": "number",
"title": "End S"
},
"start_s": {
"type": "number",
"title": "Start S"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 15, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.