Client Intake for Windsurf: Collect Client Assets From Cascade

Last updated:

Windsurf's agent (Cascade) reads MCP servers from mcp_config.json. BriefGate's hosted endpoint connects the same way any remote Streamable HTTP MCP server does, with an API key as the fastest path to a working setup.

A naming note first: Windsurf's editor is now distributed as part of Devin Desktop (Cognition acquired Windsurf), and its current official docs live at docs.devin.ai rather than the old docs.windsurf.com — if a link below looks unfamiliar, that's why.

The problem

Cascade can build most of a client website or app in one session, then stalls on the same thing every agent does: the logo, the homepage copy, or a hosting login the client hasn't sent yet.

The solution

Cascade calls define_intake with the list of items needed, BriefGate emails the client a portal link and chases them automatically, and Cascade calls get_intake_results once everything has arrived.

Setting up BriefGate MCP in Windsurf

Add a server to mcp_config.json (Windsurf settings → Cascade → MCP Servers → view raw config, or the project-level file).

Option A — hosted endpoint with an API key (verified path)

json
{
  "mcpServers": {
    "briefgate": {
      "serverUrl": "https://mcp.briefgate.dev/mcp",
      "headers": {
        "Authorization": "Bearer bg_live_xxxxx"
      }
    }
  }
}

Get the key from https://app.briefgate.dev/app (Settings → API keys). This is the configuration we've confirmed against Windsurf/Devin Desktop's published mcp_config.json format for a remote Streamable HTTP server.

Windsurf's docs also state that Cascade supports OAuth for remote MCP servers, and BriefGate's hosted endpoint speaks standard OAuth 2.1 with dynamic client registration and PKCE (the same mechanism Claude Code and VS Code use against it) — but we have not confirmed the exact mcp_config.json syntax Cascade expects to trigger that flow instead of a static header. If Cascade prompts you to authenticate rather than reading the header above, follow its in-app flow; otherwise, the header-based setup above is the one to rely on.

Option B — local package with an API key

json
{
  "mcpServers": {
    "briefgate": {
      "command": "npx",
      "args": ["-y", "@briefgate/mcp"],
      "env": {
        "BRIEFGATE_API_KEY": "bg_live_xxxxx"
      }
    }
  }
}

Both options expose the same 13 tools: define_intake, add_items, update_item, update_intake, list_intakes, get_intake_status, get_intake_results, request_revision, send_chase, manage_recipients, manage_webhook, list_folders, create_folder.

Telling Cascade when to use it

Add a rule (Windsurf → Customizations → Rules, or a project .windsurfrules file):

When you need a file, credential, or piece of copy from the client:
1. Call define_intake with items[] describing exactly what is needed
2. Do not email or message the client yourself — BriefGate sends the portal link
3. Continue with other work; check get_intake_status rather than blocking
4. Call get_intake_results to retrieve typed data and file URLs
5. Use type: "secret" for any password, API key, or login

A worked example

You: "The booking page needs the current menu PDF and the Google Business Profile login. Ask the client."

Cascade calls define_intake with a file item and a secret item. The client uploads and fills in from their phone; Cascade picks the results up with get_intake_results on the next relevant turn.

Next steps