Skip to main content
Glama
cafe24-wjsong

Ectlocal Connect MCP Server

handlers.ts6.92 kB
import { CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js'; import { DatabaseManager } from './database.js'; export class ToolHandlers { constructor(private db: DatabaseManager) {} async handleExecuteQuery(args: any) { try { const { query } = args; const result = await this.db.query(query); return { content: [ { type: 'text', text: `쿼리 실행 완료:\n\n결과: ${result.rowCount}행\n\n${JSON.stringify(result.rows, null, 2)}` } ] }; } catch (error: any) { return { content: [ { type: 'text', text: `쿼리 실행 오류: ${error.message}` } ], isError: true }; } } async handleGetTableStructure(args: any) { try { const { table_name } = args; const structure = await this.db.getTableStructure(table_name); let result = `테이블 구조: ${table_name}\n\n`; result += '=== PRIMARY KEY ===\n'; if (structure.primaryKeys.length > 0) { result += structure.primaryKeys.map((pk: any) => pk.column_name).join(', ') + '\n'; } else { result += '없음\n'; } result += '\n=== INDEXES ===\n'; if (structure.indexes.length > 0) { structure.indexes.forEach((idx: any) => { result += `${idx.indexname}: ${idx.indexdef}\n`; }); } else { result += '없음\n'; } result += '\n=== COLUMNS ===\n'; structure.columns.forEach((col: any) => { result += `${col.pos}. ${col.column_name} ${col.data_type}${col.length} ${col.nullable === 'YES' ? 'NULL' : 'NOT NULL'}`; if (col.default_value) { result += ` DEFAULT ${col.default_value}`; } result += '\n'; }); result += '\n=== TABLE STATS ===\n'; if (structure.stats.row_count !== undefined) { result += `행 수: ${structure.stats.row_count}\n`; result += `크기: ${structure.stats.total_size}\n`; } else { result += '통계 정보 없음\n'; } return { content: [ { type: 'text', text: result } ] }; } catch (error: any) { return { content: [ { type: 'text', text: `테이블 구조 조회 오류: ${error.message}` } ], isError: true }; } } async handleListTables(args: any) { try { const tables = await this.db.getAllTables(); const tableList = tables.map((table: any) => table.tablename).join('\n'); return { content: [ { type: 'text', text: `ec_ectlocal 스키마의 테이블 목록:\n\n${tableList}` } ] }; } catch (error: any) { return { content: [ { type: 'text', text: `테이블 목록 조회 오류: ${error.message}` } ], isError: true }; } } async handleGetOrder(args: any) { try { const { order_id } = args; const query = ` SELECT order_id, member_id, order_date, payed_amount, is_payed, is_shipped, paymethod, bank_code, c_r_name, c_r_addr1, r_zipcode, c_r_phone1, ship_fee, mileage_used, coupon_price, deposit_used FROM orders WHERE order_id = $1 `; const result = await this.db.query(query, [order_id]); if (result.rows.length === 0) { return { content: [ { type: 'text', text: `주문을 찾을 수 없습니다: ${order_id}` } ] }; } return { content: [ { type: 'text', text: `주문 정보: ${order_id}\n\n${JSON.stringify(result.rows[0], null, 2)}` } ] }; } catch (error: any) { return { content: [ { type: 'text', text: `주문 조회 오류: ${error.message}` } ], isError: true }; } } async handleGetOrderDetail(args: any) { try { const { order_id } = args; const query = ` SELECT o.order_id, o.member_id, o.order_date, o.payed_amount, o.is_payed, o.is_shipped, o.paymethod, o.c_r_name, o.c_r_addr1, o.ship_fee, om.om_no, om.product_no, om.quantity, om.cur_state, om.order_status, om.manage_id, om.place_date, om.shipbegin_date, om.shipend_date, om.cancel_date FROM orders o LEFT JOIN order_manage om ON o.order_id = om.order_id WHERE o.order_id = $1 `; const result = await this.db.query(query, [order_id]); if (result.rows.length === 0) { return { content: [ { type: 'text', text: `주문을 찾을 수 없습니다: ${order_id}` } ] }; } return { content: [ { type: 'text', text: `주문 상세 정보: ${order_id}\n\n${JSON.stringify(result.rows, null, 2)}` } ] }; } catch (error: any) { return { content: [ { type: 'text', text: `주문 상세 조회 오류: ${error.message}` } ], isError: true }; } } async handleGetMember(args: any) { try { const { member_id } = args; const query = ` SELECT member_id, group_no, type, priv, c_name, nick_name, c_email, c_phone, c_mobile, c_add1, c_add2, sex, regist_date, last_login_date, buy_num, total_mileage, avail_mileage FROM member WHERE member_id = $1 `; const result = await this.db.query(query, [member_id]); if (result.rows.length === 0) { return { content: [ { type: 'text', text: `회원을 찾을 수 없습니다: ${member_id}` } ] }; } return { content: [ { type: 'text', text: `회원 정보: ${member_id}\n\n${JSON.stringify(result.rows[0], null, 2)}` } ] }; } catch (error: any) { return { content: [ { type: 'text', text: `회원 조회 오류: ${error.message}` } ], isError: true }; } } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cafe24-wjsong/mcp-ectlocal-connect'

If you have feedback or need assistance with the MCP directory API, please join our Discord server