Skip to main content
Glama

npm node license

Type Atlas は、私がすべての TypeScript プロジェクトで、すべてのコードナビゲーションのニーズに対して、すべてのコードエージェントに使わせているツールです。それらのプロジェクトのほとんどはモノレポです。中には、変更がシステム全体にどう適合するかを理解することが実際の作業の一部となるほど、大規模で複雑なものもあります。このツールは、エージェントのデフォルトのコードナビゲーション手法を完全に置き換えるものとして設計されました。

私はこのツールを、自分のコーディングエージェントが実際にプロジェクトでどう動くかに基づいて、何ヶ月も反復改良してきました。Type Atlas が行うことのほとんどは、同じ問題を繰り返し見てきたからこそ存在します。

  • エージェントはシステムの不完全なビューから推論する。 見つけたファイルは理解しても、それがどう使われるべきかを決定する周囲のコードを見逃すことがあります。

  • エージェントは既に存在するものを再構築する。 その機能はリポジトリに既にあるのに、エージェントはそれが何と呼ばれているか知らないため、見つけることができません。

  • エージェントはコードを読みすぎるか(Claude)、あるいは圧倒的に読みすぎるか(Codex)のどちらかになりがちです。 少なすぎると、十分な周囲のコンテキストなしで意思決定をすることになります。多すぎると、コンテキストウィンドウがファイル全体や、タスクに関係のない実装詳細で埋まってしまいます。

  • エージェントは、IDE が既に表示しているであろうエラーを見つけるためだけに、型チェックを実行するために繰り返し停止します。 これにより実装全体にレイテンシが加わり、フィードバックが必要以上に遅れて届くことになります。

  • エージェントは根本的に盲目的に動作しています。 文字列検索によるナビゲーションでは、コードベースの強力な内部地図をエージェントに与えることは決してありません。エージェントは、たまたま取得したファイルの断片やマッチに基づいて実装の決定を強いられ、重要な構造やコンパイラが知っている情報が欠落したままになります。

プロジェクトが成長するにつれて、これらの問題は複合的に悪化し、エージェントが書くコードの品質に直接現れ始めます。

セマンティックコードナビゲーション

コーディングエージェントは、デフォルトではファイル読み取りと文字列検索を通じてコードをナビゲートします。これによりソーステキストが得られ、TypeScript 言語サービスが既に知っている関係をモデルが再構築することになります。

Type Atlas は、エージェントにそのセマンティック情報への直接アクセスを提供します。

  • シンボルは、同じテキストのすべての出現ではなく、実際の定義と参照に解決されます。

  • 呼び出し元と実装は、シンボルとの関係によって識別されます。

  • 推論された型は、近くのソースから再構築されるのではなく、言語サービスから取得されます。

  • 結果には、ソース範囲と所有する TypeScript プロジェクトが添付されたままになります。

テキストマッチは、エージェントがテキストを探している場合には依然として有用です。しかし、プログラム自体に関する質問に対しては、セマンティックナビゲーションの弱い代替手段に過ぎません。

既に存在するものを見つける

大規模なコードベースには、エージェントが名前を知る理由のない有用なコードが含まれています。文字列検索は、エージェントが検索を定式化するのに十分な語彙を既に知っている場合に最も効果的です。

Type Atlas は、他の入り口を提供します。

  • エージェントは自然言語で動作を記述し、その機能に基づいてコードを見つけることができます。

  • 発見された結果は、実際のシンボルと正確なソース範囲に戻ります。

  • そのシンボルから、エージェントは別の識別子を推測して検索する代わりに、コードベース内の実際の関係をたどることができます。

これは特に大規模なモノレポで有用です。既存のヘルパーや確立された実装は、エージェントが別のものを作成する必要があると判断する前に発見しやすくなります。

通常の作業中の診断

IDE の開発者は、作業中にコンパイラのフィードバックを見ます。コーディングエージェントは通常、実装を停止して型チェックコマンドを実行し、その結果を待つことでそのフィードバックを得ます。

Type Atlas は、そのフィードバックの多くを、エージェントが既に行っている作業に移します。

  • 関連する診断は、通常のコードインテリジェンス応答とともに届きます。

  • エラーは、影響を受けるコードがエージェントの現在の作業コンテキストの一部である間に表示されます。

  • 誤った型の仮定は、複数の依存する編集に変わる前に捕捉できます。

私は検証のために今でも完全な型チェックを使用しています。しかし、エージェントが作業中にエラーを学ぶ主な方法である必要はありません。

応答はモデルコンテキスト用に構築される

応答を小さくすることは、削除された情報が不要だった場合にのみ有用です。モデルはまた、残ったものの構成も使用します。

Type Atlas は、構造を情報の一部として扱います。

  • ラベルは結果の役割を明示します。

  • グループ化は関連する事実をまとめます。

  • ファイル境界は、無関係なソースが混ざるのを防ぎます。

  • ソースの場所は、それが説明するものに添付されたままになります。

  • ツリーは、フラットなシーケンスになる代わりに、階層を保持します。

  • 診断は、それを理解するために必要なソースを保持します。

同じ原則が、何を省略するかを決定します。シグネチャで十分な場合、関数本体は折りたたまれたままにできます。繰り返しのシリアライズや無関係なソースは、利用可能だからといってコンテキストウィンドウを占有する必要はありません。

目標は、有用な情報密度です。トークンが少ないことは重要ですが、モデルがそれらのトークンを理解するのに役立つ構造を削除することは、目的を損なうことになります。

次の決定のための情報

すべてのツール呼び出しは、エージェントの推論プロセスの一部です。良い応答は、現在の質問に答えながら、次に何を調べるかを決定するためのより良い立場にエージェントを置くべきです。

Type Atlas は、有用なフォローアップ情報を、それを明らかにした結果の近くに保ちます。

  • シンボルは、コードベースでの参加方法を理解するために必要な関係とともに届きます。

  • リポジトリ構造は、ファイル自体とともに、行数や作業ツリーの状態を運ぶことができます。

  • 検索結果には、直接たどれる具体的なソース範囲が含まれます。

  • プロジェクトコンテキストは、エージェントが結果から結果へ移動する際に添付されたままになります。

これにより、エージェントは調査の各分岐でより良い証拠を得られます。プログラム内に実際に存在する関係をたどることができ、すべてのテキストマッチを同等に意味のある手がかりとして扱う代わりになります。

利点は、より高品質なナビゲーションです。各ステップで、次のステップを選択するために必要な情報がより多く保持されます。

プロジェクトとスコープの認識

TypeScript の質問は、プロジェクトコンテキストに依存します。これは特にモノレポで重要になります。そこでは、答えが1つのプロジェクト内では正しくても、リポジトリ全体としては不完全である可能性があります。

Type Atlas は、それらの境界を可視化します。

  • ファイルは、それを所有する TypeScript プロジェクトを通じて解決されます。

  • 結果は、そのスコープが重要である場合、それが由来するプロジェクトスコープを明示します。

  • カウントは、結果のサイズを明示します。

  • 制限は、答えがリポジトリ全体をカバーしていない場合に明示されます。

  • ソースの場所は、後の呼び出しに直接渡すことができます。

エージェントは、答えに依存する前に、答えが実際に何をカバーしているかを理解するのに十分な情報を得ます。

日々のエージェント使用から構築

私は Type Atlas を、すべての TypeScript プロジェクトで自分のコーディングエージェントと毎日使用しています。現在の動作は、繰り返しの使用から生まれました。

デザインの多くは、繰り返し発生するエージェントの動作に直接さかのぼることができます。

  • エージェントが必要としないボディにコンテキストを費やしていたため、読み取りは折りたたまれます。

  • 繰り返しの型チェックコマンドが実装時間を無駄にしていたため、診断は通常の応答とともに移動します。

  • エージェントが別々の呼び出しで同じ情報を再構築し続けていたため、セマンティック関係はグループ化されます。

  • 有用なコードには、エージェントがタスクから推測できない名前がよくあるため、自然言語コード検索が存在します。

それが今でも Type Atlas での私の作業方法です。エージェントが同じナビゲーション問題に時間を浪費したり、同じ種類の情報を繰り返し見逃したりするのを見続けると、ツールを変更します。

以下の例は、フィクスチャのモノレポに対して実行中のサーバーから取得され、実装とともに回帰チェックされています。

インストール

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 が必要です。これがない場合、これら4つは uv が不足していると報告し、explore_symbol は関連コードセクションを省略し、残りは影響を受けません。

推奨

サーバーをインストールしても、エージェントが手を伸ばすものは変わりません。Claude を含む一部のエージェントは、シェルが許可するものを何でも連結して組み立て、そのたびに新しい正当化を生成します。そのため、避けるべきコマンドをいくつか指定しても効果はありません。指示は、カテゴリ全体を除外し、例外を指定する必要があります。これを AGENTS.md または CLAUDE.md に追加してください:

Type Atlas MCP は、TypeScript および JavaScript のコードを読み取り、ナビゲートするための必須ツールです。これは好みの問題ではありません。シェルコマンドは、それが何で構成されていようと、許容される代替手段ではなく、単純なファイル読み取りも同様です。唯一の有効なフォールバックは、サーバーがダウンしている、呼び出しがエラーになった、またはファイルが TS でも JS でもない場合です。

--require-intent

このオプトインのフラグは、リポジトリ検索やワークスペースシンボルなどの広範な探索ツールに対して、1つの決定文を要求します。対象を絞った読み取りやセマンティックルックアップは影響を受けず、意図がツール応答にエコーされることはありません。

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 loc

inspect_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 · 5 relevant projects searched)

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

ファイルごとにグループ化されたリテラルテキストと、スキャンされたファイル数。セマンティックツールは存在するものをランク付けするだけなので、ティアダウン後にトークンが消えたことを確認するのには役に立たない。ここでのゼロは同じスキャン数で返ってくるため、意味を持つ。

エージェントの入力

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 · 8 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 · 6 relevant projects searched · 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
└  5:3 — at module level
packages/money/tests/money.test.ts
├  2:10  — at module level
├  2:15  — at module level
├  2:38  — 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/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

パッケージ

パッケージ

役割

@type-atlas/mcp

MCPサーバー

@type-atlas/core

ヘッドレスコードインテリジェンスAPI

@type-atlas/language-server

コアパッケージが駆動するVolarベースの言語サーバー

開発

vp install
vp run check
vp run check:distribution

CONTRIBUTING.md に変更とリリースのプロセスが記載されている。

Related MCP Connectors

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
    614 npm
    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
    15 npm
    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.
    1,932 npm
    MIT
  • A
    license
    A
    quality
    B
    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
    225 npm
    3
    Apache 2.0