코딩 에이전트가 스크린샷, 녹화 영상, 로그와 같은 아티팩트를 호스팅하고, 이를 GitHub pull request에 관리형 댓글로 자동 첨부할 수 있게 합니다.
다른 이름 buildinternet/uploads, uploads, @buildinternet/uploads
- 스타
- 20
- Tools
- —
- 다운로드, 30일
- 4,521
- 최신 버전
- 0.63.1
- 마지막 커밋
- 2026년 11월 14일
- 라이선스
- Apache-2.0
uploads.sh MCP란?
uploads.sh은(는) MCP server입니다. 코딩 에이전트가 스크린샷, 녹화 영상, 로그와 같은 아티팩트를 호스팅하고, 이를 GitHub pull request에 관리형 댓글로 자동 첨부할 수 있게 합니다.
프로젝트 README에서 생성된 요약
uploads.sh MCP server 정보
코딩 에이전트는 uploads.sh를 통해 스크린샷, 화면 녹화, 테스트 보고서, 로그와 같은 시각적 및 데이터 아티팩트를 호스팅하고 관리할 수 있습니다. 이 서비스는 개발자가 브랜치 개발 중에 파일을 스테이징하고, 이를 GitHub pull request의 단일 관리형 댓글로 자동 통합할 수 있도록 지원합니다. 업로드된 모든 콘텐츠에 대해 안정적인 공개 URL을 제공하므로, 파일이 덮어쓰여질 때 임베드 기능이 유지되고 자동으로 업데이트됩니다.
사용자는 CLI를 사용하거나 AI 클라이언트를 hosted MCP server에 연결하여 서비스를 이용할 수 있습니다. 설정을 위해서는 인증을 위한 GitHub 계정이 필요하며, 무제한 호스팅을 위해 개인 Cloudflare R2 또는 S3 호환 스토리지 버킷을 연결하여 커스텀할 수 있습니다. 엄격한 시각적 검증이 필요한 팀의 경우, 지속적 통합(CI) 워크플로우 내에서 UI 변경 시 스크린샷을 요구하도록 구성하여 시각적 증거를 코드 병합을 위한 필수 상태 체크 항목으로 전환할 수 있습니다.
활용 사례
- 1pull request 문서화 자동화AI 에이전트가 개발 중에 스크린샷과 로그를 스테이징하면, pull request가 열리는 즉시 하나의 GitHub 댓글로 자동 통합됩니다.
- 2UI 변경 사항의 병렬 비교개발자는 특정 메타데이터를 사용하여 웹페이지의 변경 전후 상태를 pull request 내의 시각적 테이블로 구성할 수 있습니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
uploads.sh MCP 설치 방법
형식 확인: 2026년 11월 10일Claude Code에 uploads.sh MCP 설치
$ claude mcp add --env UPLOADS_TOKEN=<YOUR_UPLOADS_TOKEN> uploads -- npx -y @buildinternet/uploadsCursor에 uploads.sh MCP 설치
~/.cursor/mcp.json
{
"mcpServers": {
"uploads": {
"command": "npx",
"args": [
"-y",
"@buildinternet/uploads"
],
"env": {
"UPLOADS_TOKEN": "<YOUR_UPLOADS_TOKEN>"
}
}
}
}VS Code에 uploads.sh MCP 설치
.vscode/mcp.json
{
"servers": {
"uploads": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@buildinternet/uploads"
],
"env": {
"UPLOADS_TOKEN": "<YOUR_UPLOADS_TOKEN>"
}
}
}
}Claude Desktop에 uploads.sh MCP 설치
claude_desktop_config.json
{
"mcpServers": {
"uploads": {
"command": "npx",
"args": [
"-y",
"@buildinternet/uploads"
],
"env": {
"UPLOADS_TOKEN": "<YOUR_UPLOADS_TOKEN>"
}
}
}
}Codex에 uploads.sh MCP 설치
~/.codex/config.toml
[mcp_servers.uploads] command = "npx" args = ["-y", "@buildinternet/uploads"] [mcp_servers.uploads.env] UPLOADS_TOKEN = "<YOUR_UPLOADS_TOKEN>"
Gemini CLI에 uploads.sh MCP 설치
~/.gemini/settings.json
{
"mcpServers": {
"uploads": {
"command": "npx",
"args": [
"-y",
"@buildinternet/uploads"
],
"env": {
"UPLOADS_TOKEN": "<YOUR_UPLOADS_TOKEN>"
}
}
}
}구성
UPLOADS_TOKEN필수비밀Workspace bearer token (up_<workspace>_…). Mint with uploads login.
UPLOADS_API_URLAPI origin. Defaults to https://api.uploads.sh.
UPLOADS_WORKSPACEWorkspace name. Inferred from the token when omitted.
| 이름 | 설명 | 유형 |
|---|---|---|
| UPLOADS_TOKEN | Workspace bearer token (up_<workspace>_…). Mint with uploads login. | 필수비밀 |
| UPLOADS_API_URL | API origin. Defaults to https://api.uploads.sh. | |
| UPLOADS_WORKSPACE | Workspace name. Inferred from the token when omitted. |
자동 검사
2026년 11월 12일에 실행됨전체 보고서 →자동 검사를 통과했습니다. 이는 보안 감사가 아닙니다. 코드를 직접 읽고 서버에 필요한 최소한의 권한만 부여하십시오. 검사 방식
- 소스 저장소 연결 및 접근 가능통과
- 오픈 소스 라이선스 (OSI)통과
- 최근 1년 내 커밋 또는 릴리스통과
- 패키지 이름이 인기 패키지와 유사하지 않음통과
- 원격 엔드포인트가 HTTPS 사용통과
- 파괴적인 도구에 라벨 표시됨검사되지 않음
- 모델에 대한 숨겨진 지침 없음통과
- 패키지와 의존성에 심각한 보안 권고 없음통과
README
GitHub에서 보기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.
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:
npm install --global @buildinternet/uploads
uploads login
Upload a file and tag the page it shows:
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:
# Pair two states from the same page in the pull request comment.
uploads put ./before.png --meta path=/settings --state before
uploads 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:
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.
# Claude Code
claude mcp add --transport http uploads https://agents.uploads.sh/mcp
# Codex
codex mcp add uploads --url https://agents.uploads.sh/mcp
# OpenCode
opencode 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:
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
| Path | What |
|---|---|
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.json |
Agent-runtime wiring: the shared pre-PR screenshot hook and the Claude / Codex plugin manifests |
server.json |
MCP 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:
pnpm bootstrap # one-command setup: tooling, deps, env vars, local D1, default workspace
pnpm 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
uploads.sh MCP 질문
uploads.sh MCP를 Claude Code에 추가하려면 어떻게 하나요?
터미널에서 claude mcp add --env UPLOADS_TOKEN=<YOUR_UPLOADS_TOKEN> uploads -- npx -y @buildinternet/uploads를 실행합니다. 모든 프로젝트에서 사용할 수 있게 하려면 --scope user를 추가합니다.
uploads.sh MCP를 Cursor에 추가하려면 어떻게 하나요?
~/.cursor/mcp.json를 열고 mcpServers 아래에 서버를 추가합니다. 위 설치 섹션에 표시된 Cursor 구성을 사용합니다.
uploads.sh가 GitHub pull request에 어떻게 도움이 되나요?
브랜치에 파일을 스테이징하고, pull request가 생성되면 이를 하나의 관리형 댓글로 통합하여 각 리비전마다 자동으로 업데이트합니다.
자체 스토리지 제공업체를 사용할 수 있나요?
네, 무제한 스토리지를 위해 Cloudflare R2 또는 S3 호환 제공업체를 연결할 수 있습니다.
AI 에이전트를 이 서비스에 어떻게 연결하나요?
문서에 제공된 hosted MCP server URL을 사용하여 Claude Code 또는 Codex와 같은 에이전트를 연결할 수 있습니다.