Production-grade MCP servers connecting AI agents to Pest Pro Rid All's full operational stack โ field ops, payments, and CRM.
<YOUR_ENDPOINT> and <MCP_API_KEY> with the values from your approval email; never commit them to a repo.Add to ~/Library/Application Support/Claude/claude_desktop_config.json
// ~/Library/Application Support/Claude/claude_desktop_config.json { "mcpServers": { "briostack-mcp": { "type": "streamable-http", "url": "<YOUR_BRIOSTACK_ENDPOINT>", "headers": { "Authorization": "Bearer <MCP_API_KEY>" } }, "cardpointe-mcp": { "type": "streamable-http", "url": "<YOUR_CARDPOINTE_ENDPOINT>", "headers": { "Authorization": "Bearer <MCP_API_KEY>" } }, "agency-mcp": { "type": "streamable-http", "url": "<YOUR_AGENCY_ENDPOINT>", "headers": { "Authorization": "Bearer <MCP_API_KEY>" } } } }
Claude.ai web uses OAuth 2.0 PKCE โ no JSON config needed. Each server has a built-in sign-in page served at its endpoint. Your endpoint URL is provided in the access approval email.
Field ops ยท Scheduling ยท Billing
Endpoint provided upon access approval
Auth ยท Capture ยท ACH ยท Profiles
Endpoint provided upon access approval
CRM ยท AI Bots ยท Marketing
Endpoint provided upon access approval
Submit a request at request-access.html. You'll receive your endpoint URL and MCP API key via email after approval (1โ2 business days for external requests).
In your Claude.ai account, navigate to Settings โ Connectors and click Add custom connector.
Type a name (e.g., BrioStack Operations) and paste the server endpoint URL from your approval email. Click Connect.
Claude.ai redirects you to the server's sign-in page. Enter your MCP API key and click Authorize Access. You'll be redirected back to Claude.ai automatically.
Each server (BrioStack, CardPointe, Agency/GHL) is added as a separate connector. All three use the same API key.
๐ก How it works: Each server implements OAuth 2.0 PKCE at /authorize and /token. Claude.ai auto-discovers the auth endpoints via /.well-known/oauth-authorization-server. Your API key is never stored by Claude.ai โ the OAuth flow converts it to a session token on the fly.
Add to .cursor/mcp.json (project) or ~/.cursor/mcp.json (global)
{
"mcpServers": {
"briostack-mcp": {
"url": "<YOUR_BRIOSTACK_ENDPOINT>",
"headers": { "Authorization": "Bearer <MCP_API_KEY>" }
},
"cardpointe-mcp": {
"url": "<YOUR_CARDPOINTE_ENDPOINT>",
"headers": { "Authorization": "Bearer <MCP_API_KEY>" }
},
"agency-mcp": {
"url": "<YOUR_AGENCY_ENDPOINT>",
"headers": { "Authorization": "Bearer <MCP_API_KEY>" }
}
}
}
Add to ~/.config/zed/settings.json
{
"context_servers": {
"briostack-mcp": {
"transport": "http",
"url": "<YOUR_BRIOSTACK_ENDPOINT>",
"headers": { "Authorization": "Bearer <MCP_API_KEY>" }
},
"cardpointe-mcp": {
"transport": "http",
"url": "<YOUR_CARDPOINTE_ENDPOINT>",
"headers": { "Authorization": "Bearer <MCP_API_KEY>" }
},
"agency-mcp": {
"transport": "http",
"url": "<YOUR_AGENCY_ENDPOINT>",
"headers": { "Authorization": "Bearer <MCP_API_KEY>" }
}
}
}
Standard MCP 2025-03-26 streamable-http connection parameters.
{
"transport": "streamable-http",
"url": "<YOUR_BRIOSTACK_ENDPOINT>",
"method": "POST",
"content_type": "application/json",
"accept": "text/event-stream, application/json",
"auth": "bearer",
"header": "Authorization: Bearer <MCP_API_KEY>",
"note": "Store the token in the client secret manager. Do not commit it."
}
Full local config for all three servers via stdio. Requires Python 3.11+, mcp, google-cloud-secret-manager, google-auth, and GCP credentials.
// claude_desktop_config.json โ all three servers, local stdio { "mcpServers": { "briostack-mcp": { "command": "python3", "args": ["/Users/moemeyer/briostack-mcp/server.py"] }, "cardpointe-mcp": { "command": "python3", "args": ["/Users/moemeyer/cardpointe-mcp/server.py"] }, "agency-mcp": { "command": "python3", "args": ["/Users/moemeyer/agency-mcp/server.py"] } } }
| Tool | Category | Description |
|---|---|---|
| search_customers | customers | Search by name, phone, email, or address |
| get_customer_details | customers | Full customer record by Briostack ID |
| get_customer_full_profile | customers | Aggregate profile: account + services + appointments + invoices |
| get_customer_services | customers | Active service plans for a customer |
| list_customer_contact_methods | customers | Phone, email, contact preferences on file |
| list_appointments | appointments | List with filters: date range, status, branch, tech |
| get_appointment | appointments | Single appointment by ID |
| service_appointment | appointments | Create a new service appointment |
| reschedule_appointment | appointments | Reschedule to a new date/time |
| open_appointment | appointments | Set status to open/active |
| close_appointment | appointments | Mark as completed/closed |
| update_appointment_status | appointments | Update appointment status field |
| get_invoices | billing | Invoices with balance and line-item detail |
| get_service_invoices | billing | Invoices linked to a service plan |
| get_invoice_schedules | billing | Recurring invoice schedule |
| get_ar_snapshot | billing | AR total outstanding, aging buckets |
| get_billing_intelligence_reference | billing | Billing field meanings and computation rules |
| get_daily_ops_snapshot | operations | Today's summary: appointments, revenue, open tasks |
| list_services | operations | All service types offered |
| list_service_categories | operations | Service category taxonomy |
| list_employees | operations | Employee roster with roles and branches |
| list_branches | operations | Branch/office locations |
| list_leads | operations | Open leads pipeline |
| list_communications | operations | Communication log (calls, texts, notes) |
| brio_raw_get | raw-api | Pass-through GET to any BrioStack REST endpoint |
| brio_raw_post | raw-api | Pass-through POST (creates records) |
| brio_raw_patch | raw-api | Pass-through PATCH (partial updates โ verified on /appointments) |
| brio_raw_put | raw-api | Pass-through PUT (full replace) |
| brio_raw_delete | raw-api | Pass-through DELETE |
| brio_raw_options | raw-api | Discover supported methods on any endpoint |
| brio_get_openapi_spec | raw-api | Fetch the full BrioStack OpenAPI specification |
| brio_rate_status | raw-api | Current API rate limit usage (20 req / 60 s) |
| Tool | Category | Description |
|---|---|---|
| cardpointe_authorize | transactions | Authorize a charge (hold funds, don't capture) |
| cardpointe_capture | transactions | Capture a previously authorized transaction |
| cardpointe_void | transactions | Void an authorized or unsettled transaction |
| cardpointe_refund | transactions | Refund a settled transaction (partial or full) |
| cardpointe_inquire | transactions | Look up a transaction by retref |
| cardpointe_inquire_by_order | transactions | Look up by order ID |
| cardpointe_offline_payment | transactions | Record an offline/manual payment |
| cardpointe_ach_payment | ach | ACH bank debit via BlueChex (MID BCX101329844815) |
| cardpointe_create_profile | profiles | Save card/bank to stored profile (tokenize) |
| cardpointe_get_profile | profiles | Retrieve stored profile by profile ID |
| cardpointe_delete_profile | profiles | Remove a stored payment profile |
| cardpointe_search_profile_by_party_id | profiles | Find profiles by partyId (= Briostack customerId) |
| cardpointe_account_status | admin | Merchant account status and configuration |
| cardpointe_get_deposit | admin | Deposit/funding report for a date range |
| cardpointe_settle_status | admin | Settlement batch status |
| Tool | Category | Description |
|---|---|---|
| search_agency_contacts | contacts | Search GHL contacts by name, phone, email, or tag |
| get_contact | contacts | Fetch full contact record by GHL contact ID |
| create_contact | contacts | Create a new GHL contact |
| update_contact | contacts | Update contact fields and custom properties |
| delete_contact | contacts | Delete a contact record permanently |
| bulk_update_contacts | contacts | Update multiple contacts in a single call |
| add_contact_tag | contacts | Add one or more tags to a contact |
| remove_contact_tag | contacts | Remove one or more tags from a contact |
| add_contact_to_workflow | contacts | Enroll a contact into a GHL workflow |
| remove_contact_from_workflow | contacts | Remove a contact from a workflow |
| get_contact_appointments | contacts | List all calendar appointments linked to a contact |
| list_contact_notes | contacts | List all notes for a contact |
| create_contact_note | contacts | Add a note to a contact |
| update_contact_note | contacts | Edit an existing contact note |
| delete_contact_note | contacts | Delete a contact note |
| pin_contact_note | contacts | Pin a note to the top of a contact record |
| get_conversation | conversations | Fetch a conversation thread by ID |
| get_conversation_messages | conversations | List messages in a conversation |
| list_conversations | conversations | List all conversations with filters |
| create_conversation | conversations | Create a new conversation thread for a contact |
| update_conversation | conversations | Update conversation status, assignment, or label |
| send_message | conversations | Send SMS, email, or in-app message |
| send_email_message | conversations | Send a formatted email through GHL |
| send_whatsapp_message | conversations | Send a WhatsApp message via GHL |
| list_calendars | calendars | List all GHL calendars |
| get_calendar | calendars | Get a single calendar by ID |
| create_calendar | calendars | Create a new GHL calendar |
| update_calendar | calendars | Update calendar settings and availability rules |
| delete_calendar | calendars | Delete a calendar |
| list_calendar_events | calendars | Events with date/calendar filters |
| get_calendar_event | calendars | Get a single calendar event |
| create_calendar_event | calendars | Create an appointment in GHL calendar |
| update_calendar_event | calendars | Update an existing calendar event (reschedule, reassign) |
| delete_calendar_event | calendars | Delete a calendar event |
| get_available_slots | calendars | Get available booking time slots for a calendar |
| create_block_slot | calendars | Block time on a calendar to prevent bookings |
| delete_block_slot | calendars | Remove a blocked time slot |
| get_pipelines | pipelines | List all sales/operations pipelines |
| get_pipeline_stages | pipelines | List stages for a specific pipeline |
| list_opportunities | pipelines | Pipeline opportunities with stage filters |
| get_opportunity | pipelines | Get a single opportunity by ID |
| create_opportunity | pipelines | Create a pipeline opportunity |
| update_opportunity | pipelines | Update opportunity details |
| update_opportunity_status | pipelines | Move opportunity to won/lost/open |
| delete_opportunity | pipelines | Delete a pipeline opportunity |
| add_opportunity_follower | pipelines | Add a team member as follower to an opportunity |
| list_workflows | automation | List all automation workflows |
| get_workflow | automation | Get workflow details, triggers, and steps by ID |
| trigger_workflow | automation | Enroll a contact into a workflow by workflow ID |
| get_location | admin | GHL location (sub-account) details |
| update_location | admin | Update sub-account settings and preferences |
| get_custom_fields | admin | List all custom fields in the location |
| create_custom_field | admin | Create a new custom field |
| update_custom_field | admin | Update a custom field definition |
| delete_custom_field | admin | Delete a custom field |
| list_custom_values | admin | List all custom values (location-level variables) |
| create_custom_value | admin | Create a custom value variable |
| update_custom_value | admin | Update a custom value |
| delete_custom_value | admin | Delete a custom value |
| list_users | admin | All users in the location |
| get_user | admin | Get a user by ID |
| create_user | admin | Create a new user in the location |
| update_user | admin | Update user profile and permissions |
| delete_user | admin | Remove a user from the location |
| list_tags | admin | All contact tags |
| create_tag | admin | Create a new contact tag |
| list_tasks | admin | Tasks assigned in GHL |
| create_task | admin | Create a new task |
| update_task | admin | Update task details, due date, or assignment |
| complete_task | admin | Mark a task as completed |
| delete_task | admin | Delete a task |
| get_email_dns_health | admin | Check SPF, DKIM, DMARC for sending domain |
| repair_ses_dns | admin | Auto-repair SES DNS records |
| search_agency_locations | admin | Search GHL sub-accounts/locations |
| list_campaigns | marketing | All campaigns |
| list_forms | marketing | All lead capture forms |
| get_form_submissions | marketing | Get submissions for a specific form |
| list_funnels | marketing | All funnels and pages |
| list_funnel_pages | marketing | Pages within a funnel |
| list_surveys | marketing | All surveys |
| get_survey_submissions | marketing | Get submissions for a specific survey |
| list_social_media_posts | social | List scheduled and published social posts |
| get_social_planner_post | social | Get a single social planner post by ID |
| create_social_media_post | social | Schedule a social media post |
| update_social_media_post | social | Edit a scheduled social media post |
| delete_social_media_post | social | Delete a scheduled social media post |
| list_social_planner_accounts | social | List connected social accounts and OAuth status |
| get_social_planner_stats | social | Post analytics and engagement statistics |
| list_knowledge_bases | ai | List all AI knowledge bases |
| create_knowledge_base | ai | Create an AI knowledge base |
| get_knowledge_base | ai | Get knowledge base details by ID |
| update_knowledge_base | ai | Update knowledge base settings and name |
| delete_knowledge_base | ai | Delete a knowledge base |
| create_knowledge_base_faq | ai | Add an FAQ entry to a knowledge base |
| query_knowledge_base | ai | Query a knowledge base for answers |
| crawl_knowledge_base_url | ai | Ingest URL content into a knowledge base |
| list_conversation_ai_bots | ai | List all Conversation AI bots |
| create_conversation_ai_bot | ai | Create a GHL AI conversation bot |
| get_conversation_ai_bot | ai | Get Conversation AI bot config and prompt by ID |
| update_conversation_ai_bot | ai | Update bot settings, prompt, and KB links |
| delete_conversation_ai_bot | ai | Delete a Conversation AI bot |
| list_voice_agents | ai | List all Voice AI agents |
| create_voice_agent | ai | Create a GHL Voice AI agent |
| get_voice_agent | ai | Get Voice AI agent config and voice settings by ID |
| update_voice_agent | ai | Update voice agent persona, script, calendar booking, and language |
| delete_voice_agent | ai | Delete a Voice AI agent |
| list_voice_call_logs | ai | Voice agent call history |
| get_voice_call_transcript | ai | Get full transcript and AI summary for a Voice AI call |
| list_ai_agents | ai | List all Agent Studio AI agents |
| create_ai_agent | ai | Create an Agent Studio agent with tools, KB, and routing |
| get_ai_agent | ai | Get Agent Studio agent config and MCP tool connections |
| list_blog_posts | content | List all blog posts (filter by status, date, author) |
| get_blog_post | content | Get a single blog post by ID |
| create_blog_post | content | Create a blog post in GHL |
| update_blog_post | content | Update an existing blog post content, SEO, or status |
| delete_blog_post | content | Delete a blog post |
| list_blog_categories | content | List blog categories |
| list_blog_authors | content | List blog authors/contributors |
| list_products | commerce | Products/services in the GHL store |
| get_product | commerce | Get a single product by ID |
| create_product | commerce | Create a new product |
| update_product | commerce | Update product details, description, and images |
| delete_product | commerce | Delete a product |
| list_prices | commerce | List price variants for a product |
| create_price | commerce | Create a price variant (one-time or recurring) for a product |
| list_invoices | commerce | GHL invoices with status filters |
| get_invoice | commerce | Get invoice details, line items, and payment status |
| create_invoice | commerce | Create a new one-time or recurring invoice |
| update_invoice | commerce | Update invoice line items, due date, or notes |
| send_invoice | commerce | Send invoice to contact via email |
| void_invoice | commerce | Void an invoice |
| create_invoice_template | commerce | Create a recurring invoice template for workflow automation |
| list_orders | commerce | List ecommerce orders with status and date filters |
| get_order | commerce | Get order details including line items and fulfillment |
| list_subscriptions | commerce | List active and cancelled subscriptions |
| get_subscription | commerce | Get subscription details and billing history |
| cancel_subscription | commerce | Cancel a contact's active subscription |
| list_coupons | commerce | List discount coupons |
| create_coupon | commerce | Create a percentage or fixed-amount discount coupon |
| list_payment_transactions | commerce | Payment transactions |
| process_stripe_refund | commerce | Process a Stripe refund through GHL |
| access_pestpro_stripe_account | commerce | Access the Pest Pro linked Stripe account for payouts and reporting |
| list_reviews | reviews | List Google and Facebook reviews for the location |
| reply_to_review | reviews | Post a public reply to a Google or Facebook review |
| send_review_request | reviews | Send a review request to a contact via SMS or email |
| list_custom_object_schemas | custom-objects | List all custom object definitions in the location |
| create_custom_object_record | custom-objects | Create a new record for a custom object type |
| update_custom_object_record | custom-objects | Update fields on a custom object record |
| delete_custom_object_record | custom-objects | Delete a custom object record |
| list_custom_object_records | custom-objects | Query and list records for a custom object type |
| list_documents | documents | List documents and contracts |
| get_document | documents | Get document details and e-signature status |
| create_document | documents | Create a document or contract from a template |
| send_document_for_signature | documents | Send a document for e-signature to a contact |
| Tool | Category | Description |
|---|---|---|
| get_meta_webhook_info | webhooks | Securely retrieves the Meta webhook integration manifest from GCP Secret Manager including endpoints and GCP component metadata. |
| Tool | Category | Description |
|---|---|---|
| send_whatsapp_message | messages | Send a WhatsApp message to a contact through GHL. |
| get_whatsapp_conversations | conversations | Retrieve recent WhatsApp conversations from GHL. |
| get_whatsapp_messages | messages | Retrieve WhatsApp messages from a specific contact or conversation. |
| search_whatsapp_contacts | contacts | Search for contacts who have WhatsApp conversations. |
| get_whatsapp_account_status | admin | Check WhatsApp Business account status and integration health. |
๐ White-Label Replication Ready
The jomAI Agent App and Open-Signal Gateway are built as decoupled, provider-agnostic engines. This architecture allows deploying the interactive "notify-and-approve" communications flow for any client or channel (SMS, Messenger, Telegram, WhatsApp) with minimal modification.
Inbound messages from Meta APIs, GHL, or local OpenClaw gateways forward payloads to jomAI Agent App's Cloud Run webhooks.
The agent generates a draft response using the Anthropic API, writes the session record to Neon DB (status: pending), and posts an interactive card to Slack.
Operators review the card in Slack and can either Approve & Send, Edit Draft (via a Slack Modal), or Dismiss the draft response.
Approved drafts are sent directly to the Open-Signal Gateway (using GHL/Meta APIs for business numbers, or queueing in the database for the local watcher daemon to deliver via the openclaw CLI for personal accounts).
MCP 2025-03-26
Streamable-HTTP & stdio transports
Python 3.12
mcp SDK 1.27+, FastMCP wrapper
Google Cloud Run
us-east-2, linux/amd64, 0.25 vCPU / 0.5 GB
ECR Private
us-central1-docker.pkg.dev/ghlpest-controlv2/openclaw-mcp-repo/briostack-mcp
GCP Secret Manager
Region us-east-2 ยท Prefix pestpro/integrations/
None (network-gated)
IP allowlist required for external access
Python 3.11+, Docker (or Colima), Google Cloud SDK (gcloud), access to GCP project ghlpest-controlv2. Colima users: colima start โ no Docker Desktop needed.
cd ~/briostack-mcp/hosted && pip install -r requirements.txt โ installs mcp>=1.27, google-cloud-secret-manager, google-auth, uvicorn, requests.
Store credentials at pestpro/integrations/briostack in GCP Secret Manager (us-central1) with keys api_key, base_url, instance. The server loads these at runtime via service account โ no env vars needed in production.
docker build --platform linux/amd64 -t us-central1-docker.pkg.dev/ghlpest-controlv2/openclaw-mcp-repo/briostack-mcp:latest .
Then: docker push us-central1-docker.pkg.dev/ghlpest-controlv2/openclaw-mcp-repo/briostack-mcp:latest. The --platform linux/amd64 flag ensures compatibility across all Cloud Run environments.
Assign Secret Manager Secret Accessor role (roles/secretmanager.secretAccessor) to the Google Cloud Run runtime service account so it can retrieve the integration credentials.
Deploy to Cloud Run on port 8001. Enable HTTP/1 or HTTP/2 transport with startup CPU allocation. Auto-deploy can be configured using Google Cloud Build triggers linked to your GitHub repo.
curl -H "Accept: text/event-stream" https://<cloudrun-url>/sse โ expect the event stream or a SSE connection. That response confirms the server is healthy and accepting remote MCP connections.
Create repo moemeyer/jom-mcp-hub. Push all files from ~/jom-mcp-hub/. In repo Settings โ Pages โ Source: main branch, / (root). GitHub serves it at moemeyer.github.io/jom-mcp-hub.
Create a file named CNAME in the repo root containing exactly: mcp.jom.services
Log in to dnsimple.com โ jom.services โ DNS โ Add Record:
Type: CNAME ยท Name: mcp ยท Content: moemeyer.github.io ยท TTL: 3600
Back in GitHub Pages settings โ set Custom domain to mcp.jom.services โ tick Enforce HTTPS. GitHub provisions a Let's Encrypt cert automatically (may take 10โ30 min).
DNSimple has a Health Check feature (DNS โ Health Checks). Point it at https://<your-apprunner-url>/ with TCP check every 60s to get uptime alerts for the live MCP server.
| URL | Format | Purpose |
|---|---|---|
https://mcp.jom.services/.well-known/mcp.json | JSON | Standard well-known MCP discovery endpoint. Server IDs, transports, auth requirements. |
https://mcp.jom.services/mcp-catalog.json | JSON | Full server catalog. All tools with names, categories, descriptions. Publisher metadata. |
https://mcp.jom.services/request-access.html | HTML | Access request page. Submit here to receive endpoint URLs and API key via email. |
| BrioStack MCP endpoint | MCP/SSE | ๐ Provided upon access approval. Streamable-http, requires bearer auth. |
| CardPointe MCP endpoint | MCP/SSE | ๐ Provided upon access approval. Streamable-http, requires bearer auth. |
| Agency / GHL MCP endpoint | MCP/SSE | ๐ Provided upon access approval. Streamable-http, requires bearer auth. |