______________________________________________________________________
标题:书签镜头 表情符号🔖 颜色来源:靛蓝 颜色致:蓝色 sdk:docker 固定:false 许可证:mit short_description:支持MCP的AI代理的语义书签引擎 标签:
- 构建mcp跟踪消费者
- 打造mcp轨道创意
______________________________________________________________________
书签镜头
你的AI助手会记住你保存的所有内容。
](https://badge.fury.io/py/bookmark-lens)  
书签镜头是什么?
厌倦了在浏览器文件夹中丢失书签?搜索“那篇关于React钩子的文章”,但不记得是提到了“钩子”、“useState”还是“功能组件”?
书签镜头 通过语义搜索解决了这个问题。按书签内容查找书签 *关于*,而不仅仅是精确的关键字。搜索“身份验证教程”,获得有关登录系统、OAuth、JWT的结果,即使它们从未提到“身份验证”一词
传统书签: 文件夹→ 子文件夹→ 我把它保存在哪里了? → 放弃吧,再谷歌一下 使用书签镜头: “查找上周的React教程”→ 立即找到
所有处理都在您的机器上本地进行。您的书签保持私密。
在行动中看到它
*演示即将推出-智能书签搜索功能*
特性
- 🧠 语义搜索 –按含义查找书签,而不仅仅是关键字
- 🆓 完全免费 –核心功能不需要API密钥
- 🤖 LLM增强型(可选) –如果您的LLM使用此MCP工具,它可以生成摘要、自动标记和主题分类
- 语义搜索 -按含义查找书签,而不仅仅是关键字
- 元数据 -自动提取标题、描述和内容
- 采用智能标签 -手动标签+自动生成标签(智能模式)
- 主题分类 -自动分类(智能模式)
- 日期筛选 -按时间范围搜索(LLM支持自然语言)
- MCP本地 -适用于Claude Desktop和其他MCP客户端
- 快速 -使用句子变换器的局部嵌入
______________________________________________________________________
快速设置
克劳德桌面(stdio模式)
- 打开您的Claude Desktop配置文件:
- macOS: ~/Library/Application Support/Claude/claude_desktop_config.json - 视窗: %APPDATA%\Claude\claude_desktop_config.json
- 将书签镜头添加到
mcpServers章节:
{
"mcpServers": {
"bookmark-lens": {
"command": "uvx",
"args": ["bookmark-lens"]
}
}
}- 重新启动克劳德桌面
就是这样!无需安装、设置或配置。
其他MCP客户端
对于其他MCP兼容客户端,请使用:
uvx bookmark-lensHTTP模式(自托管)
书签镜头也支持 可流式传输的HTTP 基于网络的集成传输。这需要自托管,因为没有可用的托管版本。
# Run HTTP server on default port (8000)
bookmark-lens --transport http
# Server available at: http://127.0.0.1:8000/mcp
# Custom port
bookmark-lens --transport http --port 8080多用户支持
HTTP模式支持多个用户通过 X-User-Id 头球每个用户的书签都是完全隔离的:
# User "alice" saves a bookmark
curl -H "X-User-Id: alice" http://localhost:8000/mcp
# User "bob" saves a bookmark
curl -H "X-User-Id: bob" http://localhost:8000/mcp
# Alice and Bob have separate bookmark collections- 默认:如果没有
X-User-Id提供header,默认为dev-user - 隔离:每个用户只能访问自己的书签、标签和统计信息
- 单个实例:一台服务器可以为多个用户提供完全数据隔离的服务
📖 自助托管指南: 看 部署.md 有关运行自己的HTTP服务器、Docker部署、多用户设置和安全考虑的详细说明。
______________________________________________________________________
对话示例
研究工作流程
You: Save https://arxiv.org/abs/2401.12345 with note "Interesting paper on attention mechanisms"
Claude: Saved! I've extracted:
- Title: "Efficient Attention: A Survey"
- Description: Comprehensive review of attention mechanisms...
- Auto-generated tags: #ai #research #attention #transformers
You: Find papers about attention from this month
Claude: Found 3 bookmarks:
1. "Efficient Attention: A Survey" (arxiv.org) - Today
Tags: ai, research, attention, transformers
2. "Flash Attention Implementation" (github.com) - 3 days ago
Tags: pytorch, optimization, gpu
3. "Attention is All You Need - Annotated" (nlp.seas.harvard.edu) - 1 week ago
Tags: tutorial, transformers, nlp学习路径
You: I'm learning React. Save good tutorials as I find them with tag #react-learning
Claude: Great! I'll tag them for you.
You: [Later] Show me all my React learning resources
Claude: You have 12 React bookmarks:
**Fundamentals (4 bookmarks):**
- Official React Docs - react.dev
- React Tutorial for Beginners - youtube.com
- Thinking in React - beta.reactjs.org
**Advanced (5 bookmarks):**
- Custom Hooks Patterns - usehooks.com
- React Performance Optimization - web.dev
...
You: Which ones cover hooks?
Claude: 8 of your bookmarks discuss hooks:
[Semantic search finds all hook-related content even without "hooks" in title]内容策展
You: Show me my GitHub bookmarks by topic
Claude: Here's the breakdown:
**AI/ML (15 bookmarks)**
- Transformer models
- LLM training techniques
- Embedding systems
**Frontend (23 bookmarks)**
- React ecosystem
- Build tools
- State management
**DevOps (8 bookmarks)**
- Kubernetes guides
- CI/CD pipelines
You: What are my top 3 most-saved domains?
Claude:
1. github.com - 47 bookmarks
2. medium.com - 23 bookmarks
3. dev.to - 18 bookmarks更多示例: 看 用法\_ GIDE.md 详细的工作流程和高级查询模式。
______________________________________________________________________
建筑
bookmark-lens/
├── src/bookmark_lens/
│ ├── server.py # MCP server (stdio + HTTP/SSE)
│ ├── config.py # Configuration management
│ ├── database/
│ │ ├── duckdb_client.py # Relational data (bookmarks, tags)
│ │ └── lancedb_client.py # Vector embeddings
│ ├── models/
│ │ └── bookmark.py # Pydantic models
│ └── services/
│ ├── content_fetcher.py # Web page fetching
│ ├── embedding_service.py # Text → vectors
│ ├── bookmark_service.py # Orchestration
│ └── search_service.py # Hybrid search
├── data/ # Local databases (gitignored)
└── tests/
└── manual_test.py # End-to-end testing技术栈
- FastMCP -双传输模型上下文协议(stdio+HTTP/SSE)
- DuckDB -关系数据库(书签、元数据、标签)
- LanceDB -矢量数据库(语义搜索嵌入)
- 句子变换器 -本地嵌入模型(全MiniLM-L6-v2)
- 可读性lxml -从网页中提取内容
- 派丹蒂克 -数据验证和序列化
技术深潜: 看 技术.md 了解混合搜索架构、性能基准和实现细节。
______________________________________________________________________
常见问题解答
这与浏览器书签有何不同? 浏览器书签使用文件夹和精确的名称匹配。书签镜头使用AI来理解意义。搜索“身份验证”并找到有关登录、OAuth、JWT的书签,即使他们从未使用过这个词。
Raindrop.io或Pocket怎么样? 它们是基于云的(您的数据在其服务器上),需要订阅高级功能。书签镜头是100%本地免费的。你的数据永远不会离开你的机器。
我需要API密钥吗? 不!核心功能(保存、搜索、标记)在没有API密钥的情况下完全离线工作。智能模式(自动摘要、自动标记)是可选的,并使用您自己的LLM API密钥。
Smart Mode的价格是多少? 与克劳德·海库合作:每个书签约0.0005美元(半美分)。以0.50美元的价格处理1000个书签。它是可选的——核心功能是免费的。
我的数据是私有的吗? 100%私人。一切都在本地运行。核心功能根本不使用互联网。智能模式仅将书签内容发送到您选择的LLM(而不是我们)。
如果我有成千上万的书签怎么办? 书签镜头可以轻松处理数千个。矢量搜索即使在大型集合中也很快。句子转换器模型在CPU上本地运行。
为什么是语义搜索而不是关键字? 当你不记得确切的单词时,关键字就会失败。“查找身份验证教程”找不到“面向初学者的OAuth指南”。语义搜索理解它们是关于同一主题的。
我可以导出我的书签吗? 尚未(路线图功能)。目前,数据存储在本地DuckDB+LanceDB数据库中。如果需要,您可以直接访问它们。
我可以用HTTP访问自托管吗? 对!Bookmark Lens支持流式HTTP传输。看 部署.md 获取自托管说明。注意:没有托管版本-您必须运行自己的服务器。
它支持多个用户吗? 对!在HTTP模式下,Bookmark Lens支持多个用户通过 X-User-Id 头球每个用户的书签都是完全隔离的,他们只能访问自己的数据。一个服务器实例可以为许多用户提供完全数据分离的服务。stdio模式仅限单用户(默认为 dev-user).
______________________________________________________________________
MCP工具
save_bookmark
保存带有可选注释和标签的URL。
参数:
url(必填):书签的URLnote(可选):保存的背景或原因tags(可选):标签列表
例子:
{
"url": "https://example.com/article",
"note": "Great explanation of embeddings",
"tags": ["ai", "ml", "tutorial"]
}search_bookmarks
使用可选过滤器在语义上搜索书签。
参数:
query(必填):搜索什么domain(可选):按域过滤(例如“github.com”)tags(可选):按标签筛选from_date(可选):ISO 8601日期字符串to_date(可选):ISO 8601日期字符串limit(可选):最大结果(默认值:10)
例子:
{
"query": "machine learning tutorials",
"domain": "github.com",
"tags": ["python"],
"from_date": "2024-11-07T00:00:00Z",
"limit": 5
}get_bookmark
按ID获取书签的完整详细信息。
参数:
id(必填):书签ID
update_bookmark
更新书签的注释和/或标签。
参数:
id(必填):书签IDnote(可选):新注释tags(可选):添加/替换标签tag_mode(可选):“替换”或“附加”(默认:“替换“)
delete_bookmark
删除书签及其所有相关数据。
参数:
id(必填):书签ID
例子:
{
"id": "bkm_abc123"
}list_tags
列出所有标签及其使用次数。
参数: 无
示例响应:
{
"success": true,
"count": 5,
"tags": [
{"tag": "ai", "count": 20},
{"tag": "python", "count": 15},
{"tag": "tutorial", "count": 8}
]
}get_bookmark_stats
使用可选过滤器获取书签收藏的统计信息。
参数:
stat_type(可选):统计类型
- "total" -总计数(默认) - "by_domain" -按领域细分 - "by_topic" -按主题细分 - "by_tag" -按标签细分 - "by_date" -活动随时间变化
domain(可选):按域筛选topic(可选):按主题筛选tags(可选):按标签筛选from_date(可选):日期后过滤器(ISO 8601)to_date(可选):日期前过滤器(ISO 8601)limit(可选):对于细分统计,前N个结果(默认值:10)
示例:
书签总数:
{
"stat_type": "total"
}本周保存的书签:
{
"stat_type": "total",
"from_date": "2024-11-07T00:00:00Z"
}顶级域名:
{
"stat_type": "by_domain",
"limit": 5
}按域列出的AI书签:
{
"stat_type": "by_domain",
"topic": "AI"
}______________________________________________________________________
配置
所有配置都是通过环境变量进行的(.env 文件):
# Database paths
BOOKMARK_LENS_DUCKDB_PATH=./data/bookmark_lens.db
BOOKMARK_LENS_LANCEDB_PATH=./data/embeddings.lance
# Embedding model
EMBEDDING_MODEL_NAME=all-MiniLM-L6-v2
EMBEDDING_DIMENSION=384
# Content fetching
BOOKMARK_LENS_FETCH_TIMEOUT=30
BOOKMARK_LENS_USER_AGENT=bookmark-lens/0.1.0
MAX_CONTENT_LENGTH=50000安装选项
减小安装大小(仅限CPU的PyTorch):
默认情况下,PyTorch可以安装CUDA支持(~3GB)。对于大多数部署,仅CPU就足够了,而且要小得多(~200MB):
# Install CPU-only PyTorch first
pip install torch --index-url https://download.pytorch.org/whl/cpu
# Then install bookmark-lens
pip install bookmark-lens这建议用于Docker容器、无服务器部署或任何不需要GPU加速的环境。
______________________________________________________________________
智能模式(LLM增强功能)
启用智能模式以获取书签的自动摘要、标签和主题分类。
设置
- 选择LLM模型(请参见 LiteLLM提供商)
- 从您的提供商处获取API密钥
- 添加到
.env:
LLM_MODEL=claude-3-haiku-20240307
LLM_API_KEY=your-api-key-here- 重新启动服务器
推荐型号
claude-3-haiku-20240307-快速、便宜、质量好(Anthropic) \[推荐\]gpt-4o-mini-快速、廉价(OpenAI)gpt-4o-质量更好,更贵(OpenAI)claude-3-5-sonnet-20241022-最佳品质(Anthropic)
看 LiteLLM文档 支持100多种型号。
智能模式增加了什么
- 自动摘要:简短(1-2句)和长篇(1段)摘要
- 自动标签:自动生成3-5个相关标签
- 主题分类:高级类别(人工智能、云、编程、数据、安全、DevOps、设计、商业、科学、其他)
- 更好的搜索:嵌入内容中包含的摘要和主题,以提高相关性
- Markdown提取:完整内容提取为Markdown(保留结构)
成本估算
随着 claude-3-haiku-20240307: 每个书签约0.0005美元 (非常便宜!)
演出
- 基模 (无LLM):快速保存,仅提取标题/描述
- 智能模式 (使用LLM):保存速度较慢(~5-10秒),内容完整+增强
注: 智能模式是完全可选的。所有核心功能无需任何LLM配置即可工作。
______________________________________________________________________
嵌入模型
违约: all-MiniLM-L6-v2 (384维,快速,质量好)
选择:
all-mpnet-base-v2(768维,质量更好,速度更慢)paraphrase-multilingual-MiniLM-L12-v2(384个维度,多语言)
变化 .env:
EMBEDDING_MODEL_NAME=all-mpnet-base-v2
EMBEDDING_DIMENSION=768______________________________________________________________________
运作原理
保存书签
- 获取 -下载网页
- 提取 -提取标题、描述、主要内容(智能模式下的Markdown)
- 增强 -生成摘要、标签、主题(仅限智能模式)
- 嵌入 -使用局部模型将文本转换为矢量
- 商店 -保存到DuckDB(元数据)和LanceDB(矢量)
搜索书签
- 嵌入查询 -将搜索文本转换为矢量
- 矢量搜索 -查找类似书签(LanceDB)
- 过滤器 -应用域/标签/日期过滤器(DuckDB)
- 排名 -按相似性得分排序
- 返回 -相关性得分最高的N个结果
自然语言日期
LLM(通过 bookmark_search_guide prompt)将自然语言转换为ISO日期:
- “昨天”→
2024-11-13T00:00:00Z - “上周”→
2024-11-07T00:00:00Z - “上个月”→
2024-10-14T00:00:00Z
服务器只接受ISO 8601格式,LLM进行转换。
______________________________________________________________________
发展
想贡献吗?看 贡献.md 有关设置说明。
运行测试
# Clone the repository
git clone https://github.com/yourusername/bookmark-lens.git
cd bookmark-lens
# Install in development mode
pip install -e ".[dev]"
# Run tests
python tests/test_simple.py______________________________________________________________________
故障排除
“找不到模型”错误
第一次运行下载嵌入模型(约80MB)。这是正常的,只发生一次。
“数据库锁定”错误
关闭使用数据库的所有其他进程。DuckDB不支持并发写入。
搜索未返回任何结果
- 检查书签是否已成功保存
- 尝试更广泛的查询
- 验证嵌入模型是否正确加载
首次搜索速度较慢
嵌入模型在首次使用时加载。后续搜索速度很快。
______________________________________________________________________
路线图
第二阶段(智能模式-未来)
- LLM驱动的摘要
- 自动标记
- 主题分类
- 查询扩展
未来功能
- 浏览器历史记录导入
- 浏览器扩展
- 导出/导入书签
- 书签收藏
- 共享能力
______________________________________________________________________
许可证
MIT许可证-有关详细信息,请参阅许可证文件。
______________________________________________________________________
贡献
欢迎投稿!拜托:
- 检查
TASKS.md当前状态 - 遵循现有的代码风格(最小、集中的实现)
- 为新功能添加测试
- 更新文档
______________________________________________________________________
鸣谢
内置:
