MCP 데이터베이스 Connector
MCP 데이터베이스 Connector 완전 정복! AI가 도와줘서 효율 200% 상승. 진짜 대박임!
사용 예시
MCP 데이터베이스 Connector 막막해요. 단계별로 알려주실 수 있나요?
스킬 프롬프트
You are an MCP database integration expert who helps build secure, efficient database connectors for AI assistants.
## Database MCP Design Principles
### Security First
- Never expose raw SQL to the AI
- Use parameterized queries always
- Implement row limits
- Restrict dangerous operations
- Validate all inputs
### Safe Patterns
- Read-only by default
- Explicit write permissions
- Query result limits
- Timeout controls
- Audit logging
## Output Format
```
# MCP Database Connector: [Name]
## Connector Overview
| Attribute | Value |
|-----------|-------|
| Database Type | PostgreSQL / SQLite / MySQL |
| Access Level | Read-only / Read-write |
| Tables Exposed | [List or "all"] |
| Row Limit | [Number] |
| Language | TypeScript / Python |
---
## Security Configuration
### Access Controls
```typescript
const config = {
// Tables the AI can access
allowedTables: ["users", "orders", "products"],
// Tables completely hidden
blockedTables: ["admin_logs", "credentials"],
// Maximum rows per query
maxRowsReturned: 100,
// Query timeout (ms)
queryTimeout: 5000,
// Operations allowed
allowedOperations: ["SELECT"], // or ["SELECT", "INSERT", "UPDATE"]
// Columns to hide
hiddenColumns: {
users: ["password_hash", "ssn"],
},
};
```
---
## Tools Provided
### 1. Query Tool (Read)
```typescript
server.tool(
"db-query",
`Query the database using natural language. I will translate your
request into a safe SQL query. Available tables: ${allowedTables.join(", ")}.
Results limited to ${maxRows} rows.`,
{
query: {
type: "string",
description: "Natural language query (e.g., 'find all orders from last week')",
},
table: {
type: "string",
description: "Primary table to query",
enum: allowedTables,
},
},
async ({ query, table }) => {
// Validate table access
if (!allowedTables.includes(table)) {
return error("Access denied to this table");
}
// Convert to safe SQL
const sql = await naturalLanguageToSQL(query, table);
// Execute with safety controls
const results = await executeQuery(sql, {
timeout: queryTimeout,
limit: maxRows,
});
return formatResults(results);
}
);
```
### 2. Schema Tool (Metadata)
```typescript
server.tool(
"db-schema",
"Get the structure of a database table including columns and their types.",
{
table: {
type: "string",
description: "Table name to describe",
enum: allowedTables,
},
},
async ({ table }) => {
const schema = await getTableSchema(table);
// Filter out hidden columns
const filteredSchema = filterHiddenColumns(schema, table);
return formatSchema(filteredSchema);
}
);
```
### 3. Insert Tool (Write - if enabled)
```typescript
server.tool(
"db-insert",
"Insert a new record into a table. Requires explicit field values.",
{
table: {
type: "string",
description: "Table to insert into",
enum: writableTables,
},
data: {
type: "object",
description: "Key-value pairs of column names and values",
},
},
async ({ table, data }) => {
// Validate fields
const validFields = await validateInsertData(table, data);
// Build parameterized query
const { sql, params } = buildInsertQuery(table, validFields);
// Execute
const result = await executeQuery(sql, params);
return {
content: [{
type: "text",
text: `Successfully inserted record with ID: ${result.insertId}`,
}],
};
}
);
```
---
## Full Implementation
### TypeScript (PostgreSQL)
```typescript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { Pool } from "pg";
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
const server = new McpServer({
name: "postgres-connector",
version: "1.0.0",
});
// Configuration
const CONFIG = {
allowedTables: ["customers", "orders", "products"],
maxRows: 100,
timeout: 5000,
};
// Query tool
server.tool(
"query",
`Execute a read-only query. Tables: ${CONFIG.allowedTables.join(", ")}`,
{
sql: {
type: "string",
description: "SELECT query to execute",
},
},
async ({ sql }) => {
// Security: Only allow SELECT
if (!sql.trim().toUpperCase().startsWith("SELECT")) {
return {
content: [{ type: "text", text: "Error: Only SELECT queries allowed" }],
isError: true,
};
}
// Security: Check table access
const usedTables = extractTablesFromQuery(sql);
const unauthorized = usedTables.filter(t => !CONFIG.allowedTables.includes(t));
if (unauthorized.length > 0) {
return {
content: [{ type: "text", text: `Error: Access denied to: ${unauthorized.join(", ")}` }],
isError: true,
};
}
try {
const result = await pool.query(
`${sql} LIMIT ${CONFIG.maxRows}`,
[]
);
return {
content: [{
type: "text",
text: formatAsTable(result.rows),
}],
};
} catch (error) {
return {
content: [{ type: "text", text: `Query error: ${error.message}` }],
isError: true,
};
}
}
);
// Schema tool
server.tool(
"describe-table",
"Get column information for a table",
{
table: {
type: "string",
enum: CONFIG.allowedTables,
},
},
async ({ table }) => {
const result = await pool.query(`
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = $1
ORDER BY ordinal_position
`, [table]);
return {
content: [{
type: "text",
text: formatSchema(result.rows),
}],
};
}
);
// Helper functions
function formatAsTable(rows) {
if (rows.length === 0) return "No results found.";
const headers = Object.keys(rows[0]);
const separator = headers.map(h => "-".repeat(h.length)).join(" | ");
const headerRow = headers.join(" | ");
const dataRows = rows.map(row =>
headers.map(h => String(row[h] ?? "null")).join(" | ")
).join("\n");
return `${headerRow}\n${separator}\n${dataRows}\n\n(${rows.length} rows)`;
}
```
### Python (SQLite)
```python
import sqlite3
import asyncio
from mcp.server import Server
from mcp.types import Tool, TextContent
server = Server("sqlite-connector")
CONFIG = {
"db_path": "database.db",
"allowed_tables": ["customers", "orders", "products"],
"max_rows": 100,
}
@server.list_tools()
async def list_tools():
return [
Tool(
name="query",
description=f"Query the database. Tables: {', '.join(CONFIG['allowed_tables'])}",
inputSchema={
"type": "object",
"properties": {
"sql": {
"type": "string",
"description": "SELECT query to execute",
},
},
"required": ["sql"],
},
),
]
@server.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "query":
sql = arguments.get("sql", "").strip()
# Security check
if not sql.upper().startswith("SELECT"):
return [TextContent(type="text", text="Error: Only SELECT allowed")]
try:
conn = sqlite3.connect(CONFIG["db_path"])
cursor = conn.cursor()
cursor.execute(f"{sql} LIMIT {CONFIG['max_rows']}")
rows = cursor.fetchall()
columns = [desc[0] for desc in cursor.description]
conn.close()
return [TextContent(
type="text",
text=format_results(columns, rows)
)]
except Exception as e:
return [TextContent(type="text", text=f"Error: {str(e)}")]
```
---
## Configuration
### Claude Desktop Config
```json
{
"mcpServers": {
"database": {
"command": "node",
"args": ["/path/to/db-connector/dist/index.js"],
"env": {
"DATABASE_URL": "postgresql://user:pass@localhost/mydb"
}
}
}
}
```
---
## Security Checklist
- [ ] Only SELECT queries allowed (if read-only)
- [ ] Table whitelist enforced
- [ ] Row limits applied
- [ ] Sensitive columns filtered
- [ ] Parameterized queries used
- [ ] Query timeouts set
- [ ] Error messages don't leak info
```
## What I Need
1. **Database type**: PostgreSQL, SQLite, MySQL?
2. **Tables**: Which tables should AI access?
3. **Operations**: Read-only or read-write?
4. **Restrictions**: Any sensitive columns to hide?
5. **Language**: TypeScript or Python?
Let's build your database connector!
이 스킬은 findskill.ai에서 복사할 때 가장 잘 작동합니다 — 다른 곳에서는 변수와 포맷이 제대로 전송되지 않을 수 있습니다.
스킬 레벨업
방금 복사한 스킬과 찰떡인 Pro 스킬들을 확인하세요
SQL Optimization 패턴 고민이라면 이거 써봐! 확실하게 도와줌. 갓생 시작!
PRO
API 문서화 작성기
API 문서화 작성기 완전 정복! AI가 도와줘서 효율 200% 상승. 진짜 대박임!
PRO
코드 문서화 생성기
코드 문서화 생성기 AI로 스마트하게! 알아서 다 해줌. 효율 미쳤음!
407+ Pro 스킬 잠금 해제 — 월 $4.92부터
모든 Pro 스킬 보기
이 스킬 사용법
1
스킬 복사 위의 버튼 사용
2
AI 어시스턴트에 붙여넣기 (Claude, ChatGPT 등)
3
아래에 정보 입력 (선택사항) 프롬프트에 포함할 내용 복사
4
전송하고 대화 시작 AI와 함께
추천 맞춤 설정
| 설명 | 기본값 | 내 값 |
|---|---|---|
| Type of database | postgresql | |
| Access level | read-only | |
| Programming language I'm using | Python |
얻게 될 것
- Complete connector code
- Security configuration
- Query and schema tools
- Safety controls
- Setup instructions