type-atlas
Type Atlas ist ein MCP-Server für Code-Intelligenz. Ein Volar-Language-Server antwortet aus dem TypeScript-Projekt, dem die jeweilige Datei gehört, sodass Definitionen, Referenzen, Typen, Diagnosen und Bereiche mit dem übereinstimmen, was ein Editor anzeigt.
Antworten sind für ein Kontextfenster geschrieben, nicht für einen Bildschirm. Eine Dateigliederung enthält die Deklarationen der Datei, nicht jeden verschachtelten Callback. Beim Lesen werden Funktionsrümpfe zu Signaturen eingeklappt. inspect_symbol bündelt acht Language-Server-Anfragen zu einer Antwort. Jede Antwort nennt den Umfang, den sie abgedeckt hat, und was sie gekostet hat.
Ich nutze das Tool jeden Tag in einem großen Monorepo, das fast vollständig von Agenten gepflegt wird.
TypeScript, Markdown und JSON. Node 22.20 oder neuer. Apache-2.0.
Installation
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"]}'Jeder andere Client nutzt die Standardform:
{
"mcpServers": {
"type-atlas": {
"command": "npx",
"args": ["--yes", "@type-atlas/mcp@latest"]
}
}
}Ein Client, der Server ohne die PATH-Variable Ihrer Shell startet, findet npx nicht über den Namen; geben Sie in dem Fall den absoluten Pfad an, den which npx liefert. Unter Windows braucht ein Client, der den npx.cmd-Shim nicht starten kann, "command": "cmd" mit "args": ["/c", "npx", "--yes", "@type-atlas/mcp@latest"].
Clients lesen die MCP-Konfiguration beim Start; starten Sie den Client nach einer Änderung also neu. @latest wird bei jedem Prozessstart aufgelöst; legen Sie eine Version fest, wenn Sie nicht möchten, dass sich das Verhalten der Werkzeuge unbemerkt verändert.
search_code, related_code, investigate_code und search_dependency_code betreiben einen semantischen Index über uvx und benötigen dafür uv. Ohne uv melden diese vier, dass uv fehlt, explore_symbol lässt seinen Abschnitt zu verwandtem Code weg, der Rest bleibt unverändert.
Empfehlung
Die Installation des Servers ändert nicht, wonach ein Agent greift. Manche Agents – unter anderem Claude – setzen aus dem, was ihre Shell erlaubt, Verkettungen zusammen und liefern jedes Mal eine neue Begründung. Es hält deshalb nicht, einzelne Befehle als vermeidenswert zu benennen. Die Anweisung muss die gesamte Kategorie ausschließen und die Ausnahmen nennen. Fügen Sie das zu AGENTS.md oder CLAUDE.md hinzu:
Type Atlas MCP ist das erforderliche Werkzeug zum Lesen und Navigieren von Code in TypeScript und JavaScript. Das ist keine Präferenz. Kein Shell-Befehl ist ein akzeptabler Ersatz – egal woraus er besteht – und ein einfaches Datei-Lesen ist es auch nicht. Die einzigen gültigen Fallbacks sind ein nicht erreichbarer Server, ein fehlgeschlagener Aufruf oder eine Datei, die weder TS noch JS ist.
--require-intent
Mit diesem Flag muss ein Leseaufruf einen Satz enthalten, der die Entscheidung benennt, der er dient; dieser Satz wird über der Antwort wiederholt. Ein Aufruf ohne solch einen Satz schlägt fehl.
codex mcp add type-atlas -- npx --yes @type-atlas/mcp@latest --require-intentDas ist für Agent gedacht, die weit über das hinausgehen, was ihre Änderung benötigt, und danach nicht sagen können, warum. Standardmäßig aus.
Related MCP server: agent-workspace-mcp
Ergebnisse der Tool-Aufrufe
Pfade sind workspace-relativ, Koordinaten sind einsbasiert, ein Fundort in einer Antwort ist also eine gültige Eingabe für den nächsten Aufruf. Bearbeitungswerkzeuge geben Patches zurück; nichts wird für Sie geschrieben.
Alles unten stammt vom laufenden Server, aufgezeichnet gegen fixtures/ledger von der Szenario-Suite, die dieselben Aufrufe erneut abspielt und bei Abweichung. Hier ist nichts von Hand geschrieben, und was ein Werkzeug ändert, ändert diese Datei im selben Commit. Die Quelle ist README.mdoc. Jedes Werkzeug hat weitere, weitere Fälle in docs/tools.
list_files
Struktur, Zeilenzahlen und git status haben einzelner Baum, mit den Badge-Buchstaben, die Editoren bereits verwenden. Gelöschte Dateien erhalten eine Zeile, auch wenn sie nur in git gehören. Eingeklappte Verzeichnisse verraten, was sie enthalten, statt zu verschwinden.
Eingabe des Agenten
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 57msAntwort
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
Hover-, Definitionen, Typdefinitionen, Implementierungen, Aufrufer, Aufrufe und Referenzen in einem Aufruf. Referenzen sind der Rest, nach dem Aufrufer und Definitionen berücksichtigt wurden, daher wird jede Verwendung einmal gelistet. Gegenüber diesen separat aufgerufenen Tools sind das 4x weniger Zeichen und 7x weniger Roundtrips.
Eingabe des Agenten
tool: Inspect symbol
workspace: fixtures/ledger
file: packages/accounts/src/journal.ts
symbol: Journal
# answered in 49msAntwort
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
Das Argument ist ein Array, daher kommen mehrere Dateien in einem Aufruf. Funktionsrümpfe werden standardmäßig zu Signaturen eingeklappt, und im Kopfbereich steht, wie viele Zeilen das gespart hat; mit false: false gibt er sie zurück.
Eingabe des Agenten
tool: Read files
workspace: fixtures/ledger
file: ["packages/accounts/src/posting.ts","packages/money/src/rounding-mode.ts"]
# answered in 7msAntwort
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
Literaler Text wird nach Datei gruppiert, mit Angabe der Nummer der gescannten Dateien. Die semantischen Werkzeuge versuchen, die gibt es zu raubewerten, was nutzlos ist, um nach einem Abbau zu bestätigen, dass es eine Gabe ist; eine Null entsteht aus derselben Anzahl von gescannten, ist also bedeutet in etwas.
Agent’s Input
tool: Occurrences
workspace: fixtures/ledger
text: signedAmount
# answered in 12msResponse
"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
Findet Code nach dem, was er tut, wenn man nicht erraten kann, wie er heißt. Treffer kommen in Rangfolge und tragen den Dateiberinkl, aus dem sie stammt, damit der nächste Aufruf ein Ziel hat. Live-Antworten enthalten ebenfalls einen Relevanz-Prozentsatz pro Treffer; unten fehlt es, weil die zugrunde liegenden Embedding-Werte von Rechner zu Rechner unterscheiden und diese Fälle Byte für Byte verglichen werden.
Eingabe des Agenten
tool: Search code
workspace: fixtures/ledger
query: walking an account up through each of its ancestor accounts
snippetLines: 6
# answered in 20msAntwort
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
Die eigene Ganzprogramm-Prüfung des Compilers, pro Projekt, kein Verlauf pro Datei. Ein Bearbeiten in einer Datei bricht Sie bricht andere, und dieser Aufruf findet die Datei.
Eingabe des Agenten
tool: Diagnostics
workspace: fixtures/ledger
file: packages/reconcile/src/drift.ts
# answered in 23msAntwort
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
Finden Sie eine Deklaration anhand des Namens in allen Projekten, die die Session geladen, wenn Grobwissen Sie wissen, wie sie heißt, aber nichts über den Ort weiß.
Eingabe des Agenten
tool: Workspace symbols
workspace: fixtures/ledger
file: packages/importers/src/statement-parser.ts
query: Parser
# answered in 100msAntwort
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
Wer importiert dieses Modul. Die beadische Frage auf Modulebene, ohne erst ein Symbol in ihr zu wählen.
Eingabe des Agenten
tool: File references
workspace: fixtures/ledger
file: packages/money/src/money.ts
# answered in 134msAntwort
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 closedPeriodsBalancePakete
Paket | Rolle |
der MCP-Server | |
Headless-API für Code-Intelligenz | |
der Volar-basierte Language-Server, den das Core-Paket steuert |
Entwicklung
vp install
vp run check
vp run check:distributionThis 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