会议智能搜索服务

Fathom MCP是一个本地优先的会议智能搜索服务器,将Fathom会议转化为可AI搜索的知识库,适用于需要快速、私密、低基础设施的会议智能团队。

  • by chand1012
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 chand1012/fathom-mcp

使用说明

Fathom has an official MCP now, you should juse use that one.

父亲MCP

本地第一台MCP服务器,将Fathom会议变成人工智能可搜索的知识库。

Fathom MCP从Fathom获取会议和成绩单,在本地生成嵌入 llama.cpp,将所有内容存储在SQLite中+ sqlite-vec,并通过FastMCP公开搜索/检索工具。

它是为那些想要快速、私密、低基础设施的团队而构建的,这些团队需要留在他们的机器上并与MCP本地客户端一起工作的智能。


为什么这个项目

会议录音很有价值,但很难快速查询。

此服务器为您提供:

  • Webhook和同步从Fathom摄取。
  • 在所有会议中进行语义转录搜索。
  • 集中QA的会议记录演练。
  • 本地向量堆栈(SQLite+GGUF嵌入),而不是外部向量基础设施。
  • 可供AI助手和代理工作流使用的MCP工具。

本地优先,通过设计

Fathom MCP经过精心设计,使您的可搜索会议知识在本地存在:

  • 转录块和元数据存储在本地SQLite中。
  • 嵌入是通过本地GGUF模型在进程中生成的 llama.cpp.
  • 相似性搜索使用 sqlite-vec 在同一个本地数据库中。
  • 没有外部矢量数据库,没有托管检索服务,没有额外的数据管道。

唯一的网络依赖性是Fathom摄入(API/webhooks)和一次性模型下载(如果GGUF文件尚未存在)。


核心能力

  • 混合服务器: 一个ASGI应用程序中的FastAPI API端点+FastMCP端点。
  • 经过身份验证的MCP: 由恒定时间比较支持的承载令牌身份验证。
  • Webhook验证: Svix风格的签名验证,具有重放保护功能。
  • 后台处理: Webhook和同步作业快速返回并异步处理。
  • 矢量搜索: sqlite-vec 对本地存储的转录嵌入进行余弦距离搜索。
  • 本地嵌入模型: 自动GGUF下载一次,然后在启动时本地重用。
  • 最小移动部件: 无需外部缓存、代理或矢量服务。

建筑

flowchart LR
    A[Fathom API + Webhooks] --> B[FastAPI Router]
    B --> C[Meeting Service]
    C --> D[(SQLite meetings + transcripts)]
    C --> E[llama.cpp Embedder]
    E --> D
    D --> F[sqlite-vec similarity search]
    F --> G[FastMCP Tools /mcp/]
    D --> H[HTTP Tool Endpoints /tools/*]

    subgraph L[Local-First Runtime]
      B
      C
      D
      E
      F
      G
      H
    end

快速开始

1) 先决条件

  • Python 3.14+
  • uv
  • 一个Fathom API密钥和webhook秘密

安装 uv 如果需要:

curl -LsSf https://astral.sh/uv/install.sh | sh

2) 安装依赖项

uv sync

3) 配置环境

创建 .env 项目根目录中的文件:

# Required
FATHOM_API_URL=https://api.fathom.ai/external/v1
FATHOM_API_KEY=your_fathom_api_key
FATHOM_WEBHOOK_SECRET=whsec_base64_encoded_secret
SERVICE_API_KEY=generate_a_unique_random_secret_for_this_server

# Optional (defaults shown)
HOST=0.0.0.0
PORT=8000
VECTOR_DB_PATH=./data/vectors.db
EMBEDDING_DIMENSION=384
EMBEDDING_MODEL_PATH=./data/bge-small-en-v1.5-q8_0.gguf
EMBEDDING_MODEL_URL=https://huggingface.co/ggml-org/bge-small-en-v1.5-Q8_0-GGUF/resolve/main/bge-small-en-v1.5-q8_0.gguf

笔记:

  • 在此项目配置中,环境名称不区分大小写。
  • SERVICE_API_KEY 必须是真正的秘密,而不是占位符,例如 your_service_api_key.
  • 首次启动时,如果缺少嵌入模型,则会自动下载。
  • 如果 EMBEDDING_MODEL_PATH 如果已存在,启动程序将保持完全本地状态以进行嵌入操作。

4) 运行服务器

uv run main.py

对于开发重新加载:

uv run --reload main.py

服务器默认为 http://localhost:8000.

5) 配置Fathom webhook(推荐)

要接收近乎实时的会议更新,请将Fathom配置为发送 newMeeting 事件发送到此服务器。

Webhook端点:

POST /webhook

要求:

  • 您的端点必须可从互联网公开访问。
  • 您的端点必须通过HTTPS(有效的TLS证书)提供服务。
  • Fathom中配置的webhook密钥必须匹配 FATHOM_WEBHOOK_SECRET.

典型的生产URL示例:

https://your-domain.com/webhook

如果在本地运行,请通过HTTPS隧道/反向代理公开您的服务 (例如:Cloudflare隧道、ngrok或公共入口)并使用它 Fathom中的公共HTTPS URL。


API和MCP端点

公共路线

  • POST /webhook -接收父亲 newMeeting webhook有效载荷。
  • POST /sync -触发最近会议的背景撤回。
  • GET /tools/* -MCP工具的HTTP镜像,用于快速测试。
  • POST|GET /mcp/ -FastMCP可流式传输HTTP端点。

身份验证模型

  • /sync, /tools/*,以及 /mcp/ 需要共享服务API密钥中间件:
    • Authorization: Bearer <SERVICE_API_KEY>
    • X-API-Key: <SERVICE_API_KEY>
  • /webhook 需要有效的Svix样式签名标头:
    • webhook-id
    • webhook-timestamp
    • webhook-signature
  • /docs, /redoc,以及 /openapi.json 公开(未经身份验证)

示例通话

触发器同步:

curl -X POST http://localhost:8000/sync \
  -H "Authorization: Bearer ${SERVICE_API_KEY}"

# Equivalent FastAPI auth header:
curl -X POST http://localhost:8000/sync \
  -H "X-API-Key: ${SERVICE_API_KEY}"

搜索会议:

curl "http://localhost:8000/tools/search_meetings?title=roadmap&limit=5" \
  -H "Authorization: Bearer ${SERVICE_API_KEY}"

从语义上搜索成绩单:

curl "http://localhost:8000/tools/search_transcripts?query=What%20did%20we%20decide%20about%20pricing%3F&limit=5" \
  -H "Authorization: Bearer ${SERVICE_API_KEY}"

在一个会议内搜索:

curl "http://localhost:8000/tools/search_meeting_transcripts?meeting_id=123&query=action%20items&limit=5" \
  -H "Authorization: Bearer ${SERVICE_API_KEY}"

按ID获取会议:

curl "http://localhost:8000/tools/get_meeting?meeting_id=123" \
  -H "Authorization: Bearer ${SERVICE_API_KEY}"

获取会议的完整成绩单块:

curl "http://localhost:8000/tools/get_meeting_transcript?meeting_id=123" \
  -H "Authorization: Bearer ${SERVICE_API_KEY}"

MCP工具暴露

FastMCP服务器在以下位置公开了这些工具功能 /mcp 对于AI助手和代理工作流程:

  • search_meetings(title, start_date, end_date, limit)
  • search_transcripts(query, limit)
  • search_meeting_transcripts(meeting_id, query, limit)
  • get_meeting(meeting_id)
  • get_meeting_transcript(meeting_id)

这些映射到HTTP使用的相同数据访问层 /tools/* 路线。


本地数据模型

SQLite数据库表:

  • meetings:规范的会议元数据和摘要/行动项有效载荷。
  • transcripts:带有相关嵌入blob的转录块。
  • vec_transcripts (虚拟):用于KNN/余弦搜索的矢量索引 sqlite-vec.

默认数据库路径: ./data/vectors.db.

这种以文件为中心的布局使备份、迁移和检查变得简单。


码头工人

已发布图片:

ghcr.io/chand1012/fathom-mcp:latest

从GHCR中提取最新图像:

docker pull ghcr.io/chand1012/fathom-mcp:latest

运行容器:

mkdir -p ./data

docker run --rm -p 8000:8000 \
  -v "$(pwd)/data:/data" \
  -e FATHOM_API_URL="https://api.fathom.video" \
  -e FATHOM_API_KEY="your_fathom_api_key" \
  -e FATHOM_WEBHOOK_SECRET="whsec_base64_encoded_secret" \
  -e SERVICE_API_KEY="generate_a_unique_random_secret_for_this_server" \
  ghcr.io/chand1012/fathom-mcp:latest

如果您希望主机上的文件归当前用户所有,请添加:

-u "$(id -u):$(id -g)"

这 ./data 主机上的目录已装载到 /data 在容器中, 所以两者 /data/bge-small-en-v1.5-q8_0.gguf 和 /data/vectors.db 持续 在容器重启之间。

可选:如果您想在本地构建而不是使用GHCR:

docker build -t fathom-mcp .

开发工作流程

运行测试:

uv run pytest

运行特定测试:

uv run pytest test_full_workflow.py::test_full_workflow

棉绒和格式:

uv run ruff check .
uv run ruff format .

类型检查:

uv run mypy .

项目布局

src/fathom_mcp/
  api/
    client.py      # Fathom API client
    router.py      # Webhook/sync/tool HTTP endpoints
    service.py     # Fetch + store + transcript vectorization workflow
  core/
    config.py      # Pydantic settings and environment configuration
  mcp/
    server.py      # FastMCP server and tool registrations
  vector/
    database.py    # SQLite + sqlite-vec storage/search layer
    embedder.py    # Local llama.cpp embedding model integration
  webhooks/
    handler.py     # Svix signature verification + webhook ingestion
main.py            # Application assembly and startup lifecycle

安全说明

  • 不要承诺 .env 或秘密。
  • 旋转 SERVICE_API_KEY 定期发送webhook密钥。
  • 中间件使用相同的服务密钥保护API和安装的MCP应用程序。
  • 在处理有效负载之前验证webhook签名(已强制执行)。
  • 默认情况下,本地优先减少了外部数据暴露,因为存储和矢量搜索都在盒子上。

路线图创意

  • 增量同步调度。
  • 多租户密钥管理。
  • 可选的云嵌入提供商。
  • 更丰富的MCP工具元数据和分页支持。
  • 用于检测摄取/搜索延迟的可观察性仪表板。

贡献

欢迎PR。保持更改的重点,包括对行为更改的测试,并在打开PR之前运行lint/type检查。


许可证

此存储库中当前不包含许可证文件。