> For the complete documentation index, see [llms.txt](https://guides.noloco.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://guides.noloco.io/settings/mcp-integration.md).

# MCP Integration

Connect AI agents like Claude, ChatGPT, Gemini, and Cursor to your Noloco apps using the Model Context Protocol (MCP), to work with your data and build your apps

{% hint style="info" %}
**New to MCP?** Start with [Connect your own AI agent](/quickstart/connect-an-ai-agent.md). It walks through the Noloco builder MCP and the guides MCP together.
{% endhint %}

Noloco's MCP (Model Context Protocol) servers let AI assistants work on your Noloco apps through natural language. There are two:

* [**Builder MCP**](#builder-mcp): for builders. One connection covers every app where you're a data admin, and on apps you can build, the assistant can build with you.
* [**App MCP**](#app-mcp): for app users. Each app has its own server, and the assistant acts within the user's role.

## Builder MCP

Any connection can list your tables and read records, and with write access it can create, update, and delete them.

If you can build an app yourself, the assistant can build it with you too. It can add tables and fields, set up pages, views, forms, and buttons, write workflows, manage roles and permissions, change app settings, and publish your changes. See [Who can build with the MCP](#who-can-build-with-the-mcp).

One MCP URL covers every Noloco app where you're a data admin:

```
https://api.core.noloco.io/mcp
```

There's no API key. The first time a client calls the server, a browser window opens for you to sign in and pick which apps the client can access and whether it gets read or read + write on each.

<figure><img src="https://319575345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MifpIQWu0HCVYAt51oT%2Fuploads%2Fgit-blob-a53a1d7561cce3c2b5f04aaa10e31b8b94e853ad%2Fmcp-oauth-consent.png?alt=media" alt="" width="375"><figcaption><p>The Noloco consent screen — pick which apps the client can use, and whether it gets read or write on each.</p></figcaption></figure>

{% hint style="warning" %}
A connected client acts with your data admin role on every app you approve. It can read and change every record in those apps, whatever your row-level permissions say. On apps where it can build, it can also change the app itself and publish those changes to your users. Only approve clients you trust.
{% endhint %}

### Connecting an AI Client

The Noloco MCP server uses [Streamable HTTP transport](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http) with OAuth, which all major MCP clients support. Pick your client:

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Claude Desktop</strong></td><td>One-click connector link</td><td><a href="https://319575345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MifpIQWu0HCVYAt51oT%2Fuploads%2Fgit-blob-c3ff010be2e67e022cc2250be06027150fedaa03%2Fmcp-client-claude.svg?alt=media">mcp-client-claude.svg</a></td><td><a href="#claude-desktop">#claude-desktop</a></td></tr><tr><td><strong>Claude Code</strong></td><td>A single CLI command</td><td><a href="https://319575345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MifpIQWu0HCVYAt51oT%2Fuploads%2Fgit-blob-c3ff010be2e67e022cc2250be06027150fedaa03%2Fmcp-client-claude.svg?alt=media">mcp-client-claude.svg</a></td><td><a href="#claude-code">#claude-code</a></td></tr><tr><td><strong>Cursor &#x26; Windsurf</strong></td><td>Paste one JSON block</td><td><a href="https://319575345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MifpIQWu0HCVYAt51oT%2Fuploads%2Fgit-blob-8165d6d9e564c0f960d6154cb5ec7cc101a971c9%2Fmcp-client-cursor-windsurf.svg?alt=media">mcp-client-cursor-windsurf.svg</a></td><td><a href="#cursor-and-windsurf">#cursor-and-windsurf</a></td></tr><tr><td><strong>ChatGPT</strong></td><td>One-click plugin link</td><td><a href="https://319575345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MifpIQWu0HCVYAt51oT%2Fuploads%2Fgit-blob-cee3918fdf3f5605514792b80a34b32a4dacf9ef%2Fmcp-client-chatgpt.svg?alt=media">mcp-client-chatgpt.svg</a></td><td><a href="#chatgpt">#chatgpt</a></td></tr><tr><td><strong>Gemini</strong></td><td>Paste the server URL as a custom connector</td><td><a href="https://319575345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MifpIQWu0HCVYAt51oT%2Fuploads%2Fgit-blob-be0dedc990d596749fb83d57b91c52c691a3b4eb%2Fmcp-client-gemini.svg?alt=media">mcp-client-gemini.svg</a></td><td><a href="#gemini">#gemini</a></td></tr><tr><td><strong>Other MCP clients</strong></td><td>Anything supporting OAuth over Streamable HTTP</td><td><a href="https://319575345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MifpIQWu0HCVYAt51oT%2Fuploads%2Fgit-blob-f6f61a1301810b5f4f06158cdb245dc72edf1888%2Fmcp-client-mcp.svg?alt=media">mcp-client-mcp.svg</a></td><td><a href="#other-mcp-clients">#other-mcp-clients</a></td></tr></tbody></table>

#### Claude Desktop

The quickest route is one click: [**Add Noloco to Claude**](https://claude.ai/directory/noloco). That link opens the Noloco connector in Claude's directory — click **Connect**, and the Noloco consent screen opens in your browser.

You can also find it from **Settings → Connectors**: browse the directory, search for **Noloco**, and click **Connect**.

{% hint style="info" %}
If your organization restricts the connector directory, you can still add Noloco as a custom connector: click **Add custom connector**, enter a name (e.g. `Noloco`) and `https://api.core.noloco.io/mcp` as the remote MCP server URL, then click **Add**. Free Claude plans are limited to **one** custom connector.
{% endhint %}

#### Claude Code

Run:

```bash
claude mcp add --transport http -s user noloco https://api.core.noloco.io/mcp
```

`-s user` makes Noloco available in every project. Leave it out to add Noloco only to the folder you run the command in.

The next time you start a session, Claude Code shows that Noloco needs sign-in. Run `/mcp`, pick **noloco**, and choose **Authenticate** to open the consent screen. You can also run `claude mcp login noloco` from your terminal.

#### Cursor & Windsurf

Open the MCP settings panel and add:

```json
{
  "mcpServers": {
    "noloco": {
      "url": "https://api.core.noloco.io/mcp"
    }
  }
}
```

The first tool call opens the consent screen.

#### ChatGPT

The quickest route is one click: [**Add Noloco to ChatGPT**](https://chatgpt.com/plugins/plugin_asdk_app_6ae1e0d67d688191b1dbffdf37677595). That link opens the Noloco plugin in ChatGPT's plugin directory. Click **Install plugin**, then **Connect Noloco**. The Noloco consent screen opens for you to sign in and pick which apps ChatGPT can access.

You can also open **Plugins** in ChatGPT and search for **Noloco**.

If your workspace admin hasn't allowed public plugins, or the plugin directory isn't available to you, add Noloco as a custom MCP server instead. It works on the free plan and doesn't need developer mode.

1. Open **Plugins** in ChatGPT ([chatgpt.com/plugins](https://chatgpt.com/plugins)).
2. Click **Add**, then **Add custom MCP server**.
3. Fill in the form like this:

<table><thead><tr><th width="170">Field</th><th>What to enter</th></tr></thead><tbody><tr><td><strong>Choose icon</strong></td><td>Optional, so you can skip it. It takes a PNG up to 10 KB.</td></tr><tr><td><strong>Name</strong></td><td><code>Noloco</code></td></tr><tr><td><strong>Description</strong></td><td><code>Work with and build my Noloco apps. Use this to list my Noloco projects, read and change the records in their tables, and, on apps I can build, change tables, fields, pages, views, forms, buttons, workflows, roles, permissions, and settings, then publish the app.</code></td></tr><tr><td><strong>Connection</strong></td><td>Pick <strong>Server URL</strong>, not <strong>Tunnel</strong>, and enter <code>https://api.core.noloco.io/mcp</code>, including the <code>/mcp</code> path</td></tr><tr><td><strong>Authentication</strong></td><td><strong>OAuth</strong></td></tr></tbody></table>

4. Below the form, ChatGPT warns that custom MCP servers introduce risk. Tick **I understand and want to continue**.
5. Click **Create as a plugin**. ChatGPT shows the Noloco tools it found.

The **Description** is marked optional, but it's worth filling in. ChatGPT reads it when deciding whether a question calls for Noloco, so with a vague one it may skip Noloco when you wanted it. Feel free to make it more specific to your own apps, for example by naming the tables you use most.

You can leave **Advanced OAuth settings** alone. ChatGPT finds our OAuth details from the server URL and registers itself, so there's no client ID or secret to paste. Open that panel and you'll see the settings already filled in.

The first time you use the plugin, the Noloco consent screen opens for you to sign in and pick which apps ChatGPT can access.

{% hint style="warning" %}
ChatGPT shows the same warning for every custom MCP server. It's about who built the server, not whether this URL is safe. Before you continue, check that the server URL reads exactly `https://api.core.noloco.io/mcp`.
{% endhint %}

{% hint style="info" %}
**On a Business or Enterprise workspace?** Your workspace admin decides whether members can add custom MCP servers. If you don't see **Add custom MCP server**, ask them to allow it.
{% endhint %}

#### Gemini

Add Noloco to the Gemini app as a custom connector:

1. On a computer, open [gemini.google.com/customize/connectors](https://gemini.google.com/customize/connectors).
2. Click **Custom**. The **Connect to an MCP server** window opens.
3. Enter `https://api.core.noloco.io/mcp` as the **MCP server URL**, including the `/mcp` path.
4. Click **Next**, then follow the on-screen steps. The Noloco consent screen opens for you to sign in and pick which apps Gemini can access.

<figure><img src="https://319575345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MifpIQWu0HCVYAt51oT%2Fuploads%2Fgit-blob-b6aab031b837be340f98a31c45619106cb8613ed%2Fmcp-gemini-connect-mcp-server.png?alt=media" alt="Gemini&#x27;s Connect to an MCP server window, with the MCP server URL field" width="400"><figcaption><p>Paste the Noloco MCP URL into <strong>MCP server URL</strong>, then click <strong>Next</strong>.</p></figcaption></figure>

You can leave **Additional settings** closed. Gemini finds our OAuth details from the server URL and registers itself, so there's no client ID or secret to paste.

{% hint style="warning" %}
Gemini shows the same note for every custom connector, saying Google hasn't reviewed it. It's about who built the server, not whether this URL is safe. Before you click **Next**, check that the server URL reads exactly `https://api.core.noloco.io/mcp`.
{% endhint %}

Once it's connected, type `@` in a Gemini chat and pick **Noloco** to have Gemini use it for that prompt. You add the connector on the web, and it then works in the Gemini mobile app too.

{% hint style="info" %}
Google doesn't offer custom connectors on every account yet. If you don't see **Custom**, check [Google's help page](https://support.google.com/gemini/answer/17209137) for which accounts and countries can add them.
{% endhint %}

Using the Gemini CLI instead? See [Gemini CLI](/quickstart/connect-an-ai-agent.md#gemini-cli).

#### Other MCP Clients

Any client that supports OAuth over Streamable HTTP can connect. Point it at `https://api.core.noloco.io/mcp` — no header, no key. The client handles the OAuth flow on first connection.

### Who can build with the MCP

Every connection gets the data tools, which work with your records. The build tools change the app itself, the same way you would in the Noloco builder. A connection gets them on an app when all three of these are true:

* You picked **read + write** for that app on the consent screen.
* You have builder access on that app.
* You're a data admin on that app.

The default Team Admin role has both builder access and data admin. See [what each role can do](/users-and-permissions/sharing-your-app.md#what-each-role-can-do).

A read-only connection only gets the data tools, and so does anyone without builder access. `list_projects` tells the assistant which apps it can build on.

If you approved several apps, the build tools show up as soon as one of them allows building. Each call still checks the app it works on, so the assistant can't build on an app where you gave read only or don't have builder access.

### Drafts and publishing

When the assistant changes how your app looks or works, most changes wait as drafts, the same as edits you make in the builder. Your users keep seeing the last published version until the assistant calls `publish_project`. These changes wait as drafts:

* Pages and everything on them, like views, sections, forms, and buttons
* Workflow actions
* Most app settings

Everything else goes live as soon as the assistant makes it, including records, tables, fields, roles, permissions, live mode, and public access.

{% hint style="info" %}
On an app that has never been published, there's no live version yet, so draft changes show up for your users right away.
{% endhint %}

Publishing sends every draft change in the app to your users, including edits other builders haven't published yet. Nothing on the MCP asks you to approve a change, so the server tells the assistant to check with you before it deletes something or publishes. See [Publishing](/settings/publishing.md) for how drafts and versions work.

### Skills

Some jobs take several tools and a few Noloco habits to do well, like adding a field and then showing it on the right lists, forms, and record pages. For these, the server keeps short how-to guides that the assistant reads before it starts. Each guide is called a skill, and the assistant loads one with `load_skill`.

Every connection gets the `records` skill, for reading and writing records. Connections that can build also get:

| Skill            | What it covers                                                                                                                              |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `build-views`    | Creating or restyling a view: picking a layout that suits the data (board, calendar, timeline, map, and more) and the settings it needs     |
| `filters`        | Choosing which records a view loads, including showing people only their own records                                                        |
| `action-buttons` | Adding, changing, or deleting the action buttons on a view                                                                                  |
| `scaffold-app`   | Turning your tables into a usable app: which tables get a page, one view per table with its list, form, and record page, and the navigation |
| `add-field`      | Adding a field and making it show up on lists, forms, the record page, and in permission rules                                              |

The server tells the assistant which skills exist and to load the right one before a job. If a result misses Noloco's usual patterns, ask it to load the skill first, for example: *"Load the build-views skill, then add a board of open jobs."*

### Available Tools

The assistant calls `list_projects` first to see which apps it can use. Every other tool apart from `load_skill` takes the app's name as a `projectName` argument.

Tools marked **Read** only look. Tools marked **Write** change something, so they need **read + write** on that app.

#### Data

Every connection gets these.

| Tool               | What it does                                                                                                                                          | Type  |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----- |
| `list_projects`    | Lists every Noloco app you approved for this client, with the access (read or read + write) granted on each and whether the assistant can build on it | Read  |
| `list_tables`      | Lists the tables in an app                                                                                                                            | Read  |
| `get_table_schema` | Returns a table's fields, their types and options, and its relationships                                                                              | Read  |
| `list_records`     | Fetches records, with optional filters, sorting, and paging                                                                                           | Read  |
| `get_record`       | Fetches one record by its ID                                                                                                                          | Read  |
| `create_record`    | Creates a record                                                                                                                                      | Write |
| `update_record`    | Updates a record by its ID                                                                                                                            | Write |
| `delete_record`    | Deletes a record by its ID                                                                                                                            | Write |
| `load_skill`       | Loads a [skill](#skills)                                                                                                                              | Read  |

The rest are build tools. A connection only gets them when it [can build](#who-can-build-with-the-mcp).

#### Tables and fields

| Tool           | What it does                                                                    | Type  |
| -------------- | ------------------------------------------------------------------------------- | ----- |
| `upsert_table` | Creates a table or changes one                                                  | Write |
| `delete_table` | Deletes a table                                                                 | Write |
| `upsert_field` | Adds a field to a table or changes one                                          | Write |
| `delete_field` | Deletes a field, and reports any formula, lookup, or rollup fields that used it | Write |

#### Pages and views

| Tool                     | What it does                                                                               | Type  |
| ------------------------ | ------------------------------------------------------------------------------------------ | ----- |
| `list_pages`             | Lists the app's pages                                                                      | Read  |
| `get_page`               | Returns everything on one page: its settings, tabs, sections, fields, filters, and buttons | Read  |
| `create_navigation_item` | Adds blank pages, folders, and dividers to the navigation                                  | Write |
| `update_page_settings`   | Renames a page or changes its icon, URL, or who can see it                                 | Write |
| `delete_page`            | Deletes a page                                                                             | Write |
| `upsert_view`            | Creates a view of a table, or changes its layout and settings                              | Write |
| `configure_view_fields`  | Picks which fields a view shows, in what order, and how                                    | Write |
| `sections`               | Adds or changes the sections on a record page, from a plain description of what you want   | Write |
| `manage_canvas`          | Builds or edits a [Canvas](/nola/canvas.md) page                                           | Write |

#### Forms

| Tool                    | What it does                                                                                                                          | Type  |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ----- |
| `configure_form_fields` | Sets up a view's form for adding records: which fields it has, their order, labels, help text, default values, and which are required | Write |

#### Buttons

| Tool                   | What it does                                                                                  | Type  |
| ---------------------- | --------------------------------------------------------------------------------------------- | ----- |
| `upsert_action_button` | Adds or changes an action button on a view, like one that runs a workflow or updates a record | Write |
| `delete_action_button` | Deletes an action button                                                                      | Write |

#### Workflows

| Tool                    | What it does                                                                              | Type  |
| ----------------------- | ----------------------------------------------------------------------------------------- | ----- |
| `list_workflows`        | Lists the app's workflows                                                                 | Read  |
| `list_workflow_actions` | Lists the actions in a workflow, in the order they run                                    | Read  |
| `list_slack_channels`   | Lists the Slack channels a workflow can post to                                           | Read  |
| `upsert_workflow`       | Creates a workflow, or changes its name, description, trigger, or whether it's turned on  | Write |
| `edit_workflow`         | Adds, changes, or removes a workflow's actions, from a plain description of what you want | Write |
| `delete_workflow`       | Deletes a workflow                                                                        | Write |

#### Users and permissions

| Tool                 | What it does                                                                                                                          | Type  |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ----- |
| `list_project_users` | Lists the people in the app                                                                                                           | Read  |
| `list_roles`         | Lists the app's user roles                                                                                                            | Read  |
| `upsert_roles`       | Creates a role or changes one                                                                                                         | Write |
| `list_permissions`   | Lists the permission rules on a table                                                                                                 | Read  |
| `upsert_permission`  | Creates or changes a permission rule: which roles can see, add, or change a table's records, which fields they see, and which records | Write |

#### Settings and publishing

| Tool                     | What it does                                                                                      | Type  |
| ------------------------ | ------------------------------------------------------------------------------------------------- | ----- |
| `get_project_settings`   | Reads the app's settings                                                                          | Read  |
| `update_project_setting` | Changes an app setting, like layout and design, emails, or login and sign up                      | Write |
| `list_version_history`   | Lists the app's published versions                                                                | Read  |
| `publish_project`        | Sends every draft change in the app to your users                                                 | Write |
| `toggle_live_mode`       | Switches the whole app between [live mode](/settings/general-settings/live-mode.md) and test mode | Write |

Some settings need sign-in details, rich templates, or a set-up flow, so you still change them in the builder: custom domains, custom email servers, Google and SAML sign-in, spaces, and invitation email templates.

{% hint style="info" %}
`sections`, `manage_canvas`, and `edit_workflow` hand the job to Noloco's own AI, the same one behind [Nola](/nola.md). Each call uses your team's [AI credits](/nola/credits-and-usage.md), and only one of them runs at a time on an app from the same connection.
{% endhint %}

### Security and Access Management

* **OAuth, not API keys.** No long-lived secret is stored in the client config.
* **Per-app role check on every call.** Each call checks your current roles on the app. If you lose data admin access, the next call from any connected client is rejected. If you lose builder access, the build tools stop working on that app. No new token is needed.
* **Per-client revocation.** Each client has its own OAuth token; revoking one doesn't affect the others.
* **Scope chosen at sign-in.** Pick read-only or read + write per app on the consent screen. Re-run the flow any time to change either. A read-only app never gets the build tools.
* **Drafts until published.** Changes to pages, workflow actions, and most settings wait until the assistant publishes. See [Drafts and publishing](#drafts-and-publishing).
* **HTTPS only.**

## App MCP

Each app has its own MCP server, so the people using your app can connect their own AI assistant:

```
https://api.core.noloco.io/mcp/apps/<app-name>
```

The assistant acts as the user who connected it, so their record-level and field-level permissions apply.

* **Who can connect:** set by each role's [Agent access](/users-and-permissions/user-roles-and-permissions.md#agent-access) (None, Read, or Read & write). Only roles with **Access all data** have access by default.
* **How users connect:** from **Connect AI Assistant (MCP)** in the app's profile menu. See [Connect your AI to an app](/settings/mcp-integration/connect-your-ai-to-an-app.md).
* **Tools:** data tools only: `list_tables`, `get_table_schema`, `list_records`, and `get_record`, plus `create_record` and `update_record` with Read & write. No build tools, and no `delete_record`.
* **Seats:** agent use counts as activity for the user's seat.

## FAQ

{% content-ref url="/pages/RcBhKRljI9jgmDkTf9Pm" %}
[MCP FAQ](/settings/mcp-integration/mcp-faq.md)
{% endcontent-ref %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://guides.noloco.io/settings/mcp-integration.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
