che-word-mcp について
che-word-mcpは、Microsoft Wordや外部ランタイムを必要とせず、OOXMLを直接操作するSwift製の.docx向けサーバーです。細かな文書編集に対応し、変更履歴の作成や未変更部分を保つ保存も行えます。
主な機能
- 01OOXML文書の直接編集
- 02Word操作用ツールを234種類提供
- 03変更履歴の挿入と書式設定
- 04表、スタイル、セクション、コンテンツコントロールの操作
- 05未変更部分を保つラウンドトリップ保存
- 06直接アクセスとセッションモード
活用シーン
- 01Microsoft Wordなしで文書を編集
- 02変更履歴の適用と確認
- 03表、ヘッダー、文書スタイルの変更
- 04DOCXパッケージの未変更部分を保持
MCP 対応
文書、表、スタイル、セクション、変更履歴などの操作をMCPツールとして公開します。クライアントは読み取り専用の直接アクセス、またはセッションを使った編集を行えます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
che-word-mcp
Microsoft Word 文書(.docx)を操作する、Swift ネイティブの MCP(Model Context Protocol)サーバーです。サードパーティ製の Word 依存関係を一切使わずに Office Open XML を直接操作する、初の Swift OOXML ライブラリです。
文書形式プロファイル(ソースコードからのビルドで利用可能、未リリース)
create_document、open_document、execute_script に、オプションの profile: "inherit" | "official" が追加されました。この機能には、未リリースの OOXMLSwift profile/store を SwiftPM editable dependency として統合する必要があります。ローカルでの最終受け入れテストには OOXMLSwift 3aa221aa3bba3657af68f1c8d22416d3efe9863e を使用しました。追跡中のリモート pin はこの修正を含んでいません。現在リリースされている binary では利用できず、今回 release バージョンは更新していません。
新しい macdoc と ~/.config/macdoc/config.json を共有します。新規作成では、明示的な profile → document.defaultProfile → inherit の順に適用します。既存文書のオープンと replay では、明示的な profile のみを適用します。新しい macdoc の config document import-official --template /path/to/Normal.dotm で安全なスナップショットをインポートしてから、config document set-default official で新規作成時のデフォルトを設定します。インポートによって本文がコピーされたり、Normal が変更されたり、デフォルトが自動で切り替わったりすることはありません。ソースに変更を加えても、保存済みのスナップショットには影響しません。
公式の繁体字中国語フォントは標楷体で、OOXML には DFKai-SB として書き込みます。core 992a3d67 で生成した DOCX は、Mac Word 16.112.3 と Windows Word 16.0.20326 で実際にエクスポートして検証済みです。どちらも A4 の 1 ページで、12 pt、左右 90 pt/上下 72 pt、段落後 8 pt となり、PDF には DFKaiShu-SB-Estd-BF と Aptos が実際に埋め込まれています。PNG に文字の欠落、切り取り、重なりはありません。最終 reader 修正の core 3aa221aa では、元の合成テストで固定した ID/時刻を使って再度ファイルを生成し、10 個すべての package parts が検証済みの入力とバイト単位で一致しました。この検証結果を引き継いでいるため、今回 Word での再実行はしていません。null、型の誤り、不明な名前、スナップショットの欠落/破損は明示的にエラーとなり、fallback はありません。形式の適用が成功してから session を登録します。既存の inherit は dirty として扱わず、autosave も発生しません。official は通常の変更と保存時の保護を引き続き適用します。execute_script は検証後、公開前に適用し、従来の overwrite と検証エラーの契約を維持します。
新規作成時の adapter は、最初のシリアライズ前に profile を適用します。inherit は、メモリ上で factory が生成したと証明できるデフォルトフォントのみを取り除き、呼び出し元が明示したフォントは保持します。provenance は OOXML にシリアライズされません。読み込んだ文書のフォントは元の文書に由来するものとみなし、style ID やフォント値の一致を根拠に削除することはありません。
テストでは WordMCPServer(documentConfigURL: temporaryConfigURL) を使って隔離された設定を注入できます。CLI の config document コマンドは --config を受け付け、convert/render は --document-config を受け付けます。共有 store への設定書き込みでは、AI/OCR と不明なフィールドを保持します。
機能
- 純粋な Swift 実装:Node.js、Python、外部ランタイムは不要です
- OOXML を直接操作:XML を直接扱うため、Microsoft Word のインストールは不要です
- 単一バイナリ:実行ファイルは 1 つだけです
- 234 個の MCP ツール:ドキュメント、表、ハイパーリンク、ヘッダー、セクション、スタイル、番号付け、コンテンツコントロール、コメント、脚注、数式、フィールド、変更履歴にわたる包括的なドキュメント操作に対応します
- Office.js OOXML ロードマップ P0 = 100%:8 件すべての P0 サブイシューがクローズしました(包括的なイシュー #43)。すべての P0 機能の読み取り/書き込みにおいて、Office.js と競合できるサーフェスカバレッジを実現しました。
- 往復処理におけるサイレント破損を解消(v3.13.5、#56):5 回のサブスタック完了ラウンド(R5 / R5-CONT / R5-CONT-2 / R5-CONT-3 / R5-CONT-4)で、6 つの AI による相互検証のラウンド 4~8 にわたり、30 件の指摘(P0 が 16 件、P1 が 21 件)を解消しました。
ooxml-swiftを v0.19.5 に更新しました(検証ゲートに基づき v0.19.4 は保留)。MCP ソースの変更はありません — 修正アーキテクチャはすべてooxml-swift内にあります。ラウンド 4 ではヘッダー/フッター/脚注/文末脚注間でのウォーカーの対称性を実現(accept_revision/reject_revision/get_hyperlinks/replace_textがすべてのパーツに到達)。ラウンド 5 ではコンテナごとのリレーションシップの往復処理に対応(update_hyperlinkの URL 同期が所有パーツの rels を対象にするよう修正)。ラウンド 6 ではdelete_hyperlinkのミラー処理とコンテナ<w:tbl>の取得を保持。ラウンド 7 ではreject_revisionの型付き clearMarker(ファイル/API の状態収束)に対応。ラウンド 8 ではaccept_revisionの型付き clearMarker(ミラー処理)に対応し、マトリックス固定の非対称性ガードを削除し、Document.repairContainerFileNamesがdocument.xml.relsと[Content_Types].xmlを変更済みとしてマークするよう修正しました。収束性については、Devil's Advocate が収束サイクルパターンを対象とする敵対的テストを 5 件作成し、すべて合格しました。完了サマリーと v3.13.5 リリースノートを参照してください。 - プログラムによる変更履歴の操作(v3.12.0+、#45):
insert_text_as_revision/delete_text_as_revision/move_text_as_revisionで Word ネイティブのレビュー可能な変更履歴を生成できるほか、format_text/set_paragraph_formatにas_revision: trueフラグを指定できます。<w:ins>/<w:del>/<w:moveFrom>/<w:moveTo>/<w:rPrChange>/<w:pPrChange>マークアップを出力します。副作用に関する契約:as_revision: trueを指定するには変更履歴が有効である必要があります。有効でない場合はtrack_changes_not_enabledをスローします(サイレントに自動有効化することはありません)。作成者の解決順序:明示的な引数 →revisions.settings.author→"Unknown"。 - 表/ハイパーリンク/ヘッダーの拡張(v3.11.0+、#49 #50 #51):16 個の新しいツール — 表の条件付きスタイル(領域タイプ 10 種)/入れ子の表(最大 5 階層)/明示的なレイアウト/表のインデント;3 種類の型付きハイパーリンク(URL/ブックマーク/メール);偶数/奇数ヘッダーの切り替え/前のセクションへのリンク/
get_section_header_map。 - スタイル+番号付け+セクションの基盤(v3.10.0+、#46 #47 #48):19 個の新しいツールと 6 個の拡張引数 —
get_style_inheritance_chain、link_styles、set_latent_styles、add_style_name_alias、番号付けの完全な CRUD ライフサイクル(定義/オーバーライド/リストの連続性/GC)、セクションの垂直方向の配置/ページ番号の形式/区切りタイプ/タイトルページの区別/セクションごとのヘッダー参照。 - コンテンツコントロール(SDT)の読み書き(v3.9.0+、#44):12 種類の識別(richText / plainText / picture / date / dropDownList / comboBox / checkBox / bibliography / citation / group / repeatingSection / repeatingSectionItem)に対応する 7 個の新しいツール。入れ子の SDT ツリー、決定論的な max+1 SDT ID アロケーター、削除時の
keep_contentによるラップ解除、ホワイトリストで検証される XML 置換に対応します。 - 保存の耐久性スタック(v3.5.3+):アトミックリネーム保存(#36)、アクター方式の並行処理安全性(#39)、オプトインのロールバック用
keep_bak(#38)、明示的なrecover_from_autosaveを備えた、変更前スナップショットを作成するautosave_everyの Design B(#37、#40 v3.7.0)。デフォルトはautosave_every: 1(変更のたびに直前の状態をスナップショットします)。無効にするにはautosave_every: 0を指定します。 - デュアルモードアクセス:ダイレクトモード(読み取り専用、
source_pathで 1 ステップ)とセッションモード(doc_idによる完全なライフサイクル) - バイト単位の保持を実現する真の往復処理忠実性(v3.5.0+):
save_documentのオーバーレイモードでは、WordDocument.modifiedPartsによる変更追跡を使用します。未変更の型付きパーツ(document.xml、styles.xml、fontTable.xml、header*.xml、footer*.xml、comments.xml、footnotes.xml、endnotes.xml)と未知のパーツ(theme/、webSettings.xml、people.xml、commentsExtended/Extensible/Ids、glossary/、customXml/)をバイト単位で保持します。ドキュメントを変更せずにsave_documentで往復処理すると、13 個の fontTable エントリー、6 種類の異なるヘッダー、4 つのフッター、3 セグメントの PAGE フィールド、<w15:presenceInfo>ID が保持されます。 - テーマ+ヘッダー/フッターの CRUD+透かしの読み書き(v3.3.0+、書き込み側 #208):
word/theme/theme1.xmlの編集、ヘッダー/フッターの列挙と削除、透かしの VML 検出(list_watermarks/get_watermark—PowerPlusWaterMarkObjectのテキストフィンガープリントと、Word 独自のWordPictureWatermarkの画像フィンガープリントの両方を認識、#209)、および実際の書き込み(insert_watermark/insert_image_watermark/remove_watermark— すべてのヘッダーパーツに VML<w:pict>図形を追加。画像の透かしを使用するには、既存の.docxから開いたドキュメントが必要です)。ドキュメントの中国語フォント修正方法:update_theme_fonts({ minor: { ea: "DFKai-SB" } })。 - コメントスレッド+ユーザー+注記の更新+Web 設定(v3.4.0+):共同作業コメントのメタデータ、
people.xmlの作成者レコード(GUID と旧形式の作成者を併用する二重 ID)、ID を保持する文末脚注/脚注のインプレース編集、webSettings.xmlの設定を行う 13 個のツール。 insert_equation向けの完全な LaTeX サブセット(v3.2.0+):latex-math-swiftに委譲されています。\frac、\sqrt、\hat/\bar/\tildeアクセント、\left/\right区切り記号、上下限付きの n 項演算子\sum/\int/\prod、関数名、極限、\text{}、\varepsilonの異形を含むすべてのギリシャ文字、一般的な演算子に対応します。- テキストアンカー挿入:一致したテキストの位置を基準にキャプション/画像を挿入します(
after_text/before_text)。事前の検索呼び出しは不要です。 - バッチ操作:
replace_text_batch/search_text_batchにより、N 回の往復処理を 1 回にまとめます。 - セッション状態 API:SHA256 と mtime に基づくディスク変更検出、
revert_to_disk/reload_from_disk/check_disk_drift - 構造の読み戻し:原稿レビューのワークフロー向けに
list_captions/list_equations/update_all_fields(F9 相当)を提供します。 - クロスプラットフォーム:macOS に対応します(v3.5.1 以降はユニバーサルバイナリ
x86_64 + arm64)
Version History
| バージョン | 日付 | 変更内容 |
|---|---|---|
| v4.0.0 | 2026-08-19 | execute_script の契約を修正(破壊的変更) — 検証失敗時はツールエラーを返すように変更(#180)。overwrite パラメーターを追加し、既存の output_path の上書きをデフォルトで拒否(#181)。上書きゲートを ooxml-swift の共通エントリーポイント scriptPipelineExecute に移し、両方のモードを構造的に保護。再構築結果は同じディレクトリ内の一時パスに書き込み、検証後に移動するよう変更したため、検証失敗で出力パスが破損しなくなりました。ooxml-swift 3.0.1 が必要です。5-lens 検証(Codex のレッグはクォータ不足のため未実行。記録済み)。 |
| v3.22.0 | 2026-07-18 | 自ら生成した docx を型付き DSL にアップグレード(closes-via-idd #173、PR #174)。ooxml-swift を 1.4.0 から 1.5.0 に更新(上流の ooxml-swift#85:transcoder-canonical による生成 — w14:paraId を付与し、要素間の空白をなくし、Word の正規形式に準拠したルートクラウドを使用)。MCP が生成した純粋な段落のみのドキュメントでは、export_script が document.xml を dsl チャネルで報告するようになりました(比率 1.0)。slots のアンカーは付与された paraId を使用します。ツールの説明にパート単位の境界を明記:リッチテーブル/paraId のないレガシーコンテンツがある場合、パート全体が raw に降格されます(ooxml-swift#86 の対応待ち)。利用側の回帰テスト Issue173SelfProducedDSLUpgradeTests(1.4.0 で RED、1.5.0 で GREEN)。6-AI 検証 PASS。 |
| v3.13.5 | 2026-04-27 | R5 スタックの完了( #56 のサイレント破損を解消)。ooxml-swift を v0.19.3 から v0.19.5 に更新(v0.19.4 は検証ゲートに従って保留)。5 つのサブスタック(R5 / R5-CONT / R5-CONT-2 / R5-CONT-3 / R5-CONT-4)と 6-AI クロス検証の第 4~8 ラウンドにわたり、30 件の指摘(P0 が 16 件、P1 が 21 件)を解消。第 4 ラウンド ヘッダー/フッター/脚注/文末脚注にまたがるウォーカーの対称性(accept_revision / reject_revision / get_hyperlinks / replace_text がすべてのパートに対応)。第 5 ラウンド コンテナーごとのリレーションシップの往復処理(update_hyperlink の URL 同期先を、所有パートの rels に変更)。第 6 ラウンド delete_hyperlink のミラー処理と、コンテナーの <w:tbl> キャプチャーを保持。第 7 ラウンド reject_revision の型付き clearMarker(ファイル/API の状態を収束)。第 8 ラウンド accept_revision の型付き clearMarker(ミラー処理)+matrix-pin の非対称性ガードの削除+repairContainerFileNames の rels-dirty 化。収束性:Devil's Advocate が収束サイクルのパターンを対象とする敵対的テストを 5 件作成し、すべて PASSED。che-word-mcp のソース変更はありません — 修正アーキテクチャ全体を ooxml-swift に実装。詳細は完了サマリーを参照してください。 |
| v3.13.4 | 2026-04-26 | (スキップ — 検証ゲートに従って保留)。R3 スタックの内容は v3.13.5 に統合されました。 |
| v3.13.3 | 2026-04-26 | ooxml-swift を v0.19.2 から v0.19.3 に更新。#56 の第 2 ラウンド検証で見つかった P0 8 件+必須修正 P1 3 件を解消(Hyperlink API パスの視覚スタイル復元/tgtFrame/docLocation Reader フィルター/順序付き子要素のソース順保持、sort-path の contentControls + commentIds/footnoteIds/endnoteIds/hasPageBreak の出力、非テキストのラッパー保持、ネストされたハイパーリンク/SDT/fieldSimple の往復処理、nextBookmarkId の調整、ブックマークのラップアラウンド復元)。ソース変更なし。 |
| v3.13.2 | 2026-04-26 | ooxml-swift を v0.19.1 から v0.19.2 に更新。#56 の第 1 ラウンド検証で見つかったブロッキング指摘 4 件を解消(F1 Hyperlink.toXML() が Reader で収集した runs/rawAttributes/rawChildren を出力、F2 add_bookmark/delete_bookmark が bookmarkMarkers を同期、F3 ins/del/moveFrom/moveTo の往復処理で位置+revisionId+wrapper を保持、F4 名前空間の保持対象を document.xml から header/footer/footnote/endnote に拡張)。ソース変更なし。 |
| v3.13.1 | 2026-04-25 | sort-by-position の往復処理で pPr が二重出力されるサイレント回帰をホットフィックス(ooxml-swift v0.19.1)。 |
| v3.13.0 | 2026-04-25 | document.xml のロスレス往復処理+ツール経由のラッパー編集(#56 の P0 を解消)。ハイブリッドモデルにより、名前空間マップ(34 xmlns)、ブックマーク、構造ラッパー(<w:hyperlink>/<w:fldSimple>/<mc:AlternateContent>)を保持します。 |
| v3.12.0 | 2026-04-25 | Track Changes のプログラム生成(#45 を解消) — 3 つの新しいツール(insert_text_as_revision/delete_text_as_revision/move_text_as_revision)+format_text/set_paragraph_format に as_revision フラグを追加。<w:ins>/<w:del>/<w:moveFrom>/<w:moveTo>/<w:rPrChange>/<w:pPrChange> マークアップを出力します。 |
| v3.11.0 | 2026-04-25 | テーブル/ハイパーリンク/ヘッダーの拡張(#49 #50 #51 を解消) — 16 個の新しいツール:テーブルの条件付きスタイル(10 種類の領域)/ネストされたテーブル(最大 5 階層)/明示的なレイアウト/テーブルのインデント、型付きハイパーリンク 3 種類(URL/ブックマーク/メール)、偶数/奇数ヘッダーの切り替え/前のセクションへのリンク/get_section_header_map。 |
| v3.10.0 | 2026-04-24 | スタイル+番号付け+セクションの基盤(#46 #47 #48 を解消) — 19 個の新しいツール+6 個の拡張引数。get_style_inheritance_chain、link_styles、set_latent_styles、add_style_name_alias、番号付けの完全な CRUD ライフサイクル、セクションの垂直配置/ページ番号形式/区切りの種類/タイトルページの分離/セクションごとのヘッダー参照に対応。 |
| v3.9.0 | 2026-04-24 | コンテンツコントロール(SDT)の読み書き(#44 を解消) — 7 個の新しいツール、12 種類の判別(richText/plainText/picture/date/dropDownList/comboBox/checkBox/bibliography/citation/group/repeatingSection/repeatingSectionItem)。ネストされた SDT ツリー、決定的な ID アロケーター、keep_content によるラップ解除、ホワイトリストで検証する XML 置換に対応。 |
| v3.8.0 | 2026-04-24 | ヘッダー/フッターの生要素保持+カウンター分離フラグ(#52 を解消)。 |
| v3.7.2 | 2026-04-24 | #42 の検証を受けた 3 件の課題をまとめて修正(#53、#54、#55 のパストラバーサル強化を解消)。 |
| v3.7.1 | 2026-04-24 | update_all_fields がヘッダー/フッターを削除しないよう修正(#42 を解消)。 |
| v3.7.0 | 2026-04-24 | 挿入時のクラッシュ対策+自動保存 Design B(#40、#41 を解消)。v3.6.0 では自動保存に Design A(変更後カウンター)を採用していましたが、K%N≠0 の場合、K 回目のクラッシュ時に K-1 回分の変更を保持できませんでした。v3.7.0 では Design B に切り替え(変更を行う各ハンドラーの開始時、変更の実行前にスナップショットを作成)。autosave_every のデフォルトを 0 から 1 に変更(変更のたびに直前の状態をスナップショット)。無効にするには autosave_every: 0 を渡します。実質的な破壊的変更:Design A の動作またはデフォルト無効に依存していた呼び出し元に影響します。また、#41 の調査に向けて Phase A の構造化ログゲート CHE_WORD_MCP_LOG_LEVEL=debug を追加。DocxReader.concurrentPerform を廃止し(recover_from_autosave に必要な解析の決定性を確保)、nextImageRelationshipId を rId アロケーターを使う形にリファクタリングした ooxml-swift 0.13.3 をベースにしています。v3.6.0 からの移行:autosave_every: 0 を明示的に渡すコードには影響しません。引数を省略していたコードには 1 が適用されます(安全性を最大化)。v3.6.0 のデフォルト無効の動作に戻すには、open_document の呼び出しに autosave_every: 0 を追加してください。 |
| v3.6.0 | 2026-04-23 | 自動保存+チェックポイント+recover_from_autosave(#37 を解消)。open_document に autosave_every: Int = 0 パラメーターを追加 — N > 0 の場合、N 回ごとの変更時に <source>.autosave.docx(別ファイル。ソースへの即時保存ではありません)へチェックポイントを書き込みます。新しいツール:手動スナップショット用の checkpoint(doc_id, path?)、メモリー内の状態を自動保存データで置き換える recover_from_autosave(doc_id, discard_changes?)。get_session_state に autosave_detected と autosave_path のフィールドを追加。save_document/finalize_document の成功時に <source>.autosave.docx を削除します。save-durability-stack SDD の Phase 4。 |
| v3.5.5 | 2026-04-23 | ロールバック用の逃げ道として keep_bak をオプトインで追加(#38 を解消)。save_document に省略可能な keep_bak: Bool = false を追加。true で保存先が存在する場合、アトミックリネームによる保存の前に、保存先を <path>.bak にリネームします(スロットは 1 つで、既存の .bak は上書き)。今後の保存で OOXML がサイレント破損した場合、ユーザーは mv <path>.bak <path> でロールバックできます。.bak は ooxml-swift ではなくサーバー層で管理されるため、macdoc CLI のユーザーに不要な .bak ファイルが作られることはありません。save-durability-stack SDD の Phase 3。 |
| v3.5.4 | 2026-04-23 | class WordMCPServer を actor WordMCPServer に変更(#39 を解消)。8 個の可変なセッション状態辞書を actor 分離し、actor をまたぐアクセスのすべてで await を使うことをコンパイラーが強制します。v3.5.4 より前に insert_image_from_path を 12 件並列実行すると発生していた Dictionary のハッシュテーブル破損競合を解消します。save-durability-stack SDD の Phase 2。 |
| v3.5.3 | 2026-04-23 | アトミックリネームによる保存(#36 を解消)。DocxWriter.write を <url>.tmp.<UUID> への書き込み+fsync+replaceItemAt にリファクタリングした ooxml-swift 0.13.2 に更新。書き込み中に例外が発生するかプロセスが強制終了しても、元のファイルのバイト列は保持されます(POSIX の rename(2) はカーネルでアトミックに実行され、異なるボリューム間ではコピー+削除にフォールバック)。ooxml-swift のテスト 397/397 件が合格。並行監視の回帰テストを追加。save-durability-stack SDD の Phase 1。 |
| v3.5.2 | 2026-04-23 | Rels のオーバーレイマージ(#35 を解消) — Reader で読み込んだドキュメントを変更せずに save_document で往復保存しても、theme/webSettings/people/customXml/commentsExtended/commentsIds の rels が保持されるようになりました。v3.5.0/v3.5.1 ではパート層を修正し、v3.5.2 では rels 層を修正しています。che-word-mcp のソース変更なし — 修正はすべて ooxml-swift v0.13.1(RelationshipsOverlay+リレーションシップに基づく extractImages)で実施。 |
| v3.5.1 | 2026-04-23 | ユニバーサルバイナリ(x86_64 + arm64) — Intel Mac との互換性を復元。リリースビルドでドキュメントに記載されていた lipo -create の手順がスキップされたため、v3.5.0 は arm64 のみでした。ソース変更なし — そのまま置き換え可能です。 |
| v3.5.0 | 2026-04-23 | ダーティトラッキングによる真のバイト保持(#23 round-2+#32 #33 #34 を解消)。Reader で読み込んだ <org> の論文を変更せずに save_document で往復保存しても、13 個すべての fontTable+6 個の異なるヘッダー+4 個のフッター+3 セグメントの PAGE フィールドを保持し、<w15:presenceInfo> の ID も保持します。ooxml-swift 0.13.0(modifiedParts: Set<String>+Header.originalFileName+ダーティでない場合にスキップするオーバーレイモード)をベースにしています。list_people は 2 種類の ID を返します:person_id(GUID、名前変更後も安定)+display_name_id(旧 author と同じ)。 |
| v3.4.0 | 2026-04-23 | Phase 2B+2C を統合(#24 #25 #29 #30 #31 を解消):コメントスレッド(list_comment_threads/get_comment_thread/sync_extended_comments)、people(list_people/add_person/update_person/delete_person)、脚注/文末脚注の更新(get_endnote/update_endnote/get_footnote/update_footnote — 脚注 ID を保持)、Web 設定(get_web_settings/update_web_settings)。MCP ツールを 13 個追加。 |
| v3.3.0 | 2026-04-23 | Phase 2A(#26 #27 #28 を解消):テーマツール(get_theme/update_theme_fonts/update_theme_color/set_theme)、ヘッダー(list_headers/get_header/delete_header)、透かし(list_watermarks/get_watermark)、フッター(list_footers/get_footer/delete_footer)。MCP ツールを 12 個追加。デフォルトで保持する往復処理のため、ooxml-swift を 0.12.x に更新。 |
| v3.2.0 | 2026-04-23 | insert_equation の LaTeX パーサーを latex-math-swift に委譲(#22 を解消)。LaTeX のサブセット全体に対応:\frac、\sqrt、\hat/\bar/\tilde、\left/\right、上下限付きの \sum/\int/\prod、\ln/\sin/\cos/\tan/\log/\exp/\max/\min/\det、\sup/\inf/\lim、\text{}、一般的な演算子、すべてのギリシャ文字(\varepsilon のバリアントを含む)。計量経済学のフィクスチャにある方程式 18 個すべてを解析できるようになりました。ooxml-swift 0.11.0 による MathAccent を追加。 |
| v3.1.0 | 2026-04-22 | 9 個の読み取りツール:キャプションの CRUD(list_captions/get_caption/update_caption/delete_caption)、update_all_fields(F9 相当の SEQ 再カウント)、数式の CRUD(list_equations/get_equation/update_equation/delete_equation)。新しい ooxml-swift 0.10.0 の FieldParser+OMMLParser をベースにしています。 |
| v3.0.0 | 2026-04-22 | 破壊的変更:セッション状態 API。新しいツール get_session_state/revert_to_disk/reload_from_disk/check_disk_drift を追加。open_document の track_changes のデフォルトを true から false に変更。close_document のダーティチェックが、復旧方法(save_document/discard_changes: true/finalize_document)を含む E_DIRTY_DOC テキスト応答を返すようになりました。 |
| v2.3.0 | 2026-04-22 | テキストアンカー対応の複合ツール — insert_caption/insert_image_from_path が after_text/before_text/text_instance を受け付けます。search_text+insert_* の 2 回呼び出しパターンが不要になり、ドキュメントのキャプション作成ワークフローで RPC を約 50% 削減します。 |
| v2.2.0 | 2026-04-22 | バッチ API — replace_text_batch(順次実行、最後に 1 回だけ保存、dry_run/stop_on_first_failure フラグ付き)+search_text_batch(複数クエリの集約応答、Direct Mode+Session Mode)。 |
| v2.1.0 | 2026-04-22 | v2.0.0 のパラメーターを inputSchema で公開 — insert_caption/insert_equation/insert_image_from_path/replace_text のスキーマに、新しいパラメーター(中国語ラベル、components、into_table_cell、scope、regex)を記載。 |
| v2.0.0 | 2026-04-22 | 破壊的変更:word-mcp-insertion-primitives の Spectra 変更。実際の OOXML SEQ フィールド(リテラルテキストから変更)、OMML MathComponent AST(文字列置換から変更)、縦横比を自動調整した画像サイズ+テーブルセルの指定、scope+正規表現の後方参照に対応した、run をまたいで安全に動作する replace_text。 |
| v1.19.0 | 2026-04-15 | 原稿レビュー用 Markdown エクスポート:export_revision_summary_markdown/compare_documents_markdown/export_comment_threads_markdown。破壊的変更:get_revisions+compare_documents の full_text パラメーターを summarize に置き換え(デフォルトの動作を反転)。 |
| v1.18.0 | 2026-04-14 | get_revisions のハードコードされた 30 文字での切り詰めを修正(v1.2.0 以降のバグ)。full_text をオプトインで追加。 |
| v1.17.0 | 2026-03-11 | セッション状態管理:ダーティトラッキング、自動保存、finalize_document、get_document_session_state、シャットダウン時のフラッシュ(@ildunari による貢献) |
| v1.16.0 | 2026-03-10 | デュアルモード:15 個の読み取り専用ツールが source_path(Direct Mode)に対応。MCP サーバーの説明を追加。 |
| v1.15.2 | 2026-03-07 | LLM によるパラメーター処理を改善するため、list_all_formatted_text ツールの説明を改善。 |
| v1.15.1 | 2026-03-01 | 見出しヒューリスティックのスタイルフォールバックを修正(スタイル継承チェーンから fontSize を解決)。 |
| v1.15.0 | 2026-03-01 | 実用モード:EMF→PNG の自動変換+スタイルのないドキュメント向けの見出しヒューリスティック。 |
| v1.14.0 | 2026-03-01 | word-to-md-swift ライブラリを組み込み:外部の macdoc バイナリが不要になり、doc_id のサポートを復元。 |
| v1.13.0 | 2026-03-01 | ooxml-swift を v0.5.0 にアップグレード:マルチコア並列解析(大きなドキュメントで約 0.64 秒)。 |
| v1.12.1 | 2026-03-01 | ooxml-swift を v0.4.0 にアップグレード:大きなドキュメントのパフォーマンスを修正(30 秒超から約 2.3 秒に短縮)。 |
| v1.12.0 | 2026-02-28 | export_markdown が source_path のみを使用するよう変更し、doc_id を削除。ロックファイルのチェックを追加。 |
| v1.11.1 | 2026-02-28 | export_markdown の stdout モードを修正(パイプの fsync に関する問題)。 |
| v1.11.0 | 2026-02-28 | export_markdown が macdoc CLI に処理を委譲するよう変更。word-to-md-swift 依存関係を削除。 |
| v1.9.0 | 2026-02-28 | export_markdown が高品質な出力のために word-to-md-swift を使用するようアップグレード(合計 145 件)。 |
| v1.8.0 | 2026-02-03 | 差分のハードリミットを撤廃し、compare_documents に max_results と heading_styles のパラメーターを追加。 |
| v1.7.0 | 2026-02-03 | サーバー側のドキュメント差分用に compare_documents ツールを追加(合計 105 件)。 |
| v1.2.1 | 2026-01-16 | MCP SDK との互換性を修正(actor から class に変更し、capabilities を追加)。 |
| v1.2.0 | 2026-01-16 | 12 個の新しいツールを追加(合計 95 件):検索、ハイパーリンク、ブックマーク、脚注、文末脚注、リビジョン、プロパティ。 |
| v1.1.0 | 2026-01-16 | Claude Desktop 用の MCPB manifest.json 形式を修正。 |
| v1.0.0 | 2026-01-16 | ooxml-swift を使用するようリファクタリングし、83 個のツールを備えて初回リリース。 |
クイックスタート
Claude Desktop の場合
オプション A:MCPB ワンクリックインストール(推奨)
Releases から最新の .mcpb ファイルをダウンロードし、ダブルクリックしてインストールします。
オプション B:手動設定
~/Library/Application Support/Claude/claude_desktop_config.json を編集します。
{
"mcpServers": {
"che-word-mcp": {
"command": "/usr/local/bin/CheWordMCP"
}
}
}
Claude Code(CLI)の場合
オプション A:プラグインとしてインストール(推奨)
プラグインには、バージョンを考慮したラッパーが含まれており、初回使用時にバイナリを自動ダウンロードします(プラグイン自体が更新されるたびに再ダウンロードされるため、swift build は不要です)。
2 つの手順で完了します。マーケットプレイスを一度登録してから、プラグインをインストールします。
# 1. Register the marketplace (one-time)
claude plugin marketplace add PsychQuant/psychquant-claude-plugins
# 2. Install the plugin
claude plugin install che-word-mcp@psychquant-claude-plugins
Claude Code 内から操作していますか? スラッシュコマンドに相当する
/plugin marketplace add PsychQuant/psychquant-claude-pluginsと/plugin install che-word-mcp@psychquant-claude-pluginsでも同様に操作できます。
注: プラグインは MCP バイナリを自動ダウンロードするラッパーで包んでいます。バイナリが
~/bin/CheWordMCPにない場合(またはサイドカーの~/bin/.CheWordMCP.versionがプラグインに固定されたバージョンより古い場合)、次回の呼び出し時に GitHub Releases からダウンロードされます。
オプション B:スタンドアロン MCP としてインストール
プラグイン機能(スラッシュコマンド、スキル、SessionStart フック)を使わずに MCP サーバーだけが必要な場合:
# Create ~/bin if needed
mkdir -p ~/bin
# Download the latest release
curl -L https://github.com/PsychQuant/che-word-mcp/releases/latest/download/CheWordMCP -o ~/bin/CheWordMCP
chmod +x ~/bin/CheWordMCP
# Register with Claude Code
# --scope user : available across all projects (stored in ~/.claude.json)
# --transport stdio: local binary execution via stdin/stdout
# -- : separator between claude options and the command
claude mcp add --scope user --transport stdio che-word-mcp -- ~/bin/CheWordMCP
💡 ヒント: バイナリは
~/bin/のようなローカルディレクトリにインストールしてください。クラウド同期フォルダー(Dropbox、iCloud、OneDrive)は避けてください。同期処理によって MCP 接続が切断される可能性があります。
ソースからビルド(任意)
main を追跡する場合や、パッチを提供する場合にのみ使用してください。
前提条件
- macOS 13.0 以降(Ventura 以降)
- Swift 5.9 以降
git clone https://github.com/PsychQuant/che-word-mcp.git
cd che-word-mcp
swift build -c release
# Install
cp .build/release/CheWordMCP ~/bin/
クラッシュファジング(scripts/fuzz-extreme-params.py)
tools/list で宣言されたすべての整数/数値パラメーターに、極端な値(Int.max、Int.min、2^62、2^31、-1、1e300、-1e300)を、stdio(MCP JSON-RPC)経由で実際にコンパイルされたバイナリに送信します。プローブごとに新しいサーバープロセスを起動するため、1つのプローブでクラッシュしても実行全体が停止することはありません。#234 の最初の修正ラウンドの前に58件のクラッシュを発見し、さらに(同じ issue 内で拡大された監査基準に照らして)5件を発見しました。これらは手作業による grep ベースの監査では見落とされていました。詳しい経緯は issue を参照してください。新しいツールや新しい整数/数値パラメーターを追加するとき、および Server.swift の整数/数値パラメーター処理に関わるリリースの前には、必ず実行してください。
swift build # ensure .build/debug/CheWordMCP is up to date first
python3 scripts/fuzz-extreme-params.py .build/debug/CheWordMCP /tmp/fuzz-workdir
終了コードが0になるのは、クラッシュやハング(各プローブ後に行われる保存中のものも含む)がなく、「(拒否必須)」のプローブがすべて拒否され、最大サイズのテーブルを使用するプローブ中の常駐メモリのピーク使用量(シーケンス全体を通じてサンプリングし、完了時に1回だけ読み取るのではありません。#239)が上限を下回り、スキーマの整数/数値パラメーターのうち少なくとも FUZZ_MIN_COVERAGE(デフォルトは0.80。0.97から引き下げ。詳細は以下)が到達済みと判定された場合です。無関係な前提条件によって停止したプローブでは何も証明できません。そのため、対象に到達できなくなったファザーは、クラッシュゼロを報告するのではなく失敗します。「到達済み」と判定するには、応答がパラメーター名を示すか値を返す、またはそのパラメーターを対象としたインデックスエラー/見つからないエラーが発生するなど、肯定的な証拠が必要です。成功しただけの応答は、それだけではもはや十分ではありません(#239 — 以前の基準では4.4.0で241/245と数えていましたが、独立した監査で実際に到達していたのは約227/245と判明しました)。実際の基準では、旧基準で測定されていた値より低いカバレッジ(現在のより大きなパラメーターセットに対して約85%)になります。そのため、デフォルト値を0.97から0.80に変更しました。0.97は過大に数える基準に合わせて設定されたもので、正確に測定するようになってからは実際には一度も満たされていません。サマリー行、カバレッジ行(未到達のパラメーターを含む)、プローブごとのTSV(<workdir>/fuzz_results.tsv)は、必ず出力されます。また、オプトイン方式で swift test にも組み込まれています(デフォルトでは実行されません。約1,300個のサブプロセスとコンパイル済みバイナリが必要です。RUN_FUZZ=1 を設定した場合、バイナリが存在しないか古いとゲートが失敗します)。
RUN_FUZZ=1 swift test --filter FuzzExtremeParamsGateTests
2つの動作モード
ダイレクトモード(source_path)— 読み取り専用、状態なし
ファイルパスを直接渡します。最初に open_document を呼び出す必要はありません。手早く確認するのに最適です。
# Just pass source_path — one step
list_images: { "source_path": "/path/to/file.docx" }
search_text: { "source_path": "/path/to/file.docx", "query": "keyword" }
get_document_info: { "source_path": "/path/to/file.docx" }
19個のツールがダイレクトモードに対応しています:
| カテゴリー | ツール |
|---|---|
| コンテンツの読み取り | get_text、get_document_text、get_paragraphs、get_document_info、search_text |
| 要素の一覧表示 | list_images、list_styles、get_tables、list_comments、list_hyperlinks、list_bookmarks、list_footnotes、list_endnotes、get_revisions |
| プロパティ | get_document_properties、get_section_properties、get_word_count_by_section、estimate_paragraph_for_page |
| エクスポート | export_markdown |
セッションモード(doc_id)— 読み取り/書き込みの全ライフサイクル
最初に open_document を呼び出し、その後のすべての操作に doc_id を使用します。編集にはこのモードが必要です。
open_document: { "path": "/path/to/file.docx", "doc_id": "mydoc" }
insert_paragraph: { "doc_id": "mydoc", "text": "Hello World" }
save_document: { "doc_id": "mydoc", "path": "/path/to/output.docx" }
close_document: { "doc_id": "mydoc" }
デュアルモード対応ツールは
source_pathとdoc_idの両方を受け付けます。すでにドキュメントを開いている場合は、ディスクからの再読み込みを避けるためにdoc_idを使用してください。
AI エージェントでの使用方法
エージェントに依頼するだけ
Use che-word-mcp to read all images from ~/Documents/report.docx
エージェントは自動的にダイレクトモードを使用します(開いたり閉じたりする必要はありません)。
AGENTS.md / CLAUDE.md
## Word Document Manipulation
Use `che-word-mcp` for reading and writing Microsoft Word (.docx) files.
**Read-only** (Direct Mode — one step):
- `get_document_text` / `get_paragraphs` — read content
- `list_images` / `search_text` — inspect elements
- `export_markdown` — convert to Markdown
**Edit** (Session Mode — open→edit→save):
1. `open_document` → get doc_id
2. `insert_paragraph` / `replace_text` / `format_text` — modify
3. `save_document` → write to disk
4. `close_document` → release memory
Claude Code スキル
mkdir -p .claude/skills/che-word-mcp
curl -o .claude/skills/che-word-mcp/SKILL.md \
https://raw.githubusercontent.com/PsychQuant/che-word-mcp/main/skills/che-word-mcp/SKILL.md
利用可能なツール(合計234個)
段落インデックスの規則
paragraph_index / index は過去から使われているパラメーター名であり、OOXML の同じ領域を常に数えるとは限りません。挿入/変更/読み戻しを行うツールによって、使用する規則は異なります。共通の既定値として想定できるものはありません。
次の 3 つの座標系が併存しています。
body.children の挿入インデックス(一部の挿入で使用)、トップレベル段落の序数(ほとんどの変更操作とインライン数式の挿入で使用)、および get_paragraphs の読み戻し順(確認用)です。ツール間でインデックスを再利用する前に、各ツールの一覧について
docs/paragraph-index-conventions.md
を参照してください。
ドキュメント管理(6 ツール)
| ツール | 説明 |
|---|---|
create_document | 新しい Word ドキュメントを作成します |
open_document | 既存の .docx ファイルを開きます(v3.0.0 以降、track_changes の既定値は false です) |
save_document | ドキュメントを .docx ファイルに保存します |
close_document | 開いているドキュメントを閉じます(未保存の編集を破棄するには discard_changes: true を指定します) |
finalize_document | 保護された 1 つのステップで保存して閉じます |
list_open_documents | 開いているすべてのドキュメントを一覧表示します |
セッション状態 API(5 ツール、v3.0.0+)
| ツール | 説明 |
|---|---|
get_session_state | { source_path, disk_hash_hex, disk_mtime_iso8601, is_dirty, track_changes_enabled } のスナップショットを取得します |
get_document_session_state | 以前のセッションスナップショット(後方互換性のため維持) |
revert_to_disk | ソースパスを再読み込みし、メモリ内の編集を破棄します(意図的に破壊的な操作です) |
reload_from_disk | 協調的に再読み込みします。未保存のドキュメントでは force: true が必要です |
check_disk_drift | 情報を返します — { drifted, disk_mtime, stored_mtime, disk_hash_matches } |
コンテンツ操作(9 ツール)
| ツール | 説明 |
|---|---|
get_text | プレーンテキストの内容を取得します |
get_paragraphs | 書式設定を含むすべての段落を取得します |
estimate_paragraph_for_page | v3.18.0+ — Word UI のページ番号から get_paragraphs の候補範囲を推定します(信頼度と警告を含むヒューリスティックな JSON)。chars_per_page の導出式、信頼度レベルの表、既知の制限については、docs/estimate-paragraph-for-page.md を参照してください。 |
insert_paragraph | 新しい段落を挿入します |
update_paragraph | 段落の内容を更新します |
delete_paragraph | 段落を削除します |
replace_text | scope(body|all)+ regex + $1..$N の後方参照を使い、run をまたいで安全に検索・置換します |
replace_text_batch | v2.2.0 — N 件の置換を順次実行するバッチです。最後に 1 回だけ保存し、dry_run / stop_on_first_failure に対応します |
search_text_batch | v2.2.0 — 複数のクエリをまとめて検索します。Direct + Session Mode で動作します |
書式設定(3 ツール)
| ツール | 説明 |
|---|---|
format_text | テキストの書式設定(太字、斜体、色、フォント)を適用します |
set_paragraph_format | 段落の書式設定(配置、間隔)を設定します |
apply_style | 組み込みスタイルまたはカスタムスタイルを適用します |
表(15 個のツール、v3.11.0+ の拡張機能 #49)
コア(6):
| ツール | 説明 |
|---|---|
insert_table | データを指定して、または指定せずに表を挿入します |
get_tables | すべての表の情報を取得します |
update_cell | セルの内容を更新します |
delete_table | 表を削除します |
merge_cells | セルを水平方向または垂直方向に結合します |
set_table_style | 表の罫線と網かけを設定します |
行/列/セル(8):
| ツール | 説明 |
|---|---|
add_row_to_table, delete_row_from_table | 行を管理します |
add_column_to_table, delete_column_from_table | 列を管理します |
set_cell_width, set_cell_vertical_alignment | セルのサイズと配置を設定します |
set_row_height, set_table_alignment | 行の高さと表の配置を設定します |
高度な機能(5、v3.11.0):
| ツール | 説明 |
|---|---|
set_table_conditional_style | <w:tblStylePr> を介して、firstRow/lastRow/bandedRows などを適用します(10 種類の領域タイプ) |
insert_nested_table | セル内に表を挿入します。深さは最大 5 で、上限を超えると nested_too_deep が発生します |
set_table_layout | 固定レイアウトと自動調整を切り替えます |
set_header_row | ページ区切り時に繰り返し表示されるよう、行を <w:tblHeader/> として指定します |
set_table_indent | 表レベルの左インデント(<w:tblInd>)を設定します |
スタイル管理(8 個のツール+6 個の拡張引数、v3.10.0+ #48)
コア(4):
| ツール | 説明 |
|---|---|
list_styles | 利用可能なすべてのスタイルを一覧表示します(Direct Mode に対応) |
create_style | カスタムスタイルを作成します。v3.10 の 6 個の引数 based_on、linked_style_id、next_style_id、q_format、hidden、semi_hidden を拡張しました |
update_style | スタイル定義を更新します。同じ 6 個の拡張引数に対応します |
delete_style | カスタムスタイルを削除します |
継承とリンク(4、v3.10.0):
| ツール | 説明 |
|---|---|
get_style_inheritance_chain | 循環を検出しながら basedOn チェーンをルートまでさかのぼります |
link_styles | 段落スタイルと文字スタイルのペアを双方向の <w:link> でリンクします |
set_latent_styles | <w:latentStyles> ブロックを介して、クイックスタイルギャラリーの既定値を制御します |
add_style_name_alias | BCP 47 言語コードごとに、ローカライズされた <w:name> エイリアスを追加します |
番号付け/リスト(12 個のツール、v3.10.0+ の定義ライフサイクル #46)
リストの直接作成(4):
| ツール | 説明 |
|---|---|
insert_bullet_list | 箇条書きリストを挿入します |
insert_numbered_list | 番号付きリストを挿入します |
set_list_level | リストのインデントレベルを設定します |
set_outline_level | 段落のアウトラインレベルを設定します(目次への追加) |
定義の CRUD(8、v3.10.0):
| ツール | 説明 |
|---|---|
list_numbering_definitions | すべての abstractNum と num のペアを列挙します |
get_numbering_definition | ID を指定して単一の num を取得します |
create_numbering_definition | 新しい abstractNum と対応する num を作成します(最大 9 レベル) |
override_numbering_level | レベルごとの開始値に <w:lvlOverride> を設定します |
assign_numbering_to_paragraph | 段落インデックスで <w:numPr> を割り当てます |
continue_list | 段落をまたいで番号付けを続行します |
start_new_list | 番号付けをリセットして開始します |
gc_orphan_numbering | 参照されていない num 定義を整理します(abstractNums は保持されます) |
セクション/ページ設定(12 ツール、v3.10.0+ 拡張機能 #47)
基本的なページ設定(5):
| ツール | 説明 |
|---|---|
set_page_size | ページサイズを設定します(A4、Letter など) |
set_page_margins | ページの余白を設定します |
set_page_orientation | 縦向きまたは横向きを設定します |
insert_page_break | 改ページを挿入します |
insert_section_break | セクション区切りを挿入します |
セクションのプロパティ(7、v3.10.0):
| ツール | 説明 |
|---|---|
get_all_sections | ドキュメント内の順序で、各セクションの SectionInfo 配列を返します |
set_section_break_type | nextPage/continuous/evenPage/oddPage |
set_section_vertical_alignment | 表紙ページ用の <w:vAlign> |
set_page_number_format | ローマ数字などに使用する <w:pgNumType w:fmt> |
set_line_numbers_for_section | 法律文書用の <w:lnNumType> |
set_title_page_distinct | セクションごとに <w:titlePg/> を切り替えます |
set_section_header_footer_references | 種類ごとの rId(default/first/even)を割り当てます |
ヘッダーとフッター(17 ツール、v3.11.0+ 奇数/偶数+セクションマップ #51)
書き込みツール(5):
| ツール | 説明 |
|---|---|
add_header | ヘッダーの内容を追加します(v3.3.0+ 以降は RelationshipIdAllocator を使用し、オーバーレイモードで rId の衝突を防ぎます) |
update_header | ヘッダーの内容を更新します(ファイル名と rId を保持し、tempDir をインプレースで上書きします) |
add_footer | フッターの内容を追加します |
update_footer | フッターの内容を更新します |
insert_page_number | ページ番号フィールドを挿入します |
読み取り+削除ツール(8、v3.3.0+、#26 #27 を解決):
| ツール | 説明 |
|---|---|
list_headers | ヘッダーのパーツを種類(default/first/even)、section_id、has_watermark とともに列挙します |
get_header | テキスト、完全な XML、透かしの構造を読み取ります |
delete_header | 種類付きモデルエントリー、tempDir ファイル、Relationship、Content_Types Override を削除します |
list_watermarks | すべてのヘッダーをスキャンし、VML の透かし図形(テキスト(PowerPlusWaterMarkObject)または画像(WordPictureWatermark、#209))を検出します |
get_watermark | 単一ヘッダーの透かしの詳細を返します(透かしがない場合は null を返します) |
list_footers | フッターのパーツを種類、section_id、has_page_number とともに列挙します |
get_footer | テキスト、XML、解析済みフィールド構造(PAGE/NUMPAGES/REF/STYLEREF)を読み取ります |
delete_footer | delete_header と同様の処理を行います |
奇数/偶数+セクションのリンク(4、v3.11.0):
| ツール | 説明 |
|---|---|
enable_even_odd_headers | ドキュメントレベルの <w:evenAndOddHeaders/> フラグを切り替えます |
link_section_header_to_previous | Word 互換のクローンセマンティクス |
unlink_section_header_from_previous | 対称的なリンク解除 |
get_section_header_map | セクションごとのヘッダー/フッターファイルの割り当てを返します |
テーマの編集(4 ツール、v3.3.0+、#28 を解決)
| ツール | 説明 |
|---|---|
get_theme | word/theme/theme1.xml から、major/minor フォントスロット(latin/ea/cs)とカラースキーム(accent1-6、hyperlink、followedHyperlink)を読み取ります |
update_theme_fonts | フォントスロットを部分更新します。たとえば、ドキュメントの中国語フォントを修正するには { minor: { ea: "DFKai-SB" } } を指定します |
update_theme_color | スロット名を指定して 16 進カラーを更新し、値を検証します(無効なスロットや 6 文字以外の 16 進数を拒否します) |
set_theme | 低レベルの回避手段として theme1.xml をそのまま置き換えます(<a:theme> ルート要素と整形式の XML を検証します) |
画像(7 個のツール)
| ツール | 説明 |
|---|---|
insert_image | インライン画像(PNG、JPEG)を挿入します |
insert_image_from_path | v2.0.0+ — 幅と高さは省略可能です(ImageDimensions.detect による自動アスペクト比調整)。into_table_cell と after_text/before_text アンカーに対応しています。PNG/JPEG、および PDF(ネイティブの PDFKit/CoreGraphics を使って page 番目のページをラスタライズします。#16) |
insert_floating_image | テキストの回り込みを設定した浮動画像を挿入します。relative_to_h/relative_to_v でアンカーの基準点を設定します(#233) |
update_image | 画像のプロパティを更新します |
delete_image | 画像を削除します |
list_images | 画像を一覧表示します — 文書本文とヘッダー/フッターにある画像それぞれに、save_document が整合性チェックで使用するのと同じパッケージスキャンに基づき、referenced: yes/orphan/unknown のフラグを付けます(#199、#219) |
set_image_style | 画像の枠線と効果を設定します |
キャプション(5 個のツール)
| ツール | 説明 |
|---|---|
insert_caption | v2.0.0+ — 実際の OOXML SEQ フィールドを出力します(リテラルテキストではありません)。英語と中国語のラベル(Figure/Table/Equation/圖/表/公式)に対応し、5 種類のアンカー(paragraph_index/after_image_id/after_table_index/after_text/before_text)を指定できます。オプションで STYLEREF による章番号の接頭辞を追加できます |
list_captions | v3.1.0 — ラベル/シーケンス番号/キャプションテキスト/段落インデックスを含むキャプション段落を列挙します |
get_caption | v3.1.0 — オプションの STYLEREF による chapter_number を含む、単一キャプションの詳細情報を取得します |
update_caption | v3.1.0 — SEQ フィールドの構造を損なわずに、キャプションのテキストまたはラベルを変更します |
delete_caption | v3.1.0 — キャプション段落を削除します |
数式(5 個のツール)
| ツール | 説明 |
|---|---|
insert_equation | v2.0.0+ — MathComponent AST(9 種類)を使って、構造的に正しい OMML を出力します。主な方法は components: ツリーで、代替方法として latex: の一部(\frac、\sqrt、x^{y}、ギリシャ文字、∑/∫/∏)に対応します |
list_equations | v3.1.0 — display_mode フラグ付きで <m:oMath> ランを列挙します |
get_equation | v3.1.0 — コンポーネントの概要を含む、単一の数式の詳細情報を取得します |
update_equation | v3.1.0 — 対象の数式のコンポーネントツリーを置き換えます |
delete_equation | v3.1.0 — 数式ランまたは空の段落を削除します |
エクスポート(5 個のツール)
| ツール | 説明 |
|---|---|
export_text | プレーンテキストとしてエクスポートします |
export_markdown | Markdown としてエクスポートします(組み込みの word-to-md-swift を使用) |
export_revision_summary_markdown | v1.19.0 — 原稿レビュー用に、文書ごとの変更履歴をエクスポートします |
compare_documents_markdown | v1.19.0 — 複数文書にわたる累積変更履歴をエクスポートします |
export_comment_threads_markdown | v1.19.0 — 作成者エイリアスを正規化して、コメントスレッドをエクスポートします |
ハイパーリンクとブックマーク(10 個のツール、v3.11.0+ 型付きバリアント #50)
汎用とブックマーク(7 個):
| ツール | 説明 |
|---|---|
insert_hyperlink | 外部ハイパーリンクを挿入します |
insert_internal_link | ブックマークへのリンクを挿入します |
insert_cross_reference | 相互参照を挿入します |
update_hyperlink | ハイパーリンクを更新します |
delete_hyperlink | ハイパーリンクを削除します |
insert_bookmark | ブックマークを挿入します |
delete_bookmark | ブックマークを削除します |
型付きハイパーリンク(3 個、v3.11.0、Hyperlink 文字スタイルを自動作成):
| ツール | 説明 |
|---|---|
insert_url_hyperlink | オプションのツールチップと履歴フラグを指定できる、外部 URL へのリンク |
insert_bookmark_hyperlink | 内部アンカーリンク(w:anchor、rId なし) |
insert_email_hyperlink | オプションで URL エンコードされた件名を指定できる mailto: リンク |
コメントと変更履歴(13 ツール)
コメントの書き込み+読み取り(7):
| ツール | 説明 |
|---|---|
insert_comment | コメントを挿入 |
update_comment | コメントのテキストを更新 |
delete_comment | コメントを削除 |
list_comments | すべてのコメントを一覧表示 |
reply_to_comment | 既存のコメントに返信 |
resolve_comment | コメントを解決済みとしてマーク |
list_comment_threads | v3.4.0 — 型付き Comment.parentId を使用して commentsExtended.xml からスレッド(root_comment_id + 返信 + 解決状態 + durable_id)を列挙 |
コメントスレッドツール(2、v3.4.0+、#29 を解決):
| ツール | 説明 |
|---|---|
get_comment_thread | ルートコメントを読み取り、子コメントをたどって返信ツリー全体を取得 |
sync_extended_comments | トリプレット同期の計画用に、型付きコメント数を報告 |
変更履歴の追跡 — 承認/却下側(7):
| ツール | 説明 |
|---|---|
enable_track_changes | 変更履歴の記録を有効化(デフォルトの作成者解決用に revisions.settings.author を設定) |
disable_track_changes | 変更履歴の記録を無効化 |
get_revisions | すべての変更履歴を列挙(Direct Mode に対応) |
accept_revision | ID を指定して変更履歴を承認 |
reject_revision | ID を指定して変更履歴を却下 |
accept_all_revisions | すべて一括承認 |
reject_all_revisions | すべて一括却下 |
変更履歴の追跡 — プログラムによる書き込み側(3、v3.12.0 #45):
| ツール | 説明 |
|---|---|
insert_text_as_revision | <w:ins> の変更履歴マークアップで囲んだテキストを挿入します。position でまたがるランを分割します(前後のテキストと書式を保持)。引数:doc_id、paragraph_index、position、text、省略可能な author、date。 |
delete_text_as_revision | [start, end) のランに <w:del> を付け、<w:t> を <w:delText> に置き換えます。単一段落のみ対応(段落をまたぐ削除は対象外)。 |
move_text_as_revision | 隣接する変更履歴 ID を持つ <w:moveFrom>/<w:moveTo> のペアを出力します。単一段落内の移動は拒否されます(呼び出し側で削除+挿入を使用してください)。 |
既存ツールに追加される拡張引数 2 つ(追加機能、デフォルトは false):
format_textにas_revision: boolを追加 — 暗黙の書式変更ではなく、<w:rPrChange>の変更履歴を生成します。run_index、author、dateも受け付けます。set_paragraph_formatにas_revision: boolを追加 —<w:pPrChange>の変更履歴を生成します。
副作用に関する契約:as_revision: true を使用するには、事前に enable_track_changes が呼び出されている必要があります。変更履歴の記録が無効な場合、暗黙に有効化するのではなく track_changes_not_enabled をスローします。作成者の解決順序:明示的に指定された空でない author 引数 → revisions.settings.author → リテラルの "Unknown"。
People — コメントの作成者(4 ツール、v3.4.0+、#30 を解決)
| ツール | 説明 |
|---|---|
list_people | word/people.xml から <w15:person> エントリを解析 |
add_person | 新しいエントリを追加。不在の場合は people.xml パーツを自動作成。名前が重複する場合は _2 サフィックスを付加 |
update_person | display_name を更新(author 属性を置換) |
delete_person | エントリを削除し、comments_orphaned の件数を報告 |
脚注と文末脚注(10 ツール)
書き込み+削除(4):
| ツール | 説明 |
|---|---|
insert_footnote | 脚注を挿入 |
delete_footnote | 脚注を削除 |
insert_endnote | 文末脚注を挿入 |
delete_endnote | 文末脚注を削除 |
一覧表示+読み取り+更新(6、v3.4.0+、#24 #25 を解決):
| ツール | 説明 |
|---|---|
list_footnotes | Direct Mode に対応 |
list_endnotes | Direct Mode に対応 |
get_footnote | 整数 ID でテキスト+ランを読み取り |
update_footnote | テキストをインプレースで置換し、footnote_id を保持(相互参照は有効なまま) |
get_endnote | 整数 ID でテキスト+ランを読み取り |
update_endnote | テキストをインプレースで置換し、endnote_id を保持 |
Web Settings(2 個のツール、v3.4.0+、#31 をクローズ)
| ツール | 説明 |
|---|---|
get_web_settings | word/webSettings.xml のフラグ要素(relyOnVML、optimizeForBrowser、allowPNG、doNotSaveAsSingleFile)を解析します。存在しない場合は { error: "no webSettings part" } を返します |
update_web_settings | キー単位で部分更新します。パーツが存在しない場合は自動作成します |
フィールドコード(7 個のツール)
| ツール | 説明 |
|---|---|
insert_if_field | IF 条件フィールドを挿入します |
insert_calculation_field | 計算フィールド(SUM、AVERAGE など)を挿入します |
insert_date_field | 日付/時刻フィールドを挿入します |
insert_page_field | ページ番号フィールドを挿入します |
insert_merge_field | 差し込み印刷フィールドを挿入します |
insert_sequence_field | 自動採番シーケンスを挿入します |
update_all_fields | v3.1.0 — 本文、ヘッダー、フッター、脚注、文末脚注を対象に、F9 相当の SEQ 再カウントを行います。pStyle=="Heading N" が SEQ の resetLevel と一致する場合、章ごとのリセットに対応します |
コンテンツコントロール/SDT(10 個のツール、v3.9.0+ 読み取り/書き込み完全対応 #44)
挿入+フォーム用ヘルパー(5 個):
| ツール | 説明 |
|---|---|
insert_content_control | 12 種類を判別します(richText/plainText/picture/date/dropDownList/comboBox/checkBox/bibliography/citation/group/repeatingSection(拒否されます。insert_repeating_section を使用してください)/repeatingSectionItem)。任意の引数:list_items(dropDown/comboBox では必須)、date_format、lock_type。 |
insert_repeating_section | 繰り返しセクション(Word 2012+)を挿入します。allow_insert_delete_sections: bool を受け付けます(デフォルトは true) |
insert_checkbox | チェックボックス SDT を挿入します |
insert_dropdown | ドロップダウン SDT を挿入します |
insert_text_field | プレーンテキスト SDT を挿入します |
読み取りツール(3 個):
| ツール | 説明 |
|---|---|
list_content_controls | すべての SDT を列挙します。フラット形式(デフォルト)またはネストされたツリーモードを選択できます(Direct Mode に対応) |
get_content_control | id、tag、または alias で単一の SDT を取得します。完全なメタデータと <w:sdtContent> XML を返します。not_found/multiple_matches エラーを通知します。 |
list_repeating_section_items | 繰り返しセクション SDT 内のアイテムを文書順に列挙します |
変更ツール(4 個):
| ツール | 説明 |
|---|---|
update_content_control_text | plainText/richText/date/bibliography/citation SDT のテキストコンテンツを置換します。<w:sdtPr> はバイト単位で変更せず保持します。picture/dropdown/combo/checkbox/group/repeatingSection の場合は unsupported_type を返します。 |
replace_content_control_content | ホワイトリスト検証を行ったうえで、完全な <w:sdtContent> XML を置換します(<w:sdt>、<w:body>、<w:sectPr>、または XML 宣言を含む入力は拒否されます) |
delete_content_control | SDT を削除します。任意で子要素のラップを解除できます(keep_content: true がデフォルト) |
update_repeating_section_item | インデックスで指定した単一アイテムのテキストを置換します(インデックスが無効な場合は out_of_bounds) |
SDT ID の割り当てには、決定的な最大値+1方式を使用します(v3.9.0 より前はランダム方式)。list_custom_xml_parts は前方互換性のため空リストを返すスタブとして提供されます(実装は che-word-mcp-customxml-databinding の Change B にあります)。
高度な機能(10 個のツール)
| ツール | 説明 |
|---|---|
insert_toc | 目次を挿入 |
insert_table_of_figures | 図表目次を挿入 |
insert_index, insert_index_entry | 索引を生成 |
set_paragraph_border | 段落の罫線を設定 |
set_paragraph_shading | 段落の背景色を設定 |
set_character_spacing | 文字間隔を設定 |
set_text_effect | テキストのアニメーション効果を設定 |
insert_horizontal_line, insert_drop_cap, insert_symbol | 装飾要素 |
注:上記の件数は主要なツールカテゴリを対象としています。Document Comparison、Track Changes(読み取り+
<w:ins>/<w:del>/<w:moveFrom>/<w:moveTo>/<w:rPrChange>/<w:pPrChange>によるプログラムからの書き込み)、Content Controls(12 種類の SDT 判別)、Field Codes、Theme Editing、Header/Footer CRUD + Watermark の読み取り(書き込み側は未実装、#201/#208)、奇数/偶数ページとセクションの関連付け、Comment Threads + People(2 つの ID)、Notes Update、Web Settings、Styles(継承+関連付け+潜在スタイル+エイリアス)、Numbering(定義のライフサイクル全体)、Sections(垂直方向の配置+ページ番号形式+タイトルページの区別+セクションごとの参照)、Tables(条件付き/ネスト/レイアウト/インデント)、Hyperlinks(型付きの url/ブックマーク/メール)、および Formatting helpers(as_revisionフラグ付き)を含めると、v3.13.5 時点で利用可能な機能の総数は 233 個のツールです。サーバーを起動してtools/listを呼び出すと、完全かつ正式な一覧を確認できます。
使用例
見出しとテキストを含むドキュメントを作成する
Create a new Word document called "report" with:
- Title: "Quarterly Report"
- Heading: "Introduction"
- A paragraph explaining the report purpose
Save it to ~/Documents/report.docx
表と画像を含むドキュメントを作成する
Create a document with:
- A title "Product Catalog"
- Insert an image from ~/images/logo.png
- A 4x3 table with product information
- Apply borders to the table
Save it to ~/Documents/catalog.docx
プロフェッショナルなレポートを作成する
Create a document with:
- Custom page margins (1 inch all around)
- A header with company name
- A footer with page numbers
- Table of contents
- Multiple sections with headings
- Footnotes for references
Save it as ~/Documents/annual_report.docx
技術的な詳細
OOXML 構造
このサーバーは、完全な構造を備えた有効な Office Open XML ドキュメントを生成します。
document.docx (ZIP)
├── [Content_Types].xml
├── _rels/
│ └── .rels
├── word/
│ ├── document.xml # Main content
│ ├── styles.xml # Style definitions
│ ├── settings.xml # Document settings
│ ├── fontTable.xml # Font definitions
│ ├── numbering.xml # List definitions
│ ├── comments.xml # Comments
│ ├── footnotes.xml # Footnotes
│ ├── endnotes.xml # Endnotes
│ ├── header1.xml # Header content
│ ├── footer1.xml # Footer content
│ ├── media/ # Embedded images
│ │ └── image*.{png,jpeg}
│ └── _rels/
│ └── document.xml.rels
└── docProps/
├── core.xml # Metadata
└── app.xml # Application info
依存関係
- MCP Swift SDK(v0.12.0 以降)— Model Context Protocol の実装
- ooxml-swift(v0.12.0 以降)— OOXML の解析+デフォルトで保持するラウンドトリップアーキテクチャ(PreservedArchive、RelationshipIdAllocator、ContentTypesOverlay)、
FieldParser、OMMLParser、updateAllFields()、MathAccent - latex-math-swift(v0.1.0 以降)— LaTeX サブセットから OMML
MathComponentAST へのパーサー(insert_equationv3.2.0 以降で使用) - markdown-swift(v0.2.0 以降)— Markdown の生成
- word-to-md-swift(v0.4.0 以降)— Word から Markdown への変換
開発者向けメモ — 実際のファイルによるテスト
Tests/CheWordMCPTests/RealWorldDocxRoundTripSmokeTests.swift は、合成したフィクスチャではなく、学位論文や契約書など、実際の Word 出力に対する ooxml-swift の Reader / Writer ペアを検証します。機密情報を含む .docx ファイルを test-files/ に配置し(gitignore 対象のため、バージョン管理には登録されません)、次を実行します。
cd mcp/che-word-mcp
swift test --filter RealWorldDocxRoundTripSmokeTests
フィクスチャごとのアサーションでは、xmllint --noout のエラーがないこと、ブックマーク/ハイパーリンク/fldSimple/AlternateContent の件数が一致すること、連結した <w:t> コンテンツの SHA256 が一致することを検証します。test-files/ が空の場合、テストは警告なしに XCTSkip するため、クリーンなクローンや CI で誤って失敗することはありません。PsychQuant/macdoc#81 の .note スモークテストパターンに倣っています。
他のソリューションとの比較
| 機能 | Anthropic Word MCP | python-docx | docx npm | che-word-mcp |
|---|---|---|---|---|
| 言語 | Node.js | Python | Node.js | Swift |
| バックエンド | AppleScript | OOXML | OOXML | OOXML |
| Word が必要 | はい | いいえ | いいえ | いいえ |
| ランタイム | Node.js | Python | Node.js | なし |
| 単一バイナリ | いいえ | いいえ | いいえ | はい |
| ツール数 | 約 10 | 該当なし | 該当なし | 233 |
| 画像 | 限定的 | はい | はい | はい |
| コメント | いいえ | 限定的 | 限定的 | はい |
| 変更履歴 | いいえ | いいえ | いいえ | はい |
| 目次 | いいえ | 限定的 | いいえ | はい |
| フォームフィールド | いいえ | いいえ | いいえ | はい |
パフォーマンス
Apple Silicon(M4 Max、128GB RAM)でのベンチマーク:
読み取りパフォーマンス
| ファイルサイズ | 時間 |
|---|---|
| 40 KB(ドキュメントのアウトライン) | 72 ms |
| 431 KB(複雑なドキュメント) | 31 ms |
書き込みパフォーマンス
| 操作 | 内容 | 時間 |
|---|---|---|
| 基本的な書き込み | 作成 + 3段落 + 保存 | 19 ms |
| 複雑なドキュメント | タイトル + 段落 + 表 + リスト | 21 ms |
| 一括書き込み | 50段落 + 保存 | 28 ms |
なぜこれほど高速なのか?
- ネイティブのSwiftバイナリ - インタープリターの起動オーバーヘッドがありません
- OOXMLを直接操作 - Microsoft Wordのプロセスを使用しません
- 効率的なZIP処理 - 圧縮にはZIPFoundationを使用します
- メモリ内での処理 - ディスクへの書き込みは保存時のみです
python-docx(起動に約200ms)やdocx npm(起動に約150ms)と比較して、che-word-mcpは10~20倍高速です。
ライセンス
MITライセンス
作者
Che Cheng(@PsychQuant)
コントリビューター
- @ildunari — セッション状態の管理(v1.17.0)
関連プロジェクト
- che-apple-mail-mcp - Apple Mail MCP サーバー
- che-ical-mcp - macOS Calendar MCP サーバー
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。