aiexecode 1.0.88 → 1.0.90
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.
Potentially problematic release.
This version of aiexecode might be problematic. Click here for more details.
- package/index.js +128 -20
- package/mcp-agent-lib/.claude/settings.local.json +9 -0
- package/mcp-agent-lib/example/01-basic-usage.js +82 -0
- package/mcp-agent-lib/example/02-quick-start.js +52 -0
- package/mcp-agent-lib/example/03-http-server.js +76 -0
- package/mcp-agent-lib/example/04-multiple-servers.js +117 -0
- package/mcp-agent-lib/example/05-error-handling.js +116 -0
- package/mcp-agent-lib/example/06-resources-and-prompts.js +174 -0
- package/mcp-agent-lib/example/07-advanced-configuration.js +191 -0
- package/mcp-agent-lib/example/08-real-world-chatbot.js +331 -0
- package/mcp-agent-lib/example/README.md +346 -0
- package/mcp-agent-lib/sampleMCPHost/index.js +267 -0
- package/mcp-agent-lib/sampleMCPHost/mcp_config.json +18 -0
- package/mcp-agent-lib/src/mcp_client.js +302 -77
- package/package.json +1 -1
- package/payload_viewer/out/404/index.html +1 -1
- package/payload_viewer/out/404.html +1 -1
- package/payload_viewer/out/index.html +1 -1
- package/payload_viewer/out/index.txt +1 -1
- package/src/ai_based/orchestrator.js +4 -1
- package/src/cli/mcp_cli.js +14 -7
- package/src/cli/mcp_commands.js +31 -15
- package/src/commands/mcp.js +36 -18
- package/src/frontend/App.js +54 -4
- package/src/frontend/components/BlankLine.js +5 -3
- package/src/frontend/components/ConversationItem.js +43 -10
- package/src/system/code_executer.js +6 -0
- package/src/system/mcp_integration.js +94 -40
- package/src/tools/file_reader.js +6 -0
- package/src/tools/glob.js +3 -0
- package/src/tools/ripgrep.js +2 -0
- package/src/tools/web_downloader.js +3 -0
- package/src/util/mcp_config_manager.js +41 -20
- /package/payload_viewer/out/_next/static/{dp582oDmc4bDYYIktREJ4 → w4dMVYalgk7djrLxRxWiE}/_buildManifest.js +0 -0
- /package/payload_viewer/out/_next/static/{dp582oDmc4bDYYIktREJ4 → w4dMVYalgk7djrLxRxWiE}/_clientMiddlewareManifest.json +0 -0
- /package/payload_viewer/out/_next/static/{dp582oDmc4bDYYIktREJ4 → w4dMVYalgk7djrLxRxWiE}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
# MCP Agent Client - 예제 모음
|
|
2
|
+
|
|
3
|
+
이 디렉토리는 MCP Agent Client 라이브러리의 사용법을 보여주는 예제 코드들을 포함하고 있습니다.
|
|
4
|
+
|
|
5
|
+
## 📚 예제 목록
|
|
6
|
+
|
|
7
|
+
### 1️⃣ 기본 사용법 (`01-basic-usage.js`)
|
|
8
|
+
MCP Agent Client의 가장 기본적인 사용 방법을 배웁니다.
|
|
9
|
+
- 클라이언트 생성 및 초기화
|
|
10
|
+
- 서버 연결
|
|
11
|
+
- 도구 목록 조회 및 실행
|
|
12
|
+
- 상태 확인
|
|
13
|
+
- 연결 해제
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
node 01-basic-usage.js
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**핵심 개념:**
|
|
20
|
+
- `new MCPAgentClient(options)` - 클라이언트 생성
|
|
21
|
+
- `client.initialize(config)` - 서버 연결
|
|
22
|
+
- `client.getAvailableTools()` - 도구 목록 조회
|
|
23
|
+
- `client.executeTool(name, args)` - 도구 실행
|
|
24
|
+
- `client.disconnect()` - 연결 해제
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
### 2️⃣ 빠른 시작 (`02-quick-start.js`)
|
|
29
|
+
가장 간단하게 시작하는 방법을 보여줍니다.
|
|
30
|
+
- `quickStart()` 함수로 한 줄에 초기화
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
node 02-quick-start.js
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**핵심 개념:**
|
|
37
|
+
- `quickStart(config, options)` - 원스텝 초기화
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
### 3️⃣ HTTP 서버 연결 (`03-http-server.js`)
|
|
42
|
+
로컬 stdio 서버가 아닌 원격 HTTP/HTTPS 서버에 연결하는 방법입니다.
|
|
43
|
+
- HTTP/HTTPS 서버 연결
|
|
44
|
+
- Bearer 토큰 인증
|
|
45
|
+
- 헤더 설정
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
node 03-http-server.js
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**핵심 개념:**
|
|
52
|
+
- `type: 'http'` - HTTP 전송 방식
|
|
53
|
+
- `headers` - 인증 헤더 설정
|
|
54
|
+
- 서버별 도구 조회
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
### 4️⃣ 다중 서버 연결 (`04-multiple-servers.js`)
|
|
59
|
+
여러 MCP 서버를 동시에 사용하는 방법입니다.
|
|
60
|
+
- 여러 서버 동시 연결 (stdio, HTTP, SSE)
|
|
61
|
+
- 서버별 도구 분류
|
|
62
|
+
- 자동 서버 검색으로 도구 실행
|
|
63
|
+
- 리소스 및 프롬프트 조회
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
node 04-multiple-servers.js
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**핵심 개념:**
|
|
70
|
+
- `mcpServers` 객체에 여러 서버 정의
|
|
71
|
+
- `getServerTools(serverName)` - 특정 서버 도구만 조회
|
|
72
|
+
- `callTool(serverName, toolName, args)` - 서버 지정 실행
|
|
73
|
+
- `executeTool(toolName, args)` - 자동 서버 검색
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
### 5️⃣ 에러 처리 및 재시도 (`05-error-handling.js`)
|
|
78
|
+
강력한 에러 처리와 자동 재시도 메커니즘을 활용합니다.
|
|
79
|
+
- 자동 재시도 설정
|
|
80
|
+
- 타임아웃 처리
|
|
81
|
+
- 이벤트 기반 에러 모니터링
|
|
82
|
+
- 서버 연결 상태 추적
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
node 05-error-handling.js
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**핵심 개념:**
|
|
89
|
+
- `timeout`, `retries` 옵션
|
|
90
|
+
- `client.on('serverError')` - 에러 이벤트
|
|
91
|
+
- `client.on('serverDisconnected')` - 연결 해제 이벤트
|
|
92
|
+
- `client.on('serverStatusChange')` - 상태 변경 이벤트
|
|
93
|
+
- 호출별 커스텀 타임아웃/재시도
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
### 6️⃣ 리소스와 프롬프트 (`06-resources-and-prompts.js`)
|
|
98
|
+
도구 외에도 리소스(Resources)와 프롬프트(Prompts)를 사용하는 방법입니다.
|
|
99
|
+
- 리소스 목록 조회 및 읽기
|
|
100
|
+
- 프롬프트 목록 조회 및 실행
|
|
101
|
+
- URI 기반 리소스 접근
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
node 06-resources-and-prompts.js
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**핵심 개념:**
|
|
108
|
+
- `getAvailableResources()` - 리소스 목록
|
|
109
|
+
- `readResource(uri)` - 리소스 읽기
|
|
110
|
+
- `getAvailablePrompts()` - 프롬프트 목록
|
|
111
|
+
- `executePrompt(name, args)` - 프롬프트 실행
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### 7️⃣ 고급 설정 (`07-advanced-configuration.js`)
|
|
116
|
+
모든 설정 옵션과 고급 기능을 다룹니다.
|
|
117
|
+
- 전체 설정 옵션 상세 설명
|
|
118
|
+
- 환경변수를 통한 설정
|
|
119
|
+
- 보안 강화 설정
|
|
120
|
+
- 커스텀 로깅
|
|
121
|
+
- 메모리 관리
|
|
122
|
+
- 안전한 JSON 처리
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
node 07-advanced-configuration.js
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**핵심 개념:**
|
|
129
|
+
- 모든 `MCPAgentClient` 옵션
|
|
130
|
+
- 환경변수 (`MCP_*`)
|
|
131
|
+
- `secureLog()` - 보안 로깅
|
|
132
|
+
- `safeJsonStringify()`, `safeJsonParse()` - 안전한 JSON
|
|
133
|
+
- `performMemoryCleanup()` - 메모리 정리
|
|
134
|
+
- `getServerCapabilities()` - 서버 기능 조회
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
### 8️⃣ 실전 예제: AI 챗봇 (`08-real-world-chatbot.js`)
|
|
139
|
+
MCP Agent Client를 활용한 실제 AI 챗봇 구현 예제입니다.
|
|
140
|
+
- 대화형 인터페이스
|
|
141
|
+
- 의도 파싱 (Intent Recognition)
|
|
142
|
+
- 파일 시스템, GitHub, 메모리 등 다양한 도구 통합
|
|
143
|
+
- 대화 히스토리 관리
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
node 08-real-world-chatbot.js
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**핵심 개념:**
|
|
150
|
+
- 실전 애플리케이션 구조
|
|
151
|
+
- 여러 MCP 서버 통합
|
|
152
|
+
- 사용자 의도에 따른 도구 선택
|
|
153
|
+
- 에러 처리 및 사용자 피드백
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 🚀 시작하기
|
|
158
|
+
|
|
159
|
+
### 1. 의존성 설치
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
cd ..
|
|
163
|
+
npm install
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### 2. 예제 실행
|
|
167
|
+
|
|
168
|
+
각 예제는 독립적으로 실행할 수 있습니다:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
node example/01-basic-usage.js
|
|
172
|
+
node example/02-quick-start.js
|
|
173
|
+
# ... 등등
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### 3. 실제 MCP 서버 연결
|
|
177
|
+
|
|
178
|
+
예제를 실제로 작동시키려면 MCP 서버가 필요합니다. 다음 중 하나를 사용할 수 있습니다:
|
|
179
|
+
|
|
180
|
+
**공식 MCP 서버들:**
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
# 파일 시스템 서버
|
|
184
|
+
npx -y @modelcontextprotocol/server-filesystem /tmp
|
|
185
|
+
|
|
186
|
+
# GitHub 서버
|
|
187
|
+
npx -y @modelcontextprotocol/server-github
|
|
188
|
+
|
|
189
|
+
# 메모리/메모장 서버
|
|
190
|
+
npx -y @modelcontextprotocol/server-memory
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**설정 예시:**
|
|
194
|
+
|
|
195
|
+
```javascript
|
|
196
|
+
{
|
|
197
|
+
mcpServers: {
|
|
198
|
+
'filesystem': {
|
|
199
|
+
type: 'stdio',
|
|
200
|
+
command: 'npx',
|
|
201
|
+
args: ['-y', '@modelcontextprotocol/server-filesystem', '/tmp']
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 📖 학습 순서 추천
|
|
210
|
+
|
|
211
|
+
1. **초보자:**
|
|
212
|
+
- `02-quick-start.js` - 가장 빠르게 시작
|
|
213
|
+
- `01-basic-usage.js` - 기본 개념 이해
|
|
214
|
+
- `03-http-server.js` - HTTP 서버 연결
|
|
215
|
+
|
|
216
|
+
2. **중급자:**
|
|
217
|
+
- `04-multiple-servers.js` - 다중 서버 활용
|
|
218
|
+
- `05-error-handling.js` - 안정적인 애플리케이션
|
|
219
|
+
- `06-resources-and-prompts.js` - 전체 기능 활용
|
|
220
|
+
|
|
221
|
+
3. **고급자:**
|
|
222
|
+
- `07-advanced-configuration.js` - 모든 설정 마스터
|
|
223
|
+
- `08-real-world-chatbot.js` - 실전 애플리케이션
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## 🔧 주요 API 요약
|
|
228
|
+
|
|
229
|
+
### 클라이언트 생성
|
|
230
|
+
```javascript
|
|
231
|
+
import { MCPAgentClient, quickStart } from '../index.js';
|
|
232
|
+
|
|
233
|
+
// 방법 1: 수동 생성
|
|
234
|
+
const client = new MCPAgentClient(options);
|
|
235
|
+
await client.initialize(config);
|
|
236
|
+
|
|
237
|
+
// 방법 2: 빠른 시작
|
|
238
|
+
const client = await quickStart(config, options);
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### 도구(Tools) 사용
|
|
242
|
+
```javascript
|
|
243
|
+
// 전체 도구 목록
|
|
244
|
+
const tools = client.getAvailableTools();
|
|
245
|
+
|
|
246
|
+
// 서버별 도구 목록
|
|
247
|
+
const tools = client.getServerTools('serverName');
|
|
248
|
+
|
|
249
|
+
// 도구 실행 (자동 서버 검색)
|
|
250
|
+
const result = await client.executeTool('toolName', { arg: 'value' });
|
|
251
|
+
|
|
252
|
+
// 도구 실행 (서버 지정)
|
|
253
|
+
const result = await client.callTool('serverName', 'toolName', { arg: 'value' });
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### 리소스(Resources) 사용
|
|
257
|
+
```javascript
|
|
258
|
+
// 리소스 목록
|
|
259
|
+
const resources = client.getAvailableResources();
|
|
260
|
+
|
|
261
|
+
// 리소스 읽기
|
|
262
|
+
const content = await client.readResource('uri://resource');
|
|
263
|
+
const content = await client.readResourceFromServer('serverName', 'uri://resource');
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### 프롬프트(Prompts) 사용
|
|
267
|
+
```javascript
|
|
268
|
+
// 프롬프트 목록
|
|
269
|
+
const prompts = client.getAvailablePrompts();
|
|
270
|
+
|
|
271
|
+
// 프롬프트 실행
|
|
272
|
+
const result = await client.executePrompt('promptName', { arg: 'value' });
|
|
273
|
+
const result = await client.getPrompt('serverName', 'promptName', { arg: 'value' });
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### 상태 관리
|
|
277
|
+
```javascript
|
|
278
|
+
// 전체 상태
|
|
279
|
+
const status = client.getStatus();
|
|
280
|
+
|
|
281
|
+
// 서버 기능
|
|
282
|
+
const caps = client.getServerCapabilities('serverName');
|
|
283
|
+
|
|
284
|
+
// 연결 해제
|
|
285
|
+
await client.disconnect();
|
|
286
|
+
await client.cleanup(); // 메모리 정리 포함
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### 이벤트 리스닝
|
|
290
|
+
```javascript
|
|
291
|
+
client.on('serverError', (serverName, error) => { ... });
|
|
292
|
+
client.on('serverDisconnected', (serverName) => { ... });
|
|
293
|
+
client.on('serverStatusChange', ({ serverName, status }) => { ... });
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## 🛡️ 보안 고려사항
|
|
299
|
+
|
|
300
|
+
MCP Agent Client는 다음 보안 기능을 내장하고 있습니다:
|
|
301
|
+
|
|
302
|
+
- ✅ **명령어 화이트리스트**: `allowedCommands`로 실행 가능한 명령어 제한
|
|
303
|
+
- ✅ **인자 검증**: 위험한 셸 문자 자동 차단
|
|
304
|
+
- ✅ **Prototype Pollution 방지**: JSON 파싱 시 자동 검사
|
|
305
|
+
- ✅ **민감 정보 보호**: 로그에서 자동으로 토큰/비밀번호 제거
|
|
306
|
+
- ✅ **응답 크기 제한**: DoS 공격 방지
|
|
307
|
+
|
|
308
|
+
자세한 내용은 `07-advanced-configuration.js`를 참고하세요.
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## 🐛 문제 해결
|
|
313
|
+
|
|
314
|
+
### 서버 연결 실패
|
|
315
|
+
```
|
|
316
|
+
❌ Failed to connect to server
|
|
317
|
+
```
|
|
318
|
+
→ 서버 명령어와 경로를 확인하세요. `allowedCommands`에 등록되어 있는지 확인하세요.
|
|
319
|
+
|
|
320
|
+
### 도구를 찾을 수 없음
|
|
321
|
+
```
|
|
322
|
+
도구 'xxx'을 제공하는 서버를 찾을 수 없습니다
|
|
323
|
+
```
|
|
324
|
+
→ `client.getAvailableTools()`로 사용 가능한 도구를 먼저 확인하세요.
|
|
325
|
+
|
|
326
|
+
### 타임아웃 발생
|
|
327
|
+
```
|
|
328
|
+
Server readiness timeout
|
|
329
|
+
```
|
|
330
|
+
→ `timeout`, `serverReadyTimeout` 옵션을 늘려보세요.
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## 📝 라이선스
|
|
335
|
+
|
|
336
|
+
이 예제들은 메인 프로젝트와 동일한 라이선스를 따릅니다.
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## 🤝 기여하기
|
|
341
|
+
|
|
342
|
+
더 나은 예제나 사용 사례가 있다면 PR을 보내주세요!
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
**Happy Coding! 🚀**
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* MCP 사용 예시 프로그램
|
|
5
|
+
*
|
|
6
|
+
* MCP를 사용하는 방법을 보여줍니다:
|
|
7
|
+
* 1. MCP 서버 설정 불러오기
|
|
8
|
+
* 2. MCP Agent 만들고 초기화하기
|
|
9
|
+
* 3. 연결된 서버들로부터 사용 가능한 도구 목록 가져오기
|
|
10
|
+
* 4. 도구 실행하고 결과 처리하기
|
|
11
|
+
* 5. 종료할 때 연결 정리하기
|
|
12
|
+
*
|
|
13
|
+
* ============================================
|
|
14
|
+
* MCP Agent 주요 메소드 설명
|
|
15
|
+
* ============================================
|
|
16
|
+
*
|
|
17
|
+
* 1. mcpAgent.initialize(config)
|
|
18
|
+
* - 역할: MCP 서버들에 연결합니다
|
|
19
|
+
* - 입력: config 객체 (서버 설정 정보)
|
|
20
|
+
* - 반환: Promise (연결 완료 시 resolve)
|
|
21
|
+
* - 설명: HTTP, stdio 등 다양한 방식으로 서버 프로세스를 시작하고 연결합니다
|
|
22
|
+
*
|
|
23
|
+
* 2. mcpAgent.getAvailableTools()
|
|
24
|
+
* - 역할: 연결된 모든 서버가 제공하는 도구 목록을 가져옵니다
|
|
25
|
+
* - 입력: 없음
|
|
26
|
+
* - 반환: 도구 배열 [{ name, server, description, inputSchema }, ...]
|
|
27
|
+
* - 설명: AI에게 "어떤 도구들을 사용할 수 있는지" 알려주기 위한 정보를 제공합니다
|
|
28
|
+
*
|
|
29
|
+
* 3. mcpAgent.executeTool(toolName, args)
|
|
30
|
+
* - 역할: 특정 도구를 실행하고 결과를 받아옵니다
|
|
31
|
+
* - 입력: toolName (도구 이름 문자열), args (파라미터 객체)
|
|
32
|
+
* - 반환: { success: boolean, data: any, error?: string }
|
|
33
|
+
* - 설명: AI의 Function Calling 요청을 실제 MCP 서버 함수 호출로 변환하여 실행합니다
|
|
34
|
+
*
|
|
35
|
+
* 4. mcpAgent.cleanup()
|
|
36
|
+
* - 역할: 모든 MCP 서버 연결을 종료하고 리소스를 정리합니다
|
|
37
|
+
* - 입력: 없음
|
|
38
|
+
* - 반환: Promise (정리 완료 시 resolve)
|
|
39
|
+
* - 설명: 프로그램 종료 전 반드시 호출하여 프로세스와 네트워크 연결을 깔끔하게 정리합니다
|
|
40
|
+
*
|
|
41
|
+
* ============================================
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
import { MCPAgentClient } from '../index.js';
|
|
45
|
+
import { readFileSync } from 'fs';
|
|
46
|
+
import { join, dirname } from 'path';
|
|
47
|
+
import { fileURLToPath } from 'url';
|
|
48
|
+
|
|
49
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
50
|
+
|
|
51
|
+
async function main() {
|
|
52
|
+
console.log('='.repeat(50));
|
|
53
|
+
console.log('MCP 사용 예시 - 시작합니다...');
|
|
54
|
+
console.log('='.repeat(50));
|
|
55
|
+
|
|
56
|
+
// ========================================
|
|
57
|
+
// [1단계] MCP 서버 설정 불러오기
|
|
58
|
+
// ========================================
|
|
59
|
+
// mcp_config.json 파일에는 어떤 MCP 서버들을 사용할지 정의되어 있습니다.
|
|
60
|
+
// 예: context7(문서 검색), chrome-devtools(브라우저 제어) 등
|
|
61
|
+
console.log('\n[1단계] MCP 서버 설정을 불러옵니다...');
|
|
62
|
+
console.log(' 설명: mcp_config.json 파일에서 연결할 서버 목록을 읽어옵니다');
|
|
63
|
+
|
|
64
|
+
const configPath = join(__dirname, 'mcp_config.json');
|
|
65
|
+
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
66
|
+
|
|
67
|
+
console.log(` ✓ ${Object.keys(config.mcpServers).length}개의 서버 설정을 불러왔습니다`);
|
|
68
|
+
Object.keys(config.mcpServers).forEach(name => {
|
|
69
|
+
console.log(` - ${name}`);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// ========================================
|
|
73
|
+
// [2단계] MCP Agent 생성
|
|
74
|
+
// ========================================
|
|
75
|
+
// MCP Agent는 여러 MCP 서버들과 통신하는 관리자입니다.
|
|
76
|
+
// 이 객체를 통해 서버에 연결하고, 도구를 실행할 수 있습니다.
|
|
77
|
+
console.log('\n[2단계] MCP Agent를 만듭니다...');
|
|
78
|
+
console.log(' 설명: MCP 서버들을 관리할 Agent 객체를 생성합니다');
|
|
79
|
+
|
|
80
|
+
const mcpAgent = new MCPAgentClient({
|
|
81
|
+
logLevel: 'info', // 로그 레벨 설정
|
|
82
|
+
enableConsoleDebug: true // 디버그 메시지 콘솔 출력
|
|
83
|
+
});
|
|
84
|
+
console.log(' ✓ MCP Agent가 만들어졌습니다');
|
|
85
|
+
|
|
86
|
+
// ========================================
|
|
87
|
+
// [3단계] MCP 서버에 연결
|
|
88
|
+
// ========================================
|
|
89
|
+
// initialize()를 호출하면 설정 파일에 있는 모든 서버에 연결을 시도합니다.
|
|
90
|
+
// HTTP, stdio 등 다양한 방식으로 서버와 통신할 수 있습니다.
|
|
91
|
+
console.log('\n[3단계] MCP Agent를 초기화하고 서버들에 연결합니다...');
|
|
92
|
+
console.log(' 설명: 설정된 모든 MCP 서버에 실제로 연결합니다');
|
|
93
|
+
|
|
94
|
+
await mcpAgent.initialize(config);
|
|
95
|
+
console.log(' ✓ 모든 서버에 연결되었습니다');
|
|
96
|
+
|
|
97
|
+
// ========================================
|
|
98
|
+
// [4단계] 사용 가능한 도구 목록 조회
|
|
99
|
+
// ========================================
|
|
100
|
+
// 연결된 모든 MCP 서버들이 제공하는 도구(tool)들을 가져옵니다.
|
|
101
|
+
// 각 도구는 이름, 설명, 입력 파라미터 정보를 가지고 있습니다.
|
|
102
|
+
console.log('\n[4단계] 사용 가능한 도구 목록을 가져옵니다...');
|
|
103
|
+
console.log(' 설명: 연결된 서버들이 제공하는 모든 도구의 목록과 스펙을 확인합니다');
|
|
104
|
+
|
|
105
|
+
const availableTools = mcpAgent.getAvailableTools();
|
|
106
|
+
console.log(` ✓ ${availableTools.length}개의 도구를 찾았습니다`);
|
|
107
|
+
|
|
108
|
+
// 각 도구의 상세 정보 출력
|
|
109
|
+
console.log('\n 각 도구의 상세 정보:');
|
|
110
|
+
availableTools.forEach((tool, index) => {
|
|
111
|
+
console.log(`\n [${index + 1}] ${tool.name}`);
|
|
112
|
+
console.log(` 서버: ${tool.server}`);
|
|
113
|
+
console.log(` 설명: ${tool.description || '설명 없음'}`);
|
|
114
|
+
|
|
115
|
+
if (tool.inputSchema && tool.inputSchema.properties) {
|
|
116
|
+
const props = tool.inputSchema.properties;
|
|
117
|
+
const required = tool.inputSchema.required || [];
|
|
118
|
+
|
|
119
|
+
console.log(` 입력값:`);
|
|
120
|
+
Object.entries(props).forEach(([propName, propSchema]) => {
|
|
121
|
+
const isRequired = required.includes(propName) ? '(필수)' : '(선택)';
|
|
122
|
+
const type = propSchema.type || '타입 미지정';
|
|
123
|
+
const desc = propSchema.description || '설명 없음';
|
|
124
|
+
|
|
125
|
+
console.log(` - ${propName} ${isRequired}`);
|
|
126
|
+
console.log(` 타입: ${type}`);
|
|
127
|
+
console.log(` 설명: ${desc}`);
|
|
128
|
+
|
|
129
|
+
// 추가 스키마 정보 출력
|
|
130
|
+
if (propSchema.items) {
|
|
131
|
+
console.log(` 배열 항목 타입: ${JSON.stringify(propSchema.items)}`);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// 전체 스키마 출력 (디버깅용)
|
|
136
|
+
console.log(` 전체 스키마: ${JSON.stringify(tool.inputSchema, null, 2)}`);
|
|
137
|
+
} else {
|
|
138
|
+
console.log(` 입력값: 없음`);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// ========================================
|
|
143
|
+
// [5단계] 도구 실행 예시 - 브라우저 제어
|
|
144
|
+
// ========================================
|
|
145
|
+
// 실제로 MCP 도구를 실행해봅니다.
|
|
146
|
+
// 여기서는 chrome-devtools 서버의 도구들을 사용하여:
|
|
147
|
+
// 1) 새 페이지를 열고
|
|
148
|
+
// 2) JavaScript를 실행하여 화면에 카운트다운을 표시합니다
|
|
149
|
+
console.log('\n[5단계] 도구 실행 예시...');
|
|
150
|
+
console.log(' 설명: chrome-devtools 서버의 도구들을 사용해 브라우저를 제어합니다');
|
|
151
|
+
|
|
152
|
+
// new_page 도구 찾기
|
|
153
|
+
const newPageTool = availableTools.find(tool => tool.name === 'new_page');
|
|
154
|
+
|
|
155
|
+
if (newPageTool) {
|
|
156
|
+
console.log(`\n [5-1] 새 페이지 열기`);
|
|
157
|
+
console.log(` 실행할 도구: ${newPageTool.name}`);
|
|
158
|
+
console.log(` 서버: ${newPageTool.server}`);
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
// about:blank 페이지 열기
|
|
162
|
+
console.log(' about:blank 페이지를 엽니다...');
|
|
163
|
+
|
|
164
|
+
// mcpAgent.executeTool() 함수 설명:
|
|
165
|
+
// - AI가 "new_page 도구를 url: 'about:blank'로 실행해줘"라고 요청하면
|
|
166
|
+
// - 이 함수가 실제로 MCP 서버에 있는 new_page 함수를 호출합니다
|
|
167
|
+
// - 첫 번째 인자: 실행할 도구 이름
|
|
168
|
+
// - 두 번째 인자: 도구에 전달할 파라미터 (JSON 객체)
|
|
169
|
+
// - 반환값: { success: true/false, data: 결과데이터, error: 에러메시지 }
|
|
170
|
+
const result = await mcpAgent.executeTool('new_page', { url: 'about:blank' });
|
|
171
|
+
|
|
172
|
+
if (result.success) {
|
|
173
|
+
console.log(' ✓ 페이지가 열렸습니다');
|
|
174
|
+
console.log(' 결과:', JSON.stringify(result.data, null, 2));
|
|
175
|
+
|
|
176
|
+
// ========================================
|
|
177
|
+
// [5-2] JavaScript 실행으로 카운트다운 표시
|
|
178
|
+
// ========================================
|
|
179
|
+
// evaluate_script 도구를 사용하여 페이지에서 JavaScript를 실행합니다.
|
|
180
|
+
// 10부터 0까지 숫자를 화면 중앙에 크게 표시합니다.
|
|
181
|
+
console.log('\n [5-2] 페이지에 카운트다운 표시하기');
|
|
182
|
+
console.log(' 설명: evaluate_script 도구로 페이지 내용을 동적으로 변경합니다');
|
|
183
|
+
console.log(' 페이지에 10부터 0까지 카운트다운을 표시합니다...');
|
|
184
|
+
|
|
185
|
+
for (let count = 10; count >= 0; count--) {
|
|
186
|
+
console.log(`\n 현재 카운트: ${count}`);
|
|
187
|
+
|
|
188
|
+
// JavaScript 실행으로 body에 숫자 표시
|
|
189
|
+
//
|
|
190
|
+
// mcpAgent.executeTool('evaluate_script', {...}) 호출 과정:
|
|
191
|
+
//
|
|
192
|
+
// [AI의 Function Calling 요청]
|
|
193
|
+
// AI: "evaluate_script 도구를 function: '() => {...}' 파라미터로 실행해줘"
|
|
194
|
+
// └─> 이것은 OpenAI의 Function Calling 형식으로 전달됩니다
|
|
195
|
+
//
|
|
196
|
+
// [Host의 도구 실행]
|
|
197
|
+
// executeTool()이 이 요청을 받아서:
|
|
198
|
+
// 1. 'evaluate_script'라는 이름의 도구를 찾습니다
|
|
199
|
+
// 2. MCP 서버에 실제 함수 호출을 요청합니다
|
|
200
|
+
// 3. 서버가 브라우저에서 JavaScript를 실행합니다
|
|
201
|
+
// 4. 실행 결과를 받아서 AI에게 다시 돌려줍니다
|
|
202
|
+
//
|
|
203
|
+
// [결과 반환]
|
|
204
|
+
// { success: true, data: 10, executedAt: "2024-..." }
|
|
205
|
+
// └─> AI는 이 결과를 보고 다음 행동을 결정합니다
|
|
206
|
+
//
|
|
207
|
+
const scriptResult = await mcpAgent.executeTool('evaluate_script', {
|
|
208
|
+
function: `() => {
|
|
209
|
+
document.body.innerHTML = '<div style="color:blue;display:flex;justify-content:center;align-items:center;height:100vh;font-size:200px;font-family:Arial">${count}</div>';
|
|
210
|
+
return ${count};
|
|
211
|
+
}`
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
if (scriptResult.success) {
|
|
215
|
+
console.log(` ✓ ${count} 표시 완료`);
|
|
216
|
+
} else {
|
|
217
|
+
console.log(` ✗ 스크립트 실행 실패: ${scriptResult.error}`);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// 0.1초 대기 (마지막 카운트에서는 대기하지 않음)
|
|
221
|
+
if (count > 0) {
|
|
222
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
console.log('\n ✓ 카운트다운 완료');
|
|
227
|
+
} else {
|
|
228
|
+
console.log(` ✗ 실행 실패: ${result.error}`);
|
|
229
|
+
}
|
|
230
|
+
} catch (error) {
|
|
231
|
+
console.log(` ✗ 오류: ${error.message}`);
|
|
232
|
+
}
|
|
233
|
+
} else {
|
|
234
|
+
console.log(' new_page 도구를 찾을 수 없습니다');
|
|
235
|
+
console.log(' 사용 가능한 도구:', availableTools.map(t => t.name).join(', '));
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// ========================================
|
|
239
|
+
// [6단계] 연결 정리 및 종료
|
|
240
|
+
// ========================================
|
|
241
|
+
// 프로그램을 종료하기 전에 모든 MCP 서버와의 연결을 정리합니다.
|
|
242
|
+
// cleanup()을 호출하면 열려있던 모든 연결이 안전하게 닫힙니다.
|
|
243
|
+
console.log('\n[6단계] 연결을 정리합니다...');
|
|
244
|
+
console.log(' 설명: 모든 MCP 서버와의 연결을 종료하고 리소스를 정리합니다');
|
|
245
|
+
|
|
246
|
+
await mcpAgent.cleanup();
|
|
247
|
+
console.log(' ✓ 모든 연결이 종료되었습니다');
|
|
248
|
+
|
|
249
|
+
console.log('\n' + '='.repeat(50));
|
|
250
|
+
console.log('MCP 사용 예시 - 완료!');
|
|
251
|
+
console.log('='.repeat(50));
|
|
252
|
+
console.log('\n요약:');
|
|
253
|
+
console.log(' 1. 설정 파일에서 MCP 서버 목록을 읽었습니다');
|
|
254
|
+
console.log(' 2. MCP Agent 객체를 생성하고 서버에 연결했습니다');
|
|
255
|
+
console.log(' 3. 연결된 서버들이 제공하는 도구 목록을 확인했습니다');
|
|
256
|
+
console.log(' 4. 실제로 도구를 실행하여 브라우저를 제어했습니다');
|
|
257
|
+
console.log(' 5. 사용을 마치고 모든 연결을 정리했습니다');
|
|
258
|
+
console.log('');
|
|
259
|
+
process.exit(0);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// 메인 함수 실행
|
|
263
|
+
main().catch(error => {
|
|
264
|
+
console.error('\n❌ 치명적 오류:', error.message);
|
|
265
|
+
console.error(error.stack);
|
|
266
|
+
process.exit(1);
|
|
267
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"context7": {
|
|
4
|
+
"type": "http",
|
|
5
|
+
"url": "https://mcp.context7.com/mcp",
|
|
6
|
+
"headers": {
|
|
7
|
+
"CONTEXT7_API_KEY": "ctx7sk-ce6ef1b6-06e9-4ffd-9e07-54f96615dffa"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"chrome-devtools": {
|
|
11
|
+
"command": "npx",
|
|
12
|
+
"args": [
|
|
13
|
+
"-y",
|
|
14
|
+
"chrome-devtools-mcp@latest"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|