📝

textlintがMCP(Model Context Protocol)に実験的に対応したので早速試してみた

に公開

まずは自己紹介

はじめまして!TRUSTART株式会社でシニアマネージャーというロールを任されております片ノ坂 卓磨(かたのさか たくま)と申します。高専で情報工学を専攻して以来、一貫してIT分野に携わってきました。

今回のテーマ選定

所属会社の技術ブログの記事を執筆するにあたりお題について検討しました。やはり「時代はAI」ということで、AI活用に関する内容を記事にしたいと思いました。それからアンテナを張って情報収集をしていたところ2つの候補が見つかりました。

  1. textlintがMCP(Model Context Protocol)に実験的に対応したので早速試してみた
  2. emacsでvibe coding! gptelを導入してemacsでLLMを利用しよう!

今回はその中でも多くの人が利用しそうな1をテーマとして選択しました。2についてニーズがありそうなら、次回また自分が担当のする際に執筆したいと思います!リアクションお待ちしております!

前提知識

textlintとは?

読者の皆様、textlintというOSSをご存知でしょうか?

textlint logo

GitHubのリポジトリにあるREADMEにもあるように、プラグインを用いて拡張が可能な自然言語向けlintツールです。プログラミング言語向けの同様のツール(例:eslint、ruffなど)についてはよく知られていることかと思いますが、その自然言語版です。蛇足ですが、自然言語とは人間が会話や文書に利用する言語のことです。
LLMによる校正とは異なり静的解析であることから冪等性がある(同じテキストを何回解析かけても必ず同じ結果になる)ため、文章の品質を安定して向上することができます。

なお、作者が日本人なのもあって日本語のドキュメントが充実しており、とても導入が容易なOSSとなってます。

MCP(Model Context Protocol)とは?

MCPは言わば〈LLMのためのAPIインターフェースの統一規格〉です。公式サイトのイントロダクションの図(https://modelcontextprotocol.io/introduction)を見ていただくとわかりますが、MCPクライアント(Visual Studio Code、Claude、Cursorなどなど)とデータソースやWeb APIの橋渡しを行うためにMCPは存在しています。MCPの登場によって、いつものツールや自前のデータを利用をLLMが利用できるようになり、より便利により賢くLLMを利用できるようになりました。

General architecture

textlint × MCP

ここまでの内容をまとめると、「読者の皆様が普段利用されるLLM(ChatGPT、Gemini、Copilotなどなど)がエディタなどのMCPクライアントを通してtextlintを操作することができるようになる」という話になります。
従来まではbashやzshなどのコマンドラインインターフェース(以下、CLI)からコマンドを用いてツールを動かしていました。これからの時代は自然言語で操作するように徐々に変わっていくのだなってことを感じさせられますね。

実際にやってみた

説明はここまでとして、参考文献の内容をもとに実際に自分の環境に導入してみました!

1. 検証環境

端末は会社支給の端末、ツールのバージョンは執筆時点(2025/06/16)での最新安定版としています。なお、ツールのチョイスは自分の好みです。

  • 端末
    • MacBook Pro(14インチ、11月 2023)
      • CPU Apple M3 Pro
      • メモリ 36 GB
      • macOS 14.7.3(23H417)
  • ランタイムバージョン管理
    • mise
      • 2025.6.4 macos-arm64 (2025-06-13)
  • JavaScript実行環境
    • node.js
      • 22.16.0
    • pnpm
      • 10.12.1
  • MCPクライアント(エディタ)
    • Visual Studio Code(以下、VSCode)
      • 1.101.0

2. 手順

miseの導入方法については本記事では割愛します。詳細は公式サイト(https://mise.jdx.dev/getting-started.html)をご覧ください。

2.1. node.jsのインストール

node.jsの最新安定版については公式サイト(https://nodejs.org/ja/about/previous-releases)に記載があります。LTS版は22、マイナーバージョンについては執筆時点で16だったので、22.16.0を選択します。

以下のコマンドでmiseがサポートしているnode.jsのバージョンを確認します。
バージョン一覧が表示されるので、その中に22.16.0が存在することを確認します。

mise ls-remote node

確認が取れたので、実際にインストールします。

mise install node@22.16.0

今回textlintを導入するリポジトリでランタイムバージョンを固定化たいため、以下のコマンドを用いて mise.toml を作成します。

mise use node@22.16.0

2.2. pnpmのインストール

pnpm(https://pnpm.io/ja/)についても同様に最新バージョンがmiseで使えるか確認します。

mise ls-remote pnpm

確認が取れたので、実際にインストールします。

mise install pnpm@10.12.1

こちらもnode.jsと同様に固定化します。

mise use pnpm@10.12.1

この時点で mise.toml の内容は以下のようになっています。

[tools]
node = "22.16.0"
pnpm = "10.12.1"

2.3. textlintのインストール

ランライムとパッケージ管理の準備が整ったので実際にtextlintをインストールします。pnpmはnpmとコマンドを似せてくれているので、参考文献のコマンドのnpmの箇所をpnpmに書き換えるだけで良いです。なお、参考文献ではtextlintのインストールに合わせて日本語技術文書向けのプラグイン textlint-rule-preset-ja-technical-writing を一緒にインストールするようになっています。

pnpm install --save-dev textlint textlint-rule-preset-ja-technical-writing

以下のようなログが流れて無事インストールができました。

Downloading kuromoji@0.1.2: 21.83 MB/21.83 MB, done
Packages: +464
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 464, reused 0, downloaded 464, added 464, done

devDependencies:
+ textlint 14.8.4
+ textlint-rule-preset-ja-technical-writing 12.0.2

Done in 10.2s using pnpm v10.12.1

2.4. textlintの設定ファイル作成

設定ファイルの作成はnpxコマンドを用います。これは参考文献に記載のコマンドと同じですね。

npx textlint --init

実行すると、プロジェクトルートに .textlintrc.json が作成されます。今回は更なるプラグインの追加はしません。ですが、プラグインとインストールしてこのファイルを更新することでtextlintを拡張することができます。

{
  "plugins": {},
  "filters": {},
  "rules": {
    "preset-ja-technical-writing": true
  }
}

ここまでの手順にてCLI上で動作する状態になっています。正しくインストールおよび設定ができているのかを試してみましょう。

npx textlint README.md

ちなみに、今回の対象文書では以下のような結果になっています。

   50:42  error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period
   54:5   error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period
   83:14  error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period
   87:24  error    一文に二回以上利用されている助詞 "に" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- "に"
- "に"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
                ja-technical-writing/no-doubled-joshi
   87:28  error    Cannot find a pairing character for (.
                    
You should close this sentence with ).
This pair of marks is called 丸括弧()                                                                     ja-technical-writing/no-unmatched-pair
   97:36  error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period
  132:36  error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period
  208:15  error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period
  220:20  error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period
  265:52  ✓ error  【dict2】 "することができます"は冗長な表現です。"することが"を省き簡潔な表現にすると文章が明瞭になります。
解説: https://github.com/textlint-ja/textlint-rule-ja-no-redundant-expression#dict2  ja-technical-writing/ja-no-redundant-expression
  266:75  ✓ error  【dict2】 "することができます"は冗長な表現です。"することが"を省き簡潔な表現にすると文章が明瞭になります。
解説: https://github.com/textlint-ja/textlint-rule-ja-no-redundant-expression#dict2  ja-technical-writing/ja-no-redundant-expression
  287:27  error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period
  291:10  error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period
  305:25  error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period
  312:30  error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period
  316:45  error    文末が"。"で終わっていません。                                                                              ja-technical-writing/ja-no-mixed-period

✖ 16 problems (16 errors, 0 warnings)2 fixable problems.
Try to run: $ textlint --fix [file]

2.5. VSCode向けMCP設定

MCPの設定のため、.vscode/mcp.json を参考文献の内容に倣って作成します。

{
  "servers": {
    "textlint": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "textlint",
        "--mcp"
      ]
    }
  }
}

2.6. チャットを使ってtextlintを動かしてみる

実際にVSCodeのCopilot Chatを使ってtextlintを動かしてみましょう!
2025年6月27日追記:AgentModeを使わない場合はコンテキストにtextlintを加える必要があるみたいです。

チャットを使ってtextlintを動かしてみる

無事に動作したようなのでREADME.mdに反映します!

コードに反映

念のため、検証のためCLIでも動かして確かめてみましょう。

npx textlint README.md

2つのfixable problemsと何か1つが修正されたみたいですねー。

    5:144  error  箇条書き: "である"調 でなければなりません
=> "である"調 であるべき箇所に、次の "ですます"調 の箇所があります: "です。"
Total:
である  : 0
ですます: 5
                  ja-technical-writing/no-mix-dearu-desumasu
   35:24   error  文末が"。"で終わっていません。                                                                ja-technical-writing/ja-no-mixed-period
   38:24   error  文末が"。"で終わっていません。                                                                ja-technical-writing/ja-no-mixed-period
   83:14   error  文末が"。"で終わっていません。                                                                ja-technical-writing/ja-no-mixed-period
   87:24   error  一文に二回以上利用されている助詞 "に" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- "に"
- "に"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
  ja-technical-writing/no-doubled-joshi
   97:36   error  文末が"。"で終わっていません。                                                                ja-technical-writing/ja-no-mixed-period
  122:34   error  箇条書き: "である"調 でなければなりません
=> "である"調 であるべき箇所に、次の "ですます"調 の箇所があります: "ます。"
Total:
である  : 0
ですます: 5
                  ja-technical-writing/no-mix-dearu-desumasu
  133:38   error  文末が"。"で終わっていません。                                                                ja-technical-writing/ja-no-mixed-period
  218:14   error  文末が"。"で終わっていません。                                                                ja-technical-writing/ja-no-mixed-period
  230:19   error  文末が"。"で終わっていません。                                                                ja-technical-writing/ja-no-mixed-period
  267:13   error  箇条書き: "である"調 でなければなりません
=> "である"調 であるべき箇所に、次の "ですます"調 の箇所があります: "ます。"
Total:
である  : 0
ですます: 5
                  ja-technical-writing/no-mix-dearu-desumasu
  287:50   error  箇条書き: "である"調 でなければなりません
=> "である"調 であるべき箇所に、次の "ですます"調 の箇所があります: "ます。"
Total:
である  : 0
ですます: 5
                  ja-technical-writing/no-mix-dearu-desumasu
  288:69   error  箇条書き: "である"調 でなければなりません
=> "である"調 であるべき箇所に、次の "ですます"調 の箇所があります: "ます。"
Total:
である  : 0
ですます: 5
                  ja-technical-writing/no-mix-dearu-desumasu

✖ 13 problems (13 errors, 0 warnings)

参考文献

最後に

TRUSTART株式会社は、一緒に働くメンバーを募集しています!インターンメンバーも大募集中です!
興味をお持ちいただけた方は、ぜひ弊社の採用ページをご確認ください。

https://www.trustart.co.jp/recruit/

TRUSTARTテックブログ

Discussion