type-atlas
Type Atlas는 코드 인텔리전스를 위한 MCP 서버입니다. Volar 언어 서버는 각 파일을 소유한 TypeScript 프로젝트를 기준으로 응답하므로, 정의, 참조, 타입, 진단, 범위가 편집기에 표시되는 내용과 일치합니다.
응답은 화면이 아닌 컨텍스트 창을 위해 작성됩니다. 파일 개요는 파일 안의 선언들이지 모든 중첩 콜백이 아닙니다. 읽기는 본문을 시그니처로 접습니다. inspect_symbol은 언어 서버 요청 여덟 개를 하나의 답변으로 구성합니다. 모든 답변은 자신이 다룬 범위와 그 비용을 명시합니다.
저는 에이전트가 거의 전적으로 유지 관리하는 대형 monorepo에서 매일 이것을 사용합니다.
TypeScript, Markdown, JSON. Node 22.20 이상. Apache-2.0.
설치
codex mcp add type-atlas -- npx --yes @type-atlas/mcp@latest
claude mcp add --scope user type-atlas -- npx --yes @type-atlas/mcp@latest
code --add-mcp '{"name":"type-atlas","command":"npx","args":["--yes","@type-atlas/mcp@latest"]}'다른 모든 클라이언트는 표준 형태를 사용합니다:
{
"mcpServers": {
"type-atlas": {
"command": "npx",
"args": ["--yes", "@type-atlas/mcp@latest"]
}
}
}셸 PATH 없이 서버를 시작하는 클라이언트는 npx를 이름으로 찾지 못합니다. 그런 경우 which npx에서 얻은 절대 경로를 지정하세요. Windows에서 npx.cmd 셰임을 실행할 수 없는 클라이언트는 "args": ["/c", "npx", "--yes", "@type-atlas/mcp@latest"]와 함께 "command": "cmd"가 필요합니다.
클라이언트는 시작 시 MCP 구성을 읽으므로, 이후 다시 시작하세요. @latest는 프로세스가 시작될 때마다 확인됩니다. 도구 동작이 바뀌는 것을 원하지 않으면 버전을 고정하세요.
search_code, related_code, investigate_code, search_dependency_code는 uvx를 통해 시맨틱 인덱스를 실행하며 uv가 필요합니다. uv가 없으면 이 네 가지는 uv가 없다고 보고하고, explore_symbol은 관련 코드 섹션을 생략하며, 나머지는 영향을 받지 않습니다.
권장 사항
서버를 설치해도 에이전트가 사용하려는 도구는 바뀌지 않습니다. 그중 Claude를 포함한 일부 에이전트는 셸이 허용하는 무엇이든 이어 붙여 조합하고, 매번 새로운 정당성을 만들어 내므로, 피해야 할 명령 몇 개를 지정하는 것은 효과가 없습니다. 지시는 그 범주 전체를 배제하고 예외를 명시해야 합니다. AGENTS.md 또는 CLAUDE.md에 다음을 추가하세요:
Type Atlas MCP는 TypeScript 및 JavaScript 코드를 읽고 탐색하는 데 필수 도구입니다. 이것은 선호의 문제가 아닙니다. 셸 명령은 무엇으로 구성되어 있든 허용되는 대체 수단이 아니며, 단순한 파일 읽기도 마찬가지입니다. 유효한 대체 수단은 서버가 다운되었거나, 호출이 오류를 냈거나, TS도 JS도 아닌 파일을 다루는 경우뿐입니다.
--require-intent
이 플래그를 사용하면 읽기 전용 호출은 자신이 지원하는 결정을 밝히는 문장 하나를 포함해야 하며, 그 문장은 답변 위에 다시 표시됩니다. 그런 문장이 없는 호출은 실패합니다.
codex mcp add type-atlas -- npx --yes @type-atlas/mcp@latest --require-intent이것은 변경에 필요한 범위를 훨씬 넘어 탐색하면서 나중에 그 이유를 말하지 못하는 에이전트를 위한 것입니다. 기본값은 꺼져 있습니다.
Related MCP server: agent-workspace-mcp
도구 호출 결과
경로는 작업공간 기준이며 좌표는 1부터 시작하므로, 한 답변의 위치는 다음 호출에 유효한 입력이 됩니다. 편집 도구는 패치를 반환하며, 어떤 것도 대신 작성되지 않습니다.
아래의 모든 내용은 시나리오 스위트가 fixtures/ledger를 대상으로 실행 중인 서버에서 캡처한 것입니다. 이 스위트는 동일한 호출을 재생하며, 캡처 내용이 달라지면 실패합니다. 여기에는 직접 작성된 내용이 없으며, 도구의 답변이 바뀌면 이 파일도 같은 커밋에서 바뀝니다. 출처는 README.mdoc입니다. 모든 도구에 대한 더 많은 사례는 docs/tools에 있습니다.
list_files
편집기들이 이미 사용하는 배지 문자를 사용하여 구조, 줄 수, git status를 하나의 트리로 보여줍니다. 삭제된 파일은 git의 답변에만 존재하더라도 행을 가집니다. 접힌 디렉터리는 사라지는 대신 무엇을 담고 있는지 표시합니다.
에이전트 입력
tool: List files
workspace: fixtures/ledger
# working tree arranged: currency.ts edited · rounding.ts created · index.ts deleted
directory: packages/money
depth: 2
# answered in 57ms응답
packages/money/
├ src/ · 3 changed
│ ├ currency.ts · 21 loc · M +2
│ ├ index.ts · D -12
│ ├ money.ts · 58 loc
│ ├ rounding-mode.ts · 15 loc
│ └ rounding.ts · 11 loc · U
├ tests/
│ ├ money.test.ts · 15 loc
│ └ rounding-parity.ts · 15 loc
├ package.json · 19 loc
└ tsconfig.json · 20 locinspect_symbol
호버, 정의, 타입 정의, 구현, 호출자, 호출, 참조를 한 번의 호출로 제공합니다. 참조는 호출자와 정의를 뺀 나머지이므로, 각 사용처는 한 번만 나열됩니다. 이 도구들을 개별적으로 호출하는 것과 비교하면 문자는 4분의 1, 왕복은 7분의 1만 필요합니다.
에이전트 입력
tool: Inspect symbol
workspace: fixtures/ledger
file: packages/accounts/src/journal.ts
symbol: Journal
# answered in 49ms응답
Journal [class] · packages/accounts/src/journal.ts:24:14-24:21 · range 24:1-73:2 · packages/accounts/tsconfig.json
```typescript
class Journal<TMeta = undefined>
```
An append-only journal of balanced entries. `TMeta` carries whatever a
consumer attaches to each entry — an import batch id, an approval trail —
without the journal knowing its shape.
## Callers (4)
packages/accounts/tests/journal.test.ts
├ test("posts a balanced transfer through the overload") callback [function] 5:56-14:2 · calls 6:23-6:30
└ test("refuses an unbalanced entry") callback [function] 16:37-29:2 · calls 17:23-17:30
packages/reports/src/balance.ts
└ balancesAsOf [variable] 23:14-23:26 · range 23:14-51:2 · calls 24:12-24:19
packages/importers/src/csv.ts
└ importStatement [variable] 28:14-28:29 · range 28:14-47:2 · calls 29:12-29:19
## Mentions that are not calls (4 of 9 references · 9 projects loaded)
packages/accounts/tests/journal.test.ts:3:25-3:32: import { credit, debit, Journal, UnbalancedEntryError } from "../src/index.ts";
packages/accounts/src/index.ts:11:22-11:29: export { type Entry, Journal, UnbalancedEntryError } from "./journal.ts";
packages/reports/src/balance.ts:4:8-4:15: type Journal,
packages/importers/src/csv.ts:1:10-1:17: import { Journal, type Entry, credit, debit, type AccountPath } from "@ledger/accounts";
references lists all 9, with paging.read_file
인자는 배열이므로 여러 파일이 한 번의 호출로 전달됩니다. 본문은 기본적으로 시그니처로 접히며, 헤더는 그렇게 절약된 줄 수를 알려줍니다. fold: false는 본문을 반환합니다.
에이전트 입력
tool: Read files
workspace: fixtures/ledger
file: ["packages/accounts/src/posting.ts","packages/money/src/rounding-mode.ts"]
# answered in 7ms응답
2 files · 42 lines · 6 folded to signatures, pass fold: false for the bodies
=== packages/accounts/src/posting.ts · 32 lines ===
1 | import { type Money, negate } from "@ledger/money";
2 | import type { AccountPath } from "./account.ts";
3 |
4 | /**
5 | * One side of a journal entry. The discriminant is the bookkeeping side, so
6 | * every consumer's switch is checked for exhaustiveness by the compiler.
7 | */
8 | export type Posting =
9 | | { readonly side: "debit"; readonly account: AccountPath; readonly amount: Money }
10 | | { readonly side: "credit"; readonly account: AccountPath; readonly amount: Money };
11 |
12 | export const debit = (account: AccountPath, amount: Money): Posting => ({
13 | side: "debit",
14 | account,
15 | amount,
16 | });
17 |
18 | export const credit = (account: AccountPath, amount: Money): Posting => ({
19 | side: "credit",
20 | account,
21 | amount,
22 | });
23 |
24 | /** A posting's effect on a debit-normal running balance. */
25 | export const signedAmount = (posting: Posting): Money => {
| ... 26-31 folded
32 | };
=== packages/money/src/rounding-mode.ts · 15 lines ===
1 | /** How sub-minor precision resolves when a statement and the books disagree. */
2 | export enum RoundingMode {
3 | HalfUp = "half-up",
4 | HalfEven = "half-even",
5 | Truncate = "truncate",
6 | }
7 |
8 | /** Per-institution conventions, as observed in their exports. */
9 | const bankRounding: Readonly<Record<string, RoundingMode>> = {
10 | "first-national": RoundingMode.HalfEven,
11 | "harbor-credit": RoundingMode.HalfUp,
12 | };
13 |
14 | export const roundingModeOf = (bank: string): RoundingMode =>
15 | bankRounding[bank] ?? RoundingMode.HalfEven;occurrences
리터럴 텍스트를 파일별로 그룹화하고, 스캔한 파일 수를 함께 표시합니다. 시맨틱 도구들은 존재하는 항목의 순위를 매기므로, teardown 후 토큰이 사라졌는지 확인하는 데는 쓸모가 없습니다. 여기서 0은 동일한 스캔 수와 함께 반환되므로 의미가 있습니다.
에이전트 입력
tool: Occurrences
workspace: fixtures/ledger
text: signedAmount
# answered in 12ms응답
"signedAmount" occurs 12 times in 7 files · 67 files scanned under the workspace · 1 file of declared build output not scanned.
packages/accounts/src/index.ts:12:39 · export { credit, debit, type Posting, signedAmount } from "./posting.ts";
packages/accounts/src/journal.ts
├ 3:39 · import { credit, debit, type Posting, signedAmount } from "./posting.ts";
└ 52:12 · .map(signedAmount)
packages/accounts/src/posting.ts:25:14 · export const signedAmount = (posting: Posting): Money => {
packages/reconcile/src/drift.ts
├ 4:24 · import { type Posting, signedAmount } from "@ledger/accounts";
└ 20:37 · const journalTotal = postings.map(signedAmount).reduce((total, amount) => total + amount);
packages/reconcile/src/matching.ts
├ 1:55 · // DELIBERATELY BROKEN — the imports for `money` and `signedAmount` are
└ 14:20 · const amount = signedAmount(posting);
packages/reports/src/balance.ts
├ 6:3 · signedAmount,
└ 34:57 · add(own.get(posting.account) ?? zero(currency), signedAmount(posting)),
packages/rules/src/builtin.ts
├ 1:10 · import { signedAmount } from "@ledger/accounts";
└ 26:12 · .map(signedAmount)search_code
무엇이라고 불리는지 짐작할 수 없을 때, 코드가 하는 일을 기준으로 코드를 찾습니다. 결과는 순위순으로 반환되며, 각 결과는 자신이 나온 파일 범위를 담고 있어 다음 호출이 갈 곳을 알 수 있습니다. 실시간 답변은 또한 결과별 관련성 백분율을 담지만, 그 배후의 임베딩 점수는 머신마다 다르고 이 사례들은 바이트 단위로 비교되므로 아래에서는 생략했습니다.
에이전트 입력
tool: Search code
workspace: fixtures/ledger
query: walking an account up through each of its ancestor accounts
snippetLines: 6
# answered in 20ms응답
Search: walking an account up through each of its ancestor accounts
5 matches · no identifier to anchor on, so these are ranked by meaning alone
=== 1 · packages/accounts/src/account.ts:21-35 ===
Structure: parentPath
Symbol: parentPath [variable] · selection 21:14-21:24 · range 21:14-24:2
21 | export const parentPath = (path: AccountPath): AccountPath | undefined => {
22 | const at = path.lastIndexOf(":");
23 | return at === -1 ? undefined : path.slice(0, at);
24 | };
25 |
26 | /** Every ancestor from root to the account itself: `a`, `a:b`, `a:b:c`. */
=== 2 · packages/reports/src/balance.ts:1-23 ===
Structure: BalanceLine
Symbol: BalanceLine [interface] · selection 11:18-11:29 · range 11:1-16:2
1 | import {
2 | type AccountPath,
3 | type Entry,
4 | type Journal,
5 | lineage,
6 | signedAmount,
=== 3 · packages/accounts/src/journal.ts:59-73 ===
Structure: Journal > history
Symbol: history [method] · selection 60:3-60:10 · range 60:3-64:4
59 | /** Entries touching an account, oldest first. */
60 | history(account: AccountPath): readonly Entry<TMeta>[] {
61 | return this.entries.filter((entry) =>
62 | entry.postings.some((posting) => posting.account === account),
63 | );
64 | }
=== 4 · packages/reports/src/statement.ts:1-11 ===
Structure: statementLine
Symbol: statementLine [variable] · selection 8:14-8:27 · range 8:14-11:2
1 | import { type Account, normalBalance } from "@ledger/accounts";
2 | import { format, type Money, negate } from "@ledger/money";
3 |
4 | /**
5 | * One rendered statement line. The sign follows the account's normal side:
6 | * a liability holding a credit balance reads as positive on its statement.
=== 5 · packages/accounts/src/posting.ts:1-24 ===
Structure: credit
Symbol: credit [variable] · selection 18:14-18:20 · range 18:14-22:3
1 | import { type Money, negate } from "@ledger/money";
2 | import type { AccountPath } from "./account.ts";
3 |
4 | /**
5 | * One side of a journal entry. The discriminant is the bookkeeping side, so
6 | * every consumer's switch is checked for exhaustiveness by the compiler.diagnostics
파일별 패스가 아니라 프로젝트별로 수행되는 컴파일러 자체의 전체 프로그램 검사입니다. 한 파일의 수정은 보통 다른 파일을 깨뜨리며, 바로 이 호출이 그 파일을 찾아냅니다.
에이전트 입력
tool: Diagnostics
workspace: fixtures/ledger
file: packages/reconcile/src/drift.ts
# answered in 23ms응답
packages/reconcile/src/drift.ts · 4 problems · packages/reconcile/tsconfig.json
=== packages/reconcile/src/drift.ts ===
error ts(2365) 16:33-16:52 — inside lines.reduce() callback
Operator '+' cannot be applied to types 'number' and 'Money'.
14 | /** Statement total, computed by someone who forgot Money is not a number.…
15 | export const statementTotal = (lines: readonly StatementLine[]): number =>
16 | lines.reduce((total, line) => total + line.amount, 0);
| ^^^^^^^^^^^^^^^^^^^
17 |
18 | /** Drift between the journal's view and the bank's view of one day. */
error ts(2365) 20:77-20:91 — inside reduce() callback
Operator '+' cannot be applied to types 'import("packages/money/src/money").Money' and 'import("packages/money/src/money").Money'.
18 | /** Drift between the journal's view and the bank's view of one day. */
19 | export const drift = (postings: readonly Posting[], statement: readonly St…
20 | const journalTotal = postings.map(signedAmount).reduce((total, amount) =…
| ^^^^^^^^^^^^^^
21 | return format(money(journalTotal - statementTotal(statement), "usd"));
22 | };
error ts(2345) 21:65-21:70 — inside drift
Argument of type '"usd"' is not assignable to parameter of type 'Currency'.
19 | export const drift = (postings: readonly Posting[], statement: readonly St…
20 | const journalTotal = postings.map(signedAmount).reduce((total, amount) =…
21 | return format(money(journalTotal - statementTotal(statement), "usd"));
| ^^^^^
22 | };
23 |
error ts(2362) 21:23-21:35 — inside drift
The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
19 | export const drift = (postings: readonly Posting[], statement: readonly St…
20 | const journalTotal = postings.map(signedAmount).reduce((total, amount) =…
21 | return format(money(journalTotal - statementTotal(statement), "usd"));
| ^^^^^^^^^^^^
22 | };
23 |workspace_symbols
이름이 대략 무엇인지 알고 위치에 대해서는 전혀 모를 때, 세션이 로드한 모든 프로젝트에서 이름으로 선언을 찾습니다.
에이전트 입력
tool: Workspace symbols
workspace: fixtures/ledger
file: packages/importers/src/statement-parser.ts
query: Parser
# answered in 100ms응답
3 symbols matching Parser · 9 projects loaded · packages/importers/tsconfig.json
CsvStatementParser [class] · packages/importers/src/statement-parser.ts:25:1-35:2
FixedWidthStatementParser [class] · packages/importers/src/statement-parser.ts:41:1-64:2
StatementParser [class] · packages/importers/src/statement-parser.ts:7:1-23:2file_references
누가 이 모듈을 가져오는지. 내부의 심볼을 먼저 고르지 않고 답하는 모듈 수준의 질문입니다.
에이전트 입력
tool: File references
workspace: fixtures/ledger
file: packages/money/src/money.ts
# answered in 134ms응답
packages/money/src/money.ts · referenced from 90 places · 10 projects loaded · packages/money/tsconfig.json
1-20 of 90 places · pass offset: 20 for the rest
packages/accounts/src/journal.ts
├ 1:10 — at module level
└ 53:15 — inside post
packages/money/src/index.ts
├ 3:3 — at module level
└ 4:3 — at module level
packages/money/tests/money.test.ts
├ 2:10 — at module level
├ 2:15 — at module level
├ 5:10 — inside test("adds amounts of one currency exactly") callback
├ 9:16 — inside expect() callback
├ 9:67 — inside test("refuses to combine currencies") callback
├ 13:10 — inside test("formats major and minor units per currency") callback
└ 14:10 — inside test("formats major and minor units per currency") callback
packages/reconcile/src/drift.ts
├ 5:10 — at module level
└ 21:10 — inside drift
packages/reports/src/balance.ts
├ 8:10 — at module level
├ 34:9 — inside balancesAsOf
└ 41:28 — inside balancesAsOf
packages/reports/src/statement.ts
├ 2:10 — at module level
└ 10:40 — inside statementLine
packages/rules/src/builtin.ts
├ 2:10 — at module level
└ 28:58 — inside closedPeriodsBalance패키지
패키지 | 역할 |
MCP 서버 | |
헤드리스 코드 인텔리전스 API | |
코어 패키지가 구동하는 Volar 기반 언어 서버 |
개발
vp install
vp run check
vp run check:distributionCONTRIBUTING.md에 변경 및 릴리스 절차가 있습니다.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityDmaintenanceExposes TypeScript Language Server Protocol functionality to AI agents, enabling them to query types at specific positions, find definitions and references, get diagnostics, run type tests, and type-check inline code just like in an IDE.91023MIT
- AlicenseAqualityDmaintenanceA TypeScript-aware MCP server that provides coding agents with repository discovery, code intelligence, and web project context for local codebases. It enables deep symbol navigation, diagnostic reporting, and structural analysis of monorepos without requiring full IDE integration.7181MIT
- AlicenseNot gradedqualityFmaintenanceBridges the Model Context Protocol with Language Server Protocol to provide AI agents with persistent access to code intelligence features including navigation, diagnostics, refactoring, and completion across 7+ programming languages.3,520MIT
- AlicenseAqualityCmaintenanceEnables AI coding agents to interact with TypeScript projects through compiler-level code intelligence, providing tools for navigation, type information, diagnostics, refactoring, and semantic search.293393Apache 2.0
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A Model Context Protocol server for Wix AI tools
Give your AI agent a persistent map of your project's structure, dependencies, and bugs.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/tyler-mitchell/type-atlas'
If you have feedback or need assistance with the MCP directory API, please join our Discord server