> ## Documentation Index
> Fetch the complete documentation index at: https://ngquct-docs-fix-500-query-results.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP Clients

> Connect Claude Desktop, Claude Code, Cursor, VS Code, Cline, Continue, Zed, Windsurf, Antigravity, Goose, and custom clients to TablePro

Paste one absolute path into your client's MCP config and stop there. `tablepro-mcp` ships inside the app bundle; it starts TablePro when nothing is running, reads the port, and carries the token, so none of those end up in the file.

```json theme={null}
{
  "mcpServers": {
    "tablepro": {
      "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp"
    }
  }
}
```

For an install outside `/Applications`, use your own bundle's path. Setapp puts it at `~/Applications/Setapp/TablePro.app/Contents/MacOS/tablepro-mcp`.

## Clients that take the JSON above

Only the config file differs.

| Client         | Config file                                                       | How to open it                                                                                 |
| -------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` | **Settings > Developer > Edit Config**, then restart Claude Desktop                            |
| Cursor         | `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project)     | **Settings > MCP > + Add new global MCP server**, then restart Cursor                          |
| Cline          | `cline_mcp_settings.json`                                         | Cline panel > MCP Servers icon > **Configure MCP Servers**                                     |
| Windsurf       | `~/.codeium/windsurf/mcp_config.json`                             | MCP icon in the Cascade panel > **Configure**, then restart Cascade                            |
| Antigravity    | `~/.gemini/antigravity/mcp_config.json`                           | Chat panel `…` menu > **MCP Servers > Manage MCP Servers > View raw config**, then **Refresh** |

## Claude Code

```bash theme={null}
claude mcp add tablepro -- /Applications/TablePro.app/Contents/MacOS/tablepro-mcp
```

The double dash separates Claude Code's flags from the command it runs. stdio is the default transport. Verify with `claude mcp list`.

## VS code

Native MCP support arrived in 1.99. Run **MCP: Open User Configuration** from the Command Palette, or create `.vscode/mcp.json` in the workspace. The top-level key is `servers`, not `mcpServers`:

```json theme={null}
{
  "servers": {
    "tablepro": {
      "type": "stdio",
      "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp"
    }
  }
}
```

Open Copilot Chat in agent mode and confirm the TablePro tools appear in the tools picker.

## Continue

Continue reads MCP configs from `.continue/mcpServers/` in your workspace. Create `.continue/mcpServers/tablepro.yaml`:

```yaml theme={null}
mcpServers:
  - name: tablepro
    type: stdio
    command: /Applications/TablePro.app/Contents/MacOS/tablepro-mcp
```

Reload Continue's config from the gear menu.

## Zed

Zed keys MCP servers under `context_servers` (not `mcpServers`) in `~/.config/zed/settings.json`:

```json theme={null}
{
  "context_servers": {
    "tablepro": {
      "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp"
    }
  }
}
```

Or use the Agent Panel: header menu > **Settings > MCP Servers > + Add Custom Server > Local** tab. That dialog requires an `"args": []` field even though the settings-file form treats it as optional.

## Goose

Run `goose configure`, choose **Add Extension > Command-line Extension**, name it `tablepro`, and enter the binary path as the command. Or add to `~/.config/goose/config.yaml` by hand:

```yaml theme={null}
extensions:
  tablepro:
    type: stdio
    cmd: /Applications/TablePro.app/Contents/MacOS/tablepro-mcp
    enabled: true
    timeout: 300
```

Run `goose session` and ask for the tool list to confirm.

## Setup snippets in TablePro

Click **Connect a Client…** in **Settings > Integrations**. The sheet covers Claude Desktop, Claude Code, Cursor, and Zed, with numbered steps and copyable snippets that already carry the right binary path for your install.

## What the config leaves out

TablePro does not have to be open first. Finding no trusted handshake, the bridge runs `open -g tablepro://integrations/start-mcp` and polls for one every 200ms for up to 10 seconds. A TablePro started that way stays out of the Dock, the app switcher and the menu bar until it has a window to show; open the app yourself and it behaves normally for the rest of that run.

The token is not yours to manage either. Each server start mints one named `__stdio_bridge__`, writes it into the handshake file, and rotates it 15 minutes before its one-hour expiry. It is **Read & Write**, so an agent on the bridge can read and write but cannot call `confirm_destructive_operation`.

The port is absent for the same reason: TablePro writes the port it actually bound into the handshake file, so a conflict resolves itself and your config never changes.

Two installs share that one handshake file, so the bridge reaches whichever TablePro is running rather than the bundle whose path you configured. Quit the one you do not want.

<Note>
  For a narrower scope than `readWrite`, or a connection allowlist, use the [HTTP transport](#http-transport) with a token you mint yourself.
</Note>

## HTTP transport

Use HTTP when the client cannot spawn a local process. Mint a token in **Settings > Integrations > Authentication** and point the client at the server:

```json theme={null}
{
  "mcpServers": {
    "tablepro": {
      "url": "http://127.0.0.1:23508/mcp",
      "headers": {
        "Authorization": "Bearer tp_your_token_here"
      }
    }
  }
}
```

Replace `23508` with the port shown in **Settings > Integrations**. Other clients use the same `url` plus `headers` shape, sometimes under `type: streamable-http`. Check the client's docs.

Three things change on this route. The server binds `127.0.0.1` over plain HTTP with no remote mode and no TLS, so a client on another machine needs an SSH port forward. `GET /mcp` answers `405`, so a client that opens a `GET` stream for notifications fails; notifications ride the response stream of the request they belong to. And `2025-11-25` and `2025-06-18` still work through the old `initialize` handshake and `Mcp-Session-Id`, while `2025-03-26` is refused.

Writing a client against `2026-07-28` directly means sending the required `_meta` and headers on every request. See [MCP Protocol](/external-api/mcp-protocol).

## Check it worked

Ask the client to list TablePro tools, or call `list_connections`.

<Check>
  The tool list contains `list_connections`, `list_tables`, `describe_table` and `execute_query`, and `list_connections` returns your saved connections.
</Check>

Clients see the full [tool catalog](/external-api/mcp-tools), the [resources](/external-api/mcp-resources) and the [prompts](/external-api/mcp-prompts), and the server's instructions tell the model to start from `list_connections` and call `describe_table` before writing SQL. A connection's **External Clients** level and the token's scope still apply on top of that.

## When it does not work

The bridge writes its failure to stderr and as a JSON-RPC error, so the message in the client names the layer that refused.

### TablePro is not running

The bridge could not launch the app, or got no trusted handshake within 10 seconds. Open TablePro and check that **Settings > Integrations** shows the server running; if it does, toggle **Enable MCP Server** off and on, then relaunch the client.

### The local MCP endpoint did not prove it belongs to TablePro

The handshake file points at a process the bridge will not trust, usually one left behind by a TablePro that is gone. Quit TablePro, delete `~/Library/Application Support/TablePro/mcp-handshake.json`, and reopen the app, which rewrites it.

### This TablePro build does not speak 2026-07-28

The bridge is newer than the app it found. Update TablePro.

### This connection is read only for external clients

**External Clients** on that connection is **Read Only** and the statement writes. Change it in the connection editor's **Advanced** pane, or run the query in the app's editor.

### Forbidden (`-33007`)

**External Clients** is **Blocked**, the connection's AI policy is **Never**, or the token's allowlist excludes it. Any of the three also hides the connection from `list_connections`.

### Unauthenticated (`-33009`)

The bridge token is stale. The bridge re-reads the handshake and retries once on its own, so this reaches you only when TablePro is not running.

### Rate limited (`-33010`)

Five failed auth attempts inside 60 seconds triggered a 5-minute lockout. Wait it out, or restart TablePro. The other [rate limits](/external-api/tokens#rate-limits) return the same code.
