ukagaka-doc-mcp 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/LICENSE +21 -0
- package/NOTICE.md +24 -0
- package/README.md +109 -0
- package/SPEC.md +356 -0
- package/data/index.json +22046 -0
- package/dist/bootstrap.d.ts +17 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +57 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/build-index.d.ts +12 -0
- package/dist/build-index.d.ts.map +1 -0
- package/dist/build-index.js +51 -0
- package/dist/build-index.js.map +1 -0
- package/dist/constants.d.ts +77 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +86 -0
- package/dist/constants.js.map +1 -0
- package/dist/index-builder.d.ts +5 -0
- package/dist/index-builder.d.ts.map +1 -0
- package/dist/index-builder.js +53 -0
- package/dist/index-builder.js.map +1 -0
- package/dist/index-validation.d.ts +9 -0
- package/dist/index-validation.d.ts.map +1 -0
- package/dist/index-validation.js +75 -0
- package/dist/index-validation.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/satori-scraper.d.ts +35 -0
- package/dist/parser/satori-scraper.d.ts.map +1 -0
- package/dist/parser/satori-scraper.js +272 -0
- package/dist/parser/satori-scraper.js.map +1 -0
- package/dist/parser/ukadoc-parser.d.ts +21 -0
- package/dist/parser/ukadoc-parser.d.ts.map +1 -0
- package/dist/parser/ukadoc-parser.js +231 -0
- package/dist/parser/ukadoc-parser.js.map +1 -0
- package/dist/parser/yaya-scraper.d.ts +46 -0
- package/dist/parser/yaya-scraper.d.ts.map +1 -0
- package/dist/parser/yaya-scraper.js +308 -0
- package/dist/parser/yaya-scraper.js.map +1 -0
- package/dist/search/engine.d.ts +41 -0
- package/dist/search/engine.d.ts.map +1 -0
- package/dist/search/engine.js +114 -0
- package/dist/search/engine.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +36 -0
- package/dist/server.js.map +1 -0
- package/dist/text.d.ts +2 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +8 -0
- package/dist/text.js.map +1 -0
- package/dist/tools/get-doc.d.ts +4 -0
- package/dist/tools/get-doc.d.ts.map +1 -0
- package/dist/tools/get-doc.js +29 -0
- package/dist/tools/get-doc.js.map +1 -0
- package/dist/tools/list-categories.d.ts +3 -0
- package/dist/tools/list-categories.d.ts.map +1 -0
- package/dist/tools/list-categories.js +21 -0
- package/dist/tools/list-categories.js.map +1 -0
- package/dist/tools/search-docs.d.ts +4 -0
- package/dist/tools/search-docs.d.ts.map +1 -0
- package/dist/tools/search-docs.js +45 -0
- package/dist/tools/search-docs.js.map +1 -0
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAYA Wiki スクレイパー
|
|
3
|
+
*
|
|
4
|
+
* https://emily.shillest.net/ayaya/ (PukiWiki Plus!)
|
|
5
|
+
*
|
|
6
|
+
* 設計方針:
|
|
7
|
+
* - YAYA関数ページ(マニュアル/関数/*)は1ページ=1エントリ(情報断片化防止)
|
|
8
|
+
* - その他のページはセクション(h2/h3)単位で分割
|
|
9
|
+
* - レート制限: 500ms/リクエスト
|
|
10
|
+
*/
|
|
11
|
+
import { SCRAPE_RATE_LIMIT_MS } from '../constants.js';
|
|
12
|
+
import * as cheerio from 'cheerio';
|
|
13
|
+
const BASE_URL = 'https://emily.shillest.net/ayaya/';
|
|
14
|
+
const INVALID_PAGE_MARKERS = ['有効なWikiNameではありません'];
|
|
15
|
+
/** スクレイプ対象ページ一覧。ビルド時に動的取得するページのベース。 */
|
|
16
|
+
export const YAYA_STATIC_PAGES = [
|
|
17
|
+
// -- マニュアル/文法 --
|
|
18
|
+
{ path: 'マニュアル/文法/基礎設定', category: 'yaya_grammar' },
|
|
19
|
+
{ path: 'マニュアル/文法/関数定義', category: 'yaya_grammar' },
|
|
20
|
+
{ path: 'マニュアル/文法/変数', category: 'yaya_grammar' },
|
|
21
|
+
{ path: 'マニュアル/文法/演算', category: 'yaya_grammar' },
|
|
22
|
+
{ path: 'マニュアル/文法/配列', category: 'yaya_grammar' },
|
|
23
|
+
{ path: 'マニュアル/文法/フロー制御', category: 'yaya_grammar' },
|
|
24
|
+
{ path: 'マニュアル/文法/プリプロセッサ', category: 'yaya_grammar' },
|
|
25
|
+
{ path: 'マニュアル/文法/予約語', category: 'yaya_grammar' },
|
|
26
|
+
{ path: 'マニュアル/文法/DLL仕様', category: 'yaya_grammar' },
|
|
27
|
+
{ path: 'マニュアル/文法/文字コード', category: 'yaya_grammar' },
|
|
28
|
+
// -- マニュアル/基本 --
|
|
29
|
+
{ path: 'マニュアル/基本/変数', category: 'yaya_basic' },
|
|
30
|
+
{ path: 'マニュアル/基本/関数', category: 'yaya_basic' },
|
|
31
|
+
{ path: 'マニュアル/基本/条件分岐', category: 'yaya_basic' },
|
|
32
|
+
{ path: 'マニュアル/基本/ループ', category: 'yaya_basic' },
|
|
33
|
+
{ path: 'マニュアル/基本/配列', category: 'yaya_basic' },
|
|
34
|
+
{ path: 'マニュアル/基本/演算子', category: 'yaya_basic' },
|
|
35
|
+
// -- システム辞書 --
|
|
36
|
+
{ path: 'システム辞書', category: 'yaya_system' },
|
|
37
|
+
{ path: 'システム辞書/yaya_shiori3.dic', category: 'yaya_system' },
|
|
38
|
+
{ path: 'システム辞書/yaya_optional.dic', category: 'yaya_system' },
|
|
39
|
+
// -- StartUp --
|
|
40
|
+
{ path: 'StartUp', category: 'yaya_startup' },
|
|
41
|
+
{ path: 'StartUp/YAYAでゴーストを作る', category: 'yaya_startup' },
|
|
42
|
+
{ path: 'StartUp/AYAからの移行', category: 'yaya_startup' },
|
|
43
|
+
{ path: 'StartUp/里々からの移行', category: 'yaya_startup' },
|
|
44
|
+
// -- SAORI/MAKOTO/PLUGIN --
|
|
45
|
+
{ path: 'YAYA as SAORI', category: 'yaya_grammar' },
|
|
46
|
+
{ path: 'YAYA as MAKOTO', category: 'yaya_grammar' },
|
|
47
|
+
{ path: 'YAYA as PLUGIN', category: 'yaya_grammar' },
|
|
48
|
+
];
|
|
49
|
+
/** 関数ページのプレフィックス */
|
|
50
|
+
export const YAYA_FUNCTION_PAGE_PREFIX = 'マニュアル/関数/';
|
|
51
|
+
/** Tipsページのプレフィックス */
|
|
52
|
+
export const YAYA_TIPS_PAGE_PREFIX = 'Tips/';
|
|
53
|
+
// ============================================================
|
|
54
|
+
// HTTP取得
|
|
55
|
+
// ============================================================
|
|
56
|
+
async function fetchPageHtml(pagePath) {
|
|
57
|
+
const encodedPath = encodePagePath(pagePath);
|
|
58
|
+
const url = `${BASE_URL}?${encodedPath}`;
|
|
59
|
+
try {
|
|
60
|
+
const res = await fetch(url, {
|
|
61
|
+
headers: {
|
|
62
|
+
'User-Agent': 'ukagaka-doc-mcp/0.1 (index builder; +https://github.com/)',
|
|
63
|
+
'Accept': 'text/html',
|
|
64
|
+
},
|
|
65
|
+
signal: AbortSignal.timeout(15000),
|
|
66
|
+
});
|
|
67
|
+
if (!res.ok) {
|
|
68
|
+
console.error(`[yaya-scraper] HTTP ${res.status} for ${url}`);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return await res.text();
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
console.error(`[yaya-scraper] Failed to fetch ${url}:`, err);
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function encodePagePath(pagePath) {
|
|
79
|
+
// PukiWikiのURLは各セグメントを%エンコード(/ はそのまま)
|
|
80
|
+
return pagePath.split('/').map(encodeURIComponent).join('/');
|
|
81
|
+
}
|
|
82
|
+
function sleep(ms) {
|
|
83
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
84
|
+
}
|
|
85
|
+
// ============================================================
|
|
86
|
+
// HTMLパース
|
|
87
|
+
// ============================================================
|
|
88
|
+
/**
|
|
89
|
+
* PukiWiki のHTMLからコンテンツ本文を抽出し、DocEntry を生成する。
|
|
90
|
+
*
|
|
91
|
+
* @param html 取得したHTML
|
|
92
|
+
* @param pagePath Wikiページパス(canonical_id生成に使用)
|
|
93
|
+
* @param category カテゴリ
|
|
94
|
+
* @param onePageOneEntry true の場合はセクション分割せず1エントリにする
|
|
95
|
+
*/
|
|
96
|
+
export function parseYayaPage(html, pagePath, category, onePageOneEntry = false) {
|
|
97
|
+
const $ = cheerio.load(html);
|
|
98
|
+
const pageUrl = `${BASE_URL}?${encodePagePath(pagePath)}`;
|
|
99
|
+
// ナビゲーション・ヘッダー・フッターを除去
|
|
100
|
+
$('#menu, #menubar, #navi, .navi, #footer, #toolbar, form').remove();
|
|
101
|
+
$('script, style').remove();
|
|
102
|
+
const pageTitle = $('#page-title, h1').first().text().trim() || pagePath.split('/').pop() || pagePath;
|
|
103
|
+
// コンテンツ領域を取得(PukiWiki の #content または body)
|
|
104
|
+
const $content = $('#content, #body, .body').first();
|
|
105
|
+
const $root = $content.length ? $content : $('body');
|
|
106
|
+
if (isInvalidWikiPage(pageTitle, extractText($root.text()))) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
if (onePageOneEntry) {
|
|
110
|
+
// 関数ページ: 1ページ=1エントリ
|
|
111
|
+
const content = extractText($root.text());
|
|
112
|
+
return [{
|
|
113
|
+
id: `yaya:${pagePath}`,
|
|
114
|
+
title: pageTitle,
|
|
115
|
+
source: 'yaya_wiki',
|
|
116
|
+
category,
|
|
117
|
+
content,
|
|
118
|
+
url: pageUrl,
|
|
119
|
+
}];
|
|
120
|
+
}
|
|
121
|
+
// セクション(h2/h3)単位で分割
|
|
122
|
+
const entries = [];
|
|
123
|
+
const headers = $root.find('h2, h3');
|
|
124
|
+
if (headers.length === 0) {
|
|
125
|
+
// セクションなし: 1エントリ
|
|
126
|
+
const content = extractText($root.text());
|
|
127
|
+
if (content.trim()) {
|
|
128
|
+
entries.push({
|
|
129
|
+
id: `yaya:${pagePath}`,
|
|
130
|
+
title: pageTitle,
|
|
131
|
+
source: 'yaya_wiki',
|
|
132
|
+
category,
|
|
133
|
+
content,
|
|
134
|
+
url: pageUrl,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return entries;
|
|
138
|
+
}
|
|
139
|
+
headers.each((_, header) => {
|
|
140
|
+
const $header = $(header);
|
|
141
|
+
const sectionTitle = $header.text().replace(/[†¶#]/g, '').trim();
|
|
142
|
+
if (!sectionTitle)
|
|
143
|
+
return;
|
|
144
|
+
const anchor = $header.attr('id') || slugify(sectionTitle);
|
|
145
|
+
const parts = [sectionTitle];
|
|
146
|
+
let $sibling = $header.next();
|
|
147
|
+
while ($sibling.length && !$sibling.is('h2, h3')) {
|
|
148
|
+
const text = $sibling.text().trim();
|
|
149
|
+
if (text)
|
|
150
|
+
parts.push(text);
|
|
151
|
+
$sibling = $sibling.next();
|
|
152
|
+
}
|
|
153
|
+
const content = parts.join('\n');
|
|
154
|
+
if (content.trim().length < 10)
|
|
155
|
+
return;
|
|
156
|
+
entries.push({
|
|
157
|
+
id: `yaya:${pagePath}#${anchor}`,
|
|
158
|
+
title: `${pageTitle} - ${sectionTitle}`,
|
|
159
|
+
source: 'yaya_wiki',
|
|
160
|
+
category,
|
|
161
|
+
content,
|
|
162
|
+
url: `${pageUrl}#${anchor}`,
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
return entries;
|
|
166
|
+
}
|
|
167
|
+
// ============================================================
|
|
168
|
+
// ページ一覧取得(関数一覧・Tips一覧)
|
|
169
|
+
// ============================================================
|
|
170
|
+
/**
|
|
171
|
+
* YAYA Wiki の関数一覧ページから個別関数ページのリストを取得する。
|
|
172
|
+
*/
|
|
173
|
+
export async function fetchYayaFunctionPageList() {
|
|
174
|
+
// マニュアル/関数 の一覧ページを取得してリンクを収集
|
|
175
|
+
const indexPages = ['マニュアル/関数'];
|
|
176
|
+
const functionPages = [];
|
|
177
|
+
for (const indexPage of indexPages) {
|
|
178
|
+
const html = await fetchPageHtml(indexPage);
|
|
179
|
+
if (!html)
|
|
180
|
+
continue;
|
|
181
|
+
const $ = cheerio.load(html);
|
|
182
|
+
$('#content a, #body a, .body a').each((_, a) => {
|
|
183
|
+
const href = normalizeYayaWikiHref($(a).attr('href'));
|
|
184
|
+
// ?マニュアル/関数/XXX 形式のリンクを収集
|
|
185
|
+
if (href?.startsWith('?') && !isMetaWikiHref(href) && href.includes('%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB')) {
|
|
186
|
+
try {
|
|
187
|
+
const pagePath = decodeURIComponent(href.slice(1));
|
|
188
|
+
if (pagePath.startsWith(YAYA_FUNCTION_PAGE_PREFIX) && pagePath !== YAYA_FUNCTION_PAGE_PREFIX) {
|
|
189
|
+
functionPages.push(pagePath);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// デコード失敗は無視
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
await sleep(SCRAPE_RATE_LIMIT_MS);
|
|
198
|
+
}
|
|
199
|
+
return [...new Set(functionPages)]; // 重複除去
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* YAYA Wiki の Tips 一覧ページから個別Tipsページのリストを取得する。
|
|
203
|
+
*/
|
|
204
|
+
export async function fetchYayaTipsPageList() {
|
|
205
|
+
const tipsPages = [];
|
|
206
|
+
const html = await fetchPageHtml('Tips');
|
|
207
|
+
if (!html)
|
|
208
|
+
return tipsPages;
|
|
209
|
+
const $ = cheerio.load(html);
|
|
210
|
+
$('#content a, #body a').each((_, a) => {
|
|
211
|
+
const href = normalizeYayaWikiHref($(a).attr('href'));
|
|
212
|
+
if (href?.startsWith('?') && !isMetaWikiHref(href)) {
|
|
213
|
+
try {
|
|
214
|
+
const pagePath = decodeURIComponent(href.slice(1));
|
|
215
|
+
if (pagePath.startsWith(YAYA_TIPS_PAGE_PREFIX)) {
|
|
216
|
+
tipsPages.push(pagePath);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// ignore
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
await sleep(SCRAPE_RATE_LIMIT_MS);
|
|
225
|
+
return [...new Set(tipsPages)];
|
|
226
|
+
}
|
|
227
|
+
// ============================================================
|
|
228
|
+
// メインスクレイプ関数
|
|
229
|
+
// ============================================================
|
|
230
|
+
/**
|
|
231
|
+
* YAYA Wiki全体をスクレイプして DocEntry[] を返す。
|
|
232
|
+
*/
|
|
233
|
+
export async function scrapeYayaWiki() {
|
|
234
|
+
const allEntries = [];
|
|
235
|
+
// 1. 静的ページ
|
|
236
|
+
console.error('[yaya-scraper] Scraping static pages...');
|
|
237
|
+
for (const pageDef of YAYA_STATIC_PAGES) {
|
|
238
|
+
const html = await fetchPageHtml(pageDef.path);
|
|
239
|
+
if (html) {
|
|
240
|
+
const entries = parseYayaPage(html, pageDef.path, pageDef.category, pageDef.onePageOneEntry);
|
|
241
|
+
allEntries.push(...entries);
|
|
242
|
+
console.error(`[yaya-scraper] ${pageDef.path}: ${entries.length} entries`);
|
|
243
|
+
}
|
|
244
|
+
await sleep(SCRAPE_RATE_LIMIT_MS);
|
|
245
|
+
}
|
|
246
|
+
// 2. 関数ページ(動的に一覧を取得)
|
|
247
|
+
console.error('[yaya-scraper] Fetching function page list...');
|
|
248
|
+
const functionPages = await fetchYayaFunctionPageList();
|
|
249
|
+
console.error(`[yaya-scraper] Found ${functionPages.length} function pages`);
|
|
250
|
+
for (const pagePath of functionPages) {
|
|
251
|
+
const html = await fetchPageHtml(pagePath);
|
|
252
|
+
if (html) {
|
|
253
|
+
// 関数ページは1ページ=1エントリ
|
|
254
|
+
const entries = parseYayaPage(html, pagePath, 'yaya_function', true);
|
|
255
|
+
allEntries.push(...entries);
|
|
256
|
+
}
|
|
257
|
+
await sleep(SCRAPE_RATE_LIMIT_MS);
|
|
258
|
+
}
|
|
259
|
+
// 3. Tips ページ(動的に一覧を取得)
|
|
260
|
+
console.error('[yaya-scraper] Fetching Tips page list...');
|
|
261
|
+
const tipsPages = await fetchYayaTipsPageList();
|
|
262
|
+
console.error(`[yaya-scraper] Found ${tipsPages.length} Tips pages`);
|
|
263
|
+
for (const pagePath of tipsPages) {
|
|
264
|
+
const html = await fetchPageHtml(pagePath);
|
|
265
|
+
if (html) {
|
|
266
|
+
const entries = parseYayaPage(html, pagePath, 'yaya_tips');
|
|
267
|
+
allEntries.push(...entries);
|
|
268
|
+
}
|
|
269
|
+
await sleep(SCRAPE_RATE_LIMIT_MS);
|
|
270
|
+
}
|
|
271
|
+
console.error(`[yaya-scraper] Total: ${allEntries.length} entries`);
|
|
272
|
+
return allEntries;
|
|
273
|
+
}
|
|
274
|
+
// ============================================================
|
|
275
|
+
// ユーティリティ
|
|
276
|
+
// ============================================================
|
|
277
|
+
function extractText(text) {
|
|
278
|
+
return text.replace(/\s+/g, ' ').trim();
|
|
279
|
+
}
|
|
280
|
+
function slugify(text) {
|
|
281
|
+
return text
|
|
282
|
+
.replace(/[^\w\u3040-\u9FFF]/g, '_')
|
|
283
|
+
.replace(/_+/g, '_')
|
|
284
|
+
.slice(0, 64);
|
|
285
|
+
}
|
|
286
|
+
export function normalizeYayaWikiHref(href) {
|
|
287
|
+
if (!href) {
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
if (href.startsWith('#')) {
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
let normalized = href;
|
|
294
|
+
if (normalized.startsWith('./?')) {
|
|
295
|
+
normalized = normalized.slice(2);
|
|
296
|
+
}
|
|
297
|
+
if (!normalized.startsWith('?')) {
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
return normalized.split('#', 1)[0] || null;
|
|
301
|
+
}
|
|
302
|
+
function isMetaWikiHref(href) {
|
|
303
|
+
return href.startsWith('?cmd=') || href.startsWith('?plugin=');
|
|
304
|
+
}
|
|
305
|
+
function isInvalidWikiPage(pageTitle, bodyText) {
|
|
306
|
+
return INVALID_PAGE_MARKERS.some(marker => pageTitle.includes(marker) || bodyText.includes(marker));
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=yaya-scraper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaya-scraper.js","sourceRoot":"","sources":["../../src/parser/yaya-scraper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 検索エンジン
|
|
3
|
+
*
|
|
4
|
+
* インメモリ全文検索。起動時に DocEntry[] をロードして以後はメモリ内で検索する。
|
|
5
|
+
*
|
|
6
|
+
* 検索仕様:
|
|
7
|
+
* - 大文字小文字無視
|
|
8
|
+
* - 日本語・英語とも部分一致
|
|
9
|
+
* - バックスラッシュ正規化: \\s → \s(クエリとコンテンツ両方に適用)
|
|
10
|
+
* - スコアリング: タイトル完全一致 > タイトル部分一致 > 本文部分一致
|
|
11
|
+
*/
|
|
12
|
+
import type { DocEntry, SearchEntry, Source, Category } from '../types.js';
|
|
13
|
+
export interface SearchOptions {
|
|
14
|
+
category?: Category;
|
|
15
|
+
source?: Source;
|
|
16
|
+
limit?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class SearchEngine {
|
|
19
|
+
private entries;
|
|
20
|
+
/**
|
|
21
|
+
* インデックスをロードする。起動時に1回呼ぶ。
|
|
22
|
+
*/
|
|
23
|
+
load(entries: DocEntry[]): void;
|
|
24
|
+
/**
|
|
25
|
+
* インデックスにエントリをマージする(差分更新用。将来の拡張のため残す)。
|
|
26
|
+
*/
|
|
27
|
+
merge(newEntries: DocEntry[]): void;
|
|
28
|
+
get size(): number;
|
|
29
|
+
/**
|
|
30
|
+
* id でエントリを1件取得する(get_doc ツール用)。
|
|
31
|
+
*/
|
|
32
|
+
getById(id: string): DocEntry | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* キーワード検索。SearchEntry(summary付き)のリストを返す。
|
|
35
|
+
*/
|
|
36
|
+
search(query: string, opts?: SearchOptions): {
|
|
37
|
+
results: SearchEntry[];
|
|
38
|
+
total: number;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/search/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA0C3E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAkB;IAEjC;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI;IAK/B;;OAEG;IACH,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI;IAQnC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIzC;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG;QAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;CAgC3F"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 検索エンジン
|
|
3
|
+
*
|
|
4
|
+
* インメモリ全文検索。起動時に DocEntry[] をロードして以後はメモリ内で検索する。
|
|
5
|
+
*
|
|
6
|
+
* 検索仕様:
|
|
7
|
+
* - 大文字小文字無視
|
|
8
|
+
* - 日本語・英語とも部分一致
|
|
9
|
+
* - バックスラッシュ正規化: \\s → \s(クエリとコンテンツ両方に適用)
|
|
10
|
+
* - スコアリング: タイトル完全一致 > タイトル部分一致 > 本文部分一致
|
|
11
|
+
*/
|
|
12
|
+
import { buildSummary } from '../text.js';
|
|
13
|
+
// ============================================================
|
|
14
|
+
// 正規化
|
|
15
|
+
// ============================================================
|
|
16
|
+
function normalizeQuery(query) {
|
|
17
|
+
return query
|
|
18
|
+
// \\s → \s のような二重バックスラッシュを正規化
|
|
19
|
+
.replace(/\\\\/g, '\\')
|
|
20
|
+
.toLowerCase();
|
|
21
|
+
}
|
|
22
|
+
function normalizeContent(text) {
|
|
23
|
+
return text
|
|
24
|
+
.replace(/\\\\/g, '\\')
|
|
25
|
+
.toLowerCase();
|
|
26
|
+
}
|
|
27
|
+
// ============================================================
|
|
28
|
+
// スコアリング
|
|
29
|
+
// ============================================================
|
|
30
|
+
const SCORE_TITLE_EXACT = 100;
|
|
31
|
+
const SCORE_TITLE_PARTIAL = 50;
|
|
32
|
+
const SCORE_CONTENT_MATCH = 10;
|
|
33
|
+
function scoreEntry(entry, normalizedQuery) {
|
|
34
|
+
const title = normalizeContent(entry.title);
|
|
35
|
+
const content = normalizeContent(entry.content);
|
|
36
|
+
if (title === normalizedQuery)
|
|
37
|
+
return SCORE_TITLE_EXACT;
|
|
38
|
+
if (title.includes(normalizedQuery))
|
|
39
|
+
return SCORE_TITLE_PARTIAL;
|
|
40
|
+
if (content.includes(normalizedQuery))
|
|
41
|
+
return SCORE_CONTENT_MATCH;
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
export class SearchEngine {
|
|
45
|
+
entries = [];
|
|
46
|
+
/**
|
|
47
|
+
* インデックスをロードする。起動時に1回呼ぶ。
|
|
48
|
+
*/
|
|
49
|
+
load(entries) {
|
|
50
|
+
this.entries = entries;
|
|
51
|
+
console.error(`[search-engine] Loaded ${entries.length} entries`);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* インデックスにエントリをマージする(差分更新用。将来の拡張のため残す)。
|
|
55
|
+
*/
|
|
56
|
+
merge(newEntries) {
|
|
57
|
+
const idSet = new Set(newEntries.map(e => e.id));
|
|
58
|
+
this.entries = [
|
|
59
|
+
...this.entries.filter(e => !idSet.has(e.id)),
|
|
60
|
+
...newEntries,
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
get size() {
|
|
64
|
+
return this.entries.length;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* id でエントリを1件取得する(get_doc ツール用)。
|
|
68
|
+
*/
|
|
69
|
+
getById(id) {
|
|
70
|
+
return this.entries.find(e => e.id === id);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* キーワード検索。SearchEntry(summary付き)のリストを返す。
|
|
74
|
+
*/
|
|
75
|
+
search(query, opts = {}) {
|
|
76
|
+
if (!query.trim()) {
|
|
77
|
+
return { results: [], total: 0 };
|
|
78
|
+
}
|
|
79
|
+
const normalizedQuery = normalizeQuery(query);
|
|
80
|
+
const limit = Math.min(opts.limit ?? 10, 50);
|
|
81
|
+
const scored = [];
|
|
82
|
+
for (const entry of this.entries) {
|
|
83
|
+
// ソースフィルタ
|
|
84
|
+
if (opts.source && entry.source !== opts.source)
|
|
85
|
+
continue;
|
|
86
|
+
// カテゴリフィルタ
|
|
87
|
+
if (opts.category && entry.category !== opts.category)
|
|
88
|
+
continue;
|
|
89
|
+
const score = scoreEntry(entry, normalizedQuery);
|
|
90
|
+
if (score > 0) {
|
|
91
|
+
scored.push({ entry, score });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// スコア降順 → id昇順(同スコア内の安定ソート)
|
|
95
|
+
scored.sort((a, b) => b.score - a.score || a.entry.id.localeCompare(b.entry.id));
|
|
96
|
+
const total = scored.length;
|
|
97
|
+
const results = scored.slice(0, limit).map(({ entry }) => toSearchEntry(entry));
|
|
98
|
+
return { results, total };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ============================================================
|
|
102
|
+
// DocEntry → SearchEntry 変換
|
|
103
|
+
// ============================================================
|
|
104
|
+
function toSearchEntry(entry) {
|
|
105
|
+
return {
|
|
106
|
+
id: entry.id,
|
|
107
|
+
title: entry.title,
|
|
108
|
+
source: entry.source,
|
|
109
|
+
category: entry.category,
|
|
110
|
+
summary: buildSummary(entry.content),
|
|
111
|
+
url: entry.url,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/search/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCPサーバー定義
|
|
3
|
+
*
|
|
4
|
+
* createServer で3つのツールを登録する:
|
|
5
|
+
* 1. search_docs - キーワード検索(summary返却)
|
|
6
|
+
* 2. get_doc - 全文取得(id → DocEntry)
|
|
7
|
+
* 3. list_categories - カテゴリ一覧
|
|
8
|
+
*/
|
|
9
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
10
|
+
import type { SearchEngine } from './search/engine.js';
|
|
11
|
+
export declare function createMcpServer(engine: SearchEngine): McpServer;
|
|
12
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAsBvD,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAW/D"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCPサーバー定義
|
|
3
|
+
*
|
|
4
|
+
* createServer で3つのツールを登録する:
|
|
5
|
+
* 1. search_docs - キーワード検索(summary返却)
|
|
6
|
+
* 2. get_doc - 全文取得(id → DocEntry)
|
|
7
|
+
* 3. list_categories - カテゴリ一覧
|
|
8
|
+
*/
|
|
9
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
10
|
+
import { registerGetDocTool } from './tools/get-doc.js';
|
|
11
|
+
import { registerListCategoriesTool } from './tools/list-categories.js';
|
|
12
|
+
import { registerSearchDocsTool } from './tools/search-docs.js';
|
|
13
|
+
const SERVER_INSTRUCTIONS = `\
|
|
14
|
+
このサーバーは伺か(Ukagaka)の技術ドキュメントを検索します。
|
|
15
|
+
|
|
16
|
+
3つのソースからドキュメントを提供します:
|
|
17
|
+
- UKADOC: SSP公式仕様書(さくらスクリプト、SHIORIイベント、設定ファイル仕様、プロトコル規格)
|
|
18
|
+
- YAYA Wiki: YAYA SHIORIの文法、組み込み関数、実践Tips
|
|
19
|
+
- 里々Wiki: 里々SHIORIの構文、変数、関数、独自イベント、Tips
|
|
20
|
+
|
|
21
|
+
推奨ワークフロー:
|
|
22
|
+
1. list_categories でカテゴリ一覧を確認
|
|
23
|
+
2. search_docs でキーワード検索(要約を返す)
|
|
24
|
+
3. 詳細が必要なエントリは get_doc(id) で全文を取得
|
|
25
|
+
|
|
26
|
+
注意事項:
|
|
27
|
+
- ビルド時点のドキュメントスナップショットを検索します
|
|
28
|
+
- さくらスクリプトのタグ検索: \\s0 のように入力(バックスラッシュはそのまま)`;
|
|
29
|
+
export function createMcpServer(engine) {
|
|
30
|
+
const server = new McpServer({ name: 'ukagaka-doc-mcp', version: '0.1.0' }, { instructions: SERVER_INSTRUCTIONS });
|
|
31
|
+
registerSearchDocsTool(server, engine);
|
|
32
|
+
registerGetDocTool(server, engine);
|
|
33
|
+
registerListCategoriesTool(server);
|
|
34
|
+
return server;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;4CAegB,CAAC;AAE7C,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC7C,EAAE,YAAY,EAAE,mBAAmB,EAAE,CACtC,CAAC;IAEF,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/text.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAqB,GAAG,MAAM,CAMpF"}
|
package/dist/text.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SUMMARY_MAX_LENGTH } from './constants.js';
|
|
2
|
+
export function buildSummary(content, maxLength = SUMMARY_MAX_LENGTH) {
|
|
3
|
+
if (content.length <= maxLength) {
|
|
4
|
+
return content;
|
|
5
|
+
}
|
|
6
|
+
return `${content.slice(0, maxLength)}...`;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=text.js.map
|
package/dist/text.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,SAAS,GAAG,kBAAkB;IAC1E,IAAI,OAAO,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-doc.d.ts","sourceRoot":"","sources":["../../src/tools/get-doc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAmChF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerGetDocTool(server, engine) {
|
|
3
|
+
server.tool('get_doc', 'search_docs で得た id を指定して、ドキュメントの全文を取得する。', {
|
|
4
|
+
id: z.string().describe('canonical_id(例: "yaya:マニュアル/関数/REPLACE", "satori:特殊記号一覧", "ukadoc:list_sakura_script:tag_s")'),
|
|
5
|
+
}, async ({ id }) => {
|
|
6
|
+
const entry = engine.getById(id);
|
|
7
|
+
if (!entry) {
|
|
8
|
+
return {
|
|
9
|
+
content: [{
|
|
10
|
+
type: 'text',
|
|
11
|
+
text: JSON.stringify({
|
|
12
|
+
status: 'not_found',
|
|
13
|
+
message: `id "${id}" のドキュメントが見つかりませんでした。search_docs で正しい id を確認してください。`,
|
|
14
|
+
}),
|
|
15
|
+
}],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
content: [{
|
|
20
|
+
type: 'text',
|
|
21
|
+
text: JSON.stringify({
|
|
22
|
+
status: 'ok',
|
|
23
|
+
data: entry,
|
|
24
|
+
}, null, 2),
|
|
25
|
+
}],
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=get-doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-doc.js","sourceRoot":"","sources":["../../src/tools/get-doc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAoB;IACxE,MAAM,CAAC,IAAI,CACT,SAAS,EACT,0CAA0C,EAC1C;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACrB,8FAA8F,CAC/F;KACF,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,WAAW;4BACnB,OAAO,EAAE,OAAO,EAAE,qDAAqD;yBACxE,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,MAAM,EAAE,IAAI;wBACZ,IAAI,EAAE,KAAK;qBACZ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-categories.d.ts","sourceRoot":"","sources":["../../src/tools/list-categories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuBlE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CATEGORIES } from '../constants.js';
|
|
2
|
+
const CATEGORY_KEYS = Object.keys(CATEGORIES);
|
|
3
|
+
export function registerListCategoriesTool(server) {
|
|
4
|
+
server.tool('list_categories', '検索に使えるカテゴリ一覧を返す。search_docs の category パラメータに使用する。', {}, async () => {
|
|
5
|
+
const categories = CATEGORY_KEYS.map(id => ({
|
|
6
|
+
id,
|
|
7
|
+
source: CATEGORIES[id].source,
|
|
8
|
+
label: CATEGORIES[id].label,
|
|
9
|
+
}));
|
|
10
|
+
return {
|
|
11
|
+
content: [{
|
|
12
|
+
type: 'text',
|
|
13
|
+
text: JSON.stringify({
|
|
14
|
+
status: 'ok',
|
|
15
|
+
data: categories,
|
|
16
|
+
}, null, 2),
|
|
17
|
+
}],
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=list-categories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-categories.js","sourceRoot":"","sources":["../../src/tools/list-categories.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAe,CAAC;AAE5D,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,oDAAoD,EACpD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1C,EAAE;YACF,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM;YAC7B,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,KAAK;SAC5B,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,MAAM,EAAE,IAAI;wBACZ,IAAI,EAAE,UAAU;qBACjB,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|