Quickstart — 5 minutes to your first intake
This guide walks you through installing BriefGate, connecting it to your coding agent, and sending your first client intake.
Prerequisites
- Node.js 22 or later — the BriefGate MCP server runs on Node.js.
- An MCP-capable agent — Claude Code, Cursor, or any client that speaks the Model Context Protocol.
- A BriefGate account — sign up at https://app.briefgate.dev and copy your API key from the dashboard.
1. Install the MCP server
npm install -g @briefgate/mcpVerify the installation:
briefgate-mcp --version2. Add BriefGate to Claude Code
You have two options. Both produce the same result — choose whichever fits your workflow.
Option A — Claude Code CLI:
claude mcp add briefgate -- briefgate-mcp --api-key bg_live_xxxxxOption B — Manual config in ~/.claude/mcp.json:
{
"mcpServers": {
"briefgate": {
"command": "briefgate-mcp",
"args": ["--api-key", "bg_live_xxxxx"]
}
}
}Replace bg_live_xxxxx with your actual API key. Use a bg_test_xxxxx key during development — test mode uses a sandbox email provider and never sends real messages to clients.
Restart Claude Code after editing the config file.
3. Your first intake
The example below creates an intake for a restaurant website project. Paste this into your agent's context (or call the define_intake MCP tool directly):
{
"project_name": "Bella Napoli — Website",
"client": {
"email": "owner@bellanapoli.com",
"name": "Marco Esposito",
"language": "en"
},
"items": [
{
"key": "logo",
"label": "Restaurant logo",
"help": "Upload your logo in SVG or PNG format with a transparent background. Minimum 512px on the shortest side.",
"type": "image",
"required": true,
"constraints": {
"formats": ["svg", "png"],
"min_width": 512,
"transparent_background": true
}
},
{
"key": "hero_copy",
"label": "Hero section tagline",
"help": "A short paragraph (up to 400 characters) that captures the spirit of the restaurant. This appears above the fold on the homepage.",
"type": "longtext",
"required": true,
"constraints": {
"max_chars": 400
}
},
{
"key": "opening_hours",
"label": "Opening hours",
"help": "Your regular opening hours. Use a simple format like '12:00-22:00' or 'Closed'.",
"type": "structured",
"required": true,
"schema": {
"type": "object",
"required": ["mon_fri", "sat", "sun"],
"properties": {
"mon_fri": { "type": "string", "example": "12:00-22:00" },
"sat": { "type": "string", "example": "12:00-23:00" },
"sun": { "type": "string", "example": "13:00-21:00" }
}
}
},
{
"key": "photos",
"label": "Food and interior photos",
"help": "Upload between 5 and 15 photos of your food, interior, and ambience. JPG, PNG, or HEIC.",
"type": "file_list",
"required": true,
"constraints": {
"formats": ["jpg", "png", "heic"],
"min_count": 5,
"max_count": 15
}
}
],
"chase_schedule": "default"
}The tool returns:
{
"intake_id": "in_8f3kQmR2",
"portal_url": "https://app.briefgate.dev/portal/in_8f3kQmR2",
"status": "sent",
"items": [
{ "key": "logo", "status": "pending" },
{ "key": "hero_copy", "status": "pending" },
{ "key": "opening_hours", "status": "pending" },
{ "key": "photos", "status": "pending" }
]
}BriefGate immediately sends the client an email containing the portal_url. The intake status becomes sent.
4. What happens next
- The client receives an email with a link to their personal intake portal.
- They upload or fill in each item directly in the browser — no account required.
- As they submit items, BriefGate fires webhooks to your endpoint (configure them in the dashboard under Settings > Webhooks).
- If the client does not complete the intake, the chase engine sends automatic follow-up emails (and optionally SMS) on the schedule you specified.
- When all required items are submitted, the intake status transitions to
completedand a final webhook fires.
5. Check status
Via MCP (in your agent):
Call: get_intake_status
Args: { "intake_id": "in_8f3kQmR2" }Via REST:
curl https://api.briefgate.dev/v1/intakes/in_8f3kQmR2/status \
-H "Authorization: Bearer bg_live_xxxxx"Both return the completion percentage, per-item statuses, and a timeline of chase emails sent so far.
6. Get results when complete
Via MCP:
Call: get_intake_results
Args: { "intake_id": "in_8f3kQmR2" }Via REST:
curl https://api.briefgate.dev/v1/intakes/in_8f3kQmR2/results \
-H "Authorization: Bearer bg_live_xxxxx"The response contains typed, ready-to-use data:
- Text and longtext items return plain strings.
- Image and file items return signed URLs (valid for 24 hours), dimensions, MIME type, and checksum.
- Secret items return the decrypted plaintext in a
valuefield on the first call only (first_reveal: true). Store it immediately — subsequent calls omit the value. - Structured items return a validated JSON object matching the schema you declared.
Next steps
| Topic | Document |
|---|---|
| Full reference for all 7 MCP tools | mcp.md |
| All 11 item types and their constraints | item-types.md |
| REST API, webhooks, and authentication | rest-api.md |