프로토타입 · 미리 보기: 공식 레지스트리의 모든 서버를 담고 있으며 30분마다 동기화해요. 리뷰와 계정 기능은 다음 단계에서 열려요.
PopNx MCPAI를 쓰는 사람을 위한 MCP 서버 · 쉬운 말로 설명해요

RAWThink

제작자: ygtalp버전 2.0.1i★ –i내 컴퓨터에서 실행
레지스트리 이름io.github.ygtalp/rawthink-mcp

설치

개요

제작자가 쓴 설명(영어 원문)

Persistent memory for AI thinking partnerships: hybrid search and a temporal knowledge graph.

PopNx MCP의 세 기둥

이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.

할 수 있는 일

이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.

  • 연결 방식: 내 컴퓨터에서 실행
  • 전송 방식: stdio
  • 카테고리: 검색 및 AI 기억

설치

쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.

설치하기 전에

  • 기본 점검: 1개 중 1개 통과
  • 내 컴퓨터에서 내 사용자 계정의 권한(파일, 네트워크, 앱)으로 실행돼요.
  • 직접 입력할 값: RAWTHINK_VAULT, MEMORY_FILE_PATH, QDRANT_URL, QDRANT_PATH, OLLAMA_URL, OLLAMA_MODEL, RAWTHINK_TOOL_PROFILE, RAWTHINK_BM25_STATE, RAWTHINK_LOG_LEVEL

필요한 것

  • PyPIPython의 uv 설치(uvx 명령어용)

어떤 앱을 쓰세요?

위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.

Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요

{
  "mcpServers": {
    "rawthink": {
      "command": "uvx",
      "args": [
        "rawthink-mcp"
      ],
      "env": {
        "RAWTHINK_VAULT": "your-value",
        "MEMORY_FILE_PATH": "your-value",
        "QDRANT_URL": "your-value",
        "QDRANT_PATH": "your-value",
        "OLLAMA_URL": "your-value",
        "OLLAMA_MODEL": "your-value",
        "RAWTHINK_TOOL_PROFILE": "your-value",
        "RAWTHINK_BM25_STATE": "your-value",
        "RAWTHINK_LOG_LEVEL": "your-value"
      }
    }
  }
}

터미널에서 이 명령어를 실행하세요

claude mcp add rawthink --env RAWTHINK_VAULT=your-value --env MEMORY_FILE_PATH=your-value --env QDRANT_URL=your-value --env QDRANT_PATH=your-value --env OLLAMA_URL=your-value --env OLLAMA_MODEL=your-value --env RAWTHINK_TOOL_PROFILE=your-value --env RAWTHINK_BM25_STATE=your-value --env RAWTHINK_LOG_LEVEL=your-value -- uvx rawthink-mcp

실행하기 전에 빈 값을 채워 주세요.

Cursor에서 열기

또는 설정을 직접 복사하기

프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요

{
  "mcpServers": {
    "rawthink": {
      "command": "uvx",
      "args": [
        "rawthink-mcp"
      ],
      "env": {
        "RAWTHINK_VAULT": "your-value",
        "MEMORY_FILE_PATH": "your-value",
        "QDRANT_URL": "your-value",
        "QDRANT_PATH": "your-value",
        "OLLAMA_URL": "your-value",
        "OLLAMA_MODEL": "your-value",
        "RAWTHINK_TOOL_PROFILE": "your-value",
        "RAWTHINK_BM25_STATE": "your-value",
        "RAWTHINK_LOG_LEVEL": "your-value"
      }
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

VS Code에서 열기

또는 설정을 직접 복사하기

프로젝트의 .vscode/mcp.json에 붙여 넣으세요

{
  "servers": {
    "rawthink": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "rawthink-mcp"
      ],
      "env": {
        "RAWTHINK_VAULT": "your-value",
        "MEMORY_FILE_PATH": "your-value",
        "QDRANT_URL": "your-value",
        "QDRANT_PATH": "your-value",
        "OLLAMA_URL": "your-value",
        "OLLAMA_MODEL": "your-value",
        "RAWTHINK_TOOL_PROFILE": "your-value",
        "RAWTHINK_BM25_STATE": "your-value",
        "RAWTHINK_LOG_LEVEL": "your-value"
      }
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.

선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.

직접 입력할 값

  • RAWTHINK_VAULT env
    Path to the vault directory holding sessions, qnotes and the knowledge graph.
  • MEMORY_FILE_PATH env
    Path to memory.jsonl. Defaults to /memory.jsonl.
  • QDRANT_URL env
    Qdrant server URL.
  • QDRANT_PATH env
    Set to a directory to run Qdrant embedded instead of via Docker.
  • OLLAMA_URL env
    Ollama server URL. Without it, retrieval degrades to sparse-only.
  • OLLAMA_MODEL env
    Embedding model. Changing it requires a full reindex.
  • RAWTHINK_TOOL_PROFILE env
    Which tools to expose: recall (4, read-only), record (5, the write path), or full (17).
  • RAWTHINK_BM25_STATE env
    Path to the BM25 state file. Defaults to /.bm25_state.json.
  • RAWTHINK_LOG_LEVEL env
    Log level for diagnostics on stderr.

이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.

할 수 있는 일

내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.

기본 점검i

누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 9일 점검

  • ✓ 통과

    제작자와 저장소 일치

    레지스트리 이름이 GitHub 계정 ygtalp 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요

  • … 아직 점검 안 함

    계속 관리되고 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • … 아직 점검 안 함

    라이선스 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • – 해당 없음

    엔드포인트 응답

    내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요

  • – 해당 없음

    OAuth로 로그인

    내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요

  • … 아직 점검 안 함

    도구 설명에 숨겨진 지시 없음

    내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요

검색 및 AI 기억 카테고리의 다른 서버와 비교i

  • 이 카테고리의 다른 서버 5746개 중 0%보다 스타가 많아요
  • 이 카테고리의 다른 서버 5746개 중 26%보다 최근에 레지스트리에 공개됐어요
  • 기본 점검 결과가 이 카테고리의 다른 서버 5746개 중 100%와 같거나 더 좋아요

레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.

자주 묻는 질문

RAWThink, 안전한가요?

해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.

어떤 키나 코드가 필요한가요?

레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.

내 컴퓨터에서 실행되나요, 클라우드에서 실행되나요?

내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).

아직 관리되고 있나요?

GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(2.0.1)은 3개월 전 레지스트리에 올라왔어요.

어떤 앱에서 쓸 수 있나요?

Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.

대신 쓸 수 있는 건 뭐가 있나요?

같은 카테고리에는: Context7, Codebase Memory, Exa

대안

같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.

카드 보는 법:↓ 주간 다운로드i★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i

Context7

Up-to-date docs for AI agents

제작자: upstash널리 사용됨↓ 97.3만/주★ 6.4만그저께 업데이트

컴퓨터 또는 클라우드

Codebase Memory

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

제작자: DeusData널리 사용됨↓ 1.8만/주★ 4.8만22일 전 업데이트

내 컴퓨터에서 실행

Exa

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

제작자: exa-labs널리 사용됨★ 5.2천2개월 전 업데이트

클라우드에서 실행✓ exa.ai

제작자의 README

README 열기

제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.

RAWThink

Persistent memory for AI thinking partnerships. A knowledge graph you can argue with, search that spans every session you have ever had, and a record of not just what you decided but what you rejected.

MCP server for Claude Code. Python, local, no cloud.


The problem

Every conversation with an AI starts from nothing. You explain the same context, re-derive the same conclusions, and rediscover decisions you already made — and the reasoning that produced them is gone the moment the window scrolls.

Chat history does not fix this. History is a transcript; what you need is *structure*: which ideas connect, which beliefs you have since abandoned, which alternatives you considered and dropped, and why.

RAWThink keeps that structure in three layers, in files you own.

What it does

Hybrid semantic search across every session and note — BGE-M3 dense embeddings and BM25 sparse vectors, fused with RRF. Ask "what did I think about free will?" and get the passages, not a keyword match.

A temporal knowledge graph where observations carry dates and status. Beliefs can be marked invalidated and linked to what replaced them, so the archive remembers not only what you think but what you used to think.

Session lifecycle — a close command that exports the conversation, extracts entities into the graph, and writes a handoff the next session loads automatically.

Activation decay — unused knowledge fades on a ~23-day half-life, accessed knowledge stays warm. Old material is still there; it just stops crowding out what you are working on now.


Quick start

Prerequisites
  • Python 3.10+
  • Docker for Qdrant — or set QDRANT_PATH for embedded mode
  • Ollama with bge-m3: ollama pull bge-m3
Install
pip install rawthink-mcp

rawthink-install # creates ~/rawthink-vault with everything inside cd ~/rawthink-vault docker compose up -d # starts Qdrant

rawthink-install writes the vault structure, CLAUDE.md, THINKING_DIRECTIVES.md, SETUP.md, docker-compose.yml and the /rtclose command. Use rawthink-install --vault ~/my-vault for a different location.

Register with Claude Code
claude mcp add --scope user rawthink -- rawthink-mcp
Check the install
rawthink-doctor

Nine checks with a fix line for each failure: vault, graph schema, BM25 state format, Qdrant, index coverage, vector dimension, Ollama, MCP registration.

The index coverage check is the one worth knowing about. Indexing can stop partway and leave a collection that looks healthy — it exists, it has points, queries return results. They are results from part of the vault, and nothing else tells you that.

Upgrading from 0.x

1.5.0 changed the graph schema and 2.0.0 changes the sparse index. Migrate the graph before writing anything:

python -m rawthink_mcp.migrate --path vault/memory.jsonl --guess-domains --heal-dangling

That is a dry run — it prints what would change and writes nothing. Read the report, then re-run with --apply. A timestamped backup is taken first.

Then re-encode the search index, because BM25 term IDs changed:

reindex(full=True)

A plain reindex skips unchanged chunks and will leave the old encoding in place. rawthink-doctor tells you if this is still pending.

See CHANGELOG.md for what changed and why.


Your first session

> search_thoughts("what have I decided about caching?")

record_decision(

name="api/cache: read-through", domain="software", decided="read-through cache in front of the read model", because="the write path is already the bottleneck; adding invalidation there costs more", rejected=["write-through — couples the write path to cache health", "no cache — p99 was 400ms against a 200ms SLO"] )

Close with /rtclose. It exports the conversation, extracts what is worth keeping into the graph, and leaves a handoff for next time — which the next session loads on its own.


The schema, and why it looks like this

This is the part worth understanding, because it is what keeps the graph queryable over years rather than months.

Role and subject are separate fields

entityType answers what role does this node play. Closed list of ten:

typefor
decisiona choice made, with alternatives rejected
conceptan idea, theory, model, analogy
findingsomething discovered or measured — a bug, a result, an audit
rulea durable constraint or pattern to follow
open-questionunresolved, waiting on evidence
artifacta project, tool, document, feature, source
insighta realisation that changed how something is seen
taska unit of intended work
eventsomething that happened at a point in time
thinga person, object or substance named directly

domain answers what subject is it about: software, music, history, philosophy, health, writing, neuro, finance, personal, galaxy.

Keeping these apart is not tidiness. When one field carries both, the type list grows by one entry per subject — a real vault reached 46 types this way, with saglik-bulgusu, teknik-karar and bug-pattern sitting next to karar. At that point nothing can be filtered, because no two entries agree on what a type means.

Unknown relation types are rejected, not warned about

Canonical vocabulary: supports, contradicts, evolved_into, depends_on, exemplifies, part_of, caused_by, enables, supersedes, related_to, investigates, informs, uses.

Close synonyms fold automatically — connected_to → related_to, aspect_of → part_of. Anything else raises.

An earlier version accepted unknown types with a warning. Nothing acted on the warning and 56 one-off types accumulated. A warning that lets the write through is a decision to allow it, written in the voice of disapproval.

Epistemic status defaults to unknown

assertion, hypothesis, speculation — or unknown when unstated.

unknown is deliberate. If a session did not establish something, recording it as an assertion promotes a claim nobody made. The migration follows the same rule: 144 entities with no epistemic field became unknown, not assertion.

Revise, do not delete
> revise(entity_name="api/cache: read-through",

observations=["read-through cache in front of the read model"], superseded_by="moved to write-through after the read model split", superseding_entity="api/cache: write-through")

The old observation is marked invalidated, dated, and linked to what replaced it. Delete tools exist but sit outside the default agent-facing profiles: an archive that forgets its own reversals cannot answer the question it was kept for.

Decisions record what was rejected

record_decision stores decided, because, and rejected as separately queryable observations. The rejected alternatives are the part worth keeping — what was chosen stays readable in the code forever, what was considered and dropped exists nowhere else. That is the question that gets asked six months later.


MCP tools

Tool definitions sit in the context window from the first token of a session, so the surface is a standing cost rather than a per-call one. Profiles load only what a given step needs.

RAWTHINK_TOOL_PROFILE=recall   #  4 tools,  ~900 tokens — read-only

RAWTHINK_TOOL_PROFILE=record # 5 tools, ~1750 tokens — the write path RAWTHINK_TOOL_PROFILE=full # 17 tools, ~4200 tokens — everything (default)

A tool outside the active profile stays an ordinary function — reachable from the CLI and from tests. It simply is not in front of an agent that will not call it.

Search
toolwhat it does
search_thoughtsHybrid search. mode="overview" gives one line per session
get_sessionFull content of a session by ID
store_thoughtSave a quick note as a qnote
reindexRe-index the vault into Qdrant
Graph — reading
toolwhat it does
search_nodesBounded. Filters by domain and entity_type; reports total_matched and truncated
open_nodesSpecific entities with their relations
read_graphWhole graph, paginated, with a summary mode
Graph — writing
toolwhat it does
recordEntities, relations and observations in one validated, atomic call
record_decisionA decision with its rejected alternatives
reviseMark observations superseded, link what replaced them
create_entities · create_relations · add_observationsLower-level equivalents
invalidate_observationsBelief revision without the relation link
delete_entities · delete_observations · delete_relationsfull profile only

record() validates the whole batch before writing any of it. A half-valid batch writes nothing — a graph left in a state nobody asked for is worse than a rejected write. Relations may only point at entities that already exist or are created in the same call.

Every tool carries MCP annotations (readOnlyHint, destructiveHint, idempotentHint), so a host can tell deletion apart from search.


Architecture

Claude Code

│ MCP (stdio) ▼ rawthink-mcp ├── search ──► Qdrant dense (BGE-M3) + sparse (BM25), RRF fusion ├── graph ──► memory.jsonl entities, relations, temporal observations └── export ──► vault/ sessions, qnotes, handoffs as markdown │ Ollama (bge-m3)

Everything runs locally. The vault is plain markdown with YAML frontmatter — open it in Obsidian to browse visually, no plugins needed.

Why JSONL for the graph

Human-readable, git-diffable, no dependency. You can open it, read it, and see a meaningful diff when it changes — which matters for something meant to hold your reasoning.

The tradeoff is load time: the whole file is parsed per read. Fine at a few hundred entities, slower as it grows. Past tens of thousands, SQLite is the obvious next step.


Session lifecycle

session start          handoff loads automatically (SessionStart hook)

↓ think together ↓ /rtclose export → extract entities → write handoff

앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요

PopNx에게 묻기