type-atlas
Type Atlas は、コードインテリジェンスのための MCP サーバーです。Volar 言語サーバーは、各ファイルを所有する TypeScript プロジェクトに基づいて回答するため、 定義、参照、型、診断、および範囲は、エディターに表示されるものと一致します。
回答は画面ではなくコンテキストウィンドウ向けに書かれています。ファイルのアウトラインは、
その中にある宣言であって、ネストされたすべてのコールバックではありません。読み取りでは
本体をシグネチャに折りたたみます。inspect_symbol は 8 つの言語サーバーリクエストを
1 つの回答にまとめます。すべての回答は、カバーしたスコープとそのコストを示します。
私はこれを、ほぼ完全にエージェントによって維持されている大規模なモノレポで毎日使用しています。
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 が
必要です。これがない場合、これら 4 つは uv がないことを報告し、explore_symbol は関連コードの
セクションを省略し、その他は影響を受けません。
推奨
サーバーをインストールしても、エージェントが何を使うかは変わりません。Claude を含む一部の
エージェントは、シェルが許可するものを何でもつなぎ合わせて組み立て、そのたびに新しい正当化を
生成します。そのため、避けるべきコマンドをいくつか挙げても効果はありません。指示では、
カテゴリ全体を除外し、例外を明示する必要があります。これを AGENTS.md または CLAUDE.md に
追加してください:
Type Atlas MCP は、TypeScript および JavaScript のコードを読み取り、ナビゲートするための 必須ツールです。これは好みの問題ではありません。シェルコマンドは、それがどのような構成であっても、 許容される代替手段ではありません。単純なファイル読み取りも同様です。唯一許容されるフォールバックは、 サーバーがダウンしている場合、呼び出しがエラーになった場合、または TS でも JS でもないファイルの場合だけです。
--require-intent
このフラグを使用すると、読み取り専用の呼び出しには、それが支える判断を 1 文で示す必要があり、 その文は回答の上に表示されます。その文がない呼び出しは失敗します。
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 を 1 つのツリーにまとめ、エディターがすでに使用しているバッジ文字を使用します。
削除されたファイルは、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
ホバー、定義、型定義、実装、呼び出し元、呼び出し、参照を 1 回の呼び出しで取得します。参照は、 呼び出し元と定義を差し引いた残りであるため、使用箇所は 1 回だけリストされます。これらのツールを 個別に呼び出す場合と比較すると、文字数は 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
引数は配列なので、複数のファイルが 1 回の呼び出しで取得されます。デフォルトでは本体はシグネチャに
折りたたまれ、ヘッダーには節約された行数が示されます。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
リテラルテキストをファイルごとにグループ化し、スキャンされたファイル数とともに返します。セマンティック ツールは存在するものをランク付けするため、削除後にトークンがなくなったことを確認するのには役に立ちません。 ここでの 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パッケージ
Package | Role |
MCP サーバー | |
ヘッドレスなコードインテリジェンス API | |
core パッケージが駆動する 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