MCP server를 통해 AI 코딩 에이전트에게 TypeScript 추론 타입, 완성 기능 및 타입 에러를 제공합니다.
다른 이름 clockblocker/typeprobe
- 스타
- 1
- Tools
- 12
- 다운로드, 30일
- —
- 최신 버전
- 4.0.0
- 마지막 커밋
- 2026년 10월 10일
- 라이선스
- MIT
typeprobe MCP란?
typeprobe은(는) MCP server입니다. MCP server를 통해 AI 코딩 에이전트에게 TypeScript 추론 타입, 완성 기능 및 타입 에러를 제공합니다. 12개 도구를 제공합니다. 예: hover_by_name, hover, batch_hover.
프로젝트 README에서 생성된 요약
typeprobe MCP server 정보
typeprobe는 AI 코딩 에이전트에게 TypeScript 추론 타입, 완성 기능 및 타입 에러를 제공합니다. 개발자는 AI 클라이언트에 TypeScript 컴파일러의 실제 지능을 부여하여 에이전트가 코드 구조를 추측하지 않도록 할 수 있습니다. 이 서버는 stdio를 통해 작동하며 간단한 설정 명령어를 통해 Claude Code, Cursor, VS Code, Gemini CLI 등 다양한 환경에 통합할 수 있습니다.
사용자는 심볼의 타입을 찾는 hover_by_name, 여러 개를 한 번에 조회하는 batch_hover, 커서 위치에서 사용 가능한 멤버나 유니온 값을 확인하는 completions와 같은 특정 도구를 사용할 수 있습니다. 또한 특정 파일의 에러를 확인하는 진단 기능과 불필요하거나 확장된 타입 선언을 식별하는 어노테이션 기능도 제공합니다. 테스트를 위해 typeprobe/testing 라이브러리를 사용하면 Vitest 또는 Jest와 같은 러너에서 스냅샷 테스트를 통해 추론된 타입을 고정할 수 있습니다.
활용 사례
- 1심볼 타입 검증AI 에이전트가 특정 파일 내에서 이름을 기반으로 변수나 함수의 정확한 타입을 결정할 수 있습니다.
- 2코드 완성 기능 활용AI가 특정 커서 위치에서 문자열 리터럴 유니온 멤버와 같은 TypeScript 완성 정보를 가져올 수 있습니다.
- 3타입 회귀 방지개발자는 테스트 유틸리티를 사용하여 리팩토링 시 추론된 타입이 의도치 않게 변경되지 않도록 보장할 수 있습니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
typeprobe MCP 설치 방법
형식 확인: 2026년 11월 10일Cursor에 추가Goose에 추가Claude Code에 typeprobe MCP 설치
$ claude mcp add typeprobe -- npx -y typeprobeCursor에 typeprobe MCP 설치
~/.cursor/mcp.json
{
"mcpServers": {
"typeprobe": {
"command": "npx",
"args": [
"-y",
"typeprobe"
]
}
}
}VS Code에 typeprobe MCP 설치
.vscode/mcp.json
{
"servers": {
"typeprobe": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"typeprobe"
]
}
}
}VS Code CLI에 typeprobe MCP 설치
$ code --add-mcp '{"name":"typeprobe","type":"stdio","command":"npx","args":["-y","typeprobe"]}'Claude Desktop에 typeprobe MCP 설치
claude_desktop_config.json
{
"mcpServers": {
"typeprobe": {
"command": "npx",
"args": [
"-y",
"typeprobe"
]
}
}
}Codex에 typeprobe MCP 설치
$ codex mcp add typeprobe -- npx -y typeprobeCodex config.toml에 typeprobe MCP 설치
~/.codex/config.toml
[mcp_servers.typeprobe] command = "npx" args = ["-y", "typeprobe"]
Gemini CLI에 typeprobe MCP 설치
$ gemini mcp add -s user typeprobe npx -- -y typeprobeGemini settings.json에 typeprobe MCP 설치
~/.gemini/settings.json
{
"mcpServers": {
"typeprobe": {
"command": "npx",
"args": [
"-y",
"typeprobe"
]
}
}
}typeprobe MCP 도구 12
README에서 감지됨hover_by_namehoverbatch_hovercompletionsdiagnosticsannotationsbackendsignaturedisplaykindcostcompiler
| hover_by_name | — | |
| hover | — | |
| batch_hover | — | |
| completions | — | |
| diagnostics | — | |
| annotations | — | |
| backend | — | |
| signature | — | |
| display | — | |
| kind | — | |
| cost | — | |
| compiler | — |
구성
TYPEPROBE_BACKENDBackend for the hover and diagnostics tools. Use typescript6 if the native TypeScript 7 backend fails in your project.
TYPEPROBE_COMPILERWhich TypeScript compilers to use: typeprobe's bundled ones, the project's own (typescript 5.0 to 6.x; typescript 7 or @typescript/native-preview), or auto: the project's when supported, else bundled.
| 이름 | 설명 | 유형 |
|---|---|---|
| TYPEPROBE_BACKEND | Backend for the hover and diagnostics tools. Use typescript6 if the native TypeScript 7 backend fails in your project. | |
| TYPEPROBE_COMPILER | Which TypeScript compilers to use: typeprobe's bundled ones, the project's own (typescript 5.0 to 6.x; typescript 7 or @typescript/native-preview), or auto: the project's when supported, else bundled. |
자동 검사
2026년 11월 14일에 실행됨전체 보고서 →자동 검사를 통과했습니다. 이는 보안 감사가 아닙니다. 코드를 직접 읽고 서버에 필요한 최소한의 권한만 부여하십시오. 검사 방식
- 소스 저장소 연결 및 접근 가능clockblocker/typeprobe is public and reachablegithub.com/clockblocker/typeprobe ↗통과
- 패키지가 이 저장소를 소스로 명시typeprobe names clockblocker/typeprobe as sourcenpmjs.com/package/typeprobe ↗통과
- 빌드 출처(Sigstore 증명)No build attestation published for this release검사되지 않음
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-10-10github.com/clockblocker/typeprobe ↗통과
- OpenSSF Scorecard검사되지 않음
- 패키지 이름이 인기 패키지와 유사하지 않음No popular package one edit away from typeprobe통과
- 패키지 및 해당 종속성에 중요한 보안 권고 없음26 resolved dependencies checked; no critical advisoryosv.dev ↗통과
- 모델에 대한 숨겨진 지침 없음12 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨No tool named like delete, drop or exec통과
- 원격 엔드포인트가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기typeprobe
typeprobe asks the TypeScript compiler what it infers (types, completions, type errors) so that AI coding agents and tests don't have to guess. It comes as:
- an MCP server for coding agents (Claude Code, Codex, Cursor, VS Code, Gemini CLI, any stdio client),
typeprobe/testing, which returns inferred types as strings for snapshot tests,- a CLI and a synchronous library API.
typeprobe was called prinfer until 4.0.0. See Migrating from prinfer.
Quick start
Give your agent the compiler:
npx -y typeprobe setup claude # or codex, cursor, vscode, gemini; see Install
The agent can now call hover_by_name(file: "src/utils.ts", name: "names") and get Type: string[] back, or diagnostics(file) after an edit.
Lock the types your API infers in a test (Vitest, Jest, Bun, or any runner with snapshots):
import { expect, test } from "vitest"; // or "bun:test"
import { inferredType } from "typeprobe/testing";
import { groupBy, type User } from "../src/users";
const users: User[] = [{ name: "Ada", role: "admin" }];
const byRole = groupBy(users, (user) => user.role);
test("groupBy keys the result by the callback's return type", () => {
expect(inferredType(import.meta.url, { name: "byRole" }))
.toMatchInlineSnapshot(`"Record<Role, User[]>"`);
});
Write the matcher empty (toMatchInlineSnapshot()) and the runner fills it in. A refactor that changes the type fails the test.
Install
Every command runs through npx, so nothing needs installing first. After npm i -g typeprobe, drop the npx -y prefix: setup then registers the typeprobe-mcp binary, which skips npx's package check on each launch.
Claude Code. The plugin bundles the MCP server and a skill that tells Claude when to use it:
/plugin marketplace add clockblocker/typeprobe
/plugin install typeprobe@typeprobe
Other clients, or Claude Code without the plugin:
| Client | Command | Writes |
|---|---|---|
| Claude Code | npx -y typeprobe setup claude |
claude mcp add; --scope project for a shared .mcp.json |
| Codex | npx -y typeprobe setup codex |
codex mcp add (~/.codex/config.toml) |
| Cursor | npx -y typeprobe setup cursor |
~/.cursor/mcp.json; --scope project: .cursor/mcp.json |
| VS Code | npx -y typeprobe setup vscode |
code --add-mcp; --scope project: .vscode/mcp.json |
| Gemini CLI | npx -y typeprobe setup gemini |
~/.gemini/settings.json; --scope project: .gemini/settings.json |
Any other MCP client: typeprobe is a stdio server started with npx -y typeprobe mcp.
{
"mcpServers": {
"typeprobe": { "command": "npx", "args": ["-y", "typeprobe", "mcp"] }
}
}
It is also listed in the MCP Registry as io.github.clockblocker/typeprobe and on Smithery.
Setup options:
--printshows the command or config change without applying it.--npxregistersnpx -y typeprobe mcpeven whentypeprobe-mcpis installed. Use it when the client can't findtypeprobe-mcp; editors started outside a shell often miss nvm, fnm, or volta paths.- Re-running setup updates the
typeprobeentry's command and leaves other servers alone. JSON configs keep keys you added to the entry, such asenv. A JSON config that doesn't parse is left untouched, and setup prints the entry to add by hand. - A
prinferentry from before the rename is replaced rather than kept next to the new one:claudeandcodexremove it, and JSON configs swap it fortypeprobein place, keeping its other keys (withPRINFER_*env names renamed toTYPEPROBE_*). - On Windows the server is registered as
cmd /c npx -y typeprobe mcp(orcmd /c typeprobe-mcp), because clients launch it without a shell and can't run npm's.cmdshims.
Tell the agent when to use it
Tool descriptions only go so far; agents still reach for tsc or write annotations by hand. Add a short usage block to your instructions file (the Claude Code plugin ships the same guidance as a skill):
npx -y typeprobe setup agents-md # ./AGENTS.md
npx -y typeprobe setup agents-md --file CLAUDE.md
The block sits between <!-- typeprobe:start --> and <!-- typeprobe:end -->; re-running updates it in place, and replaces a block prinfer wrote (<!-- prinfer:start -->).
MCP tools
| Tool | Use it for |
|---|---|
hover_by_name |
The type of a named symbol. Start here. |
hover |
The type of a token on a line: callback parameters, expressions, repeated names. |
batch_hover |
Up to 100 lookups, across files, in one call. |
completions |
What TypeScript offers at a cursor, such as string-literal union members. |
diagnostics |
Type errors in one file, without checking the whole project. |
annotations |
Annotations TypeScript would infer anyway. |
Shared parameters:
fileis absolute or relative to the server's working directory. Lines and columns are 1-based.projectis atsconfig.jsonpath; the default is the nearest one above the file.backend(typescript7by default, ortypescript6) on the hover tools anddiagnostics. If a call fails or looks wrong on TypeScript 7, retry it withtypescript6. See Backends and compilers.- Hover tools take
include_docs(JSDoc),include_cost(see Type cost budgets),full, andmax_chars. Type text is capped at 4000 characters per type, and a cut type ends with a line like… truncated: 187 chars total, union of 4 members. Pass max_chars: N to see more (0 for no limit).full: trueturns off TypeScript's own truncation ({ ...; },... 12 more ...) and lists every overload. Structured content is never cut.
hover_by_name
hover_by_name(file: "src/utils.ts", name: "names")
hover_by_name(file: "src/utils.ts", name: "names", line: 11) # line picks among same-named symbols
Type: string[]
Name: names
Kind: const
Position: 11:14
When a name is declared more than once, the lookup prefers declarations and says which it picked: Matched line 8 of 2 declarations (also 12); pass line to choose. The structured result lists the others as alternatives: [{ line, column, kind }]. A line that matches none fails with SYMBOL_NOT_FOUND and lists the declaration lines in declaredAt. A line where the name is used rather than declared, such as box.value in an if, gives the type there, narrowed by the code around it.
Overloaded functions show the first signature, then up to three more (full: true lists all; structured overloads always has every one):
Type: (value: string): number (+1 overload)
Overloads:
(value: number): string
Returns: number
Name: parse
Kind: function
Position: 1:17
hover
Pass text copied from the line and typeprobe finds the column. Whole identifiers match first: on users.map((user) => user.name), text: "user" skips users and hits the callback parameter, and occurrence: 2 picks the next user. Only when the line has no whole-identifier match is text matched as a substring. column works in place of text. Generic calls show their instantiated types, as in an editor.
hover(file: "src/utils.ts", line: 11, text: "user")
Type: { id: number; name: string; }
Name: user
Kind: parameter
Position: 11:33
Target: "user" at 11:33
If the text isn't on the line, the error quotes the line:
Error [SYMBOL_NOT_FOUND]: Text "nope" not found on line 11 of /project/src/utils.ts
Nearby identifiers: name, names, map, user, users
Suggestion: Line 11 reads: "export const names = users.map((user) => user.name);". Copy text exactly from it, or give a column instead.
batch_hover
Each item is {name, line?}, {line, text, occurrence?}, or {line, column}, with an optional file that overrides the shared top-level file. Failures are per item, including a missing file, so one bad lookup doesn't lose the rest.
batch_hover(file: "src/utils.ts", positions: [
{name: "users"},
{line: 11, text: "user"},
{file: "src/missing.ts", line: 1, column: 1}
])
Batch hover results: 2 succeeded, 1 failed
--- src/utils.ts:users:6 ---
Type: { id: number; name: string; }[]
...
--- src/missing.ts:1:1 ---
Error [FILE_NOT_FOUND]: File not found: /project/src/missing.ts
Suggestion: Check the path. Relative paths resolve against the MCP server's working directory (/project); pass an absolute path to be sure.
A line or column outside the file is an INVALID_ARGUMENT error that gives the valid range.
Hover results
Every hover returns the same fields on every backend and surface:
signature: the type text alone, on one line, without the declaration keyword or name an editor hover starts with.string[]for a variable,(value: string): numberfor a function, the instantiated signature for a call. Type aliases keep their name and type parameters (type Event = { kind: "open"; ... } | ...); interfaces and classes are their name (Box<T>). Optional members read astscwrites them in declarations:digits?: number, with| undefinedonly where the source wrote it or the type isn't the annotation's (an instantiated generic, aPartial<T>).display: the editor's hover text (const names: string[]). Only the TypeScript 7 language server reports it.kind: the editor's label (function,method,const,parameter,property,type,interface,class,enum, ...), pluscallfor the callee of a call.returnType,documentation,overloads,unionMembers, andalternativeswhen they apply.cost:{ instantiations, types }withinclude_cost: true.compiler:{ name, version, source }, the compiler that answered.
completions
The cursor sits before the character at column; for a string union, put it just inside the opening quote.
completions(file: "src/utils.ts", line: 14, column: 30)
completions(file: "src/utils.ts", line: 20, column: 1, prefix: "use", limit: 20)
Entries come in TypeScript's ranking: locals, members, and literal values first, then globals (keywords after other entries of the same rank), then auto-imports. At most limit come back (default 50, up to 500); when more match, the text ends with … 947 more; pass prefix to narrow, or raise limit and the structured result has total and truncated: true.
prefix keeps names that start with it, ignoring case. Without it, the text typed left of the cursor filters the list as in an editor (after use in useSt, only use… names); prefix: "" turns that off. At a key of an object literal that accepts any key (Record<string, number>), typeprobe returns no entries and a note saying so, instead of every global. completions always runs on TypeScript 6.
diagnostics
Run it on each file you edited; the edit is done when none reports an error.
diagnostics(file: "src/utils.ts")
diagnostics(file: "src/utils.ts", include_suggestions: true) # also TS6133 unused variables etc.
src/utils.ts:16:14 error TS2322: Type 'string' is not assignable to type 'number'.
1 error, 0 warnings.
A clean file returns No type errors.
annotations
annotations(file: "src/utils.ts")
src/utils.ts:2:55 redundant return type of format: declared string, inferred string (exported)
src/utils.ts:14:19 widening drink: declared Drink, inferred "tea" (exported)
2 redundant, 2 widening (5 annotations checked).
redundant: delete the annotation; the type stays the same.
widening: the annotation is wider than the inferred type; keep it if the wider type is intended.
A redundant annotation can be deleted without changing the type. A widening one is often deliberate (a variable that must accept any Drink later, an exported contract), so treat it as a question. Only annotations with an initializer or body to infer from are checked. Each structured finding has the range of the : Type text, declared, inferred, exported, and a suggestion. annotations always runs on TypeScript 6.
Errors
Every tool returns text plus structured content: { version: 1, ok: true, result } or { version: 1, ok: false, error }. The text of a failure carries the code, message, and recovery hints, because many clients show the model only the text:
Error [SYMBOL_NOT_FOUND]: No symbol named "nmes" at line 11 found in src/utils.ts
Did you mean: names, name?
Suggestion: Check the spelling against candidates, pass line to pick the match on a known line, or call hover with that line and text copied from it.
error has code (INVALID_ARGUMENT, FILE_NOT_FOUND, SYMBOL_NOT_FOUND, TYPESCRIPT_ERROR, or INTERNAL_ERROR), message, suggestion, and, where they apply, file, line, column, project, candidates (close identifiers from the file, or those near the line), and declaredAt. Each tool's outputSchema covers both outcomes in one envelope and lists the error fields an agent recovers with; the others are still sent. The CLI's --json output and the exported zod schemas (hoverSuccessSchema, contractErrorResponseSchema, ...) use the same contract.
Type tests
typeprobe/testing returns the type as the editor displays it, so the snapshot is never written by hand, unlike expectTypeOf or tsd, and any change shows up, including a literal union widening to string. Update snapshots after an intended change with the runner's update flag (vitest -u, bun test --update-snapshots). The lookup helpers are synchronous on both backends, so there is no promise to forget to await.
import { inferredCompletions, inferredType } from "typeprobe/testing";
// Another module: resolve it against the test file.
expect(inferredType(new URL("../src/users.ts", import.meta.url), { name: "groupBy" }))
.toMatchInlineSnapshot(`"<T, K extends PropertyKey>(items: readonly T[], key: (item: T) => K): Record<K, T[]>"`);
// Line 7 of this test file reads: const fallback: Role = "member";
expect(inferredCompletions(import.meta.url, { line: 7, text: '"' }))
.toMatchInlineSnapshot(`
[
"admin",
"member",
]
`);
| Helper | Returns |
|---|---|
inferredType(file, selector) |
The printed type (signature). |
inferredTypeInfo(file, selector) |
The full hover result: name, kind, return type, docs, cost. |
inferredCompletions(file, selector) |
Every completion name at a cursor, on TypeScript 7, with no filter or limit. |
inferredTypeCost(file, selector) |
{ instantiations, types }; see Type cost budgets. |
inferredTypeIssues(file, selector) |
Readability issues; see Readability checks. |
typeReadabilityIssues(text, rules?) |
Readability issues in any printed type text. |
expectType(file, selector) |
Checks text, cost, and readability at once; see expectType. |
expectTypes(file, selector) |
expectType for several targets, plus a budget for all of them; see expectTypes. |
closeTestingSessions() |
Stops the TypeScript 7 compilers early; see TypeScript 7 in tests. |
The file is import.meta.url for the test file itself, or a URL resolved against it. Plain string paths resolve against process.cwd(). The file is read through its nearest tsconfig.json, or project.
The selector picks the target:
{ name, line? }: a declaration by name;linepicks among repeats.{ line, text, occurrence? }: the token wheretextstarts on that line, matched like thehovertool'stext. ForinferredCompletionsthe cursor goes right after the match, sotext: "user."lists members andtext: '"'lists string-literal members;cursor: "start"puts it before.{ line, column }: a 1-based position (for completions, the cursor sits before that column).
Options go in the same object, e.g. { name: "byRole", backend: "typescript7" }. A third argument throws.
| Option | Default | Effect |
|---|---|---|
backend |
"typescript6" |
"typescript7" prints TypeScript 7's output. inferredCompletions always uses TypeScript 7. |
full |
true |
false gives the editor's shortened form ({ ...; }). |
sort_unions |
false |
Prints unions in a fixed order; see below. |
include_docs |
false |
Adds documentation to inferredTypeInfo. |
include_cost |
false |
Adds cost to inferredTypeInfo (TypeScript 6 only). |
project |
nearest tsconfig.json |
The tsconfig to read the file with. |
compiler |
TYPEPROBE_COMPILER, else "bundled" |
Whose TypeScript to use; see Bundled or project compilers. |
timeout |
60000 |
Milliseconds a TypeScript 7 call may block before it throws. |
strict |
false |
Throws on unknown keys, naming the closest valid one. Test runners don't type-check test files, so without it a camelCase sortUnions does nothing. |
Failed lookups throw with the fix in the message: an unknown name lists the closest declarations, missing text quotes the line, and a missing relative path explains how to resolve it against the test file.
typeprobe/vitest is a deprecated alias for typeprobe/testing.
Stable union order
TypeScript 6 and TypeScript 7 print union members in different orders ("idle" | "error" on one, "error" | "idle" on the other), so a snapshot written on one backend fails on the other. sort_unions: true prints every union, at any depth, in the same order on both: members sorted by their text (UTF-16 code units, so 1 | 10 | 2), with null and undefined last.
expect(inferredType(import.meta.url, { name: "status", sort_unions: true }))
.toMatchInlineSnapshot(`""error" | "idle" | "loading" | null"`);
Only union members move. Property order can still differ: cond ? { ok: true, value: 1 } : { ok: false, error: "e" } prints { ok: false; error: string; value?: undefined; } on TypeScript 6 and { value?: undefined; ok: false; error: string; } on TypeScript 7, and a mapped type over a union of keys lists its properties in each backend's union order. The library's hover options and the CLI (--sort-unions) take the option too.
Types of values you don't have
To pin what a function infers for an argument you have no value for, declare the argument in a fixture file. A declare const in the test file itself has no runtime value, so the test throws a ReferenceError when it runs.
// test/groupBy.fixture.ts, read for types only, never run
import { groupBy, type User } from "../src/users";
declare const input: User[];
export const byName = groupBy(input, (user) => user.name);
// test/users.test.ts
expect(inferredType(new URL("./groupBy.fixture.ts", import.meta.url), { name: "byName" }))
.toMatchInlineSnapshot(`"Record<string, User[]>"`);
Readability checks
A type can be right and still print in a form a reader has to work out. inferredTypeIssues(file, selector) returns those places in a target's printed type (an empty array means none), and typeReadabilityIssues(text, rules?) in any type text. The default rules:
utility-type: an unresolved utility type with type arguments, at any depth:Omit,Pick,Partial,Required,Readonly,Exclude,Extract,NonNullable,ReturnType,Parameters,ConstructorParameters,InstanceType,Awaited,ThisParameterType,OmitThisParameter(exported asDEFAULT_UTILITY_TYPES). Only the outermost of nested ones is reported. One over a type parameter of the printed signature (Omit<T, "id">in<T>(value: T) => Omit<T, "id">) is not, since nothing can resolve it beforeTis known.Record,Promise,Array, and other generic types are not flagged.object-intersection: an intersection with an object type, such asUser & { id: string; }or a mapped type.string & {}, which keeps literal suggestions, is not flagged.truncation:... 3 more ...,{ ...; }, a...placeholder, and text cut at the length limit. The helpers print untruncated types unlessfull: false, so this mostly catchesfull: falseand text from elsewhere.
The text is read with the TypeScript scanner and parser, so a string literal type like "Omit<" or "..." is not flagged, nor is a rest parameter or spread tuple. Each issue is { rule, text, offset, message }. Text that doesn't parse even with truncation markers removed (cut at the length limit) gets truncation issues only.
rules takes utilityTypes (the names to flag, e.g. [...DEFAULT_UTILITY_TYPES, "DeepPartial"], or false), objectIntersections and truncation (false turns them off), and allow, fragments that are fine as printed:
expect(
inferredTypeIssues(import.meta.url, { name: "userId", rules: { allow: ['string & { readonly __brand: "UserId"; }'] } }),
).toEqual([]);
typeprobe MCP 질문
typeprobe MCP를 Claude Code에 추가하려면 어떻게 하나요?
터미널에서 claude mcp add typeprobe -- npx -y typeprobe를 실행합니다. 모든 프로젝트에서 사용할 수 있게 하려면 --scope user를 추가합니다.
typeprobe MCP를 Cursor에 추가하려면 어떻게 하나요?
~/.cursor/mcp.json를 열고 mcpServers 아래에 서버를 추가합니다. 위 설치 섹션에 표시된 Cursor 구성을 사용합니다.
typeprobe MCP는 어떤 도구를 제공하나요?
12개 도구를 제공합니다. 예: hover_by_name, hover, batch_hover, completions, diagnostics.
typeprobe가 AI 에이전트에게 어떤 도움을 주나요?
에이전트가 추측할 필요 없이 TypeScript 컴파일러에 쿼리하여 추론된 타입, 완성 기능 및 진단 정보를 가져올 수 있게 합니다.
Claude Code에서 typeprobe를 어떻게 설치하나요?
플러그인 marketplace 명령어를 사용하여 설치할 수 있습니다: /plugin marketplace add clockblocker/typeprobe 및 /plugin install typeprobe@typeprobe.