# Build on Surface



Three ways in, depending on what you are building. For the MCP server, see the
[MCP](/mcp-server/overview) tab.

<Columns cols="2">
  <Card title="Your AI Agents" icon="sparkles" href="/build/agents/overview">
    Claude, Codex, Grok, Cursor, Windsurf, and anything else that speaks MCP.
  </Card>

  <Card title="Forms SDK" icon="code" href="/build/forms-sdk/overview">
    Render a Surface form from your own markup and styles.
  </Card>

  <Card title="Webhooks & External Forms" icon="webhook" href="/build/webhooks/overview">
    Post any HTML form into Surface, and push Surface data anywhere else.
  </Card>
</Columns>

## Reference [#reference]

<Columns cols="2">
  <Card title="API Reference" icon="terminal" href="/build/api-reference/api-keys">
    Keys, forms and responses over HTTP.
  </Card>

  <Card title="Events" icon="signal" href="/build/events/form-events">
    Browser events for GTM, GA4, Google Ads and Meta Ads.
  </Card>
</Columns>

## Which One Do I Want? [#which-one-do-i-want]

| Goal                                                    | Use                                                    |
| ------------------------------------------------------- | ------------------------------------------------------ |
| "My assistant should answer questions about our funnel" | [MCP, read-only](/mcp-server/tool-bundles)             |
| "My assistant should build and publish forms"           | [MCP, forms bundle](/mcp-server/overview)              |
| "The form must be part of my React app, not an iframe"  | [Forms SDK](/build/forms-sdk/quickstart)               |
| "I have an existing HTML form I can't replace"          | [External forms](/build/webhooks/create-external-form) |
| "Send every submission to our own service"              | [Webhooks](/build/webhooks/overview)                   |
| "Fire a conversion event into Google Ads"               | [Events](/build/events/google-ads-tracking)            |
| "Read responses from a cron job"                        | [API reference](/build/api-reference/api-keys)         |

<Tip>
  Tool access is scoped to the credential's environment. Add `?readonly=1` and an
  agent cannot write. See [Tool bundles](/mcp-server/tool-bundles).
</Tip>
