오프라인 또는 에어갭 환경의 저장소 간에 휴대 가능한 Git 변경 사항 번들을 패키징, 검사 및 적용합니다.
다른 이름 mayank1307/gitferry
- 스타
- 0
- Tools
- —
- 다운로드, 30일
- —
- 최신 버전
- 0.4.2
- 마지막 커밋
- 2026년 11월 4일
- 라이선스
- MIT
GitFerry MCP란?
GitFerry은(는) MCP server입니다. 오프라인 또는 에어갭 환경의 저장소 간에 휴대 가능한 Git 변경 사항 번들을 패키징, 검사 및 적용합니다.
프로젝트 README에서 생성된 요약
GitFerry MCP server 정보
GitFerry는 공유 원격 저장소나 네트워크에 연결할 수 없는 기기 간에 Git 변경 사항을 이동하는 방법을 제공합니다. 이 도구는 USB, 이메일 또는 QR 코드를 통해 데이터를 전송해야 하는 에어갭 환경, 고객사 현장 또는 오프라인 시나리오에서 작업하는 개발자를 위해 설계되었습니다. 푸시되지 않은 커밋, 스테이징 또는 스테이징되지 않은 편집 사항, 추적되지 않은 파일을 하나의 휴대 가능한 파일로 번들링하여 워크트리의 정확한 상태를 보존합니다.
이 MCP server는 stdio를 통해 로컬에서 실행되므로 클라이언트와 동일한 기기에 있는 저장소와 상호작용합니다. 설치 후에는 API key, 계정 또는 인터넷 접속이 전혀 필요하지 않습니다. 사용자는 Claude Code 또는 Codex와 같은 클라이언트에 통합하여 변경 사항 번들의 생성 및 적용을 자동화할 수 있습니다. 이 서버는 pack_changes, inspect_bundle, apply_bundle 기능을 제공하며, 파일이 수정되기 전에 모든 전송이 sha256 체크섬 및 저장소 핑거프린트 확인을 통해 검증되도록 보장합니다.
활용 사례
- 1에어갭 기기로 작업물 전송커밋되지 않은 모든 변경 사항과 추적되지 않은 파일을 포함하는 번들을 생성하여 USB를 통해 오프라인 저장소로 이동합니다.
- 2시각적 QR 코드를 통한 데이터 전송한 화면에 일련의 QR 코드를 표시하고 다른 기기의 웹캠으로 이를 읽음으로써 두 기기 간에 작은 패치를 전송합니다.
- 3저장소 스냅샷 전체 동기화모든 추적된 파일의 완전한 스냅샷을 캡처하여 기존 저장소 상태를 새 기기에 그대로 구축합니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
GitFerry MCP 설치 방법
형식 확인: 2026년 11월 10일Cursor에 추가Goose에 추가Claude Code에 GitFerry MCP 설치
$ claude mcp add gitferry -- npx -y gitferryCursor에 GitFerry MCP 설치
~/.cursor/mcp.json
{
"mcpServers": {
"gitferry": {
"command": "npx",
"args": [
"-y",
"gitferry"
]
}
}
}VS Code에 GitFerry MCP 설치
.vscode/mcp.json
{
"servers": {
"gitferry": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"gitferry"
]
}
}
}VS Code CLI에 GitFerry MCP 설치
$ code --add-mcp '{"name":"gitferry","type":"stdio","command":"npx","args":["-y","gitferry"]}'Claude Desktop에 GitFerry MCP 설치
claude_desktop_config.json
{
"mcpServers": {
"gitferry": {
"command": "npx",
"args": [
"-y",
"gitferry"
]
}
}
}Codex에 GitFerry MCP 설치
$ codex mcp add gitferry -- npx -y gitferryCodex config.toml에 GitFerry MCP 설치
~/.codex/config.toml
[mcp_servers.gitferry] command = "npx" args = ["-y", "gitferry"]
Gemini CLI에 GitFerry MCP 설치
$ gemini mcp add -s user gitferry npx -- -y gitferryGemini settings.json에 GitFerry MCP 설치
~/.gemini/settings.json
{
"mcpServers": {
"gitferry": {
"command": "npx",
"args": [
"-y",
"gitferry"
]
}
}
}자동 검사
2026년 11월 14일에 실행됨전체 보고서 →자동 검사를 통과했습니다. 이는 보안 감사가 아닙니다. 코드를 직접 읽고 서버에 필요한 최소한의 권한만 부여하십시오. 검사 방식
- 소스 저장소 연결 및 접근 가능mayank1307/gitferry is public and reachablegithub.com/mayank1307/gitferry ↗통과
- 패키지가 이 저장소를 소스로 명시gitferry names mayank1307/gitferry as sourcenpmjs.com/package/gitferry ↗통과
- 빌드 출처(Sigstore 증명)Sigstore attestation for gitferrynpmjs.com/package/gitferry/v/0.4.2#provenance ↗통과
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-11-04github.com/mayank1307/gitferry ↗통과
- OpenSSF Scorecard검사되지 않음
- 패키지 이름이 인기 패키지와 유사하지 않음No popular package one edit away from gitferry통과
- 패키지 및 해당 종속성에 중요한 보안 권고 없음131 resolved dependencies checked; no critical advisoryosv.dev ↗통과
- 모델에 대한 숨겨진 지침 없음0 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨검사되지 않음
- 원격 엔드포인트가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기gitferry
v0.4.2 is released. npm package · v0.4.2 release and downloads · MCP Registry
Portable git-change bundles for air-gapped repos. Pack your unpushed commits, staged/unstaged changes, and untracked files into a single shareable file on one machine — carry it across the air gap (USB, secure file transfer, email, or QR codes across a webcam) — validate and apply it to the same repo on another machine. No shared remote, no network, no sync required.
machine A (has your changes) machine B (same repo, no sync)
┌─────────────────────────┐ ┌─────────────────────────┐
│ $ gitferry pack │ ──────▶ │ $ gitferry apply │
│ → repo-main-a1b2c3d │ USB / │ ✓ checksums verified │
│ .gitferry │ scp / │ ✓ same repo confirmed │
│ │ email │ ✓ 2 commits replayed │
│ commits + worktree │ │ ✓ staged/unstaged │
│ + untracked, checksummed│ │ state restored │
└─────────────────────────┘ └─────────────────────────┘
See SCENARIOS.md for every situation this is built for — air-gapped environments, client-site work, WIP handoffs, offline review, and more. See INSTALL.md for offline installation on other devices.
Quick MCP install (Claude Code): claude mcp add --transport stdio gitferry -- npx --yes --package=gitferry@0.4.2 gitferry-mcp, then restart your client and confirm the pack_changes, inspect_bundle, and apply_bundle tools appear. Codex, VS Code, JSON config, and offline setup are in MCP server below.
Why not just git format-patch / git bundle?
You can — gitferry uses them under the hood. What raw git doesn't give you:
- Untracked files travel too (respecting
.gitignore) —git diffnever sees them - Staged vs unstaged state is preserved — your index looks the same on the other side
- Validation before anything touches the repo: sha256 checksums of every file, same-repository fingerprint check (root commits), base-commit check, clean-tree check
- One command each way instead of a multi-step
format-patch/diff/am/applychoreography - Binary-safe (
--binarypatches for tracked files, verbatim bytes for untracked) - Plain-git fallback: the bundle is a zip of standard git patches — pack with
--portableand a machine with only git + unzip applies it by hand (instructions are inside every bundle; the compact default needs node's one-liner to unwrap first)
Install
Requires Node.js 22 or newer and Git 2.32 or newer. Install the published CLI and MCP server from npm:
npm install -g gitferry@0.4.2
gitferry --version
For MCP-only use, skip the global install and use the pinned npx configuration in MCP server.
Installation and MCP registration are separate steps. Installing the npm package makes gitferry and gitferry-mcp available in your terminal. Registering the server tells Codex, Claude Code, or another MCP client how to launch it. With npx, the client downloads the pinned package on first launch, so a global install is optional. Reading this README or installing the package alone does not register the server.
Closed environments (no npm)
Download gitferry.cjs, gitferry-mcp.cjs, and SHA256SUMS from the public v0.4.2 release. These standalone files include their JavaScript dependencies; transfer them to the offline machine with Node and Git. See INSTALL.md for checksum verification and setup.
To build the same standalone executables from a source checkout:
npm run bundle # → dist/gitferry.cjs + dist/gitferry-mcp.cjs
node dist/gitferry.cjs pack # runs without any install or node_modules
Usage
On the machine with changes
gitferry pack # asks what should travel (Enter = uncommitted); base = merge-base with upstream
gitferry pack --only staged # skip the question: all | uncommitted | staged | unstaged | committed | repo
gitferry pack --only repo # whole-repo snapshot: every tracked file as-is — seed/sync another machine
gitferry pack --base origin/main # explicit base
gitferry pack -o changes.gitferry --no-untracked
The interactive picker only appears in a terminal; in scripts (no TTY) pack takes everything unless --only or --no-* flags say otherwise. Selections mean: all = commits + staged + unstaged + untracked · uncommitted = everything except commits · staged = index edits only · unstaged = worktree edits + untracked · committed = unpushed commits only · repo = a snapshot of every tracked file as it is on disk (no history) — apply seeds a bare directory or syncs an existing checkout, skipping identical files and touching drifted ones only with --force.
On the receiving machine
gitferry inspect changes.gitferry # verify + preview, touches nothing
gitferry apply changes.gitferry --dry-run
gitferry apply changes.gitferry
No transfer channel at all? Beam it over QR
When even USB is off the table, the screen itself is the channel: one machine plays the bundle as a looping sequence of QR codes, the other watches with any webcam.
# machine A (sender)
gitferry show changes.gitferry # QR loop right in the terminal
gitferry show changes.gitferry --browser # bigger + denser, in a local browser page
gitferry show changes.gitferry --color # experimental: 3x density, 3 chunks per image in R/G/B
# machine B (receiver) — point its webcam at A's screen
gitferry read # opens a local camera page, reassembles the bundle
gitferry apply changes.gitferry
Every QR frame carries its chunk number / total plus a transfer id, so the receiver knows exactly which pieces it still needs — it shows the missing numbers live and keeps collecting as the loop repeats (order doesn't matter; missed frames come around again). The file is only written once every numbered chunk arrived and the whole-file sha256 matches, so a completed read is proof nothing was skipped or corrupted. Both pages live on 127.0.0.1; no network between the machines is used or needed.
Point the sender's webcam back at the receiver and the loop gets smart. The read page displays a small progress QR of its own (tiny payload, high error correction, so it scans easily). If the show --browser machine also has a camera watching the receiver's screen, then after each loop the sender re-shows only the chunks that are still missing, dropping from the first-loop rate (default 4 fps) to a slower retry rate (default 1 fps, --retry-fps) so the stragglers are easy to catch — and stops automatically once the receiver's code says complete. No camera on the sender's side? Everything simply loops at full speed like before.
Throughput is roughly chunk × fps: defaults give ~0.3 KB/s in the terminal, ~0.6 KB/s in the browser, ~1.8 KB/s with --color — meant for patch-sized bundles, not megabyte piles (pack --no-untracked helps keep them small). The default is deliberately a coarse, easy-scan code (150 bytes ≈ QR version 8, 49×49 modules): webcams reading another screen fail on fine modules long before they fail on frame count. Raise --chunk (up to 2900) if your camera and screens are good.
Applying
Apply order: commits (git am -3, full author/date/message preserved) → staged patch (index + worktree) → unstaged patch (worktree only) → untracked files (never overwrites existing files unless --force).
On conflicts you get standard git conflict markers and clear instructions (git am --continue / --abort, .rej files as last resort) — application is not transactional, so review the error and recovery instructions before continuing.
Flags
| Flag | Command | Effect |
|---|---|---|
--base <ref> |
pack | commit the bundle applies onto |
--only <what> |
pack | all / uncommitted / staged / unstaged / committed / repo — non-interactive selection |
--no-commits / --no-worktree / --no-untracked |
pack | trim what's captured (combinable with --only) |
--portable |
pack | plain-zip bundle (~30% bigger) for targets with only git + unzip |
--dry-run |
apply | validate + show the plan, change nothing |
--force |
apply | override same-repo, clean-tree, and overwrite guards |
-C <dir> |
pack/apply | run against another directory |
--chunk <bytes> / --fps <n> |
show | QR payload size (default 150 ≈ version-8 code; raise for speed, lower for even easier scanning) and first-loop display speed |
--retry-fps <n> |
show | slower rate for re-loops of missing chunks once the receiver's progress QR is seen (default 1) |
--browser / --color |
show | browser-page display; experimental 3× density via R/G/B channels |
--no-open / --port <n> |
show/read | don't auto-open the local page / pin its port |
-o <file> / --force |
read | output path / overwrite an existing file |
MCP server
GitFerry runs locally over stdio. Your MCP client starts the process, and it works with repositories on that same machine. No GitFerry account, API key, hosted service, or source upload is required. URL-only MCP clients need a separate bridge and cannot connect directly to this local server.
Register with the CLI for your client (requires Codex CLI or Claude Code, respectively):
# Codex
codex mcp add gitferry -- npx --yes --package=gitferry@0.4.2 gitferry-mcp
codex mcp get gitferry
# Claude Code
claude mcp add --transport stdio gitferry -- npx --yes --package=gitferry@0.4.2 gitferry-mcp
claude mcp get gitferry
Choose your client's registration command, reconnect or start a new session, and verify that pack_changes, inspect_bundle, and apply_bundle are available. mcp get confirms the saved configuration; tool discovery in the connected client confirms the server is working. See Codex setup for the TOML alternative and agent-assisted installation to delegate setup.
Use this configuration for the published 0.4.2 package in clients that accept mcpServers JSON. The explicit executable matters because this package supplies both a CLI and an MCP server:
{
"mcpServers": {
"gitferry": {
"command": "npx",
"args": ["--yes", "--package=gitferry@0.4.2", "gitferry-mcp"]
}
}
}
For a source checkout, build with npm ci && npm run bundle and use:
{
"mcpServers": {
"gitferry": {
"command": "node",
"args": ["/absolute/path/to/gitferry/dist/gitferry-mcp.cjs"]
}
}
}
If you installed the package globally, the server command is gitferry-mcp. For a downloaded offline bundle, point node directly at /absolute/path/to/gitferry-mcp.cjs. See client setup for Codex, Claude Code, and VS Code examples and Windows launch instructions.
| Tool | Action | Key arguments |
|---|---|---|
pack_changes |
Writes a portable bundle from local changes | cwd, optional output, base, only, portable and include flags |
inspect_bundle |
Reads and validates a bundle without changing a repository | bundlePath |
apply_bundle |
Previews or applies a bundle to a local target | cwd, bundlePath, dryRun, force, includeUntracked |
Use absolute paths. Start with: “Pack the uncommitted changes in /absolute/path/to/repo into /absolute/path/to/transfer.gitferry.” On the receiving machine: “Inspect this bundle, then dry-run it against /absolute/path/to/repo and show the plan before applying.”
only accepts all, uncommitted, staged, unstaged, committed, or repo. Snapshot mode (repo) carries current tracked-file contents rather than history; it can seed an empty directory. The default without a selection includes all change categories, matching non-interactive CLI use. Tool annotations describe side effects to the client; they do not enforce approvals or restrict filesystem access.
See INSTALL.md for setup and offline transfer, DEMO.md for a two-repository walkthrough, and PUBLISHING.md for maintainer release steps. Published registry identity: io.github.mayank1307/gitferry.
Agent-assisted installation
Paste this into Codex or Claude Code with terminal and configuration access:
Set up GitFerry v0.4.2 as a local stdio MCP server in this client using https://github.com/mayank1307/gitferry/blob/main/INSTALL.md. Check Node.js 22+ and Git 2.32+. Check for an existing GitFerry registration, preserve other servers, and register the pinned npx command for this client. A global npm install is optional. Verify the saved configuration, then verify that pack_changes, inspect_bundle, and apply_bundle are available. If a restart or new session is needed, tell me what to do and verify tool discovery afterward.
The agent can perform setup when asked and given the required access. Package download happens automatically through npx after registration; client approvals and reconnection follow the client's normal behavior.
Bundle format
A .gitferry file is a zip with this layout — by default brotli-wrapped (GFBR magic + brotli stream of a stored zip, ~30% smaller than a deflate zip; pack --portable writes a plain zip instead, and inspect/apply auto-detect both):
manifest.json # versioned manifest: repo fingerprint, base/head shas,
# content listing, sha256 of every entry
commits/00NN-*.patch # git format-patch output (mbox — author, date, message)
worktree/staged.patch # git diff --binary --cached
worktree/unstaged.patch # git diff --binary
untracked/<paths> # verbatim file bytes
README.txt # human instructions for manual apply with plain git
Everything inside is standard-git-consumable by design; gitferry adds integrity checking and one-command UX, never a proprietary encoding. For a target with only git + unzip, pack with --portable; the compact default can still be unwrapped by any machine with node (the one-liner is in the bundle's own README.txt).
Notes & limitations
- Merge commits in the packed range are flattened by
format-patch— pack warns; prefer linear branches or pick a different--base - Replayed commits get new shas (same content/author, new committer) — normal for
git am - Change bundles require shared repository history (validated via root-commit fingerprint); snapshot bundles can also seed an empty directory.
- Requires git ≥ 2.32 on the applying machine
Safety and trust
Bundles contain source code, commit messages, and potentially untracked secrets. Review the selection and destination before sharing. .gitignore excludes ignored untracked files; it does not remove secrets already tracked in Git. Checksums detect corruption, not the identity or trustworthiness of the sender. Only apply bundles from sources you trust.
The server has the filesystem privileges of the process that starts it. Configure it only in trusted clients and run it as your normal user. force bypasses repository, dirty-tree, and overwrite guards. See SECURITY.md for enforced limits, symlink behavior, and concurrency boundaries.
Development
See repository architecture for the source layout and MCP deployment for local, npm, and Docker setup. Copyable client configurations live in examples/mcp.
npm ci
npm run build # tsc → dist/
npm test # vitest: round-trip e2e on real temp repos + guard tests
npm run bundle # fresh single-file CLI + MCP server
npm run release:check # versions, build, tests, and isolated package smoke test
GitFerry MCP 질문
GitFerry MCP를 Claude Code에 추가하려면 어떻게 하나요?
터미널에서 claude mcp add gitferry -- npx -y gitferry를 실행합니다. 모든 프로젝트에서 사용할 수 있게 하려면 --scope user를 추가합니다.
GitFerry MCP를 Cursor에 추가하려면 어떻게 하나요?
~/.cursor/mcp.json를 열고 mcpServers 아래에 서버를 추가합니다. 위 설치 섹션에 표시된 Cursor 구성을 사용합니다.
USB 드라이브나 네트워크 없이 변경 사항을 전송할 수 있나요?
네, 'show' 명령어를 사용하여 번들을 일련의 QR 코드 형태로 표시할 수 있으며, 다른 기기의 웹캠으로 이를 읽어 전송할 수 있습니다.
GitFerry를 사용하려면 인터넷 연결이나 계정이 필요한가요?
아니요, stdio를 통해 로컬에서 실행되므로 계정, API key 또는 호스팅 서비스가 필요하지 않습니다.