语义搜索服务器

一个基于Couchbase向量搜索功能的Model Context Protocol服务器,提供星球信息的语义搜索能力。

  • by shivaycb
  • JavaScript
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 shivay-couchbase/couchbase-mcp

使用说明

Couchbase模型上下文协议服务器

该项目演示了模型上下文协议(MCP)服务器的实现,该服务器使用Couchbase的矢量搜索功能为《星球大战》行星提供语义搜索功能。

概述

模型上下文协议(MCP)是人工智能模型与外部工具和数据源交互的标准化方式。此实现创建了一个MCP服务器,允许AI模型:

  1. 获取有关《星球大战》行星的详细信息
  2. 基于向量嵌入找到相似的行星

运作原理

模型上下文协议集成

服务器实现了两个主要的MCP工具:

{
tools: [
{
name: "fetch_planet_name",
description: "Fetch a Star Wars planet by name",
inputSchema: // ... schema for planet name
},
{
name: "find_planets_which_are_similar",
description: "Find similar planets by name to the given name",
inputSchema: // ... schema for planet name
}
]
}

这些工具可以被支持模型上下文协议的AI模型发现和调用。

沙发床矢量搜索

该实现使用Couchbase的矢量搜索功能来查找类似的行星:

  1. Couchbase中的每个行星文档都包含一个 embedding 包含行星特征矢量表示的场
  2. 在寻找类似行星时:
    • 检索源行星的嵌入
    • 使用Couchbase的矢量搜索来寻找具有相似嵌入的行星
    • 返回前5个最相似的行星

主要特点

  • 高效矢量搜索:利用Couchbase的矢量搜索索引进行快速相似性查找
  • 超时保护:实现搜索和文档获取操作的超时
  • 连接管理:通过清理正确管理Couchbase连接
  • 错误处理:全面的错误处理和调试支持
  • 类型安全:具有正确类型定义的完整TypeScript实现

设置

先决条件

  • Node.js
  • 具有矢量搜索功能的Couchbase服务器
  • 环境变量:
    COUCHBASE_URL=
    COUCHBASE_USERNAME=
    COUCHBASE_PASSWORD=
    COUCHBASE_BUCKET=
    COUCHBASE_SCOPE=
    COUCHBASE_COLLECTION=
    

数据结构

每个行星文件都应遵循以下结构:

interface StarWarsCharacter {
name: string;
rotation_period: string;
orbital_period: string;
diameter: string;
climate: string;
gravity: string;
terrain: string;
surface_water: string;
population: string;
residents: string[];
films: string[];
created: string;
edited: string;
url: string;
embedding?: number[]; // Vector embedding for similarity search
}

矢量搜索索引

在Couchbase中创建一个名为的向量搜索索引 vector-search-index 该索引 embedding 现场。

用法

  1. 启动服务器:

    npm start
    
  2. 服务器将通过stdin/stdout监听MCP请求。

  3. AI模型可以使用以下示例查询与服务器交互:

    // Fetch planet details
    {
      "name": "fetch_planet_name",
      "arguments": {
        "name": "Tatooine"
      }
    }
    
    // Find similar planets
    {
      "name": "find_planets_which_are_similar",
      "arguments": {
        "name": "Tatooine"
      }
    }