# @buildinternet/uploads

CLI and client for uploads.sh — workspace-scoped image hosting for GitHub embeds

- **Type:** MCP server
- **Trust:** 85/100 (A), scored on the package rubric
- **Verification:** verified (build provenance)
- **Version:** 0.52.1
- **Author:** sh.uploads
- **License:** Apache-2.0
- **npm:** @buildinternet/uploads
- **Endpoints:** streamable-http https://agents.uploads.sh/mcp
- **Source:** https://github.com/buildinternet/uploads
- **Endpoint health:** reachable (last checked 2026-08-30T23:28:03.193Z, 1 sample) — uptime is not a security property and is not part of the trust score
- **Compatible clients:** claude-code, cursor, copilot, chatgpt, gemini (basis: transport)

## Trust

85/100 (A), scored on the package rubric
- Publisher verified: no
- Build provenance: verified attestation
- npm trusted publishing (OIDC): yes
- Install scripts: nothing suspicious found
- Prompt-injection scan: not run
- Obfuscation scan: not run
- Evidence age: 0 days

## Security scan

- **Status:** clean
- **Scanned:** 2026-09-05T12:52:03.307Z
- **Version scanned:** 0.52.1
- **CVEs:** none found by OSV at scan time

## Tools

22 declared. Statically extracted from the shipped source — a floor on the surface, not a census.
- `gallery_create` — Create a public ordered media gallery in the workspace. The returned canonical URL is safe to give users, but anyone who knows it can view the gallery and its m
- `gallery_get` — Get a workspace-owned gallery, including ordered media and its canonical public URL. Gallery media is public to anyone with the URL.
- `gallery_add` — Add one existing, publicly served workspace object to a gallery. Reads the latest gallery version before writing, so the optimistic API version is handled safel
- `gallery_link` — Link a gallery to an external reference. References use provider-neutral fields; github currently accepts owner/repo#number or a strict GitHub issue/PR URL. No 
- `gallery_find_by_reference` — Find workspace galleries linked to an external reference. Returns gallery summaries and canonical public URLs without contacting the provider.
- `put`
- `screenshot` — Capture a URL or local HTML file and host it. Shares put's attach, comment, and metadata options. `via=local` needs Chrome; `via=remote` renders server-side. lo
- `attach`
- `list` — List uploaded objects in the workspace, filtered by key prefix or by a PR/issue's attachments. Paginate with cursor, or set all to fetch every page.
- `staged` — List files staged for a git branch and whether they will auto-attach when a PR opens. Returns `{ repo, branch, files, binding }`.
- `delete` — Delete an uploaded object by key. Set dryRun to preview without deleting.
- `get_metadata` — Read the queryable tags on one file. Returns `{ metadata }` (empty when none). Same as `uploads meta get`.
- `set_metadata` — Set or delete queryable tags on an existing file. `set` wins over `delete` for the same key. Requires `set` and/or `delete`. Same as `uploads meta set`.
- `find_files` — Search files by metadata (`filters`) and/or filename substring (`name`). At least one is required. Same as `uploads find`.
- `list_metadata_keys` — List metadata keys in the workspace (with counts). Pass `key` to list that key's values instead. Use before `find_files`. Same as `uploads meta keys`.
- `usage` — Workspace storage and monthly upload counters (and remaining headroom when budgets are configured). Same as `uploads usage`.
- `reconcile` — Rebuild usage ledger bytes/objects from storage (source of truth). Preserves the monthly upload counter. Requires files:write. Same as `uploads reconcile`.
- `purge_expired` — Delete objects older than the workspace retentionDays setting, then reconcile. Skips if retention is unset. Requires files:delete. Same as `uploads purge-expire
- `comment` — Create or update the managed attachments comment on a GitHub PR or issue, listing everything uploaded for it. Posts as uploads-sh[bot] when the GitHub App is in
- `whoami` — Show the active uploads.sh identity: workspace, API URL, and token scopes. Use this to learn which workspace you're talking to. A successful result also means t
- `doctor` — Diagnose the configuration: API health, token auth, and workspace/token alignment. Returns the same report as `uploads doctor --json`, including hints.
- `report` — Send an explicit diagnostic report to the uploads team (message + optional text log).

## Install

**Verdict: install** — No blocking findings and no open coverage gaps — safe to install as configured.
**Config** (claude-code):
```json
"{\n  \"mcpServers\": {\n    \"uploads\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@buildinternet/uploads\"\n      ],\n      \"env\": {\n        \"UPLOADS_TOKEN\": \"<YOUR_UPLOADS_TOKEN>\"\n      }\n    }\n  }\n}"
```
**Credentials it will ask for** (names only — Forge never holds a value):
- `UPLOADS_TOKEN` — Uploads Token (required)
Placeholders only. Forge never holds, brokers, or transmits a credential value — replace each <YOUR_NAME> in your own config file. Do not send a value back to Forge; no Forge endpoint accepts one.
- This entry needs 1 credential (1 required). The generated config carries placeholders, so it will fail in the editor rather than at runtime if they are left unset.

## Blast radius

Extensive blast radius — deletes data; runs locally and hosted.
- Floor 55, ceiling 55 (tier: extensive)
- This is impact, not likelihood. A high radius is not a defect: a filesystem server is supposed to write files. It is never part of the trust score.

## Machine-readable views of this entry

- Signed JSON: https://forgeregistry.com/api/v1/packages/%40buildinternet%2Fuploads
- Install plan: https://forgeregistry.com/api/v1/packages/%40buildinternet%2Fuploads/install-plan
- Alternatives: https://forgeregistry.com/api/v1/alternatives/%40buildinternet%2Fuploads
- HTML page: https://forgeregistry.com/registry/%40buildinternet%2Fuploads
- MCP: POST https://forgeregistry.com/api/mcp → `forge_get_package` / `forge_install_plan`

## About this document

Generated by Forge (https://forgeregistry.com) — a compact rendering of the same record served, signed, at the JSON URL above. Trust and scan facts are the registry's own measurements; anything Forge did not measure is named as unmeasured rather than omitted.
