# MCP for AI assistants

Connect Citypicked to Claude, ChatGPT, Claude Code or Cursor. Then ask in plain language, and your assistant sends review requests and reads your results.

Source: https://citypicked.com/en/developers/mcp

MCP server URL: `https://mcp.citypicked.com/mcp`

The server speaks MCP over streamable HTTP. Assistants that sign in use OAuth, so nobody copies a key ([how it works](https://citypicked.com/en/developers/authentication#oauth)). Tools that cannot sign in send an API key as a header.

## Claude

1. On Free, Pro or Max, open **Customize > Connectors > Add custom connector**. On Team and Enterprise, an owner adds it under **Organization settings > Connectors > Add > Custom > Web**, then members press **Connect**
2. Name it `Citypicked` and paste the URL `https://mcp.citypicked.com/mcp`. Leave the OAuth client ID and secret empty. Press **Add**
3. Press **Connect**. Citypicked opens, you sign in, check what Claude may do and press **Allow**

## ChatGPT

1. Open **Plugins > + > Add custom MCP server**. In older menus it is **Settings > Apps & Connectors > Advanced settings > Developer mode**, then **Create**. On Business and Enterprise an admin may need to allow custom servers
2. Name it `Citypicked`, paste the server URL `https://mcp.citypicked.com/mcp` and pick **OAuth** as the authentication. Press **Create**
3. Connect. Citypicked opens, you sign in, check what ChatGPT may do and press **Allow**

## Claude Code

Add the server, then run `/mcp` in Claude Code and pick Citypicked to sign in.

```bash
claude mcp add --transport http citypicked https://mcp.citypicked.com/mcp
```

Or with an API key instead of signing in

```bash
claude mcp add --transport http citypicked https://mcp.citypicked.com/mcp \
  --header "Authorization: Bearer cp_live_xxxxxxxx"
```

## Cursor

Add this to `~/.cursor/mcp.json` or to `.cursor/mcp.json` in a project, with your own key.

```json
{
  "mcpServers": {
    "citypicked": {
      "url": "https://mcp.citypicked.com/mcp",
      "headers": {
        "Authorization": "Bearer cp_live_xxxxxxxx"
      }
    }
  }
}
```

## Other clients

Any client with remote MCP servers works the same way. The OpenAI Responses API takes the server as a tool, with your key as a header.

```json
{
  "type": "mcp",
  "server_label": "citypicked",
  "server_url": "https://mcp.citypicked.com/mcp",
  "headers": {
    "Authorization": "Bearer cp_live_xxxxxxxx"
  },
  "require_approval": "always"
}
```

## Tools

| Tool | What it does |
| --- | --- |
| `get_account` | Checks the connection. Account name, plan and language, the scopes, and whether it may send. |
| `list_locations` | Lists the locations it can see, with id, country and review link. |
| `get_review_link` | Gets a location's review link and its QR code, as URLs and as an image. |
| `send_review_request` | Sends one review request to one customer by SMS or email. It shows you the customer, channel and location first and sends only after you say yes. |
| `list_requests` | Lists review requests with status, stars and times. Filter by status, location and date. Contacts come masked. |
| `list_feedback` | Lists private feedback from the review page. Filter by status, location and date. |
| `get_stats` | Numbers for a range of days. Sent, opened, rated, average stars, clicks to review sites and feedback. |

Every tool reads only, except `send_review_request`. It needs `consent: true`, which your assistant may set only when you said the customer agreed, and `confirm: true` after you saw the summary. A retried call within 10 minutes goes out once.

## Example prompts

- “Ask Emma Clark for a review by email, emma@example.com. She agreed when she booked.”
- “How many reviews did we get last month, and what was the average?”
- “Show me this week's private feedback and summarize what people complain about.”
- “Give me the QR code for our review page so I can print it for the counter.”
- “Which requests from yesterday were opened but not rated yet?”

## Limits and safety

- The connection acts as the person who allowed it, with their locations
- A read-only connection cannot send; the assistant has to ask for more
- Sends count against the same limits and credits as the API
- Disconnect any assistant in the app under **Settings > Sending > API**
