# Felt MCP Server

<figure><img src="/files/s4O6zLBGr53xiGdkn6zY" alt=""><figcaption></figcaption></figure>

Felt MCP Server uses the [Module Context Protocol (MCP)](https://modelcontextprotocol.io/docs/getting-started/intro) to connect to AI agents and unlock the full power of Felt. Create maps, query your data warehouse, run spatial analysis, and style your data – all from natural language prompts, using your existing Felt workspace permissions.

{% hint style="success" %}
This feature is only available to customers on the [Enterprise plan](https://felt.com/pricing). [Get in touch](https://felt.com/demo) for access.
{% endhint %}

## What can do you with Felt MCP?

<figure><img src="/files/14GDIC5ttJYeWmtx93Rq" alt=""><figcaption></figcaption></figure>

* **Make maps.** Create, update, and organize maps and projects.
* **Bring in data.** ArcGIS services, WMS, GeoJSON, Shapefiles, your workspace library, Felt's curated public library, or your cloud data sources.
* **Write SQL.** Query Snowflake, BigQuery, Databricks, Postgres, or Redshift. Dialect-aware guidance is built in, so the agent doesn't have to guess.
* **Run spatial analysis.** Query layers already on the map, join them, filter them, and generate new layers from the results.
* **Style automatically.** Categorical, numeric, heatmap, H3. All in Felt Style Language (FSL), with no hand-authored JSON.
* **Collaborate.** Pins, routes, polygons, and notes via GeoJSON. Permissions are inherited from your workspace, so anything the agent produces is immediately shareable under the access controls you already have.

## Connecting to Felt MCP

The Felt MCP Server uses **Streamable HTTP** transport with **OAuth** authentication.

**Server URL:** `https://felt.com/mcp`

When you first connect, your browser will open and prompt you to log in to Felt and authorize access. There are no API keys to manage.

### Claude Code

Run this command in your terminal:

```bash
claude mcp add --transport http felt https://felt.com/mcp --scope user
```

> `--scope user` makes Felt available across all projects. Omit it to scope to the current project, or use `--scope project` to commit it to a shared `.mcp.json`.

Verify in Claude Code with `/mcp` or:

```bash
claude mcp list
```

### Claude Desktop

1. Open Claude Desktop and go to **Settings → Connectors**.
2. Scroll to the bottom and click **Add custom connector**.
3. Enter:
   * **Name:** `Felt`
   * **Remote MCP server URL:** `https://felt.com/mcp`
4. Click **Add**, then click **Connect** and complete the OAuth login in your browser.

{% hint style="warning" %}
Custom connectors require a Free, Pro, Max, Team, or Enterprise plan. On Team/Enterprise, an Owner must add the connector at the organization level first.
{% endhint %}

### ChatGPT

1. Open ChatGPT and go to **Settings → Apps & Connectors → Advanced settings**.
2. Toggle **Developer Mode** on.
3. Return to **Apps & Connectors** and click **Add new connector**.
4. Fill in:
   * **Name:** `Felt`
   * **MCP Server URL:** `https://felt.com/mcp`
   * **Authentication:** OAuth
   * Check **I trust this application**
5. Click **Create** and complete the Felt OAuth login.

{% hint style="warning" %}
Developer Mode is available on Plus, Pro, Business, Enterprise, and Edu plans. On Business/Enterprise/Edu, only admins can enable Developer Mode and publish the connector for the workspace.
{% endhint %}

### Codex

Edit `~/.codex/config.toml` (or run `codex mcp add`) and add:

```toml
[mcp_servers.felt]
url = "https://felt.com/mcp"
```

Then authenticate:

```bash
codex mcp login felt
```

Verify in Codex with `/mcp` or:

```bash
codex mcp list
```

### Gemini CLI

Edit `~/.gemini/settings.json` (user-level) or `.gemini/settings.json` (project-level) and add:

```json
{
  "mcpServers": {
    "felt": {
      "httpUrl": "https://felt.com/mcp"
    }
  }
}
```

Restart Gemini CLI. Inside the CLI:

```bash
/mcp auth felt
```

This launches the Felt OAuth flow. Once authorized, run `/mcp` to confirm Felt is connected.

> You can also use the equivalent CLI command: `gemini mcp add -t http felt https://felt.com/mcp`

### VS Code (GitHub Copilot)

1. Open the Command Palette (`Cmd/Ctrl+Shift+P`) and run **MCP: Open User Configuration** (for global) or create `.vscode/mcp.json` in your project (for workspace-scoped).
2. Add:

```json
{
  "servers": {
    "felt": {
      "type": "http",
      "url": "https://felt.com/mcp"
    }
  }
}
```

3. Save the file. A **Start** CodeLens appears above the server entry — click it to connect and complete OAuth in your browser.
4. Open Copilot Chat, switch to **Agent** mode, and click the tools icon to confirm Felt's tools are listed.

### Cursor

1. Open **Cursor Settings → Tools & MCP** and click **+ New MCP Server**, or create `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project) directly.
2. Add:

```json
{
  "mcpServers": {
    "felt": {
      "url": "https://felt.com/mcp"
    }
  }
}
```

3. Save the file. Return to **Settings → Tools & MCP** — Cursor will start the connection and prompt you for OAuth in a browser window.
4. A green dot next to `felt` confirms it's connected. Felt's tools are then available in Agent mode (`Cmd/Ctrl+I`).

## Tool Reference

A reference of every tool exposed by the Felt MCP server, grouped by purpose.

### Account & workspace

| Tool       | Description                                                                  |
| ---------- | ---------------------------------------------------------------------------- |
| `who_am_i` | Get information about the currently logged-in user and their Felt workspace. |

### Projects

| Tool            | Description                                                           |
| --------------- | --------------------------------------------------------------------- |
| `list_projects` | List all projects in the current workspace.                           |
| `get_project`   | Get details about a specific project, including the maps it contains. |

### Maps

| Tool         | Description                                                                                                                |
| ------------ | -------------------------------------------------------------------------------------------------------------------------- |
| `create_map` | Create a new map in the user's Felt workspace. Optionally sets a title, basemap style, center coordinates, and zoom level. |
| `list_maps`  | List the maps the current user can access, ordered by most recently visited. Supports a fuzzy title filter.                |
| `get_map`    | Get a map's metadata, including its title, location, basemap, and layer count.                                             |
| `update_map` | Update a map's title, basemap style, viewport (center and zoom), or sharing/visibility setting.                            |
| `delete_map` | Delete a map.                                                                                                              |

### Layers – discovery & inspection

| Tool                       | Description                                                                                                                                    |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `get_map_layers`           | Get the list of layers on a map, organized by layer group. Includes layer names, IDs, visibility, and geometry types.                          |
| `get_layer_properties`     | Get a layer's name, description, geometry type, and style. Useful before modifying styling.                                                    |
| `inspect_layer_columns`    | Get the full column schema for a layer: column names, types, sample values, and summary stats. Returns a queryable table name when applicable. |
| `browse_felt_library`      | List Felt's curated library data — boundaries, demographics, infrastructure, and more — that can be added to maps.                             |
| `browse_workspace_library` | List layers published to the workspace library, available for use on multiple maps.                                                            |

### Layers – creating & adding

| Tool                            | Description                                                                                                                                                                 |
| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `duplicate_layer_to_map`        | Copy a layer onto a map. The source can be a Felt library dataset, a workspace library layer, or a layer from another map.                                                  |
| `import_layer_from_url`         | Add a new layer to a map by fetching from a URL. Supports ArcGIS services, WMS, GeoJSON, Shapefiles, and other formats.                                                     |
| `prepare_file_upload`           | Get a presigned S3 upload slot for adding a local file to a map as a new layer.                                                                                             |
| `upload_contents_to_map`        | Add inline text content (CSV, TSV, GeoJSON, KML, GPX) to a map as a new layer without performing a separate file upload. Best for small data already available as a string. |
| `add_data_source_table_to_map`  | Add an entire table from a connected data source to a map as a new layer.                                                                                                   |
| `create_layer_from_data_source` | Create a new map layer from a SQL query against a connected data source. The query must include a geometry column.                                                          |

### Layers – updating & deleting

| Tool                           | Description                                                                                                                                   |
| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `update_layer_properties`      | Update a layer's name, description, or FSL style. Only the fields you supply are changed.                                                     |
| `refresh_url_layer`            | Re-fetch a URL-backed layer's source to pick up the latest data. Processing is asynchronous.                                                  |
| `refresh_data_source_layer`    | Re-run a data-source-backed layer's query (or re-read its table) to pick up the latest data. Processing is asynchronous.                      |
| `poll_layer_processing_status` | Wait for a layer to finish processing. Returns `in_progress`, `completed`, or `failed`. Configurable maximum wait of 1, 5, 10, or 30 seconds. |
| `delete_layer`                 | Delete a layer from a map.                                                                                                                    |

### Data sources

| Tool                                | Description                                                                                                                                               |
| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `browse_data_sources`               | List external databases connected to the workspace (Postgres, Snowflake, BigQuery, etc.), including their type and the SQL dialect to use.                |
| `browse_data_source_tables`         | List the tables and saved queries available inside a connected database. Does not include column schemas.                                                 |
| `inspect_data_source_table_columns` | Get the column names and types for a specific table inside a connected database.                                                                          |
| `get_sql_guidance`                  | Load the SQL dialect reference and syntax rules for a data source or set of layers before writing queries. The correct dialect is resolved automatically. |
| `get_tabular_data_from_data_source` | Run a read-only SELECT query against a connected data source and return tabular results to the user. Does not render anything on the map.                 |

### Styling

| Tool           | Description                                                                                                                                                                                                                                                                  |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `generate_fsl` | Generate FSL (Felt Style Language) JSON for any layer type (points, lines, polygons, rasters, heatmaps, H3 hexbins). Supports colors, classification, labels, popups, filters, and icons. When given a layer ID, inspects the layer's data to make informed styling choices. |

### Annotations

| Tool                 | Description                                                                                                                                                         |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `list_annotations`   | Return the editable annotations on a map (`Place`, `Rectangle`, `Circle`, `Text`, `Note`, `Link`, `Line`). Other annotation types drawn in the UI are not included. |
| `upsert_annotations` | Create or update annotations on a map. Omit `id` to create; include `id` to update an existing annotation in place.                                                 |
| `delete_annotation`  | Delete a single annotation from a map.                                                                                                                              |


---

# Agent Instructions: Querying This Documentation

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

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.felt.com/felt-ai/mcp.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
