LAIN: 코딩 에이전트용 메모리 코드 그래프와 MCP 도구

Published · AI Daily — AI-assisted deep research, methodology & disclosure

LAIN-mcp는 spuentesp가 공개한 MIT 라이선스 오픈소스입니다. README에 따르면 Tree-sitter, 언어 서버, Git 이력으로 메모리 상의 구조적 속성 그래프를 만들고, MCP를 통해 코딩 에이전트에 영향 범위, 호출 체인, 공동 변경 분석, 다중 에이전트 파일 클레임과 브라우저 대시보드를 제공합니다. 모두 README의 설명이며 직접 실행해 검증하지는 않았습니다.

LAIN이란 무엇인가: README의 자기소개

LAIN-mcp는 spuentesp가 GitHub에 공개한 오픈소스 프로젝트이며 라이선스는 MIT입니다. README는 이를 "AI 코딩 에이전트를 위해 특별히 만든, 지속적이고 고성능인 코드 인텔리전스 및 조율 엔진"이라고 설명합니다. 에이전트와는 Model Context Protocol(MCP)로 통신합니다. README가 예로 드는 클라이언트는 Claude Code, Cursor, Copilot, Codex, Agy, Cline, Windsurf입니다.

발상은 단순합니다. 많은 코딩 에이전트는 코드를 평평한 텍스트로 취급하고 키워드로 검색합니다. LAIN은 그 대신 코드베이스를 메모리에 올린, 타입이 있는 구조적 속성 그래프로 색인합니다. 재료는 Tree-sitter, 언어 서버, Git 커밋 이력입니다. 그리고 결정론적인 MCP 도구 모음을 제공해서 에이전트가 구조에 관한 질문을 던지고 정확한 답을 얻게 합니다. README는 이렇게 하면 에이전트가 복잡한 코드베이스에서 "환각, 맹목적 수정, 컨텍스트 창 낭비 없이" 작업할 수 있다고 말합니다. 이것은 프로젝트 측의 주장이며, 이 글에서는 검증하지 않았습니다.

작동 방식: README가 설명하는 다섯 단계

첫째는 색인과 파싱입니다. LAIN은 Tree-sitter와 언어 서버로 코드를 훑어 함수, 클래스, 임포트, 참조를 속성 그래프로 추출합니다. 둘째는 영속 그래프 저장소입니다. 그래프는 `.lain/graph.bin`으로 직렬화되고, 식별자는 UUID v5로 결정론적으로 만들어지므로 빠르게 다시 불러올 수 있습니다. 셋째는 시간축 마이닝입니다. LAIN은 git 커밋 로그를 분석해 "공동 변경 결합 레이더"를 만들고, 명시적 임포트가 없어도 함께 진화하는 모듈을 찾아냅니다. 넷째는 권고형 프레즌스입니다. 메모리와 디스크의 등록부가 에이전트 세션과 파일 클레임을 추적해 실시간으로 겹치는 수정을 막습니다. 다섯째는 범용 MCP 제공으로, 도구는 stdio 또는 HTTP로 제공됩니다.

아키텍처 다이어그램에는 더 자세한 내용이 있습니다. 전송 방식은 두 가지로, 단일 저장소용 stdio와 9999 포트에서 JSON-RPC 및 SSE를 쓰는 HTTP입니다. 그 뒤에는 통합 도구 디스패처, Petgraph 기반의 메모리 그래프 엔진, "권고형 임대와 잠금"으로 설명되는 프레즌스 및 클레임 등록부, 그리고 N개 저장소를 다루는 연합(federation) 엔진으로 이루어진 코어가 있습니다.

도구 구성: 여섯 가지 계열

README는 MCP 도구를 여섯 계열로 나눕니다.

  • **영향 범위와 의존성 추적:** `get_blast_radius`, `get_call_chain`, `trace_dependency`, `get_coupling_radar`. 심볼을 바꿨을 때의 하류 영향, 두 함수 사이의 최단 경로, 상류 의존성, 자주 함께 바뀌는 파일을 알려 줍니다.
  • **아키텍처 탐색:** `find_anchors`, `list_entry_points`, `get_context_depth`, `explore_architecture`. 가장 많이 호출되고 가장 안정적인 심볼, `main()`, HTTP 라우트, 이벤트 핸들러 같은 진입점, 계층적 모듈 트리를 다룹니다.
  • **다중 에이전트 조율("Multiplayer Mode"):** `register_agent`, `heartbeat`, `claim_files`, `release_files`, `detect_overlap`, `list_active_agents`, `who_am_i`.
  • **검색과 심층 질의:** `semantic_search`, `query_graph`, `explain_symbol`. `query_graph`는 `find`, `connect`, `filter`, `semantic_filter`, `sort`, `limit` 연산을 조합하는 JSON 파이프라인입니다.
  • **다중 저장소 연합:** `list_repos`, `get_repo_info`, `get_federation_health`, `get_cross_repo_blast_radius`, `get_cross_repo_blast_radius_for_repo`, `search_org`.
  • **코드 건강도:** `find_dead_code`, `suggest_refactor_targets`, `get_agent_strategy`, `get_world_state`.

`semantic_search`에는 선택 사항인 ONNX 임베딩 모델이 필요합니다. README는 BAAI/bge-small-en-v1.5(384차원, 약 120MB)를 권장하며, 환경 변수 `LAIN_EMBEDDING_MODEL`로 위치를 지정합니다. 모델이 없으면 이 도구는 `tools/list`에서 자동으로 제외되어, 에이전트가 쓸 수 없는 도구를 보지 않게 됩니다. 그래프, 영향 범위, 탐색, 조율 도구는 모델 없이도 작동한다고 README는 밝힙니다.

설치와 연결

README는 한 줄짜리 설치 명령을 제시합니다. `curl -fsSL https://raw.githubusercontent.com/spuentesp/lain/main/install.sh | bash`를 실행한 뒤 `lain --version`으로 확인합니다. Homebrew와 수동 빌드는 QUICKSTART를 참고하라고 안내합니다. 빌드에는 Rust 1.75 이상이 필요하고, 공동 변경 분석에는 Git이 필요합니다.

에이전트 연결은 짧은 단계입니다. Claude Code는 `claude mcp add lain -- lain mcp`를 씁니다. Cursor와 Windsurf는 `lain setup --agent cursor`가 `~/.cursor/mcp.json`을 작성합니다. 같은 `setup` 명령은 VS Code, Codex, Continue, 범용 `.mcp.json`도 지원합니다. 여러 저장소가 공유하는 서비스로 돌리려면 `lain server --config ./repos.yaml --transport http --port 9999`를 실행합니다.

커맨드 센터, CLI, 핫 리로드

HTTP 모드에서 서버는 `GET /`에서 Command Center라는 브라우저 대시보드를 제공합니다. 탭은 다섯 개입니다. Overview(노드와 엣지 통계, 메모리 사용량, 연합 상태), Graph(D3 힘 기반 배치 보기), Repos, Query, Tools입니다. Tools 탭에서는 양식으로 어떤 MCP 도구든 실행할 수 있고, "Copy as cURL" 스니펫도 만들어 줍니다.

CLI 명령은 많습니다. `lain mcp`는 단일 저장소 stdio 서버이고, `lain server`는 다중 저장소 서버입니다. `lain doctor`는 파일을 바꾸지 않고 저장소를 진단하며, 종료 코드는 0이 준비 완료, 1이 사용 가능하나 성능 저하, 2가 사용 불가입니다. `lain hooks`는 파일 클레임과 겹침 검사를 위한 편집 전 훅을 제공합니다. `lain schema`는 도구 스키마를 내보내어 CI에서 스키마 변경을 잡아낼 수 있게 합니다. `scripts/demo.sh`는 호출 그래프가 구성상 알려진 합성 저장소로 서버의 답을 대조한 뒤, 이 저장소(약 3.5k 노드)에서 벤치마크를 돌립니다. README에는 벤치마크 수치가 없습니다.

핫 리로드는 운영 면에서 눈여겨볼 기능입니다. 서버는 `repos.yaml`과 `workspaces.yaml`을 감시하며, 재시작 없이 그리고 활성 에이전트 세션을 끊지 않고 상태를 갱신합니다. CLI 명령은 로컬 Unix 소켓으로 실행 중인 서버와 통신합니다.

우리의 분석

이 설계는 텍스트만 다루는 에이전트의 현실적인 약점을 겨냥합니다. 키워드가 일치한다고 해서 누가 그 함수를 호출하는지, 바꾸면 무엇이 깨지는지는 알기 어렵습니다. 호출 체인과 영향 범위를 가진 미리 만들어진 그래프는 에이전트가 수정 전에 확인하는 더 값싸고 정확한 방법이 됩니다. 공동 변경 레이더는 유용한 두 번째 신호입니다. Git 이력은 정적 임포트가 놓치는 결합을 드러내기 때문입니다.

다중 에이전트 부분은 더 드문 발상입니다. 클레임, 하트비트, 겹침 감지는 한 작업 공간의 여러 에이전트를 조율 문제로 다룹니다. README는 잠금을 조심스럽게 "권고형"이라고 부르며, 우리는 이를 문자 그대로 읽습니다. 모든 에이전트가 규약을 따를 때 효과가 있고, 규칙을 어기는 에이전트를 강제로 멈추게 하지는 않는 것으로 보입니다.

공급망 배지도 짚어 둘 만합니다. README에는 OpenSSF Scorecard, OpenSSF Best Practices, CycloneDX SBOM, SLSA L2 빌드 출처 증명, 그리고 "Passes with Notes"로 표시된 SafeSkill 88/100 점수가 나와 있습니다. 이는 보안 검토의 단서이지 안전의 증명은 아닙니다.

한계와 남는 질문

여기에 적은 내용은 모두 README에서 나왔습니다. LAIN을 설치하거나 실행하지 않았습니다. "밀리초 단위 응답", 환각이 없다는 점, 수치가 제시되지 않은 약 3.5k 노드 벤치마크는 모두 우리가 검증하지 않았습니다. README는 어떤 언어에서 완전한 그래프를 얻는지 설명하지 않으며, 언어 서버의 예로 `rust-analyzer`와 `pylsp`를 들 뿐입니다. 메모리 기반 설계가 얼마나 큰 저장소를 담을 수 있는지도 밝히지 않습니다. 다만 문제 해결 안내에는 한계의 단서가 있습니다. 콜드 캐시 상태의 큰 작업 트리에서는 색인이 시간 초과될 수 있고, 이때는 `LAIN_REINDEX_TIMEOUT`을 기본값인 전체 300초, 저장소당 60초보다 늘리라고 합니다. 또 오래 실행되는 stdio 프로세스는 다시 빌드한 뒤 클라이언트를 재시작하기 전까지 오래된 답을 줄 수 있다고 경고합니다.

독자를 위한 실용적인 정리

MCP를 지원하는 에이전트를 쓰는 개발자는 단일 저장소 경로부터 시도해 볼 수 있습니다. 설치하고, `lain doctor`를 실행한 뒤, 자신의 클라이언트용 명령으로 서버를 추가하면 됩니다. 저장소가 여럿인 팀은 연합 도구와 HTTP 모드를 살펴볼 만합니다. 여러 에이전트를 동시에 돌리는 팀은 클레임에 의존하기 전에 `docs/multiplayer.md`와 `docs/hooks.md`를 읽어야 합니다. 보안에 민감한 독자는 설치 스크립트를 셸로 파이프하기 전에 내용을 읽고, `docs/VERIFICATION.md`의 출처 증명 설명을 확인하세요. `scripts/demo.sh`와 자신의 작업으로 직접 돌려 보기 전까지는 정확도에 관한 주장을 가설로 다루는 편이 안전합니다.

Sources

FAQ

LAIN이란 무엇인가요?

LAIN-mcp는 AI 코딩 에이전트를 위한 코드 인텔리전스 및 조율 엔진으로, 도구를 MCP로 제공합니다. README에 따르면 Tree-sitter, 언어 서버, Git 이력으로 메모리 상의 구조적 속성 그래프를 만듭니다.

ONNX 모델 없이도 쓸 수 있나요?

네. README에 따르면 ONNX 임베딩 모델이 필요한 것은 semantic_search뿐입니다. 모델이 없으면 이 도구는 tools/list에서 제외되고, 그래프, 영향 범위, 탐색, 조율 도구는 계속 작동합니다.

여러 에이전트가 동시에 편집하면 어떻게 되나요?

claim_files, release_files, detect_overlap 같은 도구와 프레즌스 등록부가 있고, 권고형 임대와 잠금으로 겹치는 수정을 막습니다. README가 권고형이라고 밝혔으므로 각 에이전트가 규약을 따른다는 전제가 필요합니다.