使用说明
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-接收父亲newMeetingwebhook有效载荷。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-idwebhook-timestampwebhook-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检查。
许可证
此存储库中当前不包含许可证文件。
