系统架构
July 12, 2025 · View on GitHub
本文档详细介绍了 MCP Advisor 的系统架构、核心组件和数据流。
目录
架构概述
MCP Advisor 采用模块化架构,遵循函数式编程原则和关注点分离。系统由以下主要部分组成:
系统架构图
graph TD
Client["客户端应用"] --> |"MCP 协议"| Transport["传输层"]
subgraph "MCP Advisor 服务器"
Transport --> |"请求"| SearchService["搜索服务"]
SearchService --> |"查询"| Providers["搜索提供者"]
subgraph "搜索提供者"
Providers --> MeilisearchProvider["Meilisearch 提供者"]
Providers --> GetMcpProvider["GetMCP 提供者"]
Providers --> CompassProvider["Compass 提供者"]
Providers --> NacosProvider["Nacos 服务发现"]
Providers --> OfflineProvider["离线提供者"]
end
OfflineProvider --> |"混合搜索"| HybridSearch["混合搜索引擎"]
HybridSearch --> TextMatching["文本匹配"]
HybridSearch --> VectorSearch["向量搜索"]
MeilisearchProvider --> |"API 调用"| MeilisearchAPI["Meilisearch API"]
GetMcpProvider --> |"API 调用"| GetMcpAPI["GetMCP API"]
CompassProvider --> |"API 调用"| CompassAPI["Compass API"]
NacosProvider --> |"服务发现"| NacosServer["Nacos 注册中心"]
SearchService --> |"合并和过滤"| ResultProcessor["结果处理器"]
ResultProcessor --> |"优先级"| PriorityEngine["提供者优先级引擎"]
ResultProcessor --> |"去重"| Deduplicator["结果去重器"]
ResultProcessor --> |"过滤"| SimilarityFilter["相似度过滤器"]
SearchService --> Logger["日志系统"]
end
GetMcpAPI --> |"数据"| ExternalMCPRegistry[("外部 MCP 注册表")]
CompassAPI --> |"数据"| ExternalMCPRegistry
MeilisearchAPI --> |"数据"| MeilisearchDB[("Meilisearch 数据库")]
核心组件
1. 搜索服务层
搜索服务是系统的核心,负责协调不同的搜索提供者并处理结果:
- 统一搜索接口:提供简单的 API 用于查询 MCP 服务器
- 提供者聚合:从多个搜索提供者收集结果
- 并行执行:同时查询多个提供者以提高性能
- 可配置选项:支持自定义限制、相似度阈值等
- 智能结果合并:基于相似度和提供者优先级合并结果
- 去重机制:基于 GitHub URL 或标题删除重复结果
class SearchService {
constructor(options?: SearchOptions);
search(query: string): Promise<SearchResult[]>;
}
2. 搜索提供者
系统支持多个搜索提供者,每个提供者实现相同的接口但使用不同的数据源或搜索策略:
Meilisearch 提供者
使用 Meilisearch 进行向量搜索:
- 高性能向量数据库集成
- 支持语义相似度搜索
- 使用 HNSW 索引进行快速检索
GetMCP 提供者
从 GetMCP 注册表获取数据:
- 直接与官方 MCP 注册表集成
- 实时数据更新
- 支持元数据过滤
Compass 提供者
使用 Compass API 检索 MCP 服务器信息:
- 与 Compass 注册表集成
- 支持高级过滤和排序
- 提供额外的元数据
离线提供者
结合文本和向量的混合搜索:
- 在本地执行搜索,无需外部 API
- 结合关键词匹配和向量相似度
- 可配置的权重平衡
- 作为其他提供者的备用机制
3. 混合搜索引擎
混合搜索引擎结合了文本匹配和向量搜索的优点:
- 文本匹配:基于关键词的精确和模糊匹配
- 向量搜索:使用嵌入向量的语义相似度
- 可配置权重:文本和向量搜索之间的可调平衡
- 智能回退:即使在高相似度阈值下也能确保最小结果数
4. 结果处理管道
结果处理管道负责优化和过滤搜索结果:
- 合并:组合来自多个提供者的结果
- 去重:基于 GitHub URL 或标题删除重复结果
- 提供者优先级:基于提供者可靠性对结果进行排名
- 相似度过滤:基于可配置阈值过滤结果
- 自适应回退:确保最小结果数以获得更好的用户体验
5. 传输层
传输层处理与客户端的通信:
- Stdio:默认用于命令行工具
- SSE:用于 Web 集成的服务器发送事件
- REST API:提供 RESTful 端点
数据流
以下序列图展示了 MCP Advisor 中的数据流:
sequenceDiagram
participant User
participant Agent as AI 代理
participant MCP as MCP Advisor
participant QP as 查询处理器
participant Search as 搜索提供者
participant Results as 结果处理器
User->>Agent: 自然语言查询
Agent->>MCP: 搜索请求
MCP->>QP: 处理查询
par 并行处理
QP->>QP: 提取关键词
QP->>QP: 生成嵌入向量
end
par 并行搜索执行
QP->>Search: 基于文本的搜索(关键词)
Note over Search: Compass 提供者
Note over Search: GetMCP 提供者
Note over Search: 离线提供者
QP->>QP: 归一化向量
QP->>Search: 向量相似度搜索
Note over Search: Meilisearch 提供者
Note over Search: 离线向量搜索
end
Search->>Results: 所有搜索结果
Results->>Results: 智能结果合并
Results->>Results: 基于 URL 的去重
Results->>Results: 提供者优先级排名
Results->>Results: 自适应相似度过滤
Results->>Results: 结果数量限制
Results->>MCP: 处理后的结果
MCP->>Agent: MCP 服务器推荐
Agent->>User: 带上下文的推荐
搜索策略
MCP Advisor 使用复杂的搜索策略来提供最相关的结果:
graph TD
Query["用户查询"] --> Analysis["查询分析"]
Analysis --> |"包含关键词"| TextBias["文本偏向搜索"]
Analysis --> |"语义查询"| VectorBias["向量偏向搜索"]
TextBias --> |"textMatchWeight: 0.7"| HybridSearch1["混合搜索引擎"]
VectorBias --> |"textMatchWeight: 0.3"| HybridSearch2["混合搜索引擎"]
subgraph "向量处理"
RawVector["原始嵌入向量"] --> Normalization["向量归一化"]
Normalization --> |"单位向量"| IndexedSearch["HNSW 索引搜索"]
IndexedSearch --> |"余弦相似度"| VectorResults["向量结果"]
end
subgraph "文本处理"
Keywords["提取的关键词"] --> ExactMatch["精确匹配"]
Keywords --> FuzzyMatch["模糊匹配"]
ExactMatch & FuzzyMatch --> |"匹配分数"| TextResults["文本结果"]
end
subgraph "混合搜索过程"
HybridSearch1 & HybridSearch2 --> |"并行执行"| Providers["多个提供者"]
VectorResults & TextResults --> WeightedMerge["加权结果合并"]
Providers --> |"原始结果"| Merging["智能合并"]
WeightedMerge --> Merging
Merging --> |"提供者优先级"| Prioritization["基于优先级的选择"]
Prioritization --> |"唯一结果"| Filtering["自适应过滤"]
end
Filtering --> |"minSimilarity: 0.5"| FinalResults["最终结果"]
Filtering --> |"回退"| TopResults["前 5 个结果"]
技术实现
向量归一化
所有向量在存储和搜索前都经过归一化处理:
function normalizeVector(vector: number[]): number[] {
const magnitude = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
if (magnitude === 0) return vector;
return vector.map(val => val / magnitude);
}
混合搜索实现
混合搜索结合了文本和向量搜索的结果:
async function hybridSearch(query: string, options: SearchOptions): Promise<SearchResult[]> {
const [textResults, vectorResults] = await Promise.all([
textSearch(query, options),
vectorSearch(query, options)
]);
return mergeSearchResults(textResults, vectorResults, {
textMatchWeight: 0.3,
vectorMatchWeight: 0.7
});
}
提供者优先级系统
提供者优先级系统确保最可靠的结果排在前面:
const PROVIDER_PRIORITIES = {
'compass': 3,
'getmcp': 2,
'meilisearch': 2,
'offline': 1
};
function prioritizeResults(results: SearchResult[]): SearchResult[] {
return results.sort((a, b) => {
// 首先按提供者优先级排序
const priorityDiff =
(PROVIDER_PRIORITIES[b.provider] || 0) -
(PROVIDER_PRIORITIES[a.provider] || 0);
if (priorityDiff !== 0) return priorityDiff;
// 然后按相似度排序
return b.similarity - a.similarity;
});
}
总结
MCP Advisor 的架构设计注重模块化、可扩展性和性能。通过结合多种搜索策略和智能结果处理,系统能够提供高质量的 MCP 服务器推荐,同时保持良好的响应时间和用户体验。
有关更多技术实现细节和搜索提供者配置,请参阅: