MCP Server
Connect Claude, Cursor, and other AI agents to FoxReach using the Model Context Protocol (MCP).
Overview#
FoxReach provides a hosted Model Context Protocol (MCP) server that lets AI agents manage your leads, campaigns, templates, and email accounts through natural language. No local installation required. Just point your AI client at https://api.foxreach.io/mcp and sign in to FoxReach.
Supported clients: Claude Desktop, Cursor, Claude Code, VS Code, Cline, Goose, Gemini CLI, and any MCP-compatible client that supports remote servers.
FoxReach is listed in the official MCP Registry as io.foxreach/foxreach, so clients that browse the registry can find it by name. Setup for every client is also on GitHub: foxreach/foxreach-mcp.
Prerequisites#
- A FoxReach account with an active workspace
- A compatible MCP client installed
Setup#
Claude Desktop#
- Open Claude Desktop settings
Go to Settings > Connectors > Add custom connector.
- Add the FoxReach MCP server
Enter
FoxReachas the name and the following remote MCP server URL:https://api.foxreach.io/mcp - Sign in to FoxReach
Claude Desktop opens a browser window on FoxReach. Sign in the way you usually do (Google, an emailed sign-in link, or email and password) and click Allow. Once authorized, the MCP tools icon appears in the chat input area, confirming the connection.
Cursor#
Add FoxReach to Cursor installs the server in one step. To add it by hand instead:
- Open Cursor settings
Go to Settings > MCP in Cursor.
- Add a new MCP server
Click Add new MCP server and configure it with the following JSON:
JSON{ "foxreach": { "url": "https://api.foxreach.io/mcp" } } - Verify connection
Cursor prompts you to authenticate. Sign in to FoxReach in the browser window and click Allow. The server should show a green status indicator once connected.
Claude Code#
Run this command in your terminal:
claude mcp add foxreach \
--transport http \
"https://api.foxreach.io/mcp"Then run /mcp inside Claude Code to complete the FoxReach sign-in.
VS Code#
Add FoxReach to VS Code installs the server for GitHub Copilot chat. To add it by hand, put this in .vscode/mcp.json:
{
"servers": {
"foxreach": { "type": "http", "url": "https://api.foxreach.io/mcp" }
}
}VS Code asks you to sign in to FoxReach the first time a tool runs.
Cline#
In Cline, open MCP Servers > Remote Servers, add https://api.foxreach.io/mcp with the name foxreach, then click Authenticate and sign in to FoxReach. In cline_mcp_settings.json the entry is:
{
"mcpServers": {
"foxreach": { "type": "streamableHttp", "url": "https://api.foxreach.io/mcp" }
}
}Goose#
Add FoxReach to Goose adds FoxReach as a remote extension. Goose opens the FoxReach sign-in on first use.
Gemini CLI#
Install the FoxReach extension:
gemini extensions install https://github.com/foxreach/foxreach-gemini-extensionThen sign in to FoxReach when Gemini CLI opens the browser on the first FoxReach tool call.
Other clients#
Add a remote Streamable HTTP server with the URL https://api.foxreach.io/mcp. Clients that support MCP sign-in discover it automatically and open the FoxReach sign-in page. Clients without sign-in support can send an API key, see Connect with an API key.
Available Tools#
FoxReach exposes 89 tools across fourteen resource categories:
Leads#
| Tool | Read/Write | Description |
|---|---|---|
list_leads | Read | List leads with optional search and status filtering, and mail provider filtering (provider: google, microsoft, zoho, yahoo, godaddy, other, gateway, unresolved) |
get_lead | Read | Get a single lead by ID |
create_lead | Write | Create a new lead (deduplicates by email), optionally with custom_fields |
import_csv_leads | Write | Import leads from a CSV: pass the file contents as csv_text (for example a file attached in Claude or ChatGPT, up to 2 MB) or the upload_id of a CSV uploaded in the FoxReach chat. Unmapped columns become custom fields named after their header; optional custom_mapping renames a column ({"z123": "p234"}) or leaves it out (null) |
update_lead | Write | Update an existing lead's fields. custom_fields sets the named custom fields and keeps the rest; null removes one |
delete_lead | Write | Delete a lead by ID |
get_lead_activity | Read | Get a lead's full activity timeline: sends, replies, campaigns |
list_lead_tags | Read | List all lead tags in the workspace with lead counts |
get_lead_providers | Read | Count the workspace's leads by mail provider, behind a security filter, and not checked yet (starts checking in the background) |
Campaigns#
| Tool | Read/Write | Description |
|---|---|---|
list_campaigns | Read | List campaigns with optional status filtering |
get_campaign | Read | Get a campaign by ID, including sequence steps |
create_campaign | Write | Create a new campaign in draft status. Optional esp_matching sends each lead's first email from a mailbox on the same provider |
update_campaign | Write | Rename a campaign or turn provider matching (esp_matching) on or off. Not editable while the campaign is active |
delete_campaign | Write | Delete a campaign (must be in draft status) |
start_campaign | Write | Start a draft campaign, begins sending |
pause_campaign | Write | Pause an active campaign |
resume_campaign | Write | Resume a paused campaign |
assign_leads_to_campaign | Write | Add leads to a campaign |
remove_lead_from_campaign | Write | Remove a lead from a campaign |
assign_accounts_to_campaign | Write | Assign sending email accounts to a campaign |
remove_account_from_campaign | Write | Remove a sending account from a campaign |
list_campaign_leads | Read | List leads enrolled in a campaign with pagination and status filtering |
list_campaign_accounts | Read | List email accounts assigned to a campaign |
get_campaign_esp_mix | Read | Mailboxes and leads by mail provider (Google, Microsoft, other, not looked up yet), and whether provider matching is on |
Sequences#
| Tool | Read/Write | Description |
|---|---|---|
list_sequences | Read | List a campaign's sequence steps in order |
create_sequence | Write | Add a sequence step (email) to a campaign |
update_sequence | Write | Update an existing sequence step |
delete_sequence | Write | Delete a sequence step from a campaign |
Templates#
| Tool | Read/Write | Description |
|---|---|---|
list_templates | Read | List email templates with optional category filtering |
get_template | Read | Get a single template by ID |
create_template | Write | Create a new email template |
update_template | Write | Update an existing template's fields |
delete_template | Write | Delete a template by ID |
Email Accounts#
| Tool | Read/Write | Description |
|---|---|---|
list_email_accounts | Read | List connected email accounts |
get_email_account | Read | Get an email account with warmup and health info |
create_email_account | Write | Connect a new account via SMTP/IMAP app password |
update_email_account | Write | Update display name, daily limit, or active status |
enable_warmup | Write | Turn on warmup for an account |
disable_warmup | Write | Turn off warmup for an account |
get_email_account_health | Read | Get deliverability and warmup health metrics |
delete_email_account | Write | Remove an account |
reconnect_email_account | Write | Re-authenticate a disconnected account with a new app password |
get_email_account_warmup | Read | Get warmup progress, pool stats, and last 20 warmup logs for one account |
Lead Finder#
search_people, search_companies, and count_lead_finder_results take filters as a typed object with named keys (not a free-form JSON string), so an unknown key is rejected with a 400 naming it instead of being silently dropped. get_lead_finder_filters lists every valid key.
| Tool | Read/Write | Description |
|---|---|---|
get_lead_finder_filters | Read | Get valid industries, company types, countries, and the full list of filter keys |
count_lead_finder_results | Read | Count people matching a set of filters |
search_people | Read | Search a licensed people database |
search_companies | Read | Search the same database's company records |
count_company_results | Read | Count companies matching a set of filters, without spending search budget |
reveal_leads | Write | Reveal work emails for people from a search (spends credits, does not add to Leads) |
add_revealed_to_leads | Write | Add people you already revealed to Leads, optionally into a campaign (free) |
list_reveal_batches | Read | List the workspace's reveal history for a month |
get_reveal_batch | Read | Check the status of a reveal batch |
get_lead_finder_credits | Read | Get the reveal credit balance and search budget usage |
list_lead_finder_lists | Read | List the workspace's saved Lead Finder lists (people or company shortlists) |
list_saved_searches | Read | List the workspace's saved Lead Finder searches with their filters and last result |
Tracking Domains#
| Tool | Read/Write | Description |
|---|---|---|
list_tracking_domains | Read | List the workspace's custom tracking domains |
add_tracking_domain | Write | Register a custom tracking domain |
verify_tracking_domain | Write | Re-check a tracking domain's provisioning status |
delete_tracking_domain | Write | Remove a custom tracking domain |
Warmup#
| Tool | Read/Write | Description |
|---|---|---|
get_warmup_pool | Read | List warmup-enabled accounts with health and pool activity |
get_warmup_stats | Read | Aggregate warmup stats across the workspace's accounts |
get_warmup_logs | Read | Last 50 warmup log entries for the workspace as sender or receiver |
list_warmup_tags | Read | List warmup pool tags sorted by name |
Managed Mailboxes#
| Tool | Read/Write | Description |
|---|---|---|
check_domain_availability | Read | Check if a domain is available to register, with price |
suggest_domains | Read | Get available domain name alternatives with prices |
quote_managed_mailboxes | Read | Price a set of domains and mailboxes |
list_managed_mailboxes | Read | List the workspace's managed mailboxes |
list_mailbox_orders | Read | List the workspace's managed mailbox orders |
get_managed_inbox_config | Read | Platform pricing and limits: monthlyCents per platform, max mailboxes per domain, registration years |
search_managed_inbox_domains | Read | Search for available domain names by keyword |
get_mailbox_order | Read | Get a single order's full detail: status, pricing, domains, and mailboxes |
Analytics#
| Tool | Read/Write | Description |
|---|---|---|
get_workspace_overview | Read | Workspace-level stats: accounts, campaigns, leads, sends, reply rate |
get_campaign_stats | Read | Sent, delivered, bounced, replied, and opened counts for a campaign |
Inbox#
| Tool | Read/Write | Description |
|---|---|---|
list_inbox_threads | Read | List inbound reply threads with category filtering and search |
get_inbox_conversation | Read | Get the full conversation for an inbox thread |
send_inbox_reply | Write | Send a reply to an inbox thread |
get_inbox_stats | Read | Inbox totals, unread count, and category breakdown |
get_inbox_thread | Read | Get one thread's summary record by ID; never marks it read (use update_inbox_thread) |
update_inbox_thread | Write | Change a thread's category, read status, or starred status |
delete_inbox_thread | Write | Permanently delete a thread from the inbox and IMAP server |
get_inbox_categorize_stats | Read | Reply category breakdown per variant, step, or day for research |
Email Verification#
| Tool | Read/Write | Description |
|---|---|---|
get_verification_credits | Read | Get the workspace's email verification credit balance and nearest expiry date |
verify_email | Write | Verify a single email address; charges 1 credit for a billable result |
verify_emails_bulk | Write | Verify up to 10,000 emails in one call; charges one credit per billable result |
Webhooks#
| Tool | Read/Write | Description |
|---|---|---|
list_webhooks | Read | List the workspace's registered webhook subscriptions |
list_webhook_event_types | Read | List all valid event type strings that can be subscribed to |
create_webhook | Write | Register a new webhook endpoint for event delivery; returns the signing secret (an active duplicate returns the existing one). MCP clients only, not available in Fenn |
delete_webhook | Write | Permanently remove a webhook subscription |
Leads import#
| Tool | Read/Write | Description |
|---|---|---|
import_leads | Write | Bulk-import up to 1,000 leads from a structured list; deduplicates by email |
Example Prompts#
Once connected, you can use natural language to interact with FoxReach:
- "List all my active campaigns": calls
list_campaignswith status filter - "Create a lead for john@acme.com at Acme Inc": calls
create_lead - "Pause the campaign named Q1 Outreach": calls
list_campaignsto find it, thenpause_campaign - "Show me all email templates": calls
list_templates - "Draft a cold outreach template and save it": AI writes the copy, then calls
create_template
Authentication#
The MCP server authenticates with OAuth, with FoxReach itself as the identity provider. Your MCP client opens a browser window on FoxReach's sign-in page; use Google, an emailed sign-in link, or your email and password, then approve the connection. Behind the scenes, FoxReach mints a short-lived session API key scoped to your personal workspace, so tool calls carry the same permissions and plan limits as the REST API.
All communication is encrypted via HTTPS.
Connect with an API key#
Hosts that cannot complete a browser-based sign-in flow (the Claude Messages API MCP connector, headless agents, CI, and most server-to-server integrations) can authenticate with a FoxReach API key instead of OAuth. Create one in Settings > Integrations > API Keys, then send it as either:
Authorization: Bearer otr_...or, for hosts that only let you configure arbitrary headers:
X-API-Key: otr_...Tool calls made with an API key run against that key's own workspace, and its scopes and plan limits apply exactly as they do for the REST API. A read-only key can still list tools, but gets a clear error back from any write tool.
Troubleshooting#
Tools not appearing in Claude Desktop
Make sure the URL in your config is exactly https://api.foxreach.io/mcp. Restart Claude Desktop after making changes.
"401 Unauthorized" error Your session has expired or the tokens are stale. Clear the server's authentication in your MCP client and reconnect to sign in again.
"No FoxReach account found" error The account you signed in with has no FoxReach workspace. Sign in with the email you use for FoxReach, or create an account first.
Connection drops or timeouts Streamable HTTP connections are long-lived. Some network environments or proxies may drop idle connections. Your MCP client will automatically reconnect.
Tool calls returning errors The MCP tools call the FoxReach REST API under the hood. Check the error message. It follows the same error format as the API (e.g., 404 for not found, 409 for duplicate email).