mcpField
P
polymnemo

polymnemo

リモート
github.com/PCBZメモリ・ナレッジ01 日前に更新
リポジトリ

polymnemo について

polymnemoは、MCPクライアントやエージェントのワークフロー向けに、複数のLLMで長期記憶を共有するMCPサーバーです。セマンティック検索、セッションの保存・再読み込み、メディア添付に対応し、埋め込み生成はローカルで行い、データはPostgresに保存します。

主な機能

  1. 01MCPクライアント間での記憶共有
  2. 02Postgresとpgvectorによるセマンティック検索
  3. 03セッション全体の保存と再読み込み
  4. 04ファイル、画像、動画の添付
  5. 05ローカルでのONNX埋め込み生成
  6. 06共有および所有者限定の名前空間

活用シーン

  1. 01異なるLLMクライアント間で事実を参照
  2. 02セッションを保存して全記録を再読み込み
  3. 03保存した記憶を意味で検索
  4. 04メディアに検索可能な説明を付与

MCP 対応

MCPサーバーとして記憶、セッション、メディアのツールを提供し、pingヘルスチェックと`memory://{namespace}`リソースも公開します。MCPクライアントはBearer認証付きのStreamable HTTPで接続します。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://polymnemo.purpleground-26f6d744.westus2.azurecontainerapps.io/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

すべてのエンドポイント
Streamable HTTPhttps://polymnemo.purpleground-26f6d744.westus2.azurecontainerapps.io/mcp認証が必要

ツール

詳細

polymnemo

CI codecov License: MIT

Python MCP Postgres Neon SQLAlchemy Pydantic Cloudflare R2 Azure Cloud Run Terraform Docker pytest Ruff

MCPを介して、あらゆるLLMで共有できる長期記憶です。

Claude Desktop、MCP対応IDE、または任意のMCPクライアントを1つのpolymnemo エンドポイントに接続すると、独自のPostgresに保存された同じ記憶を共有できます。あるアシスタントで事実を保存し、別のアシスタントから呼び出せます。セッション全体を保存して再読み込みすることも、ファイル、画像、動画を添付することもできます。埋め込み処理はローカルで実行されるため(埋め込みAPIキーは不要)、サーバーは生成LLMを呼び出しません。

ステータス: 開発中です。セマンティックメモリとpgvectorストア、セッションの保存と再読み込み、マルチメディアメモリが利用可能です。Terraformを使ってAzure Container Apps(またはCloud Run)にデプロイできます。 Wiki · Issues

機能

  • 🔗 LLM間で共有 — 任意のMCPクライアントを1つのエンドポイントに接続すると、同じメモリを共有できます。
  • 🧠 セマンティック検索 — キーワード照合ではなく、Postgres + pgvector上でベクトル検索を行います。
  • 💬 セッション — トランスクリプト全体を保存してそのまま再読み込みするか、セッション全体から情報を呼び出せます。
  • 🖼️ マルチメディア — ファイル、画像、動画を添付できます。バイトデータはオブジェクトストレージに保存し、検索可能な説明のみを埋め込みます。
  • 🔒 ローカルかつプライベート — 埋め込み処理はローカル(ONNX)で実行されるため、埋め込みAPIキーは不要で、生成LLMを呼び出すこともありません。
  • 👥 名前空間 — 誰でも読み取れる「作成時から共有」のコレクションと、所有者のみが利用できるコレクションを使い分けられます。書き込みは常に所有者ごとにスコープされます。
  • 🧩 差し替え可能なレイヤー — ストア、埋め込み器、認証、検索機能、ブロブストア、レートリミッターはすべて差し替え可能なProtocolです。
  • ☁️ マルチクラウドデプロイ — 1つのTerraformスタックでAzure Container AppsまたはCloud Runにデプロイでき、ゼロまでスケールできます。
  • 🚦 レート制限 — オプションのグローバルトークンバケットに対応しています。

仕組み

flowchart LR
    Clients["MCP clients<br/>(Claude Desktop, IDEs, …)"] -->|"/mcp · Bearer key"| P["polymnemo<br/>(MCP server)"]
    P --> DB[("Postgres + pgvector<br/>text + pointers")]
    P -. "large files<br/>(presigned URLs)" .-> OS[("Object storage<br/>S3 / R2")]

リクエストにはベアラーキーが含まれ(これによって user_id が特定されます)、ツールはレート制限ゲートを通過した後、テキストをチャンクに分割して埋め込みを生成し、ベクトルを pgvector に保存する MemoryService に処理を委譲します。大きなファイルは署名付き URL を介してオブジェクトストレージに保存され、検索可能な説明のみが埋め込まれます。

すべてのレイヤーは typing.Protocol で定義され、コンポジションルート(context.py)によって接続されています。そのため、ツールに手を加えずに実装を切り替えられます。

レイヤーデフォルト切り替え先
ストアPostgresStore(pgvector)InMemoryStore(開発/テスト用)
埋め込み生成器fastembed(ローカル ONNX)StubEmbedder(オフライン用)
認証GitHub OAuth + API トークン静的ベアラーキー(開発用)
検索VectorRetriever独自のランキング機能
BlobStoreS3 / R2無効
レートリミッターグローバルなトークンバケット無効

ping ツールは有効なレイヤーを返すため、実行中のサーバーがどのように接続されているか確認できます。

クイックスタート

Python 3.11 以降が必要です。

1. インストール
python -m venv .venv
source .venv/bin/activate            # Windows: .venv\Scripts\activate
pip install -e .                     # add ".[dev]" for the test + lint tooling
2. Postgres(pgvector)を用意する

永続ストアには Postgres + pgvector を使用します。ホスト型の選択肢として最も手軽なのは Neon です(プール済みの接続文字列を使用してください)。スキーマを一度だけ適用します。

psql "<your-connection-string>" -f scripts/schema.sql
3. 設定する

.env.example を .env にコピーし、データベース URL と少なくとも 1 つの API キーを設定します。

POLYMNEMO_DATABASE_URL=postgresql://user:pass@host/db?sslmode=require
POLYMNEMO_API_KEYS=sk-alice-secret:alice,sk-bob-secret:bob   # "key:user_id" pairs

各キーはベアラートークンを user_id に対応付けます。書き込みはそのユーザーに限定されます。

4. 実行する
polymnemo                            # Streamable HTTP at http://127.0.0.1:8000/mcp

または Docker を使用します。

docker build -t polymnemo .
docker run -e POLYMNEMO_DATABASE_URL="..." -e POLYMNEMO_API_KEYS="sk-alice-secret:alice" \
           -e PORT=8080 -p 8080:8080 polymnemo
5. MCP クライアントを接続する

カスタムヘッダーを使ったリモート(HTTP)MCP サーバーに対応するクライアントには、次の 2 つが必要です。

  • エンドポイント: http://<host>:<port>/mcp
  • ヘッダー: Authorization: Bearer <your-key>

mcpServers 設定を読み込むクライアントの場合:

{
  "mcpServers": {
    "polymnemo": {
      "url": "http://127.0.0.1:8000/mcp",
      "headers": { "Authorization": "Bearer sk-alice-secret" }
    }
  }
}

または、インスペクターで確認します。

npx @modelcontextprotocol/inspector
# Transport: Streamable HTTP · URL: http://127.0.0.1:8000/mcp
# Header:    Authorization: Bearer sk-alice-secret  → call ping / remember / recall

概念

  • ユーザーとキー — GitHub でサインインするか、ベアラートークンを提示します。どちらの場合も、リクエストから user_id が特定され、書き込みは所有者に限定されます(自分のメモリーのみ編集または削除できます)。
  • ヘッドレスクライアント — CI、cron ジョブ、サーバーサイドのエージェントはブラウザーでのサインインを完了できないため、代わりに API トークンを使用します。GitHub で <server>/tokens にサインインすると、トークンを作成、一覧表示、取り消しできます。新しいトークンは一度だけ表示され、SHA-256 ハッシュとしてのみ保存されます。意図的に MCP ツールにはしていません。シークレットが LLM の通信経路を通過してはならないためです。
  • 名前空間 — メモリーは名前空間に保存されます。共有名前空間(デフォルトは shared)は全員が読み取れます(「最初から共有」)。それ以外はすべて所有者のみに公開されます。セッションとメディアの名前空間は、デフォルトで非公開です。
  • チャンク分割 — 長いコンテンツは書き込み時にチャンクに分割され(各チャンクに 1 つのベクトルを割り当てます)、remember が複数の ID を返す場合があり、recall は最も近いチャンクを返します。
  • シークレットのスキャン — 任意機能で、有効にしない限りオフです。スキャナーの設定を POLYMNEMO_RSP_CONFIG に指定してください(イメージには /app/plugins/rsp.toml が含まれています)。この変数を設定しない場合、すべての書き込みは何もしないガードを通過し、スキャンは行われません。有効にすると、メモリーのテキストは埋め込みや保存の前にスキャンされます。そのため、拒否された書き込みは後から削除されるのではなく、最初から書き込まれません。対象は remember、save_session、update、およびメディアメモリーの説明です。 アップロードされたファイルの内容はスキャンされず、送信されたまま保存されます。バイト列は署名付き URL を使ってオブジェクトストレージに直接送られ、このサーバーを通過しません。ファイルの説明はスキャンされますが、ファイル本体はスキャンされません。

ツール

polymnemo は、メモリの保存、検索、管理を行う MCP ツールを公開しています。

  • メモリ — remember、recall、list_memories、get_memory、update、forget
  • セッション — save_session、load_session
  • メディア — create_upload、confirm_upload、get_download_url

さらに、ヘルスチェック用の ping と、コレクションを自動挿入する memory://{namespace} リソースもあります。メディアのバイトデータは、事前署名 URL を介してオブジェクトストレージに送られ、MCP チャネルを通ることはありません。埋め込まれるのは検索可能な説明のみです(blob エクストラが必要です)。

引数と戻り値の形式の全詳細は、専用の MCP ツールリファレンスに記載されています(近日公開)。キー、名前空間、チャンク化の仕組みについては、概念を参照してください。

設定

POLYMNEMO_* 環境変数(または .env)を使用します。全一覧は .env.example にあります。主な項目は次のとおりです。

変数デフォルト用途
POLYMNEMO_DATABASE_URL(未設定)Postgres+pgvector の DSN。本番環境では必須です。未設定の場合はインメモリ(開発/テスト用)になります。
POLYMNEMO_API_KEYS(空)"key1:alice,key2:bob" — ベアラー認証に必要です。
POLYMNEMO_SHARED_NAMESPACESsharedすべてのユーザーが読み取り可能な名前空間です。
POLYMNEMO_HOST / POLYMNEMO_PORT / POLYMNEMO_MCP_PATH127.0.0.1 / 8000 / /mcpトランスポートです。
POLYMNEMO_RATELIMIT_ENABLED / _PER_MINfalse / 600任意のグローバルレート制限(1 分あたりの操作数)です。
POLYMNEMO_BLOB_BACKEND (+ _BUCKET / _ENDPOINT_URL / _ACCESS_KEY_ID / _SECRET_ACCESS_KEY)noneメディアメモリ用のオブジェクトストレージです。s3 は Cloudflare R2/S3 互換を意味します。
POLYMNEMO_RSP_CONFIG(未設定)スキャナー設定へのパスです。未設定の場合、スキャンは行われません。イメージには /app/plugins/rsp.toml が含まれています。

開発

pip install -e ".[dev]"
pytest                               # fast, offline (stub embedder, in-memory store)
ruff check . && ruff format --check .   # lint + format (enforced in CI)

TEST_DATABASE_URL が pgvector 対応の Postgres を指している場合、Postgres テストが実行されます。CI(.github/workflows/ci.yml)では、リントとカバレッジ付きのテストスイートを実行し、各実行のサマリーに合否とカバレッジの表を掲載します。

デプロイ

polymnemo はステートレス(すべての状態は Neon とオブジェクトストレージに保存)なので、スケール・トゥ・ゼロに対応する Azure Container Apps(主要環境)または Google Cloud Run で実行できます。すべて Terraform で管理します。deploy/terraform/ の共有 neon/(Postgres)と r2/(メディアバケット)のルートが永続状態を管理し、コンピューティングルートがその両方を読み込むサービスをデプロイします。そのため、メモリとメディアはクラウド間で共有されます。

Azure へのデプロイは、CI からワンクリックで実行できます。GitHub シークレット(scripts/setup-github-secrets.sh)を設定し、状態バックエンドを初期化してから(scripts/bootstrap-tfstate-azure.sh)、deploy (azure) ワークフロー(neon → schema → r2 → build → app)を実行します。GCP は手動でのフェイルオーバー先です。詳しい手順は docs/deploy.md を参照してください。

ライセンス

MIT — 詳細は LICENSE を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。