Word について
WordMcpは、Windows上のMicrosoft Wordを自動操作するAIアシスタント向けMCPサーバーです。文書編集から構成、レイアウト、レビューまで扱います。
主な機能
- 01文書の作成、開閉、保存、エクスポート
- 02テキストの取得、検索、置換、書式設定
- 03段落、表、画像の管理
- 04スタイル、リスト、ヘッダー、フッター、ページレイアウトの設定
- 05コメント、変更履歴、ブックマーク、脚注の処理
活用シーン
- 01文書のテキストと書式の編集
- 02表、画像、文書構成の管理
- 03変更履歴の確認とコメントの管理
- 04文書のPDF出力
MCP 対応
stdio経由でMCPクライアントにWord操作ツールを提供します。WindowsとローカルのMicrosoft Wordが必要です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
WordMcp — Microsoft Word MCP サーバー
AI アシスタントが COM オートメーションを通じて Microsoft Word for Windows を操作できる MCP サーバーです。ドキュメントを開き、テキストを読み取って編集し、段落や表を管理し、ドキュメントのプロパティを設定して PDF にエクスポートできます。
Windows 専用です。 Microsoft Word のローカルインストールが必要です。このサーバーは実際のアプリケーションを自動操作するもので、
.docxファイルを解析するものではありません。
要件
| OS | Windows 10/11 |
| ランタイム | .NET 9 SDK またはランタイム |
| Office | Microsoft Word 2016 以降(デスクトップ版。Microsoft Store 版は対象外) |
インストール
VS Code
vscode-extension/ にある軽量な拡張機能がサーバーを VS Code に登録するため、手動で設定する必要はありません。サーバーは同梱されず、dnx 経由で起動されるため、拡張機能を新たにリリースしなくてもサーバーが更新されます。
チェックアウトしたソースからビルドしてインストールします。
cd vscode-extension
npx @vscode/vsce package
code --install-extension word-mcp-0.1.0.vsix
その後、コマンドパレットから MCP: List Servers を実行し、Word を起動します。
.NET ツールとして
dotnet tool install --global WordMcp.McpServer
これで、ツールを mcp-word として使用できます。
mcp-word --version
mcp-word --help
後で更新または削除するには、次のコマンドを実行します。
dotnet tool update --global WordMcp.McpServer
dotnet tool uninstall --global WordMcp.McpServer
未リリースのビルドを実行するには、ローカルでパッケージ化し、出力フォルダーからインストールします。
dotnet pack src\WordMcp.McpServer\WordMcp.McpServer.csproj -c Release -o artifacts
dotnet tool install --global --add-source .\artifacts WordMcp.McpServer
インストールせずに使用する
サーバーは io.github.trsdn/mcp-server-word として MCP レジストリに登録されています。パッケージを自分で解決するクライアントは、dnx 経由で実行できます。これにより、グローバルツールとして保持せず、必要に応じてバージョンを取得します。
{
"servers": {
"word": {
"type": "stdio",
"command": "dnx",
"args": ["[email protected]", "--yes"]
}
}
}
クライアントの設定
サーバーは stdio を使用します。
VS Code / GitHub Copilot
.vscode/mcp.json:
{
"servers": {
"word": {
"type": "stdio",
"command": "mcp-word"
}
}
}
Claude Desktop
%APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"word": {
"command": "mcp-word"
}
}
}
Copilot CLI
copilot mcp add word --command mcp-word
概念
すべての操作は セッション 内で実行されます。セッションは 1 つの Word インスタンスと 1 つの開いているドキュメントを管理し、word-a1b2c3d4e5f6g のような session_id で識別されます。
file(open|create) ──► session_id ──► text / paragraph / table / document ──► file(save) ──► file(close)
- パスは絶対パスで指定する必要があります(
C:\Users\me\Documents\report.docx)。 - 対応している入力形式:
.docx、.docm、.doc、.dotx、.dotm、.rtf。 - ドキュメントは Word ですでに開かれていない必要があります。WordMcp には排他的なアクセスが必要です。
- Word はバックグラウンドで非表示のまま実行され、セッションが閉じられると終了します。
セッションサービス
通常、セッションは MCP サーバープロセス内で管理され、そのプロセスとともに終了します。オプションのバックグラウンドデーモンである WordMcp.Service.exe を使うと、代わりにセッションを保持できるため、クライアントを再起動してもセッションが維持され、複数のクライアントで共有できます。
WordMcp.Service.exe --daemon [--idle-minutes 30] # listen until idle or stopped
WordMcp.Service.exe --status # what is it doing?
WordMcp.Service.exe --stop # save open documents and exit
手動で起動する必要はほとんどありません。このサービスを使用するよう設定されたクライアントが、必要に応じて起動します。サービスが待ち受けるパイプには SID が埋め込まれ、その SID に ACL が設定されているため、アカウント間でセッションが共有されることはありません。アイドルタイムアウトの間、セッションが一度も開かれないと、サービスは自動的に終了します。
使用するには、MCP サーバーに WORDMCP_SERVICE_MODE=daemon を設定します。以降、すべてのツール呼び出しはサーバー自身のプロセスではなく、デーモンに送信されます。設定しない場合、サーバーがセッションを自身で管理します。これは単一のクライアントで使用する場合に適しており、別プロセスの起動や起動待ちが不要です。
ツール
action パラメーターを持つ 17 個のツールがあります。
file — セッションのライフサイクル
| アクション | 目的 |
|---|---|
open | 既存のドキュメントを開いてセッションを開始します |
create | path に新しいドキュメントを作成します |
save | 開いているドキュメントを保存します |
close | (必要に応じて)保存し、セッションを閉じます |
list | アクティブなセッションをすべて一覧表示します |
test | このマシンで Word を自動操作できるか確認します |
file(action: "open", path: "C:\\Users\\me\\Documents\\report.docx")
// → { "sessionId": "word-a1b2c3d4e5f6g", "fileName": "report.docx", ... }
text — コンテンツ
| アクション | 目的 |
|---|---|
get | テキスト全体または文字範囲(start、end、max_length)を読み取ります |
append | テキストを追加します。必要に応じて新しい段落として追加できます |
find | 用語を検索します。位置と前後のコンテキストを返します |
replace | 該当箇所を置換します(match_case、match_whole_word、replace_all) |
format | 範囲に bold、italic、underline、font_name、font_size、color を適用します |
get と find が返す文字位置は、Word の範囲オフセットです。
paragraph — 構造
| アクション | 目的 |
|---|---|
list | インデックス、テキスト、スタイル、配置、アウトラインレベルを含む段落の一覧を表示します |
add | 段落を追加します。必要に応じて style を指定できます |
insert | 指定したインデックスの前に段落を挿入します |
delete | インデックスを指定して段落を削除します |
set-style | Heading 1 などのスタイルを適用します |
set-alignment | left、center、right、justify を指定します |
段落のインデックスは、Word と同じく 1 始まりです。
table — テーブル
| アクション | 目的 |
|---|---|
list | サイズとスタイルを含むテーブルの一覧を表示します |
create | rows × columns のテーブルを作成します |
read | テーブルのすべてのセルを行/列のマトリックスとして読み取ります |
set-cell | 単一のセルに書き込みます(row、column、text) |
add-row | 行を追加します |
delete-row | 行を削除します |
set-style | Table Grid などのテーブルスタイルを適用します |
document — メタデータとエクスポート
| アクション | 目的 |
|---|---|
get-info | Word、文字数、段落数、ページ数、テーブル数、セクション数 |
get-properties | タイトル、作成者、件名、キーワード、コメント、会社名 |
set-properties | これらの組み込みプロパティを更新します |
export-pdf | 開いているドキュメントに影響を与えずに PDF にエクスポートします |
save-as | 別の形式でコピーを保存します |
image — 画像
| アクション | 目的 |
|---|---|
list | インデックス、サイズ、代替テキスト、リンク状態を含むインライン画像の一覧を表示します |
insert | 画像を挿入します。必要に応じて width、height、caption、alt_text を指定できます |
resize | width/height または scale_percent でサイズを変更します |
replace | インデックスの画像を差し替えます。デフォルトではサイズを維持します |
delete | インデックスを指定して画像を削除します |
set-alt-text | アクセシビリティのための代替テキストを設定します |
field — フィールドと目次
| アクション | 目的 |
|---|---|
list | インデックス、種類、フィールドコードを含むすべてのフィールドの一覧を表示します |
insert-toc | 目次を挿入します(upper_heading_level、lower_heading_level) |
update-toc | すべての目次を再計算します |
update-all | ヘッダーとフッター内のものを含め、すべてのフィールドを更新します |
insert-page-number | ヘッダーまたはフッターにページ番号を追加します |
section — セクションとページ設定
| アクション | 目的 |
|---|---|
list | 開始の種類、余白、用紙サイズ、向きを含むすべてのセクションの一覧を表示します |
add | セクション区切りを挿入します(start_type:next-page、continuous、even-page、odd-page) |
page-setup | 1 つのセクションまたはドキュメント全体の余白、orientation、paper_size を設定します |
header-footer — ヘッダーとフッター
| アクション | 目的 |
|---|---|
get | 1 つのセクションまたはすべてのセクションのヘッダーまたはフッターを読み取ります |
set | テキストを書き込みます。必要に応じて alignment を指定できます |
clear | ヘッダーまたはフッターを空にします |
kind で header または footer を選択し、type で primary、first-page、または even-pages を選択します。
style — スタイル
| アクション | 目的 |
|---|---|
list | スタイルの一覧を表示します。デフォルトではドキュメントで使用されているもののみが対象です |
create | カスタムスタイルを追加します。必要に応じて既存のスタイルを基にできます |
modify | スタイルのフォントと段落書式を変更します |
delete | カスタムスタイルを削除します |
style_type で paragraph、character、table、または list を選択します。ローカライズ版 Word では 370 を超える項目がある全スタイルを取得するには、list に in_use_only: false を渡します。
style(action: "create", session_id: "...", name: "Callout", base_style: "Normal")
style(action: "modify", session_id: "...", name: "Callout",
font_size: 11, bold: true, color: "#C00000", space_after: 12)
list — 箇条書きと番号付け
| Action | Purpose |
|---|---|
get | 箇条書きや番号をレンダリングしたものも含め、段落のリスト書式を報告します |
apply | 段落範囲を bullet、number、outline-number のリストとして書式設定します |
set-level | 段落範囲のリストレベルを設定します(1~9) |
restart | 段落から番号付けをやり直します |
remove | リスト書式を解除します |
end_index を省略すると、アクションは start_index のみに適用されます。
list(action: "apply", session_id: "...", start_index: 2, end_index: 5, list_type: "number")
list(action: "set-level", session_id: "...", start_index: 3, end_index: 4, level: 2)
list(action: "restart", session_id: "...", start_index: 6)
comment — レビューコメント
| Action | Purpose |
|---|---|
list | 作成者、日付、テキスト、コメント対象のテキストとともにコメントを一覧表示します |
add | 段落、または段落内の語句にコメントを付けます |
resolve | コメントを完了としてマークするか、再オープンします |
delete | コメントを削除します |
anchor_text で段落内の語句を指定しない場合、add は段落全体にコメントします。delete の後はインデックスがずれるため、2つ目のコメントを削除する前にもう一度一覧表示してください。
comment(action: "add", session_id: "...", paragraph_index: 4,
text: "Source?", anchor_text: "fifteen percent")
comment(action: "list", session_id: "...", unresolved_only: true)
revision — 変更履歴
| Action | Purpose |
|---|---|
list | 変更履歴を一覧表示し、変更履歴の記録が有効かどうかを報告します |
accept | 1つの変更、またはすべての変更を承諾します |
reject | 1つの変更、またはすべての変更を却下します |
set-tracking | 変更履歴の記録を有効または無効にします |
accept/reject で index を省略すると、ヘッダーとフッターを含むドキュメント全体が対象になります。
revision(action: "set-tracking", session_id: "...", enabled: true)
revision(action: "accept", session_id: "...")
bookmark — 安定した参照
| Action | Purpose |
|---|---|
list | 名前、段落インデックス、マークしたテキストのプレビューとともにブックマークを一覧表示します |
add | 段落、段落範囲、または段落内の語句にブックマークを設定します |
get-text | ブックマークしたテキスト全体を読み取ります |
delete | ブックマークを削除します。テキストは残ります |
名前は英字で始める必要があり、英字、数字、アンダースコアのみを使用できます。ブックマークはドキュメント内の別の場所を編集しても維持されるため、段落インデックスがずれた後に特定の箇所を参照し直す際の確実な方法です。
bookmark(action: "add", session_id: "...", name: "Intro", paragraph_index: 2)
bookmark(action: "add", session_id: "...", name: "Growth",
paragraph_index: 4, anchor_text: "fifteen percent")
bookmark(action: "get-text", session_id: "...", name: "Intro")
footnote — 脚注と文末脚注
| Action | Purpose |
|---|---|
list | インデックス、参照記号、段落、テキストとともに脚注または文末脚注を一覧表示します |
add | 段落、または段落内の語句に注を付けます |
set-text | 注のテキストを書き換えます |
delete | 参照記号とともに注を削除します |
kind は footnote(デフォルト)または endnote を選択します。Word では両者は独立して番号付けされる別々のコレクションです。脚注のテキストにアクセスする唯一の方法です。text(get) は本文ストーリーを返し、注は返しません。
footnote(action: "list", session_id: "...")
footnote(action: "add", session_id: "...", paragraph_index: 4,
text: "Annual report 2025, p. 14.", anchor_text: "fifteen percent")
footnote(action: "add", session_id: "...", paragraph_index: 4,
text: "Method described in appendix B.", kind: "endnote")
content-control — テンプレートフィールド
| Action | Purpose |
|---|---|
list | タグ、タイトル、種類、ロック状態、現在のテキストとともにコンテンツコントロールを一覧表示します |
get | tag または id で指定したコントロールを読み取ります |
set-text | コントロールに値を入力します。チェックボックスコントロールでは is_checked を使用します |
add | 段落を新しいコントロールで囲みます |
delete | 必要に応じて内容も含めてコントロールを削除します |
コンテンツコントロールは、Word テンプレートが公開する構造化フィールドです。テンプレートを完成させるには、これらに値を入力するのが確実な方法です。周囲のテキストに対する text(replace) はコントロールとそのバインドを破壊します。tag は一意ではなく、一致するすべての項目を更新します。これは、テンプレート内でフィールドを繰り返し使う場合に想定される動作です。id は特定のコントロールを1つだけ指定します。
content-control(action: "list", session_id: "...")
content-control(action: "set-text", session_id: "...",
tag: "CustomerName", text: "Contoso Ltd")
content-control(action: "set-text", session_id: "...",
tag: "TermsAccepted", is_checked: true)
content-control(action: "delete", session_id: "...", tag: "Draft",
delete_contents: true)
screenshot — ページを確認する
| Action | Purpose |
|---|---|
page | ページを PNG としてレンダリングします |
ページ区切り、表の幅、画像の配置、ヘッダーの位置といったレイアウトに関する疑問は、寸法から判断するより、レンダリングされたページを見たほうがはるかに簡単に解決できます。PNG はファイルに書き出され、そのパスが返されます。include_image: true を指定すると、さらに base64 形式でインライン返却されます。画像を実際に確認する場合にのみ、コンテキストを使う価値があります。
dpi のデフォルトは 150 です。手早くレイアウトを確認する場合は 96、印刷に近い表示にする場合は 300 を使用してください。
screenshot(action: "page", session_id: "...", page: 2)
screenshot(action: "page", session_id: "...", page: 1,
output_path: "C:/temp/page1.png", dpi: 300, include_image: true)
レスポンス
すべてのツールは JSON を返します。失敗は構造化されたペイロードとして報告され、トランスポートエラーにはなりません。
{
"success": false,
"isError": true,
"tool": "text",
"action": "Replace",
"errorType": "KeyNotFoundException",
"errorMessage": "Session 'word-unknown' not found."
}
既知の動作と注意点
document(save-as)も元のファイルを保存します。 Wordには形式を変更する「コピーを保存」APIがありません。PDF以外を対象にする場合、サーバーはSaveAs2(target)を呼び出してからSaveAs2(original)を呼び出します。その副作用として、保留中の変更が元のファイルに保存されます。副作用のないエクスポートが必要な場合は、export-pdfを使用してください。- 色は16進数のRGB形式です(
#0078D4)。サーバーはWordが要求するBGR値に変換します。 - 権利保護されたドキュメント(IRM/AIP)は、Wordの起動前に拒否されます。
- Wordで開いているドキュメントはセッションをブロックします — 先に閉じてください。
- Wordのダイアログが自動化を停止させます。 呼び出しがタイムアウトした場合は、デスクトップに開いているダイアログがないか確認してください。
- スタイル名は英語です。 組み込みスタイル(
Heading 1、Title、Table Gridなど)は、Wordの言語に依存しないスタイルIDに変換されるため、ローカライズされたインストール環境でも機能します。それ以外の名前はそのままWordに渡され、カスタムスタイルやローカライズされたスタイルを指定できます。Wordはスタイルをローカライズされた名前(ドイツ語環境ではÜberschrift 1)で返すため、style(list)はnameとenglish_nameの両方を返します。english_nameがある場合は、それを指定し直してください。 - 組み込みスタイルは削除できません。
style(delete)はWordの汎用COMエラーをそのまま返すのではなく、明確なメッセージを返して削除を拒否します。段落に適用中のカスタムスタイルも削除できません。先にその段落を別のスタイルに設定してください。 - 新しいドキュメントはWordを介さず、直接書き込まれます。
file(create)は空の.docx/.docmパッケージを自ら作成してから開きます。Wordを介してドキュメントを作成する方法は、Microsoft 365にサインインしているマシンでは信頼性がありません。AutoSaveが新しいドキュメントをOneDriveに割り当て、指定されたローカルパスを黙って無視するためです。 - 結合された表のセルは、
table(read)によって空文字列として返されます。 - 画像のサイズはピクセルではなくポイント単位です(72 pt = 1インチ)。
image(insert)とimage(resize)は、lock_aspect_ratioがfalseに設定されていない限り、縦横比を維持します。そのため、widthだけを渡すと高さも連動して拡大縮小されます。 imageが対象とするのはインライン画像のみです。 回り込み図形、テキストボックス、グラフは変更されず、image(list)にも表示されません。そのため、これらがあっても画像のインデックスはずれません。- 目次に表示されるのは見出し段落のみです。 見出しスタイルがないドキュメントでは、
field(insert-toc)はentry_count: 0を返します。まずparagraph(add|set-style)でHeading 1/Heading 2を適用し、その後field(update-toc)を実行してください。 field(update-all)はヘッダーとフッターも処理します。 WordのDocument.Fieldsが対象とするのは本文のみです。そのため、これを行わないとページ番号は更新されません。- キャプション付きの
image(insert)はWordのキャプション番号を使用します。 そのため、キャプションはFigure 1 <your text>の形式になり(英語以外のインストール環境ではローカライズされます)、図表目次の対象になります。 - ページ余白を含むすべての寸法はポイント単位です(1 cm = 28.35 pt、1インチ = 72 pt)。
section(page-setup)は余白より先にpaper_sizeを適用します。 Wordでは用紙サイズを変更すると余白がリセットされるためです。section_indexを指定しない場合、設定はすべてのセクションに適用されます。- ヘッダーとフッターはセクション間で引き継がれます。 新しいセクションには、何かを書き込むまで前のセクションのヘッダーが表示されます。
section_indexを指定してheader-footer(set)を呼び出すと、そのリンクが自動的に解除されるため、セクション1には独自のテキストが保持されます。 first-pageヘッダーとeven-pagesヘッダーには、セクションの切り替えが必要です。header-footer(set)はDifferentFirstPageまたはDifferentOddEvenPagesを自動的に有効にします。有効にしないと、Wordはテキストを保存しても表示しません。list(apply)はデフォルトで新しいリストを開始します。 意図しないことが多いため、continue_previous_listは無効になっています。通常の段落で区切られた2つの番号付きリストは独立したままです。それでもWordが結合する場合は、list(restart)を使用してください。- 異なるレベルを表示できるのはアウトライン番号付きリストのみです。
list(set-level)はどのリストにも使用できますが、通常のbulletまたはnumberリストでは、どのレベルでも同じマーカーが表示され、段落のインデントだけが変わります。 - Microsoft 365では
comment(resolve)が失敗することがよくあります。 Wordの最新のコメント機能では、APIで追加されたコメントはすべて未投稿の下書きとして扱われ、下書きは完了済みにできません。サーバーはその旨を明確なメッセージで報告するため、代わりにコメントを削除してください。状態を公開しないインストール環境では、comment(list)はresolved: nullを返します。 - コメントとリビジョンのインデックスは変動します。 コメントを削除したり、リビジョンを1つ承認したりすると、それ以降のすべての番号が振り直されます。そのため、古いインデックスを再利用せず、これらの呼び出しの間にもう一度
listを実行してください。 - インデックスを指定しない
revision(accept|reject)も、ヘッダーとフッターを処理します。 WordのDocument.AcceptAllRevisions()が対象とするのは本文のみで、field(update-all)と同じ制限があります。 - 変更履歴が記録されるのは、変更履歴の記録が有効な間だけです。
revision(set-tracking)は遡って適用されません。記録したい編集を行う前に有効にしてください。 - ブックマーク名にはWordの制約があります。 先頭は英字でなければならず、使用できるのは英字、数字、アンダースコアのみで、長さは40文字までです。スペース、ハイフン、ピリオド、非ASCII文字の英字は、Wordに呼び出しが届く前に拒否されます。Wordに渡した場合は汎用COMエラーになります。
- 文章を安定して参照するには、ブックマークを使うのが確実です。 段落のインデックスは挿入のたびに変わりますが、ブックマークは変わりません。文章に一度ブックマークを設定すれば、後で
bookmark(get-text)を使って再取得できます。 - 段落に対する
bookmark(add)は段落記号を含みません。 そのため、get-textは末尾に改行のないテキストを返します。複数の段落にまたがるブックマークには、その間の段落記号が含まれます。 text(get)は脚注を返しません。 脚注と文末脚注はWord内で独自のストーリーに格納されるため、注に出典が記載されたドキュメントでは、内容の一部が欠けたままでも全体がそろっているように見えることがあります。要約や翻訳を行う前に、footnote(list)を呼び出してください。- 注を削除すると、残りの番号が振り直されます。
footnote(delete)は後続するすべてのインデックスを1つずつ減らします。これはコメントやリビジョンと同じ落とし穴です。複数の注を削除する場合は、インデックスの大きいものから順に処理してください。 - 脚注と文末脚注は別々のコレクションです。 番号はそれぞれ独立しており、すべての
footnoteアクションはデフォルトで脚注を対象とします。文末脚注を対象にするには、kind: "endnote"を明示的に渡してください。 - テンプレートへの入力には
text(replace)ではなく、content-control(set-text)を使用します。 コンテンツコントロールの周囲のテキストを置き換えると、コントロールとそのデータバインドが壊れます。コントロールを通じて書き込めば、両方を維持できます。 - コンテンツコントロールのタグは一意ではありません。
tagを指定したcontent-control(set-text)は、一致するすべてのコントロールを更新し、その数を報告します。テンプレートでは、ヘッダーと署名欄の両方に顧客名を表示するために、まさにその動作が必要です。特定のコントロールを1つだけ対象にする場合は、idを使用してください。 content-control(delete)はデフォルトでテキストを保持します。 コントロールとともに内容も削除するのは、delete_contents: trueの場合のみです。削除がロックされたコントロールは、黙ってスキップされずに報告されます。screenshot(page)はPDFを使ってレンダリングします。 Wordにはページを画像として返すAPIがないため、サーバーはExportAsFixedFormatで指定した1ページをエクスポートし、ラスター化します。未保存の変更も含まれ、一時PDFはその後削除されます。- ページ番号は最新の再ページ設定に基づきます。 自動化を通じて編集しただけのドキュメントでは、古いページ数が返されるため、
screenshotは先に再ページ設定を行います。したがって、ページ数はドキュメントを開いた時点ではなく、現在のレイアウトを反映します。
ソースからのビルド
git clone https://github.com/trsdn/mcp-server-word.git
cd mcp-server-word
dotnet build WordMcp.sln -c Release
dotnet test WordMcp.sln --filter "Category!=RequiresWord"
プロジェクト構成
| プロジェクト | 目的 |
|---|---|
src/WordMcp.ComInterop | Word COM のライフサイクル:STA スレッド処理、セッション、OLE メッセージフィルター、ファイルの検証 |
src/WordMcp.Core | コマンドインターフェイス、コマンド実装、結果モデル |
src/WordMcp.Generators.Shared | ジェネレーター間で共有されるソースファイル。独立したプロジェクトではありません |
src/WordMcp.Generators.Mcp | MCP ツールクラスを生成する Roslyn ソースジェネレーター |
src/WordMcp.McpServer | 15 個のツールを公開する stdio MCP サーバー |
tests/WordMcp.Core.Tests | ユニットテストと実際の Word を使った統合テスト |
tests/WordMcp.McpServer.Tests | ツール層のユニットテスト。Word は不要です |
生成されるツール層
15 個のツールのうち 14 個はビルド時に生成されます。
src/WordMcp.Core/Commands 内のコマンドインターフェイスが、ワイヤーコントラクトの唯一の信頼できる情報源です。
[ServiceCategory("section", "Section")]はツールクラスWordSectionToolの名前を指定します。[McpTool("section", Title = ..., Description = ...)]はツール名と、モデルが読むプロンプトを指定します。- 各メソッドの
[ServiceAction("page-setup")]は、生成されるWordSectionAction列挙型の値になります。 - インターフェイスのパラメーターに記述された XML ドキュメントは、MCP スキーマのパラメーター説明になります。
ジェネレーターはすべてのアクションのパラメーターを 1 つのメソッドにまとめるため、一部のアクションでしか使用されないパラメーターはオプションとして出力されます。API を変更する場合は、インターフェイスを編集してください。生成されたコードは編集しないでください。file はセッションを管理し、単一のセッションに対する操作ではないため、手書きのままです。
生成されたコードは src/WordMcp.McpServer/obj/generated で確認できます。
GeneratedToolContractTests のテストでは、生成されたインターフェイスと元のインターフェイスを照合します。そのため、不一致があるとクライアントに届く前にビルドが失敗します。
実際の Word のインストールが必要なテストには [Trait("Category", "RequiresWord")] が付けられており、CI では除外されます。統合テストが失敗すると、孤立した WINWORD.EXE プロセスが残ることがあります。これらのプロセスは後続の実行を遅らせたり、妨げたりするため、再実行する前に Get-Process WINWORD | Stop-Process -Force で終了してください。
参考資料
| ドキュメント | 内容 |
|---|---|
| docs/architecture.md | レイヤー構成、リクエストの流れ、ツール層の生成方法 |
| docs/com-interop.md | STA スレッド処理、COM オブジェクトの解放、前述の問題の背景にある Word の挙動 |
| CONTRIBUTING.md | ビルド、テスト、ツールの追加、リリースの作成 |
| skills/word-mcp/SKILL.md | ツールを適切な順序で使用するための、エージェント向けガイド |
トラブルシューティング
| 症状 | 原因と対処法 |
|---|---|
Word is not installed or not registered for COM | Word デスクトップ版をインストールしてください。Microsoft Store 版は自動化できません |
Could not load file or assembly 'office' | GAC に office.dll が見つかりません。Office を再インストールするか、修復してください |
| 操作がタイムアウトする | Word のダイアログが入力待ちになっています。ダイアログを閉じて再試行してください |
The file is already open in Word | Word の UI でドキュメントを閉じてください |
コントリビューション
バグ報告や機能のリクエストは、issue templates からお寄せください。 プルリクエストも歓迎します。CONTRIBUTING.md では、ビルド方法、テストスイートの 2 つの部分の実行方法、ツールの追加に必要な作業について説明しています。
まず Code of Conduct をお読みください。
セキュリティ上の問題を公開 issue として報告しないでください。security policy の説明に従って、非公開で報告してください。
ライセンス
MIT — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。