Skip to main content
Glama

set_clip_property

Modify clip properties in Ableton Live, such as loop settings, pitch, warping, color, and more, using clip_id and property parameters for precise control in real-time workflows.

Instructions

set clip property

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
clip_idYes
propertyYes

Implementation Reference

  • The handler function for the 'set_clips_property' tool (note: tool name uses plural 'clips'). It batches the property modifications across multiple clips using the helper function.
    async setClipProperty({ clips }: { clips: { clip_id: string, property: z.infer<typeof ClipSettableProp> }[] }) {
        await batchModifyClipProp(clips)
        return Result.ok()
    }
  • Tool registration via @tool decorator, defining name 'set_clips_property', description, and params schema.
    @tool({
        name: 'set_clips_property',
        description: 'batch set clip property',
        paramsSchema: {
            clips: z.array(z.object({
                clip_id: z.string(),
                property: ClipSettableProp,
            }))
        }
    })
    async setClipProperty({ clips }: { clips: { clip_id: string, property: z.infer<typeof ClipSettableProp> }[] }) {
        await batchModifyClipProp(clips)
        return Result.ok()
    }
  • Zod schema defining the settable properties for clips, used in the tool's params.
    export const ClipSettableProp = z.object({
        name: z.string().optional(),
        color: commomProp.color,
        // color_index: commomProp.color_index,
        end_marker: z.number().optional(),
        gain: z.number().optional(),
        is_playing: z.boolean().optional(),
        launch_mode: z.number().optional(),
        launch_quantization: z.number().optional(),
        loop_end: z.number().optional().describe('[float] For looped clips: loop end. For unlooped clips: clip end.'),
        loop_start: z.number().optional().describe(`[float] For looped clips: loop start.
            loop_start and loop_end are in absolute clip beat time if clip is MIDI or warped. 
            The 1.1.1 position has beat time 0. If the clip is unwarped audio, they are given in seconds, 
            0 is the time of the first sample in the audio material.`),
        looping: z.boolean().optional().describe('true = clip is looped. Unwarped audio cannot be looped.'),
        muted: z.boolean().optional(),
        pitch_coarse: z.number().optional().describe(`[int] Pitch shift in semitones ("Transpose"), -48 ... 48.
    Available for audio clips only.`),
        pitch_fine: z.number().optional().describe(`[float] Extra pitch shift in cents ("Detune"), -50 ... 49.
    Available for audio clips only.`),
        position: z.number().optional().describe(`[float] Get and set the clip's loop position. 
            The value will always equal loop_start, 
            however setting this property, unlike setting loop_start, preserves the loop length`),
        ram_mode: z.boolean().optional(),
        signature_denominator: z.number().optional(),
        signature_numerator: z.number().optional(),
        start_marker: z.number().optional().describe(`[float] The start marker of the clip in beats, 
            independent of the loop state. Cannot be set behind the end marker`),
        velocity_amount: z.number().optional(),
        warp_mode: z.number().optional().describe(`[int] The Warp Mode of the clip as an integer index. Available Warp Modes are:
            0 = Beats Mode
            1 = Tones Mode
            2 = Texture Mode
            3 = Re-Pitch Mode
            4 = Complex Mode
            5 = REX Mode
            6 = Complex Pro Mode
            Available for audio clips only.`),
        warping: z.boolean().optional().describe('Available for audio clips only.')
    })
  • Core helper function that performs the batch modification of clip properties by resolving clips and calling modifyClipProp.
    export async function batchModifyClipProp(clips: { clip_id: string, property: z.infer<typeof ClipSettableProp> }[]) {
        const promises = clips.map(async ({ clip_id, property }) => {
            const clip = await getClipById(clip_id)
            await modifyClipProp(clip, property)
        })
        await Promise.all(promises)
    }
  • Helper that modifies a single clip's properties using the generic modifyObjProps function.
    export function modifyClipProp(clip: Clip, property: z.infer<typeof ClipSettableProp>) {
        return modifyObjProps(clip, property, ClipSettableProp)
    }
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure but offers none. It doesn't indicate whether this is a read-only or destructive operation, what permissions might be required, whether changes are reversible, what happens on success/failure, or any side effects. For a tool that appears to modify clip properties, this lack of behavioral information is a critical gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

While technically concise with just three words, this is an example of harmful under-specification rather than effective brevity. The description fails to provide any meaningful information that would help an AI agent understand or use the tool correctly. Every word should earn its place, but here the words don't earn their place by adding value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the tool (2 parameters with a nested object containing 20+ properties, no annotations, no output schema), the description is completely inadequate. It provides no context about what the tool does, how to use it, what to expect, or how it relates to sibling tools. This leaves the agent with insufficient information to properly invoke this potentially complex property-setting operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides zero information about parameters despite the input schema having 0% description coverage. With two required parameters (clip_id and property object with 20+ nested properties), the description doesn't explain what clip_id refers to, what format it should be in, or what the property object structure entails. This leaves all parameter semantics undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'set clip property' is a tautology that merely restates the tool name without adding any meaningful clarification. It doesn't specify what kind of properties can be set, on what type of clip, or what the operation actually does beyond the obvious implication of the name. This provides no value beyond what the tool name already conveys.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides absolutely no guidance about when to use this tool versus alternatives. With multiple sibling tools like 'set_track_property', 'crop_clip', 'duplicate_clip_loop', and others that manipulate clips in different ways, there's no indication of when this specific property-setting operation is appropriate versus other clip manipulation tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/xiaolaa2/ableton-copilot-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server