Agentic SEO Tools
All posts
By Agentic SEO Tools Teamagentic-seomcpcity-level trackinghow-to

How to automate city-level AI visibility tracking with MCP

Use an AI agent and Promptwatch's MCP server to create one monitor per city, load the same prompts into each, and get a weekly digest of which cities moved and why. A working setup, step by step.

Setting up city tracking by hand is tedious in a way that invites mistakes. Twelve cities times twenty prompts is 240 rows, and one typo in the Phoenix copy of a prompt means Phoenix is no longer comparable with Denver. It's exactly the kind of job an agent should do.

This walkthrough uses Promptwatch, because its MCP server exposes city targeting directly and the same server returns the crawler and citation data you need to explain the results. The MCP server and REST API are on every paid plan. City and state targeting themselves are included from Business ($579/mo) and on every agency plan from Kick-off ($199/mo), so make sure the account is on one of those before you start.

How Promptwatch models a city

The unit is a monitor. When you create one through MCP (createMonitor), you pass:

  • a name and the models to run, using IDs from listModels
  • countryCode, a two-letter code that defaults to US
  • stateCode, optional, in the form us_california
  • cityCode, optional, in the form los_angeles
  • languageCode, defaulting to en-US
  • personaId, optional, from listPersonas

Prompts belong to a monitor and inherit all of that. So "one monitor per city, identical prompts in each" is the whole design. The schema also notes that mainland China isn't a supported target country.

Step 1: give the agent a city list and a prompt list

Connect the Promptwatch MCP server to your agent of choice. Promptwatch also lists a Claude Connector and a ChatGPT plugin. Then hand it two inputs: the cities, with state where it matters, and a frozen list of prompts with a type for each (organic, brand-specific or competitor comparison).

A prompt to the agent can be as plain as: "In project Acme Plumbing, create one monitor per city in this list, using ChatGPT, Gemini and Perplexity, and add these 15 prompts to each monitor exactly as written. Name each monitor 'City, State'."

The agent calls listProjects and listModels, then createMonitor once per city with the prompts passed as initialPrompts. If you'd rather start from generated prompts, generatePrompts builds them from the project's crawled site description, in up to three batches and 50 prompts per call.

Step 2: check the setup before it runs for a week

Ask the agent to list the monitors and prompts back (listMonitors, listPrompts) and confirm every city has the same count and wording. This is the step people skip. It's also the step that catches a monitor created without a city code, which then silently tracks the whole country.

Watch your budget. Every prompt on every model on every daily run is one response. Fifteen prompts on three models is about 1,350 responses per city per month. Kick-off has 10,000, so seven cities. Growth has 25,000. On Business, the 350-prompt cap usually binds first because each city's copy of a prompt counts separately.

Step 3: schedule a weekly city digest

Once two weeks of data exist, have the agent run a weekly job:

  1. Pull visibility per monitor (getVisibilityTimeSeries) and flag cities that moved more than your threshold.
  2. For each flagged city, fetch the cited sources (getCitations, getCitationTopPages) and the competitors named (getTopCompetitors).
  3. Check whether AI crawlers reached the relevant location page (getTopCrawlerPages, getCrawlerTrend). This is Agent Analytics data, so it needs the crawler-log integration set up through your CDN or host.
  4. Check AI-referred visitors and where they came from (getVisitorTopLocations, getVisitorReferrerStats).
  5. Write a short summary per city: what moved, which source changed, whether the page was crawled.

Promptwatch's own Agent Chat can answer the same questions in its UI, but an external agent lets you post the digest to Slack or a client doc on your schedule.

Step 4: turn findings into work, with a person in the loop

The agent can file what it found as action items (createActionItem), so they land on the same board as Promptwatch's Unified Actions. Content gaps per city come from listContentGapPrompts and getContentGapRecommendations.

On Business, the Content Agent can draft a page for a gap. Drafts go to a review inbox, and nothing goes live on WordPress, Webflow or Framer until someone approves it. Keep it that way for location pages. An agent will happily write a page about a city you don't serve, and a page with no real local facts is worse than no page. One Framer detail: publishing redeploys the whole Framer site, not a single item.

What this setup gets you

Twelve identical city monitors in minutes instead of an afternoon, with no drift in wording. A weekly note that says "Phoenix dropped because the answer switched to a local guide we're not in, and PerplexityBot got errors on /phoenix/." And a queue of fixes a human approves.

You can wire a tracker without crawler logs or conversion data into an agent the same way. The digest just stops at "Phoenix dropped." The reason to do this on Promptwatch is that the agent can reach the why in the same server.