[오픈 소스] TS 컴파일러 그래프 MCP: Fable에서 토큰 5배 절감, CodeGraphs가 MCP 없이 더 많은 비용을 발생시킨 이유를
요약
TypeScript 컴파일러 그래프를 활용한 새로운 MCP를 통해 에이전트의 토큰 소모량을 80% 절감하는 방법을 소개합니다. 기존 MCP들이 소스 본문을 과도하게 반환하거나 에이전트의 접근성을 떨어뜨리는 문제를 해결하기 위해, 컴파일러 기반의 인덱싱과 효율적인 도구 설계 방식을 제안합니다.
핵심 포인트
- 기존 MCP들은 전체 소스 본문을 반환하여 토큰 소모를 급증시킴
- TypeScript 컴파일러를 직접 사용하여 경로 별칭 및 모노레포를 정확히 해결
- 소스 본문 대신 이름, 엣지, 시그니처 위주로 인덱싱하여 토큰 사용량 일정 유지
- 에이전트가 도구를 자연스럽게 채택할 수 있도록 설계된 인터페이스 제공
Fable 5가 어제 출시되어, 저는 이 버전으로 코드 그래프 MCP(code-graph MCP) 벤치마크를 다시 실행했습니다.
제가 알고 싶었던 질문은 다음과 같습니다: code-graph MCP들(serena, codegraph, codebase-memory)이 '주요 런타임 흐름은 무엇이며, 무엇을 먼저 읽어야 할까요?'와 같은 개방형 질문에서 실제로 토큰을 절약해주는가?
결과는 그렇지 않다는 것이었습니다. 위의 차트들이 그 결과를 보여줍니다: 다른 그래프 MCP들은 no-MCP 기준선보다 더 많은 토큰을 소모했고, 반면 제 것(@ttsc/graph)은 약 80%를 절감했습니다. 전체 8개 레포지토리 매트릭스는 벤치마크 페이지에서 확인할 수 있습니다.
상세 기사: https://ttsc.dev/articles/i-made-ts-compiler-graph-mcp.html
벤치마크 결과: https://ttsc.dev/docs/benchmark/graph
GitHub 레포지토리: https://github.com/samchon/ttsc/tree/master/packages/graph
기존 방식들이 실패하는 이유
- codegraph: 전체 소스 본문(source bodies)을 반환합니다. 자체 문서에 따르면 출력은 'Read 도구가 반환하는 것과 바이트 단위로 동일'하다고 되어 있어 편집에는 문제가 없지만, 광범위한 질문에서는 토큰 폭탄이 됩니다.
- codebase-memory: 실제로 좋은 관계 그래프를 내부에 가지고 있습니다. 문제는 이 기능이 Cypher 쿼리나 정확하게 한정된 이름(qualified names)을 요구하는 14개의 도구 뒤에 숨겨져 있어, 에이전트가 접근하지 못하고 단순히 검색(grepped)만 했다는 것입니다.
- serena: 약 50개 도구에 걸쳐 분산되어 있으며, 지침에는 심지어 에이전트 자체의 코드 파일 Read 및 Edit 사용을 금지하는 내용까지 있습니다. 하지만 에이전트는 여전히 검색(grepped)만 했습니다. 중앙값은 셸(shell)로 폴백하기 전에 MCP 호출을 0~1회에 그쳤습니다.
성공할 수 있는 방법
당신은 자신만의 방식으로 채택률을 이끌어낼 수 없습니다.
제가 다르게 한 방식
- 소스 본문(source bodies)만 인덱싱하고, 절대로 전체 소스 본문을 사용하지 않았습니다. 이름, 엣지, 시그니처, 파일:라인 범위만을 사용했습니다. 응답이 코드가 아닌 엣지로 구성되므로 레포지토리 크기에 따라 증가하지 않고 토큰 수가 일정하게 유지됩니다.
- 트리-시터(tree-sitter)가 아닌 실제 TypeScript 컴파일러를 사용합니다. 경로 별칭(paths aliases), 모노레포(monorepos), 리-익스포트 체인(re-export chains)이 별도의 인덱싱 단계 없이 정확하게 해결됩니다. 또한 결과가 컴파일러에서 발행되므로, 에이전트는 재확인을 위해 파일을 다시 읽기(re-reading files)하는 대신 이를 신뢰하고 멈춥니다.
- 강요하지 말고 안내하세요. 다른 방식들은
제 것은 단지 언제 도움이 되는지를 명시하고, 그 외의 모든 상황에 대해서는 일급 시민(first-class) 수준의 탈출구를 제공할 뿐입니다. 에이전트가 실제로 준수하게 만드는 것은 도구(tool) 자체의 형태입니다:
export namespace ITtscGraphApplication { // 강제된 사고의 사슬(chain-of-thought), 그 다음 정확히 하나의 그래프 요청. export interface IProps { question: string; // 질문되고 있는 코드 질문을 재진술함 draft: IDraft; // 계획 중인 요청 유형과 그것이 왜 가장 작은 단위인지에 대한 이유 review: string; // 잘못되었거나 광범위한 초안을 스스로 수정함; 그래프 범위를 벗어난 요청인 경우 탈출구(escape) 선택: // 검토 후 선택된 최종 작업 | ITtscGraphEntrypoints.IRequest // orientation: 읽기를 시작할 위치 | ITtscGraphLookup.IRequest // 이름으로 심볼 찾기 | ITtscGraphTrace.IRequest // 호출 / 데이터 흐름 추적 | ITtscGraphDetails.IRequest // 심볼의 시그니처, 멤버, 이웃 | ITtscGraphOverview.IRequest // 리포지토리 수준의 개요 | ITtscGraphTour.IRequest // 한 번의 호출로 답변되는 광범위한 코드 투어 | ITtscGraphEscape.IRequest; // 그래프 질문이 아님 -> 중단 }
// 초안 계획: 요청 유형과 그것이 왜 가장 작은 단위로 보이는지에 대한 이유. export interface IDraft { reason: string; // 왜 이 요청 유형이 가장 작은 단위로 보이는지 answer: IProps["request"]["type"]; // 고려 중인 요청 유형 } } ```
지시 사항은 무시될 수 있지만, 필수 필드는 건너뛸 수 없습니다. 당신은 심볼 이름이나 쿼리 구문 없이 평이한 영어로 질문하며, question → draft → review → request를 채우는 것은 에이전트의 역할입니다.
설정 (Setup)
bash npm install -D ttsc @ttsc/graph typescript@rc
json { "mcpServers": { "ttsc-graph": { "command": "npx", "args": ["-y", "@ttsc/graph"] } } }
솔직히 한계점은 다음과 같습니다: TypeScript만 지원하며, typescript@rc (v7)가 필요합니다. 그리고 80%라는 수치는 제 개인 리포지토리에서 직접 수행한 벤치마크 결과입니다. 만약 귀하의 코드베이스에서 절감 효과가 그보다 적다면, 그것은 버그 리포트 대상이며 저는 그 보고를 원합니다.
submitted by /u/jhnam88
[link] [comments]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/ClaudeAI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기