๐ŸŒฑ <groot/>
AI๊ฐ€ '์ด ๋ฒ„ํŠผ ๊ณ ์ณ์ค˜'๋ฅผ ์•Œ์•„๋“ฃ๊ฒŒ ํ•˜๊ธฐ โ€” ์ฝ”๋“œ ๋กœ์ผ€์ดํ„ฐ๋ฅผ MCP๋กœ ์—ด๋‹ค | Groot's Tech Blog
๐ŸŒWeb

AI๊ฐ€ '์ด ๋ฒ„ํŠผ ๊ณ ์ณ์ค˜'๋ฅผ ์•Œ์•„๋“ฃ๊ฒŒ ํ•˜๊ธฐ โ€” ์ฝ”๋“œ ๋กœ์ผ€์ดํ„ฐ๋ฅผ MCP๋กœ ์—ด๋‹ค

2026.07.02ยท5๋ถ„ ์ฝ๊ธฐ

react-code-locator ์‹œ๋ฆฌ์ฆˆ์˜ ๋งˆ์ง€๋ง‰ ๊ธ€. ์ง€๊ธˆ๊นŒ์ง€๋Š” ์‚ฌ๋žŒ์ด ํ™”๋ฉด์—์„œ ์šฐํด๋ฆญํ•ด ์†Œ์Šค๋กœ ์ ํ”„ํ•˜๋Š” ์ด์•ผ๊ธฐ์˜€๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์š”์ฆ˜์€ ์ฝ”๋“œ๋ฅผ ๊ณ ์น˜๋Š” ์ฃผ์ฒด๊ฐ€ ์‚ฌ๋žŒ๋งŒ์ด ์•„๋‹ˆ๋‹ค. AI ์—์ด์ „ํŠธ๋„ ๊ณ ์นœ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด AI์—๊ฒŒ๋„ "์ด ํ™”๋ฉด ์š”์†Œ โ†’ ์ด ์†Œ์Šค ํŒŒ์ผ"์„ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ? ์ด ์งˆ๋ฌธ์—์„œ MCP ํ™•์žฅ์ด ์‹œ์ž‘๋๋‹ค.

AI๊ฐ€ ๋ชป ํ‘ธ๋Š” ๋ฌธ์ œ

AI ์—์ด์ „ํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๊ฑด ๊ฝค ์ž˜ํ•œ๋‹ค.

  • ํ…์ŠคํŠธ๋กœ, CSS ์…€๋ ‰ํ„ฐ๋กœ, ์—ญํ• (role)๋กœ, ์ ‘๊ทผ์„ฑ ํŠธ๋ฆฌ๋กœ, ํ™”๋ฉด ์ขŒํ‘œ๋กœโ€ฆ

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ๋ง‰ํžŒ๋‹ค.

  • "์ด ๋ฒ„ํŠผ"์ด ์–ด๋А ํŒŒ์ผ์— ์žˆ์ง€?
  • ๊ณ ์ณ์•ผ ํ•  ๊ณณ์ด **๋‚ด๊ฐ€ ์“ด ์ž๋ฆฌ(ํ™”๋ฉด)**์•ผ, ์•„๋‹ˆ๋ฉด ๊ณต์œ  ์ปดํฌ๋„ŒํŠธ ์ •์˜์•ผ?
  • styled(), memo, forwardRef, ๋””์ž์ธ ์‹œ์Šคํ…œ ๋ž˜ํผ์— ์•ˆ ๋น ์ง€๊ณ  ์ง„์งœ ํŽธ์ง‘ ์ง€์ ์„ ์–ด๋–ป๊ฒŒ ์ฐพ์ง€?

์ฆ‰ AI์—๊ฒŒ ๋ถ€์กฑํ•œ ๊ฑด "์š”์†Œ ์ฐพ๊ธฐ"๊ฐ€ ์•„๋‹ˆ๋ผ "์š”์†Œ โ†’ ์˜ฌ๋ฐ”๋ฅธ ์†Œ์Šค ์œ„์น˜ ๋งคํ•‘" ์ด๋‹ค. ์ด๊ฑด ์ •ํ™•ํžˆ react-code-locator๊ฐ€ ํ•˜๋Š” ์ผ์ด๋‹ค. ์ด ๋„๊ตฌ๋Š” ์š”์†Œ๋ฅผ ์ฐพ๋Š” ์—”์ง„์ด ์•„๋‹ˆ๋ผ ์ฝ”๋“œ ๋งคํ•‘ ์—”์ง„์— ๊ฐ€๊น๋‹ค.

MCP๊ฐ€ ๋ญ”๊ฐ€, ๊ทธ๋ฆฌ๊ณ  ์™œ ์—ฌ๊ธฐ์— ๋งž๋‚˜

MCP(Model Context Protocol) ๋Š” AI ์—์ด์ „ํŠธ๊ฐ€ ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ๊ตฌ์กฐํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํ‘œ์ค€์ด๋‹ค. ์„œ๋ฒ„๊ฐ€ "์ด๋Ÿฐ ๋„๊ตฌ๊ฐ€ ์žˆ๊ณ , ์ž…๋ ฅ์€ ์ด๋Ÿฐ ๋ชจ์–‘์ด์•ผ"๋ฅผ ์„ ์–ธํ•˜๋ฉด, AI๊ฐ€ ๊ทธ ๋„๊ตฌ๋ฅผ ํ•„์š”ํ•  ๋•Œ ํ˜ธ์ถœํ•œ๋‹ค.

MCP๋Š” ๋กœ์ผ€์ดํ„ฐ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋กœ์ผ€์ดํ„ฐ๋ฅผ AI๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋กœ ๋…ธ์ถœํ•  ๋ฟ์ด๋‹ค. ํ๋ฆ„์€ ์ด๋ ‡๋‹ค.

  1. ์‚ฌ์šฉ์ž๊ฐ€ AI์—๊ฒŒ "์ฒดํฌ์•„์›ƒ ํŽ˜์ด์ง€์˜ ์ œ์ถœ ๋ฒ„ํŠผ ๊ณ ์ณ์ค˜"๋ผ๊ณ  ํ•œ๋‹ค
  2. AI๊ฐ€ ๋Œ€์ƒ ์š”์†Œ๋ฅผ ์‹๋ณ„ํ•œ๋‹ค
  3. MCP ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•ด ๊ทธ ์š”์†Œ์˜ ์†Œ์Šค ์œ„์น˜๋ฅผ ์–ป๋Š”๋‹ค
  4. AI๊ฐ€ ๊ทธ ํŒŒ์ผ์„ ์—ด์–ด ํŽธ์ง‘ํ•œ๋‹ค

๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ: ๋Ÿฐํƒ€์ž„ vs ์ •์  ์ธ๋ฑ์Šค

๋กœ์ผ€์ดํ„ฐ๋ฅผ AI์— ํƒœ์šฐ๋Š” ๊ธธ์€ ๋‘ ๊ฐ€์ง€์˜€๋‹ค.

A. ๋Ÿฐํƒ€์ž„(๋ธŒ๋ผ์šฐ์ € + Fiber) โ€” ์•ž์„  ๊ธ€๋“ค์—์„œ ๋งŒ๋“  ๊ทธ ๋ฐฉ์‹. Playwright๋กœ ํŽ˜์ด์ง€๋ฅผ ๋„์šฐ๊ณ , ์‹ค์ œ ๋ Œ๋”๋œ Fiber์—์„œ ์†Œ์Šค๋ฅผ ๋ฝ‘๋Š”๋‹ค. i18n ํ…์ŠคํŠธ๋‚˜ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”์ฒ˜๋Ÿผ ์‹คํ–‰๋ผ์•ผ๋งŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๊ฐ•ํ•˜๋‹ค. ๋Œ€์‹  ๊ฐœ๋ฐœ ์„œ๋ฒ„ยท๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

B. ์ •์  AST ์ธ๋ฑ์Šค โ€” ์ƒˆ๋กœ ๋งŒ๋“  react-code-locator-mcp. ๋ธŒ๋ผ์šฐ์ €๋„ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋„ ์—†์ด, ํ”„๋กœ์ ํŠธ์˜ JSX๋ฅผ ๋นŒ๋“œ ์—†์ด AST๋กœ ์ธ๋ฑ์‹ฑํ•ด ์งˆ์˜ํ•œ๋‹ค. ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๋น ๋ฅด๊ณ , ๊ตฌ์กฐ์  ์งˆ์˜์— ๊ฐ•ํ•˜๋‹ค.

์ด๋ฒˆ MCP ํ”„๋กœํ† ํƒ€์ž…์€ B๋กœ ๊ฐ”๋‹ค. AI ์›Œํฌํ”Œ๋กœ์—” "๋ธŒ๋ผ์šฐ์ € ์•ˆ ๋„์šฐ๊ณ  ๋ฐ”๋กœ ๋‹ต์ด ๋‚˜์˜ค๋Š”" ์ •์  ์ธ๋ฑ์Šค๊ฐ€ ํ›จ์”ฌ ์ž˜ ๋งž์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

"grep์œผ๋กœ ํ•˜๋ฉด ๋˜์ง€ ์•Š๋‚˜?"

๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜จ ๋ฐ˜๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ grep์€ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์ด๋ผ ํ•œ๊ณ„๊ฐ€ ๋šœ๋ ทํ•˜๋‹ค.

  • ๊ฐ™์€ ํ…์ŠคํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์— ์žˆ์œผ๋ฉด ๊ตฌ๋ถ„์„ ๋ชป ํ•œ๋‹ค
  • "onSubmit์„ ๊ฐ€์ง„ <button>" ๊ฐ™์€ ๊ตฌ์กฐ์  ์กฐ๊ฑด์„ ๋ชป ๊ฑด๋‹ค
  • styled(Button) ๋ž˜ํผ๋ฅผ ๋ชป ํ’€์–ด๋‚ธ๋‹ค

์ธ๋ฑ์Šค๋Š” AST์—์„œ ๋ฝ‘์€ ๊ตฌ์กฐ๋ผ ์ด๋Ÿฐ ๊ฑธ ํ•œ ๋ฐฉ์˜ ๊ตฌ์กฐ์  ์งˆ์˜๋กœ ๋‹ตํ•œ๋‹ค. ๊ทธ๊ฒƒ๋„ grep๊ธ‰ ์†๋„๋กœ. (300ํŒŒ์ผยท9์ฒœ ์š”์†Œ ์ฝ”ํผ์Šค ์‹ค์ธก: ์ฝœ๋“œ ์ฒซ ์งˆ์˜ ~25ms, ์›Œ์—„ ์บ์‹œ ~1.3ms. ํ…์ŠคํŠธ๊ฐ€ ๋ชจ๋“  ํŒŒ์ผ์— ์žˆ๋Š” ๋ชจํ˜ธํ•œ ์งˆ์˜์—์„œ grep์€ 300๊ฐœ ํžˆํŠธ, ์ธ๋ฑ์Šค๋Š” ์ •ํ™•ํžˆ 1๊ฑด.)

๋น„๊ฒฐ์€ "AST ํŒŒ์‹ฑ์ด ๋น„์‹ธ๋‹ค"๋Š” ํ†ต๋…์„ ์šฐํšŒํ•œ ๊ฒƒ์ด๋‹ค. ๋จผ์ € ๊ฐ’์‹ผ ๋ฆฌํ„ฐ๋Ÿด ์Šค์บ” (ripgrep)์œผ๋กœ ํ›„๋ณด ํŒŒ์ผ๋งŒ ์ถ”๋ฆฌ๊ณ , ๊ทธ ์ƒ์กด์ž๋“ค๋งŒ AST ํŒŒ์‹ฑํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฒซ ์งˆ์˜๋„ grep๊ณผ ๋น„์Šทํ•˜๊ณ , ๊ฐ™์€ ์„ธ์…˜ ์žฌ์งˆ์˜๋Š” ์บ์‹œ๋กœ ~15๋ฐฐ ๋นจ๋ผ์ง„๋‹ค.

MCP ์„œ๋ฒ„๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๋‹ค

MCP SDK๋กœ ๋„๊ตฌ ํ•˜๋‚˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฑด ๋†€๋ž„ ๋งŒํผ ๋‹จ์ˆœํ•˜๋‹ค. zod๋กœ ์ž…๋ ฅ ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๋ฉด AI๊ฐ€ ๊ทธ ๋ชจ์–‘๋Œ€๋กœ ํ˜ธ์ถœํ•œ๋‹ค.

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const index = new ProjectIndex(process.argv[2] ?? process.cwd());
const server = new McpServer({ name: "react-code-locator-mcp", version: "0.0.1" });

server.tool(
  "find_element",
  "JSX ์š”์†Œ๋ฅผ ๊ฐœ๋…์œผ๋กœ ์ฐพ์•„ ์ •ํ™•ํ•œ ์†Œ์Šค ์œ„์น˜(file:line:col)๋ฅผ ๋Œ๋ ค์ค€๋‹ค.",
  {
    text: z.string().optional(),      // ์š”์†Œ ์•ˆ์˜ ๋ฆฌํ„ฐ๋Ÿด ํ…์ŠคํŠธ
    testid: z.string().optional(),    // data-testid
    tag: z.string().optional(),       // "button" | "Card"
    component: z.string().optional(), // ๊ฐ์‹ธ๋Š” ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„
    hasProp: z.string().optional(),   // ์ด prop์„ ๊ฐ€์ง„ ๊ฒƒ๋งŒ
    dir: z.string().optional(),
    limit: z.number().optional(),
  },
  async (args) => {
    const results = index.find(args);
    return { content: [{ type: "text", text: JSON.stringify(results, null, 2) }] };
  },
);

์ด ๋ฐ–์— ์ธ๋ฑ์Šค๊ฐ€ ๋ช‡ ๊ฐœ์˜ ํŒŒ์ผ์„ ์ปค๋ฒ„ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” index_stats ๋„๊ตฌ๋„ ๊ฐ™์ด ๋…ธ์ถœํ•ด ๋’€๋‹ค. AI๊ฐ€ "์ธ๋ฑ์Šค๊ฐ€ ์ œ๋Œ€๋กœ ์žกํ˜”๋‚˜"๋ถ€ํ„ฐ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ.

๋Œ๋ ค์ฃผ๋Š” ๊ฒฐ๊ณผ์—” file:line:col๋ฟ ์•„๋‹ˆ๋ผ ๊ฐ์‹ธ๋Š” ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„๊ณผ ์กฐ์ƒ ํƒœ๊ทธ ์ฒด์ธ๊นŒ์ง€ ๋‹ด๋Š”๋‹ค. AI๊ฐ€ "์ด๊ฒŒ ๋งž๋Š” ์œ„์น˜์ธ์ง€" ํŒ๋‹จํ•  ๋ฌธ๋งฅ์„ ํ•จ๊ป˜ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

{ "source": "src/CheckoutPage.tsx:42:7", "tag": "button",
  "component": "CheckoutPage", "text": "๊ฒฐ์ œํ•˜๊ธฐ",
  "ancestors": ["form", "div", "CheckoutPage"] }

Claude Code ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ์—” ์ด๋ ‡๊ฒŒ ๋“ฑ๋กํ•œ๋‹ค.

{
  "mcpServers": {
    "react-locator": {
      "command": "node",
      "args": ["/abs/path/react-code-locator-mcp/dist/server.js",
               "/abs/path/your-react-app"]
    }
  }
}

์ด์ œ "์ฒดํฌ์•„์›ƒ ํŽ˜์ด์ง€์—์„œ ๊ฒฐ์ œ ๋ฒ„ํŠผ ์ฐพ์•„์ค˜" ๋ผ๊ณ  ํ•˜๋ฉด AI๊ฐ€ find_element๋ฅผ ํ˜ธ์ถœํ•ด ์ •ํ™•ํ•œ file:line:col์„ ๋ฐ›์•„ ์˜จ๋‹ค.

๋” ๊นŠ์€ ํ†ต์ฐฐ: ๊ฐ€์žฅ ๋ณดํŽธ์ ์ธ ์ง€์ ์€ ์–ด๋””์ธ๊ฐ€

MCP๋ฅผ ๋ถ™์ด๋ฉฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋‹ค์‹œ ์ƒ๊ฐํ•˜๊ฒŒ ๋๋‹ค. "React ํ”„๋กœ์ ํŠธ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์ง€์›ํ•˜๊ธฐ"์˜ ์ง„์งœ ๊ณตํ†ต ์ง€์ ์€ Babel๋„, ํŠน์ • ๋ฒˆ๋“ค๋Ÿฌ๋„ ์•„๋‹ˆ์—ˆ๋‹ค. ๋ฐ”๋กœ React element ํŒฉํ† ๋ฆฌ ํ˜ธ์ถœ์ด๋‹ค.

์–ด๋–ค ๋„๊ตฌ๋กœ JSX๋ฅผ ๋ณ€ํ™˜ํ•˜๋“ , ๊ฒฐ๊ตญ ์ฝ”๋“œ๋Š”

jsx("div", { children: "Hello" })   // ๋˜๋Š” jsxs / jsxDEV / React.createElement

๋กœ ์ˆ˜๋ ดํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์žฅ๊ธฐ์ ์œผ๋กœ ์ด์ƒ์ ์ธ ๊ตฌ์กฐ๋Š” ์ด๋ ‡๋‹ค.

  1. ๊ณตํ†ต ๋Ÿฐํƒ€์ž„ ์ฝ”์–ด โ€” element ๋ž˜ํ•‘ยท๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅยท๋Ÿฐํƒ€์ž„ ์กฐํšŒ
  2. ์–‡์€ ๋ณ€ํ™˜ ์–ด๋Œ‘ํ„ฐ โ€” Babel/SWC/esbuild/Vite/Webpack๋ณ„๋กœ ์†Œ์Šค ์œ„์น˜๋งŒ ๋ฝ‘์•„ ์ฝ”์–ด์— ๋„˜๊น€

๋‹จ, ํŒฉํ† ๋ฆฌ ๋ž˜ํ•‘๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๋‹ค. ๊ฐœ๋ฐœ ๋ชจ๋“œ์˜ jsxDEV๋Š” ์ง€๊ธˆ๋„ source ์ธ์ž๋กœ ํŒŒ์ผยท์ค„ยท์นธ์„ ๋ฐ›์ง€๋งŒ, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋‚˜ ์ผ๋ฐ˜ jsx ๋Ÿฐํƒ€์ž„์—์„œ๋Š” ๋ณดํ†ต ๊ทธ ์ •๋ณด๊ฐ€ ์—†๋‹ค. ํ™•์‹คํ•˜๊ฒŒ ์œ„์น˜๋ฅผ ์•„๋Š” ๊ฑด AST ๋…ธ๋“œ๋ฅผ ๋“ค๊ณ  ์žˆ๋Š” ๋ณ€ํ™˜ ๋‹จ๊ณ„๋ฟ์ด๋‹ค. ๊ทธ๋ž˜์„œ "๋ณ€ํ™˜ ์–ด๋Œ‘ํ„ฐ(์œ„์น˜ ์ฃผ์ž…) + ๊ณตํ†ต ๋Ÿฐํƒ€์ž„(์กฐํšŒ) + MCP(AI ์ธํ„ฐํŽ˜์ด์Šค)"์˜ 3์ธต ๊ตฌ์กฐ๊ฐ€ ๊ฐ€์žฅ ํ˜„์‹ค์ ์ด๋ผ๋Š” ๊ฒฐ๋ก ์— ๋‹ฟ์•˜๋‹ค.

MCP๊ฐ€ ํ’€์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ

์†”์งํ•œ ํ•œ๊ณ„๋„ ์ ์–ด๋‘”๋‹ค. MCP๋Š” "์ด ๋ฒ„ํŠผ์ด ๋ญ”์ง€"๋ฅผ ๋Œ€์‹  ์ •ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. AI๋Š” ์—ฌ์ „ํžˆ ์…€๋ ‰ํ„ฐยท์ขŒํ‘œยท์ด์ „์— ์„ ํƒํ•œ ์š”์†Œ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€์ƒ์„ ๋จผ์ € ์‹๋ณ„ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์ด ๋กœ์ผ€์ดํ„ฐ MCP๋Š” ์š”์†Œ ์‹๋ณ„ ์ดํ›„์— ๊ฐ€์žฅ ์“ธ๋ชจ๊ฐ€ ์žˆ๋‹ค โ€” ์‹๋ณ„๋œ ์š”์†Œ๋ฅผ "์˜ฌ๋ฐ”๋ฅธ ํŽธ์ง‘ ์ง€์ "์œผ๋กœ ๋ฐ๋ ค๋‹ค์ฃผ๋Š” ๋งˆ์ง€๋ง‰ ํ•œ ๊ฑธ์Œ.

์‹œ๋ฆฌ์ฆˆ๋ฅผ ๋งˆ์น˜๋ฉฐ

์‚ฌ์†Œํ•œ ๋ถˆํŽธ("์ด ๋ฒ„ํŠผ ์–ด๋А ํŒŒ์ผ์ด์•ผ?") ํ•˜๋‚˜์—์„œ ์‹œ์ž‘ํ•ด, AST ํŒŒ์‹ฑ โ†’ React Fiber โ†’ ์œ ๋‹ˆ๋ฒ„์„ค ๋ฒˆ๋“ค๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ โ†’ AI ์—์ด์ „ํŠธ์šฉ MCP๊นŒ์ง€ ์™”๋‹ค. ๋ฌธ์ œ ํ•˜๋‚˜๋ฅผ ๋๊นŒ์ง€ ํŒŒ๋ฉด, ๊ทธ ๊ณผ์ •์—์„œ ๋งŒ๋‚˜๋Š” ๊ณ๊ฐ€์ง€๋“ค์ด ์ „๋ถ€ ๊ฐ์ž์˜ ๋ฐฐ์›€์ด ๋œ๋‹ค๋Š” ๊ฑธ ๋‹ค์‹œ ๋А๊ผˆ๋‹ค. ๊ทธ๊ฒŒ ๋‚ด๊ฐ€ ๊ณ„์† ๋ญ”๊ฐ€๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ ๋‹ค.

โ† ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
ยฉ 2026 ยท Groot's Tech Blog. Built with Gatsby ๐ŸŒฑ