Veilfile について
Veilfile は AI エージェント向けに、非公開で有効期限付きのファイル保管を提供します。API または MCP からアップロードして期限付きリンクを取得でき、CI やクラウドセッションの成果物を共有する開発者向けです。アップロード内容のシークレットらしいパターンも検査します。
主な機能
- 01一時ファイルのアップロードと保管
- 02期限付きアクセスリンクの発行
- 03シークレットらしい内容の検査
- 04成果物の一覧表示と取り消し
- 05API、MCP、CLI での利用
活用シーン
- 01CI のスクリーンショットをレビュー用に共有
- 02ログ一式や HAR ファイルの受け渡し
- 03エージェント成果物の一時リンク作成
MCP 対応
ホスト型 MCP サーバーは HTTP JSON-RPC を使い、成果物のアップロード、アップロード URL の作成、一覧表示、取り消しのツールを提供します。`vlf_` キーまたは OAuth トークンで認証します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://veilfile.com/mcp/claude mcp add --transport http veilfile-veilfile https://veilfile.com/mcp/{"mcpServers":{"veilfile-veilfile":{"type":"http","url":"https://veilfile.com/mcp/"}}}Cursor で開く{"servers":{"veilfile-veilfile":{"type":"http","url":"https://veilfile.com/mcp/"}}}VS Code で開く{"mcpServers":{"veilfile-veilfile":{"type":"http","url":"https://veilfile.com/mcp/"}}}{"mcpServers":{"veilfile-veilfile":{"serverUrl":"https://veilfile.com/mcp/"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://veilfile.com/mcp/認証が必要ツール
詳細
Veilfile — AI エージェント向けのプライベートで一時的なアーティファクトホスティング
CI やクラウドセッションでコーディングエージェントが、レビュー用のスクリーンショット、ログバンドル、
または HAR ファイルを生成した場合、それを置くためのプライベートな URL が必要です。公開
リポジトリではなく、Veilfile が正式な保存先です。API キー(または MCP)でアップロードすると、
推測不能で有効期限付きの URL が返されます。アップロードはシークレットのパターンをスキャンして
フラグを付けます(呼び出し側が on_secret=reject を渡した場合にのみブロックされます。ファイルの内容が
ログに記録されることはありません)。
- API:
POST /api/v1/artifacts(マルチパート、Authorization: Bearer vlf_…)→{id, url, expires_at, size_bytes, secret_flags[]}。GET /a/<token>でファイルを配信します(256 ビットのトークン自体が認証情報です)。一覧表示(JSON 配列のみ)および 取り消し用エンドポイントも含まれます。 - MCP:
POST /mcpにホストされているサーバー(HTTP 上の JSON-RPC。ツールはupload_artifact、create_upload_url、list_artifacts、revoke_artifact)で、vlf_キーまたは OAuth トークンで認証します。 - CLI: PyPI(
cli/)および npm(npm/)のveilfile:login(デバイスフロー)、logout、status、push、pull。 - ダッシュボード:
/app/のサインイン済みページ。サイトの他の部分と同じシェル上にある Django ビューです。概要(利用状況とプラン上限)、ファイル(シークレット検出のメモ +取り消し)、キー(新しいキーは一度だけ表示)、接続済みアプリ、請求(プランの 切り替えと Stripe 請求ポータル)を提供します。 - ランディングページ:
/(公開)。エージェント向けドキュメント:/llms.txt、docs/API.md、/docs/。 - このリポジトリで作業するエージェント: AGENTS.md をお読みください。
製品仕様については SPEC.md を参照してください。
プラン
| プラン | 価格 | 月あたりのアップロード数 | 最大 TTL | ストレージ | API キー |
|---|---|---|---|---|---|
| Free | $0 | 100 | 7 日 | 1 GB | 1 |
| Team | $4/mo | 2,000 | 90 日 | 25 GB | 5 |
| Scale | $12/mo | 10,000 | 365 日 | 100 GB | 無制限 |
信頼できる唯一の情報源は backend/drop_core/plans.py です(Stripe の価格は
Stripe と STRIPE_PRICE_* 変数にあります)。backend/drop_core/tests_fix_docs.py
は、ドキュメントまたはテンプレートに異なる価格や上限が記載されていると失敗します。
クイックスタート(ローカル開発)
# Backend
python3 -m venv venv && ./venv/bin/pip install -r backend/requirements.txt
export DJANGO_DEBUG=True DJANGO_SECRET_KEY=dev-only-key
./venv/bin/python backend/manage.py migrate
./venv/bin/python backend/manage.py createsuperuser # dashboard login
./venv/bin/python backend/manage.py runserver # :8000
http://localhost:8000/accounts/signup/ で登録(またはログイン)し、/app/ を開いて
API キーを作成してから、次を実行します。
curl -H "Authorization: Bearer vlf_..." \
-F "[email protected]" \
http://localhost:8000/api/v1/artifacts/
環境変数
このリポジトリにシークレットはコミットされていません。以下の名前をローカルの
.env(Git の追跡対象外)またはホストの環境設定にコピーしてください。本番環境では請求が有効です
(sk_live_...、本番の価格 ID、Stripe Managed Payments)。Stripe のサンドボックス/テストキーは、ローカルまたはステージング環境でのみ使用してください。
| 変数 | 必須 | デフォルト | 備考 |
|---|---|---|---|
DJANGO_SECRET_KEY | prod | — | DJANGO_DEBUG が false の場合に必須です |
DJANGO_DEBUG | いいえ | False | ローカル開発およびテストでは True に設定します |
DJANGO_ALLOWED_HOSTS | prod | — | カンマ区切りです。例:veilfile.com |
DJANGO_CSRF_TRUSTED_ORIGINS | いいえ | DJANGO_ALLOWED_HOSTS から導出 | オリジンをカンマ区切りで指定します |
DATABASE_URL | prod | sqlite(開発時のみ) | Postgres の URL です。DJANGO_ALLOW_SQLITE=True を指定しない限り、本番環境ではこの設定がない場合、または sqlite:// URL の場合、起動を拒否します。ユーザー名、パスワード、データベース名はパーセントデコードされ、?sslmode=... はドライバーに渡されます |
DJANGO_ALLOW_SQLITE | いいえ | — | True にすると、本番モードで意図的に SQLite を使用して実行できます(ローカルの docker run、イメージのビルド) |
DJANGO_CONN_MAX_AGE | いいえ | 60 | DB 接続を維持する期間(秒) |
DROP_BASE_URL | prod | http://localhost:8000 | 公開 URL です。アーティファクトのリンクはこの URL を基に作成されます |
DROP_STORAGE | いいえ | local | local(開発)または s3(本番) |
DROP_LOCAL_DIR | いいえ | backend/media/artifacts | ローカルストレージのルート |
AWS_S3_ENDPOINT_URL | prod(s3) | — | R2 エンドポイント。例:https://<acct>.r2.cloudflarestorage.com |
AWS_S3_BUCKET | prod(s3) | — | R2 バケット名 |
AWS_ACCESS_KEY_ID | prod(s3) | — | R2 API トークン(アクセスキー) |
AWS_SECRET_ACCESS_KEY | prod(s3) | — | R2 API トークン(シークレット) |
STRIPE_SECRET_KEY | 課金 | — | 本番環境ではライブ用シークレットキー(sk_live_…) |
STRIPE_WEBHOOK_SECRET | 課金 | — | シークレットキーと同じ Stripe アカウントおよびモードの署名シークレット(whsec_…) |
STRIPE_PRICE_TEAM | 課金 | — | 月額 4 ドルの Team プラン(税額込み)の価格 ID |
STRIPE_PRICE_SCALE | 課金 | — | 月額 12 ドルの Scale プラン(税額込み)の価格 ID |
EMAIL_BACKEND | prod | console | django.core.mail.backends.smtp.EmailBackend を設定します。SMTP がない場合、新規ユーザーはメールアドレスの確認、キーの発行、CLI ログインの承認を行えません(veilfile.W001) |
EMAIL_HOST、EMAIL_PORT、EMAIL_USE_TLS、EMAIL_HOST_USER、EMAIL_HOST_PASSWORD | prod | — | SMTP 設定です(稼働中のサービスでは Gmail SMTP を使用しています) |
DEFAULT_FROM_EMAIL | prod | — | 差出人アドレス。例:[email protected] |
EMAIL_TIMEOUT | いいえ | 10 | SMTP タイムアウト(秒) |
VEILFILE_SAFETY_MODE | いいえ | off | off、log、または enforce を指定します。アップロードを SHA-256 ブロックリストでスクリーニングします。未設定の場合は veilfile.W002 として報告されます |
VEILFILE_CLIENT_IP_HEADER | いいえ | CF-Connecting-IP | 訪問者の IP を含むヘッダーです。Cloudflare によって設定(および上書き)されます。有効な IP が含まれ、リクエストが Cloudflare エッジアドレスから来た場合にレート制限で使用されます。それ以外の場合は、以下の X-Forwarded-For のホップ処理が適用されます。空にすると無効になります |
VEILFILE_TRUSTED_PROXY_HOPS | いいえ | 2 | アプリの前段にある、信頼する公開プロキシのホップ数です。レート制限に使用するクライアント IP は、末尾のプライベートネットワークのホップをスキップした後、最後のホップが Cloudflare エッジアドレスである場合に、右端からこの数だけ位置する X-Forwarded-For のエントリーです。該当するエントリーがないリクエストは Cloudflare を経由しておらず、最後のエントリー(プラットフォームのプロキシが追加したもの)が使用されます。変更する前に、実際のトラフィックに照らして確認してください |
DJANGO_SECURE_HSTS_SECONDS | いいえ | 31536000 | HTTPS レスポンスの HSTS max-age |
DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS、DJANGO_SECURE_HSTS_PRELOAD | いいえ | False | すべてのサブドメインで HTTPS が提供されるようになってから有効にしてください |
PORT | いいえ | 8000 | ホスト(Render)によって設定されます。エントリーポイントは、設定がない場合に 8000 を使用します |
WEB_CONCURRENCY | いいえ | 1 | gunicorn ワーカー数(gthread) |
GUNICORN_THREADS | いいえ | 4 | ワーカーあたりのスレッド数です。処理中のアップロードはそれぞれメモリに保持されるため、小規模なインスタンスではこの値を下げてください |
GUNICORN_TIMEOUT、GUNICORN_GRACEFUL_TIMEOUT | いいえ | 120、30 | gunicorn のタイムアウト(秒) |
SKIP_MIGRATE | いいえ | 未設定 | 1 にすると、起動時の migrate をスキップします(Render のデプロイ前コマンドと併用します) |
VEILFILE_FUNNEL_RETENTION_DAYS | いいえ | 365 | prune_funnel_events がファネルの行を保持する期間 |
VEILFILE_ALERT_DIR | いいえ | 未設定 | CRITICAL の安全性アラートを外部アラートバス用のファイルとしても書き込むディレクトリです。アラートは常にログにも記録されます |
DJANGO_TEST_ALLOW_REMOTE_DB | いいえ | — | manage.py test がローカル以外のデータベースサーバーに対して実行されることを許可します(サービスコンテナーを使用する CI) |
Stripe の変数が設定されていない場合、checkout/switch/portal は 503 billing_not_configured を返し、ダッシュボードにはわかりやすい案内が表示されます。それ以外の機能はすべて動作します。 |
テスト
テストには DJANGO_DEBUG=True(テストランナーは False を拒否します)とローカルデータベースが必要です。また、ローカルストレージを強制し、STRIPE_*/AWS_* を削除します。
# Backend (the count changes; run it rather than trusting a number here)
cd backend && DJANGO_DEBUG=True DJANGO_SECRET_KEY=dev-only-key \
../venv/bin/python manage.py test
../venv/bin/python manage.py makemigrations --check --dry-run # must report no changes
# CLIs
cd npm && node --test
cd cli && ../venv/bin/python -m unittest discover -s tests -t .
CI(.github/workflows/ci.yml)は上記すべてに加え、manage.py check --deploy、本番設定での collectstatic、site-tests/ のブラウザーチェック(ジョブ site、site-cloth、site-ink、site-reading、site-phone、site-forms、site-catalog、site-dashboard。AGENTS.md の「Site checks」を参照)を、main へのすべてのプルリクエストで実行します(変更対象にページが含まれないプルリクエストでは、ブラウザーチェックはスキップされます)。また、バックエンドと CLI のチェックは、main へのすべてのプッシュで実行します。GitHub ホスト型ランナーで実行され、各ジョブには 1 台のマシンが割り当てられ、ジョブは並行して実行されます(AGENTS.md の「Where CI runs」を参照)。
運用
- デプロイ: Render の Docker ウェブサービス(veilfile.com を提供)を使用します。CI チェックの成功後、
mainへの各コミットで自動デプロイされ、有料の Postgres を使用します。render.yamlに同じ設定が記載されています。コンテナは非 root ユーザーとして実行されます。起動シーケンス(backend/entrypoint.sh):migrate --noinput(SKIP_MIGRATE=1の場合はスキップ)、createcachetable、バックグラウンドでの日次クリーンアップループ、その後 gunicorn を起動します。 - ヘルスチェック:
GET /healthzはSELECT 1の実行後に200 {"status":"ok"}を返し、失敗時には503を返します。これを Render の Health Check Path に設定してください。 - 日次クリーンアップ: エントリポイントのループは、1 日に 1 回
sweep_expired、clearsessions、cleartokens、prune_funnel_events、prune_email_ips(送信ログの IP を 90 日後に削除)、purge_expired_cacheを実行します。別途 cron ジョブを設定する必要はありません。アップロード時にも、小規模な遅延スイープが実行されます。 - TTL スイーパー:
python backend/manage.py sweep_expiredは期限切れのアーティファクト(ファイルと行)を削除します。冪等です。swept=N bytes=N failed=Nを出力し、ストレージの削除に失敗したものがある場合はゼロ以外の終了コードで終了します(次回の実行に備え、該当する行は保持されます)。--limit N/--time-budget SECONDSで実行の上限を設定できます。 - 孤立ファイル:
python backend/manage.py reconcile_storageは、対応するアーティファクト行がない保存済みオブジェクトを一覧表示します。--deleteを指定すると削除します。手動で実行し、まずはドライランを行ってください。データベースに問題があるように見える場合(アーティファクトテーブルが空、孤立ファイルが 20% 超、または PostgreSQL なしで R2 ストレージを使用)には、表示されたdb=/storage=を確認したうえで--forceを指定しない限り、--deleteは実行されません。 - 課金情報の再同期:
python backend/manage.py sync_stripe_billing(ドライラン。書き込みには--applyを指定)で、Stripe の情報をもとにワークスペースのプランを再構築します。Stripe の設定手順は非公開の運用リポジトリに記載されています。 - デプロイチェック:
manage.py check --deployはveilfile.W001~W006の設定ミスを報告します(各ワーカーの起動時にも ERROR としてログに記録されます)。 - ローカルコンテナ:
docker runにはDATABASE_URL=sqlite:////tmp/db.sqlite3とDJANGO_ALLOW_SQLITE=Trueの両方が必要です(本番モードでは、それ以外の場合 SQLite は拒否されます)。非 root ユーザーにとって/app/backendは読み取り専用です。 - ストレージ: Render のディスクは一時的なものです。本番環境では必ず
DROP_STORAGE=s3(Cloudflare R2)を使用してください。 - MCP レジストリ: 起動チェックリストは
docs/REGISTRIES.mdにあります。
プロジェクト構成
backend/
config/ Django settings/URLs (env-driven)
drop_core/ Workspace, APIKey (vlf_), Artifact, plans, storage,
secret scan, agent API, key mgmt, device login, OAuth
glue, sweeper
drop_billing/ Stripe checkout/switch/portal/status/webhook (live,
tax-inclusive, Managed Payments)
drop_mcp/ MCP server (POST /mcp)
blog/, docs/ Markdown-rendered Journal posts (and their feed) and Docs pages
legal/ Terms, privacy policy, abuse reporting (Markdown)
pages/ public-page registry, sitemap, component catalog, content checks
static/ the new shell's CSS, JS, fonts and images
dashboard/ the signed-in dashboard at /app/ (views, URLs, tests)
templates/ shell.html, layouts/, chapters/ and components/, the Journal, Docs and legal pages, the form pages (sign in, device, OAuth), the dashboard and the error pages
cli/, npm/ Python and Node `veilfile` command-line clients
plugin/ Claude Code plugin (share-artifact skill)
docs/ API.md, llms.txt (served at /llms.txt), REGISTRIES.md,
superpowers/ (design specs and build plans)
site-tests/ browser checks for the new shell (CI jobs `site`, `site-cloth`, `site-ink`, `site-reading`, `site-phone`, `site-forms`, `site-catalog`, `site-dashboard`)
tools/ one-off font and image generators, run by hand
Dockerfile one Python stage, WhiteNoise + gunicorn (the site has no build step)
render.yaml Render deploy blueprint (mirrors the live service)
AGENTS.md Rules and commands for agents working on this repo
ライセンスとコントリビューション
このコードは、誰でも読んで Veilfile の動作を確認できるように公開されています。
(LICENSE に記載のとおり)すべての権利は留保されています。ただし、cli/ と npm/ のコマンドラインクライアントは MIT ライセンスで提供されています。このリポジトリでは、外部コントリビューターからのプルリクエストを受け付けていません。Issue は歓迎します。セキュリティ上の問題は、リポジトリの Security タブにある「Report a vulnerability」から非公開で報告してください。
リリースチェックリスト
- Cloudflare R2 バケットと API トークン(S3 互換)を作成します。
- Stripe の商品と価格(Team $4、Scale $12、税額込み)を商品税コードとともに作成します。 価格 ID を控えておきます。
- Render にデプロイします(
render.yamlを参照)。環境変数(DROP_BASE_URL、DATABASE_URL、EMAIL_*の SMTP 設定など)を設定し、ヘルスチェックパスを/healthzに設定します。 - Stripe の Webhook の送信先を
https://<host>/api/v1/billing/webhookに設定し、STRIPE_WEBHOOK_SECRETを設定します。 VEILFILE_SAFETY_MODE(logまたはenforce)を決定します。docs/REGISTRIES.mdに従って MCP サーバーを掲載します。
期限切れのアーティファクトはエントリポイントのループによって毎日削除されるため、cron ジョブは不要です。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。