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
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
- Open Settings, then Connectors, then Add custom connector.
- Paste the server URL,
https://showfirst.app/api/mcp, and click Add. - 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:
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:
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.
{
"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:
{
"mcpServers": {
"showfirst": {
"url": "https://showfirst.app/api/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}
Connect Codex
Add this to ~/.codex/config.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
- In Ask AI, click +, then Connectors, then Manage Connectors, then Add custom MCP.
- Set Name to
ShowFirstand URL tohttps://showfirst.app/api/mcp. Leave Advanced empty. - 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:
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.
| Tool | What it does | Credits |
|---|---|---|
check_credits | Shows the credits left on your account. | None |
find_location | Looks up a city, county or state and returns its location_code. | None |
search_businesses | Finds 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_status | Shows a search's progress. Poll until status is completed, failed or no_results. | None |
get_results | Returns 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_results | Returns a finished search as CSV: simple, advanced, ghl, instantly or batch. | None |
create_campaign | Plans 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_campaign | Starts a new campaign with the same fields, or resumes a paused one by campaign_id. | Same as create_campaign. Resuming uses none |
pause_campaign | Pauses a running campaign. | None |
stop_campaign | Stops a campaign for good. Businesses found so far stay available. | None; unused credits come back |
get_campaign_leads | Shows 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_campaign | Returns a campaign's businesses as CSV, same formats as export_results. | None |
enrich_domains | Looks 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_category | Looks up Google business categories by name and returns a category_key for an exact-category search. | None |
find_campaign_locations | Browses the countries, states and cities a campaign can cover. Takes country, region, q, offset and limit. | None |
preview_campaign | Shows how many places a campaign would search and the most lead credits it could hold. Saves nothing and starts nothing. | None |
resume_campaign | Resumes a paused campaign by campaign_id. | None new; the hold placed at the start still applies |
list_campaigns | Lists your campaigns, newest first, with keyword, places, depth, lead cap and lead credits. | None |
get_campaign | Shows 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.
| Tool | What it does | Credits |
|---|---|---|
list_designs | Lists the designs a website or preview batch can use, with a picture of each. | None |
lookup_business | Finds 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_website | Builds 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_status | Shows a build's progress and its preview link, which works from preview_ready. | None |
list_websites | Lists your websites, newest first. | None |
create_preview_batch | Makes 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_batches | Lists your preview batches. | None |
get_preview_batch | Shows one batch and every preview link. | None |
restyle_preview_batch | Changes a batch's colour, background or logo size. | None |
update_preview | Changes one preview: name, phone, email, address, logo, colour or background. | None |
export_preview_batch | Returns 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_report | Makes 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.
| Tool | What it does |
|---|---|
read_website | Reads a website. what: guide (read first), find_text, field_list, fields, pages, design, images, forms, collection, content_groups, versions or edit_result. |
change_website | Changes 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_change | Undoes 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.
| Code | Meaning |
|---|---|
-32001 | The API key is missing, unknown or revoked, or the sign-in expired. Sent with HTTP 401. |
-32602 | The tool name is unknown, or the tool is not available. |
-32601 | The method is not supported. |
-32700 | The request body is not valid JSON. |