Skip to main content
Glama

Compose

compose

Start an async Director compose job: it authors an ensemble of full composition candidates, verifies each, and saves the winner to the project. Body must set EXACTLY ONE source (mutually exclusive): briefId — author FROM a persisted Brief (the PLANNED path: create_brief first; every Brief field is honored or the compose is refused loudly naming the field); fromComposition: true — author from the project's CURRENT composition (the GENERAL path: seed it with apply_composition first — your media clips are the intent, and any graphics you authored are CARRIED VERBATIM as locked clips the Director authors around, never re-authors or drops); or suggestionId — author from an AI clip suggestion (the CLIPPING path, paired with suggest_briefs). Returns { composeJobId, status, streamUrl }. Then call wait_job(kind="compose", id=composeJobId, projectId=...) to block until the winner is selected.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bodyYesPOST /projects/:id/compose body.
projectIdYesprojectId (path).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
statusNoqueued = normal; failed = startup failed and the job is already terminal (the SSE stream will emit a single `job_failed` frame and close).
projectIdNo
streamUrlNoRelative SSE endpoint to stream this job's events (per compose-api-contract.md).
composeJobIdNoOpaque compose job id; pass to the SSE stream URL.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / body / properties / format / properties / platform
      Added value: +{
      +  "type": "string"
      +}
  2. First observed

TDQS

A4.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, idempotentHint=false and destructiveHint=false; the description adds meaningful behavior beyond that — async job semantics, loud refusal when a Brief field cannot be honored, graphics carried verbatim rather than re-authored, and clientNonce-driven dedup. The one gap is that 'saves the winner to the project' doesn't state what happens to any existing composition, which matters for a non-readonly mutation with destructiveHint=false.

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

Conciseness4/5

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

Front-loaded with the operation and outcome, then the source-selection rule, then the return and the follow-up call — a sensible information order. It is long and dense, and some of the briefId parenthetical restates the schema description, but almost every clause carries a decision an agent must make.

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

Completeness5/5

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

For an async, nested-body, multi-path tool this covers the source selection, the prerequisites for each path, the refusal behavior, and the required follow-up job-wait — everything an agent needs to call it correctly. The output-shape sentence is redundant given the output schema exists, but it is not a gap.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds a constraint the schema does not encode at all: the source fields are a mutually exclusive choice where EXACTLY ONE must be set. It also labels each path's intent (PLANNED/GENERAL/CLIPPING), which is semantic value beyond the raw field descriptions.

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

Purpose5/5

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

States a specific verb+resource (start an async Director compose job) and immediately scopes what the job does: author candidates, verify each, save the winner. It also distinguishes the three source paths by name (briefId / fromComposition / suggestionId) so an agent can tell this apart from create_brief, suggest_briefs, apply_composition and create_render without opening other schemas.

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

Usage Guidelines5/5

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

Gives explicit prerequisites per path — 'create_brief first' for the PLANNED path, 'seed it with apply_composition first' for the GENERAL path — and names the pairing tool for the CLIPPING path (suggest_briefs). It also names the immediate follow-up call, wait_job(kind="compose", id=composeJobId, projectId=...), which is exactly the routing an agent needs.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.