Productivity
shorti.ai
Manages Shorti personal insights, creative profiles, referrals, and opportunity pulse with searchable artifact context.
ENDPOINT 1
https://api.shorti.ai/mcp/public-read/mcp
MCP server metadata
- Name
- Shorti Creative R&D
- Version
- 5.2.0+1542da6254e2
Shorti is the source of truth for short-form viral genealogy: analyzed real clips with the borrow-this-move formula — borrow structure, never gear (keep / change / never_touch), the lineage, and audience proof. Map whatever the user asks to ONE capability; never invent — tools abstain honestly when evidence is thin. MEMORY PERMISSION — `creative_memory.memory_posture` is the machine permission: save `host_memory_block` or the user's declared taste ONLY when it is `persist_allowed`. When it is `session_only`, use the capsule in this chat only and do not persist it. LANGUAGE — answer ENTIRELY in the user's language, and pass `locale` ('en', 'ko', or 'ja' = that language) on EVERY call that takes it; payloads are Korean-first with English co-authored fields, so render every section from the matching field or translate the Korean faithfully, and never leave a non-Korean user reading raw Korean. NUMBERS — `observed_metrics` are FACTUAL counts already in the corpus; surface them as proof. Stay numberless only for PREDICTIVE or comparative CLAIMS (no forecast view counts, no Nx/N배, no ROI%). ROUTE BY INTENT — match meaning, not exact words. FIRST CONTACT / 'what can you do' → get_started. A PASTED short-form URL is never a search → preview_pasted_url FIRST. DISCOVER / 'why did this blow up' / '요즘 뭐 떠·이거 왜 떴어' → search_trend_genealogy, then get_trend_genealogy_card exactly once on the selected or best match. THE FORMULA / '뭘 빌려·어떻게 만들어' → get_trend_genealogy_card. REPLICATE ONE CLIP / '콘티·샷리스트·따라 만들기' → get_clone_kit_capsule. MID-SHOOT, ONE CUT AT A TIME / '다음 뭐 찍어·이거 됐어 다음·다시 갈게' → get_next_shot_cue. GRADE THE CLIP I JUST SHOT / '이거 어때·평가해줘' → get_shot_coaching_rubric. THIS WEEK / '이번 주 새 트렌드' → get_lifecycle_briefing. MY TASTE / '내 취향·내 스타일' → get_my_creative_profile. MY SAVED WORK / '저장한 거·내 작업' → list_recent_shorti_artifacts. AN ATELIER / '작업실·방 보여줘' → get_atelier_export. Shorti is the source of truth for short-form viral genealogy: analyzed real clips with the borrow-this-move formula (keep / change / never_touch), the lineage, and audience proof. This connector READS that truth — and, when an ANALYZE action is listed below, it also ANALYZES any short-form URL the user pastes (a fresh public TikTok / Reel / Short, even one not yet in Shorti); for a pasted URL that ANALYZE action is the right tool, not a web browser. Whatever the user asks and HOWEVER they phrase it, map their INTENT to one capability and let each result's deep link carry them into Shorti. Never invent — tools abstain honestly when evidence is thin. METRICS — a node's `observed_metrics` (views/likes/shares/comments) are FACTUAL counts already in Shorti's corpus; surface them as proof. Stay numberless only for PREDICTIVE/comparative performance CLAIMS (no guaranteed/forecast view counts, no Nx/N배, no ROI%). LANGUAGE — answer ENTIRELY in the user's language (the language they asked in). Tool payloads are Korean-first with English co-authored fields where present (move_en/transplant_en, formula_one_liner_en, message_en); render EVERY section (formula, keep/change/avoid, shots, proof, captions, next steps) in the user's language — pick the matching co-authored field or translate the Korean faithfully, and NEVER leave a non-Korean user reading raw Korean. ALWAYS pass `locale` ('en', 'ko', or 'ja' = the user's language) on EVERY call to search_trend_genealogy, get_trend_genealogy_card, get_clone_kit_capsule, get_lifecycle_briefing, get_shot_coaching_rubric, AND get_started — the rendered card/widget reads this locale, so omitting it shows a Korean card to an English user; a Japanese user gets locale='ja' (the card chrome is Japanese, the formula/proof copy falls back to English). This is mandatory on every call, not optional. FIRST CONTACT (a new connection, a greeting, 'what can you do', or 'how many free reads do I have') → get_started: a copy-pasteable menu + the free-quota band; it never spends a read. Its `creative_memory.memory_posture` is the machine permission: save `host_memory_block` or the user's declared taste ONLY when it is `persist_allowed`. When it is `session_only`, use the capsule in this chat only and do not persist it. If creative_memory.state is 'cold', ask its `declare_prompt`; remember the answer only under `persist_allowed`. USE WHAT YOU ALREADY KNOW — if your own memory of this user holds stable creative preferences (category, tone, format, platform, face visibility, product focus, constraints, avoidances), pass up to 4 as `creator_context_hints` on get_my_opportunity_pulse ([{claim_type, value}]); hints rerank that call only and are never stored. When the user states a creative preference, use it in this chat; persistent preference editing continues on Shorti web. ROUTE BY INTENT — match meaning, not exact words: (1) DISCOVER / 'why did this blow up' / 'what's trending' / 'show me the latest short-form trends' / '요즘 뭐 떠·이번주 유행·이거 왜 떴어·트렌드 영상 재생' → search_trend_genealogy as the data-only comparison step, then get_trend_genealogy_card exactly one time on the selected or best match (the interactive card: a clip when durable playback exists, otherwise an evidence still, plus the keep/change/avoid formula + lineage). For a PLURAL ask ('N개·여러 개·몇 개 보여줘·카드로 같이'), call search_trend_genealogy with limit=N and answer from its compact data list; do not render N duplicate widgets. Open one card only after the user selects a family or clearly asks for the best one. When the ask is TIME-BOUND ('이번 주·요즘·지금 유행하는·what's running right now'), also pass moved_within_days — 7 for 이번 주, 30 for 요즘/최근 — which keeps only formulas a NEW CLIP JOINED inside that window; plain search ranks by depth and momentum and will happily return a formula nobody has shot in months. Zero results there is a FACT, not a failure: read movement_window.corpus_days_since_last_move and say how long it has actually been, never that the library is empty, and do not silently retry with a wider window. PAGING: to go deeper, pass a prior response's `next_cursor` straight back as `cursor` on the next search_trend_genealogy call, changing nothing else. If a page returns error='cursor_stale' or snapshot_closed=true, the library RE-RANKED or new work was published under you — call search_trend_genealogy again WITHOUT a cursor and say the list just refreshed. That is never an empty or exhausted library, and never invent the families the dropped page would have held. BUT a PASTED short-form URL is NOT a discover/search: search_trend_genealogy only finds ALREADY-ANALYZED families by topic, never a fresh pasted clip — for a pasted URL call preview_pasted_url FIRST (free, never spends credits: an already-analysed clip answers right here with its genealogy ref + observed counts), then the ANALYZE action below if this connector lists it. (3) REMIX / parody / 'make it mine' / 'follow this' / '이 무브로·내 식으로·따라하고 싶어·패러디·리메이크' → use the card's CTA, which injects a preserve-contract (keep / change / never_touch) you MUST obey: keep the structure, change only the variables, NEVER change never_touch; you author the draft (cost 0). (6) MY SAVED WORK / '내가 저장한 공식·콘티팩·내 작업물' → list_recent_shorti_artifacts, then get_portable_artifact_capsule(public_artifact_ref, detail='working') to resume one with its latest bounded workflow, evidence, and compliance context. If the user asks to save changes after collaborating, continue that save on Shorti web and never store the surrounding transcript. (7) FIT TO MY PRODUCT / 'which trend fits my product' / '내 제품·내 브랜드에 맞춰·내 제품에 맞는 트렌드·어떤 트렌드가 맞아' → list_my_products → get_my_product_truth (the caller's own must-show / must-not-say / required-disclosure), then suggest_trends_for_product to RANK families by formula/structure overlap (numberless bands — NEVER invent a performance or engagement claim; honest-absence if no product truth or match). NO REGISTERED PRODUCT is NOT a dead end: pass the user's plain-language description as suggest_trends_for_product(product_description=...) — the same ranking runs ephemerally (nothing saved), then continue persistent product registration on Shorti web. For a ready-to-act ranked QUEUE of bets for ONE registered product ('오늘 뭐 찍지·바로 실행할 것 줘·내 제품 큐') → list_product_motion_candidates (same evidence, queue-shaped); for the one-question ranking → suggest_trends_for_product. Do NOT eyeball the match yourself. For a private brief or shot plan, open the selected genealogy card or clone kit, keep its measured preserve/change/avoid rails, and continue the draft inside Atelier/Work. Paid brand programs, sponsorship money, and entry or submission status are outside this launch surface. Keep the work inside the creator's private Atelier/Work flow instead of inventing status, money, or submission guidance. (9) NO PRODUCT YET / WHAT'S MISSING / 'how do I add my product' / '제품이 없어·뭐가 필요해·제품 등록' → continue product registration on Shorti web. get_product_onboarding_guidance reports the exact missing slots between steps. Never fabricate product details — ask the user for the truth, and claim review stays an ops step (claims post unreviewed). (10) MY PROFILE / TASTE / MEMORY / 'what do you know about me·my style·my creative profile' / '내 프로필·내 취향·내 스타일·내가 뭐 좋아하는지·기억해' → get_my_creative_profile FIRST (NOT `search`): a query about the USER's own taste/profile/persona is this tool, not artifact search. It returns the viral_signature + preferred categories + a `memory_posture`. Save `host_memory_block` or a declared taste ONLY when the posture is `persist_allowed`; under `session_only`, use it for this chat and do not save it. If state=cold, ask `declare_prompt`, applying that same posture to the answer. Read-only, owner-scoped, numberless. (11) MY REFERRAL LINK / INVITE PEOPLE / EARN CREDITS / 'give me my referral link·how do I invite·친구 초대·추천 링크·레퍼럴 링크 줘·크레딧 받고 싶어' → get_my_referral_link: returns the user's share_url + a ready-to-paste invite + what both sides earn (reward_summary). Offer it for the USER to share — never send it to third parties yourself, and never invent a credit amount beyond reward_summary. (12) DIRECT MY NEXT TAKE / 'what should I keep or change·did I shoot this well·how's my framing' / '다음 촬영 뭘 살리고 바꿔·내가 찍은 거 봐줘·구도 어때' WHEN the user ATTACHED/FILMED a clip, photo, or one-take (NOT a pasted URL) → get_shot_coaching_rubric(intent, matched_ref?, locale, niche?, host_surface?, shoot_location?, shoot_local_date?, shoot_indoor?, take_ref?, previous_take_ref?, current_subject_position?, current_subject_vertical?, current_subject_scale?, current_depth?, current_separation?, current_subject_exposure?, previous_fix_outcome?, previous_verify_ref?, no_apply_reason?). YOU already see the user's media. Apply the detailed rubric privately, then present `take_decision` as the human-facing answer: KEEP the creator/product truth, CHANGE one executable move, and land the mise-en-scène KICK (composition/lighting/blocking) the evidence points to. SAY WHAT YOU SEE — applying the rubric privately is not the same as keeping the observation to yourself. The evidence-grounded CHANGE line exists only when the server holds an observation, so send back the bands you can actually judge on the attached clip: `current_subject_position` (left|center|right), `current_subject_vertical` (high|middle|low), `current_subject_scale` (small|medium|large|dominant), `current_depth` (flat|layered), `current_separation` (fused|partial|separated), `current_subject_exposure` (crushed|under|ok|over|blown). Bands only — never coordinates, never numbers, never an axis you did not actually see; omit what you cannot judge. Use these EXACT tokens, because an unrecognised value is dropped silently rather than refused. Pass `host_surface` as 'claude', 'chatgpt', 'grok', or 'cursor' when the calling host knows its own surface; only 'claude' or 'chatgpt' unlock an evidence-bound host-native scene blueprint. Otherwise pass 'portable'. This is the only switch that lets an evidence-bound host-native scene blueprint reach a capable host. With none of the observation bands and no deep-QC `take_ref` (which a read-only connector cannot mint), `take_decision.change` falls back to generic copy and the creator leaves with no specific fix. Pass `niche` (the creator's OWN declared category — '요리', 'beauty') so a different-niche reference is labelled a structural analog instead of passing as a same-niche match. When the creator says what became of the last fix, relay it as `previous_fix_outcome` (applied|applied_but_missed|not_applied|not_understood), with `no_apply_reason` (gear|space|time|unclear|other) ONLY alongside not_applied — that relay is how the coaching itself improves, and it is recorded as relayed, never as machine-graded. Use `applied_but_missed` when they did the fix and it still did not show ('고쳐서 찍었는데 그대로야·I changed it and it looks the same'); `applied` means it landed. That distinction is the whole point of asking — a creator who applied a fix and still missed can otherwise say so nowhere, and that is the one thing about this shoot no amount of published video can teach us. ALWAYS send `previous_verify_ref` with it: echo `take_decision.verify.ref` from the PREVIOUS answer exactly as it was returned. It is a sealed handle naming which fix that VERIFY beat was about, and without it we learn that something missed but never what. Never construct one. Read shorti_evidence_basis as the REFERENCE's recording, not the user's clip. NEVER claim frame-by-frame inspection. SECOND TAKE — when the creator is re-shooting something they already showed you ('다시 찍었어·이번엔 어때·아까보다 나아졌어?·shot it again·is this better'), pass the EARLIER clip's ref as `previous_take_ref` and the new one as `take_ref`. That is the only thing that produces `take_progress`, which names what got better, what got worse, and what is newly visible, by axis and in the creator's language. It requires deep QC on both takes; without it the answer silently grades the new take alone and cannot say whether the fix worked — which is the one thing the creator asked. Only use refs the creator's own clips produced; never a reference's ref. (17) SAY MY NEXT CUT / MID-SHOOT / 'what do I shoot next·I'm filming now·okay got that one, next·let me redo that·다음 뭐 찍지·이거 찍었어 다음·다시 갈게·지금 찍는 중이야·다음 컷 뭐야' WHEN the user has NOT attached a clip and is asking what to shoot NEXT → get_next_shot_cue(matched_ref, locale, niche?, host_surface?, shoot_cursor?, events?, shoot_location?, shoot_local_date?, shoot_indoor?, take_ref?, previous_take_ref?). Pass `host_surface` with the same exact rule as route (12), and pass `niche` for the same cross-niche honesty as route (12); and when the creator's own last take already carries deep QC, pass its `take_ref` (with `previous_take_ref` for the one before it) — that is the only thing that makes the SPOKEN cue the one fix from their own footage instead of the rail's generic line. This is the BEFORE/DURING lane and (12) is the AFTER lane: (12) grades a take that already exists, this one names the take that does not yet. It opens a beat-by-beat rail from the reference the creator is emulating and hands back ONE cut at a time. It is a LOOP — echo back BOTH `shoot_cursor` and `matched_ref` exactly as the previous result returned them, plus `events`: 'confirm' when they say they got it, 'redo' for another take of the same beat, 'advance' to skip, 'land' to end. Drop either value and the rail restarts or abstains. It abstains honestly when the reference has no recorded beats; do not invent a cut. If no reference is in hand yet, find one first (search_trend_genealogy / get_clone_kit_capsule) rather than calling this with nothing. TRUST GRADE — every cue in `session.current_beat.cues` names the `instrument_lane` that produced it and an `instrument_grade` for that (dimension, lane) pair, and the beat rolls the distinct grades up in `cue_instrument_grades`. `measured` came off an instrument; `derived` was carried over from another recorded quantity; `model_asserted` is a model reading the clip and saying so; `undeclared` has no declaration to read. Speak a `measured` cue as what the reference DID, and the other three as what the record SAYS — never call one of them a measurement. The SAME dimension is measured on one lane and asserted on the other, so read the grade on the cue in hand and never carry it to another cue or beat. SUN CLOCK — both (12) and (17) accept `shoot_location`, `shoot_local_date` and `shoot_indoor`, and they are the ONLY way the shoot returns a `lighting_window`: a real golden-hour plan — which way to put the sun, plus the window times when the reference's own light gives a basis to name an hour ('17:12–18:04 사이, 해를 옆에 두고 찍으세요'). Pass them ONLY when the creator has already told you, in their own words, where or when they are shooting — '강남에서', '밖에서 찍을 건데', '지금 나가는 길', '실내에서', '내일 아침에', 'outside', 'at the cafe', 'tomorrow morning', 'indoors'. NEVER ask for a location to unlock this, never infer one from an IP, a profile or a previous conversation, and keep it COARSE — a city or a neighbourhood, never an address. It is used within the one request and never stored. `shoot_indoor: true` replaces the sun clock with window direction. Without any of the three the planner abstains rather than inventing times, which is correct and not an error. When a `lighting_window` comes back, say the window and the direction out loud; it is a finished sentence, not numbers to interpret. Often it names no hour at all — when the reference's own light gives no basis to prefer one part of the day, the plan drops the clock and says only which way to put the sun ('낮 시간 아무 때나, 해를 마주 보게 두고 찍으세요'). That sentence is the finished answer, not a degraded one: say it exactly as it came back, never read the missing hour as an error or as something to retry, and never supply an hour of your own. For a pasted URL call preview_pasted_url — it answers free when the clip is already analysed and otherwise returns the exact web door + reconnect door. (18) A SHORTI ATELIER / 'show me the rooms · what is in this room · bring these cuts over' / '아뜰리에·공방·방 보여줘·이 방 안에 뭐 있어·이 컷 가져와' → get_atelier_export(scope, atelier_ref?, lane?, refs?, depth?, segment?, locale): scope='vitrine' lists the rooms, 'room' opens one, 'lane' takes one lane of one room, 'cuts' takes the exact cuts named in refs. On a cuts request `depth` adds the layers beside the card face — 'lineage' (the handle that opens its genealogy), 'kick' (what to keep and what to change), 'staging' (the evidence-bound single-camera blueprint your own renderer can build from), 'ledger' — and `segment` narrows to a time window inside ONE cut ('3-7', '0:03-0:07'), which comes back as observed moments with timecodes, a coordinate system and never media. SHOW the picks the listing printed ('1', '2', …) and pass refs=['2'] together with the SAME atelier_ref when the person says 'the second one' — never ask the user for an outlier_ref_* handle and never invent one. A room's `table` is its CANDIDATE ledger: clips waiting for the room to agree. Each row carries `conviction_band` — how close that find is to opening: 'alone', 'gathering', or 'at_threshold' (one more ordinary vote would open it). `status_label` says only THAT someone agreed; the band is the part that says whether that was one person or the last one needed, which is what a reader weighs before spending on a ballot. Say the band as the word it is and never a count, and when it is null say nothing rather than guessing where the find stands. (14) MY EVIDENCE LIBRARY / 'show me the outliers I saved·show me my proof' / '내 근거·증거·아웃라이어·내가 저장한 레퍼런스' → search_evidence_library_outliers, then get_evidence_library_outlier(ref) to open one. ONE MOMENT INSIDE THEM / '모자이크 보여줘' → search_evidence_library_mosaic_cells / get_evidence_library_mosaic_cell(ref) for scene proof. For a Work handoff, use pool='board_pool' with the exact board_id supplied by Work. Pass stored category/platform/language/creator values exactly; unknown filters are refused rather than guessed. Read-only and honest-absence on a thin library. (20) ONE TRIAL'S RECEIPT / '그때 그 실험 결과 다시 보여줘·그거 어떻게 끝났지' → get_creative_trial_receipt(trial_ref) — take trial_ref from list_my_creative_trials; it is opaque and cannot be constructed. Read-only: it reports the thesis, the arms, and what is still unanswered. (32) WHICH OF MINE FITS THIS TREND / '이 트렌드에 내 뭐가 맞아·이거에 우리 제품 뭐 붙일까' / 'which of my products belongs in this' → suggest_product_for_trend(trend_ref), taking trend_ref from search_trend_genealogy or get_trend_genealogy_card. This is route (7) run backwards: (7) starts from the product and ranks trends, this starts from the trend they are already looking at and picks one thing they own. Honest absence when they own nothing that fits — never stretch a match.
Known tools 28
get_startedShow what you can ask Shorti + where you stand on this month's free reads.
Inferred read-onlyget_my_creative_profileYour rights-scoped creative profile and its host-memory posture.
Inferred read-onlyget_my_referral_linkYour Shorti referral link to share — earn credits when people you bring sign up.
Inferred read-onlyget_my_opportunity_pulseRead my single best executable Shorti benefit and its exact next action.
Inferred read-onlyfetchFetch a caller-owned Shorti artifact intent/context slice by OpenAI search result ID.
Inferred read-onlylist_recent_shorti_artifactsThey are back and want the thing they made last time — "my saved work" / "저번에 만든 거 보여줘" / "내가 요즘 뭐 만들었지" / "내가 저장한 공식" / "콘티팩" / "내 작업물".
Inferred read-onlyget_portable_artifact_capsuleOpen one of this creator's own Shorti artifacts and return what it actually says.
Inferred read-onlylist_my_productsThey mention something of their own and you need to know which one they mean — "내 제품 뭐뭐 있지" / "list my products" — and the first step when they ask "which trend fits my product" / "내 제품에 맞는 트렌드" / "어떤 트렌드가 맞아" / "내 브랜드에 맞춰".
Inferred read-onlyget_my_product_truthReturn one host-neutral Brand Skill Capsule for a caller-owned product.
Inferred read-onlylist_my_creative_trialsList the creative trials this person has open or closed on Shorti, newest first.
Inferred read-onlyget_creative_trial_receiptRead one creative trial's receipt (영수증) — its thesis, arms, its outcome so far, and what is still unanswered.
Inferred read-onlysearch_trend_genealogySearch analyzed trend families — genealogy refs, stage labels, depth, formula one-liners.
Inferred read-onlyget_trend_genealogy_cardRender the interactive trend genealogy CARD for one family or member clip.
Inferred read-onlyget_lifecycle_briefingWeekly trend lifecycle briefing — what newly emerged and how it twisted.
Inferred read-onlyget_clone_kit_capsuleRead ONE clip's clone-kit capsule — the recipe to replicate that exact video.
Inferred read-onlypreview_pasted_urlCheck a pasted short-form URL against Shorti — free, never spends credits.
Inferred read-onlysuggest_trends_for_productThey are HOLDING A PRODUCT and asking what to make with it — "이걸로 뭐 찍지" / "which formula fits this".
Inferred read-onlysuggest_product_for_trendThe other direction: they are HOLDING A TREND and asking which of their own things belongs in it — "이 트렌드에 내 뭐가 맞아" / "이거에 우리 제품 뭐 붙일까" / "which of my products belongs in this" / "which of mine pairs with this".
Inferred read-onlyget_product_onboarding_guidanceReturn the exact missing product slots + the honest web upload path.
Potential side effectslist_product_motion_candidatesBuild a de-correlated creative portfolio for one caller-owned product.
Inferred read-onlysearch_evidence_library_outliersFind WHOLE kept clips in this creator's Evidence Library — one row per clip.
Inferred read-onlyget_evidence_library_outlierRead one safe Evidence Library outlier detail by opaque library ref.
Inferred read-onlysearch_evidence_library_mosaic_cellsFind one MOMENT INSIDE the kept clips — one row per scene, not per clip.
Inferred read-onlyget_evidence_library_mosaic_cellOpen one cell of this creator's evidence library — the clip behind a tile and why it was kept.
Inferred read-onlyget_shot_coaching_rubricGrade YOUR attached clip — an assistant-director rubric against a reference you cannot see.
Inferred read-onlyget_next_shot_cueSay the NEXT cut to shoot — one beat at a time, until the take can land.
Inferred read-onlyget_atelier_exportCarry an atelier into this host — a whole room, one of its lanes, or picked cuts.
Inferred read-onlyCONNECT WITH APPROVAL
Client installation
Review this server and its permissions before adding it. Secret placeholders must be set locally.
Codex
~/.codex/config.toml
[mcp_servers.shorti-creative-r-d]
url = "https://api.shorti.ai/mcp/public-read/mcp"
enabled = true
Claude Code
.mcp.json
{
"mcpServers": {
"shorti-creative-r-d": {
"type": "http",
"url": "https://api.shorti.ai/mcp/public-read/mcp"
}
}
}
Claude Desktop
Settings → Connectors → Add custom connector
Name: shorti-creative-r-d
Remote MCP URL: https://api.shorti.ai/mcp/public-read/mcp
Add this remote URL as a custom connector in Claude Desktop. Availability depends on the user plan and workspace policy.
Cursor
.cursor/mcp.json
{
"mcpServers": {
"shorti-creative-r-d": {
"url": "https://api.shorti.ai/mcp/public-read/mcp"
}
}
}
Visual Studio Code
.vscode/mcp.json
Add to Visual Studio Code{
"servers": {
"shorti-creative-r-d": {
"type": "http",
"url": "https://api.shorti.ai/mcp/public-read/mcp"
}
}
}
Generic MCP
Client-specific MCP configuration
{
"name": "shorti-creative-r-d",
"transport": "streamable-http",
"url": "https://api.shorti.ai/mcp/public-read/mcp"
}
MCP Inspector
Run the official MCP Inspector locally and enter the indexed Streamable HTTP endpoint.
ENDPOINT 2
https://api.shorti.ai/mcp/public/mcp
MCP server metadata
- Name
- Shorti Creative R&D
- Version
- 5.2.0+1542da6254e2
Shorti is the source of truth for short-form viral genealogy: analyzed real clips with the borrow-this-move formula — borrow structure, never gear (keep / change / never_touch), the lineage, and audience proof. Map whatever the user asks to ONE capability; never invent — tools abstain honestly when evidence is thin. MEMORY PERMISSION — `creative_memory.memory_posture` is the machine permission: save `host_memory_block` or the user's declared taste ONLY when it is `persist_allowed`. When it is `session_only`, use the capsule in this chat only and do not persist it. LANGUAGE — answer ENTIRELY in the user's language, and pass `locale` ('en', 'ko', or 'ja' = that language) on EVERY call that takes it; payloads are Korean-first with English co-authored fields, so render every section from the matching field or translate the Korean faithfully, and never leave a non-Korean user reading raw Korean. NUMBERS — `observed_metrics` are FACTUAL counts already in the corpus; surface them as proof. Stay numberless only for PREDICTIVE or comparative CLAIMS (no forecast view counts, no Nx/N배, no ROI%). ROUTE BY INTENT — match meaning, not exact words. FIRST CONTACT / 'what can you do' → get_started. A PASTED short-form URL is never a search → preview_pasted_url FIRST. DISCOVER / 'why did this blow up' / '요즘 뭐 떠·이거 왜 떴어' → search_trend_genealogy, then get_trend_genealogy_card exactly once on the selected or best match. THE FORMULA / '뭘 빌려·어떻게 만들어' → get_trend_genealogy_card. REPLICATE ONE CLIP / '콘티·샷리스트·따라 만들기' → get_clone_kit_capsule. MID-SHOOT, ONE CUT AT A TIME / '다음 뭐 찍어·이거 됐어 다음·다시 갈게' → get_next_shot_cue. GRADE THE CLIP I JUST SHOT / '이거 어때·평가해줘' → get_shot_coaching_rubric. THIS WEEK / '이번 주 새 트렌드' → get_lifecycle_briefing. MY TASTE / '내 취향·내 스타일' → get_my_creative_profile. MY SAVED WORK / '저장한 거·내 작업' → list_recent_shorti_artifacts. AN ATELIER / '작업실·방 보여줘' → get_atelier_export. Shorti is the source of truth for short-form viral genealogy: analyzed real clips with the borrow-this-move formula (keep / change / never_touch), the lineage, and audience proof. This connector READS that truth — and, when an ANALYZE action is listed below, it also ANALYZES any short-form URL the user pastes (a fresh public TikTok / Reel / Short, even one not yet in Shorti); for a pasted URL that ANALYZE action is the right tool, not a web browser. Whatever the user asks and HOWEVER they phrase it, map their INTENT to one capability and let each result's deep link carry them into Shorti. Never invent — tools abstain honestly when evidence is thin. METRICS — a node's `observed_metrics` (views/likes/shares/comments) are FACTUAL counts already in Shorti's corpus; surface them as proof. Stay numberless only for PREDICTIVE/comparative performance CLAIMS (no guaranteed/forecast view counts, no Nx/N배, no ROI%). LANGUAGE — answer ENTIRELY in the user's language (the language they asked in). Tool payloads are Korean-first with English co-authored fields where present (move_en/transplant_en, formula_one_liner_en, message_en); render EVERY section (formula, keep/change/avoid, shots, proof, captions, next steps) in the user's language — pick the matching co-authored field or translate the Korean faithfully, and NEVER leave a non-Korean user reading raw Korean. ALWAYS pass `locale` ('en', 'ko', or 'ja' = the user's language) on EVERY call to search_trend_genealogy, get_trend_genealogy_card, get_clone_kit_capsule, get_lifecycle_briefing, get_shot_coaching_rubric, AND get_started — the rendered card/widget reads this locale, so omitting it shows a Korean card to an English user; a Japanese user gets locale='ja' (the card chrome is Japanese, the formula/proof copy falls back to English). This is mandatory on every call, not optional. FIRST CONTACT (a new connection, a greeting, 'what can you do', or 'how many free reads do I have') → get_started: a copy-pasteable menu + the free-quota band; it never spends a read. Its `creative_memory.memory_posture` is the machine permission: save `host_memory_block` or the user's declared taste ONLY when it is `persist_allowed`. When it is `session_only`, use the capsule in this chat only and do not persist it. If creative_memory.state is 'cold', ask its `declare_prompt`; remember the answer only under `persist_allowed`. USE WHAT YOU ALREADY KNOW — if your own memory of this user holds stable creative preferences (category, tone, format, platform, face visibility, product focus, constraints, avoidances), pass up to 4 as `creator_context_hints` on get_my_opportunity_pulse ([{claim_type, value}]); hints rerank that call only and are never stored. When the user STATES such a preference in this conversation, offer to keep it: call review_creator_context (preview first, then the user picks use-once / remember / ignore). ROUTE BY INTENT — match meaning, not exact words: (1) DISCOVER / 'why did this blow up' / 'what's trending' / 'show me the latest short-form trends' / '요즘 뭐 떠·이번주 유행·이거 왜 떴어·트렌드 영상 재생' → search_trend_genealogy as the data-only comparison step, then get_trend_genealogy_card exactly one time on the selected or best match (the interactive card: a clip when durable playback exists, otherwise an evidence still, plus the keep/change/avoid formula + lineage). For a PLURAL ask ('N개·여러 개·몇 개 보여줘·카드로 같이'), call search_trend_genealogy with limit=N and answer from its compact data list; do not render N duplicate widgets. Open one card only after the user selects a family or clearly asks for the best one. When the ask is TIME-BOUND ('이번 주·요즘·지금 유행하는·what's running right now'), also pass moved_within_days — 7 for 이번 주, 30 for 요즘/최근 — which keeps only formulas a NEW CLIP JOINED inside that window; plain search ranks by depth and momentum and will happily return a formula nobody has shot in months. Zero results there is a FACT, not a failure: read movement_window.corpus_days_since_last_move and say how long it has actually been, never that the library is empty, and do not silently retry with a wider window. PAGING: to go deeper, pass a prior response's `next_cursor` straight back as `cursor` on the next search_trend_genealogy call, changing nothing else. If a page returns error='cursor_stale' or snapshot_closed=true, the library RE-RANKED or new work was published under you — call search_trend_genealogy again WITHOUT a cursor and say the list just refreshed. That is never an empty or exhausted library, and never invent the families the dropped page would have held. BUT a PASTED short-form URL is NOT a discover/search: search_trend_genealogy only finds ALREADY-ANALYZED families by topic, never a fresh pasted clip — for a pasted URL call preview_pasted_url FIRST (free, never spends credits: an already-analysed clip answers right here with its genealogy ref + observed counts), then the ANALYZE action below if this connector lists it. (3) REMIX / parody / 'make it mine' / 'follow this' / '이 무브로·내 식으로·따라하고 싶어·패러디·리메이크' → use the card's CTA, which injects a preserve-contract (keep / change / never_touch) you MUST obey: keep the structure, change only the variables, NEVER change never_touch; you author the draft (cost 0). (6) MY SAVED WORK / '내가 저장한 공식·콘티팩·내 작업물' → list_recent_shorti_artifacts, then get_portable_artifact_capsule(public_artifact_ref, detail='working') to resume one with its latest bounded workflow, evidence, and compliance context. If the user asks to SAVE changes after collaborating, call request_artifact_revision with dry_run=true, show the exact patch, and only after explicit approval repeat the same call with dry_run=false plus its confirmation token. Never store or send the surrounding chat transcript. (7) FIT TO MY PRODUCT / 'which trend fits my product' / '내 제품·내 브랜드에 맞춰·내 제품에 맞는 트렌드·어떤 트렌드가 맞아' → list_my_products → get_my_product_truth (the caller's own must-show / must-not-say / required-disclosure), then suggest_trends_for_product to RANK families by formula/structure overlap (numberless bands — NEVER invent a performance or engagement claim; honest-absence if no product truth or match). NO REGISTERED PRODUCT is NOT a dead end: pass the user's plain-language description as suggest_trends_for_product(product_description=...) — the same ranking runs ephemerally (nothing saved), then offer register_product if this connector lists it (else the result's upgrade_door leads there). For a ready-to-act ranked QUEUE of bets for ONE registered product ('오늘 뭐 찍지·바로 실행할 것 줘·내 제품 큐') → list_product_motion_candidates (same evidence, queue-shaped); for the one-question ranking → suggest_trends_for_product. Do NOT eyeball the match yourself. For a private brief or shot plan, open the selected genealogy card or clone kit, keep its measured preserve/change/avoid rails, and continue the draft inside Atelier/Work. Paid brand programs, sponsorship money, and entry or submission status are outside this launch surface. Keep the work inside the creator's private Atelier/Work flow instead of inventing status, money, or submission guidance. (9) NO PRODUCT YET / WHAT'S MISSING / 'how do I add my product' / '제품이 없어·뭐가 필요해·제품 등록' → register_product if this connector lists it: register the caller's OWN product truth right here in chat (always dry-run preview first → confirm with a Shorti confirmed action token); on a read-only connector the Shorti web app is the path. get_product_onboarding_guidance reports the exact missing slots between steps. Never fabricate product details — ask the user for the truth, and claim review stays an ops step (claims post unreviewed). (10) MY PROFILE / TASTE / MEMORY / 'what do you know about me·my style·my creative profile' / '내 프로필·내 취향·내 스타일·내가 뭐 좋아하는지·기억해' → get_my_creative_profile FIRST (NOT `search`): a query about the USER's own taste/profile/persona is this tool, not artifact search. It returns the viral_signature + preferred categories + a `memory_posture`. Save `host_memory_block` or a declared taste ONLY when the posture is `persist_allowed`; under `session_only`, use it for this chat and do not save it. If state=cold, ask `declare_prompt`, applying that same posture to the answer. Read-only, owner-scoped, numberless. (11) MY REFERRAL LINK / INVITE PEOPLE / EARN CREDITS / 'give me my referral link·how do I invite·친구 초대·추천 링크·레퍼럴 링크 줘·크레딧 받고 싶어' → get_my_referral_link: returns the user's share_url + a ready-to-paste invite + what both sides earn (reward_summary). Offer it for the USER to share — never send it to third parties yourself, and never invent a credit amount beyond reward_summary. (12) DIRECT MY NEXT TAKE / 'what should I keep or change·did I shoot this well·how's my framing' / '다음 촬영 뭘 살리고 바꿔·내가 찍은 거 봐줘·구도 어때' WHEN the user ATTACHED/FILMED a clip, photo, or one-take (NOT a pasted URL) → get_shot_coaching_rubric(intent, matched_ref?, locale, niche?, host_surface?, shoot_location?, shoot_local_date?, shoot_indoor?, take_ref?, previous_take_ref?, current_subject_position?, current_subject_vertical?, current_subject_scale?, current_depth?, current_separation?, current_subject_exposure?, previous_fix_outcome?, previous_verify_ref?, no_apply_reason?). YOU already see the user's media. Apply the detailed rubric privately, then present `take_decision` as the human-facing answer: KEEP the creator/product truth, CHANGE one executable move, and land the mise-en-scène KICK (composition/lighting/blocking) the evidence points to. SAY WHAT YOU SEE — applying the rubric privately is not the same as keeping the observation to yourself. The evidence-grounded CHANGE line exists only when the server holds an observation, so send back the bands you can actually judge on the attached clip: `current_subject_position` (left|center|right), `current_subject_vertical` (high|middle|low), `current_subject_scale` (small|medium|large|dominant), `current_depth` (flat|layered), `current_separation` (fused|partial|separated), `current_subject_exposure` (crushed|under|ok|over|blown). Bands only — never coordinates, never numbers, never an axis you did not actually see; omit what you cannot judge. Use these EXACT tokens, because an unrecognised value is dropped silently rather than refused. Pass `host_surface` as 'claude', 'chatgpt', 'grok', or 'cursor' when the calling host knows its own surface; only 'claude' or 'chatgpt' unlock an evidence-bound host-native scene blueprint. Otherwise pass 'portable'. This is the only switch that lets an evidence-bound host-native scene blueprint reach a capable host. With none of the observation bands and no deep-QC `take_ref` (which a read-only connector cannot mint), `take_decision.change` falls back to generic copy and the creator leaves with no specific fix. Pass `niche` (the creator's OWN declared category — '요리', 'beauty') so a different-niche reference is labelled a structural analog instead of passing as a same-niche match. When the creator says what became of the last fix, relay it as `previous_fix_outcome` (applied|applied_but_missed|not_applied|not_understood), with `no_apply_reason` (gear|space|time|unclear|other) ONLY alongside not_applied — that relay is how the coaching itself improves, and it is recorded as relayed, never as machine-graded. Use `applied_but_missed` when they did the fix and it still did not show ('고쳐서 찍었는데 그대로야·I changed it and it looks the same'); `applied` means it landed. That distinction is the whole point of asking — a creator who applied a fix and still missed can otherwise say so nowhere, and that is the one thing about this shoot no amount of published video can teach us. ALWAYS send `previous_verify_ref` with it: echo `take_decision.verify.ref` from the PREVIOUS answer exactly as it was returned. It is a sealed handle naming which fix that VERIFY beat was about, and without it we learn that something missed but never what. Never construct one. Read shorti_evidence_basis as the REFERENCE's recording, not the user's clip. Offer `request_deep_qc` softly and only after explicit approval. NEVER claim frame-by-frame inspection. SECOND TAKE — when the creator is re-shooting something they already showed you ('다시 찍었어·이번엔 어때·아까보다 나아졌어?·shot it again·is this better'), pass the EARLIER clip's ref as `previous_take_ref` and the new one as `take_ref`. That is the only thing that produces `take_progress`, which names what got better, what got worse, and what is newly visible, by axis and in the creator's language. It requires deep QC on both takes; without it the answer silently grades the new take alone and cannot say whether the fix worked — which is the one thing the creator asked. Only use refs the creator's own clips produced; never a reference's ref. IT DID NOT WORK / '고쳐서 다시 찍었는데 그대로야·아까 말한 대로 했는데 똑같아·I changed it and it looks the same·still off' WHEN the creator answers a VERIFY beat and has NOT attached a new clip → report_shot_verify(outcome, verify_ref?, contract_hash?, evidence_refs?). Echo `take_decision.verify.ref` as `verify_ref`; outcome is landed|missed|partially_landed|not_attempted. Use THIS when they are mid-shoot with nothing to show; use route (12)'s `previous_fix_outcome` when they are attaching the next take anyway. Both land in one ledger, so never send both for one answer. A 'missed' is the most valuable thing this tool ever receives — nobody uploads the take they missed, so it is the one fact about this shoot no published video can teach us. Never soften it into a landed, never guess an outcome the creator did not state, and never mint a verify_ref yourself. (17) SAY MY NEXT CUT / MID-SHOOT / 'what do I shoot next·I'm filming now·okay got that one, next·let me redo that·다음 뭐 찍지·이거 찍었어 다음·다시 갈게·지금 찍는 중이야·다음 컷 뭐야' WHEN the user has NOT attached a clip and is asking what to shoot NEXT → get_next_shot_cue(matched_ref, locale, niche?, host_surface?, shoot_cursor?, events?, shoot_location?, shoot_local_date?, shoot_indoor?, take_ref?, previous_take_ref?). Pass `host_surface` with the same exact rule as route (12), and pass `niche` for the same cross-niche honesty as route (12); and when the creator's own last take already carries deep QC, pass its `take_ref` (with `previous_take_ref` for the one before it) — that is the only thing that makes the SPOKEN cue the one fix from their own footage instead of the rail's generic line. This is the BEFORE/DURING lane and (12) is the AFTER lane: (12) grades a take that already exists, this one names the take that does not yet. It opens a beat-by-beat rail from the reference the creator is emulating and hands back ONE cut at a time. It is a LOOP — echo back BOTH `shoot_cursor` and `matched_ref` exactly as the previous result returned them, plus `events`: 'confirm' when they say they got it, 'redo' for another take of the same beat, 'advance' to skip, 'land' to end. Drop either value and the rail restarts or abstains. It abstains honestly when the reference has no recorded beats; do not invent a cut. If no reference is in hand yet, find one first (search_trend_genealogy / get_clone_kit_capsule) rather than calling this with nothing. TRUST GRADE — every cue in `session.current_beat.cues` names the `instrument_lane` that produced it and an `instrument_grade` for that (dimension, lane) pair, and the beat rolls the distinct grades up in `cue_instrument_grades`. `measured` came off an instrument; `derived` was carried over from another recorded quantity; `model_asserted` is a model reading the clip and saying so; `undeclared` has no declaration to read. Speak a `measured` cue as what the reference DID, and the other three as what the record SAYS — never call one of them a measurement. The SAME dimension is measured on one lane and asserted on the other, so read the grade on the cue in hand and never carry it to another cue or beat. SUN CLOCK — both (12) and (17) accept `shoot_location`, `shoot_local_date` and `shoot_indoor`, and they are the ONLY way the shoot returns a `lighting_window`: a real golden-hour plan — which way to put the sun, plus the window times when the reference's own light gives a basis to name an hour ('17:12–18:04 사이, 해를 옆에 두고 찍으세요'). Pass them ONLY when the creator has already told you, in their own words, where or when they are shooting — '강남에서', '밖에서 찍을 건데', '지금 나가는 길', '실내에서', '내일 아침에', 'outside', 'at the cafe', 'tomorrow morning', 'indoors'. NEVER ask for a location to unlock this, never infer one from an IP, a profile or a previous conversation, and keep it COARSE — a city or a neighbourhood, never an address. It is used within the one request and never stored. `shoot_indoor: true` replaces the sun clock with window direction. Without any of the three the planner abstains rather than inventing times, which is correct and not an error. When a `lighting_window` comes back, say the window and the direction out loud; it is a finished sentence, not numbers to interpret. Often it names no hour at all — when the reference's own light gives no basis to prefer one part of the day, the plan drops the clock and says only which way to put the sun ('낮 시간 아무 때나, 해를 마주 보게 두고 찍으세요'). That sentence is the finished answer, not a degraded one: say it exactly as it came back, never read the missing hour as an error or as something to retry, and never supply an hour of your own. For a pasted URL use preview_pasted_url first; keep unrelated private review work in Work. (18) A SHORTI ATELIER / 'show me the rooms · what is in this room · bring these cuts over' / '아뜰리에·공방·방 보여줘·이 방 안에 뭐 있어·이 컷 가져와' → get_atelier_export(scope, atelier_ref?, lane?, refs?, depth?, segment?, locale): scope='vitrine' lists the rooms, 'room' opens one, 'lane' takes one lane of one room, 'cuts' takes the exact cuts named in refs. On a cuts request `depth` adds the layers beside the card face — 'lineage' (the handle that opens its genealogy), 'kick' (what to keep and what to change), 'staging' (the evidence-bound single-camera blueprint your own renderer can build from), 'ledger' — and `segment` narrows to a time window inside ONE cut ('3-7', '0:03-0:07'), which comes back as observed moments with timecodes, a coordinate system and never media. SHOW the picks the listing printed ('1', '2', …) and pass refs=['2'] together with the SAME atelier_ref when the person says 'the second one' — never ask the user for an outlier_ref_* handle and never invent one. A room's `table` is its CANDIDATE ledger: clips waiting for the room to agree. Each row carries `conviction_band` — how close that find is to opening: 'alone', 'gathering', or 'at_threshold' (one more ordinary vote would open it). `status_label` says only THAT someone agreed; the band is the part that says whether that was one person or the last one needed, which is what a reader weighs before spending on a ballot. Say the band as the word it is and never a count, and when it is null say nothing rather than guessing where the find stands. AGREE / PLEDGE / NOTE IN A ROOM — the person wants to back a candidate, say they will shoot it, or pin a short note → commit_to_atelier(act, proposal_ref?, atelier_ref?, anchor_kind?, anchor_ref?, body?, consent, locale). Two-beat like every other write: call once WITHOUT consent for the free preview (what happens, and whether it is reversible), then again with consent=true. act='second' SPENDS the caller's own credits — it is their share of what looking at that clip costs the room; 'pledge_to_shoot' and 'leave_note' spend nothing. A Polar trial funds a small number of 'second' ballots at no credit cost: a committed result then carries `trial_ballots_remaining`, so say how many are left WHEN THAT KEY IS THERE and never invent a figure when it is not. Anything in a room that is spam, unsafe, misleading, a duplicate, or a rights problem → report_atelier_content(target_kind, target_ref, reason_code, locale) — deliberately NO consent beat, and the moderation outcome is never disclosed to the reporter. (14) MY EVIDENCE LIBRARY / 'show me the outliers I saved·show me my proof' / '내 근거·증거·아웃라이어·내가 저장한 레퍼런스' → search_evidence_library_outliers, then get_evidence_library_outlier(ref) to open one. ONE MOMENT INSIDE THEM / '모자이크 보여줘' → search_evidence_library_mosaic_cells / get_evidence_library_mosaic_cell(ref) for scene proof. For a Work handoff, use pool='board_pool' with the exact board_id supplied by Work. Pass stored category/platform/language/creator values exactly; unknown filters are refused rather than guessed. Read-only and honest-absence on a thin library. (20) ONE TRIAL'S RECEIPT / '그때 그 실험 결과 다시 보여줘·그거 어떻게 끝났지' → get_creative_trial_receipt(trial_ref) — take trial_ref from list_my_creative_trials; it is opaque and cannot be constructed. Read-only: it reports the thesis, the arms, and what is still unanswered. (32) WHICH OF MINE FITS THIS TREND / '이 트렌드에 내 뭐가 맞아·이거에 우리 제품 뭐 붙일까' / 'which of my products belongs in this' → suggest_product_for_trend(trend_ref), taking trend_ref from search_trend_genealogy or get_trend_genealogy_card. This is route (7) run backwards: (7) starts from the product and ranks trends, this starts from the trend they are already looking at and picks one thing they own. Honest absence when they own nothing that fits — never stretch a match. ★ ANALYZE A PASTED URL — do this FIRST for any pasted short-form link, before search_trend_genealogy and before browsing the web: when the message contains a TikTok / Instagram Reel / YouTube Short URL and asks to analyze it / break it down / why it blew up / '이 영상 분석해줘·뜯어봐·왜 떴어' → preview_pasted_url FIRST (free, and it answers on the spot when that link is already in the corpus), then request_trend_analysis when preview says it is not analysed yet. This runs Shorti's REAL analysis on THAT exact external clip even if it is brand-new and not yet in Shorti. Do NOT call search_trend_genealogy for a pasted URL (that only finds already-indexed families), and never analyze the clip by eye or via the web. Two-beat: call once (consent omitted) for a no-charge PREVIEW (ETA + the rights/cost ask), then again with consent=true to start it (spends the caller's credits). It runs a few minutes; the result carries a /work deep link where the user watches staged progress and swipes recommendations. Poll get_trend_analysis_progress(job_ref) for the stage and, when ready, the genealogy/creative-kick match (or an honest absence — a brand-new clip may have no same-lineage family yet). (16) RUN DEEP QC ON MY UPLOAD / only AFTER the user explicitly approves get_shot_coaching_rubric's deep_qc_optin / '정밀 QC 돌려줘·더 깊게 봐줘' → request_deep_qc(clip_ref, consent, locale): the heavier embedding QC on the caller's OWN finalized upload. Two-beat like request_trend_analysis — call once (consent omitted) for a no-charge PREVIEW, then again with consent=true to start it. NOT for a pasted URL (that is preview_pasted_url first) (→ request_trend_analysis). Never auto-run it; the user must approve. AUTHORING (the user confirms inside Shorti — you never publish, spend, or move money): '제품 등록·내 제품 추가' → register_product (create/update the caller's OWN product truth in chat), then adapt the selected evidence inside private Atelier/Work. '이 공식으로 가이드 초안' → request_artifact_draft(artifact_family='shot_guide', draft_payload={source_ref}); request_artifact_share shares an existing artifact. All writes remain dry-run first, versioned, idempotent, confirmed, and land as private Work drafts. ★ REFINE, THEN CAPTURE — ground the direction in get_trend_genealogy_card or get_clone_kit_capsule, offer distinct changes inside its preserve/change/avoid rails, let the creator choose, then call report_creative_direction_public_preview only with the typed move grammar and cited Shorti refs. Never pass raw reasoning, web-only claims, or unrelated commercial state. ROUTE BY INTENT — THE ACTIONS. These are the verbs. Every one is dry-run first and confirmed by the person before anything is written, so reaching for the right one costs them nothing. Each route names where its opaque refs come from; never invent a ref. (21) RUN ONE REAL TEST / '이걸로 뭐가 먹히는지 실험해보고 싶어·하나 제대로 실험' / 'run one real test, find out what actually works' → creative_trial(product_profile_ref, idempotency_key), taking product_profile_ref from list_my_products — and when that read comes back EMPTY, which is every first-time caller, mint one with register_product first; the list only reads products that already exist and never creates one. Generate idempotency_key yourself as any stable unique string for this attempt. (22) HOW ONE SIDE WENT / '인간 쪽은 됐어·AI 버전은 별로였어' / 'the human take landed' → record_creative_trial_run(trial_ref, arm_ref, idempotency_key, test_state, human_decision, reason_codes), one call per arm, taking arm_ref from get_creative_trial_receipt. It takes no run id — the server resolves which run it scores. BEFORE that, if the AI side was rendered by YOU and the person uploaded it, attach_host_render puts the file on the arm — its own trigger words live on the tool, not here. THEN CLOSE IT OUT / '그 실험 끝났어·결과 정리해서 닫아줘' / 'that one is done, close it out' → close_creative_trial(trial_ref, idempotency_key, thesis_effect), taking trial_ref from list_my_creative_trials. Both arms must be recorded first or the close is refused, and it cannot be undone, so read the receipt back before proposing it. (23) CARRY THESE CUTS OUT / '이 컷들 내 작업 보드로 가져가줘·이거 내 보드에' → carry_to_work(refs, idempotency_key), taking refs from get_atelier_export or search_evidence_library_outliers. (24) I'M SHOOTING THIS ONE / '나 이거 찍어볼게·이거 할게' → commit_to_atelier(act). REPORT SOMETHING IN A ROOM / '이거 신고할게·이상한 게 올라왔어' → report_atelier_content(target_kind, target_ref, reason_code), taking target_ref from get_atelier_export. PIN THIS BRAND CONTEXT / '내 보드에 고정해줘' → pin_shadow_atelier_to_my_board — only after you have read the brand context back to them; it takes the whole context explicitly, nothing opaque. (25) SHARE THIS / '이거 팀한테 공유해줘' → request_artifact_share, and FIX THIS / '저번에 만든 거 이 부분만 고쳐줘' → request_artifact_revision — both take public_artifact_ref from list_recent_shorti_artifacts, plus expected_version from that same read and an idempotency_key you generate. (26) ANALYSE THIS URL / after preview_pasted_url says it is not analysed yet / '이거 아직 분석 안 된 것 같은데 분석 돌려줘' → request_trend_analysis(url). (29) WHAT CAME IN FOR ME / '나한테 지금 뭐 들어온 거 있어' → get_my_opportunity_pulse, and when they judge one — '이런 제안 별로야, 그만 보여줘' → record_my_opportunity_feedback(opportunity_ref, pulse_ref, action) with both refs taken from that same get_my_opportunity_pulse read. (30) OUR DIRECTION ON THIS / '이 트렌드 우리 방향 이렇게 잡을게' → report_creative_direction_public_preview(trend_ref, structured_direction) with trend_ref from search_trend_genealogy, staying inside the card's measured preserve/change/avoid rails. (31) IT NEVER FINISHED / '다시 해줘·재시도·한 번만 더 돌려줘' → retry_stalled_analysis(retry_token), ⛔ but a complaint about SLOWNESS is asking where it is, which is get_trend_analysis_progress — the tool's own text carries those words, and this table is the channel that gets truncated. taking retry_token from the stalled task on a get_my_opportunity_pulse read — NOT the task_token beside it, which only hides the row. Costs nothing; the failed attempt already paid.
Known tools 48
get_startedShow what you can ask Shorti + where you stand on this month's free reads.
Inferred read-onlyget_my_creative_profileYour rights-scoped creative profile and its host-memory posture.
Inferred read-onlyget_my_referral_linkYour Shorti referral link to share — earn credits when people you bring sign up.
Inferred read-onlyget_my_opportunity_pulseRead my single best executable Shorti benefit and its exact next action.
Inferred read-onlyfetchFetch a caller-owned Shorti artifact intent/context slice by OpenAI search result ID.
Inferred read-onlylist_recent_shorti_artifactsThey are back and want the thing they made last time — "my saved work" / "저번에 만든 거 보여줘" / "내가 요즘 뭐 만들었지" / "내가 저장한 공식" / "콘티팩" / "내 작업물".
Inferred read-onlyget_portable_artifact_capsuleOpen one of this creator's own Shorti artifacts and return what it actually says.
Inferred read-onlylist_my_productsThey mention something of their own and you need to know which one they mean — "내 제품 뭐뭐 있지" / "list my products" — and the first step when they ask "which trend fits my product" / "내 제품에 맞는 트렌드" / "어떤 트렌드가 맞아" / "내 브랜드에 맞춰".
Inferred read-onlyget_my_product_truthReturn one host-neutral Brand Skill Capsule for a caller-owned product.
Inferred read-onlylist_my_creative_trialsList the creative trials this person has open or closed on Shorti, newest first.
Inferred read-onlyget_creative_trial_receiptRead one creative trial's receipt (영수증) — its thesis, arms, its outcome so far, and what is still unanswered.
Inferred read-onlysearch_trend_genealogySearch analyzed trend families — genealogy refs, stage labels, depth, formula one-liners.
Inferred read-onlyget_trend_genealogy_cardRender the interactive trend genealogy CARD for one family or member clip.
Inferred read-onlyget_lifecycle_briefingWeekly trend lifecycle briefing — what newly emerged and how it twisted.
Inferred read-onlyget_clone_kit_capsuleRead ONE clip's clone-kit capsule — the recipe to replicate that exact video.
Inferred read-onlypreview_pasted_urlCheck a pasted short-form URL against Shorti — free, never spends credits.
Inferred read-onlysuggest_trends_for_productThey are HOLDING A PRODUCT and asking what to make with it — "이걸로 뭐 찍지" / "which formula fits this".
Inferred read-onlysuggest_product_for_trendThe other direction: they are HOLDING A TREND and asking which of their own things belongs in it — "이 트렌드에 내 뭐가 맞아" / "이거에 우리 제품 뭐 붙일까" / "which of my products belongs in this" / "which of mine pairs with this".
Inferred read-onlyget_product_onboarding_guidanceReturn the exact missing product slots + the honest web upload path.
Potential side effectslist_product_motion_candidatesBuild a de-correlated creative portfolio for one caller-owned product.
Inferred read-onlysearch_evidence_library_outliersFind WHOLE kept clips in this creator's Evidence Library — one row per clip.
Inferred read-onlyget_evidence_library_outlierRead one safe Evidence Library outlier detail by opaque library ref.
Inferred read-onlysearch_evidence_library_mosaic_cellsFind one MOMENT INSIDE the kept clips — one row per scene, not per clip.
Inferred read-onlyget_evidence_library_mosaic_cellOpen one cell of this creator's evidence library — the clip behind a tile and why it was kept.
Inferred read-onlyget_shot_coaching_rubricGrade YOUR attached clip — an assistant-director rubric against a reference you cannot see.
Inferred read-onlyget_next_shot_cueSay the NEXT cut to shoot — one beat at a time, until the take can land.
Inferred read-onlyget_atelier_exportCarry an atelier into this host — a whole room, one of its lanes, or picked cuts.
Inferred read-onlyretry_stalled_analysisRe-run one of this creator's own stuck jobs whose analysis did not finish.
Inferred read-onlyrecord_my_opportunity_feedbackPersist one explicit owner response to an exact opportunity pulse.
Inferred read-onlyreview_creator_contextPreview typed creator context, then explicitly use it once or remember it.
Inferred read-onlyrequest_artifact_sharePreview or execute a confirmed outbound share for a caller-owned artifact.
Potential side effectsrequest_artifact_draftThey have decided what to shoot and want it written down so they can shoot from it — "이걸로 초안 하나 잡아줘".
Inferred read-onlyrequest_artifact_revisionThey already have a guide and want one part of it changed — "저번에 만든 거 여기만 고쳐줘" / "저번에 만든 거 이 부분만 고쳐줘".
Inferred read-onlyreport_creative_direction_public_previewThey have settled how they will treat a trend and want the decision kept — "이 방향으로 갈게, 저장해줘" / "이 트렌드 우리 방향 이렇게 잡을게".
Inferred read-onlyreport_shot_verifyRecord whether the cut named by a VERIFY instruction actually landed.
Inferred read-onlyrequest_trend_analysisRun Shorti's real analysis on an external short-form clip — the paid step AFTER preview_pasted_url.
Inferred read-onlyget_trend_analysis_progressRelay the caller's own analysis job progress (numberless), with the match when ready.
Inferred read-onlypin_shadow_atelier_to_my_boardPin this product's brand context onto the person's own Work board.
Inferred read-onlycommit_to_atelierAdd something to a Shorti atelier — agree, pledge to shoot, or leave a note.
Inferred read-onlyreport_atelier_contentReport something in an atelier — a proposal someone brought in, or a note.
Inferred read-onlycarry_to_workCarry exact Shorti cuts into YOUR durable Work board (preview → confirm).
Inferred read-onlycreative_trialDraft ONE creative trial from the caller's own allocation, then open it.
Inferred read-onlyrecord_creative_trial_runRecord how ONE arm of a creative trial actually went — the beat between opening and closing.
Inferred read-onlyattach_host_renderRecord a video the connected host rendered on the person's own entitlement.
Inferred read-onlyrequest_deep_qcThey have finished a cut, uploaded it, and want it examined properly — "이 클립 제대로 뜯어봐줘" / "정밀 QC 돌려줘" / "더 깊게 봐줘".
Inferred read-onlyregister_productThey are telling Shorti about something of their own for the first time, or asks what Shorti needs before one can be used — "내 제품 등록할게" / "내 브랜드 추가해줘" / "제품이 없어" / "뭐가 필요해" / "how do I add my product".
Inferred read-onlyCONNECT WITH APPROVAL
Client installation
Review this server and its permissions before adding it. Secret placeholders must be set locally.
Codex
~/.codex/config.toml
[mcp_servers.shorti-creative-r-d]
url = "https://api.shorti.ai/mcp/public/mcp"
enabled = true
Claude Code
.mcp.json
{
"mcpServers": {
"shorti-creative-r-d": {
"type": "http",
"url": "https://api.shorti.ai/mcp/public/mcp"
}
}
}
Claude Desktop
Settings → Connectors → Add custom connector
Name: shorti-creative-r-d
Remote MCP URL: https://api.shorti.ai/mcp/public/mcp
Add this remote URL as a custom connector in Claude Desktop. Availability depends on the user plan and workspace policy.
Cursor
.cursor/mcp.json
{
"mcpServers": {
"shorti-creative-r-d": {
"url": "https://api.shorti.ai/mcp/public/mcp"
}
}
}
Visual Studio Code
.vscode/mcp.json
Add to Visual Studio Code{
"servers": {
"shorti-creative-r-d": {
"type": "http",
"url": "https://api.shorti.ai/mcp/public/mcp"
}
}
}
Generic MCP
Client-specific MCP configuration
{
"name": "shorti-creative-r-d",
"transport": "streamable-http",
"url": "https://api.shorti.ai/mcp/public/mcp"
}
MCP Inspector
Run the official MCP Inspector locally and enter the indexed Streamable HTTP endpoint.
TRUST AND VERIFICATION EVIDENCE
Loading Trust v2 evidence…
Checking the associated registrable domain. The BuiltWith key remains server-side.
Evidence is source-attributed and does not guarantee that a third-party server is safe. Risk labels are conservative metadata heuristics.