uploads.sh

sh.uploads由 uploads.sh 发布官方发布者v0.62.1更新于 Nov 5, 2026

Host files from coding agents; stage on a branch and attach to GitHub PRs.

已验证Streamable HTTP可网页运行效率与工作流文件与存储开发者工具

概览

AI 生成的概览

uploads.sh 把编码代理产出的文件托管为稳定的公开链接,在分支上暂存,并同步到一个受管理的 GitHub PR 或 issue 评论中。

可以做什么
  • 上传文件、截图和本地 HTML 抓取,返回公开链接和可直接用于 GitHub 的 markdown
  • 按分支暂存文件、查看或取消暂存,并附加到 PR 或 issue 的受管理评论
  • 创建、读取和关联公开画廊与按时间倒序的截图动态,可按仓库或单个 PR 限定范围
  • 列出、按元数据搜索和标记已上传文件,并查看工作区存储用量
  • 删除文件、审核放行被暂扣的上传、清理过期对象并重建用量账本
  • 查看身份与配置、检索产品文档、读取更新日志并发送诊断报告
适用场景
适合编码代理需要从终端发布截图、录屏、日志、报告或压缩包,并让它们出现在 PR 或 issue 评论中的场景;也适合无法执行命令、只能按字节或链接上传文件的代理。
运行要求
可使用 agents.uploads.sh 的远程端点(streamable HTTP),或本地 npm 包以 stdio 方式运行。必须认证:浏览器 OAuth,或通过 UPLOADS_TOKEN 或 Authorization 头提供工作区令牌。可选 UPLOADS_API_URL 与 UPLOADS_WORKSPACE。本地截图方式需要安装 Chrome。
安装前请注意
上传的文件对任何持有链接的人公开,私有仓库附件也只是使用难以猜测的链接。分类器会暂扣疑似凭据或个人数据的文件,但不应依赖它。工具可永久删除文件、清理过期对象,并发布或编辑 GitHub 评论。report 工具会把消息和可选日志发送给 uploads 团队,应仅在用户要求时使用且不要包含机密。

安装

在 SourceWeft 中

  1. 打开 控制台中的 uploads.sh,将其添加到工作区。
  2. 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
  3. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/sh.uploads%2Fmcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。

{
  "mcpServers": {
    "uploads-sh": {
      "type": "http",
      "url": "https://agents.uploads.sh/mcp"
    }
  }
}

README

[uploads.sh — the missing upload command for coding agents]

uploads

The missing upload command for coding agents.

Capture screenshots, recordings, and other artifacts as you work: test reports, logs, JSON, PDFs, zips. When the pull request opens, uploads.sh puts them in one tidy comment that updates automatically on each revision. Hosted uploads.sh is free to start. Connect your own bucket — Cloudflare R2 or any S3-compatible provider — so storage in that bucket is unmetered, or self-host the open-source service.

uploads.sh  ·  Docs  ·  npm →  ·  Quick start  ·  What it looks like  ·  Screenshots in CI  ·  What's in this repo  ·  Develop

[skills.sh] [CI] [npm (CLI)] [MCP server] [GitHub App: uploads-sh] [Ask DeepWiki] [License: Apache 2.0]

Under active development. uploads.sh is being built in the open, so APIs can still change. Feedback is welcome — open an issue.


Artifacts ready when the pull request opens

uploads hosts the artifacts coding agents produce at stable public URLs they can use in pull requests and issues: screenshots and screen recordings, but also test reports, logs, JSON, CSV, Markdown, PDFs, and zip archives (the full list is under Plans & limits). On a branch, uploads put stages each file as soon as it is ready. When the pull request opens, uploads.sh promotes the staged files into one managed comment.

GitHub's own attachments work from a browser and, since GitHub CLI 2.99 (September 2026), from gh … --attach, but only once a pull request or issue exists, and the files stay behind GitHub's own hosting, where they cannot be embedded or fetched anywhere else. uploads.sh gives agents a stable public URL from the same terminal where they build and test the change, while the branch is still in progress; GitHub has no public API (yet) for that. The hosted MCP server does the same for agents that cannot run a command at all, taking files as bytes or a URL.

Keys are hash-free, so re-uploading the same filename overwrites in place and the URL never changes — every embed of it updates at once. Workspaces keep tenants (and their budgets and key policies) apart.

This repo is the source of the canonical deployment at uploads.sh: the API worker, auth worker, MCP server, the hosted read-gate Worker, the Astro web app, and the @buildinternet/uploads CLI (published to npm from packages/uploads).

What it looks like

One comment per PR, rewritten in place on every sync. Files tagged --state before and --state after pair into a side-by-side table; other images and video land below it, and non-media files (reports, logs, archives) list in a file table with their type and size.

The real comment on #436.

Pairing is by --meta path=… when several pairs share a comment (one before and one after per path), and falls back to filenames that differ only by a before/after token — hero-before.webp with hero-after.webp.

Everything you attach also lands in your workspace, grouped by where it came from — pages by path, projects by repo or app — and browsable from one place.

The screenshots view groups uploads by project and path.

Open any file for a share page: copy-ready embeds (Markdown, HTML, and more), the raw URL, and a delete button.

Each file's share page — copy-ready embeds, details, and delete.

Quick start

Install the CLI and sign in once:

bash
npm install --global @buildinternet/uploadsuploads login

Upload a file and tag the page it shows:

bash
uploads put ./settings.png --meta path=/settings

On a branch, put stages the file automatically. Open the pull request however you normally would. The GitHub App promotes the staged files into one managed attachments comment.

More ways to upload

Use the same commands for before-and-after evidence, an open pull request, a browser capture, or an annotated image:

bash
# Pair two states from the same page in the pull request comment.uploads put ./before.png --meta path=/settings --state beforeuploads put ./after.png --meta path=/settings --state after
# See what this branch will attach when the pull request opens.uploads staged
# Attach files directly when a pull request or issue is already open.uploads attach ./before.png ./after.png
# Capture, annotate, and upload a page in one command.uploads screenshot http://localhost:4321/settings --via local --annotate ./callouts.json

attach detects the repository and current PR through gh, uploads all files, and creates or updates that same one comment. On an issue it also keeps a Markdown issue artifact (and a gallery link, when there is one) unless the workspace or the repo turns that off. Without the GitHub App, run uploads attach --promote after opening the pull request to promote files that you staged earlier. All commands run under npx @buildinternet/uploads … without a global install.

Sign in with GitHub or a magic link, then create your own workspace or accept an invite into one — see enrollment. Hosted files are public URLs — private-repo attachments get non-guessable links (how that works), but anyone holding a URL can view the file. A file that looks like it shows a credential, ID, or card number is held for your review before it goes public, but don't rely on that: do not upload secrets or sensitive UI.

Require screenshots in CI

The GitHub App adds an uploads.sh check to pull requests that change UI files, next to your tests and builds. No workflow or Actions step is needed. Out of the box it only reports, so nobody is blocked. Turn on Require screenshots on UI changes in the workspace's Settings → GitHub, or set it for one repo in .uploads.yml, and the check fails until screenshots arrive:

yaml
comment:  check:    require: [before-after, desktop, mobile] # or just [uploads]

The PR comment shows a checklist that ticks itself as files arrive. Images dragged into the PR on GitHub count too, so contributors without uploads.sh are never stuck, and a skip-uploads label skips a PR that needs no screenshots. Add uploads.sh as a required status check in branch protection to make it block merges. Setup, which files count as UI, and skip labels are in Require screenshots on pull requests.

Connect your agent

The hosted MCP server runs at https://agents.uploads.sh/mcp and is listed in the MCP Registry as sh.uploads/mcp. Local stdio is uploads mcp on the same npm package.

bash
# Claude Codeclaude mcp add --transport http uploads https://agents.uploads.sh/mcp
# Codexcodex mcp add uploads --url https://agents.uploads.sh/mcp
# OpenCodeopencode mcp add uploads --url https://agents.uploads.sh/mcp

uploads install adds the agent skills and the MCP server, so future sessions can capture each visual milestone without being asked. The skills also install standalone into any agent runtime:

bash
npx skills add buildinternet/uploads

That installs three skills: github-screenshots (visuals → PRs/issues), uploads-cli (full CLI reference), and annotate-screenshots (callouts and redaction on a capture).

On Claude Code or Codex, the plugin bundles the skills, the MCP server, and a pre-PR screenshot reminder. In Claude Code it also shows staged screenshots above the prompt and attaches them when the PR opens. On claude.ai and in Cowork, add uploads from the Claude directory. The same folder (plugins/claude/uploads) is the common agent-plugin layout, and it is submitted to the xAI plugin marketplace as uploads.

Full CLI usage, including annotations, managed comments, public galleries, and change feeds (repo-wide or one pull request), lives in docs/cli.md.

uploads feed create prints a live page of the screenshots on a repo:

uploads feed create --repo buildinternet/uploads.

REST routes are in docs/api.md.

What's in this repo

PathWhat
apps/The deployables: the REST API worker (api.uploads.sh), the optional public viewer, the auth worker, the remote MCP server, the Slack app (link previews and held-upload messages), the hosted read-gate Worker, and the Astro site at uploads.sh
packages/Shared code — most notably @buildinternet/uploads (the CLI, published to npm), @uploads/storage (the files-sdk adapter factory all storage goes through), and @uploads/plugin (Claude/Codex plugin version, not published)
skills/The three agent skills that ship to users
hooks/, plugins/, .mcp.jsonAgent-runtime wiring: the shared pre-PR screenshot hook and the Claude / Codex plugin manifests
server.jsonMCP Registry listing (sh.uploads/mcp): stdio uploads mcp plus the hosted remote

Each worker and the web app deploy separately. All storage access goes through createStorage() in packages/storage — adding a provider is one new case plus peer deps, no API changes.

Hosted file bytes stay on the shared uploads-default bucket. store.uploads.sh, storage.uploads.sh, and embed.uploads.sh are served through uploads-read-gate (apps/read-gate). A held image gets a "Held for review" card. Any other safety hold is a 404. Every other request passes through to R2. It does not gate private files, and it does not run for a bring-your-own bucket. Operator notes are in docs/ops.md.

Docs

Product docs — install, the staged loop, the GitHub App, limits — live at https://uploads.sh/docs. The docs in this repo are the companion: CLI and API reference, contributor setup, and operator material, all mapped from docs/README.md.

How to set up, test, and open a pull request: CONTRIBUTING.md. Where the project is headed: VISION.md. Agent working conventions live in AGENTS.md, and agents that land on this repo should start at llms.txt. The product site serves https://uploads.sh/llms.txt and https://uploads.sh/llms-full.txt.

Local development

Prerequisites: Node ≥24 and pnpm ≥11 (corepack enable). No Cloudflare account needed for the core local loop — wrangler dev simulates R2, KV, and D1 on disk:

bash
pnpm bootstrap        # one-command setup: tooling, deps, env vars, local D1, default workspacepnpm dev              # API on :8787 (local R2 + KV + D1)

bootstrap is idempotent, and pnpm doctor diagnoses a setup without changing it. The rest of the loop — the authenticated dev stack, the check and test gates, and how to open a pull request — is in CONTRIBUTING.md.

License

Apache 2.0.

来源:README.md,提交 4663b60

工具

29

feed_create

Create change feed

Create a public newest-first screenshot feed (same product as CLI `uploads feed create`). Pass `repo` alone for the whole GitHub repo. Pass `pr` plus `repo` — or `github` as owner/repo#123 / a GitHub PR URL — to scope that same feed to one pull request. `issue` does the same for an issue. Optional `path` filters by page-path metadata. Creating the same scope again returns the existing URL. This is a live query, not a curated gallery. Anyone who knows the URL can view it. See https://uploads.sh/docs/feeds.

输入参数prpathrepoissuegithubworkspace

feed_get

Get change feed

Get a workspace-owned change feed by ID, including its current newest-first screenshots and the canonical public /c/<id> URL. Each item includes pageUrl (`/c/<id>/<item>`) for the pager. The feed may be repo-wide or scoped to one pull request / issue (see `number` and `kind` on the result). Anyone with the URL can view the media.

输入参数feedId必填workspace

put

Upload file

Upload one or more files and get a public URL plus GitHub-ready markdown. Prefer `embedUrl` in GitHub markdown. Pass `contentUrl` for a public HTTPS file, or http://localhost on this machine, instead of a local path. With `pr`/`issue`, keys are stable and the managed comment is synced. `holdCheck: pending` means the classifier may still hold the file for review (it decides after the upload); `comment.held` counts files on the PR or issue held for review; see `list_held`. All uploads are public. Accepts images (PNG, JPEG, GIF, WebP, AVIF), video (MP4, WebM, MOV), PDF, zip, gzip, and text (plain, markdown, CSV, JSON). SVG and XML are accepted only on storage lanes verified to serve them sandboxed (see the workspace's storage settings); HTML is rejected.

输入参数praltappkeyreffilenoPrrepofilesframeissuenoGit另有 21 个

screenshot

Capture 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. localhost URLs are local-only.

输入参数praltappcdpkeyrefviahidenoPrrepowaitframe另有 29 个

attach

Attach to GitHub

Upload one or more files as stable PR/issue attachments (in parallel) and maintain a managed GitHub comment. Returns `uploads` and `failures` (one bad file does not abort the batch). Each success has `url`, `embedUrl`, and `markdown` (prefer embedUrl for GitHub). With no pr/issue, targets the current branch PR, and files already staged for that branch are promoted into it (`promotion`/`promoteError`; renamed branches are followed automatically, or name the old branch with fromBranch). Attachments are public and keys are predictable; upload only non-sensitive media. On an issue, a Markdown artifact (and a gallery link, when there is a gallery) stays in sync with the comment unless `issueArtifacts` is false, the repo sets `comment.issueArtifacts: false`, or the workspace turns it off. Images stay on uploads.sh URLs. Pull requests are unchanged. An artifact failure is a warning and does not fail the attach.

输入参数prapprepofiles必填frameissuestatescreencaptionframeFitframeUrlkeepExif另有 10 个

list

List files

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.

输入参数prallrepoissuelimitcursorprefixworkspace

staged

List staged files

List files staged for a git branch and whether they will auto-attach when a PR opens. Returns `{ repo, branch, files, binding }`.

输入参数repobranchworkspace

unstage

Unstage files

Clear staged files for a branch, or specific keys, without deleting them. Sets gh.status=unstaged so they drop out of uploads staged and auto-promotion. Pass branch (repo inferred) or keys, not both. Needs files:write.

输入参数keysrepobranchdryRunworkspace

delete

Delete file

Permanently delete one uploaded file by key, along with its metadata. Set dryRun to preview without deleting.

输入参数key必填dryRunworkspace

get_metadata

Get metadata

Read the queryable tags on one file. Returns `{ metadata }` (empty when none). Same as `uploads meta get`.

输入参数key必填workspace

list_held

List held files

List uploads held for review. The classifier holds a file it thinks shows a secret (an API key, a password, a token) or sensitive personal data (an ID, a card number). A held file stays out of the managed PR comment, feeds, and galleries until a workspace member approves it with `approve`. A signed-in member sees the real file on its /f/ page. On hosted storage an image URL returns a Held for review card, and any other raw URL returns 404. Pass `pr`/`issue` for one PR or issue, or `prefix`. Each item has a `reason` such as `secret: api_key`, and `sha`, the content hash of those bytes. `approve` sends that hash. Same as `uploads approve --pr <n>`.

输入参数prrepoissueprefixworkspace

approve

Approve held files

Release uploads held for review (see `list_held`): pass `keys`, or `pr`/`issue` to approve every held file there. The file returns at the same URL and the managed PR comment re-syncs. Check the file first: if it shows a real credential, rotate it and delete the file instead of approving. Same as `uploads approve`.

输入参数prkeysrepoissueworkspace

set_metadata

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`.

输入参数key必填setdeleteworkspace

find_files

Find files

Search files by metadata (`filters`) and/or filename substring (`name`). At least one is required. Same as `uploads find`.

输入参数allnamelimitcursorprefixfiltersworkspace

list_metadata_keys

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`.

输入参数keyworkspace

usage

Show usage

Workspace storage and monthly upload counters (and remaining headroom when budgets are configured). Same as `uploads usage`.

输入参数workspace

reconcile

Reconcile usage

Rebuild usage ledger bytes/objects from storage (source of truth). Preserves the monthly upload counter. Requires files:write. Same as `uploads reconcile`.

输入参数workspace

purge_expired

Purge expired files

Delete objects older than the workspace retentionDays setting, then reconcile. Skips if retention is unset. Requires files:delete. Same as `uploads purge-expired`.

输入参数workspace

comment

Sync attachments 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 installed on the repo; otherwise via local gh auth. Edits its own prior comment in place and never touches other comments. `held` counts files there held for review; see `list_held`.

输入参数prrepoissueworkspace

search_docs

Search uploads.sh docs

Search the public uploads.sh documentation. Use this to answer questions about uploads.sh product workflows, including: attaching screenshots and video to GitHub PRs and issues; staging files before a PR exists; galleries; the GitHub App; comment config (.uploads.yml); hosted MCP and agent setup; screenshot capture and annotate; plans and limits; bring-your-own bucket. Same as `uploads docs`. Returns titles, URLs, and snippets. Pass `page` to fetch the full markdown of one page (slug, path, or URL). Omit `query` to list the catalog.

输入参数pagelimitquery

changelog

Product changelog

Read recent uploads.sh product updates (platform and CLI). Returns the latest entries with titles, dates, summaries, and a link to the full changelog at https://uploads.sh/changelog. Same as `uploads changelog`.

输入参数limit

whoami

Who am I

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 the API is up. For a full setup diagnosis, use `doctor`.

无需输入参数。

doctor

Diagnose setup

Diagnose the configuration: API health, token auth, and workspace/token alignment. Returns the same report as `uploads doctor --json`, including hints.

输入参数workspace

report

Send diagnostic report

Send an explicit diagnostic report to the uploads team (message + optional text log). Only call this when the user asked to submit feedback, a bug report, or error logs — never automatically. Do not include tokens, secrets, or private file contents. Same as `uploads report`.

输入参数typecommandcontactmessage必填errorCodeattachmentTextattachmentFilename

版本历史

19
  1. v0.62.1最新Nov 4, 2026
  2. v0.62.0Nov 3, 2026
  3. v0.61.2Nov 1, 2026
  4. v0.61.1Oct 30, 2026
  5. v0.60.1Oct 25, 2026
  6. v0.60.0Oct 22, 2026
  7. v0.59.6Oct 21, 2026
  8. v0.59.3Oct 20, 2026
  9. v0.59.2Oct 19, 2026
  10. v0.59.1Oct 18, 2026
  11. v0.59.0Oct 18, 2026
  12. v0.58.0Oct 17, 2026
  13. v0.57.1Oct 10, 2026
  14. v0.57.0Oct 7, 2026
  15. v0.56.7Oct 4, 2026
  16. v0.56.6Oct 2, 2026
  17. v0.56.5Sep 27, 2026
  18. v0.56.4Sep 26, 2026
  19. v0.54.0Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分