ukagaka-doc-mcp 0.2.11 → 0.3.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 +20 -1
- package/SPEC.md +1 -1
- package/dist/bootstrap.d.ts +9 -0
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +7 -1
- package/dist/bootstrap.js.map +1 -1
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +56 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -1
- package/dist/http-server.d.ts +24 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +70 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index-updater.d.ts +45 -0
- package/dist/index-updater.d.ts.map +1 -0
- package/dist/index-updater.js +117 -0
- package/dist/index-updater.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
伺か(Ukagaka)の技術ドキュメントを検索する MCP サーバーです。
|
|
4
4
|
|
|
5
|
-
UKADOC・YAYA Wiki・里々Wiki・蒼空 Wiki
|
|
5
|
+
UKADOC・YAYA Wiki・里々Wiki・蒼空 Wiki のスナップショットを同梱しており、stdio モード(デフォルト)では**ランタイムで外部ネットワークにアクセスしません**。
|
|
6
6
|
|
|
7
7
|
## 使い方
|
|
8
8
|
|
|
@@ -48,6 +48,25 @@ ukagaka-doc-mcp
|
|
|
48
48
|
}
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
+
## HTTP モード
|
|
52
|
+
|
|
53
|
+
`--http` を付けると Streamable HTTP の MCP サーバーとして起動します(ステートレス・認証なし)。
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npx ukagaka-doc-mcp --http # http://127.0.0.1:8951/mcp
|
|
57
|
+
npx ukagaka-doc-mcp --http --host 0.0.0.0 --port 9000 # listen 先を変更
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
| オプション | 説明 | デフォルト |
|
|
61
|
+
|------------|------|------------|
|
|
62
|
+
| `--http` | HTTP モードで起動 | (なし=stdio) |
|
|
63
|
+
| `--host <host>` | listen するホスト | `127.0.0.1` |
|
|
64
|
+
| `--port <port>` | listen するポート | `8951` |
|
|
65
|
+
|
|
66
|
+
- エンドポイントは `POST /mcp` のみです。
|
|
67
|
+
- `Host` / `Origin` ヘッダの検証は行いません。外部に公開する場合は nginx 等のリバースプロキシの背後に置いてください。
|
|
68
|
+
- 起動直後と 24 時間ごとに [GitHub 上の最新 `data/index.json`](https://github.com/finelagusaz/ukagaka-doc-mcp/raw/refs/heads/main/data/index.json) を取得し、同梱版より新しければメモリ上で差し替えます(ファイルには書き込みません)。取得に失敗した場合は現在のインデックスのまま動作を続けます。
|
|
69
|
+
|
|
51
70
|
## 提供ツール
|
|
52
71
|
|
|
53
72
|
| ツール | 説明 |
|
package/SPEC.md
CHANGED
package/dist/bootstrap.d.ts
CHANGED
|
@@ -9,9 +9,18 @@
|
|
|
9
9
|
import { SearchEngine } from './search/engine.js';
|
|
10
10
|
export declare function resolveDefaultIndexPath(): string;
|
|
11
11
|
export declare function getFreshnessWarning(generatedAt: string, now?: number): string | null;
|
|
12
|
+
export interface LoadedSearchEngine {
|
|
13
|
+
engine: SearchEngine;
|
|
14
|
+
/** ロードしたインデックスの generatedAt */
|
|
15
|
+
generatedAt: string;
|
|
16
|
+
}
|
|
12
17
|
/**
|
|
13
18
|
* data/index.json を読み込み、SearchEngine を初期化して返す。
|
|
14
19
|
* index.json が存在しない場合は Error を throw する。
|
|
15
20
|
*/
|
|
16
21
|
export declare function initializeSearchEngine(indexPath?: string): SearchEngine;
|
|
22
|
+
/**
|
|
23
|
+
* initializeSearchEngine と同じだが、ロードしたインデックスの generatedAt も返す。
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadSearchEngine(indexPath?: string): LoadedSearchEngine;
|
|
17
26
|
//# sourceMappingURL=bootstrap.d.ts.map
|
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,wBAAgB,uBAAuB,IAAI,MAAM,CAGhD;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,GAAG,IAAI,CAYxF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,SAA4B,GAAG,YAAY,CA6B1F"}
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,wBAAgB,uBAAuB,IAAI,MAAM,CAGhD;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,GAAG,IAAI,CAYxF;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,SAA4B,GAAG,YAAY,CAE1F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,SAA4B,GAAG,kBAAkB,CA6B1F"}
|
package/dist/bootstrap.js
CHANGED
|
@@ -35,6 +35,12 @@ export function getFreshnessWarning(generatedAt, now = Date.now()) {
|
|
|
35
35
|
* index.json が存在しない場合は Error を throw する。
|
|
36
36
|
*/
|
|
37
37
|
export function initializeSearchEngine(indexPath = resolveDefaultIndexPath()) {
|
|
38
|
+
return loadSearchEngine(indexPath).engine;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* initializeSearchEngine と同じだが、ロードしたインデックスの generatedAt も返す。
|
|
42
|
+
*/
|
|
43
|
+
export function loadSearchEngine(indexPath = resolveDefaultIndexPath()) {
|
|
38
44
|
if (!existsSync(indexPath)) {
|
|
39
45
|
throw new Error(`Index file not found: ${indexPath}\n` +
|
|
40
46
|
`Run: npm run build:index`);
|
|
@@ -52,6 +58,6 @@ export function initializeSearchEngine(indexPath = resolveDefaultIndexPath()) {
|
|
|
52
58
|
const engine = new SearchEngine();
|
|
53
59
|
engine.load(indexFile.entries);
|
|
54
60
|
console.error(`[bootstrap] Loaded ${engine.size} entries from index (built: ${indexFile.generatedAt})`);
|
|
55
|
-
return engine;
|
|
61
|
+
return { engine, generatedAt: indexFile.generatedAt };
|
|
56
62
|
}
|
|
57
63
|
//# sourceMappingURL=bootstrap.js.map
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,UAAU,uBAAuB;IACrC,6CAA6C;IAC7C,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACvE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACpE,IAAI,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,8CAA8C,IAAI,yDAAyD,CAAC;IACrH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,UAAU,uBAAuB;IACrC,6CAA6C;IAC7C,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACvE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACpE,IAAI,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,8CAA8C,IAAI,yDAAyD,CAAC;IACrH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAS,GAAG,uBAAuB,EAAE;IAC1E,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAS,GAAG,uBAAuB,EAAE;IAEpE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,yBAAyB,SAAS,IAAI;YACtC,0BAA0B,CAC3B,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAE/D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,eAAe;IACf,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACpE,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,KAAK,CACX,sBAAsB,MAAM,CAAC,IAAI,+BAA+B,SAAS,CAAC,WAAW,GAAG,CACzF,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC;AACxD,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* コマンドライン引数の解釈
|
|
3
|
+
*
|
|
4
|
+
* - 引数なし: stdio モード(従来どおり)
|
|
5
|
+
* - --http: Streamable HTTP モード(--host / --port で listen 先を変更可)
|
|
6
|
+
*/
|
|
7
|
+
export type CliOptions = {
|
|
8
|
+
mode: 'stdio';
|
|
9
|
+
} | {
|
|
10
|
+
mode: 'http';
|
|
11
|
+
host: string;
|
|
12
|
+
port: number;
|
|
13
|
+
} | {
|
|
14
|
+
mode: 'help';
|
|
15
|
+
};
|
|
16
|
+
export declare const USAGE = "Usage: ukagaka-doc-mcp [options]\n\nOptions:\n --http Start as a Streamable HTTP MCP server (stateless, no auth)\n --host <host> Host to listen on in HTTP mode (default: 127.0.0.1)\n --port <port> Port to listen on in HTTP mode (default: 8951)\n -h, --help Show this help\n\nWithout --http, the server communicates over stdio.";
|
|
17
|
+
export declare function parseCliArgs(argv: string[]): CliOptions;
|
|
18
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,eAAO,MAAM,KAAK,iWASkC,CAAC;AAErD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAyCvD"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* コマンドライン引数の解釈
|
|
3
|
+
*
|
|
4
|
+
* - 引数なし: stdio モード(従来どおり)
|
|
5
|
+
* - --http: Streamable HTTP モード(--host / --port で listen 先を変更可)
|
|
6
|
+
*/
|
|
7
|
+
import { parseArgs } from 'node:util';
|
|
8
|
+
import { DEFAULT_HTTP_HOST, DEFAULT_HTTP_PORT } from './constants.js';
|
|
9
|
+
export const USAGE = `\
|
|
10
|
+
Usage: ukagaka-doc-mcp [options]
|
|
11
|
+
|
|
12
|
+
Options:
|
|
13
|
+
--http Start as a Streamable HTTP MCP server (stateless, no auth)
|
|
14
|
+
--host <host> Host to listen on in HTTP mode (default: ${DEFAULT_HTTP_HOST})
|
|
15
|
+
--port <port> Port to listen on in HTTP mode (default: ${DEFAULT_HTTP_PORT})
|
|
16
|
+
-h, --help Show this help
|
|
17
|
+
|
|
18
|
+
Without --http, the server communicates over stdio.`;
|
|
19
|
+
export function parseCliArgs(argv) {
|
|
20
|
+
const { values } = parseArgs({
|
|
21
|
+
args: argv,
|
|
22
|
+
options: {
|
|
23
|
+
http: { type: 'boolean', default: false },
|
|
24
|
+
host: { type: 'string' },
|
|
25
|
+
port: { type: 'string' },
|
|
26
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
27
|
+
},
|
|
28
|
+
strict: true,
|
|
29
|
+
allowPositionals: false,
|
|
30
|
+
});
|
|
31
|
+
if (values.help) {
|
|
32
|
+
return { mode: 'help' };
|
|
33
|
+
}
|
|
34
|
+
if (!values.http) {
|
|
35
|
+
if (values.host !== undefined || values.port !== undefined) {
|
|
36
|
+
throw new Error('--host / --port require --http');
|
|
37
|
+
}
|
|
38
|
+
return { mode: 'stdio' };
|
|
39
|
+
}
|
|
40
|
+
const host = values.host ?? DEFAULT_HTTP_HOST;
|
|
41
|
+
if (host.length === 0) {
|
|
42
|
+
throw new Error('--host must not be empty');
|
|
43
|
+
}
|
|
44
|
+
let port = DEFAULT_HTTP_PORT;
|
|
45
|
+
if (values.port !== undefined) {
|
|
46
|
+
if (!/^\d+$/.test(values.port)) {
|
|
47
|
+
throw new Error(`Invalid --port: ${values.port}`);
|
|
48
|
+
}
|
|
49
|
+
port = Number(values.port);
|
|
50
|
+
if (port < 0 || port > 65535) {
|
|
51
|
+
throw new Error(`Invalid --port: ${values.port}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { mode: 'http', host, port };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAOtE,MAAM,CAAC,MAAM,KAAK,GAAG;;;;;6DAKwC,iBAAiB;6DACjB,iBAAiB;;;oDAG1B,CAAC;AAErD,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;YACzC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;SACtD;QACD,MAAM,EAAE,IAAI;QACZ,gBAAgB,EAAE,KAAK;KACxB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,iBAAiB,CAAC;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,IAAI,GAAG,iBAAiB,CAAC;IAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -3,6 +3,16 @@ import type { Source } from './types.js';
|
|
|
3
3
|
export declare const SOURCE_VALUES: readonly ['ukadoc', 'yaya_wiki', 'satori_wiki', 'aosora_wiki'];
|
|
4
4
|
/** インデックスが stale とみなされるまでの日数 */
|
|
5
5
|
export declare const STALE_AFTER_DAYS = 7;
|
|
6
|
+
/** HTTP モードのデフォルト listen ホスト */
|
|
7
|
+
export declare const DEFAULT_HTTP_HOST = "127.0.0.1";
|
|
8
|
+
/** HTTP モードのデフォルト listen ポート */
|
|
9
|
+
export declare const DEFAULT_HTTP_PORT = 8951;
|
|
10
|
+
/** HTTP モードでインデックスを取得する URL */
|
|
11
|
+
export declare const REMOTE_INDEX_URL = "https://github.com/finelagusaz/ukagaka-doc-mcp/raw/refs/heads/main/data/index.json";
|
|
12
|
+
/** HTTP モードでのインデックス更新間隔 (ms) */
|
|
13
|
+
export declare const INDEX_UPDATE_INTERVAL_MS: number;
|
|
14
|
+
/** インデックス取得のタイムアウト (ms) */
|
|
15
|
+
export declare const INDEX_FETCH_TIMEOUT_MS: number;
|
|
6
16
|
/** インデックスファイルの現在のスキーマバージョン */
|
|
7
17
|
export declare const INDEX_SCHEMA_VERSION = 1;
|
|
8
18
|
/** search_docs で返す summary の最大文字数 */
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,6DAA6D;AAC7D,eAAO,MAAM,aAAa,YAAI,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,CAAU,CAAC;AAE5F,gCAAgC;AAChC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,8BAA8B;AAC9B,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,qCAAqC;AACrC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,2BAA2B;AAC3B,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAQxC,eAAO,MAAM,UAAU;aAErB,YAAY;iBACV,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,YAAY;;aAErB,YAAY;iBACV,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,cAAc;;aAEvB,QAAQ;iBACN,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,yCAAyC;;aAElD,QAAQ;iBACN,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,6BAA6B;;aAEtC,cAAc;iBACZ,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,iBAAiB;;aAE1B,SAAS;iBACP,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,uBAAuB;;aAIhC,YAAY;iBACV,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,UAAU;;aAEnB,UAAU;iBACR,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,sBAAsB;;aAE/B,aAAa;iBACX,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,YAAY;;aAErB,WAAW;iBACT,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,YAAY;;aAErB,SAAS;iBACP,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,cAAc;;aAEvB,YAAY;iBACV,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,qBAAqB;;aAI9B,gBAAgB;iBACd,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,0BAA0B;;aAEnC,YAAY;iBACV,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,UAAU;;aAEnB,WAAW;iBACT,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,YAAY;;aAErB,YAAY;iBACV,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,YAAY;;aAIrB,cAAc;iBACZ,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,wBAAwB;;aAEjC,cAAc;iBACZ,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,kBAAkB;;aAE3B,eAAe;iBACb,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,wBAAwB;;aAEjC,cAAc;iBACZ,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,gCAAgC;;CAEjC,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,6DAA6D;AAC7D,eAAO,MAAM,aAAa,YAAI,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,CAAU,CAAC;AAE5F,gCAAgC;AAChC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,gCAAgC;AAChC,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAE7C,gCAAgC;AAChC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC,+BAA+B;AAC/B,eAAO,MAAM,gBAAgB,uFACyD,CAAC;AAEvF,gCAAgC;AAChC,eAAO,MAAM,wBAAwB,QAAsB,CAAC;AAE5D,2BAA2B;AAC3B,eAAO,MAAM,sBAAsB,QAAY,CAAC;AAEhD,8BAA8B;AAC9B,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,qCAAqC;AACrC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,2BAA2B;AAC3B,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAQxC,eAAO,MAAM,UAAU;aAErB,YAAY;iBACV,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,YAAY;;aAErB,YAAY;iBACV,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,cAAc;;aAEvB,QAAQ;iBACN,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,yCAAyC;;aAElD,QAAQ;iBACN,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,6BAA6B;;aAEtC,cAAc;iBACZ,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,iBAAiB;;aAE1B,SAAS;iBACP,MAAM,EAAc,MAAM;iBAC1B,KAAK,EAAE,uBAAuB;;aAIhC,YAAY;iBACV,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,UAAU;;aAEnB,UAAU;iBACR,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,sBAAsB;;aAE/B,aAAa;iBACX,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,YAAY;;aAErB,WAAW;iBACT,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,YAAY;;aAErB,SAAS;iBACP,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,cAAc;;aAEvB,YAAY;iBACV,MAAM,EAAiB,MAAM;iBAC7B,KAAK,EAAE,qBAAqB;;aAI9B,gBAAgB;iBACd,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,0BAA0B;;aAEnC,YAAY;iBACV,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,UAAU;;aAEnB,WAAW;iBACT,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,YAAY;;aAErB,YAAY;iBACV,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,YAAY;;aAIrB,cAAc;iBACZ,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,wBAAwB;;aAEjC,cAAc;iBACZ,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,kBAAkB;;aAE3B,eAAe;iBACb,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,wBAAwB;;aAEjC,cAAc;iBACZ,MAAM,EAAmB,MAAM;iBAC/B,KAAK,EAAE,gCAAgC;;CAEjC,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,UAAU,CAAC"}
|
package/dist/constants.js
CHANGED
|
@@ -5,6 +5,16 @@
|
|
|
5
5
|
export const SOURCE_VALUES = ['ukadoc', 'yaya_wiki', 'satori_wiki', 'aosora_wiki'];
|
|
6
6
|
/** インデックスが stale とみなされるまでの日数 */
|
|
7
7
|
export const STALE_AFTER_DAYS = 7;
|
|
8
|
+
/** HTTP モードのデフォルト listen ホスト */
|
|
9
|
+
export const DEFAULT_HTTP_HOST = '127.0.0.1';
|
|
10
|
+
/** HTTP モードのデフォルト listen ポート */
|
|
11
|
+
export const DEFAULT_HTTP_PORT = 8951;
|
|
12
|
+
/** HTTP モードでインデックスを取得する URL */
|
|
13
|
+
export const REMOTE_INDEX_URL = 'https://github.com/finelagusaz/ukagaka-doc-mcp/raw/refs/heads/main/data/index.json';
|
|
14
|
+
/** HTTP モードでのインデックス更新間隔 (ms) */
|
|
15
|
+
export const INDEX_UPDATE_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
16
|
+
/** インデックス取得のタイムアウト (ms) */
|
|
17
|
+
export const INDEX_FETCH_TIMEOUT_MS = 60 * 1000;
|
|
8
18
|
/** インデックスファイルの現在のスキーマバージョン */
|
|
9
19
|
export const INDEX_SCHEMA_VERSION = 1;
|
|
10
20
|
/** search_docs で返す summary の最大文字数 */
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,cAAc;AACd,+DAA+D;AAI/D,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,CAAU,CAAC;AAE5F,gCAAgC;AAChC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,8BAA8B;AAC9B,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,qCAAqC;AACrC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAEtC,2BAA2B;AAC3B,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAExC,+DAA+D;AAC/D,SAAS;AACT,sBAAsB;AACtB,2BAA2B;AAC3B,+DAA+D;AAE/D,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,iBAAiB;IACjB,YAAY,EAAE;QACZ,MAAM,EAAE,QAAkB;QAC1B,KAAK,EAAE,YAAY;KACpB;IACD,YAAY,EAAE;QACZ,MAAM,EAAE,QAAkB;QAC1B,KAAK,EAAE,cAAc;KACtB;IACD,QAAQ,EAAE;QACR,MAAM,EAAE,QAAkB;QAC1B,KAAK,EAAE,yCAAyC;KACjD;IACD,QAAQ,EAAE;QACR,MAAM,EAAE,QAAkB;QAC1B,KAAK,EAAE,6BAA6B;KACrC;IACD,cAAc,EAAE;QACd,MAAM,EAAE,QAAkB;QAC1B,KAAK,EAAE,iBAAiB;KACzB;IACD,SAAS,EAAE;QACT,MAAM,EAAE,QAAkB;QAC1B,KAAK,EAAE,uBAAuB;KAC/B;IAED,oBAAoB;IACpB,YAAY,EAAE;QACZ,MAAM,EAAE,WAAqB;QAC7B,KAAK,EAAE,UAAU;KAClB;IACD,UAAU,EAAE;QACV,MAAM,EAAE,WAAqB;QAC7B,KAAK,EAAE,sBAAsB;KAC9B;IACD,aAAa,EAAE;QACb,MAAM,EAAE,WAAqB;QAC7B,KAAK,EAAE,YAAY;KACpB;IACD,WAAW,EAAE;QACX,MAAM,EAAE,WAAqB;QAC7B,KAAK,EAAE,YAAY;KACpB;IACD,SAAS,EAAE;QACT,MAAM,EAAE,WAAqB;QAC7B,KAAK,EAAE,cAAc;KACtB;IACD,YAAY,EAAE;QACZ,MAAM,EAAE,WAAqB;QAC7B,KAAK,EAAE,qBAAqB;KAC7B;IAED,iBAAiB;IACjB,gBAAgB,EAAE;QAChB,MAAM,EAAE,aAAuB;QAC/B,KAAK,EAAE,0BAA0B;KAClC;IACD,YAAY,EAAE;QACZ,MAAM,EAAE,aAAuB;QAC/B,KAAK,EAAE,UAAU;KAClB;IACD,WAAW,EAAE;QACX,MAAM,EAAE,aAAuB;QAC/B,KAAK,EAAE,YAAY;KACpB;IACD,YAAY,EAAE;QACZ,MAAM,EAAE,aAAuB;QAC/B,KAAK,EAAE,YAAY;KACpB;IAED,2BAA2B;IAC3B,cAAc,EAAE;QACd,MAAM,EAAE,aAAuB;QAC/B,KAAK,EAAE,wBAAwB;KAChC;IACD,cAAc,EAAE;QACd,MAAM,EAAE,aAAuB;QAC/B,KAAK,EAAE,kBAAkB;KAC1B;IACD,eAAe,EAAE;QACf,MAAM,EAAE,aAAuB;QAC/B,KAAK,EAAE,wBAAwB;KAChC;IACD,cAAc,EAAE;QACd,MAAM,EAAE,aAAuB;QAC/B,KAAK,EAAE,gCAAgC;KACxC;CACO,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* http-server.ts
|
|
3
|
+
*
|
|
4
|
+
* Streamable HTTP トランスポートで MCP サーバーを公開する(ステートレス・認証なし)。
|
|
5
|
+
* リクエストごとに McpServer とトランスポートを生成し、SearchEngine は共有する。
|
|
6
|
+
* Host / Origin 検証は行わない(リバースプロキシの背後で使う前提)。
|
|
7
|
+
*
|
|
8
|
+
* エンドポイント: POST /mcp
|
|
9
|
+
*/
|
|
10
|
+
import { type Server } from 'node:http';
|
|
11
|
+
import type { AddressInfo } from 'node:net';
|
|
12
|
+
import type { SearchEngine } from './search/engine.js';
|
|
13
|
+
export declare const MCP_ENDPOINT_PATH = "/mcp";
|
|
14
|
+
export interface HttpServerOptions {
|
|
15
|
+
host: string;
|
|
16
|
+
port: number;
|
|
17
|
+
}
|
|
18
|
+
export interface RunningHttpServer {
|
|
19
|
+
server: Server;
|
|
20
|
+
address: AddressInfo;
|
|
21
|
+
close(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export declare function startHttpServer(engine: SearchEngine, options: HttpServerOptions): Promise<RunningHttpServer>;
|
|
24
|
+
//# sourceMappingURL=http-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AACjG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,eAAO,MAAM,iBAAiB,SAAS,CAAC;AAExC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,iBAAiB,CAAC,CA2B5B"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* http-server.ts
|
|
3
|
+
*
|
|
4
|
+
* Streamable HTTP トランスポートで MCP サーバーを公開する(ステートレス・認証なし)。
|
|
5
|
+
* リクエストごとに McpServer とトランスポートを生成し、SearchEngine は共有する。
|
|
6
|
+
* Host / Origin 検証は行わない(リバースプロキシの背後で使う前提)。
|
|
7
|
+
*
|
|
8
|
+
* エンドポイント: POST /mcp
|
|
9
|
+
*/
|
|
10
|
+
import { createServer } from 'node:http';
|
|
11
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
12
|
+
import { createMcpServer } from './server.js';
|
|
13
|
+
export const MCP_ENDPOINT_PATH = '/mcp';
|
|
14
|
+
export function startHttpServer(engine, options) {
|
|
15
|
+
const httpServer = createServer((req, res) => {
|
|
16
|
+
handleRequest(engine, req, res).catch(error => {
|
|
17
|
+
console.error('[http] Error handling request:', error);
|
|
18
|
+
if (!res.headersSent) {
|
|
19
|
+
sendJsonRpcError(res, 500, -32603, 'Internal server error');
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
res.end();
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
27
|
+
httpServer.once('error', rejectPromise);
|
|
28
|
+
httpServer.listen(options.port, options.host, () => {
|
|
29
|
+
httpServer.off('error', rejectPromise);
|
|
30
|
+
const address = httpServer.address();
|
|
31
|
+
resolvePromise({
|
|
32
|
+
server: httpServer,
|
|
33
|
+
address,
|
|
34
|
+
close: () => new Promise((resolveClose, rejectClose) => {
|
|
35
|
+
httpServer.close(err => (err ? rejectClose(err) : resolveClose()));
|
|
36
|
+
httpServer.closeAllConnections();
|
|
37
|
+
}),
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async function handleRequest(engine, req, res) {
|
|
43
|
+
const pathname = new URL(req.url ?? '/', 'http://localhost').pathname;
|
|
44
|
+
if (pathname !== MCP_ENDPOINT_PATH) {
|
|
45
|
+
sendJsonRpcError(res, 404, -32000, 'Not found');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// ステートレスモードではセッション用の GET (SSE) / DELETE は提供しない
|
|
49
|
+
if (req.method !== 'POST') {
|
|
50
|
+
res.setHeader('Allow', 'POST');
|
|
51
|
+
sendJsonRpcError(res, 405, -32000, 'Method not allowed');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const server = createMcpServer(engine);
|
|
55
|
+
const transport = new StreamableHTTPServerTransport({
|
|
56
|
+
sessionIdGenerator: undefined,
|
|
57
|
+
enableJsonResponse: true,
|
|
58
|
+
});
|
|
59
|
+
res.on('close', () => {
|
|
60
|
+
void transport.close();
|
|
61
|
+
void server.close();
|
|
62
|
+
});
|
|
63
|
+
await server.connect(transport);
|
|
64
|
+
await transport.handleRequest(req, res);
|
|
65
|
+
}
|
|
66
|
+
function sendJsonRpcError(res, status, code, message) {
|
|
67
|
+
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
68
|
+
res.end(JSON.stringify({ jsonrpc: '2.0', error: { code, message }, id: null }));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=http-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* index-updater.ts
|
|
3
|
+
*
|
|
4
|
+
* HTTP モード用のインデックス自動更新:
|
|
5
|
+
* 1. リモートの index.json を取得(ETag による条件付き GET)
|
|
6
|
+
* 2. スキーマ検証
|
|
7
|
+
* 3. generatedAt が現在より新しければ SearchEngine に再ロード
|
|
8
|
+
*
|
|
9
|
+
* 取得したインデックスはメモリ上でのみ差し替え、ファイルには書き込まない
|
|
10
|
+
* (npm グローバルインストール等で書き込み権限がない環境でも動作させるため)。
|
|
11
|
+
*/
|
|
12
|
+
import type { SearchEngine } from './search/engine.js';
|
|
13
|
+
export type UpdateResult = 'updated' | 'not-modified' | 'not-newer' | 'failed' | 'skipped';
|
|
14
|
+
export interface IndexUpdaterOptions {
|
|
15
|
+
engine: SearchEngine;
|
|
16
|
+
url: string;
|
|
17
|
+
/** 現在ロード済みのインデックスの generatedAt */
|
|
18
|
+
generatedAt: string;
|
|
19
|
+
fetchFn?: typeof fetch;
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare class IndexUpdater {
|
|
23
|
+
private readonly engine;
|
|
24
|
+
private readonly url;
|
|
25
|
+
private readonly fetchFn;
|
|
26
|
+
private readonly timeoutMs;
|
|
27
|
+
private generatedAt;
|
|
28
|
+
private etag;
|
|
29
|
+
private running;
|
|
30
|
+
private timer;
|
|
31
|
+
constructor(options: IndexUpdaterOptions);
|
|
32
|
+
get currentGeneratedAt(): string;
|
|
33
|
+
/**
|
|
34
|
+
* リモートを確認し、新しいインデックスがあれば再ロードする。
|
|
35
|
+
* 失敗しても throw せず、現在のインデックスで動作を継続する。
|
|
36
|
+
*/
|
|
37
|
+
update(): Promise<UpdateResult>;
|
|
38
|
+
/**
|
|
39
|
+
* 即時に1回更新し、以後 intervalMs ごとに更新する。
|
|
40
|
+
*/
|
|
41
|
+
start(intervalMs: number): void;
|
|
42
|
+
stop(): void;
|
|
43
|
+
private doUpdate;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=index-updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-updater.d.ts","sourceRoot":"","sources":["../src/index-updater.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,cAAc,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE3F,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAA6B;IAE1C,YAAY,OAAO,EAAE,mBAAmB,EAMvC;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAepC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAK9B;IAED,IAAI,IAAI,IAAI,CAKX;YAEa,QAAQ;CAgDvB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* index-updater.ts
|
|
3
|
+
*
|
|
4
|
+
* HTTP モード用のインデックス自動更新:
|
|
5
|
+
* 1. リモートの index.json を取得(ETag による条件付き GET)
|
|
6
|
+
* 2. スキーマ検証
|
|
7
|
+
* 3. generatedAt が現在より新しければ SearchEngine に再ロード
|
|
8
|
+
*
|
|
9
|
+
* 取得したインデックスはメモリ上でのみ差し替え、ファイルには書き込まない
|
|
10
|
+
* (npm グローバルインストール等で書き込み権限がない環境でも動作させるため)。
|
|
11
|
+
*/
|
|
12
|
+
import { getFreshnessWarning } from './bootstrap.js';
|
|
13
|
+
import { INDEX_FETCH_TIMEOUT_MS } from './constants.js';
|
|
14
|
+
import { parseAndValidateIndexFile } from './index-validation.js';
|
|
15
|
+
export class IndexUpdater {
|
|
16
|
+
engine;
|
|
17
|
+
url;
|
|
18
|
+
fetchFn;
|
|
19
|
+
timeoutMs;
|
|
20
|
+
generatedAt;
|
|
21
|
+
etag;
|
|
22
|
+
running = false;
|
|
23
|
+
timer;
|
|
24
|
+
constructor(options) {
|
|
25
|
+
this.engine = options.engine;
|
|
26
|
+
this.url = options.url;
|
|
27
|
+
this.generatedAt = options.generatedAt;
|
|
28
|
+
this.fetchFn = options.fetchFn ?? fetch;
|
|
29
|
+
this.timeoutMs = options.timeoutMs ?? INDEX_FETCH_TIMEOUT_MS;
|
|
30
|
+
}
|
|
31
|
+
get currentGeneratedAt() {
|
|
32
|
+
return this.generatedAt;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* リモートを確認し、新しいインデックスがあれば再ロードする。
|
|
36
|
+
* 失敗しても throw せず、現在のインデックスで動作を継続する。
|
|
37
|
+
*/
|
|
38
|
+
async update() {
|
|
39
|
+
if (this.running) {
|
|
40
|
+
return 'skipped';
|
|
41
|
+
}
|
|
42
|
+
this.running = true;
|
|
43
|
+
try {
|
|
44
|
+
return await this.doUpdate();
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error(`[index-updater] Update failed, keeping current index: ${error instanceof Error ? error.message : error}`);
|
|
48
|
+
return 'failed';
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
this.running = false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 即時に1回更新し、以後 intervalMs ごとに更新する。
|
|
56
|
+
*/
|
|
57
|
+
start(intervalMs) {
|
|
58
|
+
this.stop();
|
|
59
|
+
void this.update();
|
|
60
|
+
this.timer = setInterval(() => void this.update(), intervalMs);
|
|
61
|
+
this.timer.unref();
|
|
62
|
+
}
|
|
63
|
+
stop() {
|
|
64
|
+
if (this.timer) {
|
|
65
|
+
clearInterval(this.timer);
|
|
66
|
+
this.timer = undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async doUpdate() {
|
|
70
|
+
const headers = {};
|
|
71
|
+
if (this.etag) {
|
|
72
|
+
headers['If-None-Match'] = this.etag;
|
|
73
|
+
}
|
|
74
|
+
const response = await this.fetchFn(this.url, {
|
|
75
|
+
headers,
|
|
76
|
+
signal: AbortSignal.timeout(this.timeoutMs),
|
|
77
|
+
});
|
|
78
|
+
if (response.status === 304) {
|
|
79
|
+
console.error('[index-updater] Index not modified');
|
|
80
|
+
return 'not-modified';
|
|
81
|
+
}
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
throw new Error(`HTTP ${response.status} ${response.statusText}`);
|
|
84
|
+
}
|
|
85
|
+
const raw = await response.text();
|
|
86
|
+
const { indexFile, warnings } = parseAndValidateIndexFile(raw);
|
|
87
|
+
for (const warning of warnings) {
|
|
88
|
+
console.error(warning);
|
|
89
|
+
}
|
|
90
|
+
// 検証まで通ったレスポンスの ETag だけ記憶する
|
|
91
|
+
this.etag = response.headers.get('etag') ?? undefined;
|
|
92
|
+
if (!isNewer(indexFile.generatedAt, this.generatedAt)) {
|
|
93
|
+
console.error(`[index-updater] Remote index is not newer (remote: ${indexFile.generatedAt}, current: ${this.generatedAt})`);
|
|
94
|
+
return 'not-newer';
|
|
95
|
+
}
|
|
96
|
+
this.engine.load(indexFile.entries);
|
|
97
|
+
this.generatedAt = indexFile.generatedAt;
|
|
98
|
+
console.error(`[index-updater] Reloaded ${this.engine.size} entries from ${this.url} (built: ${indexFile.generatedAt})`);
|
|
99
|
+
const freshnessWarning = getFreshnessWarning(indexFile.generatedAt);
|
|
100
|
+
if (freshnessWarning) {
|
|
101
|
+
console.error(freshnessWarning);
|
|
102
|
+
}
|
|
103
|
+
return 'updated';
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function isNewer(candidate, current) {
|
|
107
|
+
const candidateTime = new Date(candidate).getTime();
|
|
108
|
+
if (isNaN(candidateTime)) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
const currentTime = new Date(current).getTime();
|
|
112
|
+
if (isNaN(currentTime)) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
return candidateTime > currentTime;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=index-updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-updater.js","sourceRoot":"","sources":["../src/index-updater.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,10 +2,15 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* エントリポイント
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* stdio モード(デフォルト):
|
|
6
6
|
* 1. data/index.json をロード + freshness 判定
|
|
7
7
|
* 2. MCPサーバー作成
|
|
8
8
|
* 3. stdio トランスポートで接続
|
|
9
|
+
*
|
|
10
|
+
* HTTP モード(--http):
|
|
11
|
+
* 1. data/index.json をロード + freshness 判定
|
|
12
|
+
* 2. Streamable HTTP サーバーを listen(デフォルト 127.0.0.1:8951)
|
|
13
|
+
* 3. 起動直後と24時間ごとにリモートの index.json を確認し、新しければ再ロード
|
|
9
14
|
*/
|
|
10
15
|
export {};
|
|
11
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
|
package/dist/index.js
CHANGED
|
@@ -2,23 +2,50 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* エントリポイント
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* stdio モード(デフォルト):
|
|
6
6
|
* 1. data/index.json をロード + freshness 判定
|
|
7
7
|
* 2. MCPサーバー作成
|
|
8
8
|
* 3. stdio トランスポートで接続
|
|
9
|
+
*
|
|
10
|
+
* HTTP モード(--http):
|
|
11
|
+
* 1. data/index.json をロード + freshness 判定
|
|
12
|
+
* 2. Streamable HTTP サーバーを listen(デフォルト 127.0.0.1:8951)
|
|
13
|
+
* 3. 起動直後と24時間ごとにリモートの index.json を確認し、新しければ再ロード
|
|
9
14
|
*/
|
|
10
15
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
11
|
-
import {
|
|
16
|
+
import { loadSearchEngine } from './bootstrap.js';
|
|
17
|
+
import { parseCliArgs, USAGE } from './cli.js';
|
|
18
|
+
import { INDEX_UPDATE_INTERVAL_MS, REMOTE_INDEX_URL } from './constants.js';
|
|
19
|
+
import { MCP_ENDPOINT_PATH, startHttpServer } from './http-server.js';
|
|
20
|
+
import { IndexUpdater } from './index-updater.js';
|
|
12
21
|
import { createMcpServer } from './server.js';
|
|
13
22
|
async function main() {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
23
|
+
const options = parseCliArgs(process.argv.slice(2));
|
|
24
|
+
if (options.mode === 'help') {
|
|
25
|
+
console.log(USAGE);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// index ロード(失敗時は Error をthrowしてプロセス終了)
|
|
29
|
+
const { engine, generatedAt } = loadSearchEngine();
|
|
30
|
+
if (options.mode === 'stdio') {
|
|
31
|
+
const server = createMcpServer(engine);
|
|
32
|
+
const transport = new StdioServerTransport();
|
|
33
|
+
await server.connect(transport);
|
|
34
|
+
console.error('[ukagaka-doc-mcp] Server ready');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const running = await startHttpServer(engine, { host: options.host, port: options.port });
|
|
38
|
+
const { address, port } = running.address;
|
|
39
|
+
const displayHost = address.includes(':') ? `[${address}]` : address;
|
|
40
|
+
console.error(`[ukagaka-doc-mcp] HTTP server ready: http://${displayHost}:${port}${MCP_ENDPOINT_PATH}`);
|
|
41
|
+
const updater = new IndexUpdater({ engine, url: REMOTE_INDEX_URL, generatedAt });
|
|
42
|
+
updater.start(INDEX_UPDATE_INTERVAL_MS);
|
|
43
|
+
const shutdown = () => {
|
|
44
|
+
updater.stop();
|
|
45
|
+
running.close().finally(() => process.exit(0));
|
|
46
|
+
};
|
|
47
|
+
process.once('SIGINT', shutdown);
|
|
48
|
+
process.once('SIGTERM', shutdown);
|
|
22
49
|
}
|
|
23
50
|
main().catch(err => {
|
|
24
51
|
console.error('[ukagaka-doc-mcp] Fatal:', err instanceof Error ? err.message : err);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IAED,uCAAuC;IACvC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAEnD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1F,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;IACrE,OAAO,CAAC,KAAK,CAAC,+CAA+C,WAAW,IAAI,IAAI,GAAG,iBAAiB,EAAE,CAAC,CAAC;IAExG,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;IACjF,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAExC,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|