---
title: Discover and run | FLORA API
description: Paste a brief, find the right Technique, generate a grid of options.
---

The most common FLORA MCP workflow: paste a brief into your agent, it finds the right Technique from your team’s library, runs it, and shows the results inline.

**Surface:** Any MCP-compatible chat client (Claude, Cursor, VS Code, Hermes Agent, OpenClaw, …)\
**Time:** Under a minute\
**Charges:** One run’s `run_cost` (USD)

## What you type

> I have the Q3 campaign brief below. Find the right FLORA Technique for thumbnail generation and run it with the brief’s key directives.
>
> Brief:
>
> - Audience: 25-40, design-conscious
> - Hook: “Smart living, simple”
> - Brand do: warm minimalism, soft shadows
> - Brand don’t: clip-art, gradients
>
> Give me a 3×3 grid.

## What the agent does

1. Find the right Technique

   The agent calls `client.techniques.list({ query: "thumbnail" })` to filter your Technique library. It surfaces three Technique cards inline — name, thumbnail, creator, description.

2. Read its input schema

   Once you pick one (or the agent auto-picks the best match), it calls `client.techniques.retrieve(techniqueId)` to read the input schema: theme, audience, hook copy, brand do’s and don’ts.

3. Submit the run

   The agent maps your brief onto the Technique’s inputs and calls `client.techniques.runs.create(techniqueId, { inputs: [...] })` requesting a 3×3 grid.

4. Poll until complete

   The agent calls `client.techniques.runs.retrieve(runId, { techniqueId })` repeatedly until the run completes. The 3×3 grid renders progressively in the chat — each tile labeled with the brief line that drove it.

## What you see

A 3×3 grid of thumbnails appears inline in the chat. No tab switching. The original brief stays in scroll, so the next message you type can reference specific outputs.

## Where it goes next

This is the start of the loop. Common follow-ups:

- **Iterate:** *“Love #4 and #7. Make 5 more variations of those.”* → see [Iterate on favorites](/mcp/recipes/iterate-on-favorites/index.md).
- **Branch:** *“Now take the winners and run them through the Social Motion Technique.”* → see [Stills to motion](/mcp/recipes/stills-to-motion/index.md).
- **Batch:** *“I need this for 12 markets — pull the localization sheet from Drive.”* → see [Batch with a coding agent](/mcp/recipes/batch-with-coding-agent/index.md).

## Tips

- The clearer your brief, the better the Technique match. Including audience and brand do’s/don’ts in plain English gives the agent enough signal to map onto Technique inputs correctly.
- If the agent picks the wrong Technique, say: *“Show me the alternatives.”* It will call `client.techniques.list` again with a broader filter.
- You can name a Technique explicitly: *“Use the Thumbnail v3 Technique.”* This skips the discovery step.

## Under the hood

The agent may first call `search_docs` to confirm method signatures, then runs everything in a single `execute` call:

```
async function run(client) {
  // 1. Find thumbnail techniques
  const techniques = [];
  for await (const t of client.techniques.list({ query: "thumbnail" })) techniques.push(t);
  // → surfaces 3 candidates; agent picks best match


  // 2. Read the input schema
  const technique = await client.techniques.retrieve("tech_thumbnail_v3");
  // → inputs: theme, audience, hook, brand_directives


  // 3. Submit a run (3×3 = 9 outputs)
  const run = await client.techniques.runs.create("tech_thumbnail_v3", {
    inputs: [
      { id: "theme",            type: "text", value: "warm minimalism, soft shadows" },
      { id: "audience",         type: "text", value: "25-40, design-conscious" },
      { id: "hook",             type: "text", value: "Smart living, simple" },
      { id: "brand_directives", type: "text", value: "no clip-art, no gradients" },
      { id: "count",            type: "text", value: "9" },
    ],
  });
  // → { run_id, status }


  // 4. Poll until complete
  let result;
  do {
    result = await client.techniques.runs.retrieve(run.run_id, { techniqueId: "tech_thumbnail_v3" });
  } while (result.status === "pending" || result.status === "running");
  // → status: "completed", outputs: [{ output_id, type: "imageUrl", url }] × 9


  return result.outputs;
}
```

See the [tools reference](/mcp/tools/index.md) for available `execute` and `search_docs` parameters.
