MCP Call Recording Server

MCP Call Recording Server

Enables semantic search over VTT transcript files using AI-powered structured summaries, allowing natural language queries about client call transcripts through Claude Desktop or Copilot Studio.

Category
访问服务器

README

MCP Call Recording Server

An MCP (Model Context Protocol) server that provides semantic search over VTT transcript files using AI-powered structured summaries. This server enables business stakeholders to query client call transcripts using natural language through Claude Desktop and Microsoft Copilot 365 Studio.

Now powered by OpenAI GPT-4-turbo for best-in-class summary quality and structured extraction.

Architecture Diagram (generated using Gemini Nano Banana)

<img width="954" height="906" alt="image" src="https://github.com/user-attachments/assets/a2bee971-9b3e-4a22-b1d7-15ce1136b9f8" />

Data Flow

This is improved version of data flow after we identified improvements we can make at the embedding levels. <img width="736" height="427" alt="image" src="https://github.com/user-attachments/assets/abd7d122-c602-4bed-a89f-1b239432525b" />

Features

  • Automatic Indexing: Monitors a directory for VTT transcript files and automatically indexes them in the background
  • AI-Powered Summaries: Uses OpenAI GPT-4-turbo to generate perfect structured summaries with CALL TYPE, PARTICIPANTS, COMPANY/COMPANIES, KEY TOPICS, ACTION ITEMS, and DECISIONS MADE
  • Advanced Embeddings: OpenAI text-embedding-3-small (1536 dimensions) for superior semantic search quality
  • Natural Language Queries: Ask questions like "Summarize the Bank of America sales call" or "What were the action items from the Capital One call?"
  • 100% Consistent Format: GPT-4-turbo maintains perfect structure even for long transcripts (860+ lines, 286+ segments)
  • All Participants Captured: Never miss a meeting attendee - all speakers are identified correctly
  • No Hallucinations: Correctly shows "Unknown" for missing information instead of fabricating data
  • Single Tool Interface: Simple query_transcripts tool that handles all queries (pure semantic search)

The server uses:

  • OpenAI GPT-4-turbo: Best-in-class LLM for generating structured summaries (~$0.01-0.05 per transcript)
  • OpenAI Embeddings: text-embedding-3-small for 1536-dimensional semantic search (~$0.0001 per transcript)
  • Chroma: Vector database; the Node.js client connects to a ChromaDB server running at http://localhost:8000. Persisted data is stored in a directory you configure when starting the Chroma server (see CHROMADB_SETUP.md).
  • File Watcher (chokidar): Automatically detects and indexes new, changed, or deleted VTT files
  • MCP Protocol: Standard protocol for AI assistant integration (stdio transport)

Prerequisites

  • Node.js 18+
  • OpenAI API key (get one at https://platform.openai.com/api-keys)
  • $5+ OpenAI credit (covers ~200 transcripts)
  • Directory containing VTT transcript files
  • ChromaDB server running on http://localhost:8000 (see CHROMADB_SETUP.md)

Installation

  1. Clone or download this repository.

  2. Install dependencies:

    npm install
    
  3. Build the TypeScript code:

    npm run build
    
  4. Create a .env file in the project root:

    OPENAI_API_KEY=sk-proj-your-key-here
    VTT_DIRECTORY=/path/to/vtt/transcript/files
    CHROMA_DB_PATH=./chroma_db
    

    See ENV_SETUP.md for detailed environment setup instructions.

  5. Start the ChromaDB server (in a separate terminal) before running the MCP server—see CHROMADB_SETUP.md.

Configuration

Environment Variables

The MCP server reads configuration from environment variables (e.g. from a .env file in the project root):

Variable Required Description
OPENAI_API_KEY Yes Your OpenAI API key for GPT-4-turbo summaries and embeddings
VTT_DIRECTORY Yes Path to the directory containing VTT transcript files
CHROMA_DB_PATH No Path for Chroma server data (default: ./chroma_db)

Cost: ~$0.02 per transcript on average (varies with length). Your $5 credit covers approximately 200 transcripts.

Claude Desktop Setup

  1. Edit your Claude Desktop configuration file:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows: %APPDATA%\Claude\claude_desktop_config.json
    • Linux: ~/.config/claude/claude_desktop_config.json
  2. Add the MCP server (use the absolute path to dist/index.js):

    {
      "mcpServers": {
        "call-recording": {
          "command": "node",
          "args": ["/absolute/path/to/MCP_Call_Recording/dist/index.js"]
        }
      }
    }
    

    Example config is in config/claude-desktop.json.

  3. Restart Claude Desktop.

  4. The server will load .env, index existing VTT files in VTT_DIRECTORY, and watch for new, changed, or deleted files.

Microsoft Copilot 365 Studio Setup

The server currently uses stdio transport. For Copilot Studio you would need to run it as an HTTP MCP server (e.g. add an HTTP transport in src/index.ts or run behind an adapter).

For reference, config/copilot-studio.json illustrates a possible structure (name, description, transport type, environment variables). Set VTT_DIRECTORY, CHROMA_DB_PATH, and OPENAI_API_KEY in your deployment environment.

Usage

Once configured, you can ask Claude Desktop (or Copilot Studio once HTTP is set up) questions about your call transcripts, for example:

  • "What were the main risks discussed in the last call with Bank of America?"
  • "Identify the top risk identified in last client call with Bank of America with Sales"
  • "What decisions were made in calls with Acme Corp this month?"
  • "Summarize the key points from the call with TechCorp on January 15th"

The server will:

  1. Generate an embedding for your question
  2. Run a semantic search in the vector database (no metadata filtering)
  3. Return a formatted answer with relevant segments, metadata (client, date, speaker), and relevance scores

Tool: query_transcripts

  • question (required): Natural language question about the transcripts.
  • limit (optional, default: 10): Maximum number of results to return.
  • minScore (optional, default: 0.0): Minimum relevance score (0–1). Segments below this are excluded.

How It Works

Automatic Indexing

On startup the server:

  1. Scans VTT_DIRECTORY for existing .vtt files
  2. Parses each file into segments with timestamps
  3. Extracts metadata (client name, date, participants, call type) from filenames and VTT content
  4. Generates AI-powered structured summary using OpenAI GPT-4-turbo
  5. Creates semantic embedding of the entire summary using OpenAI text-embedding-3-small (1536 dimensions)
  6. Stores summary and embedding in ChromaDB for semantic search
  7. Uses the same pipeline when the file watcher detects new or changed files

File Watching

The server watches the VTT directory with chokidar:

  • New files: Indexed automatically
  • Changed files: Re-indexed (existing segments for that file are removed first)
  • Deleted files: Segments for that file are removed from the database

Query Processing

For each query:

  1. The question is embedded using OpenAI text-embedding-3-small (same model used for indexing)
  2. Chroma returns the closest transcript summaries by embedding similarity (cosine distance → converted to a 0–1 score)
  3. Results are filtered by minScore, sorted by score, and formatted with summary text and metadata

Reindexing

If you need to refresh the index for one file or the whole directory:

  • Single file (force reindex one VTT file):

    npm run reindex -- path/to/file.vtt
    # or: tsx reindex-file.ts path/to/file.vtt
    
  • All files in VTT_DIRECTORY (force reindex everything):

    npm run reindex-all
    # or: tsx reindex-all.ts
    

Both scripts use your .env (e.g. VTT_DIRECTORY, CHROMA_DB_PATH, OPENAI_API_KEY). The Chroma server must be running.

Note: Re-indexing costs OpenAI API credits (~$0.02 per transcript).

File Structure

MCP_Call_Recording/
├── src/
│   ├── index.ts                 # Entry point: init services, index existing files, start file watcher, start MCP server
│   ├── server.ts                # MCP server setup and tool registration (query_transcripts)
│   ├── tools/
│   │   └── query.ts             # query_transcripts tool (embedding + vector search + format answer)
│   ├── services/
│   │   ├── vttParser.ts         # VTT file parsing
│   │   ├── summaryService.ts    # OpenAI GPT-4-turbo for structured summaries
│   │   ├── embeddingService.ts  # OpenAI text-embedding-3-small (1536-dim)
│   │   ├── vectorDb.ts          # Chroma client (connects to http://localhost:8000)
│   │   ├── metadataExtractor.ts # Metadata from filename and VTT content
│   │   ├── indexer.ts           # Index one file or directory into Chroma
│   │   └── fileWatcher.ts       # chokidar-based file watcher
│   ├── types/
│   │   └── transcript.ts        # TypeScript interfaces
│   └── utils/
│       └── chunking.ts          # Legacy chunking utilities (now using full-transcript summaries)
├── config/
│   ├── claude-desktop.json      # Example Claude Desktop MCP config
│   └── copilot-studio.json      # Example structure for Copilot Studio (HTTP not implemented)
├── reindex-file.ts             # Script to reindex a single VTT file
├── reindex-all.ts              # Script to reindex all VTT files in VTT_DIRECTORY
├── check-embeddings.sql        # Optional: SQL for inspecting Chroma SQLite DB (chroma_db)
├── start_chroma.sh             # Helper to start Chroma server (see CHROMADB_SETUP.md)
├── start_chroma.py
├── package.json
├── tsconfig.json
├── CHROMADB_SETUP.md
└── README.md

Development

Run (production build)

npm run build
npm start

Development mode (tsx, no build step)

npm run dev

Watch (rebuild on change)

npm run watch

Reindex

npm run reindex -- vtt_files/SomeFile.vtt
npm run reindex-all

VTT File Format

The server expects WebVTT files (.vtt extension). Example:

WEBVTT

00:00:00.000 --> 00:00:05.000
Hello, this is a transcript segment.

00:00:05.000 --> 00:00:10.000
<v Speaker Name>This segment has a speaker identifier.</v>

Metadata Extraction

Metadata is derived from:

  1. Filename pattern: {ClientName}_{Date}_{Type}.vtt
    Example: BankOfAmerica_2026-01-15_Sales.vtt
  2. VTT headers: NOTE comments or other header metadata
  3. File modification time: Fallback when no date is found in filename or content

Troubleshooting

Server won't start

  • Ensure all required environment variables are set in .env (especially OPENAI_API_KEY and VTT_DIRECTORY).
  • Verify your OpenAI API key is valid and has credits.
  • Ensure the ChromaDB server is running at http://localhost:8000 (see CHROMADB_SETUP.md).
  • In Claude Desktop config, use the absolute path to dist/index.js.
  • Check stderr/logs for errors.

Files not being indexed

  • Confirm VTT_DIRECTORY points to the correct directory and files have .vtt extension.
  • Check file permissions and stderr for indexing errors.
  • For a single file, try: npm run reindex -- path/to/file.vtt.

Poor or empty search results

  • Ensure transcripts are valid VTT and were indexed (watch startup logs or use reindex scripts).
  • Lower minScore (e.g. 0.0) to see more results; the tool default is 0.0.
  • Check OpenAI API usage to confirm embeddings are being generated.

OpenAI API Issues

  • Rate limits: OpenAI has rate limits. If indexing many files, they're processed sequentially.
  • Cost monitoring: Check your usage at https://platform.openai.com/usage
  • Budget alerts: Set limits at https://platform.openai.com/settings/organization/billing/limits

Security Considerations

  • API Key Security: Keep your OpenAI API key secure. Never commit .env files to version control.
  • Cost Control: Set usage limits in your OpenAI account to prevent unexpected charges.
  • Data Privacy: Transcripts are sent to OpenAI for processing. Ensure compliance with your data policies.
  • Validate and constrain file paths to avoid directory traversal.
  • Sanitize or limit user query input as needed.
  • Consider rate limiting and access control for production or HTTP deployment.

Migration from Ollama

If you're upgrading from the previous Ollama-based version, see docs/OPENAI_MIGRATION.md for complete migration instructions.

License

MIT

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选