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

loci

제작자: 3M1RY33T버전 0.6.0i★ –i내 컴퓨터에서 실행
레지스트리 이름io.github.3M1RY33T/loci

설치

개요

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

Scoped memory for coding agents: picks the right project, answers in scope, or abstains.

PopNx MCP의 세 기둥

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

할 수 있는 일

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

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

설치

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

설치하기 전에

  • 기본 점검: 1개 중 1개 통과
  • 내 컴퓨터에서 내 사용자 계정의 권한(파일, 네트워크, 앱)으로 실행돼요.
  • 레지스트리에 입력해야 할 키가 나와 있지 않아요.

필요한 것

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

어떤 앱을 쓰세요?

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

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

{
  "mcpServers": {
    "loci": {
      "command": "uvx",
      "args": [
        "loci-mem",
        "mcp"
      ]
    }
  }
}

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

claude mcp add loci -- uvx loci-mem mcp

Cursor에서 열기

또는 설정을 직접 복사하기

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

{
  "mcpServers": {
    "loci": {
      "command": "uvx",
      "args": [
        "loci-mem",
        "mcp"
      ]
    }
  }
}

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

VS Code에서 열기

또는 설정을 직접 복사하기

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

{
  "servers": {
    "loci": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "loci-mem",
        "mcp"
      ]
    }
  }
}

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

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

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

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

할 수 있는 일

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

기본 점검i

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

  • ✓ 통과

    제작자와 저장소 일치

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

  • … 아직 점검 안 함

    계속 관리되고 있음

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

  • … 아직 점검 안 함

    라이선스 있음

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

  • – 해당 없음

    엔드포인트 응답

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

  • – 해당 없음

    OAuth로 로그인

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

  • … 아직 점검 안 함

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

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

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

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

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

자주 묻는 질문

loci, 안전한가요?

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

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

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

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

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

아직 관리되고 있나요?

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

어떤 앱에서 쓸 수 있나요?

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

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

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

대안

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

카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도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, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.

loci

Scoped memory for coding agents. A router in front of two stores.

question ──▶ router ──▶ ┌── structure store   what calls what

(no LLM) └── episode store what happened and why └─▶ merged, cited answer │ or ABSTAIN ────────────┘

Knowledge graphs hold structure but no prose, so they cannot answer *why did the cookie get dropped*. Verbatim-recall systems hold prose but no call graphs, so they cannot answer *what calls run_agent_turn*. Both make you name the namespace when you write.

loci decides the scope when you read. One question path serves *"how does auth work here"* and *"have I solved this in any project"* — only the size of the scope set changes.


The shape, in one picture

A street of independent shops. Each shop is one project — its own stock, its own books, nothing pooled in a shared warehouse. Each keeps two ledgers: what calls what, and what happened and why. They are read together or not at all.

Shops wear overlapping badges — yours, this client's, that vendor's, this monorepo's. A badge can cover shops at opposite ends of the street, which is why they are labels rather than a hierarchy.

You never walk the street yourself. You ask the dispatcher, who knows only which *uncommon* words are stocked where. They send you into at most three shops, or say nobody here carries that and name who might.

Each shop also hangs a signboard naming what it *is* — repository, package, command — and keeps a list of what it reaches for. Reading one against the other is how the street answers *which of my shops buys from another*, which no amount of asking the dispatcher ever could: that question is about the road between two shops, and the dispatcher only knows what is stocked inside them.

One thing the street still lacks: aisles inside a shop, so a word found in a test fixture does not count like the same word in shipped code.


The problem it solves

Put every project in one index and the largest one wins regardless of the question. Measured against a merged graph of ten real repositories:

questionon-topic nodes returned
"why was the admin session cookie dropped on localhost?"18% — 19 of 31 came from the biggest project
"what happens when a user clicks Save as ZIM?"2% — 61 of 62 came from the biggest project
"how does the reserved landing step work?"98% — and the biggest project *was* the answer

That third row is the trap. Merged retrieval looks excellent whenever the answer happens to live in the largest corpus and collapses when it does not. It is the same failure in both directions, visible in only one.


Install

The distribution is `loci-mem`; the command, the import and the project are all loci. PyPI's loci is an unrelated outlier-detection package abandoned in 2018 — the same split as python-dateutil installing as dateutil.

pipx install loci-mem                 # routing + lexical search, one dependency

pipx install 'loci-mem[all]' # + graphify, local embeddings, MCP server

The base install pulls `numpy`, and nothing else. Routing, BM25 and the char-gram matrix are a compiled Rust extension as of 0.6.0, so scikit-learn (and scipy behind it), rank-bm25 and joblib are gone. No torch, no vector database, no model download unless you ask for one.

Wheels are published for macOS, Linux and Windows; installing from the sdist builds from source and needs a Rust toolchain (1.75+).

extraadds
graphifycode-symbol extraction across ~18 languages
embeddingslocal bge-small semantic ranking
rerankcross-encoder reranking (opt-in per query)
mcpthe MCP server

Quickstart

pipx install 'loci-mem[all]'

loci setup # scan, graph, index, embed, calibrate -- one pass loci ask "why was the session cookie dropped on localhost?"

setup asks only what it cannot decide for you: which directories hold your projects, whether to register the repositories it found that are not yours, and whether to spend a one-time model download on semantic search. It ends by running doctor, so whatever it could not cover is the last thing you read rather than something you discover from a bad answer a week later.

Every prompt takes its default when stdin is not a terminal, so it is safe to run unattended in a container or under an agent. -y does the same from a terminal, and --no-graphs / --no-embed / --no-calibrate decide individual steps up front.

The same thing by hand. The order is a dependency chain, not a preference: graphs are what the index is built from, the index writes the chunks embed encodes, and calibrate fits its semantic floor from those vectors.

loci scan ~/code       # register every git repo it finds, one scope each

loci graphs # optional: add code symbols (free, no model calls) loci index # build the routing index + episode store loci embed # optional: local vectors for semantic recall loci calibrate # optional: fit routing thresholds to your corpus loci doctor # what is missing, and the command that fixes it

loci ask "which projects use wrangler and D1?" loci eval # measure routing accuracy on YOUR corpus

Each step writes what the next one reads, which is what makes the order fixed rather than preferred:

flowchart TD

scan["loci scan ~/code writes ~/.loci/scopes.json"] graphs["loci graphs writes graphify-out/graph.json, one per scope"] index["loci index writes ~/.loci/episodes.json, scope_index.json, rankers/"] embed["loci embed writes ~/.loci/embeddings.npz"] calibrate["loci calibrate writes ~/.loci/calibration.json"] doctor["loci doctor writes nothing at all"]

scan -->|"there is nothing to graph or index until a scope exists"| graphs graphs -->|"the index is built FROM graph.json; index first and every project routes on prose alone"| index index -->|"embed encodes episode chunks, and they do not exist until index has written the store"| embed embed -->|"calibrate fits a per-scope semantic floor from those vectors; with none it keeps a default"| calibrate calibrate -->|"and then reports whatever is still missing"| doctor

Running it out of order does not fail loudly. It produces an install that works and quietly retrieves worse, which is the failure doctor exists to name.

scan registers one scope per git repository. It also reads who owns each repository out of git, prints who owns what, and asks before registering the ones that are not yours; that prompt takes its default like every other, which is to register everything.

A monorepo can become one scope per package instead. --split on loci scan or loci setup takes anything carrying package.json, pyproject.toml, Cargo.toml or go.mod one level down; a repo-local .loci.json names the rest and is honoured with or without the flag. `--split` is off by default, and the reason is measured rather than cautious: a new scope's aliases include its bare directory name, and an alias outranks your working directory (6.0 to 4.0). On the development corpus, splitting a repository holding glasses/ sent eight hand-written questions about a *different* project to Delroy/glasses — seven of them had routed correctly before the split, and six of the eight reverted when the alias boost was zeroed. A Jekyll _site/ build directory became a scope of its own on the same run. A .loci.json you wrote does not have that problem: you named those sub-projects deliberately, so you can see what they are called.

ask uses your working directory by default, and should. Questions that name no project — *"how is this deployed?"*, *"how do I run the tests?"* — route correctly 100% of the time with cwd. Without it they are unanswerable, and loci abstains on all of them rather than guessing. cwd is not a tiebreaker signal here, it is the primary one.


Concepts

Scope. One project, one namespace. A registered git repository, one package of a monorepo (under --split, or named in .loci.json), or anything you add explicitly. Scopes are never merged.

Group. An overlapping label on a scope: me and vendor: , read from git provenance; client:acme and anything else you assert by hand; and a monorepo's own id, carried by every package inside it *and* by the monorepo itself, so --group reaches the code no package claimed. A scope can be in several, and the scope set stays flat: grouping never merges scopes or nests one inside another.

What a group does to a question is its mode, and the mode answers two different questions. Reached through your working directory, explicit does nothing, soft (the default) multiplies every outside scope's evidence base by 0.5, and hard confines routing to members and abstains when the best answer is outside. Named on the command line with --group X, all three modes confine to X's members — the mode decides only what happens when the best answer is outside them: hard abstains and says so, soft and explicit answer with the best member anyway. Membership lives in the scope registry, mode in groups.json, so a re-scan — which rewrites the registry wholesale — cannot discard policy. Measured: hard anchored on cwd fires on questions that *name* an outside project (12 of 12) and not on questions carrying only its vocabulary (0 of 24), so in practice --group and project names drive it rather than where you are standing.

Structure store. What calls what — symbols, files, references, traversals with file:line citations. Supplied by graphify through an adapter.

Episode store. What happened and why — README and docs, git commit bodies, docstrings and comment blocks, and any notes you point it at. Stored verbatim, chunked on heading boundaries, redacted before it is written.

Router. Decides which scopes a question belongs to, deterministically, with no model call. Signals in order of weight: an explicit project name (6.0), the working directory (4.0), vocabulary evidence (measured 0.1–1.5), recency (0.15). Weight is not usefulness — cwd is the signal that carries most real questions, because most real questions name no project at all.

Abstention. A first-class outcome. ABSTAIN means *ask the user*, not *pick the biggest*. Both layers can refuse.

An abstention that only says *no* leaves the asking to you, so it carries the shortlist it refused to choose between — each project, and the terms that put it there:

loci ask "how is caching handled?"

ABSTAINED - not enough of the question exists in any project. candidates: Delroy (handled, caching), odysseus (handled, caching), tensor-serve (caching) re-run with --scope , or from inside the project directory.

A scope earns its place by holding a term at most half the corpus holds. Holding one is not enough: change, handled and work sit in nearly every project, so matching them is a coincidence rather than a claim. Measured on the development corpus, that is the difference between naming three projects and listing all fourteen in score order, which is the registry rather than a shortlist.

When nothing clears that bar there is no shortlist to print, and saying so is the answer — the question's subject is not indexed anywhere, and choosing a scope would only relocate the guess:

loci ask "xyzzy plugh frotz quuz"

ABSTAINED - not enough of the question exists in any project. no project holds a distinctive term from this question -- loci doctor shows what is not indexed.


Architecture

The query path

The diagram at the top of this file

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

PopNx에게 묻기