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 create sites, run Lead Gen batches and edit your sites. It uses the same credits as the dashboard and the Prospecting 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
Keys start with lgen_. 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.
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 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.
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; 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) and confirm. Returns a job_id. | Holds depth lead credits (100, 300, 500 or 700). You pay 1 per business found that has a website or phone; 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 and name. With confirm: true it starts. | Holds places × depth, or max_leads if lower. You pay 1 per business found that has a website or phone; 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 |
Site tools
| Tool | What it does | Credits |
|---|---|---|
find_business | Looks a business up on Google by name, with an optional city, phone or website (a phone or website alone works too). Returns matches to choose from; call it again with the chosen placeId for the name, address, phone, hours and website. Pass googlePlaceId to create_site. | None |
list_templates | Lists the designs a new site can use. | None |
create_site | Builds a website for one business. Takes the same fields as POST /api/provision. Only businessName is required. | 1 site credit; it comes back if the build fails |
site_status | Shows a build's progress and its preview link. The preview link works from live; pages and photos are still being added during enhancing. | None |
list_sites | Lists your sites, newest first. With an API key, the sites created with that key. | None |
list_lead_gen_templates | Lists the designs a Lead Gen batch can use. | None |
create_lead_gen_batch | Creates a Lead Gen batch. Takes the same fields as POST /api/lead-gen/batches. | 1 site credit per business, minimum 5; they come back if no site in the batch gets built |
list_lead_gen_batches | Lists recent batches created with this API key. | None |
get_lead_gen_batch | Shows one batch and its sites. | None |
update_lead_gen_batch | Changes a batch's color, background or logo size. Rows with their own setting keep it. | None |
update_lead_gen_site | Changes one business's page in a batch: name, phone, email, address, logo, color or background. | None |
export_lead_gen_batch | Returns the batch as CSV, with the same columns as Export CSV in the dashboard. | None |
Editing tools
These change a finished site. Edits go live right away. Every edit returns a changeSetId; rollback_change_set undoes that edit. Call site_guide before the first edit. An edit that takes longer than about 25 seconds returns status: pending and a messageId; get_edit_result returns the result. Edits from a chat show in the site's Agent tab under Edits from your AI assistant.
| Tool | What it does |
|---|---|
site_guide | How the site is built and the rules for changing it. |
find_site_text | Finds which fields contain a piece of text. |
list_site_fields | Lists the editable fields: key, label, group (content, seo, forms) and scope. |
get_site_fields | Reads field values for the whole site or one page. |
update_site_fields | Changes text, content and form fields. |
list_site_content | Lists pages, posts, services or service areas. |
create_page, create_post, create_service, create_service_area | Adds a page. Saved as a draft unless publish is true. |
update_seo | Changes a page's search title, description, canonical URL or hide-from-search setting. |
get_design | Reads the design colors, fonts, logo and business details. |
update_design_colors | Changes design colors. |
update_navigation | Replaces the main menu. |
list_media | Lists images in the media library. |
set_image | Puts a media library image into an image field. |
get_forms | Reads the contact form settings: where leads are emailed, what happens after submit, thank-you text, spam protection. |
update_forms | Changes contact form settings. |
list_collection_items | Lists one collection's items: reviews, questions, gallery items, locations, services, service areas, or a content group. |
create_collection_item | Adds an item to a collection. |
update_collection_item | Changes one collection item. |
delete_collection_item | Moves one collection item to the trash. |
list_content_groups | Lists the site's content groups. |
create_content_group | Creates a content group: a new collection with its own fields, such as team members, roofing types or project categories. Its items show on the home page. |
update_content_group | Changes a content group's name, fields or home-page visibility. |
add_content_group_field | Adds one field to a content group. |
delete_content_group | Removes a content group that has no items. |
rollback_change_set | Undoes one edit by its changeSetId. Roll back the newest edit first. |
list_snapshots | Lists earlier versions of the site. |
rollback_snapshot | Restores the newest earlier version. |
get_edit_result | Returns the result of an edit that was still running. |
Editing tools use no credits. They need agent credits left on your account, like the Agent tab. Not available from a chat: uploading a new image (upload it in the Agent tab, then use set_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. Site tools return the messages of Site creation and Lead gen batch, for example No site credits remain. or Not enough Lead Gen credits.
| 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. |