返回 MCP 目录
public公开dns本地运行

lenny-rag-mcp

一个基于299个Lenny Rachitsky播客转录文本的层次化RAG MCP服务器,支持语义搜索和渐进式信息获取,用于产品开发头脑风暴和知识检索。

article

README

🚀 Lenny RAG MCP 服务器

Lenny RAG MCP 服务器是一个基于 299 篇 Lenny Rachitsky 播客文字稿提供分层检索增强生成(RAG)功能的 MCP 服务器。它能够通过检索相关见解、真实案例和完整文字稿上下文,助力产品开发头脑风暴。

🚀 快速开始

克隆仓库

# 克隆仓库(包含通过 Git LFS 预构建的索引)
git clone git@github.com:mpnikhil/lenny-rag-mcp.git
cd lenny-rag-mcp

创建并激活虚拟环境

# 创建并激活虚拟环境
python -m venv venv
source venv/bin/activate

安装包

# 安装包
pip install -e .

Claude 代码配置

claude mcp add lenny --scope user -- /path/to/lenny-rag-mcp/venv/bin/python -m src.server

或者添加到 ~/.claude.json

{
  "mcpServers": {
    "lenny": {
      "type": "stdio",
      "command": "/path/to/lenny-rag-mcp/venv/bin/python",
      "args": ["-m", "src.server"],
      "cwd": "/path/to/lenny-rag-mcp"
    }
  }
}

Claude 桌面端配置

添加到 ~/Library/Application Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "lenny": {
      "command": "/path/to/lenny-rag-mcp/venv/bin/python",
      "args": ["-m", "src.server"],
      "cwd": "/path/to/lenny-rag-mcp"
    }
  }
}

Cursor 配置

添加到项目中的 .cursor/mcp.json 或全局的 ~/.cursor/mcp.json

{
  "mcpServers": {
    "lenny": {
      "command": "/path/to/lenny-rag-mcp/venv/bin/python",
      "args": ["-m", "src.server"],
      "cwd": "/path/to/lenny-rag-mcp"
    }
  }
}

⚠️ 重要提示

请在所有配置中,将 /path/to/lenny-rag-mcp 替换为你实际克隆仓库的路径。

✨ 主要特性

search_lenny

对整个语料库进行语义搜索,返回用于渐进式展示的指针。 | 参数 | 类型 | 描述 | |------|------|------| | query | 字符串 | 搜索查询(例如:"B2B 产品定价"、"创始人模式") | | top_k | 整数 | 结果数量(默认:5,最大:20) | | type_filter | 字符串 | 按类型过滤:insight(见解)、example(示例)、topic(主题)、episode(剧集) |

返回结果:包含相关性得分、剧集引用和主题 ID 的排名结果,便于深入查询。

get_chapter

加载具有完整上下文的特定主题。在使用 search_lenny 后使用此工具获取详细信息。 | 参数 | 类型 | 描述 | |------|------|------| | episode | 字符串 | 剧集文件名(例如:"Brian Chesky.txt") | | topic_id | 字符串 | 主题 ID(例如:"topic_3") |

返回结果:主题摘要、所有见解、所有示例和原始文字稿片段。

get_full_transcript

加载带有元数据的完整剧集文字稿。 | 参数 | 类型 | 描述 | |------|------|------| | episode | 字符串 | 剧集文件名(例如:"Brian Chesky.txt") |

返回结果:完整文字稿(10 - 40K 个标记)、剧集元数据和主题列表。

list_episodes

浏览可用剧集,可选择按专业领域进行过滤。 | 参数 | 类型 | 描述 | |------|------|------| | expertise_filter | 字符串 | 按标签过滤(例如:"增长"、"定价"、"人工智能") |

返回结果:包含 299 个剧集的列表,其中包含嘉宾姓名和专业领域标签。

📦 安装指南

克隆仓库

git clone git@github.com:mpnikhil/lenny-rag-mcp.git
cd lenny-rag-mcp

创建并激活虚拟环境

python -m venv venv
source venv/bin/activate

安装包

pip install -e .

💻 使用示例

基础用法

# 克隆仓库
git clone git@github.com:mpnikhil/lenny-rag-mcp.git
cd lenny-rag-mcp

# 创建并激活虚拟环境
python -m venv venv
source venv/bin/activate

# 安装包
pip install -e .

高级用法

# 使用 Claude 代码配置
claude mcp add lenny --scope user -- /path/to/lenny-rag-mcp/venv/bin/python -m src.server

📚 详细文档

数据整理方法

分层提取

每个文字稿被处理成一个 4 级层次结构,支持渐进式展示:

Episode
├── Topics (10 - 20 per episode)
│   ├── Insights (2 - 4 per topic)
│   └── Examples (1 - 3 per topic)

这使得 Claude 可以从轻量级搜索结果开始,仅在需要时深入查询,从而有效利用上下文窗口。

提取模式

{
  "episode": {
    "guest": "Guest Name",
    "expertise_tags": ["growth", "pricing", "leadership"],
    "summary": "150 - 200 word episode summary",
    "key_frameworks": ["Framework 1", "Framework 2"]
  },
  "topics": [{
    "id": "topic_1",
    "title": "Searchable topic title",
    "summary": "Topic summary",
    "line_start": 1,
    "line_end": 150
  }],
  "insights": [{
    "id": "insight_1",
    "text": "Actionable insight or contrarian take",
    "context": "Additional context",
    "topic_id": "topic_1",
    "line_start": 45,
    "line_end": 52
  }],
  "examples": [{
    "id": "example_1",
    "explicit_text": "The story as told in the transcript",
    "inferred_identity": "Airbnb",
    "confidence": "high",
    "tags": ["marketplace", "growth", "launch strategy"],
    "lesson": "Specific lesson from this example",
    "topic_id": "topic_1",
    "line_start": 60,
    "line_end": 85
  }]
}

隐式锚点检测

许多嘉宾在提及公司时并未明确说出公司名称(例如:“在我之前的公司……”)。提取提示会指导模型根据嘉宾的背景推断公司身份:

  • 当 Brian Chesky 说“当我们开始时” → Airbnb(高置信度)
  • 一位市场专家说“一家拼车公司” → 可能是优步/来福车(中等置信度) 这使得能够发现仅通过关键词搜索无法找到的示例。

质量阈值

每个文字稿提取都会根据最低阈值进行验证: | 元素 | 最低数量 | 典型数量 | |------|---------|---------| | 主题 | 10 | 15 - 20 | | 见解 | 15 | 25 - 35 | | 示例 | 10 | 18 - 25 | 低于阈值的提取会触发警告,需要人工审核。

模型与技术栈

| 组件 | 模型/工具 | 用途 | |------|----------|------| | 预处理 | Claude Haiku(通过 Claude CLI) | 从文字稿中提取结构化层次结构 | | 嵌入 | bge-small-en-v1.5 | 用于搜索的语义相似度计算 | | 向量数据库 | ChromaDB | 持久化向量存储 | | MCP 框架 | mcp(Python SDK) | 为 Claude 提供工具接口 |

为什么选择 Claude Haiku 进行预处理?

  • 质量:Haiku 能够可靠地遵循复杂的提取提示。
  • 成本:每个文字稿约 $0.02 - 0.03(299 个剧集总计约 $6 - 9)。
  • 速度:每个文字稿约 30 秒。

为什么选择 bge-small-en-v1.5 进行嵌入?

  • 性能:在其规模下具有顶级的检索质量。
  • 效率:384 维,推理速度快。
  • 本地化:完全在 CPU 上运行,无需调用 API。

语料库统计

| 指标 | 数量 | |------|------| | 剧集 | 299 | | 主题 | 6,183 | | 见解 | 8,840 | | 示例 | 6,502 | | 平均每个剧集的主题数 | 20.7 | | 平均每个剧集的见解数 | 29.6 | | 平均每个剧集的示例数 | 21.7 |

重建索引

仓库中包含一个预构建的 ChromaDB 索引。若要从头开始重建:

重新处理文字稿(需要 Claude CLI)

# 处理所有未处理的文字稿
python scripts/preprocess_haiku.py

# 处理特定文件
python scripts/preprocess_haiku.py --file "Brian Chesky.txt"

# 并行处理(4 批,每批 50 个)
python scripts/preprocess_haiku.py --limit 50 --offset 0 &
python scripts/preprocess_haiku.py --limit 50 --offset 50 &
python scripts/preprocess_haiku.py --limit 50 --offset 100 &
python scripts/preprocess_haiku.py --limit 50 --offset 150 &

重建嵌入

# 增量式(仅处理新文件)
python scripts/embed.py

# 完全重建
python scripts/embed.py --rebuild

项目结构

lenny-rag-mcp/
├── transcripts/           # 299 个原始 .txt 播客文字稿
├── preprocessed/          # 提取的 JSON 层次结构(每个剧集一个)
├── chroma_db/             # 向量嵌入(Git LFS)
├── prompts/
│   └── extraction.md      # Haiku 提取提示
├── src/
│   ├── server.py          # MCP 服务器和工具定义
│   ├── retrieval.py       # LennyRetriever 类(ChromaDB 包装器)
│   └── utils.py           # 文件加载实用工具
├── scripts/
│   ├── preprocess_haiku.py  # Claude CLI 预处理
│   └── embed.py             # ChromaDB 嵌入管道
└── pyproject.toml

📄 许可证

本项目采用 MIT 许可证。

help

运行方式说明

cloud

托管运行

托管运行通常表示这个 MCP Server 由服务方环境承载,用户一般按页面提供的连接方式或授权流程接入,不需要在本地长期启动一个 MCP 进程

  1. 打开服务方连接页
  2. 完成授权或复制端点
  3. 在 MCP 客户端中连接
terminal

本地运行 / 其它方式

本地运行通常需要用户在自己的电脑或服务器上安装依赖,把 server_config 复制到 MCP 客户端,并按 env_schema 补齐环境变量、密钥或其它配置

  1. 复制 server_config
  2. 安装所需依赖
  3. 补齐环境变量后重启客户端