Your AI Agents

Other Clients

Cursor, Windsurf, and anything you write yourself: the generic path, and what to check when a client misbehaves.

No client-specific code lives in Surface's MCP server. If your tool speaks Streamable HTTP MCP, it connects with a URL and a header.

{
  "mcpServers": {
    "surface-forms": {
      "url": "https://app.withsurface.com/mcp",
      "headers": { "Authorization": "Bearer <your-api-key>" }
    }
  }
}

Clients with a Written-up Config

ClientNotes
CursorSettings UI or .cursor/mcp.json. Config →
Windsurf~/.codeium/windsurf/mcp_config.json, serverUrl key. Config →
Your own agentAny MCP client library. Nothing here is Surface-specific

Any other editor that supports Streamable HTTP takes the generic block above. These are the two clients with a written-up config in API setup.

Clients That Configure Headers but Not URLs

For hosts that set headers but not query strings:

{
  "headers": {
    "Authorization": "Bearer <your-api-key>",
    "X-Surface-Tool-Families": "content"
  }
}

?tools= wins if both are present. Full rules in Tool bundles.

Writing Your Own Client

Three behaviours worth coding against:

Schemas are discoverable. list_component_types, describe_component_type and get_tool_schema return the real shapes at runtime, so you never hard-code a payload that a release can change.

Unknown selections fail open. A ?tools= list with a typo falls back to everything rather than producing a zero-tool server. A known tool your credential excludes is silently skipped, so fewer tools than you expected is a permissions problem, not a spelling one.

Form writes are drafts. publish_form is the only call that changes what a visitor sees.

When Something Does Not Work

Check the tool count

A default connection loads 45 tools. Fewer usually means ?readonly=1 or a restricted credential; 128 means ?tools=all.

Check the transport

Streamable HTTP. There is no local process and no Docker container, so a client that can only launch a stdio server needs a bridge.

Check the header

Authorization: Bearer <key>, with the word Bearer. This is the single most common failure.

Check the environment

Every call is scoped to the credential's environment. A tool returning an empty list is often a correct answer about the wrong environment.

More in MCP troubleshooting.

Ready to Get Started?

See it on your own site, or open the app and build the first form.

Need Help?

Setup problems, blocked domains and CRM push failures live in the Help Center.

Feature Requests?

Tell us what is missing. We would rather hear it than guess.

On this page