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
๐๏ธ Database-MCP
๊ฐ๋ ฅํ๊ณ ์์ ํ ๋ค์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค 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 ์ฌ์์
- Claude Desktop์ ์์ ํ ์ข ๋ฃ
- ๋ค์ ์์
- ์๋ก์ด ๋ํ์์ 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 ์ถ๋ ฅ ๊ฐ์ญ
ํด๊ฒฐ์ฑ :
.env.local์์MCP_DEBUG=falseํ์ธ- Claude Desktop ์์ ์ฌ์์
- ์ ๋ ๊ฒฝ๋ก๊ฐ ์ ํํ์ง ํ์ธ
# ๊ฒฝ๋ก ํ์ธ
pwd
# ์ถ๋ ฅ ์: /Users/username/projects/database-mcp
โ "Tool not found" ์ค๋ฅ
์์ธ: MCP ์๋ฒ๊ฐ ๋ฑ๋ก๋์ง ์์
ํด๊ฒฐ์ฑ :
claude_desktop_config.json๋ฌธ๋ฒ ํ์ธ- JSON ํ์์ด ์ฌ๋ฐ๋ฅธ์ง ๊ฒ์ฆ
- Node.js ๋ฒ์ ํ์ธ (18.0.0 ์ด์)
node --version # v18.0.0 ์ด์์ด์ด์ผ ํจ
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์คํจ
์์ธ: ์๋ชป๋ DB ์ค์ ๋๋ DB ์๋ฒ ์ค๋จ
ํด๊ฒฐ์ฑ :
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ ์ํ ํ์ธ
.env.local์ค์ ๊ฒ์ฆ- ๋ฐฉํ๋ฒฝ ์ค์ ํ์ธ
# 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๋ ์คํ์์ค ํ๋ก์ ํธ์ ๋๋ค. ๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค!
๊ธฐ์ฌ ๋ฐฉ๋ฒ
- Fork ์ด ์ ์ฅ์๋ฅผ ํฌํฌํ์ธ์
- Branch ์ ๊ธฐ๋ฅ ๋ธ๋์น๋ฅผ ๋ง๋์ธ์ (
git checkout -b feature/amazing-feature) - Commit ๋ณ๊ฒฝ์ฌํญ์ ์ปค๋ฐํ์ธ์ (
git commit -m 'Add amazing feature') - Push ๋ธ๋์น์ ํธ์ํ์ธ์ (
git push origin feature/amazing-feature) - Pull Request ๋ฅผ ์์ฑํ์ธ์
๊ฐ๋ฐ ๊ฐ์ด๋๋ผ์ธ
- ์ฝ๋ ์คํ์ผ: ESLint + Prettier ์ฌ์ฉ
- ํ ์คํธ: ์ ๊ธฐ๋ฅ์ ํ ์คํธ ํฌํจ ํ์
- ๋ฌธ์: ๊ณต๊ฐ API ๋ณ๊ฒฝ์ ๋ฌธ์ ์ ๋ฐ์ดํธ
- ๋ณด์: ๋ณด์ ๊ด๋ จ ๋ณ๊ฒฝ์ ๋ณ๋ ๋ฆฌ๋ทฐ
๐ ์ง์ ๋ฐ ์ปค๋ฎค๋ํฐ
- ๐ ๋ฒ๊ทธ ๋ฆฌํฌํธ: GitHub Issues
- ๐ก ๊ธฐ๋ฅ ์ ์: GitHub Discussions
- ๐ ๋ฌธ์ ๊ฐ์ : Wiki
- ๐ฌ ์ง๋ฌธ ๋ฐ ์ง์: Discussions
๐ ๋ผ์ด์ ์ค
์ด ํ๋ก์ ํธ๋ MIT License ํ์ ๋ฐฐํฌ๋ฉ๋๋ค.
๐ ์คํ ํ์คํ ๋ฆฌ
Database-MCP๋ก ์์ ํ๊ณ ํจ์จ์ ์ธ ๋ค์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ๋ฅผ ์์ํ์ธ์! ๐
๐ ๋น ๋ฅธ ์์ โข ๐ ๋ฌธ์ โข ๐ค ๊ธฐ์ฌํ๊ธฐ โข ๐ ์ง์