@bimatrix-aud-platform/aud_mcp_server 1.1.4 → 1.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ import { generateGridColumns } from "./generators/grid-column.js";
12
12
  import { generateDataSource } from "./generators/datasource.js";
13
13
  import { fixMtsd } from "./generators/fixer.js";
14
14
  import { getControlInfo } from "./generators/control-info.js";
15
+ import { callSchemaService, isAudConfigured } from "./utils/aud-api-client.js";
15
16
  const __filename = fileURLToPath(import.meta.url);
16
17
  const __dirname = dirname(__filename);
17
18
  // Load MTSD schema
@@ -456,6 +457,71 @@ const tools = [
456
457
  required: ["path"],
457
458
  },
458
459
  },
460
+ // ── i-AUD Database Query Tools ──────────────────────
461
+ {
462
+ name: "execute_query",
463
+ description: "i-AUD 서버를 통해 SQL 쿼리를 실행하고 결과를 반환합니다. SELECT 문 실행에 사용하며, 연결 코드(connectionCode)로 대상 데이터베이스를 지정합니다.",
464
+ inputSchema: {
465
+ type: "object",
466
+ properties: {
467
+ connectionCode: {
468
+ type: "string",
469
+ description: "데이터베이스 연결 코드 (예: AUD_SAMPLE_DB)",
470
+ },
471
+ sql: {
472
+ type: "string",
473
+ description: "실행할 SQL 쿼리",
474
+ },
475
+ limitRows: {
476
+ type: "number",
477
+ description: "최대 반환 행 수 (기본값: 100, 최대: 1000)",
478
+ default: 100,
479
+ },
480
+ },
481
+ required: ["connectionCode", "sql"],
482
+ },
483
+ },
484
+ {
485
+ name: "get_table_list",
486
+ description: "i-AUD 메타 데이터에서 테이블/뷰 목록을 조회합니다. 스키마명, 테이블명, 설명으로 필터링할 수 있습니다.",
487
+ inputSchema: {
488
+ type: "object",
489
+ properties: {
490
+ connectionCode: {
491
+ type: "string",
492
+ description: "데이터베이스 연결 코드 (i-AUD 시스템 DB)",
493
+ },
494
+ filter: {
495
+ type: "string",
496
+ description: "검색어 (스키마명, 테이블명, 설명에서 대소문자 무시 검색)",
497
+ },
498
+ limitRows: {
499
+ type: "number",
500
+ description: "최대 반환 행 수 (기본값: 500)",
501
+ default: 500,
502
+ },
503
+ },
504
+ required: ["connectionCode"],
505
+ },
506
+ },
507
+ {
508
+ name: "get_table_columns",
509
+ description: "i-AUD 메타 데이터에서 특정 테이블의 컬럼 목록(컬럼명, 데이터타입, 길이, PK 여부, Nullable, 설명)을 조회합니다. get_table_list에서 조회한 TABLE_ID를 사용합니다.",
510
+ inputSchema: {
511
+ type: "object",
512
+ properties: {
513
+ connectionCode: {
514
+ type: "string",
515
+ description: "데이터베이스 연결 코드 (i-AUD 시스템 DB)",
516
+ },
517
+ tableId: {
518
+ type: "string",
519
+ description: "테이블 엔티티 코드 (get_table_list 결과의 TABLE_ID 값)",
520
+ },
521
+ },
522
+ required: ["connectionCode", "tableId"],
523
+ },
524
+ },
459
525
  ];
460
526
  // Create MCP server
461
527
  const server = new Server({
@@ -909,6 +975,187 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
909
975
  ],
910
976
  };
911
977
  }
978
+ // ── i-AUD Database Query Tool Handlers ──────────────
979
+ case "execute_query": {
980
+ if (!isAudConfigured()) {
981
+ return {
982
+ content: [{
983
+ type: "text",
984
+ text: JSON.stringify({
985
+ error: "i-AUD 서버 접속 정보가 설정되지 않았습니다. 환경변수 AUD_SERVICE_URL, AUD_API_KEY, AUD_USER_NAME을 설정해 주세요.",
986
+ }),
987
+ }],
988
+ };
989
+ }
990
+ const connectionCode = args?.connectionCode;
991
+ const sql = args?.sql;
992
+ const limitRows = Math.min(Number(args?.limitRows) || 100, 1000);
993
+ if (!connectionCode || !sql) {
994
+ return {
995
+ content: [{
996
+ type: "text",
997
+ text: JSON.stringify({ error: "connectionCode와 sql 파라미터가 필요합니다." }),
998
+ }],
999
+ };
1000
+ }
1001
+ const result = await callSchemaService("SQL_EXECUTE", [
1002
+ { Key: "VS_CONN", Value: [connectionCode] },
1003
+ { Key: "#QUERY#", Value: [sql] },
1004
+ { Key: "VN_LIMIT_ROWS", Value: [String(limitRows)] },
1005
+ ]);
1006
+ if (result.CODE !== 0) {
1007
+ return {
1008
+ content: [{
1009
+ type: "text",
1010
+ text: JSON.stringify({ error: result.MSG, code: result.CODE }),
1011
+ }],
1012
+ };
1013
+ }
1014
+ // 결과를 읽기 쉬운 형태로 변환
1015
+ const rows = result.ROWS.map((row) => {
1016
+ const obj = {};
1017
+ for (let i = 0; i < result.COLUMNS.length; i++) {
1018
+ obj[result.COLUMNS[i].Name] = row[i];
1019
+ }
1020
+ return obj;
1021
+ });
1022
+ return {
1023
+ content: [{
1024
+ type: "text",
1025
+ text: JSON.stringify({
1026
+ success: true,
1027
+ rowCount: rows.length,
1028
+ columns: result.COLUMNS.map((c) => c.Name),
1029
+ rows,
1030
+ }, null, 2),
1031
+ }],
1032
+ };
1033
+ }
1034
+ case "get_table_list": {
1035
+ if (!isAudConfigured()) {
1036
+ return {
1037
+ content: [{
1038
+ type: "text",
1039
+ text: JSON.stringify({
1040
+ error: "i-AUD 서버 접속 정보가 설정되지 않았습니다. 환경변수 AUD_SERVICE_URL, AUD_API_KEY, AUD_USER_NAME을 설정해 주세요.",
1041
+ }),
1042
+ }],
1043
+ };
1044
+ }
1045
+ const connectionCode = args?.connectionCode;
1046
+ const filter = args?.filter || "";
1047
+ const limitRows = Number(args?.limitRows) || 500;
1048
+ if (!connectionCode) {
1049
+ return {
1050
+ content: [{
1051
+ type: "text",
1052
+ text: JSON.stringify({ error: "connectionCode 파라미터가 필요합니다." }),
1053
+ }],
1054
+ };
1055
+ }
1056
+ const params = [
1057
+ { Key: "VS_CONN", Value: [connectionCode] },
1058
+ { Key: "VN_LIMIT_ROWS", Value: [String(limitRows)] },
1059
+ ];
1060
+ if (filter) {
1061
+ params.push({ Key: "VS_FILTER_TEXT", Value: [filter] });
1062
+ }
1063
+ const result = await callSchemaService("TABLE", params);
1064
+ if (result.CODE !== 0) {
1065
+ return {
1066
+ content: [{
1067
+ type: "text",
1068
+ text: JSON.stringify({ error: result.MSG, code: result.CODE }),
1069
+ }],
1070
+ };
1071
+ }
1072
+ const tables = result.ROWS.map((row) => {
1073
+ const obj = {};
1074
+ for (let i = 0; i < result.COLUMNS.length; i++) {
1075
+ obj[result.COLUMNS[i].Name] = row[i];
1076
+ }
1077
+ return obj;
1078
+ });
1079
+ return {
1080
+ content: [{
1081
+ type: "text",
1082
+ text: JSON.stringify({
1083
+ success: true,
1084
+ count: tables.length,
1085
+ tables,
1086
+ }, null, 2),
1087
+ }],
1088
+ };
1089
+ }
1090
+ case "get_table_columns": {
1091
+ if (!isAudConfigured()) {
1092
+ return {
1093
+ content: [{
1094
+ type: "text",
1095
+ text: JSON.stringify({
1096
+ error: "i-AUD 서버 접속 정보가 설정되지 않았습니다. 환경변수 AUD_SERVICE_URL, AUD_API_KEY, AUD_USER_NAME을 설정해 주세요.",
1097
+ }),
1098
+ }],
1099
+ };
1100
+ }
1101
+ const connectionCode = args?.connectionCode;
1102
+ const tableId = args?.tableId;
1103
+ if (!connectionCode || !tableId) {
1104
+ return {
1105
+ content: [{
1106
+ type: "text",
1107
+ text: JSON.stringify({ error: "connectionCode와 tableId 파라미터가 필요합니다." }),
1108
+ }],
1109
+ };
1110
+ }
1111
+ const result = await callSchemaService("COLUMN", [
1112
+ { Key: "VS_CONN", Value: [connectionCode] },
1113
+ { Key: "VS_TABLE_ID", Value: [tableId] },
1114
+ ]);
1115
+ if (result.CODE !== 0) {
1116
+ return {
1117
+ content: [{
1118
+ type: "text",
1119
+ text: JSON.stringify({ error: result.MSG, code: result.CODE }),
1120
+ }],
1121
+ };
1122
+ }
1123
+ // 첫 행에서 테이블 기본 정보 추출
1124
+ let tableName = "";
1125
+ let schemaName = "";
1126
+ let tableDesc = "";
1127
+ if (result.ROWS.length > 0) {
1128
+ const nameIdx = result.COLUMNS.findIndex((c) => c.Name === "TABLE_NAME");
1129
+ const schemaIdx = result.COLUMNS.findIndex((c) => c.Name === "SCHEMA_NAME");
1130
+ const descIdx = result.COLUMNS.findIndex((c) => c.Name === "TABLE_DESC");
1131
+ if (nameIdx >= 0)
1132
+ tableName = String(result.ROWS[0][nameIdx] || "");
1133
+ if (schemaIdx >= 0)
1134
+ schemaName = String(result.ROWS[0][schemaIdx] || "");
1135
+ if (descIdx >= 0)
1136
+ tableDesc = String(result.ROWS[0][descIdx] || "");
1137
+ }
1138
+ const columns = result.ROWS.map((row) => {
1139
+ const obj = {};
1140
+ for (let i = 0; i < result.COLUMNS.length; i++) {
1141
+ obj[result.COLUMNS[i].Name] = row[i];
1142
+ }
1143
+ return obj;
1144
+ });
1145
+ return {
1146
+ content: [{
1147
+ type: "text",
1148
+ text: JSON.stringify({
1149
+ success: true,
1150
+ schemaName,
1151
+ tableName,
1152
+ tableDesc,
1153
+ columnCount: columns.length,
1154
+ columns,
1155
+ }, null, 2),
1156
+ }],
1157
+ };
1158
+ }
912
1159
  default:
913
1160
  return {
914
1161
  content: [
@@ -0,0 +1,40 @@
1
+ /**
2
+ * i-AUD Server REST API Client
3
+ *
4
+ * VS Code Extension(aud-dev)과 동일한 방식으로 i-AUD 서버의 REST API를 호출합니다.
5
+ *
6
+ * 설정 우선순위:
7
+ * 1. 환경변수 (AUD_SERVICE_URL, AUD_API_KEY, AUD_USER_NAME)
8
+ * 2. .vscode/settings.json의 "aud.config" 섹션 (CWD에서 상위로 탐색)
9
+ */
10
+ export interface AudApiConfig {
11
+ serviceUrl: string;
12
+ apiKey: string;
13
+ userName: string;
14
+ }
15
+ export interface SchemaServiceResult {
16
+ CODE: number;
17
+ MSG: string;
18
+ COLUMNS: {
19
+ Name: string;
20
+ DataType: string;
21
+ Length: number;
22
+ }[];
23
+ ROWS: any[][];
24
+ }
25
+ /**
26
+ * i-AUD 서버 접속 정보를 가져옵니다.
27
+ * 우선순위: 환경변수 → .vscode/settings.json
28
+ */
29
+ export declare function getAudConfig(): AudApiConfig;
30
+ /**
31
+ * i-AUD 서버 접속 정보가 설정되어 있는지 확인합니다.
32
+ */
33
+ export declare function isAudConfigured(): boolean;
34
+ /**
35
+ * i-AUD 서버의 @SCHEMA_SERVICE 서버 스크립트를 호출합니다.
36
+ */
37
+ export declare function callSchemaService(schemaType: string, params: {
38
+ Key: string;
39
+ Value: any[];
40
+ }[]): Promise<SchemaServiceResult>;
@@ -0,0 +1,192 @@
1
+ /**
2
+ * i-AUD Server REST API Client
3
+ *
4
+ * VS Code Extension(aud-dev)과 동일한 방식으로 i-AUD 서버의 REST API를 호출합니다.
5
+ *
6
+ * 설정 우선순위:
7
+ * 1. 환경변수 (AUD_SERVICE_URL, AUD_API_KEY, AUD_USER_NAME)
8
+ * 2. .vscode/settings.json의 "aud.config" 섹션 (CWD에서 상위로 탐색)
9
+ */
10
+ import { readFileSync, existsSync } from "fs";
11
+ import { join, dirname, resolve } from "path";
12
+ // 캐시: 한 번 읽으면 재사용
13
+ let _cachedConfig = null;
14
+ /**
15
+ * JSONC(주석 포함 JSON) 문자열에서 주석을 제거합니다.
16
+ */
17
+ function stripJsonComments(text) {
18
+ // 한 줄 주석 (//) 제거 — 문자열 내부의 // 는 보존
19
+ let result = "";
20
+ let inString = false;
21
+ let escapeNext = false;
22
+ for (let i = 0; i < text.length; i++) {
23
+ const ch = text[i];
24
+ if (escapeNext) {
25
+ result += ch;
26
+ escapeNext = false;
27
+ continue;
28
+ }
29
+ if (ch === "\\" && inString) {
30
+ result += ch;
31
+ escapeNext = true;
32
+ continue;
33
+ }
34
+ if (ch === '"') {
35
+ inString = !inString;
36
+ result += ch;
37
+ continue;
38
+ }
39
+ if (!inString && ch === "/" && text[i + 1] === "/") {
40
+ // 줄 끝까지 건너뛰기
41
+ const eol = text.indexOf("\n", i);
42
+ if (eol === -1)
43
+ break;
44
+ i = eol - 1; // for 루프에서 i++ 되므로
45
+ continue;
46
+ }
47
+ result += ch;
48
+ }
49
+ return result;
50
+ }
51
+ /**
52
+ * CWD에서 상위 디렉토리로 올라가며 .vscode/settings.json 을 찾습니다.
53
+ */
54
+ function findVscodeSettings() {
55
+ // 1) 환경변수로 직접 경로 지정
56
+ if (process.env.AUD_SETTINGS_PATH) {
57
+ const p = resolve(process.env.AUD_SETTINGS_PATH);
58
+ if (existsSync(p))
59
+ return p;
60
+ }
61
+ // 2) CWD에서 상위로 탐색
62
+ let dir = process.cwd();
63
+ for (let depth = 0; depth < 10; depth++) {
64
+ const candidate = join(dir, ".vscode", "settings.json");
65
+ if (existsSync(candidate))
66
+ return candidate;
67
+ const parent = dirname(dir);
68
+ if (parent === dir)
69
+ break; // root
70
+ dir = parent;
71
+ }
72
+ return null;
73
+ }
74
+ /**
75
+ * .vscode/settings.json에서 aud.config를 읽어옵니다.
76
+ */
77
+ function loadFromVscodeSettings() {
78
+ const settingsPath = findVscodeSettings();
79
+ if (!settingsPath)
80
+ return null;
81
+ try {
82
+ const raw = readFileSync(settingsPath, "utf-8");
83
+ const cleaned = stripJsonComments(raw);
84
+ const settings = JSON.parse(cleaned);
85
+ const audConfig = settings["aud.config"];
86
+ if (!audConfig)
87
+ return null;
88
+ const serviceUrl = audConfig.ServiceURL || "";
89
+ const apiKey = audConfig.ApiKey || "";
90
+ const userName = audConfig.UserName || "";
91
+ if (serviceUrl && apiKey && userName) {
92
+ return { serviceUrl, apiKey, userName };
93
+ }
94
+ }
95
+ catch {
96
+ // 파싱 실패 시 무시
97
+ }
98
+ return null;
99
+ }
100
+ /**
101
+ * i-AUD 서버 접속 정보를 가져옵니다.
102
+ * 우선순위: 환경변수 → .vscode/settings.json
103
+ */
104
+ export function getAudConfig() {
105
+ if (_cachedConfig)
106
+ return _cachedConfig;
107
+ // 1) 환경변수
108
+ const envUrl = process.env.AUD_SERVICE_URL || "";
109
+ const envKey = process.env.AUD_API_KEY || "";
110
+ const envUser = process.env.AUD_USER_NAME || "";
111
+ if (envUrl && envKey && envUser) {
112
+ _cachedConfig = { serviceUrl: envUrl, apiKey: envKey, userName: envUser };
113
+ return _cachedConfig;
114
+ }
115
+ // 2) .vscode/settings.json
116
+ const fromSettings = loadFromVscodeSettings();
117
+ if (fromSettings) {
118
+ _cachedConfig = fromSettings;
119
+ return _cachedConfig;
120
+ }
121
+ // 3) 부분적으로라도 환경변수 값 반환
122
+ return { serviceUrl: envUrl, apiKey: envKey, userName: envUser };
123
+ }
124
+ /**
125
+ * i-AUD 서버 접속 정보가 설정되어 있는지 확인합니다.
126
+ */
127
+ export function isAudConfigured() {
128
+ const config = getAudConfig();
129
+ return !!(config.serviceUrl && config.apiKey && config.userName);
130
+ }
131
+ /**
132
+ * PACKET JSON을 구성합니다. (VS Code Extension의 getPacketText와 동일한 구조)
133
+ */
134
+ function buildPacket(config, scriptCode, script, params) {
135
+ const packet = {
136
+ AuthInfo: { USER_ID: config.userName },
137
+ ParamSet: [
138
+ { Key: "VS_USER_ID", Value: [config.userName] },
139
+ ...params,
140
+ ],
141
+ DataSet: [],
142
+ JScript: {
143
+ Code: scriptCode,
144
+ Encryped: true,
145
+ Command: script
146
+ },
147
+ };
148
+ return JSON.stringify(packet);
149
+ }
150
+ /**
151
+ * i-AUD 서버의 @SCHEMA_SERVICE 서버 스크립트를 호출합니다.
152
+ */
153
+ export async function callSchemaService(schemaType, params) {
154
+ const config = getAudConfig();
155
+ if (!config.serviceUrl || !config.apiKey) {
156
+ throw new Error("i-AUD 서버 접속 정보를 찾을 수 없습니다.\n"
157
+ + "다음 중 하나를 설정해 주세요:\n"
158
+ + " 1) .vscode/settings.json의 aud.config (ServiceURL, ApiKey, UserName)\n"
159
+ + " 2) 환경변수: AUD_SERVICE_URL, AUD_API_KEY, AUD_USER_NAME");
160
+ }
161
+ const allParams = [
162
+ { Key: "#SCHEMA_TYPE#", Value: [schemaType] },
163
+ ...params,
164
+ ];
165
+ const url = config.serviceUrl
166
+ + (config.serviceUrl.endsWith("/") ? "servlet/DataSet.maf" : "/servlet/DataSet.maf");
167
+ const packetStr = buildPacket(config, "@AUD_SAVE_SERVICE@SCHEMA_SERVICE", "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", allParams);
168
+ // multipart/form-data 형식으로 전송 (VS Code Extension과 동일)
169
+ const formBody = new URLSearchParams();
170
+ formBody.append("ENC", "false");
171
+ formBody.append("OUT", "1");
172
+ formBody.append("hashcode", "aud.mcp." + config.userName);
173
+ formBody.append("ver", "400");
174
+ formBody.append("PACKET", packetStr);
175
+ const response = await fetch(url, {
176
+ method: "POST",
177
+ headers: {
178
+ "Content-Type": "application/x-www-form-urlencoded",
179
+ "Authorization": "Bearer " + config.apiKey,
180
+ },
181
+ body: formBody.toString(),
182
+ });
183
+ if (!response.ok) {
184
+ throw new Error(`i-AUD 서버 요청 실패: HTTP ${response.status} ${response.statusText}`);
185
+ }
186
+ const data = await response.json();
187
+ // 서버 레벨 오류 체크
188
+ if (data.retCode && data.retMsg) {
189
+ throw new Error(`i-AUD 서버 오류: [${data.retCode}] ${data.retMsg}`);
190
+ }
191
+ return data;
192
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bimatrix-aud-platform/aud_mcp_server",
3
- "version": "1.1.4",
3
+ "version": "1.1.6",
4
4
  "description": "MCP Server for i-AUD MTSD document validation and generation",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",