type-atlas
Type Atlas — это MCP-сервер для интеллектуальной работы с кодом. Языковой сервер Volar отвечает от имени проекта TypeScript, которому принадлежит каждый файл, поэтому определения, ссылки, типы, диагностика и диапазоны совпадают с тем, что показывает редактор.
Ответы рассчитаны на окно контекста, а не на экран. Структура файла — это объявления в нём, а не каждый вложенный колбэк. Чтение сворачивает тела функций до сигнатур. inspect_symbol объединяет восемь запросов к языковому серверу в один ответ. Каждый ответ сообщает, какую область он охватил и чего это стоило.
Я пользуюсь им каждый день — в большом монорепозитории, который обслуживают почти целиком агенты.
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, нужен "command": "cmd" с "args": ["/c", "npx", "--yes", "@type-atlas/mcp@latest"].
Клиенты читают конфигурацию MCP при запуске, поэтому после этого перезапустите их. @latest разрешается при каждом запуске процесса; зафиксируйте версию, если не хотите, чтобы поведение инструментов менялось у вас под ногами.
search_code, related_code, investigate_code и search_dependency_code запускают семантический индекс через uvx и требуют 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
Результаты вызовов инструментов
Пути указаны относительно рабочей области, координаты начинаются с единицы, поэтому местоположение в одном ответе — корректный вход для следующего вызова. Инструменты редактирования возвращают патчи; ничего не записывается за вас.
Всё ниже получено от запущенного сервера на 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 раза меньше символов и в 7 раз меньше сетевых запросов.
Ввод агента
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
Буквальный текст, сгруппированный по файлам, с количеством просканированных файлов. Семантические инструменты ранжируют то, что существует, — это бесполезно для подтверждения того, что токен исчез после удаления; ноль здесь приходит с тем же числом просканированных файлов, поэтому он что-то значит.
Ввод агента
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Пакеты
Package | Role |
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