BriefGate について
BriefGateは、顧客からファイル、文章、認証情報、構造化データを集めるコーディングエージェント向けMCPサーバーです。受付ポータルを作成して自動で催促し、エージェントが利用できる型付きの結果を返します。
主な機能
- 01ファイル、文章、選択肢、認証情報の収集
- 02顧客向け受付ポータルの作成
- 03顧客へのメール送信と自動催促
- 04提出ファイルの検証
- 05型付き結果と署名付きファイルURLの返却
活用シーン
- 01顧客のブランド素材やサイト文章の収集
- 02プロジェクト用ホスティング認証情報の収集
- 03営業時間など構造化情報の依頼
MCP 対応
BriefGateは、依頼の定義や結果の取得など、情報収集ツールをMCPクライアントに提供します。ホスト型HTTPエンドポイントとローカルパッケージに対応しています。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://mcp.briefgate.dev/mcpclaude mcp add --transport http sekera-radim-briefgate https://mcp.briefgate.dev/mcp{"mcpServers":{"sekera-radim-briefgate":{"type":"http","url":"https://mcp.briefgate.dev/mcp"}}}Cursor で開く{"servers":{"sekera-radim-briefgate":{"type":"http","url":"https://mcp.briefgate.dev/mcp"}}}VS Code で開く{"mcpServers":{"sekera-radim-briefgate":{"type":"http","url":"https://mcp.briefgate.dev/mcp"}}}{"mcpServers":{"sekera-radim-briefgate":{"serverUrl":"https://mcp.briefgate.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
BriefGate
クライアントへのヒアリング — ブラウザーからでも、AI コーディングエージェントからでも。
エージェントがウェブサイトを構築できます。 BriefGate は、クライアントから必要な情報を集めます。
エージェントがなくても大丈夫です。 以下の作業はすべて、 app.briefgate.dev で手動で行えます。依頼を作成し、リンクを送信し、回答を確認して、結果を ZIP でダウンロードできます。コードも API キーも MCP クライアントも必要ありません。このパッケージは、エージェントに作業を任せる方法を利用する場合のものです。ダッシュボードのクイックスタートをご覧ください。
Claude Code / Cursor / Codex → BriefGate → Client portal
→ Files · copy · credentials · structured data → Agent continues building

MP4 で視聴(25 秒) · 全編 47 秒のウォークスルー
ウェブサイト · MCP リファレンス · llms.txt · ガイドとチェックリスト
課題
エージェントの作業は速いですが、プロジェクトの相手側にいる人がボトルネックになります。
構築の途中で、エージェントがクライアントしか持っていない情報を必要とすることがあります。ロゴ、ホームページのコピー、ブランドカラー、営業時間、ホスティングの認証情報、API キー、価格表のような構造化データなどです。こうした情報はチャットにはなく、推測することもできません。
通常は作業を中断し、開発者がメールでクライアントに問い合わせることになります。代わりに、エージェントが BriefGate のヒアリングを作成します。BriefGate がクライアントにメールを送り、回答を収集し、回答がない場合は自動で催促して、エージェントがそのまま使える型付きの結果を返します。その間も、エージェントは構築を続けられます。
クイックスタート
Claude Code — ホスト型、キーの管理は不要です:
claude mcp add --transport http briefgate https://mcp.briefgate.dev/mcp
次に、Claude Code で /mcp を実行し、briefgate を選択して、Authenticate を選びます。
Claude Code — ローカルパッケージ:
claude mcp add briefgate -- npx -y @briefgate/mcp
npx -y @briefgate/mcp login
サインインを完全に省略したい場合は、briefgate.dev でキーを取得し(無料枠あり、カード不要)、BRIEFGATE_API_KEY として渡します。
Cursor — .cursor/mcp.json に追加します:
{
"mcpServers": {
"briefgate": {
"command": "npx",
"args": ["-y", "@briefgate/mcp"]
}
}
}
次に、npx -y @briefgate/mcp login を実行するか、エージェントに login ツールを呼び出すよう依頼します。
Codex:
codex mcp add briefgate --env BRIEFGATE_API_KEY=bg_live_xxxxx -- npx -y @briefgate/mcp
Gemini CLI — このリポジトリの gemini-extension.json から拡張機能としてインストールし、ホスト型エンドポイントを指定します:
gemini extensions install https://github.com/sekera-radim/briefgate-mcp
他のホスト型クライアントと同じ方法で、初回使用時に OAuth 経由で認証します。この拡張機能には GEMINI.md も含まれており、BriefGate とは何か、いつ利用すべきかをモデルに伝えるコンテキストファイルです。
デフォルトでは、gemini extensions install は main ブランチではなく、リポジトリの最新の GitHub Release を取得します。そのリリースが現在の gemini-extension.json より古く、コマンドで設定ファイルが見つからないと表示される場合は、代わりに main から直接インストールしてください:gemini extensions install --ref main https://github.com/sekera-radim/briefgate-mcp。
Claude Desktop — デスクトップ拡張機能(.mcpb)としてワンクリックでインストールします。ホスト型エンドポイントではなく、ローカルの @briefgate/mcp パッケージを実行します。ビルドの詳細は、以下の MCPB バンドル を参照してください。
Cursor — このリポジトリの .cursor-plugin/plugin.json からプラグインとしてインストールします。以下の collect-from-client スキルと同じ MCP 設定がバンドルされています。
Agent Skills 対応のツール(OpenAI Codex、GitHub Copilot / VS Code、Cursor、Gemini CLI、およびこの標準に準拠するその他のクライアント)— skills CLI を使って collect-from-client スキルをインストールします:
npx skills add https://github.com/sekera-radim/briefgate-mcp/tree/main/skills/collect-from-client
CLI のドキュメントに記載されている owner/repo の省略形は、[email protected] の時点ではこの構成で機能しません。レジストリで 404 になるか、リポジトリの URL をそのまま渡すとリポジトリ全体をクローンしたうえで「No SKILL.md found」と表示されます。これは、当方のファイルがルートより一段深いディレクトリにあるためです。実際にインストールできるのは、上記の /tree/main/skills/<name> URL です。ドキュメントに記載する前に、空のテスト用ディレクトリで実行して確認しました。これにより SKILL.md がそのツールのローカルスキルディレクトリにコピーされます。このスキルは引き続き、briefgate MCP サーバー(上記のクライアントごとの手順を参照)が別途設定されていることを前提とします。
セットアップの詳細、手動設定、API キーの優先順位については、以下のリファレンスを参照してください。
プロジェクトの指示(AGENTS.md、Copilot、Cursor のルール)を読み取るエージェント向け
MCP ツールの説明や Agent Skills の代わりに、またはそれらに加えて、エージェントがプロジェクトの指示ファイルを読み取る場合は、このブロックを AGENTS.md、.github/copilot-instructions.md、または .cursor/rules に追加します:
## BriefGate
BriefGate (MCP server `briefgate`, or `npx @briefgate/mcp`) collects files,
text, choices, or credentials from a human who is not in this conversation
(a client, colleague, or customer) — it emails them a no-account portal link
and chases them automatically until everything is submitted.
Use it when a task is blocked on input only that outside person can supply,
especially if they may take days and need reminders. Do not use it when the
information is already available, or when the person who should answer is
the user you're talking to.
Flow: `define_intake` (with items) -> tell the user it was sent ->
`get_intake_status` later ("not ready" is normal, not an error) ->
`get_intake_results` once completed. `request_revision` for a bad item.
Secret items are revealed in plaintext exactly once.
例:クライアントのウェブサイトを構築する
エージェントがレストランのウェブサイトを構築しています。レイアウトと予約フローはできていますが、ロゴ、ヒーロー画像、営業時間、レストランの短い紹介文、ソーシャルメディアのリンク、およびクライアントの WordPress インストールへの管理者アクセスがまだ必要です。エージェントは define_intake を呼び出します:
{
"project_name": "Website for Trattoria Bella",
"client": { "email": "[email protected]", "name": "Marco", "language": "en" },
"items": [
{ "key": "logo", "type": "image", "label": "Restaurant logo",
"constraints": { "formats": ["svg", "png"], "min_width": 512 } },
{ "key": "hero_image", "type": "image", "label": "Hero photo for the homepage" },
{ "key": "opening_hours", "type": "structured", "label": "Opening hours",
"schema": { "type": "object", "properties": { "mon_fri": { "type": "string" }, "sat": { "type": "string" }, "sun": { "type": "string" } } } },
{ "key": "about_copy", "type": "longtext", "label": "Short description of the restaurant" },
{ "key": "social_links", "type": "structured", "label": "Social media links" },
{ "key": "wp_admin", "type": "secret", "label": "WordPress admin credentials" }
]
}
そこから BriefGate は、(1)ブランドに合わせたポータルを作成し、(2)クライアントにメールを送り、(3)届いた各アセットを検証し、(4)すべてが提出されるまでクライアントに自動で催促し、(5)完了時にエージェントへ通知します。
エージェントは、レイアウト、予約フロー、その他これらに依存しない作業を続けます。その後、get_intake_results(intake_id) を呼び出して、型付きデータとファイルの署名付き URL に加え、WordPress の認証情報を一度だけ表示して取得します。シークレットを保存し、作業を続けます。
フォームではだめなのでしょうか?
| 汎用フォーム | BriefGate |
|---|---|
| 人間がフォームを作成します | エージェントが必要な情報を宣言します |
| 人間が結果を読みます | エージェントが型付きの結果を利用します |
| 汎用的な回答 | 型付きの項目 |
| 手動でのフォローアップ | 自動での催促 |
| スプレッドシートの考え方 | API / MCP ワークフロー |
| 認証情報の扱いが面倒です | シークレット項目と制御された開示 |
| 人間のワークフロー | エージェントのワークフロー |
BriefGate は、あらゆるフォームビルダーに取って代わろうとしているわけではありません。AI エージェントが人間から情報を得る必要がある場面に向けて設計されています。
無料プランがあり、カードは不要です。BriefGate はホステッドサービスです。このリポジトリはオープンソースの MCP クライアントで、MIT ライセンスのもとで提供されています。briefgate.dev から登録してください。
リファレンス
以下はすべて変更されていない技術的な詳細です。手動セットアップ、環境変数、HTTP / OAuth モード、すべてのツールのリファレンス、Webhook、料金、法的情報が含まれます。
Claude Code:手動セットアップと API キー
API キーを貼り付けます(CI、スクリプト、またはキーを自分で管理したい場合)。briefgate.dev で取得できます(無料プランあり、カード不要)。
claude mcp add briefgate \
-e BRIEFGATE_API_KEY=bg_live_... \
-- npx -y @briefgate/mcp
または、~/.claude/settings.json に手動で追加します。
{
"mcpServers": {
"briefgate": {
"command": "npx",
"args": ["-y", "@briefgate/mcp"],
"env": {
"BRIEFGATE_API_KEY": "bg_live_..."
}
}
}
}
BRIEFGATE_API_KEY(またはコマンドラインの --api-key)が設定されている場合は、常にローカルに保存された login のキーより優先されます。キーが設定済みの状態で login を実行すると、何もせずにその旨を表示します。
読み込みを確認する — Claude Code で /mcp を実行し、15 個のツールを持つ briefgate が表示されていることを確認してください。
同じローカルパッケージと API キーのセットアップは、パッケージをローカルで実行するあらゆる MCP クライアント(Cursor、Codex など)で利用できます。キーを指定せずに登録して login を実行するか、同じ方法でそのクライアント独自の MCP 設定に BRIEFGATE_API_KEY を貼り付けてください。
API キーを使わずにサインインする
キーを貼り付けずにこのマシンにキーを設定する方法は 2 つあります。どちらも同じ認証情報ファイルを使って同じデバイス認証フロー(RFC 8628)を実行するため、パッケージの使い方に合う方法を選んでください。
ターミナルから — login / logout サブコマンド:
npx -y @briefgate/mcp login # prints a code + URL, waits for approval, saves the key
npx -y @briefgate/mcp logout # removes the local key, best-effort revokes it remotely
login は、承認されるか 10 分後にタイムアウトするまで処理を続け、その後 Signed in as <account_name> を表示して 0 で終了します。承認されなかった場合、期限切れ、エラーなど、失敗した理由を表示して 1 で終了します。logout は常にローカルのコピーを削除します。また、同じキーを使って DELETE /v1/keys/current を送信し、サーバー側でもキーを失効させます。この呼び出しに失敗した場合(ネットワークがない、API に到達できないなど)はその旨を表示し、キーがまだ有効かどうか分からなくならないよう、代わりに BriefGate ダッシュボードを案内します。
エージェントから — login / logout ツール(ツールを参照):
ターミナルでのクリック待ちをブロックできないクライアント向けの同じフローです。ツール呼び出しを数分間開いたままにできないため、login は2 段階になっています。
- 最初の呼び出しでフローが始まり、コードと URL がすぐに返されます。可能な場合はブラウザーが自動的に開きます。
- もう一度
loginを呼び出して、進行状況を確認します。いつでも、または承認後に呼び出せます。まだ承認待ちの場合はその旨が表示され、承認されると同じ呼び出しで成功が報告され、キーが保存されます。再起動は不要です。次のツール呼び出しからサインイン済みになります。
ツールとしての logout は、ベストエフォートでのリモート失効を含め、サブコマンドとまったく同じ動作をします。
どちらの方法でも、キーは ~/.briefgate/credentials.json に保存されます(ディレクトリモード 0700、ファイルモード 0600。BRIEFGATE_CREDENTIALS_FILE でパスを上書きできます)。どの BriefGate サーバー向けかを基準に保存されるため、ステージング環境の BRIEFGATE_BASE_URL と本番環境の設定が衝突することはありません。明示的に指定したキーは常に保存済みのキーより優先されます。優先順位は --api-key、BRIEFGATE_API_KEY、最後に login が保存したキーの順です。いずれかがすでに設定されている場合、login はフローを実行せず、その旨を表示します。サブコマンドもツールも、共有ホステッドエンドポイント(mcp.briefgate.dev)には適用されません。クライアントを接続すると実際の OAuth が開始される ホステッドエンドポイントと OAuth を参照してください。
環境変数
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
BRIEFGATE_API_KEY | いいえ | — | API キー(bg_live_... または bg_test_...)。login で保存された認証情報より優先されます。何も設定されていない場合、ツールの呼び出しは login を案内するメッセージとともに失敗します。 |
BRIEFGATE_BASE_URL | いいえ | https://api.briefgate.dev | ステージング環境またはローカル開発用の上書き設定です。 |
BRIEFGATE_CREDENTIALS_FILE | いいえ | ~/.briefgate/credentials.json | login/logout がキーを保存する場所です。主にテストや特殊な構成で使用します。 |
BRIEFGATE_NO_BROWSER | いいえ | 未設定 | 1 に設定すると、login がブラウザーを開かなくなります(ヘッドレスサーバー、CI 用)。どちらの場合も URL は出力されます。 |
BRIEFGATE_MCP_HTTP | いいえ | — | 1 に設定すると、stdio の代わりに Streamable HTTP を起動します。 |
BRIEFGATE_MCP_PORT | いいえ | 3000 | HTTP モードで使用するポートです。 |
BRIEFGATE_MCP_PUBLIC_HOST | いいえ | — | サーバーを、複数の顧客で共有する OAuth エンドポイントとして公開します。ホスト型エンドポイント+OAuth を参照してください。 |
BRIEFGATE_MCP_AUTH_SERVER | いいえ | BRIEFGATE_BASE_URL | 公開モードでクライアントに通知される OAuth 認可サーバーです。通常、同じアドレスになるローカル開発では、デフォルトで BRIEFGATE_BASE_URL が使用されます。コンテナーネットワークの背後にある実際のデプロイでは、これを明示的に設定します(以下を参照)。 |
コマンドラインでは --api-key bg_live_... も指定でき、優先順位は BRIEFGATE_API_KEY より上になります。--http/フラグなしの代わりに、login と logout を最初のコマンドライン引数として指定することもできます(npx @briefgate/mcp login)。
HTTP(Streamable HTTP)モード
リモート環境または複数セッションのデプロイでは、HTTP モードでサーバーを起動します。
BRIEFGATE_API_KEY=bg_live_... npx @briefgate/mcp --http --port 3000
サーバーは 127.0.0.1 のみでバインドし、DNS リバインディング対策を備えています。リバースプロキシの背後では、そこで TLS を終端し、ローカルポートに転送してください。ポートを直接公開しないでください。
ホスト型エンドポイントと OAuth
BRIEFGATE_MCP_PUBLIC_HOST にサーバーが公開されるホスト名を設定すると、共有のマルチカスタマー向けエンドポイントになります。各呼び出し元は独自のキーを Authorization: Bearer bg_live_... として送信し(この API では、OAuth アクセストークンは同じキーです。詳しくは以下をご覧ください)、サーバーはその呼び出し元として BriefGate API と通信します。公開インスタンスは https://mcp.briefgate.dev/mcp です。
BRIEFGATE_MCP_PUBLIC_HOST=mcp.example.com npx @briefgate/mcp --http --port 3000
意図的に、いくつかの点が変わります。
- リスナーは
0.0.0.0にバインドし、Host ガードはその名前を受け入れます。リバースプロキシの背後にあるサーバーには、公開名でアクセスするためです。 BRIEFGATE_API_KEYのフォールバックとローカルのlogin認証情報は、どちらも無効になります。 どちらかを有効にしたままにすると、匿名の呼び出し元が運用者のキーを使用したり、このマシンのloginが最後に保存した情報を読み取ったりできてしまいます。login/logoutと、ツールおよびサブコマンドは利用できません。 クライアントを接続すると、以下で説明する実際の OAuth が開始されます。- MCP の認可仕様に従い、サーバーは OAuth 2.1 の リソースサーバー になります。これにより、OAuth 対応クライアントは URL だけでサーバーを追加できます。このパッケージ自体は認可フローを実行せず、その場所を通知して、リクエストにトークンが含まれていることを検証するだけです。
GET /.well-known/oauth-protected-resource(RFC 9728)を提供します。また、同じ内容を/.well-known/oauth-protected-resource/mcpでも提供します(MCP 仕様に基づき、クライアントが試すリソーススコープのパスです)。どちらも CORS はオープンで、認可サーバーとして BriefGate API を指定します。上記のBRIEFGATE_MCP_AUTH_SERVERをご覧ください。- MCP リクエストにはすべて Bearer トークンが必要になります。以前はレジストリがツール一覧を調べられるよう、トークンなしでも動作していた
initializeとtools/listも対象です。トークンがないリクエストには HTTP401が返され、WWW-Authenticate: Bearer resource_metadata="https://<host>/.well-known/oauth-protected-resource"ヘッダーが付与されます。これは、OAuth クライアントがサインインを開始するためのシグナルです。 - ツール呼び出しに使われたキーの有効期限切れまたは失効が判明した場合(API が
401を返した場合)、応答は通常のツールエラーではなく、同じヘッダーにerror="invalid_token"を加えた実際の HTTP401に書き換えられます。これによりクライアントは、呼び出しの失敗を報告するだけでなく、トークンの更新が必要だと判断できます。
接続するクライアントは、メタデータで指定された認可サーバーに対して、標準の OAuth 2.1 ディスカバリー(GET /.well-known/oauth-authorization-server)、動的クライアント登録(POST /v1/oauth/register)、続いて PKCE(S256)を使った認可コード交換(POST /v1/oauth/token)を行います。MCP クライアントはパブリッククライアントであるため、クライアントシークレットは不要です。また、セッションを終了するために POST /v1/oauth/revoke を呼び出します。これらはすべてこのパッケージの対象外です。このパッケージが行うのは、そこを指し示す適切なリソースサーバーとして動作することだけです。取得されるアクセストークンは、他のものと同じ bg_live_... キーで、API によって有効期限が1時間に制限されます。
BRIEFGATE_MCP_PUBLIC_HOST が設定されていない場合、これらの変更は適用されません。ローカルでの --http 実行は従来どおり動作します。キーがなくても initialize/tools/list に到達でき、OAuth を介さずに Authorization: Bearer ... ヘッダーをそのまま使用できます。
ツール
define_intake
新しいクライアント向けインテークを作成します。これは、クライアントが必要なアセットを提出するためのブランド付きポータルです。BriefGate が招待メールを送信し、すべてのアセットが集まるまでクライアントに自動でリマインドします。
project_name: "Website for John Finance"
client: { email: "[email protected]", name: "John", language: "cs" }
// also_notify: [{ email: "[email protected]", name: "Jane" }]
// Others at the client who get the same link and the same reminders — either of
// them can supply the material. Each gets their own email; nobody sees the rest.
due_date: "2026-08-15"
branding: { accent_color: "#1B2A4A", sender_name: "Radim" }
// Custom branding (Solo plan and up). On Free these are stored but not used: the
// email and portal show a built-in sender name with the account owner's address.
chase_schedule: "default" // default | gentle | aggressive | custom | off
// chase_interval: 5, chase_interval_unit: "minutes" // only with "custom"; omit for every 3 days
// respect_quiet_hours: false, max_reminders: 12 // for a deliberately rapid cadence
items:
- { key: "logo", type: "image", label: "Company logo",
constraints: { formats: ["svg","png"], min_width: 512 } }
- { key: "hero_copy", type: "longtext", label: "Homepage headline",
constraints: { max_chars: 400 } }
- { key: "brand_colors", type: "color_list", label: "Brand colors", required: false }
- { key: "ga4_id", type: "text", label: "Google Analytics ID",
pattern: "^G-[A-Z0-9]+$", required: false }
- { key: "wp_admin", type: "secret", label: "WordPress admin credentials" }
- { key: "photos", type: "file_list", label: "Photos (5–10 images)",
constraints: { formats: ["jpg","png","heic"], min_count: 5, max_count: 15 } }
- { key: "opening_hours", type: "structured", label: "Opening hours",
schema: { type: "object", properties: { mon_fri: { type: "string" }, sat: { type: "string" } } } }
- { key: "has_existing_site", type: "boolean", label: "Does the client have an existing website?" }
- { key: "website_url", type: "url", label: "Current website URL", required: false }
- { key: "service_tier", type: "select", label: "Service package",
options: [{ value: "basic", label: "Basic" }, { value: "pro", label: "Pro" }] }
// folder_id: "fld_1"
// Put the intake straight into an existing folder from list_folders instead
// of leaving it unfiled.
// client_brief: "Here's the offer we agreed on, plus a few notes on scope..."
// Free text shown to the client above the requested items — information from
// you to them, not another thing you're asking them for. Up to 5000 characters.
// Documents go through POST /v1/intakes/:id/brief/files (dashboard or REST,
// not through MCP).
アイテムキーのルール: snake_case(例:logo、hero_copy、ga4_id)にする必要があります。キーは get_intake_results のプロパティ名になります。大文字、スペース、ハイフンは使えません。
{ intake_id, portal_url, status } を返します。以降の呼び出しではすべて intake_id を保存して使用してください。
get_intake_status
どのアイテムが提出済み、保留中、または修正が必要かを確認します。自動リマインドメールの履歴と、クライアントが最後にポータルを開いた日時も含まれます。
intake_id: "in_8f3k"
アイテムごとのステータスと、リマインド履歴全体を返します。
get_intake_results
送信済みの型付き値を取得します。ファイルは署名付き URL です(有効期間は 24 時間)。シークレットは一度限りです。最初の呼び出し時のみ復号化されて返されるため、次に進む前に保存してください。
intake_id: "in_8f3k"
only_new: true // only items new since last call
include_pending: false // omit unsubmitted items
{ results: { logo: "https://signed...", hero_copy: "text...", wp_admin: "s3cr3t" }, meta: { ... } }を返します。
request_revision
問題点を説明するメモを添えて、項目を再送信するようクライアントに依頼します。
intake_id: "in_8f3k"
item_key: "logo"
note: "Logo is blurry — we need at least 512 px wide in SVG or PNG with a transparent background"
{ status: "revision_requested", item_key }を返します。
send_chase
自動スケジュール以外で手動のリマインダーを送信します。期限が近づいている場合や、メールの送信に失敗した場合に使用します。
intake_id: "in_8f3k"
{ sent: true }を返します。
list_intakes
プロジェクト全体のインテークを一覧表示します。ステータス、クライアントのメールアドレス、フォルダー、またはテキスト検索で絞り込むこともできます。
status: "in_progress" // draft | sent | in_progress | completed | archived
client_email: "[email protected]"
folder_id: "fld_1" // or "none" for intakes not in any folder
q: "Finance" // substring match on project name, client name, or client email
limit: 20
offset: 0
{ intakes: [...], total }を返します。
add_items
送信済みのインテークに新しい項目を追加します。たとえば、追加し忘れたファビコンや、プロジェクトの途中で必要になった認証情報などです。
intake_id: "in_8f3k"
items:
- { key: "favicon", type: "image", label: "Favicon (32×32 PNG or ICO)" }
更新されたインテークを返します。
update_item
インテークの送信後に、項目の定義(種類、ラベル、ヘルプテキスト、制約)を変更します。たとえば、画像を依頼したものの、クライアントが PDF を持っている場合など、依頼内容を間違えたときに使用します。
intake_id: "in_8f3k"
item_key: "logo"
type: "file" // was "image"
constraints: { formats: ["pdf","ai","svg"] }
discard_submitted_value: false // true is required if the change invalidates what the client already sent
更新された項目を返します。クライアントがすでに送信した値が新しい定義では受け付けられない場合、discard_submitted_value: trueを渡すまで、呼び出しはitem_answer_would_be_discardedで失敗します。
update_intake
送信済みのインテークの設定(プロジェクト名、期限、リマインダーの頻度、通知を控える時間帯、クライアントへの説明、クライアントの名前、電話番号、言語、タイムゾーン)を変更します。招待を再送信してしまうため、インテークを削除して作り直す代わりに使用してください。
intake_id: "in_8f3k"
due_date: "2026-12-01"
chase_schedule: "gentle" // was "default"
max_reminders: "unlimited" // reactivates a stalled intake if it had hit its cap
// folder_id: "fld_1" // move it into a folder; null removes it from any folder
// client_brief: "Updated offer..." // replaces the brief shown above the items; null clears it
送信済みのインテークで、追跡関連のフィールド(chase_schedule、chase_interval、chase_interval_unit、chase_at_time、max_reminders、respect_quiet_hours、due_date、client.timezone)のいずれかが変更されると、保留中のリマインダーはすべてキャンセルされ、現在の時点から再計画されます。すでに送信されたリマインダーは引き続きmax_remindersにカウントされます。folder_idは追跡スケジュールに影響しません。
ここではクライアントのメールアドレスを変更できません。ポータルリンクとログインはそのアドレスに紐付いています。変更するにはmanage_recipientsを使用してください。インテークがアーカイブ済みの場合は失敗します。更新後のインテークオブジェクト全体を返します。
manage_recipients
インテークの招待やリマインダーを受け取る人を、メインのクライアントに加えて、またはその代わりに追加、削除、再登録します。
intake_id: "in_8f3k"
action: "reinstate" // add | remove | reinstate
email: "[email protected]"
name: "Petr" // only used with action="add"
action="add"は、define_intakeの実行時にalso_notifyを指定した場合と同じ方法で、別のメールアドレスに招待を送信します。action="remove"は、そのアドレスへの今後のリマインダーを停止します。action="reinstate"は、誤ってバウンス扱いされた場合(相手が実際にはメールを受信していた場合)に使用します。バウンスフラグを解除してリマインダーを再開し、そのアドレスだけが追跡対象として残っていた場合は、現在の時点から追跡スケジュールを再計画します。
manage_webhook
Webhook エンドポイントを登録、一覧表示、または削除して、ポーリングする代わりにイベントをサービスへプッシュ配信します。
action: "create" // create | list | delete
url: "https://your.service/hooks/briefgate"
events: ["intake.completed", "intake.overdue"]
format: "raw" // raw | slack | discord
action: "create"はsecretを一度だけ返します。保存してください。このシークレットはすべての配信の署名検証に使用され、再取得できません。action: "delete"とwebhook_idを指定して削除します。
エージェントはツールの結果としてシークレットを受け取るため、会話の保存先にシークレットが残ることがあります。ローテーション用のエンドポイントはありません。トランスクリプトが漏えいした場合は、エンドポイントを削除して新しいエンドポイントを作成し、新しいシークレットを取得してください。
実際に受信できるエンドポイントのみ登録してください。ターミナルで実行されているエージェントには、公開 HTTPS アドレスがありません。その場合は何も登録せず、代わりに定期的に確認してください(下記参照)。
list_folders
アカウント内のフォルダーを一覧表示します。クライアントやプロジェクトごとにインテイクをまとめるために使用します。引数は不要です。
create_folder を呼び出す前、または define_intake、update_intake、list_intakes で folder_id を設定する前に呼び出してください。リピーターのクライアントにはフォルダーを重複して作成せず、既存のフォルダーを再利用してください。
{ folders: [{ id, name, sort_order, intake_count, created_at }] } を返します。
create_folder
インテイクをまとめる新しいフォルダーを作成します。たとえば、クライアントごとに1つ作成します。
name: "Acme Inc"
まず list_folders を呼び出して、該当するフォルダーがあれば再利用してください。既存のフォルダーがどれも適合しない場合にのみ作成します。同じ名前のフォルダーがすでにある場合は、folder_exists エラーになります。作成したフォルダーを返します。
login
API キーを使わずにサインインします。API キーを使わずにサインインするを参照してください。引数は不要です。
別のツールから「Not signed in」または保存済みのキーが取り消されたか期限切れであるという報告があった場合は、いつでも呼び出してください。最初の呼び出しでデバイス認証フローが開始され、URL と短いコードがすぐに返されます。承認されたかどうかを確認するには、いつでも再度呼び出してください。--api-key または BRIEFGATE_API_KEY でキーが指定されている場合は何も行わず、その旨を返します。ホスト型エンドポイントでは利用できません。ターミナルから npx @briefgate/mcp login を実行する場合と同じフローです(こちらは2回目の呼び出しを必要とせず、承認されるまで待機します)。API キーを使わずにサインインするを参照してください。
logout
この BriefGate サーバー用に login がローカルに保存した API キーを削除し、可能な場合はサーバー上でも取り消します。引数は不要です。
取り消しの呼び出しに失敗した場合(ネットワークがない、API に接続できないなど)も、ローカルのコピーは削除されます。その旨を返し、代わりに BriefGate ダッシュボードから取り消すよう案内します。ホスト型エンドポイントでは利用できません。ターミナルから npx @briefgate/mcp logout を実行する場合と同じ効果です。API キーを使わずにサインインするを参照してください。
Decisions — 開発者への質問
何かを構築するエージェントは、アカウント所有者だけが判断できる事柄に直面します。割引プランの料金は19ドルですか、それとも29ドルですか? 作業を止めて待つと実行時間が無駄になり、黙って選ぶと前提が見えなくなります。決定という第3の選択肢があります。質問を提示し、作業を進める際に採用した回答を記録して、構築を続けます。
{ "key": "discount_price", "type": "select", "assignee": "owner",
"label": "What does the discounted subscription cost?",
"options": [ { "value": "19", "label": "$19/month" },
{ "value": "29", "label": "$29/month" } ],
"proposed": { "value": "19", "rationale": "matches the competitor we benchmarked" } }
type: "multiselect" では、constraints.min_count / max_count の範囲内で複数の回答を選択できます。
提案は実際の回答とは別に保存されるため、開発者が答えたものと誤認されることはありません。また、却下されても残ります。それが重要なのです。3か月後でも、19ドルは合意された金額ではなく、仮定だったと確認できます。get_intake_results で次のように読み取れます。
"results": { "discount_price": "19" },
"meta": { "discount_price": { "decided_by": "agent_proposal", "proposed_value": "19" } }
decided_by は、担当者が決定した場合は "owner"、まだあなた自身の選択である場合は "agent_proposal" になります。提案された決定は、include_pending を指定しなくても返されます。構築の基盤となる前提を把握する必要があるためです。revision は増加しないため、only_new で読み取ると、誰かがその後回答した決定だけが表示されます。
自分がした質問に自分で回答することはできません。 回答エンドポイントでは API キーではなくダッシュボードのセッションが必要です。エージェントが自分の提案を確定し、それが開発者の回答として記録できるなら、この区別には何の意味もありません。決定への回答は BriefGate ダッシュボードで行います。
オーナー向けの項目はクライアントポータルに表示されず、リマインダーにも含まれず、完了を妨げることもありません。インテイクは、クライアントが完了した時点で終了します。
クライアントの処理完了を把握する方法
MCP クライアントに自動で何かを送信する仕組みはありません。MCP はリクエスト/レスポンス方式のため、クライアントの処理が完了しても、サーバーからエージェントを起動することはできません。そのため、define_intake は、環境に合った仕組みを示す follow_up ブロックを返します。
"follow_up": {
"recommended": "schedule", // or "webhook" when an endpoint already exists
"webhook": { "active_endpoints": 0, "events": ["intake.completed", "item.submitted"],
"register_with": "manage_webhook" },
"schedule": { "check_with": "get_intake_status", "every_hours": 24,
"until": "2026-10-01T08:00:00.000Z" }
}
- サービスを運用している場合 →
manage_webhookで Webhook を登録し、intake.completedに応じて処理します。 - ターミナルでエージェントを実行している場合 →
untilになるまで、every_hours時間ごとにget_intake_statusを呼び出す定期チェックを設定します。cron エントリー、systemd タイマー、エージェントホスト独自のスケジューラーなどを利用できます。
対応すべきイベントは、intake.completed(すべての項目がそろったとき)と intake.overdue(期限を過ぎても必須項目が不足しているとき。プロジェクトは保留状態となり、クライアントには再度のリマインダーではなく、人による対応が必要です)です。
確認間隔は期限が近づくにつれて短くなります(通常は 24 時間ごと、期限まで 1 週間以内なら 12 時間ごと、2 日以内なら 6 時間ごと)。リマインダーのスケジュールとは連動していません。クライアントがリマインダーを一度も開かずに、午前 2 時にすべてを提出することもあります。
エンドツーエンドの例
# System prompt excerpt
You are a web development agent. When you need client assets:
1. Call define_intake with all assets needed for this project.
Use type=secret for passwords/credentials.
The chase engine runs automatically — do not poll more often than once per day.
2. Read follow_up in the response and set up how you will hear back:
register a webhook with manage_webhook if you have an HTTPS endpoint,
otherwise schedule a get_intake_status check at follow_up.schedule.every_hours.
3. When intake.completed arrives (or the scheduled check reports "completed"),
call get_intake_results. Download file URLs within 24 hours.
Secrets are shown only on the first retrieval.
4. If a submitted asset does not meet requirements (blurry logo, broken URL),
call request_revision with a clear note for the client.
If the client has the asset in another form, call update_item to change the type.
5. If the client is still unresponsive after 9 days, call send_chase for an
extra nudge outside the automatic schedule, or tell the developer the intake
is stuck and let them pick up the phone.
Webhook の検証
BriefGate は、偽造やリプレイ攻撃を防ぐため、すべての Webhook に HMAC-SHA256 署名を付与します。@briefgate/mcp パッケージには、すぐに使えるヘルパーが用意されています。
import { verifyWebhookSignature, parseWebhookEvent } from "@briefgate/mcp/webhook";
署名は X-BriefGate-Signature ヘッダーに t=<unix>,v1=<hex> の形式で格納されます。
Fastify(推奨)
import Fastify from "fastify";
import { verifyWebhookSignature, parseWebhookEvent } from "@briefgate/mcp/webhook";
const app = Fastify();
// Parse body as raw string — JSON-parsing before verification breaks the HMAC.
app.addContentTypeParser("application/json", { parseAs: "string" }, (req, body, done) => {
done(null, body);
});
app.post("/briefgate/webhook", (request, reply) => {
const rawBody = request.body as string;
const ok = verifyWebhookSignature(
process.env.BRIEFGATE_WEBHOOK_SECRET!,
request.headers["x-briefgate-signature"] as string,
rawBody,
// { toleranceSec: 300 } ← default; increase for slow networks
);
if (!ok) {
return reply.status(401).send({ error: "Invalid signature" });
}
const event = parseWebhookEvent(rawBody);
console.log("BriefGate event:", event.event, event.intake_id);
reply.send({ ok: true });
});
Express
import express from "express";
import { verifyWebhookSignature, parseWebhookEvent } from "@briefgate/mcp/webhook";
const app = express();
// raw body parser — must come before express.json()
app.post(
"/briefgate/webhook",
express.raw({ type: "application/json" }),
(req, res) => {
const rawBody = Buffer.isBuffer(req.body)
? req.body.toString("utf8")
: String(req.body);
const ok = verifyWebhookSignature(
process.env.BRIEFGATE_WEBHOOK_SECRET!,
req.headers["x-briefgate-signature"] as string,
rawBody,
);
if (!ok) return res.status(401).json({ error: "Invalid signature" });
const event = parseWebhookEvent(rawBody);
console.log("BriefGate event:", event.event, event.intake_id);
res.sendStatus(200);
},
);
Webhook イベント
| イベント | 発生条件 | 主なフィールド |
|---|---|---|
item.submitted | クライアントが項目を提出したとき | item_key、item_status |
intake.completed | 必須項目がすべて承認されたとき | — |
client.viewed | クライアントがポータルを開いたとき | client_email |
chase.bounced | リマインダーが不達になったとき | channel、reason、recipient、still_chasing |
intake.stalled | リマインダーを 3 回送信しても応答がないとき | attempts |
料金
| 無料 | Solo — $29/mo | Agency — $79/mo | |
|---|---|---|---|
| アクティブな受付 | 1 | 15 | 60 |
| 受付ごとの項目数 | 10 | 無制限 | 無制限 |
| ストレージ | 1 GB | 25 GB | 100 GB |
| 1 日あたりの招待数 | 10 | 1 日あたりの上限なし | 1 日あたりの上限なし |
| ブランディング | 「powered by」、組み込みの送信者名 | 送信者名、メールの文面、ロゴ+カラー | + カスタム送信ドメイン |
| リマインダー | メール、デフォルト | メール、すべてのスケジュール | メール、すべてのスケジュール |
| シークレット保管庫 | — | あり | あり |
| Webhook + REST + MCP | あり | あり | あり |
料金の詳細は GET https://api.briefgate.dev/pricing.json で確認できます(認証不要。エージェントから直接読み取れます)。
データの保管場所
BriefGate は EU でホストされています。アプリケーションサーバーはドイツのニュルンベルクにある netcup GmbH に、ファイルは EU の管轄下にある Cloudflare R2 に配置されています。GDPR に関する注記 と DPA をご覧ください。
プライバシーポリシー
このパッケージは薄いクライアントであり、独自のデータを保持せず、設定した API キーを使用して、BriefGate API の api.briefgate.dev 以外にデータを送信することはありません。テレメトリーや分析データも送信しません。
BriefGate が収集するデータ、その保存期間、共有先、および削除を依頼する方法については、以下をご覧ください。
- プライバシーポリシー — https://briefgate.dev/docs/privacy
- セキュリティ — https://briefgate.dev/docs/security
- データ処理契約 — https://briefgate.dev/docs/dpa
プライバシーに関するお問い合わせ先:[email protected]
MCPB バンドル(Claude Desktop Extension)
リポジトリのルートにあるmanifest.jsonは、ローカルの
@briefgate/mcpパッケージをワンクリックでインストールできるClaude Desktop拡張機能として
パッケージ化します(MCPB仕様)。dist/index.jsを
ローカルで実行し、インストール時に任意のAPIキーを入力するよう求めます。これは、上記で説明した
login/BRIEFGATE_API_KEYの設定と同じであり、ホストされたエンドポイントの
OAuthフローではありません。
バンドルをビルドします(本番用の依存関係のみを、一時的なステージングディレクトリにパッケージ化するため、
このリポジトリ自体のnode_modulesには一切触れません)。
npm run package:mcpb
リポジトリのルートにbriefgate.mcpbが生成されます(Gitで無視されます。ローカルにインストールして
テストしてください。コミットしないでください)。まだどこにも提出していません。コマンドの動作については、
scripts/build-mcpb.mjsを参照してください。
貢献
このリポジトリはBriefGate MCPクライアントのみを含みます。公開されているBriefGate REST APIを 薄くラップしたものです。BriefGateサービス自体はクローズドソースです。
npm install
npm run typecheck # TypeScript check
npm run lint # ESLint
npm run test # Vitest
npm run check # all three
npm run build # compile to dist/
ライセンス
MIT — 商用プロジェクトでも自由にご利用いただけます。
Radim Sekeraが作成しました。関連プロジェクト:impri.dev — AIエージェント向けの、ヒューマンインザループ型承認受信箱です。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。