Docs ← Back to dashboard
Start free Get API key

MCP Server

The MCP server lets an AI app that supports MCP find local businesses, run one search across many places, export the results, look up websites you already have and check your credits, all from a chat. It can also build websites and preview sites for the businesses you find, change a finished website and make Online Presence Reports. It uses the same credits as the dashboard, the Prospecting API and the Websites API.


Server URL

url
https://showfirst.app/api/mcp

The server address is https://showfirst.app/api/mcp. It uses the Streamable HTTP transport. Every request is a POST.

Connect in claude.ai

  1. Open Settings, then Connectors, then Add custom connector.
  2. Paste the server URL, https://showfirst.app/api/mcp, and click Add.
  3. Click Connect. Sign in to ShowFirst and press Allow.

No API key is needed. After you sign in, Claude acts as your account and uses your credits.


Authentication

There are two ways to connect.

Sign in. ChatGPT, claude.ai and other apps that support MCP sign-in ask you to sign in to ShowFirst and press Allow. No API key is needed. The app then acts as your account.

API key. Other apps send your API key as a bearer token on every request:

text
Authorization: Bearer YOUR_API_KEY

To create one, open API Keys in your dashboard, type a name in the Key label box, and click + Create New Key. The full key is shown once. Treat it like a password: do not paste it into a shared file or a public repository.

For apps that cannot set an Authorization header, the key can also be sent as an x-api-key header.

A missing, unknown or revoked key, or an expired sign-in, gets 401. The 401 says where to sign in, so apps that support sign-in start it on their own.


Connect Claude Code

Run this in a terminal:

shell
claude mcp add --transport http showfirst https://showfirst.app/api/mcp --header "Authorization: Bearer YOUR_API_KEY"

Connect Claude Desktop

Open Settings, then Developer, then Edit Config. Add this to claude_desktop_config.json and restart Claude Desktop. It needs Node.js installed.

json
{
  "mcpServers": {
    "showfirst": {
      "command": "npx",
      "args": ["mcp-remote", "https://showfirst.app/api/mcp",
               "--header", "Authorization: Bearer YOUR_API_KEY"]
    }
  }
}

Connect Cursor

Add this to ~/.cursor/mcp.json, or to .cursor/mcp.json in one project:

json
{
  "mcpServers": {
    "showfirst": {
      "url": "https://showfirst.app/api/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

Connect Codex

Add this to ~/.codex/config.toml:

toml
[mcp_servers.showfirst]
url = "https://showfirst.app/api/mcp"
bearer_token_env_var = "SHOWFIRST_API_KEY"

Put your API key in the SHOWFIRST_API_KEY environment variable.

Connect GoHighLevel

  1. In Ask AI, click +, then Connectors, then Manage Connectors, then Add custom MCP.
  2. Set Name to ShowFirst and URL to https://showfirst.app/api/mcp. Leave Advanced empty.
  3. Click Connect, sign in to ShowFirst and press Allow.

Connect any other agent

Add the server URL as a remote (Streamable HTTP) MCP server. Sign in to ShowFirst (OAuth), or send Authorization: Bearer YOUR_API_KEY. This works in Windsurf, n8n and anything else that supports MCP.

Connect ChatGPT

In ChatGPT's settings, turn on developer mode and add a connector. Paste the server URL and choose OAuth as the authentication. ChatGPT opens ShowFirst; sign in and press Allow.

Paste this into your AI

Paste this into any AI app to have it connect and know how to use ShowFirst:

text
Connect to ShowFirst so you can find, enrich and export local business leads for me.
Add the ShowFirst MCP server: URL https://showfirst.app/api/mcp. Sign in to ShowFirst and press Allow, or send my API key as Authorization: Bearer <API key>.
Use these as well:
- REST API: https://showfirst.app/docs/api-prospecting (send the API key as Authorization: Bearer, or as x-api-key; keys are made on https://showfirst.app/api-keys.html)
- Skill file: https://showfirst.app/docs/skills/prospecting/SKILL.md
To pull leads for a niche in a city: find_location, then search_businesses, then search_status until it is done, then get_results. For many cities, run a campaign and export it as a CSV. Tell me the credit cost before searching, enriching or starting a campaign.
To build a website for a lead: build_website (it answers with the cost first; confirm only after I say yes), then website_status until it is done. For preview sites for a whole search: create_preview_batch with from_search. Read the guide with read_website before changing a website.
Websites skill file: https://showfirst.app/docs/skills/websites/SKILL.md

Tools

These find local businesses, the same searches as the Search and Campaigns tabs. Searches started from a chat show in those tabs too. A search or campaign holds lead credits while it runs, 1 for each business it may return, 2 with verify_emails on (the default: 1 extra per verified email address); credits it does not use come back when it finishes. Call search_businesses and create_campaign without confirm first: nothing starts, and the reply says how many lead credits it would hold. The Prospecting API has the same operations over REST.

ToolWhat it doesCredits
check_creditsShows the credits left on your account.None
find_locationLooks up a city, county or state and returns its location_code.None
search_businessesFinds businesses of one kind in one place. Takes keyword, location_code or location as text, depth (100, 300, 500 or 700), optional radius_miles (10, 25, 50 or 100), optional website (none keeps only businesses whose Google listing shows no website), optional verify_emails (default true; false runs no email check) and confirm. Returns a job_id. Optional exact_category_key (from find_category) keeps only businesses whose main Google category matches exactly.Holds depth lead credits (100, 300, 500 or 700), twice that with verify_emails on. You pay 1 per business found that has a website or phone, plus 1 per verified email address; the rest come back. Without confirm: none
search_statusShows a search's progress. Poll until status is completed, failed or no_results.None
get_resultsReturns a page of a finished search's businesses (offset, limit up to 100). Filters: has_website, has_email, has_phone, has_mobile_phone, has_verified_email.None
export_resultsReturns a finished search as CSV: simple, advanced, ghl, instantly or batch.None
create_campaignPlans one search across many places: keyword, location_codes or locations, depth_per_location, optional max_leads, website, verify_emails and name. With confirm: true it starts. Optional exact_category_key (from find_category) keeps only businesses whose main Google category matches exactly.Holds places × depth, or max_leads if lower, twice that with verify_emails on. You pay 1 per business found that has a website or phone, plus 1 per verified email address; the rest come back. Without confirm: none
start_campaignStarts a new campaign with the same fields, or resumes a paused one by campaign_id.Same as create_campaign. Resuming uses none
pause_campaignPauses a running campaign.None
stop_campaignStops a campaign for good. Businesses found so far stay available.None; unused credits come back
get_campaign_leadsShows a campaign's progress and a page of the businesses found so far. Each call also starts the campaign's next places, so a campaign only moves forward while something calls this.None new; the hold was placed at the start
export_campaignReturns a campaign's businesses as CSV, same formats as export_results.None
enrich_domainsLooks up 1 to 10 websites you already have: emails, phones, social links and a website check. Returns a job_id for search_status and get_results.1 per website, at most 10; any not used come back
find_categoryLooks up Google business categories by name and returns a category_key for an exact-category search.None
find_campaign_locationsBrowses the countries, states and cities a campaign can cover. Takes country, region, q, offset and limit.None
preview_campaignShows how many places a campaign would search and the most lead credits it could hold. Saves nothing and starts nothing.None
resume_campaignResumes a paused campaign by campaign_id.None new; the hold placed at the start still applies
list_campaignsLists your campaigns, newest first, with keyword, places, depth, lead cap and lead credits.None
get_campaignShows a campaign's status and progress. Each call also starts the campaign's next places.None new

Website tools

These build websites for the businesses you find, the same builds as the dashboard. See the Websites API for every field.

ToolWhat it doesCredits
list_designsLists the designs a website or preview batch can use, with a picture of each.None
lookup_businessFinds a business on Google by name (with its town), phone or website. Call it again with the chosen place_id and lookup_session for its address, phone, hours and website.None
build_websiteBuilds a full website for one business. Without confirm it answers with the plan and the cost; with confirm: true it starts. from_search builds for a business from one of your searches.1 website credit; it comes back if the build fails
website_statusShows a build's progress and its preview link, which works from preview_ready.None
list_websitesLists your websites, newest first.None
create_preview_batchMakes a one-page preview site for every business in a list or in one of your searches, up to 500. Plan first, then confirm: true.1 batch site per business, at least 5; your plan's batch sites first, then website credits
list_preview_batchesLists your preview batches.None
get_preview_batchShows one batch and every preview link.None
restyle_preview_batchChanges a batch's colour, background or logo size.None
update_previewChanges one preview: name, phone, email, address, logo, colour or background.None
export_preview_batchReturns a batch as CSV, the same columns as the dashboard's Export button. format: "ghl" gives a GoHighLevel import with each preview link in a Preview Site column.None
create_reportMakes a shareable Online Presence Report link for a business from one of your searches.None

Changing a website

Three tools change a finished website. Changes go live right away and each returns a change_id; undo_website_change undoes it. Read the guide first (read_website with what: guide). A change that takes longer than about 25 seconds returns status: pending and an edit_id; check it with read_website, what: edit_result.

ToolWhat it does
read_websiteReads a website. what: guide (read first), find_text, field_list, fields, pages, design, images, forms, collection, content_groups, versions or edit_result.
change_websiteChanges a website. change: fields, add_page, add_post, add_service, add_service_area, seo, colors, menu, image, forms, add_item, update_item, remove_item, add_group, update_group, add_group_field, remove_group, tour or package.
undo_website_changeUndoes one change by its change_id, or restores an earlier version by version_id.

Changing a website uses no credits. It needs editor credits left on your account, like the dashboard editor. Not available from a chat: uploading a new image (upload it in the dashboard editor, then use change: image), AI-written pages and AI images, and fonts.

Credits

The MCP server uses the same credits as the dashboard and the API. An invalid request does not use a credit. Ask the AI to tell you the credit cost before it starts anything that uses credits.

Errors

A tool that fails returns the same error message as the matching API route, for example You're out of lead credits. See the Prospecting API for the full list. Website tools return the messages of the Websites API, for example Not enough website credits for this batch.

CodeMeaning
-32001The API key is missing, unknown or revoked, or the sign-in expired. Sent with HTTP 401.
-32602The tool name is unknown, or the tool is not available.
-32601The method is not supported.
-32700The request body is not valid JSON.