Skip to main content
Glama
dcazman

Claude-Atlas-MCP

by dcazman

Claude-Atlas-MCP

셀프 호스팅 MCP 서버로, Claude가 대화 간에 지속적인 메모리를 유지할 수 있게 해줍니다 — 엔터티, 관찰, 기록, 시간 지정 알림과 함께, 도착한 항목을 위한 트레이와 아이디어를 위한 선반을 제공합니다. 가벼운 Node/SQLite 백엔드에서 직접 실행하세요.

Claude에 MCP 커넥터로 연결하면, Claude가 대화에서 다음 대화로 넘어갈 때 작업 중인 내용을 기억할 수 있습니다: 진행 중인 프로젝트, 결정과 그 근거, 사용자와 설정에 관한 사실, 그리고 미래 날짜에 다시 표시할 내용 등.

이유

Claude는 대화가 끝나면 모든 것을 잊어버립니다. Atlas는 작고, 지루하며, 내구성 있는 메모리 레이어로, 전적으로 사용자가 소유합니다 — 타사 서비스 없고, 벤더 종속도 없습니다. 하나의 Node 프로세스가 하나의 SQLite 파일로 작동합니다. 홈 서버, VPS, 또는 노트북에서 실행하세요.

의도적으로 비어 있는 상태로 시작합니다. 사용자의 삶에 대한 스키마가 내장되어 있지 않으며, 가정된 직업이나 필수 이슈 트래커도 없습니다 — 사용할 때 채워지는 형태만 있을 뿐입니다.

Related MCP server: memory-mcp

빠른 시작

git clone https://github.com/dcazman/Claude-Atlas-MCP.git
cd Claude-Atlas-MCP
docker compose up -d --build
docker compose logs atlas-mcp

.env 파일, 토큰, 설정이 필요 없습니다. 첫 시작 시 Atlas는 데이터베이스를 생성하고, 각 범위에 대해 하나의 토큰을 생성하여 출력합니다:

    work     3f2a…   (caller "work-client")
    personal 9c41…   (caller "personal-client")
    shared   b7e0…   (caller "shared-client")

  Connect a client to:  http://localhost:7784/atlas-mcp?token=<one of the above>

토큰은 데이터베이스 옆에 저장되며, 재시작할 때마다 재사용됩니다. 데이터는 ./data 디렉토리, 단일 SQLite 파일에 저장됩니다. 이것이 전체 설정입니다.

작동 여부 확인:

curl -s localhost:7784/health
# {"ok":true,"service":"atlas-mcp","version":2,"port":"7784"}

TOKEN=<one of the tokens printed above>
curl -s -X POST localhost:7784/atlas-mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -H "x-atlas-token: $TOKEN" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":
       {"name":"add_observation","arguments":
        {"section":"work","entity":"Atlas","content":"Installed today."}}}'

observation_id가 반환되면 전체 스택이 작동하는 것입니다: 첫 번째 메모리가 디스크에 저장되었고 Claude가 다시 읽을 수 있습니다.

CI는 main에 푸시될 때마다 이미지를 게시합니다. 직접 빌드하지 않으려면:

docker run -d --name atlas -p 7784:7784 -v "$PWD/atlas-data:/app/data" \
  ghcr.io/dcazman/claude-atlas-mcp:latest
docker logs atlas

순수 Node — 22.13+ 버전이면 내장 node:sqlite를 사용할 수 있습니다. 네이티브 종속성 없음, 컴파일할 것 없음:

npm install
npm start

직접 토큰, 시간대, 또는 정리 시간을 기본값 대신 사용하려면, cp .env.example .env를 실행하고 원하는 줄의 주석을 해제하세요. 편집하지 않고 복사해도 아무 변화가 없습니다 — 모든 줄이 의도적으로 주석 처리되어 있습니다.

데이터 모델

개념

설명

엔터티

Claude가 추적하길 원하는 주제나 프로젝트 (예: "홈 네트워크", "Q3 계획"). 이름과 한 줄 요약이 있습니다.

관찰

엔터티에 첨부된 단일 사실 ("2026-06-01에 라우터를 6E 대역으로 전환함"). 메모리의 원자 단위입니다. 제자리에서 편집 가능하며, 보호 표시를 하여 수정은 가능하지만 삭제는 불가능하게 할 수 있습니다.

기록 이벤트

발생한 주목할 만한 사건으로, 나중에 회상할 수 있도록 타임라인에 기록됩니다.

알림

trigger_date가 있는 메모. 날짜가 도래하면 대화 시작 시 자동으로 표시되며, 해제될 때까지 유지됩니다. trigger_time을 추가하면 시간 지정 알림이 되어, 한 번만 전달되며 폴링하는 무언가가 전달해야 합니다.

트레이 항목

도착했지만 분류가 필요하지만 현재 작업을 방해하지 않아야 하는 것. 지금 캡처하고, 나중에 결정하세요.

선반 항목

사용자 자신의 아이디어 중 하나. 날짜 없음, 압박 없음, 노후화 없음.

섹션

최상위 네임스페이스 — work, personal, 또는 shared. 모든 툴 호출은 section을 받습니다. shared는 work 및 personal 범위 토큰 모두 접근할 수 있는 전달 채널입니다. get_landscape는 이를 가져오는 섹션에 병합합니다.

깔때기

세 가지 표면, 약속 수준이 증가하는 순서:

  shelf  ──graduate──▶  tray  ──promote──▶  memory
 (ideas)              (triage)          (observations)
  • 선반은 생각난 것들을 보관합니다. 1년 동안 거기에 있는 아이디어가 백로그 실패가 아닙니다 — 선반이 제대로 작동하고 있는 것입니다. 아이디어는 트레이로 승격되거나 의도적으로 폐기될 때 떠나며, 그 이유는 보관됩니다.

  • 트레이는 도착한 것들을 보관합니다. 쌓아두는 곳이 아니라 대기열입니다: 캡처한 후 승격, 병합, 또는 해제하세요.

  • 메모리는 Claude가 대화 시작 시 다시 읽는 부분입니다.

통과 과정에서 아무것도 파괴되지 않습니다. 해결된 항목은 더 이상 표시되지 않지만, 그 기록(무엇으로 바뀌었는지 포함)은 유지됩니다.

이것들을 실제로 보는 방법. get_landscape는 Claude가 대화 시작 시 호출하는 하나의 호출입니다. 따라서 주의가 필요한 모든 것은 이 안에 다시 나타나야 합니다:

표면

랜드스케이프에서

이유

메모리

전체

대화가 실행되는 컨텍스트입니다

도래한 알림

전체

요청하지 않아도 다시 표시되는 것이 전부입니다

트레이

전체

분류되지 않은 캡처는 사용자의 결정을 기다리고 있습니다

선반

개수만

모든 아이디어를 매 대화마다 나열하면 압박 없는 선반이 성가신 백로그가 됩니다 — 개수는 "무언가 있다"는 것을 알리고, research_list는 요청할 때 보여줍니다

따라서 "지금 캡처하고, 나중에 결정"이 작동합니다: 대화 중간에 트레이에 넣은 것은 다음 대화 시작 시 사용자가 기억하지 않아도 다시 나타납니다.

툴

31개의 MCP 툴.

읽기

  • get_landscape — 섹션의 모든 것 (shared가 병합됨): 모든 엔터티와 관찰, 도래한 알림, 분류되지 않은 트레이 항목, 열린 선반 아이디어 개수. 대화 시작 시 호출하여 방향을 잡으세요.

  • search — 엔터티, 관찰, 기록에 걸친 키워드 검색.

  • get_entity — 이름으로 하나의 엔터티와 그 관찰.

  • get_observation — ID로 직접 최대 20개의 관찰을 가져옵니다. ID는 안정적이며 재사용되지 않으므로, 특정 사실을 한 대화에서 다음 대화로 전달하는 저렴한 방법입니다.

  • get_history — 기록된 이벤트의 타임라인.

  • get_time — 현재 시간과 이 토큰의 마지막 호출 이후 경과 시간.

쓰기

  • upsert_entity — 엔터티의 이름/요약을 생성하거나 업데이트.

  • add_observation — 엔터티에 사실을 첨부.

  • update_observation — 사실을 제자리에서 편집; ID는 안정적. 보호된 행에도 작동.

  • remove_observation — 오래되었거나 완료된 사실을 삭제 (보호된 경우 거부).

  • protect_observation / unprotect_observation — 사실을 삭제 불가능으로 표시하거나 해제.

  • remove_entity — 엔터티와 그 관찰을 삭제 (보호된 것이 있으면 거부).

  • log_event — 주목할 만한 이벤트를 기록에 저장.

알림

  • create_reminder — trigger_date와 선택적 trigger_time, 선택적 엔터티 링크가 있는 메모.

  • list_reminders — 예정된 모든 것, 도래 여부와 관계없이.

  • list_due_reminders — 지금 당장 도래한 모든 것. 알리미가 폴링하는 대상입니다.

  • mark_reminder_fired — 시간 지정 알림이 전달된 것으로 표시하여 두 번 발사되지 않도록 함.

  • dismiss_reminder — 알림이 처리된 것으로 표시 (더 이상 표시되지 않음).

  • remove_reminder — 알림을 완전히 삭제.

트레이

  • pending_add — 도착한 것을 캡처.

  • pending_list — 아직 분류가 필요한 것, 가장 오래된 것부터.

  • pending_promote — 캡처를 엔터티의 관찰로 전환.

  • pending_merge — 중복을 유지할 것에 접어 넣음.

  • pending_dismiss — 필요 없다고 결정, 이유는 보관.

  • pending_reopen — 위의 어떤 것이든 되돌림.

선반

  • research_add — 아이디어를 보관.

  • research_list — 열린 아이디어, 가장 오래된 것부터.

  • research_promote — 아이디어를 트레이로 승격.

  • research_kill — 의도적으로 아이디어를 폐기, 이유 포함.

  • research_reopen — 다시 되돌림.

모든 툴 응답에는 작은 시간 푸터가 포함됩니다 — 설정된 시간대의 현재 서버 시간과 해당 토큰의 마지막 호출 이후 경과 시간 — 따라서 모델이 추측하거나 오래된 정신적 시계로 날짜 계산을 할 필요가 없습니다.

알림 받기

Atlas는 자체적으로 아무것도 푸시하지 않습니다 — 사용자가 어디로 연락받길 원하는지 알 수 없기 때문입니다. 대신, list_due_reminders가 알림을 처리하는 모든 것에 대한 계약입니다:

  1. 적절한 간격으로 list_due_reminders를 폴링합니다.

  2. trigger_time이 있는 행을 전달합니다 (수동 알림은 랜드스케이프에서 보이는 것만으로 충분합니다).

  3. 전달한 각각에 대해 mark_reminder_fired를 호출합니다.

3단계가 정확히 한 번 전달을 보장합니다: 스탬프가 SQL에서 보호되므로, 두 개의 겹치는 폴러가 이중 전송할 수 없습니다. 크론 구동 스크립트 12줄이면 이메일, 채팅 웹훅, 또는 전화 알림에 연결할 수 있습니다.

정리 워커

src/groom.js는 서버 프로세스 내에서 야간에 실행됩니다 (호스트 크론 필요 없음), 또는 npm run groom으로 수동 실행할 수 있습니다. 의도적으로 보고 전용이고 기계적입니다 — LLM 호출이나 데이터 삭제 없음:

  • 엔터티 내에서 유사한 중복 관찰을 플래그

  • 60일 이상 건드리지 않은 휴면 엔터티를 보관/압축 후보로 플래그

  • 오래 해제된 알림 (90일 이상)을 제거 후보로 플래그

  • 자체 audit_log (90일 이상)를 회전 — 실제로 삭제하는 유일한 것

  • 마지막 실행 이후 건드리지 않은 엔터티는 건너뛰므로 반복 실행이 저렴함

결과는 섹션별 "정리 보고서" 엔터티에 저장되어 사용자(또는 Claude)가 조치를 취할 수 있습니다. ATLAS_GROOM_HOUR (기본값 4시)에 시간대에 맞춰 실행되며, 자가 치유됩니다: 컨테이너가 다운되어 놓친 창은 다음 확인 시 실행됩니다.

Claude 연결하기

Atlas는 스트림 가능한 HTTP를 통해 MCP를 사용하며, POST /atlas-mcp에서 수신합니다. 서버의 URL과 토큰을 사용하여 커넥터로 추가하세요:

https://<your-host>/atlas-mcp?token=<your-secret>

토큰은 ATLAS_TOKEN 삼중 값의 비밀 부분입니다 (설정 참조). 쿼리 문자열 대신 X-Atlas-Token 헤더 또는 Bearer 토큰으로 전달할 수도 있습니다.

URL에 section은 없습니다 — 모든 툴은 section 인수를 받으며, 특정 대화가 기본값으로 사용할 섹션은 Claude 프로젝트의 사용자 지정 명령어에 설정하는 것이 가장 좋습니다 (예: "당신의 Atlas 섹션은 personal입니다"). GET /health 엔드포인트는 활성 상태 확인용으로 제공됩니다.

실제 사용 시에는 HTTPS 뒤에 두는 것이 좋습니다 — 컨테이너 앞에 리버스 프록시 또는 터널(Cloudflare Tunnel, Tailscale, nginx 등)을 두세요. 토큰이 유일한 인증이므로, TLS 없이 포트를 공개적으로 노출하지 마십시오.

연결되면, Claude가 각 대화 시작 시 get_landscape를 호출하고 항목이 변경될 때 업데이트를 유지하는 것이 좋은 습관입니다. 서버는 정확히 그렇게 하라는 지침을 제공하므로, 대부분의 클라이언트는 사용자가 직접 작성하지 않아도 이를 받아들입니다.

보안 유지

Atlas의 내장 인증은 공유 토큰입니다 — 사설 네트워크나 터널 뒤에서는 괜찮지만, 인터넷에 노출하는 경우에는 얇습니다. 실제 접근 제어를 위해서는 이 서버 자체를 강화하는 대신 전용 인증 게이트웨이를 앞에 두세요.

mcp-auth-proxy는 MCP 서버를 위한 드롭인 OAuth 2.1 / OIDC 게이트웨이로, Atlas에 코드 변경이 필요하지 않습니다:

  • 자체 IdP(Google, GitHub, Okta, Auth0, Azure AD, Keycloac, 모든 OIDC 제공자)에 대해 인증하며, 선택적 비밀번호를 사용할 수 있습니다.

  • 정확히 일치하거나 glob(*@yourcompany.com 등) 방식으로 사용자 인가를 수행합니다.

  • TLS를 종료하고 HTTP 전송을 그대로 프록시하며, Claude, Claude Code, ChatGPT, Copilot, Cursor에서 검증되었습니다.

대략적으로 Atlas의 HTTP 엔드포인트를 가리키면 됩니다:

./mcp-auth-proxy \
  --external-url https://<your-domain> \
  --tls-accept-tos \
  -- http://localhost:7784/atlas-mcp

IdP 설정 및 구성에 대한 자세한 내용은 문서를 참조하세요. (제휴 관계는 아닙니다. — 자체 호스팅 MCP 서버에 적합한 도구입니다.)

구성

모두 선택 사항입니다. .env(.env.example 참조) 또는 환경 변수를 통해 설정합니다:

변수

목적

ATLAS_TOKEN

하나 이상의 caller:secret:scope 쌍을 쉼표로 구분한 값입니다. Scope는 필수입니다 — work(work+shared에 접근), personal(personal+shared에 접근), shared(shared만 접근). 모든 호출 시 서버 측에서 강제 적용되며, 범위를 벗어난 요청은 403을 반환하고 로그에 기록됩니다. 설정되지 않은 경우, Atlas가 각 scope에 대해 토큰을 첫 시작 시 생성하여 데이터 디렉토리의 first-run-tokens.txt에 저장합니다.

ATLAS_TZ

알림, 시간 하단 및 그룸(groom) 창에 사용할 IANA 시간대(예: America/Chicago, Europe/Berlin). 기본값은 호스트 TZ, 그 다음 UTC입니다.

ATLAS_GROOM_HOUR

야간 그룸이 시작될 수 있는 현지 시간의 시(0–23, 기본값 4).

PORT

수신 포트(기본값 7784).

ATLAS_DB_PATH

SQLite 파일 경로(src/ 기준 기본값 ../data/atlas.db; Docker 이미지는 /app/data/atlas.db 사용).

나만의 것으로 만들기

의도적으로 작게 설계되어 있어, 싸우지 않고 확장할 수 있습니다.

  • 도구 추가. 모든 것은 src/tools.js에 있으며, 하나의 guarded() 래퍼를 통해 등록됩니다. 이 래퍼는 scope 검사와 감사 로그 기록을 수행합니다. 새 도구는 guarded(name, {description, inputSchema}, handler) 블록과 src/db.js의 함수로 구성됩니다. 설명은 코드보다 더 중요합니다 — Claude가 이를 읽고 도구를 언제 사용할지 결정하기 때문입니다.

  • 테이블 추가. 마이그레이션은 src/db.js의 PRAGMA user_version 사다리입니다: 번호를 올리고, 그에 의해 보호되는 추가 SQL을 작성하면 끝입니다. 모든 마이그레이션은 멱등적이며 부팅 시 실행되므로, 업그레이드는 단순히 재시작하면 됩니다.

  • 데이터베이스에 규칙 푸시. 여기서의 스타일은 기억해야 하는 규칙은 위반되는 규칙이라는 것입니다. 따라서 resolved_at은 트리거에 의해 기록되며, scope는 서버 측에서 강제 적용되고, 보호된 행은 SQL에서 보호됩니다. 이 패턴을 따르면 추가된 기능도 이를 상속받습니다.

  • 섹션 변경. work/personal/shared는 스키마의 CHECK 제약 조건과 src/server.js의 scope 맵에 고정되어 있습니다. 이름을 바꾸는 것은 마이그레이션과 두 줄의 맵 수정으로 가능합니다 — 용어가 본인의 삶에 맞지 않다면 해볼 만한 가치가 있습니다.

테스트

npm test

모든 실행은 빈 데이터베이스에서 시작하므로, 테스트 스위트는 빈 슬레이트 검사 역할도 합니다: 스키마가 처음부터 빌드되고, 토큰 scope 매트릭스가 유지되며(범위 밖의 ID는 존재하지 않는 ID와 구분할 수 없음), 시간 기반 알림이 정확히 한 번만 실행되고, 깔때기가 항목을 주장하는 대로 이동시킵니다.

보안

위협 모델, 배포 강화 노트 및 취약점 신고 방법은 SECURITY.md를 참조하세요.

변경사항

CHANGELOG.md를 참조하세요. 간단히 말하면: v3에서 트레이, 선반, 시간 기반 알림, 관찰 ID 주소 지정, 제로 구성 시작이 추가되었습니다.

라이선스

MIT — LICENSE를 참조하세요.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers