aiexecode 1.0.89 → 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.
@@ -0,0 +1,9 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(mkdir:*)"
5
+ ],
6
+ "deny": [],
7
+ "ask": []
8
+ }
9
+ }
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * 기본 사용 예제 - MCP Agent Client 시작하기
5
+ *
6
+ * 이 예제는 MCP Agent Client의 가장 기본적인 사용 방법을 보여줍니다.
7
+ * - 클라이언트 생성
8
+ * - 서버 연결
9
+ * - 도구 목록 조회
10
+ * - 도구 실행
11
+ */
12
+
13
+ import { MCPAgentClient } from '../index.js';
14
+
15
+ async function main() {
16
+ // 1. 클라이언트 인스턴스 생성
17
+ // logLevel을 'info'로 설정하여 진행 상황을 확인할 수 있습니다
18
+ const client = new MCPAgentClient({
19
+ logLevel: 'info',
20
+ enableConsoleDebug: true
21
+ });
22
+
23
+ try {
24
+ // 2. 서버 설정으로 초기화
25
+ // mcpServers 객체에 연결할 서버들을 정의합니다
26
+ await client.initialize({
27
+ mcpServers: {
28
+ // stdio 방식 서버 예시
29
+ 'example-server': {
30
+ type: 'stdio',
31
+ command: 'node',
32
+ args: ['path/to/your/server.js'],
33
+ // 선택사항: 환경변수 설정
34
+ env: {
35
+ NODE_ENV: 'development'
36
+ }
37
+ }
38
+ }
39
+ });
40
+
41
+ console.log('✅ 클라이언트가 성공적으로 초기화되었습니다!');
42
+
43
+ // 3. 사용 가능한 도구 목록 조회
44
+ const tools = client.getAvailableTools();
45
+ console.log('\n📋 사용 가능한 도구 목록:');
46
+ tools.forEach(tool => {
47
+ console.log(` - ${tool.name}: ${tool.description}`);
48
+ console.log(` 서버: ${tool.server}`);
49
+ });
50
+
51
+ // 4. 특정 도구 실행하기
52
+ if (tools.length > 0) {
53
+ const firstTool = tools[0];
54
+ console.log(`\n🔧 도구 실행 예시: ${firstTool.name}`);
55
+
56
+ // executeTool()은 도구 이름만으로 자동으로 서버를 찾아 실행합니다
57
+ const result = await client.executeTool(firstTool.name, {
58
+ // 여기에 도구에 필요한 인자를 전달합니다
59
+ // 예: { query: 'test', limit: 10 }
60
+ });
61
+
62
+ console.log('✅ 실행 결과:', result);
63
+ }
64
+
65
+ // 5. 클라이언트 상태 확인
66
+ const status = client.getStatus();
67
+ console.log('\n📊 클라이언트 상태:');
68
+ console.log(` - 초기화 완료: ${status.initialized}`);
69
+ console.log(` - 연결된 서버 수: ${status.connectedServers}/${status.totalServers}`);
70
+ console.log(` - 사용 가능한 도구 수: ${status.totalTools}`);
71
+
72
+ } catch (error) {
73
+ console.error('❌ 오류 발생:', error.message);
74
+ } finally {
75
+ // 6. 리소스 정리 및 연결 해제
76
+ await client.disconnect();
77
+ console.log('\n👋 클라이언트 연결이 해제되었습니다.');
78
+ }
79
+ }
80
+
81
+ // 실행
82
+ main().catch(console.error);
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * 빠른 시작 예제 - quickStart() 함수 사용
5
+ *
6
+ * quickStart() 함수를 사용하면 클라이언트 생성과 초기화를
7
+ * 한 번에 수행할 수 있어 가장 간단하게 시작할 수 있습니다.
8
+ */
9
+
10
+ import { quickStart } from '../index.js';
11
+
12
+ async function main() {
13
+ // quickStart()는 클라이언트 생성 + 초기화를 한 번에 수행합니다
14
+ const client = await quickStart(
15
+ // 첫 번째 인자: 서버 설정
16
+ {
17
+ mcpServers: {
18
+ 'my-server': {
19
+ type: 'stdio',
20
+ command: 'node',
21
+ args: ['server.js']
22
+ }
23
+ }
24
+ },
25
+ // 두 번째 인자: 클라이언트 옵션 (선택사항)
26
+ {
27
+ logLevel: 'info',
28
+ enableConsoleDebug: true,
29
+ timeout: 30000, // 30초 타임아웃
30
+ retries: 3 // 실패 시 3회 재시도
31
+ }
32
+ );
33
+
34
+ try {
35
+ console.log('✅ 클라이언트 준비 완료!');
36
+
37
+ // 바로 도구를 사용할 수 있습니다
38
+ const tools = client.getAvailableTools();
39
+ console.log(`📋 ${tools.length}개의 도구를 사용할 수 있습니다.`);
40
+
41
+ // 도구 실행
42
+ if (tools.length > 0) {
43
+ const result = await client.executeTool(tools[0].name);
44
+ console.log('결과:', result);
45
+ }
46
+
47
+ } finally {
48
+ await client.disconnect();
49
+ }
50
+ }
51
+
52
+ main().catch(console.error);
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * HTTP 서버 연결 예제
5
+ *
6
+ * stdio 방식 대신 HTTP/HTTPS를 통해 원격 MCP 서버에 연결하는 방법입니다.
7
+ * 인증이 필요한 경우 Bearer 토큰을 헤더에 포함시킬 수 있습니다.
8
+ */
9
+
10
+ import { MCPAgentClient } from '../index.js';
11
+
12
+ async function main() {
13
+ const client = new MCPAgentClient({
14
+ logLevel: 'info',
15
+ enableConsoleDebug: true
16
+ });
17
+
18
+ try {
19
+ await client.initialize({
20
+ mcpServers: {
21
+ // HTTP 방식 서버 (인증 없음)
22
+ 'public-api': {
23
+ type: 'http',
24
+ url: 'https://api.example.com/mcp'
25
+ },
26
+
27
+ // HTTP 방식 서버 (Bearer 토큰 인증)
28
+ 'secured-api': {
29
+ type: 'http',
30
+ url: 'https://secure-api.example.com/mcp',
31
+ headers: {
32
+ 'Authorization': 'Bearer YOUR_TOKEN_HERE',
33
+ 'X-API-Key': 'your-api-key'
34
+ }
35
+ },
36
+
37
+ // 로컬 HTTP 서버
38
+ 'local-http': {
39
+ type: 'http',
40
+ url: 'http://localhost:3000/mcp'
41
+ }
42
+ }
43
+ });
44
+
45
+ console.log('✅ HTTP 서버들에 연결되었습니다.');
46
+
47
+ // 연결된 서버별 상태 확인
48
+ const status = client.getStatus();
49
+ console.log('\n📊 서버별 상태:');
50
+ for (const [serverName, serverStatus] of Object.entries(status.servers)) {
51
+ console.log(`\n${serverName}:`);
52
+ console.log(` - 상태: ${serverStatus.status}`);
53
+ console.log(` - 타입: ${serverStatus.type}`);
54
+ console.log(` - 도구 수: ${serverStatus.toolCount}`);
55
+ }
56
+
57
+ // 특정 서버의 도구만 조회
58
+ const publicTools = client.getServerTools('public-api');
59
+ console.log('\n🔧 public-api의 도구:');
60
+ publicTools.forEach(tool => {
61
+ console.log(` - ${tool.name}: ${tool.description}`);
62
+ });
63
+
64
+ } catch (error) {
65
+ console.error('❌ 오류:', error.message);
66
+
67
+ // HTTP 인증 실패 시 자세한 정보가 로그에 출력됩니다
68
+ if (error.message.includes('401')) {
69
+ console.error('💡 인증 토큰을 확인해주세요.');
70
+ }
71
+ } finally {
72
+ await client.disconnect();
73
+ }
74
+ }
75
+
76
+ main().catch(console.error);
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * 다중 서버 연결 예제
5
+ *
6
+ * 여러 MCP 서버에 동시에 연결하여 사용하는 방법입니다.
7
+ * 각 서버는 서로 다른 전송 방식(stdio, HTTP, SSE)을 사용할 수 있습니다.
8
+ */
9
+
10
+ import { MCPAgentClient } from '../index.js';
11
+
12
+ async function main() {
13
+ const client = new MCPAgentClient({
14
+ logLevel: 'info',
15
+ enableConsoleDebug: true
16
+ });
17
+
18
+ try {
19
+ // 여러 서버에 동시 연결
20
+ await client.initialize({
21
+ mcpServers: {
22
+ // 파일 시스템 도구를 제공하는 서버
23
+ 'filesystem': {
24
+ type: 'stdio',
25
+ command: 'node',
26
+ args: ['servers/filesystem-server.js']
27
+ },
28
+
29
+ // 데이터베이스 도구를 제공하는 서버
30
+ 'database': {
31
+ type: 'stdio',
32
+ command: 'python',
33
+ args: ['-m', 'mcp_server_db']
34
+ },
35
+
36
+ // 원격 API 서버
37
+ 'remote-api': {
38
+ type: 'http',
39
+ url: 'https://api.example.com/mcp',
40
+ headers: {
41
+ 'Authorization': 'Bearer TOKEN'
42
+ }
43
+ },
44
+
45
+ // 실시간 이벤트 서버
46
+ 'event-stream': {
47
+ type: 'sse',
48
+ url: 'https://events.example.com/mcp'
49
+ }
50
+ }
51
+ });
52
+
53
+ console.log('✅ 모든 서버에 연결되었습니다.');
54
+
55
+ // 1. 전체 도구 목록 조회 (모든 서버의 도구)
56
+ const allTools = client.getAvailableTools();
57
+ console.log(`\n📋 총 ${allTools.length}개의 도구 사용 가능:`);
58
+
59
+ // 서버별로 그룹화하여 출력
60
+ const toolsByServer = {};
61
+ allTools.forEach(tool => {
62
+ if (!toolsByServer[tool.server]) {
63
+ toolsByServer[tool.server] = [];
64
+ }
65
+ toolsByServer[tool.server].push(tool);
66
+ });
67
+
68
+ for (const [serverName, tools] of Object.entries(toolsByServer)) {
69
+ console.log(`\n${serverName} (${tools.length}개):`);
70
+ tools.forEach(tool => {
71
+ console.log(` - ${tool.name}: ${tool.description}`);
72
+ });
73
+ }
74
+
75
+ // 2. 특정 서버의 도구만 사용
76
+ console.log('\n🔧 filesystem 서버의 도구 실행:');
77
+ const fsTools = client.getServerTools('filesystem');
78
+ if (fsTools.length > 0) {
79
+ // callTool()을 사용하여 특정 서버의 도구를 직접 호출
80
+ const result = await client.callTool('filesystem', fsTools[0].name, {
81
+ path: '/tmp'
82
+ });
83
+ console.log('결과:', result);
84
+ }
85
+
86
+ // 3. 도구 이름만으로 자동 실행 (어느 서버의 도구인지 자동 검색)
87
+ console.log('\n🔍 자동 서버 검색으로 도구 실행:');
88
+ if (allTools.length > 0) {
89
+ // executeTool()은 도구 이름만으로 자동으로 서버를 찾습니다
90
+ const result = await client.executeTool(allTools[0].name);
91
+ console.log(`${allTools[0].name} (서버: ${result.server}):`, result.data);
92
+ }
93
+
94
+ // 4. 리소스 목록 조회 (모든 서버)
95
+ const resources = await client.listAllResources();
96
+ console.log(`\n📄 사용 가능한 리소스: ${resources.length}개`);
97
+ resources.forEach(resource => {
98
+ console.log(` - ${resource.name} (${resource.serverName})`);
99
+ console.log(` URI: ${resource.uri}`);
100
+ });
101
+
102
+ // 5. 프롬프트 목록 조회 (모든 서버)
103
+ const prompts = await client.listAllPrompts();
104
+ console.log(`\n💬 사용 가능한 프롬프트: ${prompts.length}개`);
105
+ prompts.forEach(prompt => {
106
+ console.log(` - ${prompt.name} (${prompt.serverName})`);
107
+ console.log(` ${prompt.description}`);
108
+ });
109
+
110
+ } catch (error) {
111
+ console.error('❌ 오류:', error.message);
112
+ } finally {
113
+ await client.disconnect();
114
+ }
115
+ }
116
+
117
+ main().catch(console.error);
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * 에러 처리 및 재시도 예제
5
+ *
6
+ * MCP 클라이언트의 강력한 에러 처리와 자동 재시도 기능을 보여줍니다.
7
+ * - 자동 재시도 설정
8
+ * - 타임아웃 처리
9
+ * - 서버 연결 끊김 감지
10
+ * - 이벤트 기반 에러 모니터링
11
+ */
12
+
13
+ import { MCPAgentClient } from '../index.js';
14
+
15
+ async function main() {
16
+ const client = new MCPAgentClient({
17
+ logLevel: 'info',
18
+ enableConsoleDebug: true,
19
+
20
+ // 재시도 설정
21
+ timeout: 10000, // 10초 타임아웃
22
+ retries: 5, // 최대 5회 재시도
23
+ retryDelay: 1000, // 첫 재시도는 1초 후
24
+ maxRetryDelay: 30000 // 최대 30초까지 지연
25
+ });
26
+
27
+ // 1. 서버 에러 이벤트 리스너
28
+ client.on('serverError', (serverName, error) => {
29
+ console.error(`⚠️ 서버 에러 [${serverName}]:`, error.message);
30
+ });
31
+
32
+ // 2. 서버 연결 해제 이벤트 리스너
33
+ client.on('serverDisconnected', (serverName) => {
34
+ console.warn(`🔌 서버 연결 끊김: ${serverName}`);
35
+ });
36
+
37
+ // 3. 서버 상태 변경 이벤트 리스너
38
+ client.on('serverStatusChange', ({ serverName, status, previousStatus }) => {
39
+ console.log(`📡 ${serverName}: ${previousStatus} → ${status}`);
40
+ });
41
+
42
+ try {
43
+ await client.initialize({
44
+ mcpServers: {
45
+ 'test-server': {
46
+ type: 'stdio',
47
+ command: 'node',
48
+ args: ['server.js']
49
+ }
50
+ }
51
+ });
52
+
53
+ // 예제 1: 기본 재시도 (클라이언트 설정 사용)
54
+ try {
55
+ console.log('\n🔧 도구 실행 (자동 재시도 활성화)...');
56
+ const result = await client.executeTool('some-tool', {
57
+ param: 'value'
58
+ });
59
+ console.log('✅ 성공:', result);
60
+ } catch (error) {
61
+ console.error('❌ 모든 재시도 실패:', error.message);
62
+ }
63
+
64
+ // 예제 2: 커스텀 재시도 설정
65
+ try {
66
+ console.log('\n🔧 도구 실행 (커스텀 타임아웃/재시도)...');
67
+ const result = await client.executeTool(
68
+ 'slow-tool',
69
+ { query: 'test' },
70
+ {
71
+ timeout: 5000, // 이 호출만 5초 타임아웃
72
+ retries: 2 // 이 호출만 2회 재시도
73
+ }
74
+ );
75
+ console.log('✅ 성공:', result);
76
+ } catch (error) {
77
+ console.error('❌ 실패:', error.message);
78
+ }
79
+
80
+ // 예제 3: 서버 상태 확인 후 실행
81
+ const status = client.getStatus();
82
+ console.log('\n📊 현재 서버 상태:');
83
+ for (const [serverName, serverStatus] of Object.entries(status.servers)) {
84
+ console.log(`${serverName}: ${serverStatus.status}`);
85
+
86
+ if (serverStatus.status === 'connected') {
87
+ console.log(` ✅ 연결됨 - ${serverStatus.toolCount}개 도구 사용 가능`);
88
+ } else if (serverStatus.status === 'partially_connected') {
89
+ console.log(` ⚠️ 부분 연결 - 일부 기능만 사용 가능`);
90
+ } else {
91
+ console.log(` ❌ 연결 안됨 - 사용 불가`);
92
+ }
93
+ }
94
+
95
+ // 예제 4: 특정 서버 연결 해제 및 재연결 처리
96
+ console.log('\n🔌 test-server 연결 해제...');
97
+ await client.disconnectServer('test-server');
98
+
99
+ const updatedStatus = client.getStatus();
100
+ console.log(`연결된 서버: ${updatedStatus.connectedServers}/${updatedStatus.totalServers}`);
101
+
102
+ } catch (error) {
103
+ // 초기화 실패 처리
104
+ if (error.message.includes('not allowed')) {
105
+ console.error('❌ 보안 에러: 허용되지 않은 명령어 또는 인자');
106
+ } else if (error.message.includes('timeout')) {
107
+ console.error('❌ 타임아웃: 서버 응답 없음');
108
+ } else {
109
+ console.error('❌ 예상치 못한 에러:', error.message);
110
+ }
111
+ } finally {
112
+ await client.disconnect();
113
+ }
114
+ }
115
+
116
+ main().catch(console.error);
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * 리소스와 프롬프트 사용 예제
5
+ *
6
+ * MCP 서버의 도구(Tools) 외에도 리소스(Resources)와 프롬프트(Prompts)를
7
+ * 사용하는 방법을 보여줍니다.
8
+ *
9
+ * - Resources: 파일, 데이터, 문서 등을 읽을 수 있는 URI 기반 리소스
10
+ * - Prompts: 미리 정의된 프롬프트 템플릿
11
+ */
12
+
13
+ import { MCPAgentClient } from '../index.js';
14
+
15
+ async function main() {
16
+ const client = new MCPAgentClient({
17
+ logLevel: 'info',
18
+ enableConsoleDebug: true
19
+ });
20
+
21
+ try {
22
+ await client.initialize({
23
+ mcpServers: {
24
+ 'content-server': {
25
+ type: 'stdio',
26
+ command: 'node',
27
+ args: ['content-server.js']
28
+ }
29
+ }
30
+ });
31
+
32
+ // ========================================
33
+ // 1. 리소스(Resources) 사용하기
34
+ // ========================================
35
+
36
+ console.log('📄 리소스 목록 조회...\n');
37
+
38
+ // 모든 서버의 리소스 목록
39
+ const allResources = client.getAvailableResources();
40
+ console.log(`총 ${allResources.length}개의 리소스 발견:`);
41
+ allResources.forEach(resource => {
42
+ console.log(`\n- ${resource.name}`);
43
+ console.log(` 서버: ${resource.serverName}`);
44
+ console.log(` URI: ${resource.uri}`);
45
+ if (resource.description) {
46
+ console.log(` 설명: ${resource.description}`);
47
+ }
48
+ if (resource.mimeType) {
49
+ console.log(` 타입: ${resource.mimeType}`);
50
+ }
51
+ });
52
+
53
+ // 리소스 읽기 - 방법 1: URI로 자동 검색
54
+ if (allResources.length > 0) {
55
+ console.log('\n📖 리소스 읽기 (자동 서버 검색)...');
56
+ const resourceUri = allResources[0].uri;
57
+
58
+ try {
59
+ const content = await client.readResource(resourceUri);
60
+ console.log(`\n✅ ${resourceUri} 내용:`);
61
+ console.log(`타입: ${content.mimeType}`);
62
+ console.log(`데이터: ${content.data?.substring(0, 200)}...`);
63
+ } catch (error) {
64
+ console.error(`❌ 리소스 읽기 실패: ${error.message}`);
65
+ }
66
+ }
67
+
68
+ // 리소스 읽기 - 방법 2: 특정 서버에서 읽기
69
+ if (allResources.length > 0) {
70
+ console.log('\n📖 리소스 읽기 (특정 서버 지정)...');
71
+ const resource = allResources[0];
72
+
73
+ try {
74
+ const content = await client.readResourceFromServer(
75
+ resource.serverName,
76
+ resource.uri
77
+ );
78
+ console.log(`✅ 읽기 성공: ${content.uri}`);
79
+ } catch (error) {
80
+ console.error(`❌ 실패: ${error.message}`);
81
+ }
82
+ }
83
+
84
+ // ========================================
85
+ // 2. 프롬프트(Prompts) 사용하기
86
+ // ========================================
87
+
88
+ console.log('\n\n💬 프롬프트 목록 조회...\n');
89
+
90
+ // 모든 서버의 프롬프트 목록
91
+ const allPrompts = client.getAvailablePrompts();
92
+ console.log(`총 ${allPrompts.length}개의 프롬프트 발견:`);
93
+ allPrompts.forEach(prompt => {
94
+ console.log(`\n- ${prompt.name}`);
95
+ console.log(` 서버: ${prompt.serverName}`);
96
+ if (prompt.description) {
97
+ console.log(` 설명: ${prompt.description}`);
98
+ }
99
+ if (prompt.arguments && prompt.arguments.length > 0) {
100
+ console.log(` 인자:`);
101
+ prompt.arguments.forEach(arg => {
102
+ console.log(` - ${arg.name}: ${arg.description || '(설명 없음)'}`);
103
+ console.log(` 필수: ${arg.required ? '예' : '아니오'}`);
104
+ });
105
+ }
106
+ });
107
+
108
+ // 프롬프트 실행 - 방법 1: 이름으로 자동 검색
109
+ if (allPrompts.length > 0) {
110
+ console.log('\n🎯 프롬프트 실행 (자동 서버 검색)...');
111
+ const promptName = allPrompts[0].name;
112
+
113
+ try {
114
+ const result = await client.executePrompt(promptName, {
115
+ // 프롬프트에 필요한 인자 전달
116
+ // 예: { topic: 'AI', style: 'formal' }
117
+ });
118
+ console.log(`\n✅ ${promptName} 실행 결과:`);
119
+ console.log(result);
120
+ } catch (error) {
121
+ console.error(`❌ 프롬프트 실행 실패: ${error.message}`);
122
+ }
123
+ }
124
+
125
+ // 프롬프트 실행 - 방법 2: 특정 서버에서 실행
126
+ if (allPrompts.length > 0) {
127
+ console.log('\n🎯 프롬프트 실행 (특정 서버 지정)...');
128
+ const prompt = allPrompts[0];
129
+
130
+ try {
131
+ const result = await client.getPrompt(
132
+ prompt.serverName,
133
+ prompt.name,
134
+ {
135
+ // 프롬프트 인자
136
+ customParam: 'value'
137
+ }
138
+ );
139
+ console.log(`✅ 실행 성공`);
140
+ console.log(result);
141
+ } catch (error) {
142
+ console.error(`❌ 실패: ${error.message}`);
143
+ }
144
+ }
145
+
146
+ // ========================================
147
+ // 3. 통합 정보 조회
148
+ // ========================================
149
+
150
+ console.log('\n\n📊 서버별 기능 요약:\n');
151
+ const status = client.getStatus();
152
+
153
+ for (const [serverName, serverStatus] of Object.entries(status.servers)) {
154
+ console.log(`${serverName}:`);
155
+ console.log(` 상태: ${serverStatus.status}`);
156
+ console.log(` 도구: ${serverStatus.toolCount}개`);
157
+
158
+ // 해당 서버의 리소스 수
159
+ const serverResources = allResources.filter(r => r.serverName === serverName);
160
+ console.log(` 리소스: ${serverResources.length}개`);
161
+
162
+ // 해당 서버의 프롬프트 수
163
+ const serverPrompts = allPrompts.filter(p => p.serverName === serverName);
164
+ console.log(` 프롬프트: ${serverPrompts.length}개`);
165
+ }
166
+
167
+ } catch (error) {
168
+ console.error('❌ 오류:', error.message);
169
+ } finally {
170
+ await client.disconnect();
171
+ }
172
+ }
173
+
174
+ main().catch(console.error);