プロトタイプ · プレビュー版:公式レジストリのすべてのサーバーを掲載し、30分ごとに同期しています。レビューとアカウント機能は今後のステップで始まります。
PopNx MCPAIを使う人のためのMCPサーバー · やさしい言葉で解説

memex

作者:ayushagrawal288バージョン 0.1.0i★ –iパソコンで動く
レジストリ名io.github.ayushagrawal288/memex

インストール

概要

作者による説明(英語の原文)

Persistent memory for AI agents — semantic + recency search, ONNX embeddings, Docker Compose.

PopNx MCPの3つの柱

この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。

できること

このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。

  • 接続方法: パソコンで動く
  • トランスポート: Streamable HTTP
  • カテゴリ: 検索・AIの記憶

インストール

使っているAIアプリを選んで、設定をコピーしてください。

インストールの前に

  • 基本チェック:1項目中1項目に合格
  • あなたのパソコンで、あなたのユーザーと同じ権限(ファイル、ネットワーク、アプリ)で動きます。
  • レジストリには、入力が必要なキーは載っていません。

必要なもの

  • DockerDockerのインストール

どのアプリを使っていますか?

上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。

Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます

{
  "mcpServers": {
    "memex": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/ayushagrawal288/memex:v0.1.0"
      ]
    }
  }
}

ターミナルでこれを実行します

claude mcp add memex -- docker run -i --rm ghcr.io/ayushagrawal288/memex:v0.1.0

Cursorで開く

または、設定を自分でコピーする

プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます

{
  "mcpServers": {
    "memex": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/ayushagrawal288/memex:v0.1.0"
      ]
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

VS Codeで開く

または、設定を自分でコピーする

プロジェクトの .vscode/mcp.json に貼り付けます

{
  "servers": {
    "memex": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/ayushagrawal288/memex:v0.1.0"
      ]
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。

選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。

この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。

できること

パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。

基本チェックi

誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック

  • ✓ 合格

    作者とリポジトリが一致

    レジストリ名は、リポジトリを所有するGitHubアカウント ayushagrawal288 で確認済みです

  • … 未チェック

    今もメンテナンスされている

    このリポジトリはまだGitHubから読み取っていません

  • … 未チェック

    ライセンスがある

    このリポジトリはまだGitHubから読み取っていません

  • – 対象外

    エンドポイントが応答する

    これはパソコンで動くため、インターネット上のエンドポイントはありません

  • – 対象外

    OAuthでサインイン

    パソコンで動き、代わりにローカルの設定を使います

  • … 未チェック

    ツールの説明に隠れた指示がない

    パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです

検索・AIの記憶のほかのサーバーとの比較i

  • このカテゴリのほかの7286件のうち0%よりスターが多い
  • このカテゴリのほかの7286件のうち15%より最近レジストリに公開
  • 基本チェックの結果が、このカテゴリのほかの7286件のうち100%と同じかそれ以上

レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。

よくある質問

memexは安全ですか?

当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。

どんなキーやコードが必要ですか?

レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。

パソコンで動きますか、それともクラウドですか?

あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。

今もメンテナンスされていますか?

GitHubリポジトリの最終更新は–、最新バージョン(0.1.0)がレジストリに届いたのは5 か月前です。

どのアプリで使えますか?

Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにDockerも必要です。

代わりに使えるものは?

同じカテゴリには:Context7, Codebase Memory, Exa

代わりの候補

同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。

カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i

Context7

作者:upstash

Up-to-date docs for AI agents

パソコンでもクラウドでも★ 64,224MIT昨日更新
インストール

Codebase Memory

作者:DeusData

Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.

パソコンで動く★ 48,148MIT21 日前更新
インストール

Exa

作者:exa-labs

Connect AI agents to Exa for web search, content fetching, and multi-step research.

クラウドで動く★ 5,213MIT先月更新
インストール

作者のREADME

READMEを開く

作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。

memex

A production-grade persistent memory service for AI agents. Agents forget everything between sessions by default — memex fixes that. It stores, retrieves, and ranks conversation memory using semantic search with recency decay, so agents surface what's relevant *and* recent, not just what's semantically closest.

POST /v1/memories          → store a memory, embed it, persist to Postgres

POST /v1/memories/search → retrieve top-k memories ranked by similarity + recency DELETE /v1/memories/{id} → forget a specific memory GET /v1/memories/count → how many memories does this agent/user have GET /health → liveness + DB connectivity check GET /metrics → Prometheus metrics


Architecture

caller (agent / app)

│ ▼ FastAPI (async) │ ┌────┴────┐ │ │ embeddings asyncpg pool (min=5, max=20) (fastembed │ ONNX, ▼ local) PostgreSQL 16 pgvector extension ivfflat index (cosine)

Write path: content → fastembed ONNX inference (local, ~12 ms CPU, BAAI/bge-small-en-v1.5) → INSERT with 384-dim vector → return memory ID.

Read path: query → embed → pgvector cosine search (top_k × 3 candidates) → re-rank with recency decay in Python → return top_k results with scores.


Design decisions

1. Recency decay on top of semantic search

Pure vector similarity returns the most semantically similar memories, not the most useful ones. A fact from 90 days ago that's a 0.95 similarity match is often less useful than a 0.80 match from yesterday.

Score formula:

score = α × cosine_similarity + (1 − α) × exp(−λ × age_days)

Where λ = ln(2) / half_life_days (default: 30 days, so a 30-day-old memory has 50% recency weight).

α is configurable per request (default 0.7). Task-focused agents use higher α (semantic dominates). Conversational agents use lower α (recency matters more).

2. Fetch 3× candidates, re-rank in Python

The pgvector query returns top_k × 3 candidates sorted by pure similarity. Python re-ranks with the decay formula and slices to top_k. This prevents recency decay from starving high-similarity older memories — they're still in the candidate pool.

At 10× scale (>1M memories per agent): push the scoring into a Postgres function using pg_proc to eliminate the Python re-ranking round-trip.

3. asyncpg + explicit pool sizing over SQLAlchemy async

SQLAlchemy adds ORM overhead on every query. The hot retrieval path — embed, query, re-rank — needs to be tight. asyncpg gives direct control over pool min/max (same instinct as tuning HikariCP in Java). pgvector queries require raw SQL for the <=> operator anyway.

Pool defaults: min=5, max=20. Right-size for a single-instance deployment. Override via DB_MAX_POOL_SIZE env var.

4. Rate limiting in Postgres, not Redis

Sliding window counter via upsert. One fewer dependency. Correct under concurrent requests (transactional upsert). At 10× scale with distributed deployments: replace with Redis INCR + EXPIRE — atomic operations, no lock contention.

5. ivfflat index, not HNSW

ivfflat has lower build cost and lower memory footprint — the right tradeoff at small-to-medium scale (<1M vectors). lists=100 works well up to ~1M rows. At 10× scale: switch to HNSW (m=16, ef_construction=64) for better recall at the cost of higher memory and build time.


Running locally

Prerequisites: Docker and Docker Compose. No API keys required — the entire stack runs locally.

git clone https://github.com/ayushagrawal288/memex

cd memex docker compose up

The API is live at http://localhost:8000. Interactive docs at http://localhost:8000/docs.


API reference

Store a memory
curl -X POST http://localhost:8000/v1/memories \

-H "Content-Type: application/json" \ -d '{ "agent_id": "my-agent", "user_id": "user-123", "content": "User prefers concise responses and dislikes verbose explanations.", "memory_type": "semantic", "importance": 1.2 }'

{

"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "agent_id": "my-agent", "user_id": "user-123", "content": "User prefers concise responses and dislikes verbose explanations.", "importance": 1.2, "memory_type": "semantic", "created_at": "2026-05-26T10:30:00Z", "score": null }

Search memories
curl -X POST http://localhost:8000/v1/memories/search \

-H "Content-Type: application/json" \ -d '{ "agent_id": "my-agent", "user_id": "user-123", "query": "how does this user like to communicate", "top_k": 5, "alpha": 0.7 }'

{

"results": [ { "id": "3fa85f64-...", "content": "User prefers concise responses and dislikes verbose explanations.", "memory_type": "semantic", "created_at": "2026-05-26T10:30:00Z", "score": 0.8921 } ], "query": "how does this user like to communicate", "total": 1 }

Memory types
TypeUse for
episodicSpecific events, past conversations
semanticFacts, preferences, general knowledge
proceduralWorkflows, how-to instructions

Load test results

Run on a MacBook M-series, Docker Desktop, single Postgres instance:

locust -f scripts/load_test.py --host=http://localhost:8000 \

--headless -u 50 -r 10 -t 60s

Realistic load (50 users, 100–300 ms think time — models actual agent traffic):

EndpointRPSp50 (ms)p95 (ms)p99 (ms)Error rate
POST /v1/memories (write)271602703300%
POST /v1/memories/search831102002500%
Aggregated1131202303000%

Saturation test (500 users, minimal think time — finds the throughput ceiling):

EndpointRPS (plateau)p50 (ms)p99 (ms)Error rate
POST /v1/memories (write)283,9006,1000%
POST /v1/memories/search913,6005,8000%
Aggregated~1203,7005,9000%

Run on MacBook M-series, Docker Desktop (4 CPUs), 4 uvicorn workers, 16 threads/worker.

Embeddings: local ONNX (BAAI/bge-small-en-v1.5) — zero external API calls, zero cost.

Why the ceiling is ~120 RPS: Every write and every search requires one ONNX inference (~10–15 ms on CPU). With 4 Docker CPUs: 4 cores / 12 ms ≈ 333 embeddings/s theoretical max. After Python overhead, DB queries, and asyncio scheduling: ~120 RPS actual.

Path to higher throughput:

ApproachExpected gainComplexity
Embedding cache (Redis, key = SHA256 of text)2–3× (40–60% hit rate on repeated agent queries)Low
Horizontal scaling (N replicas behind a load balancer)N× linearMedium
GPU inference (swap ONNX runtime → CUDA)10–50×Medium
Voyage-3 API (offload to Anthropic's inference fleet)Scales to thousands of RPS, limited by API quotaLow code change

Project structure

memex/

├── app/ │ ├── main.py # REST API — FastAPI, lifespan, router registration │ ├── mcp_server.py # MCP server — single-worker FastAPI on port 8001 │ ├── core/ │ │ └── config.py # All settings, loaded from env │ ├── db/ │ │ └── pool.py # asyncpg pool, migrations │ ├── models/ │ │ └── schemas.py # Pydantic request/response models │ ├── services/ │ │ ├── embeddings.py # fastembed ONNX inference (local, zero API calls) │ │ ├── local_summarizer.py # Extractive summariser — Jaccard dedup + TF scoring │ │ ├── memory.py # Core write/search/scoring logic │ │ ├── metrics.py # Prometheus metric definitions │ │ ├── summarizer.py # Background summarisation job │ │ └── rate_limit.py # Sliding window rate limiter │ └── api/routes/ │ ├── memories.py # Memory endpoints │ ├── health.py # Health + readiness │ └── mcp_tools.py # MCP tool definitions (store, search, delete, count) ├── scripts/ │ └── load_test.py # Locust load test ├── docker-compose.yml ├── Dockerfile └── requirements.txt


Observability

docker compose up starts Prometheus and Grafana alongside the API:

ServiceURLCredentials
REST API docshttp://localhost:8000/docs—
MCP serverhttp://localhost:8001/mcp/—
Prometheushttp://localhost:9090—
Grafanahttp://localhost:3000admin / admin

The Grafana dashboard is provisioned automatically. Panels:

  • HTTP request rate + latency p50/p99 — from prometheus-fastapi-instrumentator
  • Embedding API latency p50/p99 — per-attempt histogram by operation (embed / embed_batch)
  • Memory operations/s — create, search, delete throughput
  • DB pool utilisation — active vs idle connections (update interval: 15 s)
  • Summariser activity — memories condensed per hour, run outcomes
  • Embedding errors/min — by operation and error type

Custom metrics are in app/services/metrics.py and exposed on /metrics alongside the standard FastAPI instrumentator metrics.


MCP endpoint

memex exposes itself as an MCP server so any MCP-aware agent (Claude Desktop, Claude Code, custom agents) can store and retrieve memories without custom HTTP integration.

Transport: Streamable HTTP (MCP 2024-11-05 spec). Single-worker process on port 8001 — session state is in-process, so a separate service avoids sticky-session complexity while keeping the REST API's multi-worker throughput.

Tools:

ToolDescription
store_memoryEmbed + persist a memory (type, importance configurable)
search_memoriesSemantic + recency ranked retrieval with configurable alpha
delete_memoryForget a specific memory by UUID
count_memoriesHow many memories an agent/user pair has
Connect from Claude Desktop

Add to ~/.config/claude/claude_desktop_config.json:

{

"mcpServers": { "memex": { "type": "streamable-http", "url": "http://localhost:8001/mcp/" } } }

Connect from Claude Code
claude mcp add --transport http memex http://localhost:8001/mcp/
Design: why a separate service

The MCP Streamable HTTP transport is session-stateful — initialize, tools/list, and tools/call must all reach the same server process. The REST API runs 4 uvicorn workers with round-robin routing; routing different MCP requests to different workers breaks session state.

Running a dedicated single-worker MCP service on port 8001 avoids sticky-session infrastructure (nginx ip_hash, Redis session store) while keeping the REST API fully multi-worker.


Memory summarisation

Runs as a background asyncio task on a configurable interval (default: every 5 minutes). Finds any (agent_id, user_id) pair where episodic memory count exceeds a threshold, condenses the oldest batch into a single semantic memory, then deletes the originals. Fully local — no LLM API calls.

**How it summari

冒頭だけを表示しています。続きはリポジトリで読めます

PopNxに聞く