1. MCP
MCP๋ ํด๋ผ์ด์ธํธ(AI ๋๊ตฌ)์ ์๋ฒ(๋๊ตฌ ์ ๊ณต์) ์ฌ์ด๋ฅผ ์๋ JSON-RPC ๊ธฐ๋ฐ ํ๋กํ ์ฝ์ด๋ค.
[AI ๋๊ตฌ] - [MCP Server] - [ํ์ผ / API / DB]
MCP ์๋ฒ ํ๋๊ฐ "ํ์ผ ์ฝ๊ธฐ", "DB ์กฐํ", "GitHub PR ์์ฑ" ๊ฐ์ ํด(Tool)์ ์ ์ํ๋ฉด, AI๊ฐ ์์ ์ค์ ๊ทธ ํด์ ์๋์ผ๋ก ํธ์ถํ๋ค. ์๋ฅผ ๋ค์ด "์ด ํ๋ก์ ํธ์ DB ์คํค๋ง๋ฅผ ๋ณด๊ณ ๋ง์ด๊ทธ๋ ์ด์ ์ฝ๋ ์ง์ค"๋ผ๊ณ ํ๋ฉด AI๊ฐ MCP๋ฅผ ํตํด ์ค์ DB์ ์ ๊ทผํ ๋ค ์ฝ๋๋ฅผ ์์ฑํ๋ค.
| ๋ฐฉ์ | ์ค๋ช | ์ฃผ์ ์ฌ์ฉ์ฒ |
| stdio | ํ์ค ์ ์ถ๋ ฅ์ผ๋ก ํต์ . ๋ก์ปฌ ํ๋ก์ธ์ค๋ฅผ ์ง์ ์คํ | npx, node, python ๋ก์ปฌ ์คํ |
| HTTP (SSE / Streamable) | HTTP๋ก ํต์ . ์๊ฒฉ ์๋ฒ ์ ์ ๊ฐ๋ฅ | Docker ์๋ฒ, ์๊ฒฉ ๋ฐฐํฌ |
2. MCP ์ค์
MCP ์๋ฒ๋ ๊ฐ ๋๊ตฌ์ ์ค์ ํ์ผ์ JSON ํ์์ผ๋ก ๋ฑ๋กํ๋ค.
๋๊ตฌ๋ณ ์ ์ญ ์ค์
์ ์ญ ์ค์ ์ด๋ ํน์ ํ๋ก์ ํธ๊ฐ ์๋ ๋ด PC ์ ์ฒด์ ์ ์ฉ๋๋ ์ค์ ์ด๋ค. ํน์ ํ๋ก์ ํธ์๋ง ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด ํ๋ก์ ํธ ๋ฃจํธ์ .mcp.json์ ๋ง๋ค๋ฉด ๋๋ค.
| ๋๊ตฌ | ์ ์ญ ์ค์ ํ์ผ ๊ฒฝ๋ก |
| Claude Code | ~/.claude.json |
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Copilot | OS ๋ง๋ค ๋ค๋ฅด๊ณ servers ๊ฐ์ผ๋ก ์ค์ ํ์ |
Windows์์ ~๋ %HOMEPATH%(C:\Users\yourname)์ ํด๋นํ๋ค.
{
"mcpServers": {
"์๋ฒ์ด๋ฆ": {
"command": "์คํ๋ช
๋ น์ด",
"args": ["์ธ์1", "์ธ์2"],
"env": {
"API_KEY": "your-key"
}
},
"sse-์๋ฒ์ด๋ฆ": {
"url": "http://localhost:3000/sse"
}
}
}
3. npx : ๊ณต์ ์๋ฒ๋ฅผ ์ฆ์ ๋ถ์ด๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ
npx๋ npm์ ์ฌ๋ผ์จ ํจํค์ง๋ฅผ ์ค์น ์์ด ์ฆ์ ์คํํด ์ฃผ๋ Node.js ๋๊ตฌ์ด๋ค.
๊ณต์ MCP ์๋ฒ๋ค์ด ๋๋ถ๋ถ npm์ ๋ฐฐํฌ๋์ด ์์ด ๊ฐ์ฅ ๊ฐํธํ๊ฒ ์์ํ ์ ์๋ค.
# Node.js 18+ ์ค์น ํ์ธ (์์ผ๋ฉด https://nodejs.org)
node -v
์ฌ์ฉํ๋ ค๋ ์๋ฒ๋ฅผ ์ฐพ์ ๋ค, ํด๋น ์๋ฒ์ ๊ณต์ ๋ฌธ์์์ ์ ๊ณตํ๋ ์ค์ ์์๋ฅผ ๋ณต์ฌํด์ ์ค์ ํ์ผ์ ๋ถ์ฌ๋ฃ์ผ๋ฉด ๋๋ค.
Windows ๋ค์ดํฐ๋ธ ํ๊ฒฝ(WSL ์๋)์์๋ npx๋ฅผ ์ง์ ์คํํ๋ฉด "Connection closed" ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
cmd /c ๋ํผ๋ก ๊ฐ์ธ์ฃผ๋ฉด ํด๊ฒฐ๋๋ค.
{
"mcpServers": {
"my-server": {
"command": "cmd",
"args": ["/c", "npx", "-y", "ํจํค์ง๋ช
", "์ถ๊ฐ์ธ์..."]
}
}
}
4. Node.js : JS/TS๋ก ์ปค์คํ ์๋ฒ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
์ฌ๋ด API ์ฐ๋, ๋ ์์ ์ธ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ฐ์ด ๊ณต์ ์๋ฒ์ ์๋ ๊ธฐ๋ฅ์ ์ง์ ๋ง๋ค ๋ ์ฌ์ฉํ๋ค.
- ํ๋ก์ ํธ ์ด๊ธฐํ ๋ฐ ์๋ฒ ์ฝ๋
mkdir my-mcp-server && cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node
// src/index.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({ name: "my-custom-server", version: "1.0.0" });
server.tool(
"get_deployment_status",
"์๋น์ค ๋ฐฐํฌ ์ํ๋ฅผ ์กฐํํฉ๋๋ค",
{ service: z.string().describe("์๋น์ค ์ด๋ฆ") },
async ({ service }) => {
const res = await fetch(`https://api.example.com/api/status/${service}`);
const data = await res.json();
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
}
);
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);
- ๋น๋ ํ ์ค์ ํ์ผ์ ๋ฑ๋ก
npx tsc
{
"mcpServers": {
"my-server": {
"command": "node",
"args": ["/absolute/path/to/my-mcp-server/dist/index.js"],
"env": { "DEPLOY_API_KEY": "your-api-key" }
}
}
}
๊ฒฝ๋ก๋ ๋ฐ๋์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ค. ์๋ ๊ฒฝ๋ก๋ AI ๋๊ตฌ ์คํ ์์น์ ๋ฐ๋ผ ์ค๋์ํ ์ ์๋ค.
5. Python/uvx : AI, ๋ฐ์ดํฐ ๋๊ตฌ๋ฅผ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ
uv๋ pip๋ณด๋ค ๋น ๋ฅธ Python ํจํค์ง ๊ด๋ฆฌ์์ด๊ณ , uvx๋ Python ํจํค์ง๋ฅผ ์ค์น ์์ด ์ฆ์ ์คํํด ์ฃผ๋ npx์ Python ๋ฒ์ ์ด๋ค.
ํฌ๋กค๋ง, ๋ฐ์ดํฐ ๋ถ์, AI ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฐ MCP ์๋ฒ์ ์ ์ฉํ๋ค.
# uv ์ค์น (macOS/Linux)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows PowerShell (๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์คํ)
# PowerShell: Windows์ ๋ด์ฅ๋ ๋ช
๋ น์ค ์
ธ๋ก, macOS Terminal(zsh/bash)์ ํด๋นํ๋ค.
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
- ์ค์ ํ์ผ์ ๋ฑ๋ก
{
"mcpServers": {
"playwright": {
"command": "uvx",
"args": ["mcp-playwright"]
},
"data-analysis": {
"command": "python",
"args": ["/absolute/path/server.py"]
}
}
}
- Python์ผ๋ก ์ง์ ์๋ฒ ์์ฑ
# server.py
from mcp.server.fastmcp import FastMCP
import pandas as pd
mcp = FastMCP("data-analysis-server")
@mcp.tool()
def analyze_csv(filepath: str) -> str:
"""CSV ํ์ผ์ ์ฝ์ด ๊ธฐ๋ณธ ํต๊ณ๋ฅผ ๋ฐํํฉ๋๋ค"""
df = pd.read_csv(filepath)
return df.describe().to_string()
if __name__ == "__main__":
mcp.run()
# uvx๋ก ์คํํ๋ ๊ฒฝ์ฐ: ๋ณ๋ ์ค์น ๋ถํ์
# python server.py๋ก ์ง์ ์คํํ๋ ๊ฒฝ์ฐ: ์๋ ํจํค์ง ์ค์น ํ์
pip install mcp pandas
6. HTTP ๋ฐฉ์ (Docker, ์๊ฒฉ URL) : ์๊ฒฉ์ผ๋ก ์ด์ํ๋ ๋ฐฉ๋ฒ
stdio ๋ฐฉ์์ด ๋ก์ปฌ ํ๋ก์ธ์ค๋ฅผ ์ง์ ์คํํ๋ ๊ฒ์ด๋ผ๋ฉด, HTTP ๋ฐฉ์์ ์ด๋๊ฐ์ ๋ ์๋ ์๋ฒ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ด๋ค.
- Docker ์ด๋ฏธ์ง๋ฅผ ์คํํด์ MCP ์๋ฒ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ์ด๋ฏธ ๋ฐฐํฌ๋ ์๋ฒ์ URL๋ก ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ
Docker๋ก MCP ์๋ฒ ์คํํ๊ธฐ
Docker๋ ๋๊ตฐ๊ฐ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋ฐฐํฌํ ํ๋ก๊ทธ๋จ(์ด๋ฏธ์ง)์ ๋ด PC์์ ๊ทธ๋๋ก ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ๋ค. Docker ์ด๋ฏธ์ง๋ Ubuntu, Debian, Alpine Linux ๋ฑ ๋ค์ํ Linux ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค. ๋๊ตฐ๊ฐ Docker ์ด๋ฏธ์ง๋ก ๋ฐฐํฌํด๋ MCP ์๋ฒ๊ฐ ์๋ค๋ฉด ํ๊ฒฝ์ ๊ทธ๋๋ก ํฌ์ฅํด์ ์ด๋์๋ ๋์ผํ๊ฒ ์คํํ ์ ์๋ค.
[๋ด ๋งฅ๋ถ] → [Docker ์ปจํ
์ด๋ (Linux ๋ด๋ถ)]
[ํ์ PC] → [๋์ผํ ์ปจํ
์ด๋] ← ํญ์ ๋์ผํ ํ๊ฒฝ
[ํ์ฌ ์๋ฒ] → [๋์ผํ ์ปจํ
์ด๋]
์ค์น ํ ์ค์ ํ์ผ์ ์๋์ฒ๋ผ ๋ฑ๋กํ๋ฉด ๋๋ค. command๋ก Docker๋ฅผ ์ง์ ์คํํ๋ stdio ๋ฐฉ์์ด๋ค.
- run: ์ด๋ฏธ์ง๋ฅผ ์คํ
- -i: stdio๋ก ํต์ (AI ๋๊ตฌ์ ์ ์ถ๋ ฅ ์ฐ๊ฒฐ)
- --rm: ์ข ๋ฃ ์ ์ปจํ ์ด๋ ์๋ ์ญ์
- -e MY_API_KEY: ํ๊ฒฝ๋ณ์๋ฅผ ์ปจํ ์ด๋ ์์ผ๋ก ์ ๋ฌ
- ๋ง์ง๋ง ์ค: ์คํํ Docker ์ด๋ฏธ์ง ์ด๋ฆ (์ฌ์ฉํ๋ MCP ์๋ฒ์ ๋ฐ๋ผ ๋ค๋ฆ)
{
"mcpServers": {
"my-docker-mcp": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MY_API_KEY",
"some-org/some-mcp-server:latest"
],
"env": {
"MY_API_KEY": "${MY_API_KEY}"
}
}
}
}
Windows์์ WSL์ ๊ฑฐ์น๋ ๊ฒฝ์ฐ, Docker ๋ช ๋ น์ด๋ฅผ WSL์ ํตํด ์คํํ๋ ํจํด๋ ์์ฃผ ์ฐ์ธ๋ค.
{
"mcpServers": {
"my-docker-mcp": {
"command": "C:\\Windows\\System32\\wsl.exe",
"args": [
"-d", "Ubuntu", "--", "bash", "-lc",
"docker run -i --rm -e MY_API_KEY some-org/some-mcp-server:latest"
],
"env": {
"MY_API_KEY": "${MY_API_KEY}",
"WSLENV": "MY_API_KEY/u"
}
}
}
}
์ด๋ฏธ ์๋ ์๋ฒ์ URL๋ก ์ฐ๊ฒฐํ๊ธฐ
Docker ์์ด ์ด๋ฏธ ๋ฐฐํฌ๋ ์ธ๋ถ MCP ์๋ฒ๋ SaaS ํํ์ ์๋น์ค์ ์ ์ํ ๋๋ command ์์ด url๋ง์ผ๋ก ๋ฑ๋กํ ์ ์๋ค.
์ธ์ฆ์ด ํ์ํ๋ฉด headers๋ฅผ ์ถ๊ฐํ๋ค.
{
"mcpServers": {
"remote-server": {
"url": "https://example.com/mcp/sse",
"headers": { "Authorization": "Bearer YOUR_TOKEN" }
}
}
}
7. ๋ณด์, ๋๋ฒ๊น
API ํค ๋ ธ์ถ ์ฃผ์
.mcp.json์ git์ ์ปค๋ฐํ ๋ API ํค๋ฅผ ์ง์ ์ฐ๋ฉด ํค๊ฐ ๊ทธ๋๋ก ์ฌ๋ผ๊ฐ๋ค. ๋ฐ๋์ ํ๊ฒฝ๋ณ์๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค.
// ์ํ
"env": { "GITHUB_TOKEN": "your_github_token" }
// ์์
"env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }
// ํ๊ฒฝ ๋ณ์ ๋ฑ๋ก
# macOS/Linux (~/.zshrc ๋๋ ~/.bashrc)
export GITHUB_TOKEN="ghp_xxxx"
# Windows PowerShell
[System.Environment]::SetEnvironmentVariable("GITHUB_TOKEN", "ghp_xxxx", "User")
ํ๊ณผ .mcp.json์ ๊ณต์ ํ๋ฉด์ ํค๋ฅผ ์ง์ ์จ์ผ ํ ๊ฒฝ์ฐ์ .gitignore์ ์ถ๊ฐํ๋ค.
.mcp.json
.env
MCP Inspector ๊ณต์ ๋๋ฒ๊น ๋๊ตฌ
์๋ฒ๊ฐ AI ๋๊ตฌ์์ ์ธ์์ด ์ ๋ ๋, Inspector๋ก ์๋ฒ ์์ฒด๊ฐ ์ ์์ธ์ง ๋จผ์ ํ์ธํ๋ค. ๋ธ๋ผ์ฐ์ ์์ http://localhost:6274 ์ ์ → Transport / Command / Arguments ์ ๋ ฅ → Connect → ํด ๋ชฉ๋ก ํ์ธ ๋ฐ ์ง์ ํธ์ถ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค.
npx @modelcontextprotocol/inspector