@bimatrix-aud-platform/aud_mcp_server 1.1.5 → 1.1.7
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 +30 -1
- package/dist/utils/aud-api-client.d.ts +5 -0
- package/dist/utils/aud-api-client.js +84 -16
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -12,7 +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
|
+
import { callSchemaService, isAudConfigured, setWorkspaceRoots } from "./utils/aud-api-client.js";
|
|
16
16
|
const __filename = fileURLToPath(import.meta.url);
|
|
17
17
|
const __dirname = dirname(__filename);
|
|
18
18
|
// Load MTSD schema
|
|
@@ -539,6 +539,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
539
539
|
// Handle tool calls
|
|
540
540
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
541
541
|
const { name, arguments: args } = request.params;
|
|
542
|
+
await ensureWorkspaceRoots();
|
|
542
543
|
try {
|
|
543
544
|
switch (name) {
|
|
544
545
|
case "validate_mtsd": {
|
|
@@ -1180,6 +1181,34 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1180
1181
|
};
|
|
1181
1182
|
}
|
|
1182
1183
|
});
|
|
1184
|
+
// MCP 클라이언트에서 워크스페이스 roots를 가져와 설정 탐색 경로로 등록
|
|
1185
|
+
let _rootsResolved = false;
|
|
1186
|
+
async function ensureWorkspaceRoots() {
|
|
1187
|
+
if (_rootsResolved)
|
|
1188
|
+
return;
|
|
1189
|
+
_rootsResolved = true;
|
|
1190
|
+
try {
|
|
1191
|
+
const result = await server.request({ method: "roots/list" }, { parse: (d) => d });
|
|
1192
|
+
if (result?.roots?.length) {
|
|
1193
|
+
const paths = [];
|
|
1194
|
+
for (const root of result.roots) {
|
|
1195
|
+
try {
|
|
1196
|
+
if (root.uri?.startsWith("file:///")) {
|
|
1197
|
+
paths.push(fileURLToPath(root.uri));
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
catch { /* URI 변환 실패 무시 */ }
|
|
1201
|
+
}
|
|
1202
|
+
if (paths.length > 0) {
|
|
1203
|
+
setWorkspaceRoots(paths);
|
|
1204
|
+
console.error(`[aud_mcp_server] Workspace roots: ${paths.join(", ")}`);
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
catch {
|
|
1209
|
+
// 클라이언트가 roots/list를 지원하지 않으면 무시 (CWD 등 다른 전략 사용)
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1183
1212
|
// Start server
|
|
1184
1213
|
async function main() {
|
|
1185
1214
|
const transport = new StdioServerTransport();
|
|
@@ -22,6 +22,11 @@ export interface SchemaServiceResult {
|
|
|
22
22
|
}[];
|
|
23
23
|
ROWS: any[][];
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* MCP 클라이언트의 roots/list 결과에서 워크스페이스 경로를 설정합니다.
|
|
27
|
+
* index.ts에서 서버 초기화 시 호출됩니다.
|
|
28
|
+
*/
|
|
29
|
+
export declare function setWorkspaceRoots(roots: string[]): void;
|
|
25
30
|
/**
|
|
26
31
|
* i-AUD 서버 접속 정보를 가져옵니다.
|
|
27
32
|
* 우선순위: 환경변수 → .vscode/settings.json
|
|
@@ -9,8 +9,19 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { readFileSync, existsSync } from "fs";
|
|
11
11
|
import { join, dirname, resolve } from "path";
|
|
12
|
+
import { fileURLToPath } from "url";
|
|
12
13
|
// 캐시: 한 번 읽으면 재사용
|
|
13
14
|
let _cachedConfig = null;
|
|
15
|
+
// MCP 클라이언트에서 전달받은 워크스페이스 루트 경로들
|
|
16
|
+
let _workspaceRoots = [];
|
|
17
|
+
/**
|
|
18
|
+
* MCP 클라이언트의 roots/list 결과에서 워크스페이스 경로를 설정합니다.
|
|
19
|
+
* index.ts에서 서버 초기화 시 호출됩니다.
|
|
20
|
+
*/
|
|
21
|
+
export function setWorkspaceRoots(roots) {
|
|
22
|
+
_workspaceRoots = roots;
|
|
23
|
+
_cachedConfig = null; // 캐시 초기화하여 새로운 경로로 재탐색
|
|
24
|
+
}
|
|
14
25
|
/**
|
|
15
26
|
* JSONC(주석 포함 JSON) 문자열에서 주석을 제거합니다.
|
|
16
27
|
*/
|
|
@@ -49,26 +60,81 @@ function stripJsonComments(text) {
|
|
|
49
60
|
return result;
|
|
50
61
|
}
|
|
51
62
|
/**
|
|
52
|
-
*
|
|
63
|
+
* 주어진 디렉토리에서 상위로 올라가며 aud.config가 포함된 .vscode/settings.json 을 찾습니다.
|
|
64
|
+
*/
|
|
65
|
+
function searchUpward(startDir) {
|
|
66
|
+
let dir = startDir;
|
|
67
|
+
for (let depth = 0; depth < 10; depth++) {
|
|
68
|
+
const candidate = join(dir, ".vscode", "settings.json");
|
|
69
|
+
if (existsSync(candidate)) {
|
|
70
|
+
// aud.config 가 포함되어 있는지 확인
|
|
71
|
+
try {
|
|
72
|
+
const raw = readFileSync(candidate, "utf-8");
|
|
73
|
+
if (raw.includes("aud.config"))
|
|
74
|
+
return candidate;
|
|
75
|
+
}
|
|
76
|
+
catch { /* 읽기 실패 시 건너뛰기 */ }
|
|
77
|
+
}
|
|
78
|
+
const parent = dirname(dir);
|
|
79
|
+
if (parent === dir)
|
|
80
|
+
break; // root
|
|
81
|
+
dir = parent;
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 여러 전략으로 .vscode/settings.json 을 찾습니다.
|
|
53
87
|
*/
|
|
54
88
|
function findVscodeSettings() {
|
|
89
|
+
const tried = [];
|
|
55
90
|
// 1) 환경변수로 직접 경로 지정
|
|
56
91
|
if (process.env.AUD_SETTINGS_PATH) {
|
|
57
92
|
const p = resolve(process.env.AUD_SETTINGS_PATH);
|
|
93
|
+
tried.push(`AUD_SETTINGS_PATH=${p}`);
|
|
58
94
|
if (existsSync(p))
|
|
59
95
|
return p;
|
|
60
96
|
}
|
|
61
|
-
// 2)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
97
|
+
// 2) AUD_WORKSPACE_DIR 환경변수
|
|
98
|
+
if (process.env.AUD_WORKSPACE_DIR) {
|
|
99
|
+
const dir = resolve(process.env.AUD_WORKSPACE_DIR);
|
|
100
|
+
tried.push(`AUD_WORKSPACE_DIR=${dir}`);
|
|
101
|
+
const found = searchUpward(dir);
|
|
102
|
+
if (found)
|
|
103
|
+
return found;
|
|
104
|
+
}
|
|
105
|
+
// 3) MCP 클라이언트가 알려준 워크스페이스 루트에서 탐색
|
|
106
|
+
for (const root of _workspaceRoots) {
|
|
107
|
+
tried.push(`root=${root}`);
|
|
108
|
+
const fromRoot = searchUpward(root);
|
|
109
|
+
if (fromRoot)
|
|
110
|
+
return fromRoot;
|
|
111
|
+
}
|
|
112
|
+
// 4) CWD에서 상위로 탐색
|
|
113
|
+
const cwd = process.cwd();
|
|
114
|
+
tried.push(`cwd=${cwd}`);
|
|
115
|
+
const fromCwd = searchUpward(cwd);
|
|
116
|
+
if (fromCwd)
|
|
117
|
+
return fromCwd;
|
|
118
|
+
// 5) 이 스크립트 파일(__dirname)에서 상위로 탐색 (로컬 설치 시 프로젝트 내부)
|
|
119
|
+
try {
|
|
120
|
+
const scriptDir = dirname(fileURLToPath(import.meta.url));
|
|
121
|
+
tried.push(`__dirname=${scriptDir}`);
|
|
122
|
+
const fromScript = searchUpward(scriptDir);
|
|
123
|
+
if (fromScript)
|
|
124
|
+
return fromScript;
|
|
125
|
+
}
|
|
126
|
+
catch { /* import.meta.url 미지원 환경 무시 */ }
|
|
127
|
+
// 6) process.argv[1] (실행된 스크립트 경로)에서 상위로 탐색
|
|
128
|
+
if (process.argv[1]) {
|
|
129
|
+
const argvDir = dirname(resolve(process.argv[1]));
|
|
130
|
+
tried.push(`argv[1]=${argvDir}`);
|
|
131
|
+
const fromArgv = searchUpward(argvDir);
|
|
132
|
+
if (fromArgv)
|
|
133
|
+
return fromArgv;
|
|
71
134
|
}
|
|
135
|
+
// 모든 전략 실패 — 진단 로그 출력 (stderr → MCP 클라이언트 로그)
|
|
136
|
+
process.stderr.write(`[aud_mcp_server] .vscode/settings.json (aud.config) not found.\n`
|
|
137
|
+
+ ` Searched from: ${tried.join(", ")}\n`);
|
|
72
138
|
return null;
|
|
73
139
|
}
|
|
74
140
|
/**
|
|
@@ -89,11 +155,12 @@ function loadFromVscodeSettings() {
|
|
|
89
155
|
const apiKey = audConfig.ApiKey || "";
|
|
90
156
|
const userName = audConfig.UserName || "";
|
|
91
157
|
if (serviceUrl && apiKey && userName) {
|
|
158
|
+
process.stderr.write(`[aud_mcp_server] Config loaded from: ${settingsPath}\n`);
|
|
92
159
|
return { serviceUrl, apiKey, userName };
|
|
93
160
|
}
|
|
94
161
|
}
|
|
95
|
-
catch {
|
|
96
|
-
|
|
162
|
+
catch (e) {
|
|
163
|
+
process.stderr.write(`[aud_mcp_server] Failed to parse ${settingsPath}: ${e.message}\n`);
|
|
97
164
|
}
|
|
98
165
|
return null;
|
|
99
166
|
}
|
|
@@ -131,7 +198,7 @@ export function isAudConfigured() {
|
|
|
131
198
|
/**
|
|
132
199
|
* PACKET JSON을 구성합니다. (VS Code Extension의 getPacketText와 동일한 구조)
|
|
133
200
|
*/
|
|
134
|
-
function buildPacket(config, scriptCode, params) {
|
|
201
|
+
function buildPacket(config, scriptCode, script, params) {
|
|
135
202
|
const packet = {
|
|
136
203
|
AuthInfo: { USER_ID: config.userName },
|
|
137
204
|
ParamSet: [
|
|
@@ -141,7 +208,8 @@ function buildPacket(config, scriptCode, params) {
|
|
|
141
208
|
DataSet: [],
|
|
142
209
|
JScript: {
|
|
143
210
|
Code: scriptCode,
|
|
144
|
-
|
|
211
|
+
Encryped: true,
|
|
212
|
+
Command: script
|
|
145
213
|
},
|
|
146
214
|
};
|
|
147
215
|
return JSON.stringify(packet);
|
|
@@ -163,7 +231,7 @@ export async function callSchemaService(schemaType, params) {
|
|
|
163
231
|
];
|
|
164
232
|
const url = config.serviceUrl
|
|
165
233
|
+ (config.serviceUrl.endsWith("/") ? "servlet/DataSet.maf" : "/servlet/DataSet.maf");
|
|
166
|
-
const packetStr = buildPacket(config, "@AUD_SAVE_SERVICE@SCHEMA_SERVICE", allParams);
|
|
234
|
+
const packetStr = buildPacket(config, "@AUD_SAVE_SERVICE@SCHEMA_SERVICE", "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", allParams);
|
|
167
235
|
// multipart/form-data 형식으로 전송 (VS Code Extension과 동일)
|
|
168
236
|
const formBody = new URLSearchParams();
|
|
169
237
|
formBody.append("ENC", "false");
|