使用说明
MCP搜索
A. 生产就绪 用于web搜索和语义页面内容检索的模型上下文协议(MCP)服务器,具有本地矢量缓存功能。专为需要可靠、快速和上下文相关网络信息的AI代理而构建。
✨ 特性
- 🔍 搜索提供程序适配器:谷歌自定义搜索、勇敢搜索、DuckDuckGo或Tavily,具有标准化结果
- 🧠 语义页面阅读:使用基于嵌入的相似性搜索提取和组块内容
- 💾 本地矢量缓存:DuckDB+VSS扩展,用于持久、快速检索
- 🛡️ 生产安全:输入验证、内容过滤、优雅降级
- 📊 可观测性:结构化日志记录、相关性ID、性能指标
- 🐳 容器就绪:支持多平台构建的Docker
- ⚡ 高性能:P50<300ms缓存,<3s首次提取
- 🔧 CLI工具:健康检查、数据库检查、清理实用程序
🚀 快速开始
先决条件
按照本指南创建您的Google Search API凭据: 可编程搜索引擎.
通过NPM安装MCP
安装Playwright(可选-启用抓取SPA)
默认值 npx @dimitrk/mcp-search 安装程序在没有Playwright的情况下运行。要在基于npm的MCP配置中启用浏览器支持的SPA提取,请安装一次Chromium浏览器,并在其中包含Playwright npx 执行环境作为MCP包:
npx playwright@1.60.0 install --with-deps chromium
{
"command": "npx",
"args": [
"-y",
"--package",
"@dimitrk/mcp-search",
"--package",
"playwright@1.60.0",
"mcp-search"
]
}
安装MCP
{
"mcpServers": {
"web-search": {
"command": "npx",
"args": ["-y", "@dimitrk/mcp-search"],
"env": {
"SEARCH_PROVIDER": "google",
"SEARCH_ENGINE_API_KEY": "[ENTER SEARCH ENGINE API KEY]",
"GOOGLE_SEARCH_ENGINE_ID": "[ENTER GOOGLE SEARCH ID]",
"EMBEDDING_SERVER_URL": "https://api.openai.com",
"EMBEDDING_SERVER_API_KEY": "[OPEN AI KEY]",
"EMBEDDING_MODEL_NAME": "text-embedding-3-small",
"SIMILARITY_THRESHOLD": "0.72"
}
}
}
}
通过Docker安装MCP
{
"mcpServers": {
"web-search": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SEARCH_PROVIDER",
"-e",
"SEARCH_ENGINE_API_KEY",
"-e",
"GOOGLE_SEARCH_ENGINE_ID",
"-e",
"EMBEDDING_SERVER_URL",
"-e",
"EMBEDDING_SERVER_API_KEY",
"-e",
"EMBEDDING_MODEL_NAME",
"-e",
"SIMILARITY_THRESHOLD",
"-v",
"mcp_data:/app/data",
"dimitrisk/mcp-search:latest"
],
"env": {
"SEARCH_PROVIDER": "google",
"SEARCH_ENGINE_API_KEY": "[ENTER SEARCH ENGINE API KEY]",
"GOOGLE_SEARCH_ENGINE_ID": "[ENTER GOOGLE SEARCH ENGINE ID]",
"EMBEDDING_SERVER_URL": "https://api.openai.com",
"EMBEDDING_SERVER_API_KEY": "[YOUR OPEN AI KEY]",
"EMBEDDING_MODEL_NAME": "text-embedding-3-small",
"SIMILARITY_THRESHOLD": "0.72"
}
}
}
}
🔧 配置
环境变量引用
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
SEARCH_PROVIDER |
❌ | google |
搜索提供程序适配器: google, brave, duckduckgo,或 tavily |
SEARCH_ENGINE_API_KEY |
✅* | - | 搜索提供商API密钥;需要时 SEARCH_PROVIDER=google, SEARCH_PROVIDER=brave,或 SEARCH_PROVIDER=tavily |
GOOGLE_SEARCH_ENGINE_ID |
✅* | - | 谷歌自定义搜索引擎ID;需要时 SEARCH_PROVIDER=google |
EMBEDDING_SERVER_URL |
✅ | - | 与OpenAI兼容的嵌入API基础URL;不包括 /v1 因为服务器附加 /v1/embeddings |
EMBEDDING_SERVER_API_KEY |
✅ | - | 用于嵌入服务的API密钥 |
EMBEDDING_MODEL_NAME |
✅ | - | 嵌入的模型名称 |
DATA_DIR |
❌ | 操作系统应用程序数据目录 | 数据存储目录 |
SIMILARITY_THRESHOLD |
❌ | 0.6 | 最小相似性得分(0-1) |
EMBEDDING_TOKENS_SIZE |
❌ | 512 | 令牌中的块大小 |
EMBEDDING_BATCH_SIZE |
❌ | 8 | 根据API请求嵌入文本(1-32) |
REQUEST_TIMEOUT_MS |
❌ | 20000 | HTTP请求超时 |
CONCURRENCY |
❌ | 2 | 最大并发请求数 |
ENABLE_SIMILARITY_SEARCH |
❌ | true |
为搜索结果启用语义丰富 |
VECTOR_DB_MODE |
❌ | inline |
inline, thread 或 process |
VECTOR_DB_RESTART_ON_CRASH |
❌ | false |
在worker崩溃后重新启动vector DB worker |
duckduckgo 使用DuckDuckGo的即时应答API,不需要提供程序API密钥。
提供程序提示是特定于适配器的: timeRange 发送给谷歌、Brave和Tavily; topic=news 发送给Brave;Tavily支持 topic, searchDepth (basic, advanced, fast, ultra-fast),以及 timeRange.
数据持久化和存储
嵌入如何存储
MCP搜索使用 鸭数据库 随着 VSS(矢量相似性搜索) 扩展到本地存储嵌入。数据库文件根据嵌入模型进行隔离。
数据库文件: {DATA_DIR}/db/mcp-{sanitized-model-name}.duckdb
存储的内容:
- 文档元数据(URL、标题、上次爬网时间戳、ETag)
- 带有部分路径和令牌计数的文本块
- 向量嵌入(维度因模型而异)
- 嵌入配置(型号名称、尺寸)
按部署方式列出的存储位置
NPX部署
使用时 npx @dimitrk/mcp-search,数据库存储在操作系统特定的应用程序数据目录中:
| 操作系统 | 默认位置 |
|---|---|
| macOS | ~/Library/Application Support/mcp-search/db/mcp-{model}.duckdb |
| Linux | ~/.local/share/mcp-search/db/mcp-{model}.duckdb |
| 视窗 | %LOCALAPPDATA%\mcp-search\db\mcp-{model}.duckdb |
自定义位置:用覆盖 DATA_DIR 环境变量:
{
"mcpServers": {
"web-search": {
"env": {
"DATA_DIR": "/path/to/custom/location"
}
}
}
}
坚持: ✅ 数据在运行和系统重启过程中持续存在
Docker部署
容器路径: /app/data/db/mcp-{model}.duckdb (通过设置 ENV DATA_DIR=/app/data 在Dockerfile中)
⚠️ 重要:如果没有卷装载,数据将 集装箱停止时丢失 (由于 --rm 旗)。
推荐:使用a 命名卷 为了坚持:
{
"args": [
"run", "-i", "--rm",
"-v", "mcp_data:/app/data", // ← Named volume for persistence
"mcp-search:latest"
]
}
卷管理:
# List volumes
docker volume ls
# Inspect volume location
docker volume inspect mcp_data
# Backup volume
docker run --rm -v mcp_data:/data -v $(pwd):/backup \
alpine tar czf /backup/mcp-backup.tar.gz -C /data .
# Restore volume
docker run --rm -v mcp_data:/data -v $(pwd):/backup \
alpine tar xzf /backup/mcp-backup.tar.gz -C /data
# Delete volume (careful!)
docker volume rm mcp_data
替代:使用a 绑定挂载 直接访问:
docker run -i --rm \
-v ./data:/app/data \ # Bind mount to local ./data directory
mcp-search:latest
- ✅ 直接访问主机上的数据库文件
- ✅ 轻松备份(只需复制
./data目录) - ⚠️ 权限:容器以UID 1001运行,确保目录可写
数据库大小和性能
典型尺寸 (因用途而异):
- 空数据库:~100 KB
- 缓存10页:~5-10 MB(取决于型号尺寸)
- 缓存100页:~50-100MB
- 缓存1000页:~500 MB-1 GB
性能特征:
- 缓存查询:P50<300ms(从磁盘读取)
- 首次提取:2-5s(取决于页面大小和网络)
- 嵌入生成:取决于外部服务(OpenAI:8批约500ms)
维护和清理
# Check database health and size
mcp-search health --verbose
# Inspect what's stored
mcp-search inspect --stats
# Clean old cached data (default: >30 days)
mcp-search cleanup --days 30
# Clean and optimize database
mcp-search cleanup --days 7 --vacuum
# Preview what would be deleted (dry run)
mcp-search cleanup --dry-run
配置更改和迁移
重要:更改某些配置选项会对缓存数据产生重大影响:
✅ 安全更改(无数据丢失)
EMBEDDING_TOKENS_SIZE (块大小)
- 从512更改→ 1024 令牌是 安全的
- 现有块保持原始大小
- 新内容使用新的块大小
- 所有块共存,可以一起搜索
SIMILARITY_THRESHOLD
- 可随时安全更换
- 仅影响返回的结果
- 对存储的数据没有影响
⚠️ 破坏性更改(数据丢失)
嵌入提供者或模型更改 (例如,OpenAI->Cohere)
- 自动隔离:更改
EMBEDDING_MODEL_NAME选择不同的特定于模型的DB文件。 - 影响:保留先前模型的缓存数据,但新模型以空缓存开始。
- 腐败卫士:如果特定于模型的数据库以某种方式包含不同的数据库
embedding_model值,启动失败时会出现模型不匹配错误,而不是混合嵌入。
嵌入尺寸更改 (不同型号,不同尺寸)
- 自动:Chunks桌子是 删除并重新创建
- 影响:所有缓存的嵌入都是 已删除 (文件表保留)
- 失去了什么:仅矢量嵌入(必须重新获取和重新嵌入页面)
- 保留了什么:文档元数据(URL、标题、ETag、时间戳)
- 日志消息:
Embedding dimension changed - recreating chunks table
示例场景:
# Start with text-embedding-3-small (1536 dimensions)
EMBEDDING_MODEL_NAME=text-embedding-3-small
# Switch to text-embedding-3-large (3072 dimensions)
EMBEDDING_MODEL_NAME=text-embedding-3-large
# → Automatic: Drops chunks table, keeps documents
# → Next page fetch: Re-embeds content with new model
📊 迁移影响总结
| 更改 | 模型检查 | 维度检查 | 数据影响 |
|---|---|---|---|
| 块大小(512→1024) | ✅ 不适用 | ✅ 不适用 | ✅ 无-共存 |
| 同一型号,同一尺寸 | ✅ 通过 | ✅ 通过 | ✅ 没有 |
| 不同型号名称 | ✅ 使用另一个DB文件 | - | ✅ 保留以前的模型缓存 |
| 同一型号,不同尺寸 | ✅ 通过 | ⚠️ 自动下降 | ⚠️ 嵌入已删除 |
| 不同型号+尺寸 | ✅ 使用另一个DB文件 | - | ✅ 保留以前的模型缓存 |
最佳实践:服务器自动为每个嵌入模型创建单独的数据库文件(例如。, mcp-text-embedding-3-small.duckdb, mcp-embed-english-v3-0.duckdb).您可以安全地在同一个模型之间切换 DATA_DIR.
数据隔离和多租户
每模型数据库隔离 (v0.1.4+):
- 每个嵌入模型都会自动获取自己的数据库文件
DATA_DIR/db/ - 数据库文件名包括经过净化的模型名称:
mcp-{model-name}.duckdb - 可以安全地在模型之间切换,而不会丢失数据或发生冲突
- 不同的模型可以在同一个模型中共存
DATA_DIR
示例数据库文件:
~/.local/share/mcp-search/db/
├── mcp-text-embedding-3-small.duckdb # OpenAI model
├── mcp-text-embedding-3-large.duckdb # OpenAI larger model
└── mcp-embed-english-v3-0.duckdb # Cohere model
每 DATA_DIR 可以包含 多模型数据库:
- 各型号之间无交叉污染
- 维度更改仅影响该模型的数据库
- 通过切换轻松进行A/B测试
EMBEDDING_MODEL_NAME
示例-单实例、多模型:
# Start with OpenAI model
EMBEDDING_MODEL_NAME=text-embedding-3-small npx @dimitrk/mcp-search
# Later switch to Cohere (both DBs coexist)
EMBEDDING_MODEL_NAME=embed-english-v3.0 npx @dimitrk/mcp-search
传统多实例模式 (仍然支持):
如果您更喜欢完全隔离,请使用不同的 DATA_DIR 值:
{
"mcpServers": {
"web-search-openai": {
"command": "npx",
"args": ["-y", "@dimitrk/mcp-search"],
"env": {
"DATA_DIR": "~/.mcp-search-openai",
"EMBEDDING_MODEL_NAME": "text-embedding-3-small"
}
},
"web-search-cohere": {
"command": "npx",
"args": ["-y", "@dimitrk/mcp-search"],
"env": {
"DATA_DIR": "~/.mcp-search-cohere",
"EMBEDDING_MODEL_NAME": "embed-english-v3.0"
}
}
}
}
将其用作图书馆
命令行界面
# Start MCP server
mcp-search server
# Health check
mcp-search health --verbose
# Database inspection
mcp-search inspect --stats
mcp-search inspect --url "https://example.com"
# Cleanup old data
mcp-search cleanup --days 30 --vacuum
MCP客户端集成
从任何兼容MCP的客户端连接到MCP服务器:
# Using MCP Inspector for debugging
npx @modelcontextprotocol/inspector mcp-search
# Programmatic usage (Node.js)
const { Client } = require('@modelcontextprotocol/sdk/client/index.js');
const client = new Client({
name: 'mcp-search-client',
version: '1.0.0'
});
工具使用示例
网络搜索
// Single query
const result = await client.callTool({
name: 'web.search',
arguments: {
query: 'latest AI developments',
resultsPerQuery: 5,
},
});
// Multiple queries in parallel
const results = await client.callTool({
name: 'web.search',
arguments: {
query: ['machine learning', 'neural networks', 'transformers'],
resultsPerQuery: 3,
},
});
语义页面阅读
// Extract and search page content
const pageResults = await client.callTool({
name: 'web.readFromPage',
arguments: {
url: 'https://example.com/article',
query: ['main findings', 'methodology', 'conclusions'],
maxResults: 8,
forceRefresh: false,
},
});
// Returns semantically relevant text chunks with similarity scores
console.log(pageResults.queries[0].results[0]);
// {
// id: 'chunk-abc123',
// text: 'Relevant content excerpt...',
// score: 0.87,
// sectionPath: ['Introduction', 'Key Findings']
// }
性能调优
# High-performance setup
CONCURRENCY=8
EMBEDDING_TOKENS_SIZE=1024
SIMILARITY_THRESHOLD=0.7
REQUEST_TIMEOUT_MS=30000
VECTOR_DB_MODE=thread
# Memory-optimized setup
CONCURRENCY=1
EMBEDDING_TOKENS_SIZE=256
VECTOR_DB_MODE=inline
# Accuracy-focused setup
SIMILARITY_THRESHOLD=0.7
EMBEDDING_TOKENS_SIZE=512
🛠️ 发展
先决条件
- Node.js 22+(CI测试节点22和24)
- npm 9+
- Docker(可选,用于容器化开发)
- Git
设置
# Clone repository
git clone https://github.com/dimitrk/mcp-search.git
cd mcp-search
# Install dependencies
npm install
# Set up environment
cp .env.example .env
# Edit .env with your API keys
# Build project
npm run build
# Run health check
npm run health
环境设置
创建 .env 文件:
# Required
SEARCH_PROVIDER=google
SEARCH_ENGINE_API_KEY=your_search_engine_api_key_here
GOOGLE_SEARCH_ENGINE_ID=your_search_engine_id_here
EMBEDDING_SERVER_URL=https://api.openai.com
EMBEDDING_SERVER_API_KEY=your_openai_api_key_here
EMBEDDING_MODEL_NAME=text-embedding-3-small # Embedding model of your choice
# Optional (with defaults)
DATA_DIR=~/.mcp-search # Data storage location
SIMILARITY_THRESHOLD=0.6 # Similarity cutoff (0-1)
EMBEDDING_TOKENS_SIZE=512 # Chunk size in tokens
REQUEST_TIMEOUT_MS=20000 # HTTP timeout
CONCURRENCY=2 # Concurrent requests
搜索提供商示例:
# Google Custom Search (default)
SEARCH_PROVIDER=google
SEARCH_ENGINE_API_KEY=your_google_api_key_here
GOOGLE_SEARCH_ENGINE_ID=your_search_engine_id_here
# Brave Search
SEARCH_PROVIDER=brave
SEARCH_ENGINE_API_KEY=your_brave_search_api_key_here
# Tavily Search
SEARCH_PROVIDER=tavily
SEARCH_ENGINE_API_KEY=your_tavily_api_key_here
# DuckDuckGo instant answers
SEARCH_PROVIDER=duckduckgo
开发脚本
# Development
npm run dev # Start in development mode
npm run build:watch # Watch mode build
# Testing
npm test # Run all tests
npm run test:unit # Unit tests only
npm run test:integration # Integration tests only
npm run test:coverage # Coverage report
npm run test:performance # Performance benchmarks
# Quality
npm run lint # ESLint check
npm run lint:fix # Auto-fix linting issues
npm run format # Prettier formatting
npm run typecheck # TypeScript validation
# Database
npm run db:inspect # Inspect database contents
npm run cleanup # Clean old data
# Production
npm start # Production server
npm run health:verbose # Detailed health check
测试
# Run specific test suites
npm run test:unit -- --testNamePattern="chunker"
npm run test:integration -- --testNamePattern="readFromPage"
# Debug tests
npm run test:debug
# Performance benchmarks
npm run test:performance -- --verbose
📊 建筑
系统概述
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ MCP Client │────│ MCP Server │────│ Search Provider │
│ (AI Agent) │ │ │ │ API │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
│
┌──────────────────┐ ┌─────────────────┐
│ Content │────│ Embedding │
│ Extraction │ │ API │
└──────────────────┘ └─────────────────┘
│
│
┌──────────────────┐ ┌─────────────────┐
│ DuckDB │ │ Vector │
│ Database │────│ Search │
└──────────────────┘ └─────────────────┘
数据流
- 搜索请求:客户端发送MCP工具调用
- 内容获取:HTTP客户端检索web内容
- 内容提取:多级提取(可读性→ 再见→ SPA)
- 语义分块:智能内容细分
- 嵌入生成:通过API的矢量表示
- 向量存储:DuckDB+VSS用于持久化
- 相似性搜索:查询的语义匹配
- 回应:排名,相关内容块
关键组件
- MCP服务器:符合协议的工具服务器
- 搜索提供程序适配器:Google、Brave、DuckDuckGo和Tavily提供商将特定于API的有效载荷标准化为共享
items形状;谷歌地图timeRange到dateRestrict,Brave地图timeRange到freshness并且可以过滤topic=news,Tavily地图顶级results - HTTP获取器:通过重试实现强大的内容检索
- 内容提取器:多策略HTML处理
- 语义块:令牌感知内容细分
- 向量存储:带VSS扩展名的DuckDB
- 嵌入服务:与OpenAI兼容的API集成
🐳 Docker部署
基本部署
# Pull image
docker pull dimitrisk/mcp-search:latest
# Run container
docker run -d \
--name mcp-search \
--env-file .env \
-v mcp_data:/app/data \
-p 3000:3000 \
dimitrisk/mcp-search:latest
Docker Compose(推荐)
# docker-compose.yml
version: '3.8'
services:
mcp-search:
image: dimitrisk/mcp-search:latest
container_name: mcp-search
restart: unless-stopped
env_file: .env
volumes:
- mcp_data:/app/data
healthcheck:
test: ['CMD', 'node', 'dist/cli.js', 'health']
interval: 30s
timeout: 10s
retries: 3
volumes:
mcp_data:
生产部署
# Use production compose file
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# Monitor logs
docker-compose logs -f mcp-search
# Health check
docker-compose exec mcp-search node dist/cli.js health --verbose
🔍 故障排除
常见问题
缺少环境变量
# Check current environment
mcp-search health --verbose
# Validate specific variables
echo $SEARCH_ENGINE_API_KEY | wc -c # Should be >30 characters for Google, Brave, or Tavily
数据库问题
# Check database status
mcp-search inspect --stats
# Reset database
mcp-search cleanup --days 0 --vacuum
# Manual database reset
rm ~/.mcp-search/db/mcp-*.duckdb
性能问题
# Check system resources
mcp-search health --verbose
# Reduce concurrency
export CONCURRENCY=1
# Increase timeouts
export REQUEST_TIMEOUT_MS=30000
网络/API问题
# Test configured search provider
# Google Custom Search
curl "https://www.googleapis.com/customsearch/v1?key=$SEARCH_ENGINE_API_KEY&cx=$GOOGLE_SEARCH_ENGINE_ID&q=test"
# Brave Search
curl -H "X-Subscription-Token: $SEARCH_ENGINE_API_KEY" \
"https://api.search.brave.com/res/v1/web/search?q=test"
# Tavily Search
curl -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $SEARCH_ENGINE_API_KEY" \
-d '{"query":"test","topic":"general","search_depth":"basic"}'
# DuckDuckGo instant answers
curl "https://api.duckduckgo.com/?q=test&format=json&no_html=1&skip_disambig=1"
# Test embedding API
curl -X POST "$EMBEDDING_SERVER_URL/v1/embeddings" \
-H "Authorization: Bearer $EMBEDDING_SERVER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "'$EMBEDDING_MODEL_NAME'", "input": "test"}'
调试模式
# Enable verbose logging
DEBUG=mcp-search:* mcp-search server
# Use development configuration
NODE_ENV=development mcp-search server
# Run with MCP inspector
npx @modelcontextprotocol/inspector mcp-search
获取帮助
🔧 api参考
工具架构
web.search
interface SearchInput {
query: string | string[]; // Search queries
resultsPerQuery?: number; // 1-50, default 5; adapters cap to provider API limits
minimal?: boolean; // Return compact normalized result fields, default true
enableSimilaritySearch?: boolean; // Enrich top results with page chunks, default true
topic?: 'general' | 'news' | 'finance'; // Provider hint; Tavily supports all values, Brave supports news filtering
searchDepth?: 'basic' | 'advanced' | 'fast' | 'ultra-fast'; // Tavily-only provider hint
timeRange?: 'day' | 'week' | 'month' | 'year'; // Supported by Google, Brave, and Tavily
}
interface SearchOutput {
queries: Array<{
query: string;
result: unknown; // Normalized provider result with raw provider payload when available
}>;
}
web.readFromPage
interface ReadFromPageInput {
url: string; // Target URL
query?: string | string[]; // Optional. Omit to return all page chunks in document order
forceRefresh?: boolean; // Skip cache, default false
maxResults?: number; // 1-50, default 8. Ignored when query is omitted
includeMetadata?: boolean; // Extra metadata, default false
}
interface ReadFromPageOutput {
url: string;
title?: string;
lastCrawled: string;
queries: Array<{
query: string;
results: Array<{
id: string; // Stable chunk ID
text: string; // Content text
score?: number; // Similarity score 0-1; omitted when query is omitted
sectionPath?: string[]; // Document structure
}>;
}>;
note?: string; // Degradation notices
}
🏗️ 贡献
开发工作流程
- 分叉与克隆:分叉存储库并在本地克隆
- 分支:创建要素分支(
git checkout -b feature/amazing-feature) - 开发:按照我们的标准编写代码
- 测试:确保所有测试通过(
npm test) - 提交:使用常规提交(
git commit -m 'feat: add amazing feature') - 推:推你的叉子(
git push origin feature/amazing-feature) - 公关:打开带有详细描述的Pull Request
代码标准
- TypeScript:严格模式,显式类型
- ESLint:ESLint推荐,TypeScript推荐,Prettier集成和本地自定义规则
- 更漂亮:格式一致
- 玩笑:在
jest.config.js - 约定式提交:用于生成变更日志
发布过程
# Version bump (patch/minor/major)
npm version patch
# Push tags
git push origin --tags
# GitHub Actions will:
# 1. Run full test suite
# 2. Security scan
# 3. Build Docker images
# 4. Publish to NPM
# 5. Create GitHub release
📋 路线图
- [ ] v1.1:PDF和文档解析支持
- [ ] v1.2:本地嵌入模型(节点llama cpp)
- [ ] v1.3:高级组块策略(代码、表格)
- [ ] v1.4:矢量数据库替代方案(Qdrant、Weaviate)
- [ ] v1.5:Robots.txt合规切换
- [ ] v2.0:GraphQL模式自检工具
📄 许可证
MIT许可证-请参阅 许可证 文件以获取详细信息。
🙏 致谢
- 模型上下文协议 -协议规范
- 鸭数据库 -过程分析数据库
- VSS扩展 -向量相似性搜索
- Mozilla可读性 -内容提取
- 剧作家 -浏览器自动化
内置于❤️ 对于AI代理生态系统