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.
Files changed (70) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +24 -0
  3. package/README.md +109 -0
  4. package/SPEC.md +356 -0
  5. package/data/index.json +22046 -0
  6. package/dist/bootstrap.d.ts +17 -0
  7. package/dist/bootstrap.d.ts.map +1 -0
  8. package/dist/bootstrap.js +57 -0
  9. package/dist/bootstrap.js.map +1 -0
  10. package/dist/build-index.d.ts +12 -0
  11. package/dist/build-index.d.ts.map +1 -0
  12. package/dist/build-index.js +51 -0
  13. package/dist/build-index.js.map +1 -0
  14. package/dist/constants.d.ts +77 -0
  15. package/dist/constants.d.ts.map +1 -0
  16. package/dist/constants.js +86 -0
  17. package/dist/constants.js.map +1 -0
  18. package/dist/index-builder.d.ts +5 -0
  19. package/dist/index-builder.d.ts.map +1 -0
  20. package/dist/index-builder.js +53 -0
  21. package/dist/index-builder.js.map +1 -0
  22. package/dist/index-validation.d.ts +9 -0
  23. package/dist/index-validation.d.ts.map +1 -0
  24. package/dist/index-validation.js +75 -0
  25. package/dist/index-validation.js.map +1 -0
  26. package/dist/index.d.ts +11 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +27 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/parser/satori-scraper.d.ts +35 -0
  31. package/dist/parser/satori-scraper.d.ts.map +1 -0
  32. package/dist/parser/satori-scraper.js +272 -0
  33. package/dist/parser/satori-scraper.js.map +1 -0
  34. package/dist/parser/ukadoc-parser.d.ts +21 -0
  35. package/dist/parser/ukadoc-parser.d.ts.map +1 -0
  36. package/dist/parser/ukadoc-parser.js +231 -0
  37. package/dist/parser/ukadoc-parser.js.map +1 -0
  38. package/dist/parser/yaya-scraper.d.ts +46 -0
  39. package/dist/parser/yaya-scraper.d.ts.map +1 -0
  40. package/dist/parser/yaya-scraper.js +308 -0
  41. package/dist/parser/yaya-scraper.js.map +1 -0
  42. package/dist/search/engine.d.ts +41 -0
  43. package/dist/search/engine.d.ts.map +1 -0
  44. package/dist/search/engine.js +114 -0
  45. package/dist/search/engine.js.map +1 -0
  46. package/dist/server.d.ts +12 -0
  47. package/dist/server.d.ts.map +1 -0
  48. package/dist/server.js +36 -0
  49. package/dist/server.js.map +1 -0
  50. package/dist/text.d.ts +2 -0
  51. package/dist/text.d.ts.map +1 -0
  52. package/dist/text.js +8 -0
  53. package/dist/text.js.map +1 -0
  54. package/dist/tools/get-doc.d.ts +4 -0
  55. package/dist/tools/get-doc.d.ts.map +1 -0
  56. package/dist/tools/get-doc.js +29 -0
  57. package/dist/tools/get-doc.js.map +1 -0
  58. package/dist/tools/list-categories.d.ts +3 -0
  59. package/dist/tools/list-categories.d.ts.map +1 -0
  60. package/dist/tools/list-categories.js +21 -0
  61. package/dist/tools/list-categories.js.map +1 -0
  62. package/dist/tools/search-docs.d.ts +4 -0
  63. package/dist/tools/search-docs.d.ts.map +1 -0
  64. package/dist/tools/search-docs.js +45 -0
  65. package/dist/tools/search-docs.js.map +1 -0
  66. package/dist/types.d.ts +59 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +5 -0
  69. package/dist/types.js.map +1 -0
  70. package/package.json +64 -0
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { SearchEngine } from '../search/engine.js';
3
+ export declare function registerSearchDocsTool(server: McpServer, engine: SearchEngine): void;
4
+ //# sourceMappingURL=search-docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-docs.d.ts","sourceRoot":"","sources":["../../src/tools/search-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOxD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA8CpF"}
@@ -0,0 +1,45 @@
1
+ import { z } from 'zod';
2
+ import { CATEGORIES } from '../constants.js';
3
+ const SOURCE_VALUES = ['ukadoc', 'yaya_wiki', 'satori_wiki'];
4
+ const CATEGORY_KEYS = Object.keys(CATEGORIES);
5
+ export function registerSearchDocsTool(server, engine) {
6
+ server.tool('search_docs', '伺か・YAYA・里々の技術ドキュメントをキーワード検索する。要約(500文字)を返す。詳細は get_doc で取得。', {
7
+ query: z.string().min(1).describe('検索キーワード'),
8
+ category: z.enum(CATEGORY_KEYS).optional()
9
+ .describe('カテゴリで絞り込み(list_categories で確認可能)'),
10
+ source: z.enum(SOURCE_VALUES).optional()
11
+ .describe('ソースで絞り込み: ukadoc / yaya_wiki / satori_wiki'),
12
+ limit: z.number().int().min(1).max(50).default(10)
13
+ .describe('返却件数の上限(デフォルト10、最大50)'),
14
+ }, async ({ query, category, source, limit }) => {
15
+ const { results, total } = engine.search(query, {
16
+ category: category,
17
+ source: source,
18
+ limit,
19
+ });
20
+ if (results.length === 0) {
21
+ return {
22
+ content: [{
23
+ type: 'text',
24
+ text: JSON.stringify({
25
+ status: 'not_found',
26
+ message: `「${query}」に一致するドキュメントが見つかりませんでした。`,
27
+ total: 0,
28
+ }),
29
+ }],
30
+ };
31
+ }
32
+ return {
33
+ content: [{
34
+ type: 'text',
35
+ text: JSON.stringify({
36
+ status: 'ok',
37
+ total,
38
+ showing: results.length,
39
+ data: results,
40
+ }, null, 2),
41
+ }],
42
+ };
43
+ });
44
+ }
45
+ //# sourceMappingURL=search-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../src/tools/search-docs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,CAAU,CAAC;AACtE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAe,CAAC;AAE5D,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAoB;IAC5E,MAAM,CAAC,IAAI,CACT,aAAa,EACb,6DAA6D,EAC7D;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC5C,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,aAA0C,CAAC,CAAC,QAAQ,EAAE;aACpE,QAAQ,CAAC,kCAAkC,CAAC;QAC/C,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;aACrC,QAAQ,CAAC,4CAA4C,CAAC;QACzD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;aAC/C,QAAQ,CAAC,uBAAuB,CAAC;KACrC,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3C,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;YAC9C,QAAQ,EAAE,QAAgC;YAC1C,MAAM,EAAE,MAA4B;YACpC,KAAK;SACN,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,WAAW;4BACnB,OAAO,EAAE,IAAI,KAAK,0BAA0B;4BAC5C,KAAK,EAAE,CAAC;yBACT,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,KAAK;wBACL,OAAO,EAAE,OAAO,CAAC,MAAM;wBACvB,IAAI,EAAE,OAAO;qBACd,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,59 @@
1
+ import type { CATEGORIES } from './constants.js';
2
+ export type Source = 'ukadoc' | 'yaya_wiki' | 'satori_wiki';
3
+ export type Category = keyof typeof CATEGORIES;
4
+ /**
5
+ * ドキュメントエントリ(全文を含む)。
6
+ * index.json に保存される形式。
7
+ */
8
+ export interface DocEntry {
9
+ /** canonical_id
10
+ * - ukadoc: `ukadoc:{filename}:{section_anchor}`
11
+ * - yaya_wiki: `yaya:{page_path}` (URLデコード済み日本語パス)
12
+ * - satori_wiki: `satori:{page_name}` (URLデコード済み)
13
+ */
14
+ id: string;
15
+ title: string;
16
+ source: Source;
17
+ category: Category;
18
+ /** 本文全文(truncationなし) */
19
+ content: string;
20
+ /** 元ページURL */
21
+ url: string;
22
+ }
23
+ /**
24
+ * 検索結果エントリ(search_docs が返す形式)。
25
+ * content の先頭500文字を summary として返すことでトークン消費を抑える。
26
+ */
27
+ export interface SearchEntry {
28
+ id: string;
29
+ title: string;
30
+ source: Source;
31
+ category: Category;
32
+ /** content 先頭500文字 */
33
+ summary: string;
34
+ url: string;
35
+ }
36
+ export interface IndexFile {
37
+ /** スキーマバージョン。互換性チェック用 */
38
+ version: number;
39
+ /** ビルド日時 (ISO 8601) */
40
+ generatedAt: string;
41
+ entries: DocEntry[];
42
+ }
43
+ export interface SearchResult {
44
+ status: 'ok' | 'not_found' | 'error';
45
+ data?: SearchEntry[];
46
+ total?: number;
47
+ message?: string;
48
+ }
49
+ export interface GetDocResult {
50
+ status: 'ok' | 'not_found' | 'error';
51
+ data?: DocEntry;
52
+ message?: string;
53
+ }
54
+ export interface CategoryInfo {
55
+ id: Category;
56
+ source: Source;
57
+ label: string;
58
+ }
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,CAAC;AAG5D,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAC;AAM/C;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAMD,MAAM,WAAW,SAAS;IACxB,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAMD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC;IACrC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC;IACrC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,QAAQ,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ // ============================================================
2
+ // 共通型定義
3
+ // ============================================================
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,QAAQ;AACR,+DAA+D"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "ukagaka-doc-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for searching Ukagaka (伺か) technical documentation: UKADOC, YAYA Wiki, and 里々Wiki",
5
+ "keywords": [
6
+ "mcp",
7
+ "ukagaka",
8
+ "ssp",
9
+ "yaya",
10
+ "satori",
11
+ "documentation",
12
+ "search"
13
+ ],
14
+ "license": "MIT",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/finelagusaz/ukagaka-doc-mcp.git"
18
+ },
19
+ "homepage": "https://github.com/finelagusaz/ukagaka-doc-mcp#readme",
20
+ "bugs": {
21
+ "url": "https://github.com/finelagusaz/ukagaka-doc-mcp/issues"
22
+ },
23
+ "type": "module",
24
+ "main": "dist/index.js",
25
+ "exports": {
26
+ ".": "./dist/index.js"
27
+ },
28
+ "bin": {
29
+ "ukagaka-doc-mcp": "dist/index.js"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "data/index.json",
34
+ "LICENSE",
35
+ "NOTICE.md",
36
+ "README.md",
37
+ "SPEC.md"
38
+ ],
39
+ "scripts": {
40
+ "build": "tsc",
41
+ "build:index": "tsx src/build-index.ts",
42
+ "dev": "tsx src/index.ts",
43
+ "refresh:index": "git submodule sync --recursive && git submodule update --init --remote docs/ukadoc && npm run build:index",
44
+ "start": "node dist/index.js",
45
+ "prepack": "npm run build",
46
+ "prepublishOnly": "npm test",
47
+ "test": "vitest run",
48
+ "test:watch": "vitest"
49
+ },
50
+ "dependencies": {
51
+ "@modelcontextprotocol/sdk": "^1.10.0",
52
+ "cheerio": "^1.0.0",
53
+ "zod": "^3.24.0"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^22.0.0",
57
+ "tsx": "^4.19.0",
58
+ "typescript": "^5.7.0",
59
+ "vitest": "^3.0.0"
60
+ },
61
+ "engines": {
62
+ "node": ">=20.0.0"
63
+ }
64
+ }