BETAER_
← Work
2026
RustMCPStatic Analysistree-sitterSQLiteDeveloper Tools

Corbel

AI 코딩 에이전트에게 검증 가능한 호출 그래프를 제공하는 Rust 정적 분석 MCP 서버. 1.0.0에서 공개 계약을 동결하고 유지보수 모드로 전환했다.

Corbel 썸네일

개요

Corbel은 AI 코딩 에이전트에게 코드베이스의 정확한 호출 그래프(call graph)를 제공하는 Rust 기반 정적 분석 MCP(Model Context Protocol) 서버다. 에이전트가 코드를 이해하는 기본 수단인 텍스트 검색은 어떤 함수가 실제로 무엇을 호출하는지 판단하지 못한다. Corbel은 tree-sitter로 구문을 파싱해 호출 관계를 인덱싱하고, 그 결과를 MCP 도구로 노출한다.

포지셔닝은 명확하다. 다른 도구는 더 많이 답한다. Corbel은 답한 것을 증명하고, 답할 수 없는 것을 밝힌다.

1.0.0에서 공개 계약을 동결했다. 새 기능, 새 언어, 성능·정확도 개선은 범위 밖이며, 빌드가 깨지는 의존성 변경·보안 권고·기존 기능의 오작동에만 최선 노력으로 대응한다.

MCP 도구

  • get_symbol — 심볼의 정의 위치, 호출자(callers), 피호출자(callees), 그리고 그 관계를 어떤 방식으로 해석했는지(resolution method)를 함께 반환한다.
  • impact — 역방향 호출 그래프를 BFS로 탐색해 변경의 영향 범위를 계산한다. 선택적 depth 파라미터로 탐색 깊이를 제한할 수 있으며, 미지정 시 기존 동작을 유지한다. 토큰 예산(token budget) 내에서 결과를 제한한다.
  • find — 심볼을 검색한다. 결과가 예산을 초과하면 분할해 반환한다.

corbel audit

corbel audit은 에이전트가 영향 범위를 확인하지 않고 코드를 고친 지점을 찾아낸다.

corbel serve --audit 상태에서 모든 MCP 쿼리를 .corbel/audit.jsonl에 기록한다. 기록 대상은 심볼명과 파일 경로뿐이며, 소스 코드는 저장하지 않고 외부로 전송하지도 않는다. 이후 git diff HEAD로 얻은 변경 심볼 집합과 질의 기록을 대조해 커버리지를 세 가지로 구분한다.

  • 미감사(unauditable): 에이전트가 Corbel을 전혀 호출하지 않았다.
  • 실질 위험(genuine risk): Corbel은 호출했지만 변경한 심볼에 대해 impact()를 부르지 않았다.
  • 부분 커버리지(partial coverage): impact()는 불렀지만 영향받는 심볼을 확인하지 않았다.

find 질의는 커버리지로 인정하지 않는다. 이름을 훑는 것은 관계를 이해한 것이 아니다.

벤치마크

평가는 서드파티 저장소 세 곳(itsdangerous, hyperfine, chevrotain)에서 수작업 검증한 120개 골든셋으로 수행했다. 적대적 케이스를 포함한다. 골든셋을 Corbel 자체 출력으로 만들지 않은 이유는, 그렇게 만든 정답은 정답이 아니기 때문이다.

심볼 소유자(owner) 처리 수정 후 F1은 0.395에서 0.707로 올랐다. 같은 셋에서 ripgrep + ctags 하이브리드는 0.713을 기록했다. 아직 지고 있다.

servo(심볼 116K) 스케일 테스트에서는 초선형(superlinear) 스케일링이 확인됐다. 원인은 심볼 수가 아니라 이름 충돌이 발생한 호출부의 수였다.

기술 스택과 배포

  • 언어·런타임: Rust
  • 파싱: tree-sitter
  • 인덱스: SQLite
  • 해싱: xxh3
  • 지원 언어: Rust, Python, TypeScript, TSX, JavaScript
  • 배포: crates.io, cargo-dist(5개 타겟), Docker(musl 정적 링크 scratch 이미지 11.4MB), Glama MCP 디렉터리 등록
  • 버전: 1.0.0 (유지보수 모드)
  • crates.io: https://crates.io/crates/corbel

amdb에서 Corbel로

Corbel은 amdb의 후속이다. amdb는 1.0.0에서 공개 계약을 동결하고 마무리했다. 기능이 여러 방향으로 흩어지면서 한 문장으로 설명하기 어려워졌고, 그 위에서 범위를 좁혀 다시 시작한 것이 Corbel이다. Corbel은 정확한 호출 그래프 하나만 한다. 범위를 좁힌 것이 아니라, 증명할 수 있는 범위만 남긴 것이다.