Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to Google Forms

Scalekit connector
Open markdown

The Google Forms connector lets your AI agent act in each user's Google Forms account. Each user signs in to Google Forms once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 10 tools.

Tools
10
What they doRead · write · destructive
4 · 5 · 14 read5 write1 destructive
Users sign in with
OAuth app
Your own Google app

What you can do

  • Create and edit forms: create new forms and add, edit, move, or delete questions and other items
  • Read form responses: list all submitted responses or fetch a single respondent’s answers
  • Inspect form structure: get a form’s title, description, and full list of questions
  • Control publishing: publish or unpublish a form and open or close it to new responses
  • Watch for changes: create, renew, list, and delete notifications for new responses or form edits

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Google Forms connection

    In AgentKit > Connections, create a Google Forms connection and copy its redirect URI. The name you give it is the connection_name your code passes. See Configure connections.

  4. Register a Google OAuth app

    Google Forms connections use your own OAuth app. Register one with Google and add the redirect URI you copied.

    Then enter the app's Client ID and Client Secret on the Google Forms connection.

    Console steps with screenshots

    Register your Scalekit environment with the Google Forms connector so Scalekit handles the authentication flow and token lifecycle for you. The connection name you create will be used to identify and invoke the connection programmatically. Then complete the configuration in your application as follows:

    1. Set up auth redirects

      • In Scalekit dashboard, go to AgentKit > Connections > Create Connection. Find Google Forms and click Create. Click Use your own credentials and copy the redirect URI. It looks like https://<SCALEKIT_ENVIRONMENT_URL>/sso/v1/oauth/<CONNECTION_ID>/callback.

        Copy redirect URI from Scalekit dashboard

      • Navigate to Google Cloud Console → APIs & Services → Credentials. Select + Create Credentials, then OAuth client ID. Choose Web application from the Application type menu.

        Select Web Application in Google OAuth settings

      • Under Authorized redirect URIs, click + Add URI, paste the redirect URI, and click Create.

        Add authorized redirect URI in Google Cloud Console

    2. Enable the Google Forms API

      • In Google Cloud Console, go to APIs & Services → Library. Search for “Google Forms API” and click Enable.
    3. Get client credentials

      • Google provides your Client ID and Client Secret after you create the OAuth client ID in step 1.
    4. Add credentials in Scalekit

      • In Scalekit dashboard, go to AgentKit > Connections and open the connection you created.

      • Enter your credentials:

        Add credentials in Scalekit dashboard

      • Click Save.

  5. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'googleforms'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Google Forms:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'googleforms_get_form',
    toolInput: { form_id: 'YOUR_FORM_ID' },
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • googleforms_get_formGet the structure and metadata of a Google Form including its title, description, and all questions.Read-only

    Get Google Form

    Get the structure and metadata of a Google Form including its title, description, and all questions.

    Inputs

    form_idstringrequired
    The ID of the Google Form to retrieve
  • googleforms_get_responseGet a single response submitted to a Google Form by its response ID.Read-only

    Get Google Form Response

    Get a single response submitted to a Google Form by its response ID. Returns the respondent's answers for all questions.

    Inputs

    form_idstringrequired
    The ID of the Google Form
    response_idstringrequired
    The ID of the specific response to retrieve
  • googleforms_list_responsesList all responses submitted to a Google Form.Read-only

    List Google Form Responses

    List all responses submitted to a Google Form. Returns response IDs, submission timestamps, and answer values for each respondent.

    Inputs

    form_idstringrequired
    The ID of the Google Form to list responses for
    filterstring
    Filter responses by submission time. Format: timestamp > 2026-01-01T00:00:00Z
    page_sizeinteger
    Maximum number of responses to return (max 5000)
    page_tokenstring
    Token for retrieving the next page of results
  • googleforms_list_watchesList the watches configured on a Google Form.Read-only

    List Form Watches

    List the watches configured on a Google Form. A form can have at most one active watch per event type (SCHEMA or RESPONSES) per project.

    Inputs

    form_idstringrequired
    The ID of the Google Form whose watches to list
  • googleforms_batch_update_formApply a batch of update requests to a Google Form in a single atomic call.Write

    Batch Update Form

    Apply a batch of update requests to a Google Form in a single atomic call. This is the only way to add, edit, move, or delete questions and other items on a form. Returns a reply for each request in the same order they were submitted.

    Inputs

    form_idstringrequired
    The ID of the Google Form to update
    requestsarrayrequired
    Ordered list of update requests to apply. Each item is a Forms API Request object, e.g. {"createItem": {...}} or {"updateFormInfo": {...}}
    include_form_in_responseboolean
    Whether the response should include the updated form, including its full item list
    required_revision_idstring
    If set, the update is rejected unless the form's current revision ID matches this value, protecting against concurrent edits
  • googleforms_create_formCreate a new Google Form with a title and optional document title.Write

    Create Google Form

    Create a new Google Form with a title and optional document title. Returns the new form's ID and metadata.

    Inputs

    titlestringrequired
    The title of the form shown to respondents
    document_titlestring
    The title of the document shown in Google Drive (defaults to the form title if not provided)
  • googleforms_create_watchCreate a watch on a Google Form that publishes a Cloud Pub/Sub notification when the form's schema changes or a new response is submitted.Write

    Create Form Watch

    Create a watch on a Google Form that publishes a Cloud Pub/Sub notification when the form's schema changes or a new response is submitted. Watches expire seven days after creation unless renewed, and a form allows at most one watch per event type per project.

    Inputs

    event_typestringrequired
    The type of form event that triggers a notification. One of: 'SCHEMA' (form content/settings changes) or 'RESPONSES' (a new response is submitted).one of SCHEMARESPONSES
    form_idstringrequired
    The ID of the Google Form to watch
    topic_namestringrequired
    The fully qualified name of the Cloud Pub/Sub topic to publish notifications to
    watch_idstring
    Optional ID to assign to the new watch (4-63 lowercase letters, digits, or hyphens). If omitted, one is auto-generated.
  • googleforms_renew_watchRenew an existing watch on a Google Form for another seven days from now.Write

    Renew Form Watch

    Renew an existing watch on a Google Form for another seven days from now. Watches expire seven days after creation (or after the last renewal) unless renewed again.

    Inputs

    form_idstringrequired
    The ID of the Google Form the watch belongs to
    watch_idstringrequired
    The ID of the watch to renew

Workflows

Proxy API call
const result = await actions.request({
connectionName: 'googleforms',
identifier: 'user_123',
path: '/v1/forms',
method: 'GET',
});
console.log(result);
Execute a tool
const result = await actions.executeTool({
connector: 'googleforms',
identifier: 'user_123',
toolName: 'googleforms_create_form',
toolInput: {},
});
console.log(result);
Google OAuth consent screen verification

Before you use your own Google OAuth credentials in production, understand what end users see on Google’s consent screen when they authorize a connected account.

Audience typeConsent screen behaviorWhen to use
InternalShows your App Name and logo from Branding settingsOnly users in your Google Workspace or Cloud Identity organization can authorize the connector
ExternalShows {env_name}.scalekit.dev until Google verifies your appAny user with a Google account can authorize the connector

Why External is required for most AgentKit connectors:

  • Internal restricts authorization to users in your Google Workspace or Cloud Identity organization. Users with @gmail.com or other Google accounts outside your organization cannot complete OAuth.
  • External is required when end users outside your organization authorize tool access through connected accounts.
  • Organization-managed OAuth clients follow the same rules as personal or developer OAuth clients. Switching to an org-owned client does not bypass Google verification.
  • Until Google completes verification of your External app, users see scalekit.dev on the consent screen. After verification, your App Name and logo appear.

During development:

  • Add Test users under APIs & Services → OAuth consent screen while publishing status is Testing.
  • On unverified apps, users can click Advanced → Go to app (unsafe) to proceed during testing.
  • Google Workspace admins may need to allowlist your OAuth client.

For Google’s verification requirements and timeline, refer to Google’s OAuth consent screen verification guide.