Database MCP Server
by tomtomjskim
README.md
# Database MCP Server
๐ **Enterprise-Ready Multi-Database MCP Server**
Model Context Protocol (MCP) ์๋ฒ๋ก **๋ค์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค**์ AI ์์ด์ ํธ ๊ฐ์ ์์ ํ๊ณ ํจ์จ์ ์ธ ํต์ ์ ์ ๊ณตํฉ๋๋ค.
## ๐ ์ฃผ์ ํน์ง
- ๐ข **MSA ํ๊ฒฝ ์๋ฒฝ ์ง์**: ์ฌ๋ฌ ๋ง์ดํฌ๋ก์๋น์ค DB๋ฅผ ํ๋์ MCP ์๋ฒ์์ ๊ด๋ฆฌ
- ๐ **์ํฐํ๋ผ์ด์ฆ๊ธ ๋ณด์**: ์ฝ๊ธฐ ์ ์ฉ, SSL/TLS, ์ฟผ๋ฆฌ ๊ฒ์ฆ, ๊ฐ์ฌ ๋ก๊น
- ๐ **ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ**: AWS RDS, Azure Database, Google Cloud SQL ์๋ฒฝ ์ง์
- โก **๊ณ ์ฑ๋ฅ**: ์ฐ๊ฒฐ ํ๋ง, ์ง๋ฅํ ์บ์ฑ, ๋ณ๋ ฌ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ
- ๐ค **AI ์นํ์ **: ์์ฐ์ด ์ฟผ๋ฆฌ, ์คํค๋ง ๋ถ์, ๋ฐ์ดํฐ ํ์ง ๋ถ์
## ๊ฐ์
์ด ํ๋ก์ ํธ๋ Anthropic์ Model Context Protocol์ ์ฌ์ฉํ์ฌ Claude์ ๊ฐ์ AI ๋ชจ๋ธ์ด **์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์์** ์ํธ์์ฉํ ์ ์๋๋ก ํ๋ ๊ณ ๊ธ MCP ์๋ฒ์
๋๋ค. MSA(Microservices Architecture) ํ๊ฒฝ์์ ๋ถ์ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ค์ ํตํฉ ๊ด๋ฆฌํ๋ฉฐ, ์์ฐ์ด๋ฅผ ํตํ ํฌ๋ก์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ, ์คํค๋ง ํ์, ๋ฐ์ดํฐ ๋ถ์ ๋ฑ์ ๊ธฐ๋ฅ์ ์์ ํ๊ฒ ์ ๊ณตํฉ๋๋ค.
## ๐ Claude Code์์ ์ฌ์ฉํ๊ธฐ
Claude Code ํ๊ฒฝ์์ ์ด DB MCP ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด [Claude Code ์ฌ์ฉ ๊ฐ์ด๋](./docs/CLAUDE_CODE_GUIDE.md)๋ฅผ ์ฐธ์กฐํ์ธ์.
**๋น ๋ฅธ ์์:**
1. ํ๊ฒฝ ๋ณ์ ์ค์ (`.env` ํ์ผ)
2. MCP ์๋ฒ ์ค์ ์ ์ถ๊ฐ
3. Claude์๊ฒ "๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๋ถ์ํด์ฃผ์ธ์" ์์ฒญ
4. ์์ฐ์ด๋ก ๋ฐ์ดํฐ ์กฐํ ๋ฐ ๋ถ์
## ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- โ
**MySQL** - ์์ ์ง์ (์จํ๋ ๋ฏธ์ค, AWS RDS, Azure Database)
- โ
**PostgreSQL** - ์์ ์ง์ (์จํ๋ ๋ฏธ์ค, AWS RDS, Azure Database, Google Cloud SQL)
- ๐ **SQLite** (๊ฐ๋ฐ ์์ )
- ๐ **ClickHouse** (๊ฐ๋ฐ ์์ )
### ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ํ ๊ฐ์ด๋
#### MySQL vs PostgreSQL ๋น๊ต
| ๊ธฐ๋ฅ | MySQL | PostgreSQL |
|------|-------|------------|
| **์ฑ๋ฅ** | ์ฝ๊ธฐ ์ต์ ํ, ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํฉ | ๋ณต์กํ ์ฟผ๋ฆฌ, ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ ํฉ |
| **๋ฐ์ดํฐ ํ์
** | ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
์ง์ | JSON, Array, ์ปค์คํ
ํ์
๋ฑ ํ๋ถํ ์ง์ |
| **ํ์ฅ์ฑ** | ์ํ ํ์ฅ (์ค๋ฉ) ์ฐ์ | ์์ง ํ์ฅ ์ฐ์, ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ง์ |
| **ACID ์ค์** | InnoDB ์์ง ์ฌ์ฉ ์ ์์ ์ง์ | ์์ ํ ACID ์ค์ |
| **๊ณ ๊ธ ๊ธฐ๋ฅ** | ๊ธฐ๋ณธ ๊ธฐ๋ฅ ์ค์ฌ | Window Functions, CTE, Full-text Search ๋ฑ |
| **ํด๋ผ์ฐ๋ ์ง์** | AWS RDS, Azure Database | AWS RDS, Azure Database, Google Cloud SQL |
#### ์ด๋ํฐ ์๋ ์ ํ
์์คํ
์ด ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์
์ ๊ฐ์งํฉ๋๋ค:
1. **๋ช
์์ ์ง์ **: `DB_TYPE` ํ๊ฒฝ๋ณ์ ๋๋ config.type ์ค์
2. **ํฌํธ ๊ธฐ๋ฐ ๊ฐ์ง**:
- 3306 โ MySQL
- 5432 โ PostgreSQL
3. **ํธ์คํธ๋ช
๊ธฐ๋ฐ ๊ฐ์ง**:
- ํธ์คํธ๋ช
์ 'mysql' ํฌํจ โ MySQL
- ํธ์คํธ๋ช
์ 'postgres' ํฌํจ โ PostgreSQL
4. **๊ธฐ๋ณธ๊ฐ**: MySQL
#### ๊ถ์ฅ ์ฌ์ฉ ์ฌ๋ก
**MySQL ๊ถ์ฅ:**
- ์น ์ ํ๋ฆฌ์ผ์ด์
๋ฐฑ์๋
- ๋จ์ํ CRUD ์์
์ค์ฌ
- ๋์ ๋์์ฑ ์ฝ๊ธฐ ์์
- ๊ธฐ์กด MySQL ์ธํ๋ผ ํ์ฉ
**PostgreSQL ๊ถ์ฅ:**
- ๋ณต์กํ ๋ถ์ ์ฟผ๋ฆฌ
- JSON ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- ์ง๋ฆฌ ์ ๋ณด ์์คํ
(PostGIS)
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์
## MSA ํ๊ฒฝ์์์ ๋ค์ค DB ์ฐ๊ฒฐ
MSA(Microservices Architecture) ํ๊ฒฝ์์๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์์ ์ ์ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด MCP ์๋ฒ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค:
### ๋ฐฉ๋ฒ 1: ๋จ์ผ MCP ์๋ฒ์์ ๋ค์ค DB ์ง์ (๊ถ์ฅ)
ํ๋์ MCP ์๋ฒ ์ธ์คํด์ค์์ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
#### ์ค์ ํ์ผ ๋ฐฉ์
`db-config.json` ํ์ผ ์์ฑ:
```json
{
"connections": {
"user-service": {
"name": "user-service",
"type": "mysql",
"host": "user-db.cluster-xxx.rds.amazonaws.com",
"port": 3306,
"user": "readonly_user",
"password": "secure_password",
"database": "user_service",
"description": "์ฌ์ฉ์ ์๋น์ค DB",
"tags": ["microservice", "user", "mysql"]
},
"order-service": {
"name": "order-service",
"type": "postgresql",
"host": "order-db.cluster-yyy.rds.amazonaws.com",
"port": 5432,
"user": "readonly_user",
"password": "secure_password",
"database": "order_service",
"description": "์ฃผ๋ฌธ ์๋น์ค DB",
"tags": ["microservice", "order", "postgresql"]
}
},
"defaultConnection": "user-service"
}
```
#### ํ๊ฒฝ๋ณ์ ๋ฐฉ์
```env
# ์ฌ์ฉ์ ์๋น์ค DB
DB_USER_HOST=user-db.cluster-xxx.rds.amazonaws.com
DB_USER_PORT=3306
DB_USER_TYPE=mysql
DB_USER_USER=readonly_user
DB_USER_PASSWORD=secure_password
DB_USER_DATABASE=user_service
DB_USER_DESCRIPTION=์ฌ์ฉ์ ์๋น์ค DB
DB_USER_TAGS=microservice,user,mysql
DB_USER_WRITE_ENABLED=false
# ์ฃผ๋ฌธ ์๋น์ค DB
DB_ORDER_HOST=order-db.cluster-yyy.rds.amazonaws.com
DB_ORDER_PORT=5432
DB_ORDER_TYPE=postgresql
DB_ORDER_USER=readonly_user
DB_ORDER_PASSWORD=secure_password
DB_ORDER_DATABASE=order_service
DB_ORDER_DESCRIPTION=์ฃผ๋ฌธ ์๋น์ค DB
DB_ORDER_TAGS=microservice,order,postgresql
DB_ORDER_WRITE_ENABLED=false
# ๊ธฐ๋ณธ ์ฐ๊ฒฐ
DB_DEFAULT_CONNECTION=user
```
#### Claude Desktop ์ค์ (๋ค์ค DB)
```json
{
"mcpServers": {
"multi-database": {
"command": "node",
"args": ["path/to/db-mcp/dist/multi-database-server.js"],
"env": {
"DB_CONFIG_FILE": "./db-config.json"
}
}
}
}
```
#### Claude Code ์ค์ (๋ค์ค DB - ๊ฐ์ํ๋ ๋ฐฉ์)
**๊ฐ์ ๋ ์ค์ ๋ฐฉ์**: ํ๊ฒฝ๋ณ์ ๊ฐ์ํ๋ฅผ ํตํ ์ค์ ๋จ์ํ (8๊ฐ โ 3๊ฐ)
`~/.claude.json` ํ์ผ์ ์ถ๊ฐ:
```json
{
"mcpServers": {
"db-mcp": {
"command": "node",
"args": ["/absolute/path/to/db-mcp/dist/multi-index.js"],
"env": {
"DB_CONFIG_FILE": "/absolute/path/to/db-mcp/db-config.json",
"LOG_LEVEL": "info",
"MCP_SERVER_NAME": "db-mcp"
}
}
}
}
```
**ํต์ฌ ๊ฐ์ ์ **:
- โ
**๋ถํ์ํ dummy ํ๊ฒฝ๋ณ์ ์ ๊ฑฐ**: MYSQL_HOST, MYSQL_PORT, MYSQL_DB, MYSQL_USER, MYSQL_PASSWORD ๋ถํ์
- โ
**์ง์ ํ ๋ฉํฐํ
๋ํธ ์๋ฒ**: DB_CONFIG_FILE๋ง์ผ๋ก ๋ชจ๋ ์ฐ๊ฒฐ ๊ด๋ฆฌ
- โ
**์ฝ๋ ๋ ๋ฒจ ๊ฐ์ **: `src/config/index.ts`์์ multi-DB ๋ชจ๋ ์๋ ๊ฐ์ง
- โ
**์ค์ ๊ฐ์ํ**: ํ๊ฒฝ๋ณ์ 62.5% ๊ฐ์ (8๊ฐ โ 3๊ฐ)
**๋์ ์๋ฆฌ**:
1. `DB_CONFIG_FILE` ํ๊ฒฝ๋ณ์ ์กด์ฌ ์ multi-DB ๋ชจ๋๋ก ์๋ ์ ํ
2. ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด๋ `db-config.json` ํ์ผ์์ ๊ด๋ฆฌ
3. ํ๊ฒฝ๋ณ์ ๊ฒ์ฆ ๋ก์ง ์๋ ์คํต์ผ๋ก dummy ๊ฐ ๋ถํ์
**๊ฒ์ฆ ๋ฐฉ๋ฒ**:
```bash
# MCP ์๋ฒ ์ฐ๊ฒฐ ํ์ธ
claude mcp list
# ํฌ์ค์ฒดํฌ ์คํ
# Claude Code์์: "db-mcp ์๋ฒ ํฌ์ค์ฒดํฌ ์คํํด์ค"
```
### ๋ฐฉ๋ฒ 2: DB๋ณ ๋ณ๋ MCP ์๋ฒ (๊ฐ๋จํ ๋ฐฉ๋ฒ)
๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ๋ณ๋์ MCP ์๋ฒ ์ธ์คํด์ค๋ฅผ ์คํํฉ๋๋ค.
#### Claude Desktop ์ค์ (๋ณ๋ ์๋ฒ)
```json
{
"mcpServers": {
"user-db": {
"command": "node",
"args": ["path/to/db-mcp/dist/index.js"],
"env": {
"DB_TYPE": "mysql",
"MYSQL_HOST": "user-db.cluster-xxx.rds.amazonaws.com",
"MYSQL_DB": "user_service"
}
},
"order-db": {
"command": "node",
"args": ["path/to/db-mcp/dist/index.js"],
"env": {
"DB_TYPE": "postgresql",
"POSTGRES_HOST": "order-db.cluster-yyy.rds.amazonaws.com",
"POSTGRES_DB": "order_service"
}
}
}
}
```
### ๋ค์ค DB ์ ์ฉ ๊ธฐ๋ฅ
๋จ์ผ MCP ์๋ฒ์์ ๋ค์ค DB๋ฅผ ์ฌ์ฉํ ๋ ์ถ๊ฐ๋ก ์ ๊ณต๋๋ ๊ธฐ๋ฅ:
#### 1. ํฌ๋ก์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ
```
"์ฌ์ฉ์ ์๋น์ค์ ์ฃผ๋ฌธ ์๋น์ค ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํด์ ๋ณด์ฌ์ค"
โ ์ฌ๋ฌ DB์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ์ฌ ํตํฉ ๋ถ์
```
#### 2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๊ทธ ํํฐ๋ง
```
"microservice ํ๊ทธ๊ฐ ๋ถ์ ๋ชจ๋ DB ์ํ๋ฅผ ํ์ธํด์ค"
โ ํ๊ทธ ๊ธฐ๋ฐ์ผ๋ก DB ๊ทธ๋ฃน ๊ด๋ฆฌ
```
#### 3. ํตํฉ ํฌ์ค์ฒดํฌ
```
"๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ํ๋ฅผ ํ๋ฒ์ ํ์ธํด์ค"
โ ์ ์ฒด ์ธํ๋ผ ์ํ ๋ชจ๋ํฐ๋ง
```
#### 4. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ ๊ด๊ณ ๋ถ์
```
"์ฌ์ฉ์ ID๋ก ๋ชจ๋ ์๋น์ค์ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ค"
โ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ๋ฐ์ดํฐ ์ถ์
```
## ๐ ์ ๊ณต ๊ธฐ๋ฅ
### ๐ 1. ๋ค์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ
- **๐ข MSA ์๋ฒฝ ์ง์**: ํ๋์ MCP ์๋ฒ์์ ์์ญ ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค DB ๊ด๋ฆฌ
- **โก ๊ณ ์ฑ๋ฅ ์ฐ๊ฒฐ ํ๋ง**: DB๋ณ ๋
๋ฆฝ์ ์ธ ์ฐ๊ฒฐ ํ๋ก ์ต์ ํ๋ ๋ฆฌ์์ค ๊ด๋ฆฌ
- **๐ ์๋ ํ์ผ์ค๋ฒ**: ์ฐ๊ฒฐ ๋๊น ์ ์๋ ์ฌ์ฐ๊ฒฐ ๋ฐ ์ํ ๋ณต๊ตฌ
- **๐ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง**: ์ฐ๊ฒฐ ์ํ, ํ์ฑ ์ฟผ๋ฆฌ, ์๋ต ์๊ฐ ์ค์๊ฐ ์ถ์
- **๐ท ํ๊ทธ ๊ธฐ๋ฐ ๊ด๋ฆฌ**: ํ๊ฒฝ๋ณ, ์๋น์ค๋ณ DB ๊ทธ๋ฃน ๊ด๋ฆฌ (production, staging, analytics ๋ฑ)
### โ๏ธ 2. ๊ณ ๊ธ ์ฟผ๋ฆฌ ์คํ ๋๊ตฌ (Tools)
#### `list_databases` ๐
- **๊ธฐ๋ฅ**: ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชฉ๋ก ๋ฐ ์ํ ์กฐํ
- **์ถ๋ ฅ**: DB ํ์
, ์ฐ๊ฒฐ ์ํ, ํ๊ทธ, ์ค๋ช
, ์ฑ๋ฅ ๋ฉํธ๋ฆญ
- **ํ์ฉ**: ์ ์ฒด ์ธํ๋ผ ํํฉ ํ์
, ํฌ์ค์ฒดํฌ
#### `execute_query` ๐
- **๊ธฐ๋ฅ**: ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ SQL ์ฟผ๋ฆฌ ์คํ
- **์
๋ ฅ**: SQL ๋ฌธ์์ด, ๋์ DB, ํ๋ผ๋ฏธํฐ
- **์ถ๋ ฅ**: ๊ตฌ์กฐํ๋ ๊ฒฐ๊ณผ + ์คํ ๋ฉํธ๋ฆญ
- **๋ณด์**: ์ฝ๊ธฐ ์ ์ฉ ์ฟผ๋ฆฌ๋ง ํ์ฉ, SQL ์ธ์ ์
๋ฐฉ์ง
#### `execute_dev_statement` ๐
- **๊ธฐ๋ฅ**: ๋ช
์์ ์ผ๋ก ์ฐ๊ธฐ๊ฐ ํ์ฉ๋ development ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋จ์ผ DDL/DML ์คํ
- **์ค์ **: JSON์ `writeEnabled: true` ๋๋ ํ๊ฒฝ๋ณ์ `DB_{NAME}_WRITE_ENABLED=true`
- **๋ณด์**: `production`, `prod`, `readonly` ํ๊ทธ ๋ฐ production ์๋ณ์๊ฐ ์๋ ์ฐ๊ฒฐ์ ์ค์ ๊ณผ ๋ฌด๊ดํ๊ฒ ์ฐจ๋จ
- **์ ํ**: ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐ๋์ ์ง์ ํ๋ฉฐ ํ ๋ฒ์ ํ๋์ ํ
์ด๋ธ DDL ๋๋ ํ DML๋ง ํ์ฉ
#### `cross_database_query` ๐
- **๊ธฐ๋ฅ**: ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋์ ์ฟผ๋ฆฌ ์คํ ๋ฐ ๊ฒฐ๊ณผ ํตํฉ
- **์
๋ ฅ**: ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณ ์ฟผ๋ฆฌ ๋ฐฐ์ด
- **์ถ๋ ฅ**: ํตํฉ๋ ๊ฒฐ๊ณผ์
+ ์ฑ๋ฅ ๋น๊ต
- **ํ์ฉ**: ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ๋ฐ์ดํฐ ๋น๊ต, ํตํฉ ๋ฆฌํฌํ
#### `natural_language_query` ๐ค
- **๊ธฐ๋ฅ**: ์์ฐ์ด๋ฅผ SQL๋ก ๋ณํํ์ฌ ์คํ
- **์
๋ ฅ**: ์์ฐ์ด ์ง๋ฌธ, ๋์ DB, ์ปจํ
์คํธ
- **์ถ๋ ฅ**: ์์ฑ๋ SQL + ์คํ ๊ฒฐ๊ณผ + ์ ๋ขฐ๋
- **AI ์ง์**: ์คํค๋ง ์ ๋ณด ๊ธฐ๋ฐ ์ง๋ฅํ ์ฟผ๋ฆฌ ์์ฑ
#### `database_health_check` ๐ฅ
- **๊ธฐ๋ฅ**: ์ ์ฒด ๋๋ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ ๊ฒ์ฌ
- **์ถ๋ ฅ**: ์๋ต ์๊ฐ, ์ฐ๊ฒฐ ํ ์ํ, ์ฑ๋ฅ ์งํ
- **ํ์ฉ**: ์ธํ๋ผ ๋ชจ๋ํฐ๋ง, ์ฅ์ ์กฐ๊ธฐ ๊ฐ์ง
### ๐ 3. ํตํฉ ์คํค๋ง ์ ๋ณด ๋ฆฌ์์ค (Resources)
#### `database://connections` ๐
- **๋ด์ฉ**: ๋ชจ๋ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ธ ์ ๋ณด
- **ํฌํจ**: ์ฐ๊ฒฐ ์ค์ , ์ํ, ๋ฉํ๋ฐ์ดํฐ, ํ๊ทธ
#### `database://{db_name}/schema` ๐
- **๋ด์ฉ**: ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ ํ ์คํค๋ง ์ ๋ณด
- **ํฌํจ**: ํ
์ด๋ธ, ๋ทฐ, ํ๋ก์์ , ์ธ๋ฑ์ค, ์ธ๋ํค ๊ด๊ณ
- **์ง์**: MySQL, PostgreSQL ๊ฐ๊ฐ ์ต์ ํ๋ ๋ถ์
#### `database://{db_name}/tables` ๐
- **๋ด์ฉ**: ํ
์ด๋ธ๋ณ ์์ธ ์ ๋ณด ๋ฐ ํต๊ณ
- **ํฌํจ**: ์ปฌ๋ผ ์ ๋ณด, ๋ฐ์ดํฐ ํ์
, ์ ์ฝ์กฐ๊ฑด, ํ ์, ํฌ๊ธฐ
### ๐ 4. ๊ณ ๊ธ ๋ฐ์ดํฐ ๋ถ์ ๋๊ตฌ
#### **์คํค๋ง ๋ถ์ ์์ง**
- **MySQL ํนํ**: information_schema ์ต์ ํ ์ฟผ๋ฆฌ
- **PostgreSQL ํนํ**: pg_catalog ๋ฐ ํ์ฅ ์ ๋ณด ๋ถ์
- **์ฑ๋ฅ ์ต์ ํ**: ์ง๋ฅํ ์บ์ฑ์ผ๋ก ๋น ๋ฅธ ์๋ต
#### **๋ฐ์ดํฐ ํ์ง ๋ถ์**
- **์ปฌ๋ผ ํ๋กํ์ผ๋ง**: ํ์
๋ณ ํต๊ณ, NULL ๋น์จ, ๊ณ ์ ๊ฐ ๋ถ์
- **ํจํด ๊ฐ์ง**: ์ด๋ฉ์ผ, ์ ํ๋ฒํธ, URL ๋ฑ ๋ฐ์ดํฐ ํจํด ์๋ ๊ฐ์ง
- **์ด์์น ํ์ง**: 3-์๊ทธ๋ง ๊ท์น ๊ธฐ๋ฐ ์์น ์ด์์น ๋ฐ๊ฒฌ
- **ํ์ง ์ ์**: ๋ฐ์ดํฐ ์์ฑ๋, ์ผ๊ด์ฑ, ์ ํ๋ ์ข
ํฉ ํ๊ฐ
#### **๊ด๊ณ ๋ถ์**
- **ํ
์ด๋ธ ๊ด๊ณ ๋งคํ**: ์ธ๋ํค ๊ธฐ๋ฐ ์๋ ๊ด๊ณ๋ ์์ฑ
- **๋ฐ์ดํฐ ๋งํฌ ์ถ์ **: ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ๋ฐ์ดํฐ ์ฐ๊ด์ฑ ๋ถ์
- **์ข
์์ฑ ๋ถ์**: ์คํค๋ง ๋ณ๊ฒฝ ์ํฅ๋ ํ๊ฐ
## ๋ณด์ ๋ฐ ์ ํ์ฌํญ
### ๋ณด์ ๊ธฐ๋ฅ
#### 1. ์ฟผ๋ฆฌ ์ ํ
- **๊ธฐ๋ณธ ์ฝ๊ธฐ ์ ์ฉ**: `execute_query`์ `cross_database_query`๋ DML/DDL ๊ธ์ง
- **๊ฐ๋ฐ DB ์ฐ๊ธฐ ๋ถ๋ฆฌ**: `execute_dev_statement`๋ง ๋ช
์์ ์ผ๋ก ํ์ฉ๋ development ์ฐ๊ฒฐ์์ DDL/DML ํ์ฉ
- **Production ํ๋ ๋ธ๋ก**: production/readonly ์ฐ๊ฒฐ์ `writeEnabled` ์ค์ ๊ณผ ๋ฌด๊ดํ๊ฒ ์ฐ๊ธฐ ๊ธ์ง
- **ํ์ดํธ๋ฆฌ์คํธ**: ํ์ฉ๋ SQL ํค์๋๋ง ์คํ
- **๊ตฌ๋ฌธ ๊ฒ์ฆ**: SQL ์ธ์ ์
๋ฐฉ์ง๋ฅผ ์ํ ํ์ฑ ๊ฒ์ฆ
#### 2. ์คํ ์ ํ
```javascript
const SECURITY_LIMITS = {
MAX_EXECUTION_TIME: 30000, // 30์ด
MAX_RESULT_ROWS: 10000, // ์ต๋ 10,000ํ
MAX_RESULT_SIZE: '50MB', // ์ต๋ 50MB
MAX_QUERY_LENGTH: 10000, // ์ต๋ 10,000์
ALLOWED_KEYWORDS: [
'SELECT', 'FROM', 'WHERE', 'JOIN', 'ORDER BY',
'GROUP BY', 'HAVING', 'LIMIT', 'OFFSET',
'SHOW', 'DESCRIBE', 'EXPLAIN'
]
};
```
#### 3. ์ ๊ทผ ์ ์ด
- **๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณ ๊ถํ**: ๊ฐ DB ์ฐ๊ฒฐ๋ง๋ค ๋ณ๋ ๊ถํ ์ค์
- **ํ
์ด๋ธ๋ณ ์ ํ**: ํน์ ํ
์ด๋ธ ์ ๊ทผ ์ ํ ๊ฐ๋ฅ
- **๊ฐ์ฌ ๋ก๊น
**: ๋ชจ๋ ์ฟผ๋ฆฌ ์คํ ๊ธฐ๋ก ์ ์ฅ
#### 4. ๋คํธ์ํฌ ๋ณด์
- **TLS/SSL ์ํธํ**: ์๊ฒฉ DB ์ฐ๊ฒฐ ์ํธํ ๊ฐ์ (AWS RDS, Azure DB ๋ฑ)
- **VPC ์ง์**: AWS VPC, Azure VNet ๋ด ์ ๊ทผ
- **์ฐ๊ฒฐ ์ ํ**: IP ํ์ดํธ๋ฆฌ์คํธ ์ง์
- **์๊ฐ ๊ธฐ๋ฐ ์ก์ธ์ค**: ํน์ ์๊ฐ๋์๋ง ์ ๊ทผ ํ์ฉ
- **Connection Timeout**: ์๊ฒฉ ์ฐ๊ฒฐ ์๊ฐ ์ ํ ์ค์
### ๊ธฐ๋ฅ ์ ํ์ฌํญ
#### 1. ์ง์ํ์ง ์๋ ๊ธฐ๋ฅ
- โ ์ฝ๊ธฐ ๋๊ตฌ๋ฅผ ํตํ ๋ฐ์ดํฐ ์์ ๋ฐ ์คํค๋ง ๋ณ๊ฒฝ
- โ production/readonly ์ฐ๊ฒฐ์ ๋ฐ์ดํฐ ์์ ๋ฐ ์คํค๋ง ๋ณ๊ฒฝ
- โ ์ฌ๋ฌ SQL ๋ฌธ์ฅ์ ํ ๋ฒ์ ์คํํ๋ ๊ฐ๋ฐ DB ์ฐ๊ธฐ
- โ ์ ์ฅ ํ๋ก์์ ์คํ
- โ ํธ๋์ญ์
์ ์ด (BEGIN, COMMIT, ROLLBACK)
- โ ์ฌ์ฉ์ ๊ด๋ฆฌ ๋ช
๋ น
- โ ํ์ผ ์์คํ
์ ๊ทผ
#### 2. ์ฑ๋ฅ ์ ํ
- **๋์ ์ฐ๊ฒฐ**: ์ต๋ 10๊ฐ ๋์ ์ฟผ๋ฆฌ
- **์บ์ฑ**: ์คํค๋ง ์ ๋ณด 5๋ถ ์บ์
- **Rate Limiting**: ๋ถ๋น 100ํ ์ฟผ๋ฆฌ ์ ํ
#### 3. ๋ฐ์ดํฐ ํ์
์ ํ
- **BLOB/TEXT**: ํฐ ๋ฐ์ดํฐ๋ ์์ฝ ์ ๋ณด๋ง ์ ๊ณต
- **JSON/XML**: ๊ตฌ์กฐํ๋ ํํ๋ก ํ์ฑํ์ฌ ์ ๊ณต
- **Binary**: Base64 ์ธ์ฝ๋ฉ์ผ๋ก ์ ํ์ ์ง์
## ์ค์น ๋ฐ ์ค์
### 1. ์ค์น
```bash
npm install
```
### 2. ํ๊ฒฝ ์ค์
`.env` ํ์ผ ์์ฑ:
#### MySQL ์ค์
```env
# MySQL ์ฐ๊ฒฐ ์ ๋ณด (๋ก์ปฌ ๋๋ ์๊ฒฉ)
DB_TYPE=mysql # ๋ช
์์ ํ์
์ง์ (์ ํ์ฌํญ)
MYSQL_HOST=localhost # ๋๋ AWS RDS ์๋ํฌ์ธํธ
MYSQL_PORT=3306
MYSQL_DB=mydb
MYSQL_USER=readonly_user
MYSQL_PASSWORD=secure_password
# ์๊ฒฉ DB ์ค์ (AWS RDS ์์)
# MYSQL_HOST=mydb.cluster-xxx.us-east-1.rds.amazonaws.com
# MYSQL_SSL_MODE=REQUIRED
# MYSQL_SSL_CA=/path/to/rds-ca-2019-root.pem
# MYSQL_CONNECTION_TIMEOUT=60000
# MYSQL_ACQUIRECONNECTION_TIMEOUT=60000
```
#### PostgreSQL ์ค์
```env
# PostgreSQL ์ฐ๊ฒฐ ์ ๋ณด (๋ก์ปฌ ๋๋ ์๊ฒฉ)
DB_TYPE=postgresql # ๋ช
์์ ํ์
์ง์ (์ ํ์ฌํญ)
POSTGRES_HOST=localhost # ๋๋ AWS RDS ์๋ํฌ์ธํธ
POSTGRES_PORT=5432
POSTGRES_DB=mydb
POSTGRES_USER=readonly_user
POSTGRES_PASSWORD=secure_password
# ์๊ฒฉ DB ์ค์ (AWS RDS PostgreSQL ์์)
# POSTGRES_HOST=mydb.cluster-xxx.us-east-1.rds.amazonaws.com
# POSTGRES_SSL_MODE=REQUIRED
# POSTGRES_SSL_CA=/path/to/rds-ca-2019-root.pem
# POSTGRES_CONNECTION_TIMEOUT=60000
```
#### ๊ณตํต ๋ณด์ ์ค์
```env
MAX_QUERY_EXECUTION_TIME=30000
MAX_RESULT_ROWS=10000
ENABLE_QUERY_LOGGING=true
```
### 3. Claude Desktop ์ค์
#### MySQL ์ฌ์ฉ ์
`claude_desktop_config.json`์ ์ถ๊ฐ:
```json
{
"mcpServers": {
"database": {
"command": "node",
"args": ["path/to/db-mcp/dist/index.js"],
"env": {
"DB_TYPE": "mysql",
"MYSQL_HOST": "localhost",
"MYSQL_PORT": "3306",
"MYSQL_DB": "mydb",
"MYSQL_USER": "readonly_user",
"MYSQL_PASSWORD": "secure_password"
}
}
}
}
```
#### PostgreSQL ์ฌ์ฉ ์
`claude_desktop_config.json`์ ์ถ๊ฐ:
```json
{
"mcpServers": {
"database": {
"command": "node",
"args": ["path/to/db-mcp/dist/index.js"],
"env": {
"DB_TYPE": "postgresql",
"POSTGRES_HOST": "localhost",
"POSTGRES_PORT": "5432",
"POSTGRES_DB": "mydb",
"POSTGRES_USER": "readonly_user",
"POSTGRES_PASSWORD": "secure_password"
}
}
}
}
```
## ๐ก ์ค์ ์ฌ์ฉ ์์
### ๐ข MSA ํ๊ฒฝ์์์ ํ์ฉ
#### ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ๋ฐ์ดํฐ ๋ถ์
```
๐ฌ "user-service์ order-service์์ ์ต๊ทผ 1์ฃผ์ผ ๋์ ์ ๊ท ๊ฐ์
ํ ์ฌ์ฉ์๋ค์ ์ฃผ๋ฌธ ํจํด์ ๋น๊ต ๋ถ์ํด์ค"
๐ค Claude๊ฐ ์๋์ผ๋ก:
1. user-service DB์์ ์ต๊ทผ ๊ฐ์
์ ์กฐํ
2. order-service DB์์ ํด๋น ์ฌ์ฉ์๋ค์ ์ฃผ๋ฌธ ๋ฐ์ดํฐ ์กฐํ
3. ํฌ๋ก์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถ์์ผ๋ก ํจํด ์๋ณ
4. ํตํฉ ๋ฆฌํฌํธ ์์ฑ
```
#### ์ ์ฒด ์ธํ๋ผ ๋ชจ๋ํฐ๋ง
```
๐ฌ "production ํ๊ทธ๊ฐ ๋ถ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ํ์ธํ๊ณ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์๋ ๊ณณ์ ์ฐพ์์ค"
๐ค ๊ฒฐ๊ณผ:
- 5๊ฐ ํ๋ก๋์
DB ์ค 4๊ฐ ์ ์, 1๊ฐ ๊ฒฝ๊ณ
- analytics-db: ์๋ต์๊ฐ 3.2์ด (ํ๊ท ์ 2๋ฐฐ)
- ์ฐ๊ฒฐ ํ ์ฌ์ฉ๋ฅ : order-service 90% (์ฃผ์ ํ์)
```
### ๐ ๊ณ ๊ธ ๋ฐ์ดํฐ ๋ถ์
#### ๋ฐ์ดํฐ ํ์ง ๊ฒ์ฌ
```
๐ฌ "๋ชจ๋ ์๋น์ค์ ์ฌ์ฉ์ ํ
์ด๋ธ์์ ์ด๋ฉ์ผ ํ์์ด ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ค"
๐ค ์๋ ์คํ:
- user-service.users ํ
์ด๋ธ: ์ด๋ฉ์ผ ํจํด ๊ฒ์ฆ
- auth-service.profiles ํ
์ด๋ธ: ์ด๋ฉ์ผ ์ค๋ณต ๊ฒ์ฌ
- notification-service.recipients ํ
์ด๋ธ: ์ ํจํ์ง ์์ ๋๋ฉ์ธ ํ์ง
```
#### ์คํค๋ง ์ํฅ๋ ๋ถ์
```
๐ฌ "user_id ์ปฌ๋ผ์ ์ฌ์ฉํ๋ ๋ชจ๋ ํ
์ด๋ธ๊ณผ ๊ด๊ณ๋ฅผ ์ฐพ์์ ์คํค๋ง ๋ณ๊ฒฝ ์ ์ํฅ๋๋ฅผ ๋ถ์ํด์ค"
๐ค ๊ฒฐ๊ณผ:
- ์ง์ ์ฐธ์กฐ: 15๊ฐ ํ
์ด๋ธ
- ๊ฐ์ ์ฐธ์กฐ: 8๊ฐ ํ
์ด๋ธ
- ์ํฅ ๋ฐ๋ ์๋น์ค: user, order, payment, notification, analytics
- ๊ถ์ฅ์ฌํญ: ๋จ๊ณ์ ๋ง์ด๊ทธ๋ ์ด์
๊ณํ ํ์
```
### ๐ ์์ฐ์ด ์ฟผ๋ฆฌ
#### ๋น์ฆ๋์ค ์ง๋ฌธ โ SQL
```
๐ฌ "์ง๋ ๋ฌ ๊ฐ์ฅ ๋ง์ด ํ๋ฆฐ ์ํ ์นดํ
๊ณ ๋ฆฌ๋ ๋ญ์ผ?"
๐ค ์์ฑ๋ SQL:
SELECT c.name, COUNT(oi.product_id) as sales_count
FROM order_items oi
JOIN products p ON oi.product_id = p.id
JOIN categories c ON p.category_id = c.id
WHERE oi.created_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
GROUP BY c.id
ORDER BY sales_count DESC
LIMIT 1
```
#### ๋ณต์กํ ๋ถ์ ์ฟผ๋ฆฌ
```
๐ฌ "๊ฐ ์ง์ญ๋ณ๋ก ์๋ณ ๋งค์ถ ์ถ์ด๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ์ ๋
๋๊ธฐ ๋๋น ์ฑ์ฅ๋ฅ ๋ ๊ณ์ฐํด์ค"
๐ค ์๋์ผ๋ก:
1. ์ง์ญ, ๋ ์ง๋ณ ๋งค์ถ ์ง๊ณ
2. ์ ๋
๋๊ธฐ ๋ฐ์ดํฐ ์กฐํ
3. ์ฑ์ฅ๋ฅ ๊ณ์ฐ
4. ์๊ฐํ ๊ฐ๋ฅํ ํํ๋ก ๊ฒฐ๊ณผ ์ ๋ฆฌ
```
### ๐ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง
#### ์ฑ๋ฅ ์ด์ ํ์ง
```
๐ฌ "ํ์ฌ ๋๋ฆฌ๊ฒ ์คํ๋๊ณ ์๋ ์ฟผ๋ฆฌ๊ฐ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐพ์์ค"
๐ค ์ค์๊ฐ ๋ถ์:
- order-service: 3๊ฐ ์ฟผ๋ฆฌ๊ฐ 10์ด ์ด์ ์คํ ์ค
- analytics-db: ๋์ฉ๋ ์ง๊ณ ์ฟผ๋ฆฌ ์งํ ์ค (์ ์)
- user-service: ๋ชจ๋ ์ฟผ๋ฆฌ 1์ด ์ด๋ด (์ํธ)
```
#### ์ฉ๋ ๊ด๋ฆฌ
```
๐ฌ "๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ๋ณ ํฌ๊ธฐ๋ฅผ ์กฐํํ๊ณ ์ ๋ฆฌ๊ฐ ํ์ํ ํ
์ด๋ธ์ ์ถ์ฒํด์ค"
๐ค ๋ถ์ ๊ฒฐ๊ณผ:
- log_events ํ
์ด๋ธ: 15GB (ํํฐ์
๋ ๊ถ์ฅ)
- user_sessions ํ
์ด๋ธ: 8GB (TTL ์ค์ ๊ถ์ฅ)
- temp_data ํ
์ด๋ธ: 3GB (์ ๋ฆฌ ์ค์ผ์ค ํ์)
```
## ๐บ ๊ฐ๋ฐ ๋ก๋๋งต & ๋ฒ์ ํ์คํ ๋ฆฌ
### โ
์๋ฃ๋ ๊ธฐ๋ฅ (v1.0)
- [x] **Phase 1**: ๊ธฐ๋ณธ MCP ์๋ฒ + MySQL ์ฐ๊ฒฐ
- [x] **Phase 2**: ์ฟผ๋ฆฌ ์คํ ๋๊ตฌ ๊ตฌํ
- [x] **Phase 3**: ์คํค๋ง ์ ๋ณด ๋ฆฌ์์ค ์ถ๊ฐ
- [x] **Phase 4**: PostgreSQL ์ง์ ํ์ฅ
- [x] **Phase 5**: ๋ค์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์ (MSA ๋์)
- [x] **Phase 6**: ๊ณ ๊ธ ๋ฐ์ดํฐ ๋ถ์ ๊ธฐ๋ฅ
- [x] **Phase 7**: ์ํฐํ๋ผ์ด์ฆ๊ธ ๋ณด์ ๋ฐ ์ฑ๋ฅ ์ต์ ํ
### ๐ง ๊ฐ๋ฐ ์์ (v1.1+)
#### **Phase 8**: ์ถ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์
- [ ] **SQLite** ์ง์ (๋ก์ปฌ ๊ฐ๋ฐ, ์๋ฒ ๋๋ ํ๊ฒฝ)
- [ ] **ClickHouse** ์ง์ (๋์ฉ๋ ๋ถ์ ์ํฌ๋ก๋)
- [ ] **MongoDB** ์ง์ (NoSQL ๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค)
- [ ] **Redis** ์ง์ (์บ์ ๋ฐ ์ธ์
๋ฐ์ดํฐ ๋ถ์)
#### **Phase 9**: AI ๊ธฐ๋ฅ ๊ฐํ
- [ ] **๊ณ ๊ธ ์์ฐ์ด ์ฒ๋ฆฌ**: GPT-4 ๊ธฐ๋ฐ ๋ณต์กํ ์ฟผ๋ฆฌ ์์ฑ
- [ ] **์๋ ์ธ๋ฑ์ค ์ถ์ฒ**: ์ฟผ๋ฆฌ ํจํด ๋ถ์ ๊ธฐ๋ฐ ์ฑ๋ฅ ์ต์ ํ
- [ ] **์ด์ ํ์ง**: ML ๊ธฐ๋ฐ ๋ฐ์ดํฐ ํ์ง ๋ฐ ๋ณด์ ์ด์ ๊ฐ์ง
- [ ] **์ฟผ๋ฆฌ ์ต์ ํ**: ์คํ ๊ณํ ๋ถ์ ๋ฐ ์๋ ๊ฐ์ ์ ์
#### **Phase 10**: ์ํฐํ๋ผ์ด์ฆ ๊ธฐ๋ฅ
- [ ] **RBAC (Role-Based Access Control)**: ์ธ๋ฐํ ๊ถํ ๊ด๋ฆฌ
- [ ] **๊ฐ์ฌ ๋ฐ ์ปดํ๋ผ์ด์ธ์ค**: GDPR, SOX ๋ฑ ๊ท์ ์ค์
- [ ] **๊ณ ๊ฐ์ฉ์ฑ**: ํด๋ฌ์คํฐ๋ง ๋ฐ ๋ก๋ ๋ฐธ๋ฐ์ฑ
- [ ] **๋ฉํธ๋ฆญ & ์๋ฆผ**: Prometheus, Grafana ์ฐ๋
#### **Phase 11**: ๊ฐ๋ฐ์ ๊ฒฝํ ๊ฐ์
- [ ] **GUI ๊ด๋ฆฌ ๋๊ตฌ**: ์น ๊ธฐ๋ฐ ์ค์ ๋ฐ ๋ชจ๋ํฐ๋ง ๋์๋ณด๋
- [ ] **CLI ๋๊ตฌ**: ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ ์๋ํ
- [ ] **Docker ์ปจํ
์ด๋**: ์ํด๋ฆญ ๋ฐฐํฌ ์ง์
- [ ] **Kubernetes Operator**: ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ๋ฐฐํฌ
### ๐ ์ฑ๋ฅ ๋ชฉํ (v2.0)
- **์๋ต ์๊ฐ**: ๋จ์ ์ฟผ๋ฆฌ < 100ms, ๋ณต์กํ ๋ถ์ < 5s
- **๋์ ์ฐ๊ฒฐ**: 1000+ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋์ ๊ด๋ฆฌ
- **์ฒ๋ฆฌ๋**: 10,000+ qps (queries per second)
- **๊ฐ์ฉ์ฑ**: 99.9% ์
ํ์ ๋ณด์ฅ
## ๐ค ๊ธฐ์ฌ ๊ฐ์ด๋
์ฐ๋ฆฌ๋ ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค! ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฐธ์ฌํ ์ ์์ต๋๋ค.
### ๐ ๋ฒ๊ทธ ๋ฆฌํฌํธ
- GitHub Issues๋ฅผ ํตํด ๋ฒ๊ทธ ์ ๊ณ
- ์ฌํ ๊ฐ๋ฅํ ์์ ์ฝ๋ ํฌํจ
- ํ๊ฒฝ ์ ๋ณด (OS, Node.js ๋ฒ์ , DB ํ์
) ๋ช
์
### ๐ก ๊ธฐ๋ฅ ์ ์
- ์๋ก์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์ ์์ฒญ
- MCP ๋๊ตฌ ๊ฐ์ ์์ด๋์ด
- ์ฑ๋ฅ ์ต์ ํ ์ ์
### ๐ง ๊ฐ๋ฐ ์ฐธ์ฌ
1. **Fork & Clone**: ์ ์ฅ์๋ฅผ ํฌํฌํ๊ณ ๋ก์ปฌ์ ํด๋ก
2. **๋ธ๋์น ์์ฑ**: `git checkout -b feature/your-feature`
3. **๊ฐ๋ฐ**: TypeScript, Jest ํ
์คํธ ์์ฑ ํ์
4. **ํ
์คํธ**: `npm test && npm run build` ํต๊ณผ ํ์ธ
5. **PR ์์ฑ**: ์์ธํ ์ค๋ช
๊ณผ ํจ๊ป Pull Request
### ๐ ๋ฌธ์ํ
- README ๊ฐ์
- ์ฝ๋ ์ฃผ์ ์ถ๊ฐ
- ์ฌ์ฉ ์์ ํ์ฅ
- ๋ค๊ตญ์ด ๋ฒ์ญ (English, ํ๊ตญ์ด)
### ๐ ๋ณด์ ์ด์
๋ฏผ๊ฐํ ๋ณด์ ๋ฌธ์ ๋ public issue ๋์ ์ง์ ์ฐ๋ฝํด ์ฃผ์ธ์.
## ๐ ์๊ตฌ์ฌํญ
- **Node.js**: โฅ 18.0.0
- **NPM**: โฅ 8.0.0
- **TypeScript**: โฅ 5.0.0
- **๋ฐ์ดํฐ๋ฒ ์ด์ค**: MySQL 5.7+ ๋๋ PostgreSQL 12+
## ๐ ์ํคํ
์ฒ
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Claude AI Client โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Model Context Protocol โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Multi-Database MCP Server โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ Connection Mgr โ โ Query Executor โ โ Schema Mgr โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Database Adapter Layer โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ MySQL Adapter โ โPostgreSQL Adapterโ โ Future DBs โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Database Layer โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ User Service DB โ โ Order Service DB โ โAnalytics DB โ โ
โ โ (MySQL) โ โ (PostgreSQL) โ โ(PostgreSQL) โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
## ๐ ํ์ ๋ฐ ์ง์
์ด ํ๋ก์ ํธ๊ฐ ๋์์ด ๋์๋ค๋ฉด:
- โญ GitHub Star ๋๋ฌ์ฃผ๊ธฐ
- ๐ ์ด์ ๋ฆฌํฌํธ ๋ฐ ํผ๋๋ฐฑ
- ๐ฌ ์ปค๋ฎค๋ํฐ์์ ์ฌ์ฉ ๊ฒฝํ ๊ณต์
- ๐ SNS์์ ํ๋ก์ ํธ ์๊ฐ
## ๐ ๋ผ์ด์ ์ค
MIT License - ์์ ๋กญ๊ฒ ์ฌ์ฉ, ์์ , ๋ฐฐํฌ ๊ฐ๋ฅํฉ๋๋ค.
## ๐ ๊ฐ์ฌ์ ๋ง
- **Anthropic**: Model Context Protocol ๋ฐ Claude ์ ๊ณต
- **์ปค๋ฎค๋ํฐ**: ํผ๋๋ฐฑ๊ณผ ๊ธฐ์ฌ๋ก ํ๋ก์ ํธ ๋ฐ์ ์ ๋์
- **์คํ์์ค**: mysql2, pg, TypeScript ๋ฑ ํ๋ฅญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค
---
## ๐ ๋ฌธ์ ๋ฐ ์ง์
- **GitHub Issues**: ๋ฒ๊ทธ ๋ฆฌํฌํธ, ๊ธฐ๋ฅ ์์ฒญ
- **GitHub Discussions**: ์ฌ์ฉ๋ฒ ์ง๋ฌธ, ์์ด๋์ด ๊ณต์
- **Documentation**: ์์ธํ API ๋ฌธ์ ๋ฐ ๊ฐ์ด๋
**Enterprise Support๊ฐ ํ์ํ์ ๊ฐ์?** ๋์ฉ๋ ํธ๋ํฝ, ์ปค์คํ
๊ฐ๋ฐ, ๊ธฐ์ ์ง์์ด ํ์ํ ๊ฒฝ์ฐ ๋ณ๋ ๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค.
---
<div align="center">
**๐ Database MCP Server - AI ์๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํตํฉ ์๋ฃจ์
**
Made with โค๏ธ for the AI & Database community
</div>
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo recent community issues