Production-grade MCP servers connecting AI agents to Pest Pro Rid All's full operational stack โ field ops, payments, and CRM.
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": "https://vnf9mp2vik.us-east-2.awsapprunner.com/mcp" }, "cardpointe-mcp": { "type": "streamable-http", "url": "https://qwnm3rvm8m.us-east-2.awsapprunner.com/mcp" }, "agency-mcp": { "type": "streamable-http", "url": "https://gdip7vymuh.us-west-2.awsapprunner.com/mcp" } } }
Add to .cursor/mcp.json (project) or ~/.cursor/mcp.json (global)
{
"mcpServers": {
"briostack-mcp": {
"url": "https://vnf9mp2vik.us-east-2.awsapprunner.com/mcp"
},
"cardpointe-mcp": {
"url": "https://qwnm3rvm8m.us-east-2.awsapprunner.com/mcp"
},
"agency-mcp": {
"url": "https://gdip7vymuh.us-west-2.awsapprunner.com/mcp"
}
}
}
Add to ~/.config/zed/settings.json
{
"context_servers": {
"briostack-mcp": {
"transport": "http",
"url": "https://vnf9mp2vik.us-east-2.awsapprunner.com/mcp"
},
"cardpointe-mcp": {
"transport": "http",
"url": "https://qwnm3rvm8m.us-east-2.awsapprunner.com/mcp"
},
"agency-mcp": {
"transport": "http",
"url": "https://gdip7vymuh.us-west-2.awsapprunner.com/mcp"
}
}
}
Standard MCP 2025-03-26 streamable-http connection parameters.
{
"transport": "streamable-http",
"url": "https://vnf9mp2vik.us-east-2.awsapprunner.com/mcp",
"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, boto3, and AWS 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 |
| create_contact | contacts | Create a new GHL contact |
| update_contact | contacts | Update contact fields and custom properties |
| list_contact_notes | contacts | List notes on a contact record |
| create_contact_note | contacts | Add a note to a contact |
| 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 |
| 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 |
| list_calendar_events | calendars | Events with date/calendar filters |
| create_calendar_event | calendars | Create an appointment in GHL calendar |
| get_pipelines | pipelines | List all sales/operations pipelines |
| list_opportunities | pipelines | Pipeline opportunities with stage filters |
| create_opportunity | pipelines | Create a pipeline opportunity |
| update_opportunity_status | pipelines | Move opportunity to won/lost/open |
| get_location | admin | GHL location (sub-account) details |
| get_custom_fields | admin | List all custom fields in the location |
| list_users | admin | All users in the location |
| list_tags | admin | All contact tags |
| list_tasks | admin | Tasks assigned in GHL |
| list_workflows | automation | All automation workflows |
| list_campaigns | marketing | All campaigns |
| list_funnels | marketing | All funnels and pages |
| list_surveys | marketing | All surveys |
| create_social_media_post | social | Schedule a social media post |
| create_knowledge_base | ai | Create an AI knowledge base |
| query_knowledge_base | ai | Query a knowledge base for answers |
| crawl_knowledge_base_url | ai | Ingest URL content into a knowledge base |
| create_conversation_ai_bot | ai | Create a GHL AI conversation bot |
| create_voice_agent | ai | Create a GHL voice AI agent |
| list_voice_call_logs | ai | Voice agent call history |
| list_products | commerce | Products/services in the GHL store |
| list_invoices | commerce | GHL invoices |
| list_payment_transactions | commerce | Payment transactions |
| process_stripe_refund | commerce | Process a Stripe refund through GHL |
| access_pestpro_stripe_account | commerce | Pest Pro Stripe account (acct_1IJoWII8Ppq6GZQE) |
| 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 |
MCP 2025-03-26
Streamable-HTTP & stdio transports
Python 3.12
mcp SDK 1.27+, FastMCP wrapper
AWS App Runner
us-east-2, linux/amd64, 0.25 vCPU / 0.5 GB
ECR Private
767397993913.dkr.ecr.us-east-2.amazonaws.com/pestpro/briostack-mcp
AWS Secrets Manager
Region us-east-2 ยท Prefix pestpro/integrations/
None (network-gated)
IP allowlist required for external access
Python 3.11+, Docker (or Colima), AWS CLI v2, access to account 767397993913 (us-east-2). Colima users: colima start โ no Docker Desktop needed.
cd ~/briostack-mcp/hosted && pip install -r requirements.txt โ installs mcp>=1.27, boto3, uvicorn, requests.
Store credentials at pestpro/integrations/briostack in AWS Secrets Manager (us-east-2) with keys api_key, base_url, instance. The server loads these at runtime via IAM role โ no env vars needed in production.
docker build --platform linux/amd64 -t 767397993913.dkr.ecr.us-east-2.amazonaws.com/pestpro/briostack-mcp:latest .
Then: docker push .... The --platform linux/amd64 flag is mandatory โ App Runner runs x86_64, not ARM.
Two roles required: briostack-mcp-apprunner-ecr (trust build.apprunner.amazonaws.com, policy AWSAppRunnerServicePolicyForECRAccess) and briostack-mcp-apprunner-instance (trust tasks.apprunner.amazonaws.com, inline policy for secretsmanager:GetSecretValue on pestpro/*).
Port 8001, TCP health check (interval 20s, threshold 1), instance role attached. Auto-deploy on ECR push is enabled โ just push a new image to redeploy.
curl https://<apprunner-url>/mcp โ expect {"error":"Not Acceptable: Client must accept text/event-stream"}. That response confirms the server is healthy and accepting 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://vnf9mp2vik.us-east-2.awsapprunner.com/ 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, live URLs. |
https://mcp.jom.services/mcp-catalog.json | JSON | Full server catalog. All tools with names, categories, descriptions. Publisher metadata. |
https://vnf9mp2vik.us-east-2.awsapprunner.com/mcp | MCP/SSE | Live BrioStack MCP endpoint. POST with Accept: text/event-stream. |
https://qwnm3rvm8m.us-east-2.awsapprunner.com/mcp | MCP/SSE | Live CardPointe MCP endpoint. Requires bearer auth. |
https://gdip7vymuh.us-west-2.awsapprunner.com/mcp | MCP/SSE | Live Agency MCP endpoint. Requires bearer auth. |