cc-recommender 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/CHANGELOG.md +41 -0
- package/LICENSE +21 -0
- package/README.ja.md +201 -0
- package/README.md +201 -0
- package/data/mcp-servers.json +34777 -0
- package/data/plugins.json +1571 -0
- package/data/skills.json +3233 -0
- package/dist/config/constants.d.ts +18 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +34 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/file-mappings.d.ts +13 -0
- package/dist/config/file-mappings.d.ts.map +1 -0
- package/dist/config/file-mappings.js +70 -0
- package/dist/config/file-mappings.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +9 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/scoring-config.d.ts +27 -0
- package/dist/config/scoring-config.d.ts.map +1 -0
- package/dist/config/scoring-config.js +27 -0
- package/dist/config/scoring-config.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/repositories/index.d.ts +7 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +7 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/recommendation.repository.d.ts +56 -0
- package/dist/repositories/recommendation.repository.d.ts.map +1 -0
- package/dist/repositories/recommendation.repository.js +142 -0
- package/dist/repositories/recommendation.repository.js.map +1 -0
- package/dist/repositories/remote-data.repository.d.ts +20 -0
- package/dist/repositories/remote-data.repository.d.ts.map +1 -0
- package/dist/repositories/remote-data.repository.js +307 -0
- package/dist/repositories/remote-data.repository.js.map +1 -0
- package/dist/schemas/index.d.ts +7 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/tool-schemas.d.ts +55 -0
- package/dist/schemas/tool-schemas.d.ts.map +1 -0
- package/dist/schemas/tool-schemas.js +36 -0
- package/dist/schemas/tool-schemas.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp-server.d.ts +11 -0
- package/dist/server/mcp-server.d.ts.map +1 -0
- package/dist/server/mcp-server.js +27 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/server/tool-registry.d.ts +12 -0
- package/dist/server/tool-registry.d.ts.map +1 -0
- package/dist/server/tool-registry.js +114 -0
- package/dist/server/tool-registry.js.map +1 -0
- package/dist/services/analyzer/index.d.ts +7 -0
- package/dist/services/analyzer/index.d.ts.map +1 -0
- package/dist/services/analyzer/index.js +7 -0
- package/dist/services/analyzer/index.js.map +1 -0
- package/dist/services/analyzer/parsers/go-mod.parser.d.ts +11 -0
- package/dist/services/analyzer/parsers/go-mod.parser.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/go-mod.parser.js +34 -0
- package/dist/services/analyzer/parsers/go-mod.parser.js.map +1 -0
- package/dist/services/analyzer/parsers/index.d.ts +9 -0
- package/dist/services/analyzer/parsers/index.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/index.js +9 -0
- package/dist/services/analyzer/parsers/index.js.map +1 -0
- package/dist/services/analyzer/parsers/package-json.parser.d.ts +11 -0
- package/dist/services/analyzer/parsers/package-json.parser.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/package-json.parser.js +61 -0
- package/dist/services/analyzer/parsers/package-json.parser.js.map +1 -0
- package/dist/services/analyzer/parsers/requirements-txt.parser.d.ts +11 -0
- package/dist/services/analyzer/parsers/requirements-txt.parser.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/requirements-txt.parser.js +49 -0
- package/dist/services/analyzer/parsers/requirements-txt.parser.js.map +1 -0
- package/dist/services/analyzer/project-analyzer.service.d.ts +11 -0
- package/dist/services/analyzer/project-analyzer.service.d.ts.map +1 -0
- package/dist/services/analyzer/project-analyzer.service.js +101 -0
- package/dist/services/analyzer/project-analyzer.service.js.map +1 -0
- package/dist/services/analyzer.d.ts +8 -0
- package/dist/services/analyzer.d.ts.map +1 -0
- package/dist/services/analyzer.js +8 -0
- package/dist/services/analyzer.js.map +1 -0
- package/dist/services/mcp-fetcher.d.ts +12 -0
- package/dist/services/mcp-fetcher.d.ts.map +1 -0
- package/dist/services/mcp-fetcher.js +262 -0
- package/dist/services/mcp-fetcher.js.map +1 -0
- package/dist/services/plugin-fetcher.d.ts +12 -0
- package/dist/services/plugin-fetcher.d.ts.map +1 -0
- package/dist/services/plugin-fetcher.js +149 -0
- package/dist/services/plugin-fetcher.js.map +1 -0
- package/dist/services/recommender/formatters.d.ts +22 -0
- package/dist/services/recommender/formatters.d.ts.map +1 -0
- package/dist/services/recommender/formatters.js +90 -0
- package/dist/services/recommender/formatters.js.map +1 -0
- package/dist/services/recommender/index.d.ts +10 -0
- package/dist/services/recommender/index.d.ts.map +1 -0
- package/dist/services/recommender/index.js +10 -0
- package/dist/services/recommender/index.js.map +1 -0
- package/dist/services/recommender/recommendation.service.d.ts +27 -0
- package/dist/services/recommender/recommendation.service.d.ts.map +1 -0
- package/dist/services/recommender/recommendation.service.js +34 -0
- package/dist/services/recommender/recommendation.service.js.map +1 -0
- package/dist/services/recommender/scoring/index.d.ts +7 -0
- package/dist/services/recommender/scoring/index.d.ts.map +1 -0
- package/dist/services/recommender/scoring/index.js +7 -0
- package/dist/services/recommender/scoring/index.js.map +1 -0
- package/dist/services/recommender/scoring/scorer.d.ts +27 -0
- package/dist/services/recommender/scoring/scorer.d.ts.map +1 -0
- package/dist/services/recommender/scoring/scorer.js +100 -0
- package/dist/services/recommender/scoring/scorer.js.map +1 -0
- package/dist/services/recommender/search.service.d.ts +24 -0
- package/dist/services/recommender/search.service.d.ts.map +1 -0
- package/dist/services/recommender/search.service.js +57 -0
- package/dist/services/recommender/search.service.js.map +1 -0
- package/dist/services/recommender.d.ts +11 -0
- package/dist/services/recommender.d.ts.map +1 -0
- package/dist/services/recommender.js +11 -0
- package/dist/services/recommender.js.map +1 -0
- package/dist/services/security-scanner.service.d.ts +48 -0
- package/dist/services/security-scanner.service.d.ts.map +1 -0
- package/dist/services/security-scanner.service.js +98 -0
- package/dist/services/security-scanner.service.js.map +1 -0
- package/dist/services/skill-fetcher.d.ts +12 -0
- package/dist/services/skill-fetcher.d.ts.map +1 -0
- package/dist/services/skill-fetcher.js +307 -0
- package/dist/services/skill-fetcher.js.map +1 -0
- package/dist/tools/handlers/get-skill-details.tool.d.ts +25 -0
- package/dist/tools/handlers/get-skill-details.tool.d.ts.map +1 -0
- package/dist/tools/handlers/get-skill-details.tool.js +29 -0
- package/dist/tools/handlers/get-skill-details.tool.js.map +1 -0
- package/dist/tools/handlers/get-stats.tool.d.ts +19 -0
- package/dist/tools/handlers/get-stats.tool.d.ts.map +1 -0
- package/dist/tools/handlers/get-stats.tool.js +32 -0
- package/dist/tools/handlers/get-stats.tool.js.map +1 -0
- package/dist/tools/handlers/index.d.ts +11 -0
- package/dist/tools/handlers/index.d.ts.map +1 -0
- package/dist/tools/handlers/index.js +11 -0
- package/dist/tools/handlers/index.js.map +1 -0
- package/dist/tools/handlers/list-categories.tool.d.ts +19 -0
- package/dist/tools/handlers/list-categories.tool.d.ts.map +1 -0
- package/dist/tools/handlers/list-categories.tool.js +33 -0
- package/dist/tools/handlers/list-categories.tool.js.map +1 -0
- package/dist/tools/handlers/recommend-skills.tool.d.ts +32 -0
- package/dist/tools/handlers/recommend-skills.tool.d.ts.map +1 -0
- package/dist/tools/handlers/recommend-skills.tool.js +43 -0
- package/dist/tools/handlers/recommend-skills.tool.js.map +1 -0
- package/dist/tools/handlers/search-skills.tool.d.ts +27 -0
- package/dist/tools/handlers/search-skills.tool.d.ts.map +1 -0
- package/dist/tools/handlers/search-skills.tool.js +31 -0
- package/dist/tools/handlers/search-skills.tool.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types/domain-types.d.ts +102 -0
- package/dist/types/domain-types.d.ts.map +1 -0
- package/dist/types/domain-types.js +7 -0
- package/dist/types/domain-types.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/raw-types.d.ts +46 -0
- package/dist/types/raw-types.d.ts.map +1 -0
- package/dist/types/raw-types.js +7 -0
- package/dist/types/raw-types.js.map +1 -0
- package/dist/types/service-types.d.ts +28 -0
- package/dist/types/service-types.d.ts.map +1 -0
- package/dist/types/service-types.js +7 -0
- package/dist/types/service-types.js.map +1 -0
- package/dist/utils/glob-matcher.d.ts +24 -0
- package/dist/utils/glob-matcher.d.ts.map +1 -0
- package/dist/utils/glob-matcher.js +34 -0
- package/dist/utils/glob-matcher.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote Data Repository
|
|
3
|
+
*
|
|
4
|
+
* Fetches latest recommendations data from CDN/GitHub
|
|
5
|
+
*/
|
|
6
|
+
/** デフォルトのリモートデータURL(ベース) */
|
|
7
|
+
const REMOTE_BASE_URL = "https://raw.githubusercontent.com/yuji0809/cc-recommender/main/data";
|
|
8
|
+
/** デフォルトのリモートデータURL */
|
|
9
|
+
const DEFAULT_PLUGINS_URL = `${REMOTE_BASE_URL}/plugins.json`;
|
|
10
|
+
const DEFAULT_MCP_SERVERS_URL = `${REMOTE_BASE_URL}/mcp-servers.json`;
|
|
11
|
+
const DEFAULT_SKILLS_URL = `${REMOTE_BASE_URL}/skills.json`;
|
|
12
|
+
/** タイムアウト時間(ミリ秒) */
|
|
13
|
+
const FETCH_TIMEOUT = 5000;
|
|
14
|
+
/** JSON全体の最大サイズ(10MB) */
|
|
15
|
+
const MAX_JSON_SIZE = 10 * 1024 * 1024;
|
|
16
|
+
/** 単一アイテムの最大サイズ(100KB) */
|
|
17
|
+
const MAX_ITEM_SIZE = 100 * 1024;
|
|
18
|
+
/** ETagキャッシュ(URL → ETag) */
|
|
19
|
+
const etagCache = new Map();
|
|
20
|
+
/** データキャッシュ(URL → データ)304対応用 */
|
|
21
|
+
const dataCache = new Map();
|
|
22
|
+
/**
|
|
23
|
+
* リモートからレコメンデーションデータを取得
|
|
24
|
+
*
|
|
25
|
+
* @param remoteUrl - リモートデータのURL(省略時はデフォルト)
|
|
26
|
+
* @returns データベース or null(失敗時)
|
|
27
|
+
*/
|
|
28
|
+
export async function fetchRemoteData(remoteUrl) {
|
|
29
|
+
try {
|
|
30
|
+
console.error("Fetching latest data from remote...");
|
|
31
|
+
// カスタムURLが指定された場合は従来の単一ファイル方式
|
|
32
|
+
if (remoteUrl) {
|
|
33
|
+
return await fetchSingleFile(remoteUrl);
|
|
34
|
+
}
|
|
35
|
+
// デフォルトは3ファイル並列取得
|
|
36
|
+
const [pluginsDb, mcpServersDb, skillsDb] = await Promise.all([
|
|
37
|
+
fetchPlugins(),
|
|
38
|
+
fetchMCPServers(),
|
|
39
|
+
fetchSkills(),
|
|
40
|
+
]);
|
|
41
|
+
// いずれかが失敗した場合はnull
|
|
42
|
+
if (!pluginsDb || !mcpServersDb || !skillsDb) {
|
|
43
|
+
console.error("⚠️ Failed to fetch one or more data files");
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
// マージして統合データベースを作成
|
|
47
|
+
const mergedDatabase = {
|
|
48
|
+
version: pluginsDb.version,
|
|
49
|
+
lastUpdated: pluginsDb.lastUpdated,
|
|
50
|
+
items: [...pluginsDb.items, ...mcpServersDb.items, ...skillsDb.items],
|
|
51
|
+
};
|
|
52
|
+
console.error(`✅ Loaded ${mergedDatabase.items.length} recommendations from remote (${mergedDatabase.version})`);
|
|
53
|
+
console.error(` - Plugins: ${pluginsDb.items.length}, MCP: ${mcpServersDb.items.length}, Skills: ${skillsDb.items.length}`);
|
|
54
|
+
return mergedDatabase;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof Error) {
|
|
58
|
+
console.error(`Failed to fetch remote data: ${error.message}`);
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* プラグインデータを取得
|
|
65
|
+
*/
|
|
66
|
+
async function fetchPlugins() {
|
|
67
|
+
return await fetchTypedFile(DEFAULT_PLUGINS_URL, isValidPluginDatabase);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* MCPサーバーデータを取得
|
|
71
|
+
*/
|
|
72
|
+
async function fetchMCPServers() {
|
|
73
|
+
return await fetchTypedFile(DEFAULT_MCP_SERVERS_URL, isValidMCPServerDatabase);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* スキルデータを取得
|
|
77
|
+
*/
|
|
78
|
+
async function fetchSkills() {
|
|
79
|
+
return await fetchTypedFile(DEFAULT_SKILLS_URL, isValidSkillDatabase);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 単一ファイルからデータを取得(後方互換性用)
|
|
83
|
+
*/
|
|
84
|
+
async function fetchSingleFile(url) {
|
|
85
|
+
return await fetchTypedFile(url, isValidDatabase);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 型付きファイルを取得(ETag対応)
|
|
89
|
+
*/
|
|
90
|
+
async function fetchTypedFile(url, validator) {
|
|
91
|
+
try {
|
|
92
|
+
// タイムアウト付きfetch
|
|
93
|
+
const controller = new AbortController();
|
|
94
|
+
const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT);
|
|
95
|
+
// ヘッダーを準備(ETagがあれば If-None-Match を追加)
|
|
96
|
+
const headers = {
|
|
97
|
+
"User-Agent": "cc-recommender",
|
|
98
|
+
Accept: "application/json",
|
|
99
|
+
};
|
|
100
|
+
const cachedEtag = etagCache.get(url);
|
|
101
|
+
if (cachedEtag) {
|
|
102
|
+
headers["If-None-Match"] = cachedEtag;
|
|
103
|
+
}
|
|
104
|
+
const response = await fetch(url, {
|
|
105
|
+
signal: controller.signal,
|
|
106
|
+
headers,
|
|
107
|
+
});
|
|
108
|
+
clearTimeout(timeoutId);
|
|
109
|
+
// 304 Not Modified - キャッシュを返す
|
|
110
|
+
if (response.status === 304) {
|
|
111
|
+
console.error(`📦 Cache hit for ${url} (304 Not Modified)`);
|
|
112
|
+
const cachedData = dataCache.get(url);
|
|
113
|
+
if (cachedData && validator(cachedData)) {
|
|
114
|
+
return cachedData;
|
|
115
|
+
}
|
|
116
|
+
console.error(`⚠️ Cache miss - 304 but no cached data for ${url}`);
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
console.error(`Failed to fetch ${url}: ${response.status}`);
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
// Content-Type 検証
|
|
124
|
+
const contentType = response.headers.get("content-type");
|
|
125
|
+
if (!contentType || !contentType.includes("application/json")) {
|
|
126
|
+
console.error(`⚠️ Invalid content-type for ${url}: ${contentType}`);
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const data = (await response.json());
|
|
130
|
+
// データ検証
|
|
131
|
+
if (!validator(data)) {
|
|
132
|
+
console.error(`⚠️ Data validation failed for ${url}`);
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
// ETagを保存
|
|
136
|
+
const newEtag = response.headers.get("etag");
|
|
137
|
+
if (newEtag) {
|
|
138
|
+
etagCache.set(url, newEtag);
|
|
139
|
+
dataCache.set(url, data);
|
|
140
|
+
console.error(`💾 Cached ETag for ${url}: ${newEtag.substring(0, 12)}...`);
|
|
141
|
+
}
|
|
142
|
+
return data;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (error instanceof Error) {
|
|
146
|
+
if (error.name === "AbortError") {
|
|
147
|
+
console.error(`Fetch timeout for ${url} (5s)`);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
console.error(`Failed to fetch ${url}: ${error.message}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* データベースの妥当性を検証
|
|
158
|
+
*
|
|
159
|
+
* @param data - 検証するデータ
|
|
160
|
+
* @returns 妥当ならtrue
|
|
161
|
+
*/
|
|
162
|
+
function isValidDatabase(data) {
|
|
163
|
+
if (!data || typeof data !== "object") {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
const db = data;
|
|
167
|
+
// 必須フィールドチェック
|
|
168
|
+
if (!db.version || typeof db.version !== "string") {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
if (!db.lastUpdated || typeof db.lastUpdated !== "string") {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
if (!Array.isArray(db.items)) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
// JSON全体のサイズチェック
|
|
178
|
+
const jsonSize = JSON.stringify(data).length;
|
|
179
|
+
if (jsonSize > MAX_JSON_SIZE) {
|
|
180
|
+
console.error(`⚠️ Suspicious: JSON too large (${(jsonSize / 1024 / 1024).toFixed(2)}MB)`);
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
// アイテム数チェック(異常に多い場合は拒否)
|
|
184
|
+
if (db.items.length > 10000) {
|
|
185
|
+
console.error("⚠️ Suspicious: Too many items");
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
// 全アイテムの検証
|
|
189
|
+
for (let i = 0; i < db.items.length; i++) {
|
|
190
|
+
const item = db.items[i];
|
|
191
|
+
// 必須フィールドチェック
|
|
192
|
+
if (!item.id || typeof item.id !== "string") {
|
|
193
|
+
console.error(`⚠️ Invalid item at index ${i}: missing or invalid id`);
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
if (!item.name || typeof item.name !== "string") {
|
|
197
|
+
console.error(`⚠️ Invalid item at index ${i}: missing or invalid name`);
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
if (!item.type || typeof item.type !== "string") {
|
|
201
|
+
console.error(`⚠️ Invalid item at index ${i}: missing or invalid type`);
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
// 型の妥当性チェック
|
|
205
|
+
const validTypes = ["plugin", "mcp-server", "skill"];
|
|
206
|
+
if (!validTypes.includes(item.type)) {
|
|
207
|
+
console.error(`⚠️ Invalid item at index ${i}: invalid type "${item.type}"`);
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
// 個別アイテムのサイズチェック
|
|
211
|
+
const itemSize = JSON.stringify(item).length;
|
|
212
|
+
if (itemSize > MAX_ITEM_SIZE) {
|
|
213
|
+
console.error(`⚠️ Suspicious: Item ${item.id} too large (${(itemSize / 1024).toFixed(2)}KB)`);
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* プラグインデータベースの妥当性を検証
|
|
221
|
+
*/
|
|
222
|
+
function isValidPluginDatabase(data) {
|
|
223
|
+
return isValidTypedDatabase(data, "plugin");
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* MCPサーバーデータベースの妥当性を検証
|
|
227
|
+
*/
|
|
228
|
+
function isValidMCPServerDatabase(data) {
|
|
229
|
+
return isValidTypedDatabase(data, "mcp");
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* スキルデータベースの妥当性を検証
|
|
233
|
+
*/
|
|
234
|
+
function isValidSkillDatabase(data) {
|
|
235
|
+
const validTypes = ["skill", "workflow", "hook", "command", "agent"];
|
|
236
|
+
return isValidTypedDatabase(data, validTypes);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* 型指定されたデータベースの妥当性を検証
|
|
240
|
+
*/
|
|
241
|
+
function isValidTypedDatabase(data, expectedTypes) {
|
|
242
|
+
if (!data || typeof data !== "object") {
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
const db = data;
|
|
246
|
+
// 必須フィールドチェック
|
|
247
|
+
if (!db.version || typeof db.version !== "string") {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
if (!db.lastUpdated || typeof db.lastUpdated !== "string") {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
if (!Array.isArray(db.items)) {
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
// JSON全体のサイズチェック
|
|
257
|
+
const jsonSize = JSON.stringify(data).length;
|
|
258
|
+
if (jsonSize > MAX_JSON_SIZE) {
|
|
259
|
+
console.error(`⚠️ Suspicious: JSON too large (${(jsonSize / 1024 / 1024).toFixed(2)}MB)`);
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
// アイテム数チェック
|
|
263
|
+
if (db.items.length > 10000) {
|
|
264
|
+
console.error("⚠️ Suspicious: Too many items");
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
const allowedTypes = Array.isArray(expectedTypes) ? expectedTypes : [expectedTypes];
|
|
268
|
+
// 全アイテムの検証
|
|
269
|
+
for (let i = 0; i < db.items.length; i++) {
|
|
270
|
+
const item = db.items[i];
|
|
271
|
+
// 必須フィールドチェック
|
|
272
|
+
if (!item.id || typeof item.id !== "string") {
|
|
273
|
+
console.error(`⚠️ Invalid item at index ${i}: missing or invalid id`);
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
if (!item.name || typeof item.name !== "string") {
|
|
277
|
+
console.error(`⚠️ Invalid item at index ${i}: missing or invalid name`);
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
if (!item.type || typeof item.type !== "string") {
|
|
281
|
+
console.error(`⚠️ Invalid item at index ${i}: missing or invalid type`);
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
// 型の妥当性チェック
|
|
285
|
+
if (!allowedTypes.includes(item.type)) {
|
|
286
|
+
console.error(`⚠️ Invalid item at index ${i}: unexpected type "${item.type}"`);
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
// 個別アイテムのサイズチェック
|
|
290
|
+
const itemSize = JSON.stringify(item).length;
|
|
291
|
+
if (itemSize > MAX_ITEM_SIZE) {
|
|
292
|
+
console.error(`⚠️ Suspicious: Item ${item.id} too large (${(itemSize / 1024).toFixed(2)}KB)`);
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* リモートデータ取得が有効かチェック
|
|
300
|
+
*
|
|
301
|
+
* @returns 有効ならtrue
|
|
302
|
+
*/
|
|
303
|
+
export function isRemoteDataEnabled() {
|
|
304
|
+
// 環境変数でオフライン強制可能
|
|
305
|
+
return process.env.CC_RECOMMENDER_OFFLINE_MODE !== "true";
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=remote-data.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-data.repository.js","sourceRoot":"","sources":["../../src/repositories/remote-data.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Exports
|
|
3
|
+
*
|
|
4
|
+
* Central export point for all validation schemas
|
|
5
|
+
*/
|
|
6
|
+
export { type GetSkillDetailsInput, getSkillDetailsSchema, type RecommendSkillsInput, recommendSkillsSchema, type SearchSkillsInput, searchSkillsSchema, } from "./tool-schemas.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,qBAAqB,EAErB,qBAAqB,EAErB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Schemas
|
|
3
|
+
*
|
|
4
|
+
* Zod validation schemas for MCP tool inputs
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
/**
|
|
8
|
+
* Schema for recommend_skills tool input
|
|
9
|
+
*/
|
|
10
|
+
export declare const recommendSkillsSchema: z.ZodObject<{
|
|
11
|
+
project_path: z.ZodString;
|
|
12
|
+
description: z.ZodOptional<z.ZodString>;
|
|
13
|
+
types: z.ZodOptional<z.ZodArray<z.ZodEnum<["plugin", "mcp", "skill", "workflow", "hook", "command", "agent"]>, "many">>;
|
|
14
|
+
max_results: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
project_path: string;
|
|
17
|
+
max_results: number;
|
|
18
|
+
description?: string | undefined;
|
|
19
|
+
types?: ("plugin" | "mcp" | "skill" | "workflow" | "hook" | "command" | "agent")[] | undefined;
|
|
20
|
+
}, {
|
|
21
|
+
project_path: string;
|
|
22
|
+
description?: string | undefined;
|
|
23
|
+
types?: ("plugin" | "mcp" | "skill" | "workflow" | "hook" | "command" | "agent")[] | undefined;
|
|
24
|
+
max_results?: number | undefined;
|
|
25
|
+
}>;
|
|
26
|
+
export type RecommendSkillsInput = z.infer<typeof recommendSkillsSchema>;
|
|
27
|
+
/**
|
|
28
|
+
* Schema for search_skills tool input
|
|
29
|
+
*/
|
|
30
|
+
export declare const searchSkillsSchema: z.ZodObject<{
|
|
31
|
+
query: z.ZodString;
|
|
32
|
+
types: z.ZodOptional<z.ZodArray<z.ZodEnum<["plugin", "mcp", "skill", "workflow", "hook", "command", "agent"]>, "many">>;
|
|
33
|
+
max_results: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
34
|
+
}, "strip", z.ZodTypeAny, {
|
|
35
|
+
max_results: number;
|
|
36
|
+
query: string;
|
|
37
|
+
types?: ("plugin" | "mcp" | "skill" | "workflow" | "hook" | "command" | "agent")[] | undefined;
|
|
38
|
+
}, {
|
|
39
|
+
query: string;
|
|
40
|
+
types?: ("plugin" | "mcp" | "skill" | "workflow" | "hook" | "command" | "agent")[] | undefined;
|
|
41
|
+
max_results?: number | undefined;
|
|
42
|
+
}>;
|
|
43
|
+
export type SearchSkillsInput = z.infer<typeof searchSkillsSchema>;
|
|
44
|
+
/**
|
|
45
|
+
* Schema for get_skill_details tool input
|
|
46
|
+
*/
|
|
47
|
+
export declare const getSkillDetailsSchema: z.ZodObject<{
|
|
48
|
+
name: z.ZodString;
|
|
49
|
+
}, "strip", z.ZodTypeAny, {
|
|
50
|
+
name: string;
|
|
51
|
+
}, {
|
|
52
|
+
name: string;
|
|
53
|
+
}>;
|
|
54
|
+
export type GetSkillDetailsInput = z.infer<typeof getSkillDetailsSchema>;
|
|
55
|
+
//# sourceMappingURL=tool-schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schemas.d.ts","sourceRoot":"","sources":["../../src/schemas/tool-schemas.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;EAQhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAO7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;EAEhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Schemas
|
|
3
|
+
*
|
|
4
|
+
* Zod validation schemas for MCP tool inputs
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
/**
|
|
8
|
+
* Schema for recommend_skills tool input
|
|
9
|
+
*/
|
|
10
|
+
export const recommendSkillsSchema = z.object({
|
|
11
|
+
project_path: z.string().describe("プロジェクトのパス"),
|
|
12
|
+
description: z.string().optional().describe("何を作りたいか、何を探しているか"),
|
|
13
|
+
types: z
|
|
14
|
+
.array(z.enum(["plugin", "mcp", "skill", "workflow", "hook", "command", "agent"]))
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("フィルタするタイプ"),
|
|
17
|
+
max_results: z.number().min(1).max(50).optional().default(20).describe("最大結果数"),
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* Schema for search_skills tool input
|
|
21
|
+
*/
|
|
22
|
+
export const searchSkillsSchema = z.object({
|
|
23
|
+
query: z.string().describe("検索キーワード"),
|
|
24
|
+
types: z
|
|
25
|
+
.array(z.enum(["plugin", "mcp", "skill", "workflow", "hook", "command", "agent"]))
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("フィルタするタイプ"),
|
|
28
|
+
max_results: z.number().min(1).max(50).optional().default(20).describe("最大結果数"),
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Schema for get_skill_details tool input
|
|
32
|
+
*/
|
|
33
|
+
export const getSkillDetailsSchema = z.object({
|
|
34
|
+
name: z.string().describe("スキル/プラグイン/MCPの名前"),
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=tool-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schemas.js","sourceRoot":"","sources":["../../src/schemas/tool-schemas.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAC/D,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;SACjF,QAAQ,EAAE;SACV,QAAQ,CAAC,WAAW,CAAC;IACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;CAChF,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;IACrC,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;SACjF,QAAQ,EAAE;SACV,QAAQ,CAAC,WAAW,CAAC;IACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;CAChF,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CAC9C,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Setup
|
|
3
|
+
*
|
|
4
|
+
* Creates and configures the MCP server
|
|
5
|
+
*/
|
|
6
|
+
import type { RecommendationDatabase } from "../types/domain-types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Create and start the MCP server
|
|
9
|
+
*/
|
|
10
|
+
export declare function createMcpServer(database: RecommendationDatabase): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGvE;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBrF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Setup
|
|
3
|
+
*
|
|
4
|
+
* Creates and configures the MCP server
|
|
5
|
+
*/
|
|
6
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
8
|
+
import { registerTools } from "./tool-registry.js";
|
|
9
|
+
/**
|
|
10
|
+
* Create and start the MCP server
|
|
11
|
+
*/
|
|
12
|
+
export async function createMcpServer(database) {
|
|
13
|
+
// Create MCP server
|
|
14
|
+
const server = new McpServer({
|
|
15
|
+
name: "cc-recommender",
|
|
16
|
+
version: "0.1.0",
|
|
17
|
+
}, {
|
|
18
|
+
capabilities: {},
|
|
19
|
+
});
|
|
20
|
+
// Register tools
|
|
21
|
+
registerTools(server, database);
|
|
22
|
+
// Connect via stdio
|
|
23
|
+
const transport = new StdioServerTransport();
|
|
24
|
+
await server.connect(transport);
|
|
25
|
+
console.error("cc-recommender MCP server started");
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgC;IACpE,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE,EAAE;KACjB,CACF,CAAC;IAEF,iBAAiB;IACjB,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEhC,oBAAoB;IACpB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Registry
|
|
3
|
+
*
|
|
4
|
+
* Registers all MCP tools with the server
|
|
5
|
+
*/
|
|
6
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
|
+
import type { RecommendationDatabase } from "../types/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* Register all tools with the MCP server
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerTools(server: McpServer, database: RecommendationDatabase): void;
|
|
12
|
+
//# sourceMappingURL=tool-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/server/tool-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CA6HvF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Registry
|
|
3
|
+
*
|
|
4
|
+
* Registers all MCP tools with the server
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { getSkillDetailsSchema, recommendSkillsSchema, searchSkillsSchema, } from "../schemas/tool-schemas.js";
|
|
8
|
+
import { getSkillDetails, getStats, listCategories, recommendSkills, searchSkills, } from "../tools/handlers/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Register all tools with the MCP server
|
|
11
|
+
*/
|
|
12
|
+
export function registerTools(server, database) {
|
|
13
|
+
/**
|
|
14
|
+
* recommend_skills - Analyze project and recommend
|
|
15
|
+
*/
|
|
16
|
+
server.registerTool("recommend_skills", {
|
|
17
|
+
title: "プロジェクト推薦",
|
|
18
|
+
description: "プロジェクトを分析し、適切なスキル、プラグイン、MCPサーバーを推薦します",
|
|
19
|
+
inputSchema: recommendSkillsSchema.shape,
|
|
20
|
+
}, async (input) => {
|
|
21
|
+
const result = await recommendSkills(input, database);
|
|
22
|
+
return {
|
|
23
|
+
content: [
|
|
24
|
+
{
|
|
25
|
+
type: "text",
|
|
26
|
+
text: JSON.stringify(result, null, 2),
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* search_skills - Search by keyword
|
|
33
|
+
*/
|
|
34
|
+
server.registerTool("search_skills", {
|
|
35
|
+
title: "キーワード検索",
|
|
36
|
+
description: "キーワードでスキル、プラグイン、MCPサーバーを検索します",
|
|
37
|
+
inputSchema: searchSkillsSchema.shape,
|
|
38
|
+
}, async (input) => {
|
|
39
|
+
const result = await searchSkills(input, database);
|
|
40
|
+
return {
|
|
41
|
+
content: [
|
|
42
|
+
{
|
|
43
|
+
type: "text",
|
|
44
|
+
text: JSON.stringify(result, null, 2),
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
/**
|
|
50
|
+
* get_skill_details - Get details of a specific item
|
|
51
|
+
*/
|
|
52
|
+
server.registerTool("get_skill_details", {
|
|
53
|
+
title: "詳細取得",
|
|
54
|
+
description: "特定のスキル、プラグイン、MCPサーバーの詳細を取得します",
|
|
55
|
+
inputSchema: getSkillDetailsSchema.shape,
|
|
56
|
+
}, async (input) => {
|
|
57
|
+
const result = await getSkillDetails(input, database);
|
|
58
|
+
if (!result) {
|
|
59
|
+
return {
|
|
60
|
+
content: [
|
|
61
|
+
{
|
|
62
|
+
type: "text",
|
|
63
|
+
text: `Not found: ${input.name}`,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
content: [
|
|
70
|
+
{
|
|
71
|
+
type: "text",
|
|
72
|
+
text: JSON.stringify(result, null, 2),
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
/**
|
|
78
|
+
* list_categories - List all categories
|
|
79
|
+
*/
|
|
80
|
+
server.registerTool("list_categories", {
|
|
81
|
+
title: "カテゴリ一覧",
|
|
82
|
+
description: "利用可能なカテゴリ一覧を取得します",
|
|
83
|
+
inputSchema: z.object({}).shape,
|
|
84
|
+
}, async () => {
|
|
85
|
+
const result = await listCategories(database);
|
|
86
|
+
return {
|
|
87
|
+
content: [
|
|
88
|
+
{
|
|
89
|
+
type: "text",
|
|
90
|
+
text: JSON.stringify(result, null, 2),
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
/**
|
|
96
|
+
* get_stats - Get database statistics
|
|
97
|
+
*/
|
|
98
|
+
server.registerTool("get_stats", {
|
|
99
|
+
title: "統計情報",
|
|
100
|
+
description: "データベースの統計情報を取得します",
|
|
101
|
+
inputSchema: z.object({}).shape,
|
|
102
|
+
}, async () => {
|
|
103
|
+
const result = await getStats(database);
|
|
104
|
+
return {
|
|
105
|
+
content: [
|
|
106
|
+
{
|
|
107
|
+
type: "text",
|
|
108
|
+
text: JSON.stringify(result, null, 2),
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=tool-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/server/tool-registry.ts"],"names":[],"mappings":"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"}
|