@curaq/mcp-server 0.1.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 +171 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +310 -0
- package/build/index.js.map +1 -0
- package/package.json +31 -0
package/README.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# CuraQ MCP Server
|
|
2
|
+
|
|
3
|
+
CuraQに保存した記事をMCP対応ツール(Claude Desktop、Claude Code、Cursor、VSCodeなど)から検索・参照できるMCPサーバーです。
|
|
4
|
+
|
|
5
|
+
## インストール
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @curaq/mcp-server
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
または、npxで直接実行:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @curaq/mcp-server
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## セットアップ
|
|
18
|
+
|
|
19
|
+
### 1. MCPトークンの取得
|
|
20
|
+
|
|
21
|
+
1. [CuraQ](https://curaq.pages.dev)にログイン
|
|
22
|
+
2. 設定 > 開発者向け > MCPトークン にアクセス
|
|
23
|
+
3. 新しいトークンを生成(例: "Claude Desktop")
|
|
24
|
+
4. 生成されたトークンをコピー(一度だけ表示されます)
|
|
25
|
+
|
|
26
|
+
### 2. MCP対応ツールへの設定
|
|
27
|
+
|
|
28
|
+
#### Claude Desktop
|
|
29
|
+
|
|
30
|
+
`~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) または
|
|
31
|
+
`%APPDATA%\Claude\claude_desktop_config.json` (Windows) を編集:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"mcpServers": {
|
|
36
|
+
"curaq": {
|
|
37
|
+
"command": "npx",
|
|
38
|
+
"args": ["-y", "@curaq/mcp-server"],
|
|
39
|
+
"env": {
|
|
40
|
+
"CURAQ_MCP_TOKEN": "your-token-here"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
#### Claude Code
|
|
48
|
+
|
|
49
|
+
Claude Codeの設定ファイルに同様の設定を追加します。
|
|
50
|
+
|
|
51
|
+
#### Cursor / VSCode
|
|
52
|
+
|
|
53
|
+
Cursor や VSCode の MCP 設定ファイルに以下を追加します(プラグインによって設定方法が異なります)。
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 機能
|
|
58
|
+
|
|
59
|
+
このMCPサーバーは、以下の3つのツールを提供します:
|
|
60
|
+
|
|
61
|
+
### 1. `list_articles`
|
|
62
|
+
未読記事の一覧を優先度順に取得します。
|
|
63
|
+
|
|
64
|
+
**パラメータ:**
|
|
65
|
+
- `limit` (オプション): 取得する記事数の上限(デフォルト: 10、最大: 30)
|
|
66
|
+
|
|
67
|
+
**使用例:**
|
|
68
|
+
```
|
|
69
|
+
未読記事を10件リストアップして
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 2. `search_articles`
|
|
73
|
+
キーワードで記事を検索します。タイトル、要約、タグから部分一致で検索します。
|
|
74
|
+
|
|
75
|
+
**パラメータ:**
|
|
76
|
+
- `query` (必須): 検索キーワード
|
|
77
|
+
- `limit` (オプション): 取得する記事数の上限(デフォルト: 10、最大: 30)
|
|
78
|
+
|
|
79
|
+
**使用例:**
|
|
80
|
+
```
|
|
81
|
+
「TypeScript」に関する記事を検索して
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 3. `get_article`
|
|
85
|
+
記事IDを指定して特定の記事の詳細を取得します。
|
|
86
|
+
|
|
87
|
+
**パラメータ:**
|
|
88
|
+
- `article_id` (必須): 記事のID(UUID形式)
|
|
89
|
+
|
|
90
|
+
**使用例:**
|
|
91
|
+
```
|
|
92
|
+
記事ID「abc123...」の詳細を取得して
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 環境変数
|
|
98
|
+
|
|
99
|
+
| 変数名 | 説明 | 必須 | デフォルト |
|
|
100
|
+
|--------|------|------|-----------|
|
|
101
|
+
| `CURAQ_MCP_TOKEN` | CuraQで生成したMCPトークン | ✅ 必須 | - |
|
|
102
|
+
| `CURAQ_API_URL` | CuraQ APIのURL | オプション | `https://curaq.pages.dev` |
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 使い方
|
|
107
|
+
|
|
108
|
+
設定が完了すると、Claude DesktopやClaude Codeなどで以下のように質問できます:
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
CuraQの未読記事をリストアップして
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
「React」に関する記事を検索して
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
最近保存した記事の中で、読了時間が5分以内のものを教えて
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## トラブルシューティング
|
|
125
|
+
|
|
126
|
+
### 認証エラーが発生する
|
|
127
|
+
|
|
128
|
+
- `CURAQ_MCP_TOKEN` が正しいか確認してください
|
|
129
|
+
- トークンが削除されていないか、[CuraQ設定ページ](https://curaq.pages.dev/settings/mcp)で確認してください
|
|
130
|
+
|
|
131
|
+
### 記事が取得できない
|
|
132
|
+
|
|
133
|
+
- CuraQに記事を保存しているか確認してください
|
|
134
|
+
- トークンが有効か確認してください
|
|
135
|
+
|
|
136
|
+
### MCPサーバーが起動しない
|
|
137
|
+
|
|
138
|
+
- Node.js 18以上がインストールされているか確認してください
|
|
139
|
+
- npxの場合、インターネット接続を確認してください
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 開発
|
|
144
|
+
|
|
145
|
+
### ビルド
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
pnpm install
|
|
149
|
+
pnpm run build
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Watch モード
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
pnpm run watch
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## ライセンス
|
|
161
|
+
|
|
162
|
+
MIT
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## リンク
|
|
167
|
+
|
|
168
|
+
- [CuraQ](https://curaq.pages.dev)
|
|
169
|
+
- [npm Package](https://www.npmjs.com/package/@curaq/mcp-server)
|
|
170
|
+
|
|
171
|
+
---
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
// Environment variables
|
|
6
|
+
const CURAQ_API_URL = process.env.CURAQ_API_URL || "https://curaq.pages.dev";
|
|
7
|
+
const CURAQ_MCP_TOKEN = process.env.CURAQ_MCP_TOKEN;
|
|
8
|
+
if (!CURAQ_MCP_TOKEN) {
|
|
9
|
+
console.error("Error: Missing required environment variable");
|
|
10
|
+
console.error("Required: CURAQ_MCP_TOKEN");
|
|
11
|
+
console.error("\nPlease generate a token at: https://curaq.pages.dev/settings/mcp");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
// Define tools
|
|
15
|
+
const TOOLS = [
|
|
16
|
+
{
|
|
17
|
+
name: "list_articles",
|
|
18
|
+
description: "未読記事の一覧を優先度順に取得します。記事のタイトル、要約、タグ、読了時間などの情報を返します。",
|
|
19
|
+
inputSchema: {
|
|
20
|
+
type: "object",
|
|
21
|
+
properties: {
|
|
22
|
+
limit: {
|
|
23
|
+
type: "number",
|
|
24
|
+
description: "取得する記事数の上限(デフォルト: 20、最大: 50)",
|
|
25
|
+
default: 20,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "search_articles",
|
|
32
|
+
description: "キーワードで記事を検索します。タイトル、要約、タグから部分一致で検索します。既読・未読の両方から検索します。",
|
|
33
|
+
inputSchema: {
|
|
34
|
+
type: "object",
|
|
35
|
+
properties: {
|
|
36
|
+
query: {
|
|
37
|
+
type: "string",
|
|
38
|
+
description: "検索キーワード",
|
|
39
|
+
},
|
|
40
|
+
limit: {
|
|
41
|
+
type: "number",
|
|
42
|
+
description: "取得する記事数の上限(デフォルト: 10、最大: 30)",
|
|
43
|
+
default: 10,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
required: ["query"],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "get_article",
|
|
51
|
+
description: "記事IDを指定して特定の記事の詳細を取得します。",
|
|
52
|
+
inputSchema: {
|
|
53
|
+
type: "object",
|
|
54
|
+
properties: {
|
|
55
|
+
article_id: {
|
|
56
|
+
type: "string",
|
|
57
|
+
description: "記事のID(UUID形式)",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
required: ["article_id"],
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
// Create MCP server
|
|
65
|
+
const server = new Server({
|
|
66
|
+
name: "curaq-mcp-server",
|
|
67
|
+
version: "0.1.0",
|
|
68
|
+
}, {
|
|
69
|
+
capabilities: {
|
|
70
|
+
tools: {},
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
// List available tools
|
|
74
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
75
|
+
return { tools: TOOLS };
|
|
76
|
+
});
|
|
77
|
+
// Handle tool calls
|
|
78
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
79
|
+
const { name, arguments: args } = request.params;
|
|
80
|
+
try {
|
|
81
|
+
switch (name) {
|
|
82
|
+
case "list_articles": {
|
|
83
|
+
const limit = Math.min(args?.limit || 20, 50);
|
|
84
|
+
const response = await fetch(`${CURAQ_API_URL}/api/mcp/articles?limit=${limit}`, {
|
|
85
|
+
headers: {
|
|
86
|
+
Authorization: `Bearer ${CURAQ_MCP_TOKEN}`,
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
const error = await response.text();
|
|
91
|
+
return {
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: "text",
|
|
95
|
+
text: `エラー (${response.status}): ${error}`,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const data = await response.json();
|
|
101
|
+
const articles = data.articles || [];
|
|
102
|
+
if (articles.length === 0) {
|
|
103
|
+
return {
|
|
104
|
+
content: [
|
|
105
|
+
{
|
|
106
|
+
type: "text",
|
|
107
|
+
text: "未読記事がありません。",
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const articlesList = articles.map((article) => {
|
|
113
|
+
return `## ${article.title}
|
|
114
|
+
|
|
115
|
+
**URL**: ${article.url}
|
|
116
|
+
**読了時間**: ${article.reading_time_minutes}分
|
|
117
|
+
**タグ**: ${article.tags.join(", ")}
|
|
118
|
+
**コンテンツタイプ**: ${article.content_type}
|
|
119
|
+
${article.priority !== undefined ? `**優先度**: ${article.priority.toFixed(3)}` : ""}
|
|
120
|
+
${article.created_at ? `**保存日**: ${new Date(article.created_at).toLocaleDateString("ja-JP")}` : ""}
|
|
121
|
+
|
|
122
|
+
**要約**:
|
|
123
|
+
${article.summary}
|
|
124
|
+
|
|
125
|
+
**記事ID**: ${article.id}
|
|
126
|
+
---`;
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
content: [
|
|
130
|
+
{
|
|
131
|
+
type: "text",
|
|
132
|
+
text: `# 未読記事一覧(${articles.length}件)\n\n${articlesList.join("\n\n")}`,
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
case "search_articles": {
|
|
138
|
+
const query = args?.query;
|
|
139
|
+
const limit = Math.min(args?.limit || 10, 30);
|
|
140
|
+
if (!query) {
|
|
141
|
+
return {
|
|
142
|
+
content: [
|
|
143
|
+
{
|
|
144
|
+
type: "text",
|
|
145
|
+
text: "エラー: 検索キーワードを指定してください",
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const response = await fetch(`${CURAQ_API_URL}/api/mcp/articles/search?q=${encodeURIComponent(query)}&limit=${limit}`, {
|
|
151
|
+
headers: {
|
|
152
|
+
Authorization: `Bearer ${CURAQ_MCP_TOKEN}`,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
if (!response.ok) {
|
|
156
|
+
const error = await response.text();
|
|
157
|
+
return {
|
|
158
|
+
content: [
|
|
159
|
+
{
|
|
160
|
+
type: "text",
|
|
161
|
+
text: `エラー (${response.status}): ${error}`,
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
const data = await response.json();
|
|
167
|
+
const searchResults = data.articles || [];
|
|
168
|
+
if (searchResults.length === 0) {
|
|
169
|
+
return {
|
|
170
|
+
content: [
|
|
171
|
+
{
|
|
172
|
+
type: "text",
|
|
173
|
+
text: `「${query}」に一致する記事が見つかりませんでした。`,
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const resultsList = searchResults.map((article) => {
|
|
179
|
+
return `## ${article.title}
|
|
180
|
+
|
|
181
|
+
**URL**: ${article.url}
|
|
182
|
+
**ステータス**: ${article.status === "read" ? "既読" : "未読"}
|
|
183
|
+
**読了時間**: ${article.reading_time_minutes}分
|
|
184
|
+
**タグ**: ${article.tags.join(", ")}
|
|
185
|
+
**コンテンツタイプ**: ${article.content_type}
|
|
186
|
+
${article.date ? `**日付**: ${new Date(article.date).toLocaleDateString("ja-JP")}` : ""}
|
|
187
|
+
|
|
188
|
+
**要約**:
|
|
189
|
+
${article.summary}
|
|
190
|
+
|
|
191
|
+
**記事ID**: ${article.id}
|
|
192
|
+
---`;
|
|
193
|
+
});
|
|
194
|
+
return {
|
|
195
|
+
content: [
|
|
196
|
+
{
|
|
197
|
+
type: "text",
|
|
198
|
+
text: `# 検索結果:「${query}」(${searchResults.length}件)\n\n${resultsList.join("\n\n")}`,
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
case "get_article": {
|
|
204
|
+
const articleId = args?.article_id;
|
|
205
|
+
if (!articleId) {
|
|
206
|
+
return {
|
|
207
|
+
content: [
|
|
208
|
+
{
|
|
209
|
+
type: "text",
|
|
210
|
+
text: "エラー: 記事IDを指定してください",
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
const response = await fetch(`${CURAQ_API_URL}/api/mcp/articles/${articleId}`, {
|
|
216
|
+
headers: {
|
|
217
|
+
Authorization: `Bearer ${CURAQ_MCP_TOKEN}`,
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
if (!response.ok) {
|
|
221
|
+
const error = await response.text();
|
|
222
|
+
if (response.status === 404) {
|
|
223
|
+
return {
|
|
224
|
+
content: [
|
|
225
|
+
{
|
|
226
|
+
type: "text",
|
|
227
|
+
text: `記事が見つかりませんでした(ID: ${articleId})`,
|
|
228
|
+
},
|
|
229
|
+
],
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
if (response.status === 403) {
|
|
233
|
+
return {
|
|
234
|
+
content: [
|
|
235
|
+
{
|
|
236
|
+
type: "text",
|
|
237
|
+
text: "この記事へのアクセス権限がありません。",
|
|
238
|
+
},
|
|
239
|
+
],
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
content: [
|
|
244
|
+
{
|
|
245
|
+
type: "text",
|
|
246
|
+
text: `エラー (${response.status}): ${error}`,
|
|
247
|
+
},
|
|
248
|
+
],
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
const data = await response.json();
|
|
252
|
+
const article = data.article;
|
|
253
|
+
const events = data.events || [];
|
|
254
|
+
return {
|
|
255
|
+
content: [
|
|
256
|
+
{
|
|
257
|
+
type: "text",
|
|
258
|
+
text: `# ${article.title}
|
|
259
|
+
|
|
260
|
+
**URL**: ${article.url}
|
|
261
|
+
**ステータス**: ${article.status === "read" ? "既読" : article.status === "unread" ? "未読" : article.status === "deferred" ? "後回し" : "不明"}
|
|
262
|
+
**読了時間**: ${article.reading_time_minutes}分
|
|
263
|
+
**タグ**: ${article.tags.join(", ")}
|
|
264
|
+
**コンテンツタイプ**: ${article.content_type}
|
|
265
|
+
**保存日**: ${new Date(article.created_at).toLocaleDateString("ja-JP")}
|
|
266
|
+
|
|
267
|
+
**要約**:
|
|
268
|
+
${article.summary}
|
|
269
|
+
|
|
270
|
+
**記事ID**: ${article.id}
|
|
271
|
+
|
|
272
|
+
**イベント履歴**:
|
|
273
|
+
${events.map((e) => `- ${e.action} (${new Date(e.created_at).toLocaleString("ja-JP")})`).join("\n")}`,
|
|
274
|
+
},
|
|
275
|
+
],
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
default:
|
|
279
|
+
return {
|
|
280
|
+
content: [
|
|
281
|
+
{
|
|
282
|
+
type: "text",
|
|
283
|
+
text: `不明なツール: ${name}`,
|
|
284
|
+
},
|
|
285
|
+
],
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
return {
|
|
291
|
+
content: [
|
|
292
|
+
{
|
|
293
|
+
type: "text",
|
|
294
|
+
text: `エラーが発生しました: ${error instanceof Error ? error.message : String(error)}`,
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
// Start the server
|
|
301
|
+
async function main() {
|
|
302
|
+
const transport = new StdioServerTransport();
|
|
303
|
+
await server.connect(transport);
|
|
304
|
+
console.error("CuraQ MCP server running on stdio");
|
|
305
|
+
}
|
|
306
|
+
main().catch((error) => {
|
|
307
|
+
console.error("Fatal error:", error);
|
|
308
|
+
process.exit(1);
|
|
309
|
+
});
|
|
310
|
+
//# 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,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@curaq/mcp-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for CuraQ - Access your curated articles from any MCP-compatible tool (Claude Desktop, Claude Code, Cursor, VSCode, etc.)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"curaq-mcp": "./build/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"watch": "tsc --watch",
|
|
12
|
+
"prepare": "npm run build"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"mcp",
|
|
16
|
+
"model-context-protocol",
|
|
17
|
+
"curaq",
|
|
18
|
+
"knowledge-base"
|
|
19
|
+
],
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
22
|
+
"@supabase/supabase-js": "^2.89.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^22.10.5",
|
|
26
|
+
"typescript": "^5.7.3"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18"
|
|
30
|
+
}
|
|
31
|
+
}
|