The technology is cheap, the compliance reasons are clear, and somewhere in the back of everyone's mind is the idea that "we should really be doing something with all this."
But doing something means listening. And listening doesn't scale.
A Midwest electronics distributor we work with had exactly this problem. Their reps were using Plaud recording devices to capture every customer conversation. Transcripts were being stored in Cloudflare. In theory, they had a searchable archive of every objection handled, every pricing discussion, every competitive mention. In practice, nobody had time to dig through it.
Meanwhile, their HubSpot CRM tracked deals, tasks, and activities in a completely separate system. Sales managers wanted to connect the dots—what are reps actually saying on calls, and how does that correlate with pipeline movement?
The Approach: AI Search Meets CRM Context
We deployed a FastMCP server that integrates two capabilities:
Cloudflare AutoRAG provides AI-powered semantic search across the entire transcript archive. Instead of keyword matching, it understands intent, so "what concerns do prospects raise about lead times?" returns relevant passages even if reps never used that exact phrase.
HubSpot CRM integration pulls deal data, task management, and activity reporting. Managers can check pipeline status, see rep activity metrics, and manage follow-ups.
The MCP server unifies both through a conversational interface. Users can now ask hybrid questions that would have required hours of manual work:
Call recording without analysis is just storage costs. The value is in pattern recognition, understanding what's actually happening in customer conversations across your entire team.
But traditional approaches require either dedicated analyst time (expensive) or discipline around tagging and categorization (never happens consistently). AI-powered search changes the equation. You can ask questions after the fact, exploring the data as needs arise rather than predicting what you'll want to know.
Connecting that search capability to CRM data adds crucial context. A transcript excerpt means more when you can see the deal stage, the account history, and the rep's recent activity in the same view.
We deployed a FastMCP server that integrates three capabilities:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐
│ Claude Desktop │────▶│ FastMCP Server │────▶│ Cloudflare AutoRAG │
│ (MCP Client) │ │ (Python) │────▶│ HubSpot CRM API │
└─────────────────┘ └─────────────────┘ └─────────────────────┘
Cloudflare AutoRAG handles semantic search across the transcript corpus. Unlike keyword search, AutoRAG uses embeddings to find conceptually relevant passages. A query about "pricing pushback" returns relevant excerpts even when reps used different language.
HubSpot integration provides CRM context: deal stages, company records, contact history, task management, and activity reporting. This lets users correlate transcript insights with pipeline data.
FastMCP exposes both through the Model Context Protocol, allowing any MCP-compatible client to query them conversationally.
Here's a simplified example of the transcript search tool:
python
from fastmcp import FastMCP
import httpx
mcp = FastMCP("sales-intelligence-server")
@mcp.tool()
async def search_call_transcripts(
query: str,
date_from: str = None,
date_to: str = None,
limit: int = 10
) -> dict:
"""Search sales call transcripts using AI-powered semantic search.
Args:
query: Natural language question or topic to search for
date_from: Optional start date filter (YYYY-MM-DD)
date_to: Optional end date filter (YYYY-MM-DD)
limit: Maximum excerpts to return (default 10)
Returns:
Relevant transcript excerpts with call metadata (date, duration, participants)
"""
response = await cloudflare_autorag.search(
query=query,
filters=build_date_filters(date_from, date_to),
top_k=limit
)
return format_transcript_results(response)
The HubSpot tools follow similar patterns for pipeline queries and activity reporting:
python
@mcp.tool()
async def get_weekly_rep_activity(
rep_email: str = None,
week_offset: int = 0
) -> dict:
"""Get activity summary for sales reps (calls, emails, tasks completed).
Args:
rep_email: Optional filter for specific rep (omit for all reps)
week_offset: 0 for current week, -1 for last week, etc.
Returns:
Activity counts by rep with completion rates and engagement metrics
"""
# HubSpot engagements API call with date filtering
...
Keyword search fails for conversational data. Sales reps don't use consistent terminology. A prospect might express budget concerns as "that's more than we planned," "we need to check with finance," or "what flexibility do you have on pricing?" Keyword search requires guessing the exact phrases. Semantic search understands the concept.
Cloudflare's AutoRAG implementation handles the embedding generation and vector search infrastructure. We didn't need to build or manage a separate vector database—just configure the RAG pipeline to index new transcripts as they arrive.
Transcript quality matters. Plaud's transcription is solid, but we still implemented a light cleaning step to handle speaker diarization inconsistencies. Garbage in, garbage out applies to RAG systems.
Date filtering is essential. Without date bounds, every search returns results from the entire archive. We made date parameters prominent in the tool interface and defaulted to recent calls for most queries.
CRM data sync timing. HubSpot's API returns current state, but call transcripts reference deals as they existed at call time. We added deal stage history to the HubSpot queries so users can see pipeline progression alongside conversation data.
Permission boundaries. Not everyone should see every transcript. We implemented rep-level filtering so individual contributors see their own calls while managers see their team's full archive.
After deployment, the client's sales manager described it as "finally being able to ask my CRM questions it can actually answer."
Typical queries now include:
The architecture supports incremental expansion. The client is already planning additions:
Each new capability is an additional MCP tool, no new interfaces to build.
This pattern fits well when:
If your organization is recording sales calls but not systematically learning from them, the barrier probably isn't technology, it's interface. The data exists. You just need a way to ask it questions.