custom-database-mcp

custom-database-mcp is a library for building custom databases using JavaScript. It allows for easy data storage, retrieval, and updating, with flexible schema design. Designed for beginners to intermediate users, it offers a rich set of features.

GitHub Stars

0

User Rating

Not Rated

Favorites

0

Views

31

Forks

0

Issues

0

README
๐Ÿ—ƒ๏ธ Database-MCP

License: MIT
Node.js Version
npm Version

๊ฐ•๋ ฅํ•˜๊ณ  ์•ˆ์ „ํ•œ ๋‹ค์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค MCP ์„œ๋ฒ„ - MySQL, MariaDB, PostgreSQL์„ ๋™์‹œ์— ์ง€์›ํ•˜๋Š” Model Context Protocol ์„œ๋ฒ„

๐Ÿš€ ์ฃผ์š” ํŠน์ง•
๐Ÿ—„๏ธ ๋‹ค์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ง€์›
  • MySQL, MariaDB, PostgreSQL ๋™์‹œ ์—ฐ๊ฒฐ ๋ฐ ๊ด€๋ฆฌ
  • ๋ฌด์ œํ•œ DB ์ถ”๊ฐ€ - JSON ์„ค์ •์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™•์žฅ
  • ๋™์  DB ์„ ํƒ - ๋„๊ตฌ๋ณ„๋กœ ์‚ฌ์šฉํ•  DB๋ฅผ ์‹ค์‹œ๊ฐ„ ์„ ํƒ
๐Ÿ”’ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋ณด์•ˆ
  • ํ™˜๊ฒฝ๋ณ„ ์ ‘๊ทผ ์ œ์–ด (local/test/production)
  • SQL Injection ๋ฐฉ์ง€ - Prepared Statement ๊ฐ•์ œ ์‚ฌ์šฉ
  • ์œ„ํ—˜ํ•œ ์ฟผ๋ฆฌ ์ฐจ๋‹จ - DROP, TRUNCATE ๋“ฑ ์ž๋™ ์ฐจ๋‹จ
  • ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋ณดํ˜ธ - ์ฝ๊ธฐ ์ „์šฉ ๋˜๋Š” ์™„์ „ ์ฐจ๋‹จ
โšก ๊ณ ์„ฑ๋Šฅ ์•„ํ‚คํ…์ฒ˜
  • ์ปค๋„ฅ์…˜ ํ’€๋ง - DB๋ณ„ ์ตœ์ ํ™”๋œ ์—ฐ๊ฒฐ ๊ด€๋ฆฌ
  • ์ง€์—ฐ ์ดˆ๊ธฐํ™” - ํ•„์š”์‹œ์—๋งŒ ์—ฐ๊ฒฐ ์ƒ์„ฑ
  • ๊ฒฐ๊ณผ ์ œํ•œ - ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์•ˆ์ „ ์ฒ˜๋ฆฌ
๐Ÿ› ๏ธ ๊ฐœ๋ฐœ์ž ์นœํ™”์ 
  • ์ง๊ด€์ ์ธ API - ๊ฐ„๋‹จํ•˜๊ณ  ์ผ๊ด€๋œ ๋„๊ตฌ ์ธํ„ฐํŽ˜์ด์Šค
  • ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง - ์—ฐ๊ฒฐ ์ƒํƒœ ๋ฐ ํ†ต๊ณ„ ํ™•์ธ
  • ํฌ๊ด„์ ์ธ ๋ฌธ์„œ - ์ƒ์„ธํ•œ ๊ฐ€์ด๋“œ ๋ฐ ์˜ˆ์ œ ์ œ๊ณต
๐Ÿ“Š ์ง€์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „ ์ƒํƒœ ํŠน์ง•
MySQL 5.7+ โœ… ์™„์ „ ์ง€์› ํ‘œ์ค€ SQL, ํŠธ๋žœ์žญ์…˜
MariaDB 10.3+ โœ… ์™„์ „ ์ง€์› MySQL ํ˜ธํ™˜, ๊ณ ์„ฑ๋Šฅ
PostgreSQL 12+ โœ… ์™„์ „ ์ง€์› ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ, JSONB
๐ŸŽฏ ๋น ๋ฅธ ์‹œ์ž‘
1๏ธโƒฃ ์„ค์น˜
git clone https://github.com/Yoon-jongho/custom-database-mcp.git
cd custom-database-mcp
npm install
2๏ธโƒฃ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •
# ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ
cp .env.example .env.local

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด ์ž…๋ ฅ
vim .env.local
3๏ธโƒฃ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ
# ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ (์„ ํƒ์ )
node test-client.js
4๏ธโƒฃ Claude Desktop ์—ฐ๊ฒฐ
Step 1: Claude Desktop ์„ค์น˜

Claude Desktop์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

Step 2: MCP ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •

macOS:

# ์„ค์ • ํŒŒ์ผ ์—ด๊ธฐ
vim ~/Library/Application\ Support/Claude/claude_desktop_config.json

Windows:

# ์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ
%APPDATA%\Claude\claude_desktop_config.json
Step 3: Database-MCP ์„œ๋ฒ„ ๋“ฑ๋ก

์„ค์ • ํŒŒ์ผ์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

{
  "mcpServers": {
    "database-mcp": {
      "command": "node",
      "args": ["/์ ˆ๋Œ€/๊ฒฝ๋กœ/database-mcp/src/index.js"],
      "env": {
        "NODE_ENV": "local"
      }
    }
  }
}

๐Ÿ’ก ์ค‘์š”: /์ ˆ๋Œ€/๊ฒฝ๋กœ/database-mcp๋ฅผ ์‹ค์ œ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”!

์˜ˆ์‹œ:

{
  "mcpServers": {
    "database-mcp": {
      "command": "node", 
      "args": ["/Users/username/projects/database-mcp/src/index.js"],
      "env": {
        "NODE_ENV": "local"
      }
    }
  }
}
Step 4: Claude Desktop ์žฌ์‹œ์ž‘
  1. Claude Desktop์„ ์™„์ „ํžˆ ์ข…๋ฃŒ
  2. ๋‹ค์‹œ ์‹œ์ž‘
  3. ์ƒˆ๋กœ์šด ๋Œ€ํ™”์—์„œ Database-MCP ๋„๊ตฌ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธ
Step 5: ์—ฐ๊ฒฐ ํ™•์ธ

Claude Desktop์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ…Œ์ŠคํŠธํ•ด๋ณด์„ธ์š”:

Database-MCP ์„œ๋ฒ„์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด์ค˜

์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชฉ๋ก๊ณผ ์—ฐ๊ฒฐ ์ƒํƒœ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

โš™๏ธ ์„ค์ • ์˜ˆ์ œ
Single DB ์„ค์ • (๊ฐ„๋‹จ)
# .env.local
DB_HOST=localhost
DB_PORT=3306
DB_USER=myuser
DB_PASSWORD=mypassword
DB_DATABASE=mydatabase
Multi DB ์„ค์ • (๊ถŒ์žฅ)
# .env.local
DATABASES='[
  {
    "name": "main_db",
    "host": "localhost",
    "port": 3306,
    "user": "mysql_user",
    "password": "mysql_password",
    "database": "app_database",
    "type": "mysql",
    "description": "๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ DB"
  },
  {
    "name": "analytics_db",
    "host": "localhost",
    "port": 5432,
    "user": "postgres_user",
    "password": "postgres_password",
    "database": "analytics_warehouse",
    "type": "postgresql",
    "description": "๋ฐ์ดํ„ฐ ๋ถ„์„์šฉ DB"
  }
]'

DEFAULT_DATABASE=main_db
๐Ÿ› ๏ธ ์‚ฌ์šฉ๋ฒ•
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชฉ๋ก ์กฐํšŒ
{
  name: "list_databases",
  arguments: {}
}
ํŠน์ • DB์˜ ํ…Œ์ด๋ธ” ์กฐํšŒ
{
  name: "list_tables",
  arguments: {
    database_name: "analytics_db"
  }
}
์ฟผ๋ฆฌ ์‹คํ–‰ (์•ˆ์ „ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉ)
{
  name: "execute_query",
  arguments: {
    query: "SELECT * FROM users WHERE age > ? AND city = ?",
    params: ["25", "Seoul"],
    database_name: "main_db"
  }
}
์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ
{
  name: "check_db_connections",
  arguments: {}
}
๐Ÿ”ง ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
Claude Desktop ์—ฐ๊ฒฐ ๋ฌธ์ œ
โŒ "Server disconnected" ์˜ค๋ฅ˜

์›์ธ: JSON ํŒŒ์‹ฑ ์˜ค๋ฅ˜ ๋˜๋Š” stdout ์ถœ๋ ฅ ๊ฐ„์„ญ

ํ•ด๊ฒฐ์ฑ…:

  1. .env.local์—์„œ MCP_DEBUG=false ํ™•์ธ
  2. Claude Desktop ์™„์ „ ์žฌ์‹œ์ž‘
  3. ์ ˆ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ์ •ํ™•ํ•œ์ง€ ํ™•์ธ
# ๊ฒฝ๋กœ ํ™•์ธ
pwd
# ์ถœ๋ ฅ ์˜ˆ: /Users/username/projects/database-mcp
โŒ "Tool not found" ์˜ค๋ฅ˜

์›์ธ: MCP ์„œ๋ฒ„๊ฐ€ ๋“ฑ๋ก๋˜์ง€ ์•Š์Œ

ํ•ด๊ฒฐ์ฑ…:

  1. claude_desktop_config.json ๋ฌธ๋ฒ• ํ™•์ธ
  2. JSON ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ๊ฒ€์ฆ
  3. Node.js ๋ฒ„์ „ ํ™•์ธ (18.0.0 ์ด์ƒ)
node --version  # v18.0.0 ์ด์ƒ์ด์–ด์•ผ ํ•จ
โŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์‹คํŒจ

์›์ธ: ์ž˜๋ชป๋œ DB ์„ค์ • ๋˜๋Š” DB ์„œ๋ฒ„ ์ค‘๋‹จ

ํ•ด๊ฒฐ์ฑ…:

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ
  2. .env.local ์„ค์ • ๊ฒ€์ฆ
  3. ๋ฐฉํ™”๋ฒฝ ์„ค์ • ํ™•์ธ
# MySQL ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ
mysql -h localhost -P 3306 -u username -p

# PostgreSQL ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ  
psql -h localhost -p 5432 -U username -d database
์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ
์„ฑ๋Šฅ ์ด์Šˆ
  • ์ปค๋„ฅ์…˜ ํ’€ ํฌ๊ธฐ ์กฐ์ •: ํ™˜๊ฒฝ๋ณ€์ˆ˜ DB_POOL_SIZE ์„ค์ •
  • ์ฟผ๋ฆฌ ํƒ€์ž„์•„์›ƒ: ํ™˜๊ฒฝ๋ณ€์ˆ˜ DB_TIMEOUT ์„ค์ •
  • ๊ฒฐ๊ณผ ์ œํ•œ: ํ™˜๊ฒฝ๋ณ€์ˆ˜ MAX_ROWS ์„ค์ •
๋ณด์•ˆ ๊ฒฝ๊ณ 
  • ํ”„๋กœ๋•์…˜ ์ ‘๊ทผ ์ฐจ๋‹จ: NODE_ENV=production์—์„œ ์ž๋™ ์ฐจ๋‹จ๋จ
  • ์œ„ํ—˜ํ•œ ์ฟผ๋ฆฌ: DROP, TRUNCATE ๋“ฑ์€ ์ž๋™์œผ๋กœ ์ฐจ๋‹จ๋จ
  • SQL Injection: Prepared Statement ์‚ฌ์šฉ์œผ๋กœ ๋ฐฉ์ง€
๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•
์„œ๋ฒ„ ๋กœ๊ทธ ํ™•์ธ
# MCP ์„œ๋ฒ„ ๋””๋ฒ„๊ทธ ๋ชจ๋“œ ์‹คํ–‰
MCP_DEBUG=true node src/index.js
์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ
# ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ ์‹คํ–‰
node test-client.js
์ƒ์„ธ ๋กœ๊ทธ ๋ณด๊ธฐ

Claude Desktop ๋กœ๊ทธ ํ™•์ธ:

  • macOS: ~/Library/Logs/Claude/
  • Windows: %APPDATA%\Claude\logs\
๐Ÿ“š ์™„์ „ํ•œ ๋ฌธ์„œ

์ƒ์„ธํ•œ ์‚ฌ์šฉ๋ฒ•๊ณผ ์„ค์ • ๋ฐฉ๋ฒ•์€ **๊ฐ€์ด๋“œ ๋ชจ์Œ**์—์„œ ํ™•์ธํ•˜์„ธ์š”:

๐Ÿ”’ ๋ณด์•ˆ ๋ฐ ์ œํ•œ์‚ฌํ•ญ
ํ™˜๊ฒฝ๋ณ„ ์ œํ•œ
  • local: ๋ชจ๋“  ์ž‘์—… ํ—ˆ์šฉ (๊ฐœ๋ฐœ ํ™˜๊ฒฝ)
  • test: DELETE ์ž‘์—… ์ œํ•œ (ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ)
  • production: ์ฝ๊ธฐ ์ „์šฉ + ์ ‘๊ทผ ์ฐจ๋‹จ (๋ณด์•ˆ)
์•ˆ์ „ ์žฅ์น˜
  • SQL Injection ๋ฐฉ์ง€: Prepared Statement ๊ฐ•์ œ ์‚ฌ์šฉ
  • ์œ„ํ—˜ํ•œ ์ฟผ๋ฆฌ ์ฐจ๋‹จ: DROP, TRUNCATE ๋“ฑ ์ž๋™ ์ฐจ๋‹จ
  • ๊ฒฐ๊ณผ ์ œํ•œ: ๊ธฐ๋ณธ 1000ํ–‰ ์ œํ•œ (์„ค์ • ๊ฐ€๋Šฅ)
  • ์ปค๋„ฅ์…˜ ๊ด€๋ฆฌ: ์ž๋™ ํ’€๋ง ๋ฐ ํƒ€์ž„์•„์›ƒ ์ฒ˜๋ฆฌ
๐Ÿณ Docker ์ง€์›
Docker Compose ์˜ˆ์ œ
version: "3.8"
services:
  database-mcp:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=local
    depends_on:
      - mysql
      - postgres

  mysql:
    image: mariadb:10.11
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: appdb
    ports:
      - "3306:3306"

  postgres:
    image: postgres:14-alpine
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: analytics
    ports:
      - "5432:5432"
๐ŸŽฏ ์‚ฌ์šฉ ์‚ฌ๋ก€
๐Ÿข ๊ธฐ์—… ํ™˜๊ฒฝ
  • ๋‹ค์ค‘ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค DB ํ†ตํ•ฉ ๊ด€๋ฆฌ
  • ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ/ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ
  • ์•ˆ์ „ํ•œ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ๋ฆฌํฌํŒ…
๐Ÿ”ฌ ๋ฐ์ดํ„ฐ ๊ณผํ•™
  • ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์†Œ์Šค ํ†ตํ•ฉ ๋ถ„์„
  • ์•ˆ์ „ํ•œ ์ฟผ๋ฆฌ ์‹คํ–‰ ํ™˜๊ฒฝ
  • ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง
๐Ÿš€ ๊ฐœ๋ฐœ ํŒ€
  • ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ํ‘œ์ค€ํ™”
  • ํŒ€๊ฐ„ DB ์ ‘๊ทผ ๊ถŒํ•œ ๊ด€๋ฆฌ
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ
๐Ÿ“ˆ ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ
์ž‘์—… MySQL PostgreSQL ๋™์‹œ ์—ฐ๊ฒฐ
๋‹จ์ˆœ SELECT ~2ms ~3ms 10๊ฐœ ํ’€
๋ณต์žกํ•œ JOIN ~15ms ~12ms ์ž๋™ ๊ด€๋ฆฌ
๋Œ€์šฉ๋Ÿ‰ INSERT ~500ms ~400ms ํŠธ๋žœ์žญ์…˜
๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ

Database-MCP๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

๊ธฐ์—ฌ ๋ฐฉ๋ฒ•
  1. Fork ์ด ์ €์žฅ์†Œ๋ฅผ ํฌํฌํ•˜์„ธ์š”
  2. Branch ์ƒˆ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“œ์„ธ์š” (git checkout -b feature/amazing-feature)
  3. Commit ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•˜์„ธ์š” (git commit -m 'Add amazing feature')
  4. Push ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œํ•˜์„ธ์š” (git push origin feature/amazing-feature)
  5. Pull Request ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”
๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋ผ์ธ
  • ์ฝ”๋“œ ์Šคํƒ€์ผ: ESLint + Prettier ์‚ฌ์šฉ
  • ํ…Œ์ŠคํŠธ: ์ƒˆ ๊ธฐ๋Šฅ์€ ํ…Œ์ŠคํŠธ ํฌํ•จ ํ•„์ˆ˜
  • ๋ฌธ์„œ: ๊ณต๊ฐœ API ๋ณ€๊ฒฝ์‹œ ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ
  • ๋ณด์•ˆ: ๋ณด์•ˆ ๊ด€๋ จ ๋ณ€๊ฒฝ์€ ๋ณ„๋„ ๋ฆฌ๋ทฐ
๐Ÿ“ž ์ง€์› ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ
  • ๐Ÿ› ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ: GitHub Issues
  • ๐Ÿ’ก ๊ธฐ๋Šฅ ์ œ์•ˆ: GitHub Discussions
  • ๐Ÿ“– ๋ฌธ์„œ ๊ฐœ์„ : Wiki
  • ๐Ÿ’ฌ ์งˆ๋ฌธ ๋ฐ ์ง€์›: Discussions
๐Ÿ“„ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT License ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ ์Šคํƒ€ ํžˆ์Šคํ† ๋ฆฌ

Star History Chart


Database-MCP๋กœ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋‹ค์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜์„ธ์š”! ๐Ÿš€

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ โ€ข ๐Ÿ“š ๋ฌธ์„œ โ€ข ๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ โ€ข ๐Ÿ“ž ์ง€์›