The command-line
companion to Studio.

Create test content in seconds. Duplicate events across shows, brands, and environments. Back up and compare project settings. Script the clicks you are doing in Studio by hand today.

Works from your terminal, from a CI job, or from Claude and other AI agents - same commands, same auth, same result.

Studio is great for one-off work. The repetitive stuff adds up fast.

01

Click, click, click – one event at a time

Setting up a 12-episode show, a quiz night with 20 questions, or a matchday full of polls is hundreds of clicks. Doing it again next week is hundreds more. Nothing about the work is hard – there is just a lot of it.

02

Settings changes are high-stakes and hard to undo

A project can hold 2,000+ localised strings, provider credentials, and timing rules in one settings blob. There is no native backup, no diff before you save, and no easy way to compare staging against prod. If a change breaks something, you revert from memory.

03

Every new client starts from a blank page

The same FanKit setup, the same leaderboard wiring, the same translation keys, the same app version – rebuilt by hand each time. There is no way to say "this shape of project" once and apply it again.

Give agents and people an easy interface into the Interaction Cloud.

mic is the only automation surface for MIC that combines introspectable commands, auto-generated MCP tools, and a shared auth path in a single codebase.

36 commands, one surface. Orgs, projects, events, elements, URL helpers, and more. Every command supports --json for machine output.

MCP tools without hand-writing any. monterosa-mcp runs mic describe at startup and generates a tool per command, with types, required-ness, and descriptions.

Thin by design. About 400 lines of TypeScript across the adapter. The CLI does the work. The MCP layer translates.

Ship once, every agent updates. Add a command, bump the CLI, restart the agent. That is the release process.

One codebase, one auth, one release.

Clean command structure

Commands mirror API resources: mic projects create, mic elements create, mic url consumer. Every command takes --json.

Introspection, not documentation

mic describe --json emits structured metadata for every command: name, path, args, flag types, required-ness. No separate spec file to keep in sync.

MCP adapter, auto-generated

monterosa-mcp runs mic describe at startup, builds an MCP tool per command, and routes calls to the CLI. Zero hand-written schemas.

Ship once, every agent updates

Add a command to the CLI, bump the version, restart the MCP host. Claude Code, AgentCore Gateway, Bedrock agents: all pick it up on next start.

The Studio work you actually repeat, named by task.

Six jobs that eat the most time in content operations, each one a single command away. The full command tree is over on the Full reference.

01 · Mock content

Create realistic test content in seconds

One command spins up an event with every element type pre-populated - polls, quizzes, leaderboards, predictions. Great for client demos, QA passes, or verifying a fresh FanKit version.

smoke run, events from-template, elements apply

02 · Duplicate

Copy events across shows, brands, environments

Clone a whole event with all its elements, settings, and schedule. Re-use last week's quiz with new questions. Copy a working event from staging to prod. No more rebuilding from scratch.

events clone, elements clone-from, elements clone-group

03 · Bulk operations

Publish, schedule, or archive at scale

Publish every draft element in an event. Schedule a 12-week recurring show. Prune everything older than a season. The jobs that drown a producer on a matchday, in one line.

elements publish --event, events schedule, events prune

04 · Settings safety

Back up, diff, and compare settings

Pull a project's 2,000+ localised strings and config to a file on disk. See what changed before you push. Compare two projects side by side to find the one setting that differs. Recover in minutes, not meetings.

projects settings pull, diff, projects diff

05 · Promote between envs

Move content between staging and prod

Pull a configuration from one environment, push it into another. Export an event's elements as a portable bundle. Move translation work from the agency's sandbox into your production space.

settings pull + push, elements export

06 · Project as code alpha

Declare a project once, rebuild anywhere

Describe a project - its app, settings, elements - as a YAML manifest. Plan shows the diff before anything changes. Apply reconciles. Ship the same shape of project to every new client, every time.

plan, apply, export

Talk to Studio in plain English.

Every mic command is also exposed as an MCP tool. Ask Claude Desktop to clone an event, back up a project, or generate test content, and it runs the real commands against your live instance – with your auth, your permissions, your safety net.

Claude Desktop · you + mic
T
Duplicate Friday night's quiz for next week, swap out the three questions for these new ones, and schedule it for 20:00 UK time. Use the staging instance.

I will use the mic tools. Two reads first so I do not get the wrong event.

tool mic_events_list --project friday-quiz --profile staging
tool mic_events_clone --source evt_8h2 --name "Week 13" --profile staging

Cloned to evt_9k4. Updating the three trivia elements now.

tool mic_elements_apply --event evt_9k4 --file questions.yaml
tool mic_events_schedule --event evt_9k4 --start "Fri 20:00 Europe/London"

Done. Week 13 scheduled for Friday 20:00 UK. Preview URL: staging.…/e/evt_9k4. Want me to publish the elements as drafts or live?

– Connected via monterosa-mcp – 4 tool calls · 6 seconds
content-ops-agent · daily run running
08:00:02  info   loaded workload: rollover-weekly-shows.yaml (3 shows)
08:00:02  info   profile=prod  user=content-bot@monterosa

08:00:03  step   show premier-league-matchday
08:00:03  tool   mic events clone evt_mw12 --name "Matchweek 13"
08:00:05  ok     created evt_mw13  (18 elements cloned, schedule offset +7d)

08:00:05  step   show friday-night-quiz
08:00:05  tool   mic events from-template tpl_quiz --project friday-quiz --name "Week 13"
08:00:06  ok     created evt_fn13  (6 elements, leaderboard linked)

08:00:06  step   show loyalty-weekly-drop
08:00:06  tool   mic projects settings diff loyalty-hub --file baseline.json
08:00:07  warn   4 settings diverged from baseline
08:00:07  tool   mic projects settings push loyalty-hub --file baseline.json --confirm
08:00:08  ok     settings reconciled

08:00:08  done   3/3 shows rolled over · 0 errors · 6.4s total
08:00:08  info   report posted to #content-ops
– Headless run · no human in loop – Same commands, same auth as a human operator

Under the hood the agent is running the same mic you installed. Every action is auditable in Studio, scoped to the agent's own auth profile, and reversible – because the read-first, diff-before-write pattern is built into the commands.

The common flows, one click away.

Pick a task. Copy the commands. Every snippet is live, tested, and emits JSON when you add --json.

Looking for every command? Full CLI reference →

Create things

Every create command accepts --json and prints the new resource's id to stdout.

Project
$ mic projects create --space $SID \
    --name 'Friday Night' --app fankit-v25.1.0
Event
$ mic events create --project $PID \
    --name 'Week 12' --duration 5400
Poll from template
$ mic elements create --event $EID \
    --type poll-element --template \
    --var question='Who wins?' \
    --var option_1='Team A' \
    --var option_2='Team B'
Batch create from YAML
# Creates all elements in order, resolves {{name}} refs,
# publishes on success.
$ mic elements apply --event $EID \
    --file quiz.yaml --publish

Update things

Settings pushes are digest-checked. If Studio has moved on since your last pull, the push aborts with a diff.

Start / stop an event
$ mic events start $EID
$ mic events stop  $EID
Publish an element
$ mic elements publish $ELEMENT_ID
Round-trip project settings
$ mic projects settings pull $PID --out settings.json
# edit settings.json locally...
$ mic projects settings diff $PID --file settings.json
$ mic projects settings push $PID --file settings.json
Reload a project onto a new app version
$ mic projects reload $PID \
    --app fankit-v25.2.0

Copy & clone

There is no server-side duplicate endpoint; mic reads the source and recreates client-side, preserving element order and custom fields.

Clone a full event
$ mic events clone $SOURCE_EID \
    --name 'Week 13'
Event from a Studio template
$ mic events from-template $TEMPLATE_ID \
    --project $PID --name 'Matchday'
Copy settings across projects
$ mic projects settings pull $SRC --out s.json
$ mic projects settings push $DST --file s.json

App management

FanKit, Launcher, Bracket are all apps. The catalogue is bundled; the space list is live.

Known apps (bundled)
$ mic apps catalogue
fankit     v25.1.0   apps.monterosa.cloud/fankit/v25.1.0/
launcher   v1.1.0    launcher.monterosa.cloud/v1.1.0/
bracket    0.0.1     s3.../bracket-product/0.0.1/
Apps enabled on a space
$ mic apps list --space $SID
Register a new app version (admin)
$ mic apps create --space $SID \
    --app-id fankit --version v25.1.0 \
    --embed-url https://apps.monterosa.cloud/fankit/v25.1.0/index.html
Which app is this project on?
$ mic projects inspect $PID --json \
    | jq '.app'
{ "id": "fankit", "version": "v25.1.0" }

Query & list

Pipe into jq to filter. Every list command paginates in --json mode.

Live events on a project
$ mic events list --project $PID --json \
    | jq '[.[] | select(.state=="current")]'
Group event's elements by type
$ mic elements list --event $EID --json \
    | jq 'group_by(.content_type)
           | map({type: .[0].content_type, n: length})'
Project roster for a space
$ mic projects list --space $SID --json \
    | jq -r '.[] | [.id,.name,.app.version] | @tsv'
Event templates configured in Studio
$ mic events templates --project $PID

Stats & inspect

Introspection hits both the public app spec and the Control API. No guessing; the schema tells you what a type accepts before you send.

Project overview
$ mic projects inspect $PID
name        : Friday Night
app         : fankit v25.1.0
events      : 42 (3 current, 5 future)
elements    : 317 total, 12 types enabled
settings    : 2,666 entries (digest ab12cd34)
Field schema for a content type
$ mic elements schema $PID poll-element
question      freetext  localisable  mandatory
options       2–10 items, each with text
duration      fixed/flexible/instant
reveal_results vote | end | never
CLI command count (self-describe)
$ mic describe --json | jq '.commands | length'
36

URLs & feeds

Derived client-side from the project's embed template. No extra API calls.

Consumer URL for an event
$ mic url consumer --project $PID --event $EID
https://apps.monterosa.cloud/fankit/v25.1.0/?p=...&e=...#/
Studio deep link
$ mic url studio --project $PID --event $EID
https://studio-dev.monterosa.cloud/projects/.../episodes/.../timeline
Graphics feed (all events)
$ mic url feeds --project $PID
https://cdn-dev.monterosa.cloud/tvgraphics/...
Livestats feed for an event
$ mic url livestats --event $EID
https://livestats-dev.monterosa.cloud?event_id=...&stats_id=...

Auth & profiles

Credentials live at ~/.monterosa/credentials (0600). Env vars override; --profile selects per-command.

Add a profile
$ mic auth login \
    --url https://studio-dev.monterosa.cloud \
    --token $TOKEN --profile dev
Active profile
$ mic auth whoami
profile : dev
url     : studio-dev.monterosa.cloud
user    : you@monterosa.co
Run against a non-active profile
$ mic orgs list --profile prod

Two commands and a two-line config.

Install the CLI globally, then wire the MCP adapter into whichever host you use. The MCP adapter shells out to mic, so there is nothing else to configure.

  • Requires: Node.js 20+, a MIC API token on your machine.
  • Hosts covered below: terminal CLI, Claude Desktop, Claude Code. Same binary, same auth, three integration points.
  • Ships as: @monterosa/mic-cli + @monterosa/monterosa-mcp on npm.

1. Install the CLI + MCP adapter

~ install
$ curl -fsSL https://assets.monterosa.co/cli/install.sh | bash ✓ installed mic 0.1.11 ✓ installed monterosa-mcp 0.1.6 $ mic auth login --url https://studio-dev.monterosa.cloud --token $TOKEN ✓ saved profile 'default'

Public tarball, no GitLab token. One auth, shared by CLI and every MCP host below.

2a. Use from the terminal (CLI)

~ cli
$ mic orgs list --json | jq 'length' 4 $ mic events create --project abc123 --name "Kickoff" ✓ event evt_789 created

2b. Wire into Claude Desktop

Step 1. Open (or create) Claude Desktop's config file:

  • macOS    ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows %APPDATA%\Claude\claude_desktop_config.json
  • Linux    ~/.config/Claude/claude_desktop_config.json

Step 2. Add the monterosa-mic server. If you already have other servers, just add it inside the existing mcpServers block.

claude_desktop_config.json
{ "mcpServers": { "monterosa-mic": { "command": "monterosa-mcp" } } }

Step 3. Quit and reopen Claude Desktop (fully quit from the menu bar, not just close the window).

Step 4. Verify in a new chat – type:

Claude Desktop
you: what mic tools do you have? claude: I see 46 monterosa-mic tools - orgs, spaces, projects, events, elements, URL helpers, smoke-test, and manifest plan/apply. Want me to run one?

If Claude does not see the tools, check the logs at ~/Library/Logs/Claude/mcp*.log. The most common issue is monterosa-mcp not being on the login shell's PATH - try which monterosa-mcp in Terminal to confirm.

2c. Wire into Claude Code (terminal)

~ claude-code
$ claude mcp add monterosa-mic monterosa-mcp added 'monterosa-mic' to ~/.claude.json $ claude mcp list monterosa-mic connected (46 tools)

One command, no config file to edit. Ship a feature in the CLI, every host picks it up on next restart.

Powered by the Monterosa Interaction Cloud

Control the platform through one CLI.

Install mic, wire up the MCP adapter, and give your scripts and agents the same surface.

Install and get started