> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to the Netlify MCP server

The Netlify MCP connector routes your AI agent's tool calls to Netlify's own MCP server through Scalekit. Each user signs in to Netlify once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 9 tools.

**Authentication:** OAuth 2.1/DCR
**Categories:** Developer Tools, Automation, Productivity
**Tools:** 9: 6 read, 1 write, 2 destructive
**Users sign in with:** OAuth
**OAuth app:** Scalekit's or your own
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=NETLIFYMCP)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Netlify MCP connection

   In **AgentKit > Connections**, create a Netlify MCP connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

   Scalekit credentials are available for Netlify MCP server, so you don't need to register an OAuth app.

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   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 = 'netlifymcp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Netlify MCP:', 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: 'netlifymcp_get_netlify_coding_context',
     toolInput: { creationType: 'serverless' },
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "netlifymcp"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Netlify MCP:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={"creationType":"serverless"},
       tool_name="netlifymcp_get_netlify_coding_context",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'netlifymcp_get_netlify_coding_context',
  toolInput: {
    creationType: 'serverless',
  },
  connector: 'netlifymcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="netlifymcp_get_netlify_coding_context",
    tool_input={
        "creationType": "serverless",
    },
    connection_name="netlifymcp",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `netlifymcp_get_netlify_coding_context`

Get Netlify Coding Context · Read-only

ALWAYS call when writing code. Required step before creating or editing any type of Netlify functions, SDK/library usage, etc. Returns up-to-date code patterns and guidance for the selected creation type.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `creationType` (`string`, required): The type of Netlify feature to get coding context for. One of: `serverless`, `edge-functions`, `blobs`, `image-cdn`, `forms`, `db`.

Example input: `{"creationType":"serverless"}`

### `netlifymcp_netlify_deploy_services_reader`

Netlify Deploy Services Reader · Read-only

Read Netlify deploy information. Supports operations: get-deploy (retrieve a deploy by ID), get-deploy-for-site (retrieve a specific deploy for a site).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `selectSchema` (`string`, required): Operation selector. Choose 'get-deploy' to retrieve a deploy by ID, or 'get-deploy-for-site' to retrieve a deploy for a specific site.

Example input: `{"selectSchema":"<selectSchema>"}`

### `netlifymcp_netlify_extension_services_reader`

Netlify Extension Services Reader · Read-only

Read Netlify extension information. Supports operations: get-extensions (list all available Netlify extensions), get-full-extension-details (retrieve detailed information about a specific extension for a team).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `selectSchema` (`string`, required): Operation selector. Use 'get-extensions' to list all extensions, or 'get-full-extension-details' with extensionSlug and teamId to get details for a specific extension.

Example input: `{"selectSchema":"<selectSchema>"}`

### `netlifymcp_netlify_project_services_reader`

Netlify Project Services Reader · Read-only

Read Netlify project/site information. Supports operations: get-project (get a site by ID), get-projects (list sites, optionally filtered by team or name), get-forms-for-project (get forms for a site).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `selectSchema` (`string`, required): Operation selector. Choose 'get-project', 'get-projects', or 'get-forms-for-project'.

Example input: `{"selectSchema":"<selectSchema>"}`

### `netlifymcp_netlify_team_services_reader`

Netlify Team Services Reader · Read-only

Read Netlify team information. Supports operations: get-teams (list all teams for the current user), get-team (retrieve a specific team by ID).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `selectSchema` (`string`, required): Operation selector. Use 'get-teams' to list all teams, or 'get-team' with a teamId to get a specific team.

Example input: `{"selectSchema":"<selectSchema>"}`

### `netlifymcp_netlify_user_services_reader`

Netlify User Services Reader · Read-only

Read Netlify user information. Supports operation: get-user (returns the currently authenticated user's profile).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `selectSchema` (`object`, required): Operation selector. Set operation to 'get-user' to retrieve the current user's profile.

Example input: `{"selectSchema":{}}`

### `netlifymcp_netlify_deploy_services_updater`

Netlify Deploy Services Updater · Write

Write operations for Netlify deployments. Supports operation: deploy-site (trigger a new deploy for an existing Netlify site).

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `selectSchema` (`object`, required): Operation selector. Use operation='deploy-site' with a siteId to trigger a deploy.

Example input: `{"selectSchema":{}}`

### `netlifymcp_netlify_extension_services_updater`

Netlify Extension Services Updater · Destructive

Write operations for Netlify extensions. Supports operations: change-extension-installation (install or uninstall a Netlify extension for a team or site), initialize-database (initialize the Netlify database extension).

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `selectSchema` (`string`, required): Operation selector. Use 'change-extension-installation' to install or uninstall an extension, or 'initialize-database' to set up the Netlify database extension.

Example input: `{"selectSchema":"<selectSchema>"}`

### `netlifymcp_netlify_project_services_updater`

Netlify Project Services Updater · Destructive

Write operations for Netlify projects/sites. Supports operations: update-visitor-access-controls (set password or SSO login requirements), update-forms (enable or disable Netlify Forms), manage-form-submissions (list or delete form submissions), update-project-name (rename a site), manage-env-vars (get, set, or delete environment variables), create-new-project (create a new Netlify site).

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `selectSchema` (`string`, required): Operation selector. Choose one of: update-visitor-access-controls, update-forms, manage-form-submissions, update-project-name, manage-env-vars, create-new-project.

Example input: `{"selectSchema":"<selectSchema>"}`

## Related

Other Developer Tools connectors ([all 94](/agentkit/connectors/?category=developer-tools)):

- [GitHub](/agentkit/connectors/github/): Scalekit connector, OAuth, 217 tools
- [Datadog](/agentkit/connectors/datadog/): Scalekit connector, API key, 105 tools
- [Linear](/agentkit/connectors/linear/): Scalekit connector, OAuth, 62 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
