@shuji-bonji/rfcxml-mcp 0.6.13 → 0.6.53

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 (67) hide show
  1. package/README.ja.md +178 -50
  2. package/README.md +181 -51
  3. package/dist/cli/prefetch.d.ts +6 -1
  4. package/dist/cli/prefetch.d.ts.map +1 -1
  5. package/dist/cli/prefetch.js +53 -23
  6. package/dist/cli/prefetch.js.map +1 -1
  7. package/dist/config.d.ts +0 -2
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +3 -2
  10. package/dist/config.js.map +1 -1
  11. package/dist/constants.d.ts +16 -0
  12. package/dist/constants.d.ts.map +1 -1
  13. package/dist/constants.js +80 -7
  14. package/dist/constants.js.map +1 -1
  15. package/dist/services/checklist-generator.d.ts.map +1 -1
  16. package/dist/services/checklist-generator.js +72 -7
  17. package/dist/services/checklist-generator.js.map +1 -1
  18. package/dist/services/rfc-fetcher.d.ts +19 -1
  19. package/dist/services/rfc-fetcher.d.ts.map +1 -1
  20. package/dist/services/rfc-fetcher.js +116 -19
  21. package/dist/services/rfc-fetcher.js.map +1 -1
  22. package/dist/services/rfc-service.d.ts +11 -1
  23. package/dist/services/rfc-service.d.ts.map +1 -1
  24. package/dist/services/rfc-service.js +45 -5
  25. package/dist/services/rfc-service.js.map +1 -1
  26. package/dist/services/rfc-text-parser.d.ts.map +1 -1
  27. package/dist/services/rfc-text-parser.js +1594 -88
  28. package/dist/services/rfc-text-parser.js.map +1 -1
  29. package/dist/services/rfcxml-parser.d.ts.map +1 -1
  30. package/dist/services/rfcxml-parser.js +366 -98
  31. package/dist/services/rfcxml-parser.js.map +1 -1
  32. package/dist/tools/definitions.d.ts +8 -0
  33. package/dist/tools/definitions.d.ts.map +1 -1
  34. package/dist/tools/definitions.js +17 -1
  35. package/dist/tools/definitions.js.map +1 -1
  36. package/dist/tools/handlers.d.ts +24 -12
  37. package/dist/tools/handlers.d.ts.map +1 -1
  38. package/dist/tools/handlers.js +161 -36
  39. package/dist/tools/handlers.js.map +1 -1
  40. package/dist/types/index.d.ts +22 -2
  41. package/dist/types/index.d.ts.map +1 -1
  42. package/dist/utils/cache.d.ts +19 -0
  43. package/dist/utils/cache.d.ts.map +1 -1
  44. package/dist/utils/cache.js +32 -0
  45. package/dist/utils/cache.js.map +1 -1
  46. package/dist/utils/disk-cache.d.ts +10 -6
  47. package/dist/utils/disk-cache.d.ts.map +1 -1
  48. package/dist/utils/disk-cache.js +13 -9
  49. package/dist/utils/disk-cache.js.map +1 -1
  50. package/dist/utils/logger.d.ts.map +1 -1
  51. package/dist/utils/logger.js +3 -1
  52. package/dist/utils/logger.js.map +1 -1
  53. package/dist/utils/requirement-extractor.d.ts.map +1 -1
  54. package/dist/utils/requirement-extractor.js +413 -21
  55. package/dist/utils/requirement-extractor.js.map +1 -1
  56. package/dist/utils/section.d.ts.map +1 -1
  57. package/dist/utils/section.js +11 -0
  58. package/dist/utils/section.js.map +1 -1
  59. package/dist/utils/statement-matcher.d.ts +69 -4
  60. package/dist/utils/statement-matcher.d.ts.map +1 -1
  61. package/dist/utils/statement-matcher.js +524 -48
  62. package/dist/utils/statement-matcher.js.map +1 -1
  63. package/dist/utils/text.d.ts +62 -0
  64. package/dist/utils/text.d.ts.map +1 -1
  65. package/dist/utils/text.js +273 -18
  66. package/dist/utils/text.js.map +1 -1
  67. package/package.json +5 -2
package/README.ja.md CHANGED
@@ -56,6 +56,33 @@ MCP 設定ファイルに以下を追加:
56
56
  }
57
57
  ```
58
58
 
59
+ 版を固定したいとき(0.6 系はパッチが頻繁に出る)は、パッケージ名に版を書く:
60
+
61
+ ```json
62
+ {
63
+ "mcpServers": {
64
+ "rfcxml": {
65
+ "command": "npx",
66
+ "args": ["-y", "@shuji-bonji/rfcxml-mcp@0.6.53"]
67
+ }
68
+ }
69
+ }
70
+ ```
71
+
72
+ 取得した RFC を再起動後も使い回すには `RFCXML_CACHE_DIR` を渡す([ディスクキャッシュと `rfcxml-prefetch`](#ディスクキャッシュと-rfcxml-prefetch) を参照):
73
+
74
+ ```json
75
+ {
76
+ "mcpServers": {
77
+ "rfcxml": {
78
+ "command": "npx",
79
+ "args": ["-y", "@shuji-bonji/rfcxml-mcp@0.6.53"],
80
+ "env": { "RFCXML_CACHE_DIR": "/home/you/.cache/rfcxml-mcp" }
81
+ }
82
+ }
83
+ }
84
+ ```
85
+
59
86
  設定ファイルの場所:
60
87
 
61
88
  - **Claude Desktop (macOS)**: `~/Library/Application Support/Claude/claude_desktop_config.json`
@@ -99,7 +126,7 @@ MCP 設定:
99
126
 
100
127
  ### Phase 3: 検証支援
101
128
 
102
- - `validate_statement` - 主張が RFC に準拠しているか検証
129
+ - `validate_statement` - 主張に関係する RFC の要件を探し、検出した矛盾を報告する。**適合判定ではない**。`isValid` は三値(`null` = 判断できるだけの一致が無い、`false` = 矛盾を検出した、`true` = 一致した要件の中に矛盾が無かった)。判断は利用者が下す。
103
130
  - `generate_checklist` - 実装チェックリスト生成
104
131
 
105
132
  ## 古い RFC のサポート
@@ -137,31 +164,38 @@ RFC 8650 (2019年12月) 以降は公式 RFCXML v3 形式で提供されていま
137
164
 
138
165
  ## 出力サンプル
139
166
 
167
+ 以下の見本はすべて、現行のビルド(`npm run build` のあと、MCP クライアントから各見出しのツール呼び出し)の実際の出力から切り出したもの。フィールド名と値はそのまま、長い配列は `...` で省いている。
168
+
140
169
  ### `get_rfc_structure` - RFC構造取得
141
170
 
171
+ `get_rfc_structure { "rfc": 9293 }`
172
+
142
173
  ```json
143
174
  {
144
175
  "metadata": {
145
176
  "title": "Transmission Control Protocol (TCP)",
146
177
  "docName": "draft-ietf-tcpm-rfc793bis-28",
147
- "number": 9293
178
+ "number": 9293,
179
+ "date": "2022-08",
180
+ "category": "std",
181
+ "stream": "IETF",
182
+ "abstract": "This document specifies the Transmission Control Protocol (TCP). ..."
148
183
  },
149
184
  "sections": [
185
+ { "number": "1", "title": "Purpose and Scope" },
186
+ { "number": "2", "title": "Introduction" },
150
187
  {
151
- "number": "section-1",
152
- "title": "Purpose and Scope"
153
- },
154
- {
155
- "number": "section-3",
188
+ "number": "3",
156
189
  "title": "Functional Specification",
157
190
  "subsections": [
158
- { "number": "section-3.1", "title": "Header Format" },
191
+ { "number": "3.1", "title": "Header Format" },
159
192
  {
160
- "number": "section-3.5",
193
+ "number": "3.5",
161
194
  "title": "Establishing a Connection",
162
195
  "subsections": [
163
- { "number": "section-3.5.1", "title": "Half-Open Connections and Other Anomalies" },
164
- { "number": "section-3.5.2", "title": "Reset Generation" }
196
+ { "number": "3.5.1", "title": "Half-Open Connections and Other Anomalies" },
197
+ { "number": "3.5.2", "title": "Reset Generation" },
198
+ { "number": "3.5.3", "title": "Reset Processing" }
165
199
  ]
166
200
  }
167
201
  ]
@@ -172,54 +206,75 @@ RFC 8650 (2019年12月) 以降は公式 RFCXML v3 形式で提供されていま
172
206
  }
173
207
  ```
174
208
 
209
+ `number` は RFC が印字する節番号(`3.5`、`A.2`)であり、RFCXML の `pn`(`section-3.5`)ではない。`category` / `stream` / `abstract` は IETF Datatracker API から取る。API に届かなかったとき、および対応表に無い値のとき(RFC 1 は `unkn` / `legacy`)は**省略**し、`_sourceNote` にその旨を書く。
210
+
175
211
  ### `get_requirements` - 規範性要件抽出
176
212
 
213
+ `get_requirements { "rfc": 9293, "level": "MUST" }`
214
+
177
215
  ```json
178
216
  {
179
217
  "rfc": 9293,
180
- "filter": { "level": "MUST" },
181
- "stats": { "total": 53, "byLevel": { "MUST": 53 } },
218
+ "filter": { "section": "all", "level": "MUST" },
219
+ "stats": { "total": 55, "byLevel": { "MUST": 55 } },
182
220
  "requirements": [
183
221
  {
184
- "id": "R-section-3.5-5",
222
+ "id": "R-3.5-1",
185
223
  "level": "MUST",
186
- "text": "A TCP implementation support simultaneous open attempts (MUST-10).",
187
- "section": "section-3.5",
188
- "sectionTitle": "Establishing a Connection"
224
+ "text": "A TCP implementation MUST support simultaneous open attempts (MUST-10).",
225
+ "section": "3.5",
226
+ "sectionTitle": "Establishing a Connection",
227
+ "fullContext": "A TCP implementation MUST support simultaneous open attempts (MUST-10).",
228
+ "subject": "tcp implementation",
229
+ "action": "support simultaneous open attempts (MUST-10)"
189
230
  },
190
231
  {
191
- "id": "R-section-3.7.1-9",
232
+ "id": "R-3.7.1-1",
192
233
  "level": "MUST",
193
- "text": "TCP endpoints implement both sending and receiving the MSS Option (MUST-14).",
194
- "section": "section-3.7.1",
195
- "sectionTitle": "Maximum Segment Size Option"
234
+ "text": "TCP endpoints MUST implement both sending and receiving the MSS Option (MUST-14).",
235
+ "section": "3.7.1",
236
+ "sectionTitle": "Maximum Segment Size Option",
237
+ "fullContext": "TCP endpoints MUST implement both sending and receiving the MSS Option (MUST-14).",
238
+ "subject": "tcp endpoints",
239
+ "action": "implement both sending and receiving the MSS Option (MUST-14)"
196
240
  }
197
241
  ],
198
242
  "_source": "xml"
199
243
  }
200
244
  ```
201
245
 
246
+ `id` は `R-<節>-<n>` で、`n` は節ごとの連番。他の節に要件が増えても識別子が変わらない。
247
+
202
248
  ### `get_rfc_dependencies` - 依存関係取得
203
249
 
250
+ `get_rfc_dependencies { "rfc": 9293 }`
251
+
204
252
  ```json
205
253
  {
206
254
  "rfc": 9293,
207
255
  "normative": [
208
256
  { "rfcNumber": 791, "title": "Internet Protocol", "anchor": "RFC0791" },
209
- { "rfcNumber": 2119, "title": "Key words for use in RFCs to Indicate Requirement Levels" },
210
- { "rfcNumber": 5681, "title": "TCP Congestion Control" }
257
+ { "rfcNumber": 1191, "title": "Path MTU discovery", "anchor": "RFC1191" },
258
+ {
259
+ "rfcNumber": 2119,
260
+ "title": "Key words for use in RFCs to Indicate Requirement Levels",
261
+ "anchor": "RFC2119"
262
+ }
211
263
  ],
212
264
  "informative": [
213
- { "rfcNumber": 793, "title": "Transmission Control Protocol" },
214
- { "rfcNumber": 1122, "title": "Requirements for Internet Hosts - Communication Layers" }
265
+ { "rfcNumber": 793, "title": "Transmission Control Protocol", "anchor": "RFC0793" },
266
+ { "rfcNumber": 896, "title": "Congestion Control in IP/TCP Internetworks", "anchor": "RFC0896" }
215
267
  ],
216
- "_source": "xml"
268
+ "_source": "xml",
269
+ "_referencesSource": "xml"
217
270
  }
218
271
  ```
219
272
 
273
+ `_referencesSource` は参照一覧の出どころ。`xml`(RFCXML の `<references>`)、`text`(テキストの References 節)、`api`(Datatracker の `relateddocument`。題名は仮置き)のいずれか。
274
+
220
275
  ### `generate_checklist` - 実装チェックリスト生成
221
276
 
222
- > **Note**: v0.4.0 以降、チェックリストは英語で出力されます。
277
+ `generate_checklist { "rfc": 9293, "role": "client", "sections": ["3.5", "3.7.1"] }` — `markdown` フィールド:
223
278
 
224
279
  ```markdown
225
280
  # RFC 9293 Implementation Checklist
@@ -228,34 +283,101 @@ RFC 8650 (2019年12月) 以降は公式 RFCXML v3 形式で提供されていま
228
283
 
229
284
  Role: client
230
285
 
286
+ Generated: 2026-09-04T17:09:37.833Z
287
+
231
288
  ## Mandatory Requirements (MUST / REQUIRED / SHALL)
232
289
 
233
- - [ ] A TCP implementation support simultaneous open attempts (MUST-10). (section-3.5)
234
- - [ ] TCP endpoints implement both sending and receiving the MSS Option (MUST-14). (section-3.7.1)
235
- - [ ] The RTO be computed according to the algorithm in, including Karn's algorithm (MUST-18). (section-3.8.1)
290
+ - [ ] **MUST** A TCP implementation MUST support simultaneous open attempts (MUST-10). (§3.5)
291
+ - [ ] **MUST** TCP endpoints MUST implement both sending and receiving the MSS Option (MUST-14). (§3.7.1)
292
+ - [ ] **MUST** If an MSS Option is not received at connection setup, TCP implementations MUST assume a default send MSS of 536 (576 - 40) for IPv4 or 1220 (1280 - 60) for IPv6 (MUST-15). (§3.7.1)
236
293
 
237
- ## Optional Requirements (MAY / OPTIONAL)
294
+ ## Recommended Requirements (SHOULD / RECOMMENDED)
238
295
 
239
- - [ ] Implementers include "keep-alives" in their TCP implementations (MAY-5). (section-3.8.4)
296
+ - [ ] **SHOULD** TCP implementations SHOULD allow a received RST segment to include data (SHLD-2). (§3.5.3)
240
297
  ```
241
298
 
299
+ 同じ呼び出しは `"stats": { "must": 6, "should": 2, "may": 1, "total": 9 }` も返す。
300
+
301
+ ### `validate_statement` - 関係する要件の検索
302
+
303
+ `validate_statement { "rfc": 6455, "statement": "The client MUST mask all frames sent to the server." }`
304
+
305
+ ```json
306
+ {
307
+ "rfc": 6455,
308
+ "statement": "The client MUST mask all frames sent to the server.",
309
+ "analysis": { "detectedLevel": "MUST", "detectedSubject": "client" },
310
+ "isValid": true,
311
+ "matchingRequirements": [
312
+ {
313
+ "id": "R-5.3-2",
314
+ "level": "MUST",
315
+ "text": "When preparing a masked frame, the client MUST pick a fresh masking key from the set of allowed 32-bit values.",
316
+ "section": "5.3",
317
+ "sectionTitle": "Client-to-Server Masking",
318
+ "_matchScore": 17,
319
+ "_matchedKeywords": ["client", "mask", "frames"],
320
+ "_subjectMatch": true,
321
+ "_levelMatch": true
322
+ }
323
+ ],
324
+ "conflicts": [],
325
+ "_source": "text",
326
+ "_sourceNote": "Warning: Parsed from text format. Validation accuracy may be limited."
327
+ }
328
+ ```
329
+
330
+ `isValid: true` は「一致した要件の中に矛盾が無かった」以上の意味を持たない。十分に強い一致が無ければ `isValid` は `null` になり、`_verdictNote` に理由が入る。
331
+
242
332
  ### テキストフォールバック時の出力(古いRFC)
243
333
 
334
+ `get_rfc_structure { "rfc": 6455 }` — RFC 6455 は RFCXML v3 より前なので、テキストを解析する:
335
+
244
336
  ```json
245
337
  {
246
338
  "metadata": {
247
339
  "title": "The WebSocket Protocol",
248
- "number": 6455
340
+ "number": 6455,
341
+ "date": "2011-12",
342
+ "category": "std",
343
+ "stream": "IETF",
344
+ "abstract": "The WebSocket Protocol enables two-way communication ..."
249
345
  },
250
346
  "sections": [
251
347
  { "number": "1", "title": "Introduction" },
348
+ { "number": "2", "title": "Conformance Requirements" },
252
349
  { "number": "5", "title": "Data Framing" }
253
350
  ],
351
+ "referenceCount": { "normative": 18, "informative": 9 },
254
352
  "_source": "text",
255
353
  "_sourceNote": "Warning: Parsed from text format. Accuracy may be limited."
256
354
  }
257
355
  ```
258
356
 
357
+ RFC 8650 以上はまず XML を試す。すべての取得元が 404 なら失敗する("No RFC with that number is published")。404 以外(5xx・タイムアウト)で XML が取れなかったときはテキストを使い、`_sourceNote` に「XML の取得に失敗した(一時的な失敗の可能性)」と書く。
358
+
359
+ ## ディスクキャッシュと `rfcxml-prefetch`
360
+
361
+ 既定では、取得した RFC はメモリの LRU にしか入らず、再起動のたびに取り直す。`RFCXML_CACHE_DIR` を設定するとディスクに残る:
362
+
363
+ ```
364
+ $RFCXML_CACHE_DIR/
365
+ ├── xml/rfc9293.xml # RFCXML(RFC 8650 以上)
366
+ └── text/rfc6455.txt # テキスト(それより前の RFC、または XML の取得に失敗したとき)
367
+ ```
368
+
369
+ 同じ配置をあらかじめ埋める CLI `rfcxml-prefetch` も同梱している(オフライン・CI 向け):
370
+
371
+ ```bash
372
+ # 範囲を $RFCXML_CACHE_DIR(未設定なら ~/.cache/rfcxml-mcp)へ取得
373
+ npx -y -p @shuji-bonji/rfcxml-mcp rfcxml-prefetch --range 9110-9114
374
+
375
+ # 個別の RFC、ディレクトリ指定、キャッシュ済みでも取り直す
376
+ npx -y -p @shuji-bonji/rfcxml-mcp rfcxml-prefetch --rfc 6455 --rfc 9293 --cache-dir ./rfc-cache --force
377
+ ```
378
+
379
+ オプション: `--range A-B`、`--rfc N`(繰り返し可)、`--cache-dir DIR`、`--concurrency N`(既定 3)、`--force`。ディスクにある RFC(XML でもテキストでも)は `--force` が無ければ飛ばす。RFC 番号は数字のみ。`--rfc 9110abc` は終了コード 1。
380
+
259
381
  ## サンプル
260
382
 
261
383
  [examples/](./examples/) ディレクトリに `generate_checklist` ツールで生成したチェックリストのサンプルがあります:
@@ -305,32 +427,34 @@ src/
305
427
 
306
428
  ### RFC 取得の最適化
307
429
 
308
- 複数ソース(RFC Editor、IETF Tools、Datatracker)に並列リクエストを送信し、最初に成功したレスポンスを採用:
430
+ XML の取得元 2 つ(RFC Editor、Datatracker)に並列リクエストを送信し、最初に成功したレスポンスを採用する。`tools.ietf.org` は 2021 年に廃止され、使っていない。リトライは無く、並列取得が唯一の冗長化である。
309
431
 
310
432
  ```
311
433
  ┌─────────────────┐
312
434
  │ fetchRFCXML() │
313
435
  └────────┬────────┘
314
436
  │ 並列リクエスト
315
- ┌────┴────┬────────────┐
316
-
317
- ┌────────┐ ┌────────┐ ┌────────┐
318
- │RFC │ │IETFData- │
319
- │Editor │ Tools │ │tracker │
320
- └────┬───┘ └────┬───┘ └────┬───┘
321
-
322
- └────┬─────┴──────────┘
323
- │ Promise.any(最初の成功)
324
-
437
+ ┌────┴─────────┐
438
+
439
+ ┌────────┐ ┌────────┐
440
+ │RFC │ │Data- │
441
+ │Editor │ │tracker │
442
+ └────┬───┘ └────┬───┘
443
+
444
+ └──────┬──────┘
445
+ │ Promise.any(最初の成功)
446
+
325
447
  ┌───────────┐
326
448
  │ 成功した │ → 他のリクエストを AbortController でキャンセル
327
449
  │ レスポンス│
328
450
  └───────────┘
329
451
  ```
330
452
 
453
+ 同じ RFC への同時呼び出し(`get_rfc_structure` と `get_requirements` を並列に出すなど)は、取得と解析を 1 本にまとめる。
454
+
331
455
  ### キャッシュ戦略
332
456
 
333
- LRU(Least Recently Used)キャッシュでメモリ使用量を制限:
457
+ LRU(Least Recently Used)キャッシュでメモリ使用量を制限する。XML / Text キャッシュの下に、任意のディスクキャッシュ(`RFCXML_CACHE_DIR`)がある:
334
458
 
335
459
  | キャッシュ | 最大エントリ数 | 内容 |
336
460
  | ------------------- | -------------- | -------------- |
@@ -351,15 +475,19 @@ npm run dev
351
475
  # ビルド
352
476
  npm run build
353
477
 
354
- # テスト(ウォッチモード)
478
+ # 単体テスト(単発実行)/ウォッチモード
355
479
  npm test
480
+ npm run test:watch
356
481
 
357
- # テスト(単発実行 CI 等で使用)
358
- npm test -- --run
359
-
360
- # E2E テスト(MCP クライアント統合)
482
+ # E2E テスト(MCP クライアント統合。実物の RFC を数本取りに行く)
361
483
  npm run test:e2e
362
484
 
485
+ # 実物の RFC への監査・ツール間の突き合わせ・出力見本
486
+ #(tests/audit/README.md を参照。.github/workflows/audit.yml が週次で回す)
487
+ npm run audit
488
+ npm run crosscheck
489
+ npm run snapshot
490
+
363
491
  # リント
364
492
  npm run lint
365
493