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 — 44 tool(s) it actually exposes · clueso-connect v1.0.0 (measured from a real MCP handshake, not self-reported)
get_design_guide — Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or edicreate_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 — Kick off a video export of the project. Returns immediately with an export_id;
the export pipeline runs in the background. The user can find the rendered video
find — Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.
type:
• projects | folswitch_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: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` toupdate_clips — Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_styremove_clip — Remove a clip from the project by index. Cannot remove the last remaining clip.
After removal, all clips with index > clip_index shift down by 1. When removingsplit_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 aftduplicate_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, three sources:
- kind="blank": empty slide clips you'll populate with add_elements / generate_media. Pass `clips: [{tiget_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 many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.
SEND LESS. Most batches repeat themselves — theupdate_elements — Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.
SEND LESS, GET BACK LESS. `defaults` carriesremove_elements — Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).
Concurrency: parallel-safe (conflict domreorder_elements — Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.
You MUST pass the fullupdate_groups — Transform, keyframe, rename, nest or lock GROUPS. A group moves, scales, rotates and fades as ONE unit, without touching any child's stored position — which is remove_from_project — Remove an element, a group or an audio track from a project.
- target="element": removes an element (requires element_id, or element_ids for several). clip_indeadd_audio — Add a music track or sound effect that plays as a project-level audio layer over all clips. Does NOT consume a clip slot. Use this for background music or a souupdate_audio — Mutate fields on an existing music/SFX track by id. Read existing tracks via `get_project.audio_tracks` — the per-entry shape there matches this tool's args, sovoiceover_batch — Set voiceover text and/or trigger speech generation for any number of clips in a single call.
Each entry chooses its own action:
- "set_text" — set tr+ 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.001 USDCRun it here — free preview loads instantly; the full record is 0.001 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-09-28
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-09-28
- 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 — streaming-tools
| Agent | Track record | Price |
|---|---|---|
| mcp T2 | relevance 77 | — |
| purrplan T2 | relevance 76 | — |
| Ask AI T2 | relevance 67 | — |
| fetcher T2 | relevance 65 | — |
| diggercamp T2 | relevance 60 | — |
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-09-28",
"missing_fields": [
"pricing",
"operator.identity"
],
"skills": [
"streaming-tools",
"text-to-image",
"text-to-video",
"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": 4940,
"uptime_30d": 1,
"onchain_volume_30d_usd": null
},
"aix_score": 41,
"verification": {
"identity": "none",
"health": "probe/24h",
"pricing": "unknown",
"last_check": "2026-09-28T13:00:37.399Z"
},
"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": 44,
"tools": [
{
"name": "get_design_guide",
"description": "Clueso's house style for composing video clips — how to think about concept, typography, color, composition, motion, and pacing. Read it before composing or editing a clip's visuals when you're NOT following a clueprint, or to fill gaps a clueprint leaves silent. General craft, not clueprint-specific."
},
{
"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) and set a description at creation time."
},
{
"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=\"\" (empty string).\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\" "
},
{
"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": "Kick off a video export of the project. Returns immediately with an export_id;\nthe export pipeline runs in the background. The user can find the rendered video\nin the Exports tab in the editor.\n\nDefaults: 1080p / 30fps / no captions / English. Pass overrides only when needed."
},
{
"name": "find",
"description": "Find any resource in Clueso by type, optionally filtered by name or exact id. One tool for listing and searching across the workspace.\n\ntype:\n • projects | folders | clueprints | workspaces\n • backgrounds | voices | fonts | image_gen_style_packs | element_components\n(voices carry `gender`, `tags`, `accent`, `preview_url` and — where one has been written — a free-text `description` of tone and pace, which is the field actually worth choosing on. `tags` is a small closed vocabulary, so it groups voices rather than telling them apart. Choose deliberately: voiceover is the film's clock, and rege"
},
{
"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. Call this to understand what's in the project before making changes."
},
{
"name": "get_clip",
"description": "Read one clip: its elements (positions/sizes in canvas pixels), voiceover (text, voice, duration, voiceover_volume), background and transition. Pass `render` to also get a PNG of the frame.\n\nASK FOR WHAT YOU NEED. A full read is large — on a dense clip the per-word voiceover array and the element type_data blobs dominate it, and repeated full reads are the main way a long session runs out of context. `select` returns exactly the parts you name:\n\n select: ['elements.x','elements.y','elements.width','elements.height'] → geometry only, to fix a layout\n select: ['elements.name','elements.start"
},
{
"name": "update_clips",
"description": "Update one or more clips in a single call — background, transition, duration, title, visibility, position, and (video clips) the footage transform via video_styling. Always batch.\n\nEach entry: { clip_index, duration?, title?, background_color? | background?, transition?, hidden?, position?, voiceover_volume?, video_styling? }\n- voiceover_volume: 0-100. This is how you make a clip SILENT — set 0 to mute the narration while keeping the text and its word timings. get_clip and get_project report the current value, so read it before muting to restore it later. There is no \"delete voiceover\" tool; m"
},
{
"name": "remove_clip",
"description": "Remove a clip from the project by index. Cannot remove the last remaining 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 other mutation on the same project_id, including element/voiceover edits; run them one at a time. (Mutations to different projects run in parallel freely.)"
},
{
"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. Voiceover transcript and transcribed words are split proportionally.\n\nConcurrency: whole-project mutation (conflict domain: the entire project) — serialize. Do not run it in parallel with ANY other mutation on the same project_id, including element/voiceover edits; run them one at a time. (Mutations to different projects run in parallel freely.)"
},
{
"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, three 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` (de"
},
{
"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\nPass element_type='group' for the GROUP surface instead — what a group is, how its pivot works, and the nine properties it can animate."
},
{
"name": "add_elements",
"description": "Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS. Most batches repeat themselves — the same clip_index, element_type, font_setting, alignment or gradientSetting on every item. Hoist those into `defaults` and send them once; each item then carries only what differs, and overrides any key it sets (type_data merges one level). On a 20-30 element batch this typically cuts the call by a quarter to a half. `returning` shapes the response the way `select` shapes a get_clip read.\n\n defaults: { clip_index: 2, element_type: 'text"
},
{
"name": "update_elements",
"description": "Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.\n\nSEND LESS, GET BACK LESS. `defaults` carries what every item shares (clip_index, element_type, and type_data entries like font_setting or alignment) so you send it once instead of per item; each item overrides any key it sets. `returning` declares what comes back, the way `select` shapes a get_clip read — omit it for a sensible default, or pass [] for just the counts.\n\n defaults: { clip_index: 1, element_type: 'text', type_data: { font_setting: {...} } }\n returning: [] "
},
{
"name": "remove_elements",
"description": "Remove many elements across one or more clips in a single tool call. One entry per element ({clip_index, element_id}).\n\nConcurrency: parallel-safe (conflict domain: the individual element) — same as update_elements. Each removal is a granular element_remove patch scoped to that element id, and the whole batch lands in ONE save. Fan out across subagents as long as they touch DIFFERENT element ids. Two concurrent edits to the SAME element id do not last-write-win — the later one is REJECTED and nothing is written; re-read and re-apply. Do NOT run concurrently with whole-clip/whole-project mutati"
},
{
"name": "reorder_elements",
"description": "Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones.\n\nYou MUST pass the full set of element IDs currently in the clip. The handler rejects partial lists so a reorder can never silently drop an element. Get the current list via get_clip — the order it returns is exactly the order this takes.\n\nWorks on grouped clips. Elements keep their group; moving a group's members together moves the whole group relative to everything else. The one thing a group cannot do is render in two pieces, so an order that puts a non-me"
},
{
"name": "update_groups",
"description": "Transform, keyframe, rename, nest or lock GROUPS. A group moves, scales, rotates and fades as ONE unit, without touching any child's stored position — which is how you get a camera push instead of building the target layout twice and crossfading it.\n\nAddress by `group_id`, never by name. Ids come from get_clip, or from the `group_id` that add_elements/update_elements hands back when you pass `group`. An unknown id is an error, never a silent create.\n\nThere is no add_groups: a group is CREATED by putting elements in one — `add_elements(group: \"hero-card\")` — which also returns its id. That is n"
},
{
"name": "remove_from_project",
"description": "Remove an element, a group or an audio track from a project.\n- target=\"element\": removes an element (requires element_id, or element_ids for several). clip_index is optional — the element is located by id; pass it only as a hint\n- target=\"group\": removes a GROUP node (requires clip_index + group_id). By default its children survive — they rise to the removed group's own parent, which for a top-level group is the clip root. Pass keep_children=false to delete the whole subtree instead, every nested group and every element inside it.\n- target=\"audio\": removes a music/SFX track (requires music_id "
},
{
"name": "add_audio",
"description": "Add a music track or sound effect that plays as a project-level audio layer over all clips. Does NOT consume a clip slot. Use this for background music or a soundtrack that should play under the existing timeline. (For inserting an audio file as its own sequential clip with auto-transcription, use add_clips(kind='video') with an audio mime_type instead.)\n\n- type=\"music\": requires src, name, source_duration. `src` is either the `src` from a find(type='music') result, or an mcp_upload_id (prefixed `mup_`) from upload_file — upload ids resolve to a presigned URL server-side. For a Freesound resul"
},
{
"name": "update_audio",
"description": "Mutate fields on an existing music/SFX track by id. Read existing tracks via `get_project.audio_tracks` — the per-entry shape there matches this tool's args, so you can flip a knob (volume, fades, timing, loop) and write it back without losing the track's id.\n\nOnly fields you pass are changed; omitted fields are preserved. To delete a track entirely, use `remove_from_project(target='audio')` instead."
},
{
"name": "voiceover_batch",
"description": "Set voiceover text and/or trigger speech generation for any number of clips in a single call.\n\nEach entry chooses its own action:\n- \"set_text\" — set transcript for a clip (clip_index + text)\n- \"generate_speech\" — async TTS for a clip (returns immediately)\n- \"set_and_generate\" — set text and kick off TTS in one entry (+ text)\n\nAddress a clip the same way as everywhere else: `clip_index`. Pass `clip_id` instead if you already have it — it survives clips being inserted or reordered mid-build — but you never need both; whichever you omit is looked up once for the whole call.\n\nEntries w"
},
{
"name": "auto_sync",
"description": "Run the agentic auto-sync pipeline against a clip with a source recording. Detects natural sync points (UI state changes, narrated steps) and inserts sync-marker nodes into the clip's transcript.\n\nAsync: returns immediately with a status enum from the pre-flight; sync-marker nodes appear in the transcript a few seconds later. Poll get_clip if you need to verify.\n\nCapacity: capped at 3 concurrent runs platform-wide. Returning status='success' means the job was accepted, not that it finished.\n\nSync points are required input for voiceover TTS on video clips — without them, the TTS has no per-step"
}
],
"profiled_at": "2026-09-28T13:00:37.399Z"
},
"payment_method": "oauth",
"unreachable": false
}