Development Choices
Photo of Joseph Trasatti

Joseph Trasatti

Member of technical staff

Joseph builds full-stack systems at OpenAI, working on Codex and Deep Research. Before that he was a product engineer at Scale AI in New York, and started his career at Capital One — though he was already running his own projects by then, serving as CTO of moove and co-founding AlgoRaven while holding down a day job.

He holds degrees in engineering physics from Providence College and computer science from Columbia via their dual-degree program, and once captained a competitive League of Legends team as its shot-caller - arguably good preparation for coordinating systems under pressure.

Articles by Joseph Trasatti

Automate UGC Moderation Before Publication

Route uploads into a moderation flow that holds each asset in a pending state and promotes it only after a check passes, so the delivery URL is never public while undecided. Because classification returns a confidence score rather than a verdict, define an explicit middle band for human review, then sample what the automation approved.

Bulk asset ingestion from a spreadsheet

A published CSV upload flow turns a one-off media migration into a spreadsheet job with no code to deploy. The work that decides whether it succeeds is row-level failure tracking, pacing against your plan's API allowance, and supplying metadata at creation time rather than in a second pass.

Alt Text Generation in a Media Automation Flow

Generating alt text inside a media automation flow means the description is derived from the image and written back into the asset's metadata, so it travels with the asset. A working setup classifies decorative images out first, routes ambiguous assets to human review, and treats the accessibility conformance test as the pass condition.

Trigger types for a hosted media automation

A hosted media automation starts from one of three trigger forms: a webhook call, a schedule, or an asset upload. Upload triggers fire once per asset and scale with ingest rate, schedules convert an unbounded stream into fixed batches, and webhooks let an external system decide when the work runs.

Vendor CLI or MCP server for bulk asset work

For uniform work across thousands of assets the vendor CLI wins: one deterministic, re-runnable invocation and no per-item model tokens. An MCP server earns its cost only when handling differs per asset and something must judge what each one contains. Split the job — the model decides, a shell loop executes.

The Context Cost of Idle MCP Servers

Every connected MCP server loads its tool definitions into the context window at session start, whether or not a tool is called. The cost is both tokens and accuracy: a larger tool surface produces more plausible-but-wrong selections. Disabling unused servers is the coarse fix; a per-connection tool allowlist is the precise one.

Secrets exposed in MCP client config files

An MCP client config that authenticates with headers stores a plaintext API secret in a project or user-profile file that nothing protects by default. Project-scoped copies get committed because they look like configuration, not credentials. Use OAuth wherever a browser is reachable, and recover by rotating at the vendor rather than deleting the file.

OAuth or API key headers for an MCP server

Use OAuth for a remote MCP server on a workstation with a browser: it binds one product environment per connection and keeps no secret in your config file. Use header authentication — one cloudinary-url header, or three — for headless CI, containers, or one machine serving several environments at once.

Remote vs local MCP servers for vendor integrations

Remote and local MCP servers expose the same tools, so the choice is about distribution: a remote server is a URL needing no runtime and defaults to OAuth, while a local one keeps credentials on the machine but makes every developer install and update it. Egress restrictions settle it: they rule remote out.

MCP transport: /mcp against the deprecated /sse path

Cloudinary's remote MCP servers are reached at a /mcp endpoint over stateless Streamable HTTP, the transport documented for new configurations. The older /sse path is deprecated everywhere except the Analysis server, and still accepts POST as an alias, so stale configs keep working while pointing at a path scheduled for removal.

Configure the MediaFlows MCP Server in a Client

MediaFlows connects over a versioned endpoint at https://mediaflows.mcp.cloudinary.com/v2/mcp and authenticates with three custom headers — cld-cloud-name, cld-api-key and cld-secret — instead of OAuth. Configure those in your MCP client, verify the server lists workflow tools, and treat every call as an edit to automation rather than to a single asset.

Media handling in no-code app builders

No-code builders handle media in two ways: a pre-built integration wires upload and delivery into the app while it is being created, and transformation URLs work in any builder that renders an image source. The integration route imposes one shared credential and cannot sign requests, so signed uploads and token-authenticated delivery stay out of reach.

Restrict the tools an MCP server exposes

Cloudinary's remote MCP servers accept a cloudinary-tools header holding a comma-separated allowlist, so one connection advertises three tools instead of the server's full set. Enforcement is server-side, unlike a client-side toggle. Fewer tool definitions load into context, the model chooses between four plausible tools rather than forty, and an unadvertised delete tool cannot be called.

Surface MCP Rate-Limit and Request-ID Headers

Set the `cloudinary-embed-headers` option to true in your MCP client configuration. Every tool result then returns a `_headers` object carrying the feature's rate-limit ceiling, the remaining allowance, the reset timestamp and a request ID. The agent can pace itself before it hits a limit, and each call becomes traceable in a support ticket.

PowerFlows or EasyFlows: Canvas vs Natural Language

PowerFlows give you a drag-and-drop canvas with step-by-step control over branching and third-party calls; EasyFlows describe the same automation in a sentence and run sooner. Pick the canvas when the workflow needs a branch a sentence cannot express — custom integration especially. Pick natural language for standardised branding, asset expiry and auto-tagging.

Agent skills against MCP servers for one integration

A skill is instruction text that steers a model toward correct patterns; an MCP server is an execution surface for operations against a live account. Cloudinary ships both as complementary layers. Skills cost context per turn and carry no credentials; servers cost context per tool definition and need an authenticated connection. Neither substitutes for the other.

Hosted visual flow or hand-written webhook handler?

A hand-written webhook handler needs a deployment target, a secret store, retry logic and an on-call owner before its first event; a hosted visual flow needs none of those but has no diff, no branch and no pull request. Pick the repository for single-owner logic, the canvas when more than one role edits it.