obto-upload

obto-upload is a skill for Claude Code, Codex from obto-inc/platform. It costs 152 tokens per session (1,426 once invoked), scanned A, original, Apache-2.0.

A procedure for uploading local images, videos, PDFs, and other binary files to OBTO and receiving a served URL. OBTO is the storage and delivery service described by the add-on.

In plain words
What is it for?
Use it to upload a local asset through a direct signed URL or, when necessary, staged chunks, and return an OBTO viewer or file URL.
Why use it?
It avoids sending large file contents directly through the agent's tool messages, which can truncate or corrupt them.

Skill for Claude CodeCodex

Written for no agent in particular: nothing here depends on one.

Good fit Use it to upload a local asset through a direct signed URL or, when necessary, staged chunks, and return an OBTO viewer or file URL.

Compare 6 skills from other repositories ↓
Install with agentmods
npx agentmods add skills/obto-inc/platform/obto-upload
Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

Any agent
npx skills add obto-inc/platform --skill obto-upload
Clone the repo
git clone --depth 1 https://github.com/obto-inc/platform

Made for: Claude Code, Codex.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for obto-upload

README.md
[![agentmods](https://agentmods.dev/badge/skills/obto-inc/platform/obto-upload.svg)](https://agentmods.dev/skills/obto-inc/platform/obto-upload)
Your own site
<a href="https://agentmods.dev/skills/obto-inc/platform/obto-upload"><img src="https://agentmods.dev/badge/skills/obto-inc/platform/obto-upload.svg" alt="Measured on agentmods" height="20"></a>
Per session 152 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 1,426 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 1 finding. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00152 $0.01426
Opus 5 $0.00076 $0.00713
Sonnet 5 $0.00030 $0.00285
Haiku 4.5 $0.00015 $0.00143

Measured 7d ago against content hash d7cbedfe33cb, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-07, from the pricing page.

Security

Grade A, and why

obto-upload scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 7d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Makes network callslowCapability

Not a fault in itself. Listed so you know the mod talks to something, and to what.

- **Don't ask the agent's sandbox to PUT** — confirm an egress-capable client does it, or the curl
plugins/obto-codex/skills/obto-upload/SKILL.md · 88 lines

How it starts

The opening of the file, as written. The whole thing — 88 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Uploading local media/binary into OBTO

OBTO stores media/binary in a file worker and serves it at https://{domain}.obto.co/ms/filereader.bto?n=<fileName> (video via videoplayer.bto). This is a different subsystem from artifact-source deploys (obto-deploy): here the goal is to get file bytes into the store and receive a served viewer URL back.

The hard rule: never inline file bytes into a tool-call argument. The agent→tool channel truncates and corrupts large or dense values (a ~1.7KB clean-truncation ceiling; base64 also corrupts above that). Any path that pushes the bytes through a chunk / base64 tool arg is unreliable on its own. Move the bytes by a side channel and pass only a small reference.

Decision order

  1. Bytes already at an https URL OBTO can reachobto_upload_media({ url, filename, domain }). The server fetches it directly. Done.
  2. Local file + a client with network egress (the user's terminal, a browser, the Cowork host, or a helper script) → signed-URL direct upload (PRIMARY, below).
  3. Local file + only the MCP channel (no egress anywhere) → chunked staging with the integrity gate (FALLBACK, below).

The agent's own sandbox usually has NO network egress (the egress proxy blocks all hosts; the "additional allowed domains" setting is currently non-functional and is fixed at sandbox start). So the agent generally cannot be the uploader itself — the actual PUT must run on an egress-capable client. Mint the URL via MCP, then have that client do the PUT.

Primary: signed-URL direct upload

  1. Mint a grant: obto_request_upload_url({ domain, filename, [contentType], [folder] }). Returns a single-use, 5-minute presigned PUT URL (https://mcp.obto.co/ms/mcp_upload_receive?id=...), a ready-to-run curl_command, and the limits. It is domain-scoped, so no appName is required.
  2. PUT from an egress-capable client as base64 inside a JSON body: {"data":"<base64-of-file>"} with Content-Type: application/json. The receive route validates the grant (single-use, TTL), decodes, TUS-stores via the file worker, and returns the served URL.
    • The provided curl_command does exactly this (base64 in the shell, then PUT). Or run the obto-upload.js helper: node obto-upload.js <file> --token <mcp-jwt> --domain staging.
  3. Read the served URL from the PUT response: { ok:true, url, fileName, bytes }.

Read the full file on GitHub · 88 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 7d ago First seen · 88 lines · 152 tokens per session scan A d7cbedfe33cb

Subscribe to this mod's changes

obto-upload is a skill published in the GitHub repository obto-inc/platform (1 stars, last pushed 2d ago), licensed Apache-2.0. It adds 152 tokens to every session and 1,426 once invoked, about $0.0008 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.

Related

Other skills, from other repositories

canvas-design

Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.

AgiFlow/aicode-toolkit · 59 tokens

post-to-xhs

A publishing guide for 小红书, a Chinese social-media platform. It covers posting image-and-text content or a longer formatted article, using supplied content or a webpage.

xpzouying/xiaohongshu-mcp · 96 tokens

screenshot-camera

Capture a screenshot from a Unity Camera and return it as a PNG image for direct LLM inspection. Falls back to Camera.main (then any active camera) when cameraRef is null. Width and height are capped to keep response size manageable.

IvanMurzak/Unity-MCP · 58 tokens

screenshot-game-view

Capture a screenshot of the Unity Editor's Game View by reading its internal render texture directly. Image size matches the current Game View resolution; the tool corrects Y-flip on DirectX / Metal so the output is always upright. Requires an open Game View window.

IvanMurzak/Unity-MCP · 58 tokens

screenshot-scene-view

Capture a screenshot from the Unity Editor Scene View at the requested size. Renders via the Scene View's active camera onto a temporary RenderTexture. Requires an open Scene View.

IvanMurzak/Unity-MCP · 42 tokens

AI Image & Video Generator — GPT Image 2, Seedance, ComfyUI

Generate images and videos from text with multi-provider routing — supports GPT Image 2.0 (near-perfect text rendering), Nanobanana 2, Seedream 5.0, Midjourney V8.1 (unified photorealistic + anime), Flux 2 Klein (cheap drafts), Seedance 2.0 / Veo 3.1 / Grok Video / Agnes Video, and local ComfyUI workflows. Includes…

jau123/MeiGen-AI-Design-MCP · 177 tokens