MediaValet Internal

Data Services x mv-cli

Faster, safer, auditable workflows

Akos Sebestyen / April 2026
mva + Claude Code = DS superpowers
The Problem

DS is drowning in manual work

23 open tickets

Backlog growing faster than throughput. Single tickets taking 10-20 hours of manual work.

Broken scripts

Keyword import scripts failing on tickets #41372 and #41272. Clients waiting.

Windows-only tooling

PowerShell ISE locked to Windows. No cross-platform, no version control, no sharing.

No safety net

No dry-run, no backups, no rollback. One wrong script run and you're restoring from nothing.

Current stack: PowerShell ISE · Streamlit · AzCopy
The Solution

mv-cli + Claude Code

Client CSV
metadata input
Claude Code
orchestrator + skills
mva
CLI commands
MediaValet API
DAM operations

Cross-platform

Mac, Linux, Windows

Composable pipes

Chain commands via |

Built-in dry-run

Preview before execute

Audit logging

Every action tracked

Demo 1

Full Library Metadata Export

[qaspaces] Full Library Metadata Export
Via web form
GENERATED FOR DEMO PURPOSES — NOT A REAL TICKET
click to copy
CW
Chris Winsor Internal Today 9:15 am
Hi team, we need a full metadata export for the qaspaces library — all assets, all attributes, keywords, and categories as CSV. This is for an internal audit. Thanks!
10,062
assets exported
47s
total time
41
attributes
0
errors
PowerShell minutes to hours, manual pagination
mva 47 seconds, automatic pagination (51 pages)

Workspace output

work/41372/
├── discovery.md -- org shape, attribute schema
├── plan.md -- what we'll do and why
├── backups/
│   └── pre-execution-assets.csv
├── logs/
│   └── export-20260401T0930.log
└── report.md -- final summary + validation

Every step documented. If a client asks "what happened?" six months later, the answer is here.

Demo 2

Keyword Import — SRAM Product Photography

Bulk apply keywords via CSV - SRAM
Via web form
GENERATED FOR DEMO PURPOSES — NOT A REAL TICKET
click to copy
KR
Kim Roche Yesterday 10:29 am
Hi team, we need keywords applied to our Product Photography assets. We uploaded photos into Road, Mountain, and Gravel but forgot to tag them. Attached is a CSV with the filenames and keywords we need. Please apply as-is. Thanks! Attachment: sram-keyword-tagging.csv

Client CSV (filenames)

# Client provides:
filename,keywords
SRAM_Eagle_01.jpg,"mountain,eagle,drivetrain"
SRAM_Eagle_02.jpg,"mountain,eagle,cassette"
...
12 assets total

Resolved CSV (asset IDs)

# Claude Code resolves filenames to IDs:
id,keywords
a1b2c3d4-...,mountain,eagle,drivetrain
e5f6g7h8-...,mountain,eagle,cassette
✓ 12/12 filenames resolved

The workflow

STEP 1
Resolve filenames to asset IDs
Search by filename, match to GUIDs
STEP 2
Dry-run the import
Preview every change, zero mutations
STEP 3
Execute
Apply keywords with --verbose logging
STEP 4
Validate
Re-export, diff against expected state
Demo 3

Rollback — the safety net

Backup
pre-execution.csv
snapshot of current state
Execute
apply metadata
from import CSV
Oops
wrong keywords
applied to assets
Rollback
--from-csv backup.csv
back to original
rollback command
$ mva update asset --from-csv backups/pre-execution.csv

Restoring 12 assets to pre-import state...
✓ 12/12 assets restored
keyword cleanup
# Need to wipe all keywords from an asset?
# Special CSV value handles it:

id,keywords
a1b2c3d4-...,__REMOVE_ALL__

# Clean slate. No manual portal clicking.
Demo 4

Scale — one line, 215 assets

Tag all Unsplash stock photos for licensing compliance
Via web form
GENERATED FOR DEMO PURPOSES — NOT A REAL TICKET
click to copy
BL
Bailey Lawson Today 9:30 am
We have a bunch of Unsplash stock photos scattered across the library that were never tagged. Can you find all assets with "unsplash" in the filename and tag them with the keyword "unsplash"? We need this for licensing compliance — want to be able to filter stock photos from original content. Thanks!
$ mva get assets --search "unsplash" | mva update asset -k unsplash
215
assets tagged
1
command
<30s
total time

PowerShell approach

# Manual pagination loop
$page = 1
do {
  $assets = Get-MVAssets -Page $page
  foreach ($a in $assets) {
    if ($a.title -match "unsplash") {
      Add-MVKeyword $a.id "unsplash"
    }
  }
  $page++
} while ($assets.Count -gt 0)
# ~30 minutes, no error handling

mva pipe pattern

# Search, pipe, update. Done.
$ mva get assets --search "unsplash" \
  | mva update asset -k unsplash

# With dry-run first:
$ mva get assets --search "unsplash" \
  | mva update asset -k unsplash --dry-run

✓ auto-pagination, rate limiting, logging
The Protocol

9-step auditable workflow

01 Ticket
02 Discovery
03 Plan
04 Backup
05 Dry Run
06 Execute
07 Validate
08 Handoff
09 Report

Safety built in

Backup before every mutation. Dry-run before every execution. No exceptions.

Fully auditable

Every command logged. Workspace archived to Zendesk. Reproducible months later.

Human in the loop

DS operator approves plan, reviews dry-run, validates results. Claude Code assists, doesn't replace.

What Changes

PowerShell → mva command map

Operation PowerShell (old) mva (new) Improvement
Export metadata Custom script + manual pagination mva get assets --fields ... --format csv 10x faster
Import keywords Broken PowerShell scripts mva update asset --from-csv Works
Bulk tag foreach loop + API calls mva get assets | mva update -k 1 line
Category assign Script + manual ID lookups mva add assets-to-category Built-in
Dry run Does not exist --dry-run on every mutation New
Rollback Does not exist --from-csv backup.csv New
Audit log Manual notes in Zendesk --verbose + workspace logs Automatic
Orchestration Human runs each step Claude Code skills AI-assisted
Gaps & Roadmap

What mva can't do yet

Planned

Asset deletion
Currently can only remove from categories
User management
List users, manage permissions
IPTC / EXIF extraction
Can be done with local exiftool install
Blob-to-blob transfer
AzCopy replacement for bulk file moves
Attribute management
Create/edit attribute definitions — coming soon

Ready today

Full metadata export (CSV, JSON)
Keyword import/update from CSV
Attribute update from CSV
Category management
Bulk tagging (pipe pattern)
Dry-run + rollback
Claude Code DS skills

Feature requests from DS will drive the roadmap. File issues and they get built.

Next Steps

Getting started

01

Install and get set up on mva

Get the DS team running mva locally — install, authenticate to client orgs, run a few read-only commands to get comfortable.

02

Try using it in the repo

Clone data-services-demo, open in Claude Code, and run a ticket end-to-end using the built-in skills. Start with exports, then imports.

03

Fix the broken keyword tickets

Tickets #41372 and #41272 have broken keyword imports. Let's use mva to clear them this week as a proof point.

04

Target: 50-75% time reduction per ticket

10-20 hour tickets should drop to 2-5 hours. Time saved goes back to the backlog. 23 open tickets becomes manageable.

Questions? Let's do a live demo.