clu-mcp-server 1.0.0
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/README.md +167 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +228 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# CLU Avatar MCP Server
|
|
2
|
+
|
|
3
|
+
CLU 아바타와 텍스트 채팅을 할 수 있는 MCP(Model Context Protocol) 서버입니다.
|
|
4
|
+
Claude Desktop, Cursor 등 MCP를 지원하는 AI 클라이언트에서 사용할 수 있습니다.
|
|
5
|
+
|
|
6
|
+
## 📋 기능
|
|
7
|
+
|
|
8
|
+
- **chat**: CLU 아바타와 대화
|
|
9
|
+
- **get_avatar_info**: 연결된 아바타 정보 조회
|
|
10
|
+
- **get_usage_stats**: 토큰 사용량 통계 조회
|
|
11
|
+
|
|
12
|
+
## 🚀 설치
|
|
13
|
+
|
|
14
|
+
### npm으로 설치
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install -g clu-mcp-server
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## ⚙️ 설정
|
|
21
|
+
|
|
22
|
+
### 1. API 키 발급
|
|
23
|
+
|
|
24
|
+
1. [CLU 플랫폼](https://clu.aiclude.com)에 로그인
|
|
25
|
+
2. 에이전트 상세 페이지 → **연결** 탭
|
|
26
|
+
3. **새 연결** 버튼 클릭 → **MCP 서버** 선택
|
|
27
|
+
4. 생성된 API 키 복사
|
|
28
|
+
|
|
29
|
+
### 2. Claude Desktop 설정
|
|
30
|
+
|
|
31
|
+
Claude Desktop의 설정 파일을 수정합니다:
|
|
32
|
+
|
|
33
|
+
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
34
|
+
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"mcpServers": {
|
|
39
|
+
"clu-avatar": {
|
|
40
|
+
"command": "npx",
|
|
41
|
+
"args": ["clu-mcp-server"],
|
|
42
|
+
"env": {
|
|
43
|
+
"CLU_API_KEY": "a_your-api-key-here"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
또는 로컬 빌드를 사용하는 경우:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"mcpServers": {
|
|
55
|
+
"clu-avatar": {
|
|
56
|
+
"command": "node",
|
|
57
|
+
"args": ["/path/to/clu-mcp-server/dist/index.js"],
|
|
58
|
+
"env": {
|
|
59
|
+
"CLU_API_KEY": "a_your-api-key-here"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 3. Cursor 설정
|
|
67
|
+
|
|
68
|
+
Cursor의 MCP 설정에 추가:
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"mcpServers": {
|
|
73
|
+
"clu-avatar": {
|
|
74
|
+
"command": "npx",
|
|
75
|
+
"args": ["clu-mcp-server"],
|
|
76
|
+
"env": {
|
|
77
|
+
"CLU_API_KEY": "a_your-api-key-here"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 🎯 사용 방법
|
|
85
|
+
|
|
86
|
+
Claude Desktop 또는 Cursor에서 자연어로 요청하면 됩니다:
|
|
87
|
+
|
|
88
|
+
### 채팅
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
CLU 아바타에게 "안녕하세요, 오늘 날씨가 어떤가요?"라고 물어봐줘
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
chat 도구로 "회사 소개 부탁드립니다"라고 전송해줘
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 아바타 정보 확인
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
연결된 CLU 아바타 정보 알려줘
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 토큰 사용량 확인
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
이번 달 토큰 사용량 조회해줘
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
최근 7일간 API 사용 통계 보여줘
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## 📊 환경 변수
|
|
115
|
+
|
|
116
|
+
| 변수명 | 필수 | 설명 | 기본값 |
|
|
117
|
+
|--------|------|------|--------|
|
|
118
|
+
| `CLU_API_KEY` | ✅ | CLU API 키 | - |
|
|
119
|
+
| `CLU_API_URL` | ❌ | API 베이스 URL | `https://clu.aiclude.com` |
|
|
120
|
+
|
|
121
|
+
## 🔧 개발
|
|
122
|
+
|
|
123
|
+
### 의존성 설치
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npm install
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 개발 모드 실행
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
export CLU_API_KEY="a_your-api-key-here"
|
|
133
|
+
npm run dev
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 빌드
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
npm run build
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## 🔐 보안
|
|
143
|
+
|
|
144
|
+
- API 키는 환경변수로 관리하세요. 코드에 직접 입력하지 마세요.
|
|
145
|
+
- API 키가 유출된 경우 즉시 비활성화하고 새로운 키를 발급받으세요.
|
|
146
|
+
- 토큰 사용량은 API 키별로 자동 추적되므로 과금 관리가 가능합니다.
|
|
147
|
+
|
|
148
|
+
## 📈 토큰 사용량 추적
|
|
149
|
+
|
|
150
|
+
- 모든 채팅 요청은 API 키별로 토큰 사용량이 자동 기록됩니다.
|
|
151
|
+
- `get_usage_stats` 도구로 사용량을 확인할 수 있습니다.
|
|
152
|
+
- CLU 플랫폼의 **연결** 탭에서도 사용량을 확인할 수 있습니다.
|
|
153
|
+
|
|
154
|
+
## 📝 라이선스
|
|
155
|
+
|
|
156
|
+
MIT License
|
|
157
|
+
|
|
158
|
+
## 🔗 관련 링크
|
|
159
|
+
|
|
160
|
+
- [CLU 플랫폼](https://clu.aiclude.com)
|
|
161
|
+
- [MCP 프로토콜 문서](https://modelcontextprotocol.io)
|
|
162
|
+
- [Claude Desktop](https://claude.ai/download)
|
|
163
|
+
|
|
164
|
+
## 💬 문의
|
|
165
|
+
|
|
166
|
+
- 이메일: support@aiclude.com
|
|
167
|
+
- 웹사이트: https://aiclude.com
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLU Avatar MCP Server
|
|
4
|
+
*
|
|
5
|
+
* MCP(Model Context Protocol) 서버로 Claude Desktop 등에서
|
|
6
|
+
* CLU 아바타와 텍스트 채팅을 할 수 있습니다.
|
|
7
|
+
*
|
|
8
|
+
* 환경변수:
|
|
9
|
+
* - CLU_API_KEY: API 키 (필수)
|
|
10
|
+
* - CLU_API_URL: API 베이스 URL (선택, 기본값: https://clu.aiclude.com)
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* CLU Avatar MCP Server
|
|
5
|
+
*
|
|
6
|
+
* MCP(Model Context Protocol) 서버로 Claude Desktop 등에서
|
|
7
|
+
* CLU 아바타와 텍스트 채팅을 할 수 있습니다.
|
|
8
|
+
*
|
|
9
|
+
* 환경변수:
|
|
10
|
+
* - CLU_API_KEY: API 키 (필수)
|
|
11
|
+
* - CLU_API_URL: API 베이스 URL (선택, 기본값: https://clu.aiclude.com)
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
15
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
16
|
+
const zod_1 = require("zod");
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// 설정
|
|
19
|
+
// ============================================================================
|
|
20
|
+
const CONFIG = {
|
|
21
|
+
API_KEY: process.env.CLU_API_KEY,
|
|
22
|
+
API_BASE_URL: process.env.CLU_API_URL || 'https://clu.aiclude.com',
|
|
23
|
+
};
|
|
24
|
+
// API 키 필수 확인
|
|
25
|
+
if (!CONFIG.API_KEY) {
|
|
26
|
+
console.error('❌ CLU_API_KEY 환경변수가 설정되지 않았습니다.');
|
|
27
|
+
console.error(' export CLU_API_KEY="a_your-api-key-here"');
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
let tokenInfo = null;
|
|
31
|
+
/**
|
|
32
|
+
* API 키로 JWT 토큰 발급
|
|
33
|
+
*/
|
|
34
|
+
async function getAccessToken() {
|
|
35
|
+
// 토큰이 유효한지 확인 (만료 5분 전에 갱신)
|
|
36
|
+
if (tokenInfo && tokenInfo.expiresAt > Date.now() + 5 * 60 * 1000) {
|
|
37
|
+
return tokenInfo.accessToken;
|
|
38
|
+
}
|
|
39
|
+
const response = await fetch(`${CONFIG.API_BASE_URL}/api/auth/api-key-token`, {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
headers: {
|
|
42
|
+
'Content-Type': 'application/json',
|
|
43
|
+
'X-API-Key': CONFIG.API_KEY,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
const error = await response.text();
|
|
48
|
+
throw new Error(`토큰 발급 실패: ${response.status} - ${error}`);
|
|
49
|
+
}
|
|
50
|
+
const data = await response.json();
|
|
51
|
+
tokenInfo = {
|
|
52
|
+
accessToken: data.access_token,
|
|
53
|
+
expiresAt: Date.now() + 24 * 60 * 60 * 1000, // 24시간
|
|
54
|
+
avatarId: data.avatar_id,
|
|
55
|
+
avatarName: data.avatar_name,
|
|
56
|
+
languageCode: data.language_code,
|
|
57
|
+
};
|
|
58
|
+
return tokenInfo.accessToken;
|
|
59
|
+
}
|
|
60
|
+
// ============================================================================
|
|
61
|
+
// API 호출 함수
|
|
62
|
+
// ============================================================================
|
|
63
|
+
/**
|
|
64
|
+
* 채팅 메시지 전송
|
|
65
|
+
*/
|
|
66
|
+
async function sendChatMessage(message, sessionId) {
|
|
67
|
+
const token = await getAccessToken();
|
|
68
|
+
const response = await fetch(`${CONFIG.API_BASE_URL}/api/api-chat/message`, {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
headers: {
|
|
71
|
+
'Content-Type': 'application/json',
|
|
72
|
+
'Authorization': `Bearer ${token}`,
|
|
73
|
+
},
|
|
74
|
+
body: JSON.stringify({
|
|
75
|
+
message,
|
|
76
|
+
session_id: sessionId,
|
|
77
|
+
stream: false,
|
|
78
|
+
}),
|
|
79
|
+
});
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
const error = await response.text();
|
|
82
|
+
throw new Error(`채팅 요청 실패: ${response.status} - ${error}`);
|
|
83
|
+
}
|
|
84
|
+
const data = await response.json();
|
|
85
|
+
return {
|
|
86
|
+
response: data.data.response,
|
|
87
|
+
usage: data.data.usage || null,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 토큰 사용량 조회
|
|
92
|
+
*/
|
|
93
|
+
async function getUsageStats(startDate, endDate, limit) {
|
|
94
|
+
const token = await getAccessToken();
|
|
95
|
+
const params = new URLSearchParams();
|
|
96
|
+
if (startDate)
|
|
97
|
+
params.append('start_date', startDate);
|
|
98
|
+
if (endDate)
|
|
99
|
+
params.append('end_date', endDate);
|
|
100
|
+
if (limit)
|
|
101
|
+
params.append('limit', limit.toString());
|
|
102
|
+
const url = `${CONFIG.API_BASE_URL}/api/api-chat/usage/stats${params.toString() ? '?' + params.toString() : ''}`;
|
|
103
|
+
const response = await fetch(url, {
|
|
104
|
+
method: 'GET',
|
|
105
|
+
headers: {
|
|
106
|
+
'Authorization': `Bearer ${token}`,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
if (!response.ok) {
|
|
110
|
+
const error = await response.text();
|
|
111
|
+
throw new Error(`사용량 조회 실패: ${response.status} - ${error}`);
|
|
112
|
+
}
|
|
113
|
+
const data = await response.json();
|
|
114
|
+
return data.data;
|
|
115
|
+
}
|
|
116
|
+
// ============================================================================
|
|
117
|
+
// MCP 서버 설정
|
|
118
|
+
// ============================================================================
|
|
119
|
+
const server = new mcp_js_1.McpServer({
|
|
120
|
+
name: 'clu-avatar',
|
|
121
|
+
version: '1.0.0',
|
|
122
|
+
});
|
|
123
|
+
// ----------------------------------------------------------------------------
|
|
124
|
+
// 도구: chat - 아바타와 대화
|
|
125
|
+
// ----------------------------------------------------------------------------
|
|
126
|
+
server.tool('chat', 'CLU 아바타와 대화합니다. 아바타의 지식과 성격을 기반으로 응답합니다.', {
|
|
127
|
+
message: zod_1.z.string().describe('전송할 메시지'),
|
|
128
|
+
session_id: zod_1.z.string().optional().describe('세션 ID (대화 컨텍스트 유지용, 선택사항)'),
|
|
129
|
+
}, async ({ message, session_id }) => {
|
|
130
|
+
try {
|
|
131
|
+
const result = await sendChatMessage(message, session_id);
|
|
132
|
+
let content = result.response;
|
|
133
|
+
// 토큰 사용량 정보 추가
|
|
134
|
+
if (result.usage) {
|
|
135
|
+
content += `\n\n---\n📊 토큰 사용량: ${result.usage.total_tokens} (프롬프트: ${result.usage.prompt_tokens}, 응답: ${result.usage.completion_tokens})`;
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
content: [{ type: 'text', text: content }],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
const errorMessage = error instanceof Error ? error.message : '알 수 없는 오류';
|
|
143
|
+
return {
|
|
144
|
+
content: [{ type: 'text', text: `❌ 오류: ${errorMessage}` }],
|
|
145
|
+
isError: true,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
// ----------------------------------------------------------------------------
|
|
150
|
+
// 도구: get_avatar_info - 연결된 아바타 정보 조회
|
|
151
|
+
// ----------------------------------------------------------------------------
|
|
152
|
+
server.tool('get_avatar_info', '현재 연결된 CLU 아바타의 정보를 조회합니다.', {}, async () => {
|
|
153
|
+
try {
|
|
154
|
+
// 토큰 발급 시 아바타 정보가 함께 반환됨
|
|
155
|
+
await getAccessToken();
|
|
156
|
+
if (!tokenInfo) {
|
|
157
|
+
throw new Error('아바타 정보를 가져올 수 없습니다.');
|
|
158
|
+
}
|
|
159
|
+
const info = `🤖 연결된 아바타 정보
|
|
160
|
+
|
|
161
|
+
• 이름: ${tokenInfo.avatarName}
|
|
162
|
+
• ID: ${tokenInfo.avatarId}
|
|
163
|
+
• 언어: ${tokenInfo.languageCode}
|
|
164
|
+
• API URL: ${CONFIG.API_BASE_URL}`;
|
|
165
|
+
return {
|
|
166
|
+
content: [{ type: 'text', text: info }],
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
const errorMessage = error instanceof Error ? error.message : '알 수 없는 오류';
|
|
171
|
+
return {
|
|
172
|
+
content: [{ type: 'text', text: `❌ 오류: ${errorMessage}` }],
|
|
173
|
+
isError: true,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
// ----------------------------------------------------------------------------
|
|
178
|
+
// 도구: get_usage_stats - 토큰 사용량 통계 조회
|
|
179
|
+
// ----------------------------------------------------------------------------
|
|
180
|
+
server.tool('get_usage_stats', 'API 토큰 사용량 통계를 조회합니다. 일별 사용량, 총 토큰 수, 요청 횟수를 확인할 수 있습니다.', {
|
|
181
|
+
start_date: zod_1.z.string().optional().describe('시작일 (YYYY-MM-DD 형식)'),
|
|
182
|
+
end_date: zod_1.z.string().optional().describe('종료일 (YYYY-MM-DD 형식)'),
|
|
183
|
+
limit: zod_1.z.number().optional().describe('조회할 일수 (기본값: 30)'),
|
|
184
|
+
}, async ({ start_date, end_date, limit }) => {
|
|
185
|
+
try {
|
|
186
|
+
const stats = await getUsageStats(start_date, end_date, limit);
|
|
187
|
+
let content = `📊 토큰 사용량 통계
|
|
188
|
+
|
|
189
|
+
📈 전체 요약
|
|
190
|
+
• 총 토큰 사용량: ${stats.total_tokens.toLocaleString()} 토큰
|
|
191
|
+
• 총 요청 횟수: ${stats.total_requests.toLocaleString()} 회`;
|
|
192
|
+
if (stats.daily_stats && stats.daily_stats.length > 0) {
|
|
193
|
+
content += `\n\n📅 일별 통계 (최근 ${stats.daily_stats.length}일)`;
|
|
194
|
+
for (const day of stats.daily_stats.slice(0, 10)) {
|
|
195
|
+
content += `\n• ${day.date}: ${day.tokens.toLocaleString()} 토큰, ${day.requests} 요청`;
|
|
196
|
+
}
|
|
197
|
+
if (stats.daily_stats.length > 10) {
|
|
198
|
+
content += `\n ... 외 ${stats.daily_stats.length - 10}일`;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
content: [{ type: 'text', text: content }],
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
const errorMessage = error instanceof Error ? error.message : '알 수 없는 오류';
|
|
207
|
+
return {
|
|
208
|
+
content: [{ type: 'text', text: `❌ 오류: ${errorMessage}` }],
|
|
209
|
+
isError: true,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
// ============================================================================
|
|
214
|
+
// 서버 시작
|
|
215
|
+
// ============================================================================
|
|
216
|
+
async function main() {
|
|
217
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
218
|
+
await server.connect(transport);
|
|
219
|
+
// stderr로 로그 출력 (stdout은 MCP 통신용)
|
|
220
|
+
console.error('🚀 CLU Avatar MCP Server 시작됨');
|
|
221
|
+
console.error(` API URL: ${CONFIG.API_BASE_URL}`);
|
|
222
|
+
console.error(' 도구: chat, get_avatar_info, get_usage_stats');
|
|
223
|
+
}
|
|
224
|
+
main().catch((error) => {
|
|
225
|
+
console.error('❌ 서버 시작 실패:', error);
|
|
226
|
+
process.exit(1);
|
|
227
|
+
});
|
|
228
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "clu-mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for CLU Avatar - Text chat integration with Claude Desktop",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"clu-mcp-server": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"start": "node dist/index.js",
|
|
12
|
+
"dev": "ts-node src/index.ts",
|
|
13
|
+
"prepublishOnly": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"mcp",
|
|
17
|
+
"model-context-protocol",
|
|
18
|
+
"clu",
|
|
19
|
+
"avatar",
|
|
20
|
+
"ai",
|
|
21
|
+
"chatbot",
|
|
22
|
+
"claude"
|
|
23
|
+
],
|
|
24
|
+
"author": "AICLUDE",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
28
|
+
"zod": "^3.22.4"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^20.10.0",
|
|
32
|
+
"typescript": "^5.3.0",
|
|
33
|
+
"ts-node": "^10.9.2"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18.0.0"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"README.md"
|
|
41
|
+
]
|
|
42
|
+
}
|