Verified conversions across 205 color spaces: CSS strings, gamut checks, .cube LUTs
Say It Again is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Say It Again makes AI UGC videos from a store's product pages. Read a product from its link, write up to 3 scripts from its page, get the price in credits, then make the video: a generated presenter holds, uses or wears the product and speaks the script. A finished video can be changed, made longer, or made in another language or another size.
The server needs a Say It Again team on a paid plan: Lite, Starter, Growth or Scale, from $29 a month (sayitagain.ai/pricing). It is not in the free trial. When your client asks, sign in as your team's owner and allow it. Videos are made with your team's credits, and mcprush charges nothing for the server itself.
Every tool and what it costs: https://sayitagain.ai/docs/api
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http say-it-again-mcp https://app.sayitagain.ai/mcp
# 2 — ask your agent for something these tools do
# get_balance, read_product, write_scripts and 15 more
Say It Again costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it. Its publisher asks you to sign in with OAuth: run /mcp in Claude Code and pick this server, and it opens a browser for that once.
claude mcp add --scope user --transport http say-it-again-mcp https://app.sayitagain.ai/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
18 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
The team's credits, its plan, and how many write_scripts calls it has left (scripts_left). Free.
Takes no parameters.
Read a product's page from its link: its name, price, description, benefits, photos and the angles a video of it can argue, and an id to use in the other tools. Free, and counted against the team's product reads.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | The product's link. |
Write three scripts for a UGC video of a product, to read before making one. Say It Again's own writer writes them from the product read_product read, held to its facts. Free, and counted against the calls get_balance gives as scripts_left. Answers an id at once: call get_scripts with it about once a minute until its status is ready or failed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| product | string | yes | The product's id from read_product, or the product's link. |
| description | string | no | Describe the video: where it happens, what happens and the point it gets across. Words it gives someone to say, in quotes or not, are said as written and follow the rule given for lines. |
| lines | array | no | Lines for the presenter to say, one a shot: 3 to 5 for a 15-second video, up to 10 for 30 seconds. They are said word for word as sent, not translated, and read by no check of ours. With script_id the |
| quality | string | no | fast (the default) or best. |
| seconds | integer | no | The length: fast videos are 15 seconds, best videos 15 or 30 seconds. |
| size | string | no | The shape the video is filmed in. 9:16 is the default. |
| presenters | array | no | Presenter ids from list_presenters. Left out, one is chosen for the product. |
| language | string | no | The language the video is spoken in. Left out, the team's ad language. |
| video_style | string | no | casual (the default), professional or energetic. |
| placement | string | no | Where the product is in the video. auto by default. |
| captions | boolean | no | Captions of what is said, on screen. On by default. |
| angle | string | no | The angle the video argues: auto, the default, or one of the angle ids read_product lists for the product. Not with lines, script_id or ad, which argue their own. |
| ad | string | no | An ad to build the video like, its moves made for this product: a link of an ad in the Meta Ad Library, an ad's id from list_ads or the library, or one of the team's own videos as v- and its id from g |
| keep | string | no | What to keep of the ad: structure, the default, or pacing, its pace and its shots alone. |
Scripts written by write_scripts: queued, in_progress, ready with each script's shots and lines, or failed. Free.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The id write_scripts answered. |
What a video with these choices costs in credits, and whether the team's balance covers it. Free.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| script_id | string | no | The id write_scripts answered, to make one of its scripts as a video. |
| script | integer | no | Which of its scripts, from 1. 1 by default. |
| quality | string | no | fast (the default) or best. |
| seconds | integer | no | The length: fast videos are 15 seconds, best videos 15 or 30 seconds. |
| size | string | no | The shape the video is filmed in. 9:16 is the default. |
| count | integer | no | How many videos to make, each a different take. Not with a script, which is made once for each presenter. |
| presenters | array | no | Presenter ids from list_presenters. Left out, one is chosen for the product. |
| language | string | no | The language the video is spoken in. Left out, the team's ad language. |
| languages | array | no | Up to 3 languages to make a script in at once, each its own video at one video's price, the first taking the place of language. Only with script_id, and not with language or lines; a script with words |
| captions | boolean | no | Captions of what is said, on screen. On by default. |
| video_style | string | no | casual (the default), professional or energetic. |
| placement | string | no | Where the product is in the video. auto by default. |
| angle | string | no | The angle the video argues: auto, the default, or one of the angle ids read_product lists for the product. Not with lines, script_id or ad, which argue their own. |
| ad | string | no | An ad to build the video like, its moves made for this product: a link of an ad in the Meta Ad Library, an ad's id from list_ads or the library, or one of the team's own videos as v- and its id from g |
| keep | string | no | What to keep of the ad: structure, the default, or pacing, its pace and its shots alone. |
Make a UGC video of a product. This spends the team's credits: the price quote_video gives for the same choices, refunded if the video fails. Answers an id at once, and with languages an id for each language in ids: call get_video with each about once a minute until its status is ready or failed, which takes a few minutes.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| product | string | yes | The product's id from read_product, or the product's link. |
| script_id | string | no | The id write_scripts answered, to make one of its scripts as a video. |
| script | integer | no | Which of its scripts, from 1. 1 by default. |
| quality | string | no | fast (the default) or best. |
| seconds | integer | no | The length: fast videos are 15 seconds, best videos 15 or 30 seconds. |
| size | string | no | The shape the video is filmed in. 9:16 is the default. |
| count | integer | no | How many videos to make, each a different take. Not with a script, which is made once for each presenter. |
| presenters | array | no | Presenter ids from list_presenters. Left out, one is chosen for the product. |
| language | string | no | The language the video is spoken in. Left out, the team's ad language. |
| languages | array | no | Up to 3 languages to make a script in at once, each its own video at one video's price, the first taking the place of language. Only with script_id, and not with language or lines; a script with words |
| captions | boolean | no | Captions of what is said, on screen. On by default. |
| video_style | string | no | casual (the default), professional or energetic. |
| placement | string | no | Where the product is in the video. auto by default. |
| angle | string | no | The angle the video argues: auto, the default, or one of the angle ids read_product lists for the product. Not with lines, script_id or ad, which argue their own. |
| ad | string | no | An ad to build the video like, its moves made for this product: a link of an ad in the Meta Ad Library, an ad's id from list_ads or the library, or one of the team's own videos as v- and its id from g |
| keep | string | no | What to keep of the ad: structure, the default, or pacing, its pace and its shots alone. |
| description | string | no | Describe the video: where it happens, what happens and the point it gets across. Words it gives someone to say, in quotes or not, are said as written and follow the rule given for lines. |
| lines | array | no | Lines for the presenter to say, one a shot: 3 to 5 for a 15-second video, up to 10 for 30 seconds. They are said word for word as sent, not translated, and read by no check of ours. With script_id the |
| photos | array | no | Photo links from read_product to film the product from. |
| idempotency_key | string | yes | Any string unique to this video. Calling again with the same key and the same arguments answers as the first call did and spends nothing more. |
How a video from make_video, or from a step after one, is going: queued, in_progress, ready or failed. Once ready, each video has after_steps, the steps it offers next with their prices in credits. Each ready video's download_url is made new in every answer and works for the next hour: its download_expires_in_seconds is the seconds it has left as that answer is made. For a later download, call get
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The id make_video answered. |
The team's UGC videos, newest first. Each ready video's download_url is made new in every answer and works for the next hour: its download_expires_in_seconds is the seconds it has left as that answer is made. For a later download, call get_video again for a new link. Free.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | How many videos to list. 20 by default. |
| after | string | no | The next value the page before answered, for the page after it. |
The presenters a video can be made with, by id: ours and the ones the team described. Free.
Takes no parameters.
Draw a presenter of the team's own from a description of how they look, as the app's Describe a presenter does: an adult, invented, not a real person or a character. Free, and counted against the team's 5 drawings a day; a description refused, or a drawing that fails, gives its drawing back. Answers an id at once: call get_described with it every few seconds until its status is ready or refused.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| description | string | yes | How the presenter looks: age, hair, clothes, manner. In a few words or more. |
| name | string | no | A name to call them by. Left out, they are numbered. |
How a drawing from describe_presenter is going: checking, drawing, ready with its 3 pictures, each by its number with a link that works for an hour, and the voice the description said if it said one, or refused with why. The person chooses one of the pictures, which keep_presenter keeps. Free.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The id describe_presenter answered. |
Keep one picture of a drawing as one of the team's presenters, with the voice the person chose for them. Answers the presenter's id, for presenters in the other tools. Free.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The id describe_presenter answered. |
| picture | integer | yes | The number of the picture to keep. |
| voice | string | no | A woman's voice or a man's voice, which an Arabic video asks for: the person's choice, which a picture does not tell. |
Say or change the voice one of the team's described presenters speaks in, which make_video asks for before an Arabic video with a presenter nobody has given one: the person's choice, which a picture does not tell. Free.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| presenter | string | yes | The described presenter's id from list_presenters. |
| voice | string | yes | A woman's voice or a man's voice. |
Change one finished video as the person asks, made again into a new video beside it, as the app's Change does. This spends the team's credits: the price get_video lists in after_steps as change_video, refunded if it fails. Only for a video whose after_steps offers it. What to change is held to the app's checks: no price, and nothing that gives the presenter a past with the product. Answers an id a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The id of a finished video, from make_video or list_videos. |
| part | string | no | Which of its videos, as get_video names it: v1, the default, v2 and on. |
| change | string | yes | What to change, in the person's words, on one line. |
| credits | integer | yes | The credits after_steps lists for change_video; a different figure is refused. |
| idempotency_key | string | yes | Any string unique to this video. Calling again with the same key and the same arguments answers as the first call did and spends nothing more. |
Make one finished video longer, its take carried on with new lines written from the product page, into a new video beside it, as the app's Make this video 30 seconds does. This spends the team's credits: the price get_video lists in after_steps as make_longer, refunded if it fails. Only for a video whose after_steps offers it. Answers an id at once: call get_video with it about once a minute until
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The id of a finished video, from make_video or list_videos. |
| part | string | no | Which of its videos, as get_video names it: v1, the default, v2 and on. |
| credits | integer | yes | The credits after_steps lists for make_longer; a different figure is refused. |
| idempotency_key | string | yes | Any string unique to this video. Calling again with the same key and the same arguments answers as the first call did and spends nothing more. |
Make one finished video again in another language, its own script and presenter, into a new video beside it, as the app's Another language does. This spends the team's credits: the price get_video lists in after_steps as another_language, or its voiced price for a voiced language, refunded if it fails. Only in a language that after_steps lists for it. Answers an id at once: call get_video with it
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The id of a finished video, from make_video or list_videos. |
| part | string | no | Which of its videos, as get_video names it: v1, the default, v2 and on. |
| language | string | yes | The language to make it in, one after_steps lists. |
| credits | integer | yes | The credits after_steps lists for this language, its voiced price for a voiced language; a different figure is refused. |
| idempotency_key | string | yes | Any string unique to this video. Calling again with the same key and the same arguments answers as the first call did and spends nothing more. |
Lay one finished video out in another size, the same video cut for that frame, as the app's Other sizes does. Free. Only for a video whose after_steps lists other_sizes, in a size it lists. Answers an id at once: call get_video with it every few seconds until its status is ready or failed. The same size asked again answers the one already made or being made.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The id of a finished video, from make_video or list_videos. |
| size | string | yes | The size to lay it out in, one after_steps lists. |
The Meta Ad Library ads the team's store already holds, to build a video like one with ad: its Competitors, the Winning ads of its kind and the library links it pasted, each with its id, advertiser, title, days running and whether it is a video, which ad needs. Free, and nothing is looked up.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| source | string | no | One source alone. All of them by default. |
| limit | integer | no | How many ads to list. 20 by default. |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Say It Again or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.0.1.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Say It Again can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.