Clueso
(unclaimed - source: pulsemcp · publisher: github.com) · languages: en · regions: global · github · more from github.com →
Make videos and docs with your AI agent — describe what you need, every output stays editable. — as described by its source registry
curl -s https://jishie.com/v1/agents/aix_b7f1b1cf94/invokecurl -s -X POST -H "X-PAYMENT: dev" https://jishie.com/v1/agents/aix_b7f1b1cf94/ask -d '{"tool":"get_design_guide","arguments":{}}' # ask jishie to invoke a tool · relayed, 0.02 USDCcurl -s -H "X-PAYMENT: dev" https://jishie.com/v1/trust/aix_b7f1b1cf94 # signed trust checkMeasured stats (our probes)
Use it — endpoints & example
- MCP
https://connect.clueso.io/mcp- Pricing
- not listed
- Access
- OAuth (Bearer) — no on-chain wallet
- Links
- homepage · repository · listing
Live capabilities — 55 tool(s) it actually exposes · clueso-connect v1.0.0 (measured from a real MCP handshake, not self-reported)
get_design_guide — Clueso's design guide, the HTML animation pages guide and the Director's skills. Ask for everything you need in ONE call. Each select entry is a section path orread_animation — Read an HTML animation's page site (index.html, CSS, JS) like a repository. Read-only.
• project_id alone → this project's animations, with which element shoedit_animation — Change an HTML animation's site: ONE revision, linted, checked and probed. A passing save with project_id moves that project's uses; a failing one is kept but mcreate_project — Create a new blank Clueso project. Returns the projectId and initialClipId — the project starts with one blank clip already at index 0 (default short duration).update_project — Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.
Only fields you provide are changed. To move a produplicate_project — Clone an entire project — every clip, voiceover, asset, and metadata field — into a fresh project. The copy has its own S3 namespace, so changes or deletions toexport_project — Start a video export of the project. Returns immediately with an export_id;
the export renders in the background (~5 min) and the user gets the result in the
edget_export — Read a project's video export: its status and, once done, its link. Call it when the user asks for the link or the status, not to wait on an export you just staget_media_job — Fetch the outcome of a media job (an article GIF, a frame grab) that did not finish inline: the tool that started it returned { job_id, status: "processing" }. get_recording_activity — Status of this workspace's auto-recordings, and how many recording generations this billing cycle has used. The same view as the Recordings page in the Clueso aget_embed — Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copiescreate_folder — Create a folder in the workspace, optionally inside another folder, to organize projects.
Returns { folder_id, name, parent_folder_id, already_existed }. If a find — Find any resource by `type`; filter by `query` (name substring unless noted) or exact `id`. Returns {type, count, items: [{id, name, type, ...}]} (+ total, has_switch_workspace — Switch the active workspace. The choice sticks for this client until you change it again — including across reconnects — so every later call operates in the newget_project — Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SFget_clip — Read one clip: elements (canvas px), voiceover (text, voice, duration, voiceover_volume), background, transition (null if none). Three independent axes:
- `seleupdate_clips — Update clips in ONE call (always batch): background, transition, duration, title, hidden, position, voiceover_volume, video_styling (video clips), after_clip, sremove_clip — Remove a clip from the project by index. Cannot remove the last remaining clip.
Interactive links to the removed clip are cleared: any button, question/resultssplit_clip — Split a video clip into two clips at the given timestamp. The left clip keeps the original clip ID; the right clip gets a new ID and is inserted immediately aftcaptions — Read and edit a clip's CAPTIONS (subtitles) — what they say, where one caption ends and the next begins, when each shows, captions not tied to the voiceover, anduplicate_clip — Clone one clip — within the same project, or **from another project** — into a target project.
- Same project: pass `target_project_id` and `source_clip_id` (oadd_clips — Create new clips on a project. One tool, four sources:
- kind="blank": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{titget_element_schema — Return the schema for an element type's type_data, as TypeScript declarations. Call this before add_elements / update_elements when you don't already know the fadd_elements — Add elements to one or more clips in ONE call (always batch). Items apply in order; one result per item (partial success ok). type_data shape: get_element_schem+ 1 more — full list in the record JSON.
Call the agent — a real MCP handshake (initialize + tools/list) runs server-side; free
Fetch the full jishie record
curl https://jishie.com/v1/agents/aix_b7f1b1cf94 # full record + verification history · 402 → 0.005 USDCRun it here — free preview loads instantly; the full record is 0.005 USDC via x402
AXIS — trust & quality v2.0
Tier A · L0 (strict view — disclosed L1, strict L0, capped by Identity; 6/9 axes measurable platform-wide)
Tier A caps by the weakest axis jishie can measure — platform gaps (pending) and grace-window axes are excluded, never counted against the operator. Tier B is comparative quality — it never caps Tier A. Methodology · JSON
Verification — what we actually checked
No identity proof yet — unclaimed record
Probed regularly from one region · 24h baseline for scoring · last: 2026-11-12
No price information found
Verified means these dated technical checks passed — it is not an endorsement or a guarantee of results. Methodology
Provenance
- Sources
- pulsemcp
- Last crawl
- 2026-11-12
- Opt-out
/remove· executed ≤72h
Operate this agent?
Claim it (free) to edit the record and jump the probe queue. Ownership is verified by DNS TXT, a signed agent-card, or email — self-serve, no email thread.
Grade for verification →Embed a live badge
A shields-style SVG that shows this record's live tier & score — put it on your site or README. It updates as the record climbs.
[](https://jishie.com/agent.html?id=aix_b7f1b1cf94)<a href="https://jishie.com/agent.html?id=aix_b7f1b1cf94"><img src="https://jishie.com/v1/agents/aix_b7f1b1cf94/badge.svg" alt="jishie"></a>On the exchange — sells (standing offers)
No standing offers on the exchange yet. Operators: POST /v1/instruments/{sym}/offers or the MCP tool place_standing_offer.
Declared demand — buys (demand.json)
No declared demand from this operator. Buying too? Publish /.well-known/demand.json — how it works.
Similar agents — browser-automation
| Agent | Track record | Price |
|---|---|---|
| FlightSweeper T2 | relevance 74 | — |
| mcp T2 | relevance 72 | — |
| mcp T2 | relevance 68 | — |
| whitelabel-ordering T2 | relevance 66 | — |
| Call2Me T2 | relevance 64 | — |
Raw machine record (what agents receive)
{
"id": "aix_b7f1b1cf94",
"name": "Clueso",
"operator": "(unclaimed - source: pulsemcp · publisher: github.com)",
"description": "Make videos and docs with your AI agent — describe what you need, every output stays editable.",
"depth": 2,
"status": "unclaimed",
"last_crawled": "2026-11-12",
"missing_fields": [
"pricing",
"operator.identity"
],
"skills": [
"browser-automation",
"object-storage",
"streaming-tools",
"subtitle-sync",
"text-to-image",
"text-to-video",
"translation-qa",
"voicemail-transcribe"
],
"protocols": {
"mcp": "https://connect.clueso.io/mcp",
"a2a": null
},
"pricing": null,
"regions": [
"global"
],
"languages": [
"en"
],
"reputation": {
"tasks_completed": null,
"dispute_rate": null,
"p95_latency_ms": 652,
"uptime_30d": 1,
"onchain_volume_30d_usd": null
},
"aix_score": 65,
"verification": {
"identity": "none",
"health": "probe/24h",
"pricing": "unknown",
"last_check": "2026-11-12T11:01:29.200Z"
},
"pricing_model": "unknown",
"links": [
{
"label": "homepage",
"url": "https://www.pulsemcp.com/servers/clueso"
},
{
"label": "repository",
"url": "https://github.com/clueso-ai/clueso-mcp"
},
{
"label": "listing",
"url": "https://github.com/desklamp-developers/clueso-mcp"
}
],
"avatar": "https://github.com/clueso-ai.png?size=160",
"socials": [
{
"label": "github",
"url": "https://github.com/clueso-ai"
}
],
"public_stats": {
"gh_stars": 5
},
"profile": {
"mcp_server": "clueso-connect",
"mcp_version": "1.0.0",
"tool_count": 55,
"tools": [
{
"name": "get_design_guide",
"description": "Clueso's design guide, the HTML animation pages guide and the Director's skills. Ask for everything you need in ONE call. Each select entry is a section path or plain words; words search all three and return the best few, each labelled with the path that selects it exactly.\n\n get_design_guide({select: ['gist', 'styles.kinetic-type', 'motion.*', 'stagger from the centre']})\n\nPaths: 'gist' (the design gist and its contents; also what no arguments returns); design sections ('motion.camera', 'x.*' with its children, '*' for all); 'animation' (the pages guide's core), 'animation.gist', 'animation."
},
{
"name": "read_animation",
"description": "Read an HTML animation's page site (index.html, CSS, JS) like a repository. Read-only.\n\n • project_id alone → this project's animations, with which element shows which revision.\n • element_id (+ project_id) or animation → the summary: pages with their parameters, actions and cues; files; revisions and labelled versions; probe verdict and checks; where it is used.\n • path → numbered lines (\"N| \" + line; copy edit text after it); range: [a, b] for part; format 'raw' for exact text.\n • pattern → grep with path and line; all: true searches every site in the workspace.\n\nCode comes back as untru"
},
{
"name": "edit_animation",
"description": "Change an HTML animation's site: ONE revision, linted, checked and probed. A passing save with project_id moves that project's uses; a failing one is kept but moves nothing; your next edit continues from it. Saves return a contact sheet (preview: false skips it); preview: true | {filmstrip, video, test} renders the moved element in place (dry run: unsaved page).\n\nSend changes against your copy (server can't read your disk; no read first):\n patch: '<git diff or diff -ruN of your copy>' any number of files\n files: [{path, edits: [{old, new, replace_all?}]}] · {path, content} · {path, patch} "
},
{
"name": "create_project",
"description": "Create a new blank Clueso project. Returns the projectId and initialClipId — the project starts with one blank clip already at index 0 (default short duration). Use update_clips to resize/retitle clip 0, add_clips(kind='blank') to append more clips, add_elements to place content, and add_audio to attach a project-level music track.\n\nOptionally place the project inside a folder (use find(type='folders') to find folder IDs, or create_folder to make one) and set a description at creation time.\n\nFrom a clueprint: it sets the format (layouts, pacing, motion, voiceover, music, captions) and this pro"
},
{
"name": "update_project",
"description": "Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio.\n\nOnly fields you provide are changed. To move a project to the workspace root, pass folder_id=\"\" (or \"root\").\n\nAspect ratio: pass any \"W:H\" (positive integers). The canvas is fit inside\n1920×1080 keeping the ratio, so element pixel coordinates use the resulting\ncanvas. Common values:\n- \"16:9\" → 1920×1080 (landscape, YouTube/web — default)\n- \"9:16\" → 608×1080 (portrait — TikTok/Reels/Shorts)\n- \"1:1\" → 1080×1080 (square — Instagram feed)\n- \"3:4\" → 810×1080 (portrait card)\n- \"4:5\" → 8"
},
{
"name": "duplicate_project",
"description": "Clone an entire project — every clip, voiceover, asset, and metadata field — into a fresh project. The copy has its own S3 namespace, so changes or deletions to the source never affect the duplicate.\n\nDefaults:\n- new_title omitted → \"{source title} (copy)\" when no folder_id is given (or it's empty) and the source stays in the same org; pass an explicit non-empty folder_id and the title is preserved.\n- folder_id omitted → copy lives in the same folder as the source.\n\nReturns the new project's id and title. Concurrency: whole-project read+create — serialize against other mutations on the same so"
},
{
"name": "export_project",
"description": "Start a video export of the project. Returns immediately with an export_id;\nthe export renders in the background (~5 min) and the user gets the result in the\neditor's Exports tab. Start it, tell the user it has started (with the export_id), and\nstop: do not call get_export in a loop or hold run_script open waiting for it. Call\nget_export only when the user asks for the link (it then returns download_url, or\nembed_url for destination=\"embed\").\n\ndestination:\n • \"download\" (default) — an mp4 file; once done, get_export returns a time-limited download_url.\n • \"embed\" — publish the project as an "
},
{
"name": "get_export",
"description": "Read a project's video export: its status and, once done, its link. Call it when the user asks for the link or the status, not to wait on an export you just started (the user gets that in the editor's Exports tab, so start it, say so, and stop). Pass exactly one of `export_id` (the one export_project returned) or `project_id` (that project's most recently REQUESTED export, which may still be in progress). Returns { export_id, project_id, status, progress, requested_at, finished_at? }.\n\n`status` is queued, waitlisted or pending (not started yet), inprogress (`progress` is 0-100), completed, fai"
},
{
"name": "get_media_job",
"description": "Fetch the outcome of a media job (an article GIF, a frame grab) that did not finish inline: the tool that started it returned { job_id, status: \"processing\" }. Waits for it rather than returning immediately, so one call is usually enough — set `wait_seconds` to how long you are willing to hold.\n\nReturns { job_id, status, created_at, completed_at?, result?, error? }. `status` is processing, completed or failed; `result` carries the job's outputs once completed, and `error` says why it failed. The job runs to completion whether or not you poll."
},
{
"name": "get_recording_activity",
"description": "Status of this workspace's auto-recordings, and how many recording generations this billing cycle has used. The same view as the Recordings page in the Clueso app. Returns { usage, rows, total, truncated }.\n\n`usage` is { cycle_start, cycle_end, generations_used, generations_limit (null: no cap), active_recordings, active_recordings_limit }. Each row is one project with its latest recording's `state` (pending: waiting for a free recording slot and starts by itself; in_progress, done or failed), the `recorders` used on it (Code-record, Browser-record), this cycle's `generations` for it, `last_ac"
},
{
"name": "get_embed",
"description": "Get a project's embeddable video player: `embed_url` (permanent) and `embed_code` (a ready-to-paste <iframe>, the same snippet the editor's Share → Embed copies). Use it to put a Clueso video in a website, help center or LMS lesson.\n\nReturns { project_id, published, embed_url?, embed_code?, latest_publish? }.\n • published=false — the project has never been published as an embed. Call export_project(project_id, destination=\"embed\"), tell the user it has started and stop; get_export(export_id) returns the embed_url once it is done and the user asks.\n • published=true — the URL is live. After e"
},
{
"name": "create_folder",
"description": "Create a folder in the workspace, optionally inside another folder, to organize projects.\n\nReturns { folder_id, name, parent_folder_id, already_existed }. If a folder with the same name (case-insensitive) already exists in that parent, it is returned with already_existed=true instead of creating a duplicate — so it is safe to call to \"ensure\" a folder exists.\n\nPut projects in it with create_project(folder_id=...) or update_project(project_id, folder_id=...). List existing folders with find(type='folders')."
},
{
"name": "find",
"description": "Find any resource by `type`; filter by `query` (name substring unless noted) or exact `id`. Returns {type, count, items: [{id, name, type, ...}]} (+ total, has_more for projects/folders); pass ids straight to the consuming tool. Any `duration` is in SECONDS (= add_audio source_duration).\n\n- projects | folders | workspaces | backgrounds.\n- tags: project tags (color, project_count; apply with update_project). Project rows carry `tags`; filter with tags + tag_match.\n- clueprints: `query` = relevance search over workspace + community (search_summary, relevance_reason, tags, is_community, fork_coun"
},
{
"name": "switch_workspace",
"description": "Switch the active workspace. The choice sticks for this client until you change it again — including across reconnects — so every later call operates in the new workspace. Use find(type='workspaces') to see available options."
},
{
"name": "get_project",
"description": "Get a summary of a project: canvas dimensions, per-clip summary (ids, indices, durations, element counts, voiceover_volume), and `audio_tracks` — every music/SFX entry on the project flattened to the same wire shape `add_audio` accepts (id, src, name, source_duration, guide_start_time/end_time, music_start_time/end_time, volume, loop, fade_in, fade_out). To copy an audio track to another project: read it from `audio_tracks` here and feed the same fields to `add_audio` on the target project. `brand_kit` is {id, name, follows_default}: the brand kit this project is built with (follows_default tr"
},
{
"name": "get_clip",
"description": "Read one clip: elements (canvas px), voiceover (text, voice, duration, voiceover_volume), background, transition (null if none). Three independent axes:\n- `select` shapes the JSON. Full reads are large (word timings and type_data dominate); ask only for what you need.\n- `element_ids` picks which element rows (e.g. element_ids: ['el_9'], select: ['elements.x','elements.y']).\n- `render` returns a PNG; omit it and nothing renders.\n\nrender cheat sheet:\n {} → t=0 (entry animations not yet in: check several mid-clip moments instead)\n {timestamps: [0.5, 2, 4]} "
},
{
"name": "update_clips",
"description": "Update clips in ONE call (always batch): background, transition, duration, title, hidden, position, voiceover_volume, video_styling (video clips), after_clip, subtitle_settings.\n\n- duration: sets the clip's length WITHOUT rescaling anything (unlike generating speech, which rescales the whole clip). A shrink clamps every end_time past the new end to it; a grow carries an element that ended at the old end to the new end and leaves the rest where they were. A placed trim animation keeps its animation_duration: it holds its last frame on a grow and is cut on a shrink; only a stretch animation plac"
},
{
"name": "remove_clip",
"description": "Remove a clip from the project by index. Cannot remove the last remaining clip.\n\nInteractive links to the removed clip are cleared: any button, question/results logic or form that jumped to it now continues, and a clip whose end action jumped to it plays the next clip.\n\nAfter removal, all clips with index > clip_index shift down by 1. When removing multiple clips by index, remove from highest index to lowest (or capture clip_ids first and re-derive indices between calls). Concurrency: whole-project mutation (conflict domain: the entire project) — serialize. Do not run it in parallel with ANY o"
},
{
"name": "split_clip",
"description": "Split a video clip into two clips at the given timestamp. The left clip keeps the original clip ID; the right clip gets a new ID and is inserted immediately after. Elements spanning the split point are duplicated into both clips with adjusted timing. Exception: a question, results card, form, or any element with a clickaction stays whole in the left clip (trimmed to end at the split), so it is never asked or paused on twice. Voiceover transcript and transcribed words are split proportionally.\n\nConcurrency: whole-project mutation (conflict domain: the entire project) — serialize. Do not run it "
},
{
"name": "captions",
"description": "Read and edit a clip's CAPTIONS (subtitles) — what they say, where one caption ends and the next begins, when each shows, captions not tied to the voiceover, and translation. Captions are built from the clip's voiceover words: each caption is a run of words, addressed by its `start_word_index`.\n\nStart with action=\"list\" on the clip — it returns `blocks` (voiceover captions: start_word_index, end_word_index, start/end in clip seconds, text, transcript_text, words, edited, retimed, mergeable), `manual_captions` ({caption_id, start, end, text}), `active_language` and `translated_languages`. Then:"
},
{
"name": "duplicate_clip",
"description": "Clone one clip — within the same project, or **from another project** — into a target project.\n\n- Same project: pass `target_project_id` and `source_clip_id` (omit `source_project_id`).\n- Cross-project: pass `target_project_id`, `source_project_id`, `source_clip_id`. The source clip's S3 assets (voiceover audio, original video footage, generated video, etc.) are re-hosted into the target guide's S3 namespace, so the new clip is independent of the source — deleting the source project later won't break it.\n\nInsertion: pass `after_clip_id` to place immediately after a specific clip in the target."
},
{
"name": "add_clips",
"description": "Create new clips on a project. One tool, four sources:\n\n- kind=\"blank\": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{title?, duration?}, ...]`. Note: create_project already creates clip 0; calling with N blank entries gives N+1 clips total.\n- kind=\"pptx\": extract slides from an uploaded .ppt/.pptx. Pass `mcp_upload_id` (from upload_file), optional `slide_indices`. Each slide becomes a slide_clip with native text/image/shape elements pre-populated.\n- kind=\"video\": cut clips from an uploaded video/audio. Pass `mcp_upload_id` and optionally `mime_type` (def"
},
{
"name": "get_element_schema",
"description": "Return the schema for an element type's type_data, as TypeScript declarations. Call this before add_elements / update_elements when you don't already know the field shape for the element_type you're placing.\n\nBy default it is compact: every field with its type and a one-line note, plus the keyframable list. Ask about specific properties with `fields: ['background_setting']` or `query: 'pill background'` — those come back with their full notes, default and an example; `detail: 'full'` returns everything, including the keyframe rules. Inside run_script it is a function like any tool: get_element"
},
{
"name": "add_elements",
"description": "Add elements to one or more clips in ONE call (always batch). Items apply in order; one result per item (partial success ok). type_data shape: get_element_schema.\n\n- `defaults`: hoist what repeats (clip_index, element_type, font_setting, alignment…); items carry only what differs. `returning` shapes the reply.\n- Native elements by default (editable, translatable); compute boxes and keyframes in run_script (layout.row/grid/split, anim.stagger, native.box/text/tween). HTML animation (edit_animation place, animation.place) only where native can't: charts, product UI, diagrams, illustration, 3D, s"
},
{
"name": "update_elements",
"description": "Update elements across one or more clips in ONE call (always batch). Items apply in order; partial success ok. clip_index not needed (element_id is project-unique).\n\n- Per item: position/timing fields, and/or type_data with element_type (settable fields: get_element_schema mode 'update'). `defaults` hoists shared keys; `returning` shapes the reply ([] = counts + errors).\n- Keyframes: top-level `keyframes` (not in type_data) replaces only the property tracks your entries name; null or [] clears all.\n- Component: after add_elements(component_id), set its content with type_data.parameter_values o"
}
],
"profiled_at": "2026-11-12T11:01:29.200Z"
},
"payment_method": "oauth",
"unreachable": false
}