Skip to main content
Glama

npm node license

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 loc

inspect_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:2

file_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

@type-atlas/mcp

MCP-сервер

@type-atlas/core

автономный API интеллектуальной работы с кодом

@type-atlas/language-server

языковой сервер на базе Volar, которым управляет основной пакет

Разработка

vp install
vp run check
vp run check:distribution

CONTRIBUTING.md содержит описание процесса внесения изменений и выпуска версий.

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
33Releases (12mo)
Commit activity

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

  • A
    license
    B
    quality
    D
    maintenance
    Exposes 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.
    9
    102
    3
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A 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.
    7
    18
    1
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Bridges 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,520
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI coding agents to interact with TypeScript projects through compiler-level code intelligence, providing tools for navigation, type information, diagnostics, refactoring, and semantic search.
    29
    339
    3
    Apache 2.0

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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