Developer tooling
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.
The problem
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.
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.
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.
The fix
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.
How it works
Commands mirror API resources:
mic projects create,
mic elements create,
mic url consumer.
Every command takes
--json.
mic describe --json
emits structured metadata for every command:
name, path, args, flag types, required-ness. No
separate spec file to keep in sync.
monterosa-mcp
runs
mic describe
at startup, builds an MCP tool per command, and
routes calls to the CLI. Zero hand-written
schemas.
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.
What you can do with mic
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
Use it from Claude, or your own agent
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.
I will use the mic tools. Two
reads first so I do not get the wrong event.
mic_events_list
--project friday-quiz --profile staging
mic_events_clone
--source evt_8h2 --name "Week 13" --profile staging
Cloned to evt_9k4. Updating the
three trivia elements now.
mic_elements_apply
--event evt_9k4 --file questions.yaml
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?
monterosa-mcp
– 4 tool calls · 6 seconds
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
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.
Quick reference
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 →
Every create command accepts
--json and prints
the new resource's id to stdout.
$ mic projects create --space $SID \ --name 'Friday Night' --app fankit-v25.1.0
$ mic events create --project $PID \ --name 'Week 12' --duration 5400
$ mic elements create --event $EID \ --type poll-element --template \ --var question='Who wins?' \ --var option_1='Team A' \ --var option_2='Team B'
# Creates all elements in order, resolves {{name}} refs, # publishes on success. $ mic elements apply --event $EID \ --file quiz.yaml --publish
Settings pushes are digest-checked. If Studio has moved on since your last pull, the push aborts with a diff.
$ mic events start $EID $ mic events stop $EID
$ mic elements publish $ELEMENT_ID
$ 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
$ mic projects reload $PID \ --app fankit-v25.2.0
There is no server-side duplicate
endpoint; mic
reads the source and recreates client-side,
preserving element order and custom fields.
$ mic events clone $SOURCE_EID \ --name 'Week 13'
$ mic events from-template $TEMPLATE_ID \ --project $PID --name 'Matchday'
$ mic projects settings pull $SRC --out s.json $ mic projects settings push $DST --file s.json
FanKit, Launcher, Bracket are all apps. The catalogue is bundled; the space list is live.
$ 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/
$ mic apps list --space $SID
$ mic apps create --space $SID \ --app-id fankit --version v25.1.0 \ --embed-url https://apps.monterosa.cloud/fankit/v25.1.0/index.html
$ mic projects inspect $PID --json \ | jq '.app' { "id": "fankit", "version": "v25.1.0" }
Pipe into jq
to filter. Every list command paginates in
--json mode.
$ mic events list --project $PID --json \ | jq '[.[] | select(.state=="current")]'
$ mic elements list --event $EID --json \ | jq 'group_by(.content_type) | map({type: .[0].content_type, n: length})'
$ mic projects list --space $SID --json \ | jq -r '.[] | [.id,.name,.app.version] | @tsv'
$ mic events templates --project $PID
Introspection hits both the public app spec and the Control API. No guessing; the schema tells you what a type accepts before you send.
$ 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)
$ 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
$ mic describe --json | jq '.commands | length' 36
Derived client-side from the project's embed template. No extra API calls.
$ mic url consumer --project $PID --event $EID https://apps.monterosa.cloud/fankit/v25.1.0/?p=...&e=...#/
$ mic url studio --project $PID --event $EID https://studio-dev.monterosa.cloud/projects/.../episodes/.../timeline
$ mic url feeds --project $PID https://cdn-dev.monterosa.cloud/tvgraphics/...
$ mic url livestats --event $EID https://livestats-dev.monterosa.cloud?event_id=...&stats_id=...
Credentials live at
~/.monterosa/credentials
(0600). Env vars override; --profile
selects per-command.
$ mic auth login \ --url https://studio-dev.monterosa.cloud \ --token $TOKEN --profile dev
$ mic auth whoami profile : dev url : studio-dev.monterosa.cloud user : you@monterosa.co
$ mic orgs list --profile prod
Install
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.
@monterosa/mic-cli +
@monterosa/monterosa-mcp
on npm.
1. Install the CLI + MCP adapter
Public tarball, no GitLab token. One auth, shared by CLI and every MCP host below.
2a. Use from the terminal (CLI)
2b. Wire into Claude Desktop
Step 1. Open (or create) Claude Desktop's config file:
~/Library/Application Support/Claude/claude_desktop_config.json
%APPDATA%\Claude\claude_desktop_config.json
~/.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.
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:
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)
One command, no config file to edit. Ship a feature in the CLI, every host picks it up on next restart.
Install
mic, wire up the MCP adapter, and give your
scripts and agents the same surface.