onesound71/enhanced-mcp-server
If you are the rightful owner of enhanced-mcp-server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
The Model Context Protocol (MCP) server facilitates secure and real-time access for AI models to external tools and data.
query_employee_database
Queries the company employee database for information.
calculate_bonus
Calculates employee bonuses based on performance scores.
π Enhanced MCP Server - λμ λλ£μκ² μ€λͺ νλ MCP
π λͺ©μ°¨
- MCPλ 무μμΈκ°?
- νλ‘μ νΈ κ΅¬μ‘° μ΄ν΄νκΈ°
- MCP μλ² λμ μ리
- μμ€μ½λ μμΈ λΆμ
- μ€μ΅: MCP μλ² μ€ννκΈ°
- 컀μ€ν λꡬ λ§λ€κΈ°
π€ MCPλ 무μμΈκ°?
**MCP (Model Context Protocol)**λ AI λͺ¨λΈμ΄ μΈλΆ λꡬμ λ°μ΄ν°μ μμ νκ² μ κ·Όν μ μκ² ν΄μ£Όλ νμ€ νλ‘ν μ½μ λλ€.
ποΈ MCPμ ν΅μ¬ κ°λ
βββββββββββββββ MCP Protocol βββββββββββββββ
β AI Model β ββββββββββββββββ β MCP Server β
β (Cursor AI) β β (μ°λ¦¬ μλ²) β
βββββββββββββββ βββββββββββββββ
β
βΌ
βββββββββββββββ
β Tools & β
β Data β
βββββββββββββββ
π€·ββοΈ μ MCPκ° νμν κΉμ?
Q: AIκ° μ΄λ―Έ λλνλ° μ MCPκ° νμνκ°μ? A: AIλ νμ΅λ λ°μ΄ν°λ§ μκ³ μμ΄μ. μ°λ¦¬ νμ¬μ μ€μκ° μ§μ μ 보, νλ‘μ νΈ μν, λΉλ° μ½λ λ±μ λͺ¨λ¦ λλ€!
Q: κ·Έλ₯ AIμκ² μ§μ λ°μ΄ν°λ₯Ό μ£Όλ©΄ μ λλμ? A: 보μμ μννκ³ , λ°μ΄ν°κ° κ³μ λ³κ²½λλ©΄ λ§€λ² AIλ₯Ό λ€μ νμ΅μμΌμΌ ν΄μ. MCPλ μ€μκ°μΌλ‘ μμ νκ² λ°μ΄ν°λ₯Ό μ 곡ν©λλ€!
π MCPμ κ°λ ₯ν μ₯μ : ν λ² λ§λ€λ©΄ μ΄λμλ μ¬μ©!
π’ μ°λ¦¬κ° λ§λ MCP μλ²
β
βββββββββββββββββΌββββββββββββββββ
β β β
βΌ βΌ βΌ
βββββββββββ βββββββββββ βββββββββββ
βCursor AIβ β n8n β β Make.comβ
β μ½λ© β β μν¬νλ‘μ°β βμλνν΄ β
βββββββββββ βββββββββββ βββββββββββ
β β β
βΌ βΌ βΌ
"κΉκ°λ° μ 보 "λ§€μΌ μ€μ "Slackμ
μλ €μ€" μ§μ νν© κΈμ¬ μ 보
λ³΄κ³ μ μμ±" μλ¦Ό μ μ‘"
π― μ€μ νμ© μλ리μ€
π μλλ¦¬μ€ 1: κ°λ°μ (Cursor AI)
κ°λ°μ: "κΉκ°λ°λμ΄ λ΄λΉν νλ‘μ νΈ μ§νλ₯ μ΄ μ΄λ»κ² λλμ?"
AI: MCP μλ²μμ λ°μ΄ν° μ‘°ν β "MCP-Integration νλ‘μ νΈ 65% μλ£"
κ°λ°μ: "κ·ΈλΌ μμ μλ£μΌμ?"
AI: "2025λ
7μ 15μΌ λ§κ° μμ μ
λλ€"
π μλλ¦¬μ€ 2: μλν (n8n)
λ§€μΌ μ€μ 9μ μλ μ€ν:
1. MCP μλ²μμ λͺ¨λ μ§μ μ 보 μ‘°ν
2. ν΄κ° μ€μΈ μ§μ νν°λ§
3. κ΄λ¦¬μμκ² μ΄λ©μΌ λ°μ‘
4. Slack μ±λμ νν© μ
λ°μ΄νΈ
π μλλ¦¬μ€ 3: λ Έμ½λ μλν (Make.com)
νλ‘μ νΈ λ§κ°μΌ μλ¦Ό μμ€ν
:
1. MCP μλ²μμ νλ‘μ νΈ μν νμΈ
2. λ§κ°μΌ 7μΌ μ μΈ νλ‘μ νΈ μ°ΎκΈ°
3. λ΄λΉμμκ² μλ μλ¦Ό μ μ‘
4. μ§νλ₯ μ΄ 50% λ―Έλ§μ΄λ©΄ κ΄λ¦¬μμκ² μμ€μ»¬λ μ΄μ
π λ ꡬ체μ μΈ μ§λ¬Έκ³Ό λ΅λ³
Q: MCP μλ² νλλ‘ μ λ§ μ¬λ¬ νλ«νΌμμ μ¬μ©ν μ μλμ? A: λ€! MCPλ νμ€ νλ‘ν μ½μ΄λΌμ ν λ² λ§λ€λ©΄:
- β Cursor AIμμ μ½λ© λμ°λ―Έλ‘
- β n8nμμ μν¬νλ‘μ° μλνλ‘
- β Make.comμμ λ Έμ½λ μλνλ‘
- β μ¬μ§μ΄ μ§μ λ§λ μ±μμλ μ¬μ© κ°λ₯!
Q: 보μμ μ΄λ»κ² κ΄λ¦¬νλμ? A: MCP μλ²μμ κΆνμ μ€μ κ΄λ¦¬ν©λλ€:
// μ: κΈμ¬ μ 보λ HR λΆμλ§ μ κ·Ό κ°λ₯
if (requestType === 'salary' && !user.hasRole('HR')) {
throw new Error('κΆνμ΄ μμ΅λλ€');
}
Q: μ€μκ° λ°μ΄ν°λ κ°λ₯νκ°μ? A: λ¬Όλ‘ μ λλ€!
// μ€μκ° μμ€ν
λͺ¨λν°λ§
async getRealtimeSystemStatus() {
return {
cpu: getCurrentCPUUsage(),
memory: getCurrentMemoryUsage(),
timestamp: new Date().toISOString()
};
}
π MCPμ μ€μ λΉμ¦λμ€ κ°μΉ
κΈ°μ‘΄ λ°©μ | MCP λ°©μ | κ°μ ν¨κ³Ό |
---|---|---|
λ§€λ² μλμΌλ‘ λ°μ΄ν° νμΈ | AIκ° μλμΌλ‘ μ‘°ν | β° μκ° 90% μ μ½ |
κ° ν΄λ§λ€ λ³λ μ°λ κ°λ° | ν λ² κ°λ°λ‘ λͺ¨λ ν΄ μ°λ | π° κ°λ°λΉμ© 70% μ κ° |
λ°μ΄ν° λΆμΌμΉ μν | λ¨μΌ μμ€λ‘ μΌκ΄μ± 보μ₯ | π― μ νλ 99% ν₯μ |
보μ μ μ± λΆμ° κ΄λ¦¬ | μ€μ μ§μ€μ 보μ κ΄λ¦¬ | π 보μ 리μ€ν¬ 80% κ°μ |
μ½κ² λ§νλ©΄: AIκ° "κΉκ°λ° μ§μ μ 보 μλ €μ€"λΌκ³ λ¬Όμ΄λ³΄λ©΄, MCP μλ²κ° νμ¬ λ°μ΄ν°λ² μ΄μ€μμ μ 보λ₯Ό μ°Ύμμ AIμκ² μ λ¬ν΄μ£Όλ μ€κ° λ€λ¦¬ μν μ ν©λλ€!
π νλ‘μ νΈ κ΅¬μ‘° μ΄ν΄νκΈ°
enhanced-mcp-server/
βββ π package.json # νλ‘μ νΈ μ€μ νμΌ
βββ π§ enhanced-server.js # MCP μλ² λ©μΈ μ½λ
βββ π― .cursor-mcp.json # Cursor AI μ°λ μ€μ
βββ π§ͺ test-enhanced.js # ν
μ€νΈ νμΌ
βββ π README.md # μ΄ νμΌ!
κ° νμΌμ μν
νμΌ | μν | μ μ μ¬μμ΄ μμμΌ ν μ |
---|---|---|
package.json | νλ‘μ νΈ μ 보μ μμ‘΄μ± κ΄λ¦¬ | npm ν¨ν€μ§ κ΄λ¦¬μ κΈ°λ³Έ |
enhanced-server.js | MCP μλ²μ ν΅μ¬ λ‘μ§ | κ°μ₯ μ€μν νμΌ! |
.cursor-mcp.json | Cursor AIμμ μ°κ²° μ€μ | AIκ° μ°λ¦¬ μλ²λ₯Ό μ°Ύλ λ°©λ² |
test-enhanced.js | μλ² ν μ€νΈ μ½λ | κ°λ° ν κ²μ¦νλ λ°©λ² |
βοΈ MCP μλ² λμ μ리
1λ¨κ³: μλ² μ΄κΈ°ν
// enhanced-server.jsμ ν΅μ¬ λΆλΆ
class EnhancedMcpServer {
constructor() {
// ποΈ νμ¬ λ°μ΄ν°λ² μ΄μ€ (AIκ° λͺ¨λ₯΄λ μ 보!)
this.companyDatabase = {
employees: [
{ id: 'EMP001', name: 'κΉκ°λ°', department: 'Engineering', salary: 8500 },
// ... λ λ§μ μ§μ μ 보
]
};
// π§ MCP μλ² μμ±
this.server = new Server({
name: 'enhanced-mcp-server',
version: '2.0.0'
});
}
}
2λ¨κ³: λꡬ(Tools) λ±λ‘
// AIκ° μ¬μ©ν μ μλ λꡬλ€μ μ μ
{
name: 'query_employee_database',
description: 'π’ νμ¬ μ§μ λ°μ΄ν°λ² μ΄μ€μμ μ 보λ₯Ό μ‘°νν©λλ€',
inputSchema: {
type: 'object',
properties: {
query_type: { type: 'string', enum: ['all', 'by_department', 'by_name'] },
filter: { type: 'string', description: 'νν° κ°' }
}
}
}
3λ¨κ³: λꡬ μ€ν λ‘μ§
// AIκ° λꡬλ₯Ό νΈμΆνλ©΄ μ€νλλ ν¨μ
async queryEmployeeDatabase(queryType, filter) {
const employees = this.companyDatabase.employees;
switch (queryType) {
case 'by_name':
return employees.filter(emp => emp.name.includes(filter));
case 'by_department':
return employees.filter(emp => emp.department === filter);
default:
return employees;
}
}
π μμ€μ½λ μμΈ λΆμ
π package.json λΆμ
{
"name": "enhanced-mcp-server",
"version": "2.0.0",
"type": "module", // β ES6 λͺ¨λ μ¬μ©
"dependencies": {
"@modelcontextprotocol/sdk": "^0.4.0" // β MCP 곡μ SDK
}
}
μ μ μ¬μ ν¬μΈνΈ:
"type": "module"
: μ΅μ JavaScript λ¬Έλ² μ¬μ©- MCP SDK: OpenAIμμ λ§λ 곡μ λΌμ΄λΈλ¬λ¦¬
π― .cursor-mcp.json λΆμ
{
"mcpServers": {
"enhanced-mcp-server": {
"command": "node",
"args": ["enhanced-server.js"],
"cwd": "/Users/sangsoonhwang/Documents/GitHub/enhanced-mcp-server"
}
}
}
μ μ μ¬μ ν¬μΈνΈ:
- Cursor AIκ° μ°λ¦¬ μλ²λ₯Ό μ°Ύλ GPS κ°μ μν
command
: μλ² μ€ν λͺ λ Ήμ΄cwd
: μλ²κ° μλ ν΄λ μμΉ
π§ enhanced-server.js ν΅μ¬ ꡬ쑰
1. ν΄λμ€ κ΅¬μ‘°
class EnhancedMcpServer {
constructor() {
this.companyDatabase = { /* λ°μ΄ν° */ }; // π λ°μ΄ν° μ μ₯μ
this.server = new Server(/* μ€μ */); // π§ MCP μλ²
this.setupToolHandlers(); // π οΈ λꡬ μ€μ
}
}
2. λꡬ λ±λ‘ κ³Όμ
setupToolHandlers() {
// π μ¬μ© κ°λ₯ν λꡬ λͺ©λ‘ μ 곡
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: 'query_employee_database',
description: 'μ§μ μ 보 μ‘°ν',
inputSchema: { /* μ
λ ₯ νμ μ μ */ }
}
// ... λ λ§μ λꡬλ€
]
};
});
// π§ λꡬ μ€ν μ²λ¦¬
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
switch (name) {
case 'query_employee_database':
return await this.queryEmployeeDatabase(args.query_type, args.filter);
// ... λ€λ₯Έ λꡬλ€
}
});
}
3. μ€μ λΉμ¦λμ€ λ‘μ§
async queryEmployeeDatabase(queryType, filter) {
console.log(`π μ§μ μ‘°ν: ${queryType}, νν°: ${filter}`);
const employees = this.companyDatabase.employees;
let result;
switch (queryType) {
case 'by_name':
result = employees.filter(emp => emp.name.includes(filter));
break;
case 'by_department':
result = employees.filter(emp => emp.department === filter);
break;
case 'all':
default:
result = employees;
}
return {
content: [{
type: 'text',
text: `π μ‘°ν κ²°κ³Ό: ${JSON.stringify(result, null, 2)}`
}]
};
}
π μ€μ΅: MCP μλ² μ€ννκΈ°
1λ¨κ³: μμ‘΄μ± μ€μΉ
npm install
2λ¨κ³: μλ² ν μ€νΈ
npm test
μμ μΆλ ₯:
π§ͺ κ°λ¨ν MCP ν
μ€νΈ μμ...
π νμΌ νμΈ:
β
package.json - μ‘΄μ¬ν¨
β
enhanced-server.js - μ‘΄μ¬ν¨
β
.cursor-mcp.json - μ‘΄μ¬ν¨
π κΈ°λ³Έ μ€μ νμΈ μλ£!
3λ¨κ³: μλ² μ€ν
npm start
4λ¨κ³: λ€μν νλ«νΌμμ ν μ€νΈ
π― Cursor AIμμ ν μ€νΈ
- Cursor AIμμ μ΄ νλ‘μ νΈ ν΄λ μ΄κΈ°
- MCP μλ² μ°κ²° νμ©
- λ€μ μ§λ¬Έλ€ μλν΄λ³΄κΈ°:
- "μ°λ¦¬ νμ¬ Engineering λΆμ μ§μλ€μ μ‘°νν΄μ€"
- "κΉκ°λ° μ§μμ μ 보λ₯Ό μλ €μ€"
- "ALPHA-7 μ½λλ₯Ό ν΄λ ν΄μ€"
π n8nμμ μ°λνκΈ°
{
"nodes": [
{
"name": "MCP Server Call",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "http://localhost:3000/mcp",
"method": "POST",
"body": {
"tool": "query_employee_database",
"args": {
"query_type": "by_department",
"filter": "Engineering"
}
}
}
}
]
}
n8n μν¬νλ‘μ° μμ :
- μ€μΌμ€λ¬: λ§€μΌ μ€μ 9μ μ€ν
- MCP νΈμΆ: μ§μ νν© μ‘°ν
- λ°μ΄ν° κ°κ³΅: ν΄κ°μ, νλ‘μ νΈλ³ λΆλ₯
- μλ¦Ό λ°μ‘: Slack/μ΄λ©μΌλ‘ λ³΄κ³ μ μ μ‘
π Make.comμμ μ°λνκΈ°
// Make.com HTTP λͺ¨λ μ€μ
{
"url": "http://localhost:3000/mcp",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"body": {
"tool": "get_project_status",
"args": {
"project_name": "MCP-Integration"
}
}
}
Make.com μλλ¦¬μ€ μμ :
- νΈλ¦¬κ±°: Google Sheets μ λ°μ΄νΈ κ°μ§
- MCP μ‘°ν: ν΄λΉ μ§μμ νλ‘μ νΈ μ 보 νμΈ
- 쑰건 λΆκΈ°: μ§νλ₯ μ λ°λ₯Έ λ€λ₯Έ μ‘μ
- μ‘μ : μλ μ΄λ©μΌ λ°μ‘ λλ Slack μλ¦Ό
π μ§μ API νΈμΆνκΈ°
# curlμ μ¬μ©ν μ§μ νΈμΆ
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{
"tool": "query_employee_database",
"args": {
"query_type": "by_name",
"filter": "κΉκ°λ°"
}
}'
π Pythonμμ μ¬μ©νκΈ°
import requests
def get_employee_info(name):
response = requests.post('http://localhost:3000/mcp', json={
'tool': 'query_employee_database',
'args': {
'query_type': 'by_name',
'filter': name
}
})
return response.json()
# μ¬μ© μ
employee = get_employee_info('κΉκ°λ°')
print(f"μ§μ μ 보: {employee}")
π οΈ μ»€μ€ν λꡬ λ§λ€κΈ°
μλ‘μ΄ λꡬ μΆκ°νλ λ°©λ²
1λ¨κ³: λꡬ μ μ μΆκ°
// setupToolHandlers() λ©μλμ tools λ°°μ΄μ μΆκ°
{
name: 'calculate_bonus',
description: 'μ§μ 보λμ€ κ³μ°',
inputSchema: {
type: 'object',
properties: {
employee_id: { type: 'string', description: 'μ§μ ID' },
performance_score: { type: 'number', description: 'μ±κ³Ό μ μ (1-10)' }
},
required: ['employee_id', 'performance_score']
}
}
2λ¨κ³: μ€ν λ‘μ§ μΆκ°
// CallToolRequestSchema νΈλ€λ¬μ switchλ¬Έμ μΆκ°
case 'calculate_bonus':
return await this.calculateBonus(args.employee_id, args.performance_score);
3λ¨κ³: λ©μλ ꡬν
async calculateBonus(employeeId, performanceScore) {
const employee = this.companyDatabase.employees.find(emp => emp.id === employeeId);
if (!employee) {
throw new McpError(ErrorCode.InvalidRequest, `μ§μ ${employeeId}λ₯Ό μ°Ύμ μ μμ΅λλ€`);
}
const baseBonus = employee.salary * 0.1; // κΈ°λ³Έ 보λμ€ 10%
const performanceMultiplier = performanceScore / 10;
const finalBonus = baseBonus * performanceMultiplier;
return {
content: [{
type: 'text',
text: `π° ${employee.name}λμ 보λμ€: ${finalBonus.toLocaleString()}λ§μ (μ±κ³Όμ μ: ${performanceScore}/10)`
}]
};
}
π― μ μ μ¬μμ μν ν΅μ¬ ν¬μΈνΈ
β κΌ κΈ°μ΅ν΄μΌ ν κ²λ€
-
MCP = AIμ λ°μ΄ν° μ¬μ΄μ λ€λ¦¬
- AIκ° μ§μ μ κ·Όν μ μλ λ°μ΄ν°λ₯Ό μμ νκ² μ 곡
-
λꡬ(Tool) = AIκ° μ¬μ©ν μ μλ κΈ°λ₯
- κ° λꡬλ λͺ νν λͺ©μ κ³Ό μ λ ₯/μΆλ ₯ νμμ κ°μ§
-
μ€ν€λ§(Schema) = λꡬ μ¬μ©λ² μ€λͺ μ
- AIκ° λꡬλ₯Ό μ¬λ°λ₯΄κ² μ¬μ©ν μ μλλ‘ κ°μ΄λ
-
λΉλκΈ° μ²λ¦¬ (async/await)
- λͺ¨λ λꡬ μ€νμ λΉλκΈ°λ‘ μ²λ¦¬λ¨
π¨ μ£Όμμ¬ν
- 보μ: λ―Όκ°ν μ 보λ μ μ ν κΆν κ²μ¬ ν μ 곡
- μλ¬ μ²λ¦¬: μμμΉ λͺ»ν μ λ ₯μ λν μ μ ν μλ¬ λ©μμ§
- μ±λ₯: λμ©λ λ°μ΄ν° μ²λ¦¬ μ νμ΄μ§ κ³ λ €
π λ€μν νλ«νΌ μ°λ ν
Q: μ΄λ€ νλ«νΌλΆν° μμνλ κ² μ’μκΉμ? A: μΆμ² μμ:
- Cursor AI (κ°μ₯ μ¬μ) β κ°λ°νλ©΄μ λ°λ‘ ν μ€νΈ
- n8n (μ€κ° λμ΄λ) β μκ°μ μν¬νλ‘μ°λ‘ μλν ꡬμΆ
- Make.com (μ€κ° λμ΄λ) β λ Έμ½λλ‘ λ³΅μ‘ν μλλ¦¬μ€ κ΅¬ν
- μ§μ API νΈμΆ (κ³ κΈ) β 컀μ€ν μ± κ°λ°
Q: κ° νλ«νΌμ μ₯λ¨μ μ?
νλ«νΌ | μ₯μ | λ¨μ | μΆμ² μ©λ |
---|---|---|---|
Cursor AI | π’ μ€μ κ°λ¨, μ¦μ μ¬μ© | π΄ κ°λ° νκ²½μμλ§ μ¬μ© | κ°λ° μ€ λ°μ΄ν° μ‘°ν |
n8n | π’ μ€νμμ€, μκ°μ νΈμ§ | π΄ μλ² μ€μΉ νμ | λ΄λΆ μν¬νλ‘μ° μλν |
Make.com | π’ ν΄λΌμ°λ, λ€μν μ°λ | π΄ μ λ£, 볡μ‘ν μ€μ | μΈλΆ μλΉμ€ μ°λ |
μ§μ API | π’ μμ ν μ μ΄, 컀μ€ν°λ§μ΄μ§ | π΄ κ°λ° μ§μ νμ | μ μ© μ± κ°λ° |
π λ€μ λ¨κ³
- λ 볡μ‘ν λꡬ λ§λ€κΈ°: λ°μ΄ν°λ² μ΄μ€ μ°λ, API νΈμΆ λ±
- 보μ κ°ν: μΈμ¦, κΆν κ΄λ¦¬ μμ€ν μΆκ°
- λͺ¨λν°λ§: λ‘κΉ , λ©νΈλ¦ μμ§ μμ€ν ꡬμΆ
- λ€μ€ νλ«νΌ μ§μ: REST API μλν¬μΈνΈ μΆκ°
- μ€μκ° μλ¦Ό: WebSocket μ°λμΌλ‘ μ€μκ° λ°μ΄ν° νΈμ
π€ λμμ΄ νμνλ€λ©΄
- MCP 곡μ λ¬Έμ: https://modelcontextprotocol.io/
- GitHub Issues: νλ‘μ νΈ μ΄μ λ±λ‘
- ν λ©ν : κΆκΈν μ μ μΈμ λ μ§λ¬ΈνμΈμ!
π μΆνν©λλ€! μ΄μ μ¬λ¬λΆλ MCP μ λ¬Έκ°μ 첫걸μμ λ΄λλ μ΅λλ€!