s1000d-reader-mcp
s1000d-reader-mcp は、データモジュールとパブリケーションモジュールを LLM が構造として読むための MCP サーバーです。見出しの階層、番号付きの手順、警告・注意・注記、図(ICN)、表、参照先の題名を保ったまま返し、どの製品に当てはまるか(適用性)はサーバーが判定して結果だけを渡します。すべての応答に「どこまで検証済みか」(verification)が付きます。6 つのツールを持ちます。
| ツール | 内容 |
|---|---|
list_data_modules |
CSDB の中のデータモジュール(指定すれば PM・DML・DDN・IMF・UPF も)を、DMC・題名・版・言語・スキーマ名・適用性の表示文付きで一覧にします。モデル識別コード・システムコード・情報コード・スキーマ名・題名の文字で絞れます |
read_data_module |
データモジュール 1 件を構造で読みます。識別・状態部、本文の木、参照(題名付き)、検証状態。product を渡すとブロックごとに applicable / notApplicable / undetermined を付けます |
read_publication_module |
パブリケーションモジュールを目次として読みます。pmEntry の木と、各 dmRef / pmRef の解決先(ファイル・題名・版) |
resolve_reference |
DMC・PMC・ICN を CSDB のファイルに解決します。ICN は参照元の DOCTYPE 宣言(ファイル名と NOTATION)も返します |
describe_applicability |
適用性の語彙を返します。ACT の製品属性、CCT の条件、PCT の製品、文書の applic 文(id と表示文)、PCT が値を割り当てていない属性。ここでは何も判定しません |
read_icn_metadata |
ICN メタデータファイル(IMF)を読みます。ICN・版・題名・キーワード・機密区分と、状態部の項目の一覧 |
内容部の XML はそのまま返さず、データモジュールの種類ごとの読み取り部分が共通の形(節点の木)に揃えます。
flowchart LR D["descript<br/>説明"] --> T P["proced<br/>手順"] --> T PR["process<br/>プロセス(分岐)"] --> T F["fault<br/>故障探求"] --> T PM["pm<br/>目次"] --> T["共通の形<br/>section / para / list / table / figure / admonition<br/>step(番号 1、1.1)/ requirements / sequence / if / dialog / entry"] O["それ以外の種類"] --> U["structured: false<br/>識別・状態部だけ"]
- 手順には
1、1.1のような番号を組み立てて付けます。 - 段落の中の参照は
[→ DMC 題名]の形で文に埋め込み、refsにも集めます。参照先の題名は CSDB から読みます。LLM が DMC だけを見て中身を推測しないためです。 - 要件(
preliminaryRqmts/closeRqmts)は「conditions: … / persons: … / support equipment: …」の 1 文に要約します。 - 故障探求の問いと答えは
questionとchoices(答えごとの次の手順の id)にします。 - 読み取り部分が知らない要素は捨てず、
kind: "unknown"として文だけを残し、content.unknownElementsに名前と数を返します。読み取り部分を広げる材料になります。Issue 7 の Bike Samples では、descriptとpmに未知の要素は無く、procedの未知は回路遮断器(circuitBreaker…)の群だけです。
適用性と検証状態
Section titled “適用性と検証状態”product を渡さないときは、適用性はすべて undetermined で、displayText(人が読む適用範囲の文)だけを返します。assert の式はどんなときも返しません。適用性の仕組み(ACT・CCT・PCT、式の評価)は 適用性のページに書いています。
3 値の読み方
Section titled “3 値の読み方”| 状態 | 意味 | LLM の読み方 |
|---|---|---|
applicable |
渡した製品に当てはまる | そのまま使う |
notApplicable |
当てはまらない | 答えに混ぜない。omitNotApplicable で本文から省ける |
undetermined |
判定できない。reason に「製品に type の値が無い」「product が渡されていない」「適用性リポジトリに無い」などの理由 |
「当てはまらない」と読まない。足りない値を利用者に聞く |
and / or が確定した枝で足りなかった値は理由に含めません。
製品の値をどう決めるか
Section titled “製品の値をどう決めるか”describe_applicability が、対象データモジュールの ACT・CCT・PCT を CSDB から探して、使える属性と値、PCT に登録された製品、文書の中の applic 文の一覧を返します。LLM はこれを見て利用者に「どの機種ですか」と聞き、答えを product として read_data_module に渡します。
PCT に登録された製品をそのまま渡すこともできますが、PCT が値を割り当てていない属性があると、その属性を使う文は undetermined のままになります。describe_applicability はそのような属性を propertiesNotAssignedInPct として一覧にするので、不足分を補ってください。
別のデータモジュールにある適用性文
Section titled “別のデータモジュールにある適用性文”referencedApplicGroupRef/applicRef が applicIdentValue で指す applic 文は、S1000D_CSDB_DIR の中から applic/@applicIdentValue を持つデータモジュール(適用性リポジトリ)を集めて解決します。見つからなければ「リポジトリに無い」理由で undetermined になります。
検証は既定で XSD だけを行います(verify: "schema")。verify: "full" で BREX の連鎖への照合と参照の解決も行い、verify: "none" で省きます。省いた工程は not-run、XSD が見つからなければ schema-not-found と明記され、どちらも valid ではありません。XSD に違反した文書は要素の位置が仕様と違う可能性があるため、本文の読み取りも疑ってください。
flowchart LR Q["LLM の問い"] --> L["list_data_modules<br/>題名・版・スキーマ名で一覧"] L --> DA["describe_applicability<br/>属性と値、PCT の製品"] DA --> RD["read_data_module(product 付き)<br/>本文の木 + 判定 + verification"] RD --> RR["resolve_reference<br/>DMC・PMC・ICN → ファイル"] PM["read_publication_module<br/>目次"] --> RD
できないこと
Section titled “できないこと”- 要約・翻訳はしません。 要約に要る材料(見出し、手順の番号、警告の種類、参照先)を落とさずに返すのが仕事です。
- S1000D への準拠は判定しません。 XSD・BREX の違反の中身は
s1000d-verify-mcp、BREX のルールの説明はs1000d-brex-mcpで読んでください。 - 本文を構造化しているのは
descript/proced/process/fault/pmの 5 種です。他の種類はcontent.structured: falseで、識別・状態部だけを返します。
| 環境変数 | 内容 |
|---|---|
S1000D_SPEC_DIR |
S1000D の配布物を展開したフォルダー。XSD と既定 BREX をこの下から探します |
S1000D_CSDB_DIR |
プロジェクトのデータモジュールが置かれたフォルダー。:(Windows は ;)区切りで複数指定できます。DMC での読み取り、参照先、ACT・CCT・PCT、適用性リポジトリをここから探します |
{ "mcpServers": { "s1000d-reader": { "command": "npx", "args": ["-y", "@shuji-bonji/s1000d-reader-mcp"], "env": { "S1000D_SPEC_DIR": "/path/to/s1000d/issue-7", "S1000D_CSDB_DIR": "/path/to/project/csdb" } } }}read_data_module の手順 1 件は次の形です(Bike Samples の手順データモジュールを、PCT の製品に type を補って読んだもの)。
{ "kind": "step", "element": "proceduralStep", "number": "1", "text": "Open the light circuit breaker located on the handlebar", "applicRefId": "app-0001", "applicability": { "state": "applicable", "displayText": "Mountain storm Mk1", "applicId": "app-0001" }, "children": []}