Zenn
📚

Claude Desktopとmcp-server-qdrantで超お手軽ナレッジベースの構築

2025/03/25に公開
27

TL;DR

  • qdrant/mcp-server-qdrantを使えばClaude Desktopからベクトル検索エンジンを操作できるよ
  • ベクトルデータベースなので、LLMとの相性が良いよ
  • ここまでのチャットを整理して保存しておいて」ができるのは、すごすぎるよ

https://github.com/qdrant/mcp-server-qdrant

1. Qdrantとは

Qdrantはベクトル検索エンジンです。テキストをベクトル化して保存し、意味的な類似性に基づいて検索することができます。

通常のキーワード検索と異なり、ベクトル検索では単語の正確な一致ではなく、コンテンツの意味的な類似性に基づいて結果を返します。これにより、「先週のミーティングの決定事項」といった自然言語のクエリで、関連する情報を見つけることができます。

https://qdrant.tech/

このQdrantをClaude DesktopをMCPを用いた連携により、ベクトルDBをメモ帳として扱うブルジョワなナレッジマネジメントが実現します。PostgreSQLやSQLiteのようにデータ構造を考える必要がないのもメリットです。

2. Qdrant MCPの導入方法

2.1 前提条件とシステム要件

  • Qdrantサーバー
  • Node.js
  • Docker

2.2 Qdrantのインストール

Dockerを使った例です。

docker run -d --name qdrant_local -p 6333:6333 -p 6334:6334 -v "$HOME/qdrant_storage:/qdrant/storage:z" qdrant/qdrant

この例では、データは$HOME/qdrant_storageに保存されます。
パスやポートは適宜変更してください。

アクセスポイント

2.3 Claudeとの連携設定

Claude Desktopで設定する場合は、claude_desktop_config.jsonファイルを編集します。

{
  "mcpServers": {
    "qdrant": {
      "command": "uvx",
      "args": ["mcp-server-qdrant"],
      "env": {
        "QDRANT_URL": "http://localhost:6333",
        "COLLECTION_NAME": "your-collection",
        "EMBEDDING_MODEL": "sentence-transformers/all-MiniLM-L6-v2"
      }
    }
  }
}

環境変数は適宜変更のこと。

  • QDRANT_URL: Qdrantサーバーの URL(例:http://localhost:6333
  • QDRANT_API_KEY: Qdrantサーバーの API キー(必要な場合)
  • COLLECTION_NAME: 使用するコレクション名(必須
  • QDRANT_LOCAL_PATH: ローカルQdrantデータベースのパス(QDRANT_URLの代替)
  • EMBEDDING_PROVIDER: 埋め込みプロバイダー(現在はfastembedのみ対応)
  • EMBEDDING_MODEL: 使用する埋め込みモデル名(例:sentence-transformers/all-MiniLM-L6-v2

3. Claude Desktopで使ってみる

Claudeが持っていないであろう、honojs/honoのリリースノートを整理します。
語尾はおまじないみたいなものなので、気にしないでください。

出力結果

Hono v4.7.0から最新バージョン(v4.7.5)までのリリースノート

v4.7.0

Hono v4.7.0では、1つのヘルパーと2つのミドルウェアが追加されました。

Proxy Helper

Honoアプリケーションをリバースプロキシとして使用する際に、より適切なヘッダー処理を行うヘルパー。

  • Accept-Encodingなどの意図しないヘッダー値が送信される問題を解決
  • Transfer-Encodingなどのオリジンサーバーから送信されるヘッダーの処理も適切に行う

使用例:

import { Hono } from 'hono'
import { proxy } from 'hono/proxy'

app.get('/proxy/:path', (c) => {
  return proxy(`http://${originServer}/${c.req.param('path')}`)
})

より複雑な使い方も可能:

app.get('/proxy/:path', async (c) => {
  const res = await proxy(
    `http://${originServer}/${c.req.param('path')}`,
    {
      headers: {
        ...c.req.header(),
        'X-Forwarded-For': '127.0.0.1',
        'X-Forwarded-Host': c.req.header('host'),
        Authorization: undefined,
      },
    }
  )
  res.headers.delete('Set-Cookie')
  return res
})

Language Middleware

国際化(i18n)機能を提供するミドルウェア。languageDetector関数を使用してアプリケーションがサポートすべき言語を取得可能。

使用例:

import { Hono } from 'hono'
import { languageDetector } from 'hono/language'

const app = new Hono()

app.use(
  languageDetector({
    supportedLanguages: ['en', 'ar', 'ja'], // フォールバック言語を含める必要あり
    fallbackLanguage: 'en', // 必須
  })
)

app.get('/', (c) => {
  const lang = c.get('language')
  return c.text(`Hello! Your language is ${lang}`)
})

言語の検出は以下の方法で行われます:

  • クエリパラメータ
  • クッキー
  • Accept-Languageヘッダー
  • URLパス

JWK Auth Middleware

JWK(JSON Web Key)をサポートするミドルウェア。指定されたURLからフェッチされたキーを使用してJWKトークンを検証することでユーザー認証が可能。

使用例:

import { Hono } from 'hono'
import { jwk } from 'hono/jwk'

app.use(
  '/auth/*',
  jwk({
    jwks_uri: `https://${backendServer}/.well-known/jwks.json`,
  })
)

app.get('/auth/page', (c) => {
  return c.text('You are authorized')
})

Standard Schema Validator

Standard Schemaは、TypeScriptバリデーターライブラリの共通インターフェースを提供します。Standard Schema Validatorを使用することで、Zod、Valibot、ArkTypeなど、複数のバリデーターを同じインターフェースで扱うことができます。

使用例:

import { Hono } from 'hono'
import { sValidator } from '@hono/standard-validator'
import { type } from 'arktype'
import * as v from 'valibot'
import { z } from 'zod'

const aSchema = type({
  agent: 'string',
})

const vSchema = v.object({
  slag: v.string(),
})

const zSchema = z.object({
  name: z.string(),
})

const app = new Hono()

app.get(
  '/:slag',
  sValidator('header', aSchema),
  sValidator('param', vSchema),
  sValidator('query', zSchema),
  (c) => {
    const headerValue = c.req.valid('header')
    const paramValue = c.req.valid('param')
    const queryValue = c.req.valid('query')
    return c.json({ headerValue, paramValue, queryValue })
  }
)

その他の新機能

  • feat(logger): クエリパラメータを含めるように
  • feat(hono/context): buffer returnsの追加
  • feat(etag): etagに独自のハッシュメソッドを使用可能に
  • feat(router): 後続の静的コンポーネントを持つgreedy matchesをサポート
  • feat(factory): factoryでHonoOptionsを許可

v4.7.1~v4.7.5

v4.7.0以降の最新バージョン(2025年3月24日現在、v4.7.5)までのアップデートは主にバグ修正と小さな改善が中心です。詳細なリリースノートはGitHubのリリースページで確認できますが、大きな機能追加は公式リリースノートで確認する限りありませんでした。

現在のnpmパッケージの最新バージョンは、v4.7.5となっています。このバージョンでは主に:

  • バグ修正
  • パフォーマンスの最適化
  • 型定義の改善

などが行われています。

最新版の入手方法

最新版のHonoは以下のコマンドでインストールできます:

# npm
npm install hono

# yarn
yarn add hono

# pnpm
pnpm add hono

# bun
bun add hono

また、Deno用にはJSRからインポートすることが推奨されています(deno.land/xは非推奨になりました):

import { Hono } from "@hono/hono"

Honoの公式ドキュメントは hono.dev で確認できます。

整理できています。
続いて、整理した情報をあらかじめ保存しておいたベストプラクティスに沿って、Qdrantに書き込みます。

ベストプラクティスにはチャンク分割の指標や、メタデータの内容を記載している...はず。それすらも検索させて保存したものなので、正直、何書いてあるか知りません

ダッシュボード http://localhost:6333/dashboard#/collections を見てみます。

保存されました。metaもちゃんと記載されています。

{
  "type": "documentation",
  "topic": "framework_release_notes",
  "framework": "Hono",
  "versions": [
    "4.7.0",
    "4.7.5"
  ],
  "date": "2025-03-24",
  "features": [
    "Proxy Helper",
    "Language Middleware",
    "JWK Auth Middleware",
    "Standard Schema Validator"
  ],
  "category": "web_development",
  "language": "Japanese"
}

新規チャットから参照してみます。

参照できました。

4. まとめ

ベクトルデータベースなんて初めてローカルで立ち上げたくらいの初心者ですが、逆に不安になるくらいの簡単さで操作できました。ベストプラクティスや指示を突き詰めていけば、自分好みで、扱いやすい、パーソナルなベクトル検索エンジンを構築することができます。

ぜひお試しください。

27

Discussion

ログインするとコメントできます