mcpField
R
Rustpad MCP Server

Rustpad MCP Server

ローカル
rustpad-mcp.ni-c.de生産性01 日前に更新

Rustpad MCP Server について

Rustpad MCP Server は、MCP クライアントをセルフホスト型の共同編集テキストエディター Rustpad に接続します。読み取りと部分編集に対応し、操作変換で同時編集を保ちながら、破壊的な操作を保護します。

主な機能

  1. 01ドキュメント内容とメタデータの読み取り
  2. 02ドキュメントの作成と置換
  3. 03OT による追記と検索置換
  4. 04共同編集者の同時編集を保持
  5. 05破壊的編集時の人による確認
  6. 06ツール選択または読み取り専用設定

活用シーン

  1. 01共有 Rustpad ドキュメントの読み取り
  2. 02他の人が編集中のパッドにメモを追記
  3. 03必要な確認を経てドキュメント内のテキストを置換

MCP 対応

Rustpad のドキュメントおよびサーバー操作を MCP ツールとして公開します。読み取りには HTTP API、書き込みには WebSocket の操作変換プロトコルを使います。ツールを絞り込め、破壊的編集には人の確認、または二回呼び出すトークン方式が必要です。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"ni-c-rustpad": {
"command": "npx",
"args": [
"-y",
"rustpad-mcp"
],
"env": {
"RUSTPAD_URL": "<RUSTPAD_URL>",
"RUSTPAD_READ_ONLY": "<RUSTPAD_READ_ONLY>",
"RUSTPAD_INSECURE_TLS": "<RUSTPAD_INSECURE_TLS>",
"RUSTPAD_ALLOW_TOOLS": "<RUSTPAD_ALLOW_TOOLS>",
"RUSTPAD_DENY_TOOLS": "<RUSTPAD_DENY_TOOLS>"
}
}
}
}
起動コマンドnpx -y rustpad-mcp
設定が必要な環境変数
RUSTPAD_URLBase URL of the Rustpad instance, e.g. https://rustpad.example.net
RUSTPAD_READ_ONLYExactly 'true' registers only the 3 read tools
RUSTPAD_INSECURE_TLSExactly 'true' accepts a self-signed certificate, scoped to this connection
RUSTPAD_ALLOW_TOOLSComma-separated tool names or list_* prefixes to register; 'essential' selects a curated preset (default: all tools)
RUSTPAD_DENY_TOOLSComma-separated tool names or list_* prefixes to remove from whatever RUSTPAD_ALLOW_TOOLS left

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmrustpad-mcp0.4.0
ocighcr.io/ni-c/rustpad-mcp:0.4.0

ツール

8

掲載時のツール一覧 · 3 週間前に更新

パラメーター型必須説明
idstringはいpad の ID。URL 内の # より後ろの部分です

詳細

rustpad-mcp

CI OpenSSF Scorecard Socket Badge Glama score
npm version container image HTTP via mcp-hub
docs sponsor

効率的で最小構成のセルフホスト可能な共同編集テキストエディター、Rustpad 用の Model Context Protocol(MCP)サーバーです。

Claude Code、Claude Desktop、Codex などの MCP クライアントから、Rustpad インスタンスのパッドを読み書きできます。ドキュメントの取得、新規作成、全体の置き換え、またはその場での編集が可能です。

ツールは8つが上限であって、最低数ではありません。RUSTPAD_ALLOW_TOOLS=essential を設定すると、厳選された5つだけが登録されます。モデルは8つよりも5つの中から、適切なツールをはるかに確実に選べます。読み込むツールの選び方をご覧ください。

読み取りには Rustpad の HTTP API を使用し、書き込みにはオペレーショントランスフォーメーションの WebSocket プロトコルを使用します。そのため、対象を絞った編集(append_to_document、replace_in_document)は、同時に人間の共同編集者が入力した内容ときれいにマージされ、上書きされません。サーバーがパッドを編集している間、パッド内の全員から rustpad-mcp という名前の共同編集者として表示されます。

取り消せない2種類の編集では、ユーザーに確認を求めます。 クライアントが MCP のエリシテーションに対応している場合、空でないパッドの置き換えや、複数箇所を対象とする検索置換では、モデルがユーザーに代わって回答できない実際のダイアログが表示されます。また、replace_in_document のダイアログには、変更される箇所の数が示されます。対応していない場合は、2回の呼び出しによるトークン方式に切り替わり、誰かが承認したかのように装うことはありません。ELICITATION=false を設定すると意図的にこの代替方式を使いますが、確認ガードがなくなることはありません。ユーザーへの確認をご覧ください。

MCP inspector 経由で rustpad-mcp を使用するデモ

アーキテクチャ:MCP クライアントは stdio 経由で rustpad-mcp と通信し、rustpad-mcp は HTTPS 経由でパッドを読み取り、WebSocket OT プロトコル経由で書き込みます

他との違い

上書きではなく、本物の OT 編集。 append_to_document と replace_in_document は、編集対象以外をすべて保持します。Rustpad サーバーは同時編集を変換するため、同じパッドに人間が同時に入力していても、内容が失われることはありません。モデルは、名前付きの共同編集者としてパッドに表示されます。

認証のない環境を前提に設計。 Rustpad にはアカウントがないため、すべてのパッドは定義上、信頼できません。読み取り、メタデータ、上流からのエラーボディに至るまで、パッドから取得したものはすべて、モデルに渡す前に指示ではなくデータであることが明示されます。

要件

  • 到達可能な Rustpad インスタンス(セルフホスト型。サーバーはステートレスで、認証情報は不要です。Rustpad に認証機能はありません)
  • Node.js >= 22、または Docker

設定

変数必須説明
RUSTPAD_URLはいインスタンスのベース URL。例:https://rustpad.example.net
RUSTPAD_READ_ONLYいいえtrue、1、または yes を指定すると、読み取りツールのみを登録します
RUSTPAD_INSECURE_TLSいいえtrue を指定すると、自己署名証明書を受け入れます(この接続のみに適用されます)
RUSTPAD_ALLOW_TOOLSいいえツール名、list_* のプレフィックス、または厳選されたプリセット essential をカンマ区切りで指定します
RUSTPAD_DENY_TOOLSいいえ同じ構文です。RUSTPAD_ALLOW_TOOLS で残された項目から除外します
ELICITATIONいいえfalse を指定すると、承認ダイアログを 2 回呼び出すトークン方式に置き換えます。プレフィックスは付きません

同じ URL が HTTP API、WebSocket エンドポイント、およびツールが返す共有リンク (<RUSTPAD_URL>/#<pad-id>)に使われます。RUSTPAD_* のブール値は、 正確に true である必要があります。設定なしでもサーバーは起動してツールを一覧表示しますが、 その後の呼び出しはすべて、セットアップ手順を示して失敗します。

ELICITATION は 2 つの点で例外です。プレフィックスが付かないため、同じ環境にある すべての MCP サーバーに適用されます。また、値が true でも false でもない場合、 フォールバックせずサーバーが停止します。この変数だけはデフォルトで オン であり、 入力ミスをすると、オフにしたつもりでもダイアログが動作し続けます。オフにして起動した サーバーは、その旨を示す 1 行を出力します。

Rustpad の性質を覚えておいてください。パッドは一時的なものであり(インスタンスを SQLITE_URI を指定して実行しない限り、サーバーの再起動時と 24 時間操作がない場合に 失われます)、パッド ID を知っている人は誰でも読み書きできます。パッドに秘密情報を 書き込まないでください。

読み込むツールの選択

RUSTPAD_ALLOW_TOOLS と RUSTPAD_DENY_TOOLS には、ツール名をカンマ区切りで指定します。 末尾の * は、ファミリー全体に一致します。essential は、次の 5 つを含む厳選された プリセットです:get_document、get_document_info、create_document、set_document、append_to_document。

RUSTPAD_ALLOW_TOOLS=essential
RUSTPAD_ALLOW_TOOLS=get_document,append_to_document
RUSTPAD_DENY_TOOLS=set_document

リストから想像するよりも制限は緩やかです。Rustpad には作成操作がなく、書き込みが 行われた時点で、どの ID でもパッドが存在するようになります。そのため、 create_document を拒否しても新しいパッドの作成は止まりません。新しい ID に対して set_document または append_to_document を実行しても、同様にパッドが作成されます。 拒否したい書き込みツールを指定するか、RUSTPAD_READ_ONLY を使用してください。

どのツールにも一致しない項目があると、起動が中断され、その項目名が表示されます。 そのため、入力ミスによってツールが気付かれずに隠れることはありません。ツールが 存在しない場合に、誰かが環境変数までさかのぼって原因を調べることはないでしょう。 フィルターで除外されたツールは登録されないため、tools/list にも表示されず、 tools/call でも不明なツールになります。RUSTPAD_READ_ONLY 使用時の書き込みツールと まったく同じです。

これらのサーバーを複数同時に実行する場合は、mcp-hub も 選択肢です。その /hub エンドポイントを使うと、各サーバーのツールが 6 つの メタツールに置き換わります。

インストール

Claude Code
claude mcp add rustpad --env RUSTPAD_URL=https://rustpad.example.net -- npx rustpad-mcp
Claude Desktop
{
  "mcpServers": {
    "rustpad": {
      "command": "npx",
      "args": ["rustpad-mcp"],
      "env": {
        "RUSTPAD_URL": "https://rustpad.example.net"
      }
    }
  }
}
Codex

~/.codex/config.toml:

[mcp_servers.rustpad]
command = "npx"
args = ["-y", "rustpad-mcp"]

[mcp_servers.rustpad.env]
RUSTPAD_URL = "https://rustpad.example.net"
Docker
docker run -i --rm -e RUSTPAD_URL=https://rustpad.example.net ghcr.io/ni-c/rustpad-mcp
mcp-hub 経由

ローカルプロセスを起動できないクライアント(ChatGPT コネクター、ウェブ版 Claude、 Cursor、LibreChat など)は、mcp-hub 経由で rustpad-mcp に接続します。1 つの コンテナーが複数の stdio MCP サーバーを Streamable HTTP 経由で提供し、単一のパスワードの背後に OAuth 2.1 ログインを備え、OAuth を利用できないクライアント向けに有効期間の長いトークンを発行します。 /hub エンドポイントはすべてのサーバーを 6 つのメタツールの背後に配置するため、モデルのコンテキストに N×ツール分のスキーマを含めずに、1 つのコネクターからすべてのサーバーにアクセスできます。また、両方の プロトコル改訂版に対応しており、このサーバーが質問をする場合、その質問は経由して遠端の利用者に届きます。

/config/mcp.json は Claude Code の形式を使用するため、エントリーにはすでにあるものをそのまま使えます。

{
  "mcpServers": {
    "rustpad": {
      "command": "npx",
      "args": ["-y", "rustpad-mcp"],
      "env": { "RUSTPAD_ALLOW_TOOLS": "essential" },
      "denyTools": ["set_document"]
    }
  }
}

ここでの allowTools と denyTools は、サーバーごとに設定する hub 独自のフィルターであり、 env 内の *_ALLOW_TOOLS とは異なります。その違いと、そこで起こりがちな間違いについては、 クライアントガイドをご覧ください。

ツール

ツール説明
get_documentパッドのプレーンテキストの内容を読み取ります
get_document_info内容の長さ、リビジョン、言語、現在編集中のユーザーを取得します
get_statsサーバーの統計情報(稼働時間、ドキュメント数)
create_documentパッドを作成します(ID はランダムまたは指定)。内容と言語も指定できます
set_document 👤内容全体を置き換えます。空でないパッドの場合は、事前にユーザーへ確認します
append_to_documentテキストを追加します。他の場所での同時編集はそのまま保持されます
replace_in_document 👤OT による完全一致の検索と置換を行います。複数箇所を変更する場合は確認します
set_languageMonaco の構文ハイライト言語を設定します

👤 は MCP elicitation を通じてユーザーに確認します。クライアントがダイアログを表示できない場合は、 2 回の呼び出しで行う confirm_token にフォールバックします。

RUSTPAD_READ_ONLY=true の場合、最初の 3 つだけが登録されます。

構造化出力

すべてのツールは outputSchema を宣言し、テキストブロックに加えて structuredContent で応答するため、クライアントは文章を解析せずに結果を利用できます。 以前、5 つの書き込みツールは 「パッドに 12 文字を追加しました…」 のような文で応答していました。 その文は現在もテキストブロック内に残っています。

{
  "id": "notes",
  "url": "https://rustpad.example/#notes",
  "appended_characters": 12,
  "characters": 137,
  "note": "Pads are ephemeral: …",
}

get_document は、パッド全体を結果として返すのではなく {text} を返します。これは get_document_info が常にオブジェクトを返してきたのと同じ理由です。ルートが文字列のスキーマは、 2025 年当時のクライアントに提供される際に {result: …} に書き換えられるため、 呼び出した相手によってツールの応答形式が 2 種類に分かれてしまいます。また、empty と truncated を 格納する場所にもなります。以前は空の応答が文として返されていました。

パッドの内容を返す 2 つの読み取りツールは、フィールドとして untrusted: true と source: "rustpad" を含みます。ID を知っていれば誰でもパッドに書き込めます。これには、 このサーバーが以前書き込んだテキストも含まれます。構造化出力を読むクライアントは、これらの情報が 何の説明もないまま渡されてしまうためです。

意図的に公開していない機能

パッドの一覧表示はありません。 Rustpad にそのような API はありません。パッドはあらゆる ID のもとに 暗黙的に存在するため、必要な ID は自分で把握しておく必要があります。get_stats はサーバーが現在保持している ドキュメント数を返しますが、名前は返しません。

アカウントも権限もありません。 Rustpad にはどちらもないため、ログインで信頼性が確認された情報ではなく、 すべてのパッドを信頼できない入力として扱います。

安全性

  • Pad の内容は誰でも書き込めるため、信頼できません。読み取り結果にはすべて、モデルに指示ではなくデータとして扱うよう伝えるマーカーが付けられます。
  • 取り消し不能な 2 つの編集では、人に確認を求めます。モデルが代わりに応答できない実際のダイアログで、対象の Pad と正確な置換内容に結び付けられます。クライアントでダイアログを表示できない場合は、使い捨てトークンを使用します。このトークンは、以前のツール結果にのみ表示されます。これにより、同じ引数で 2 回呼び出されたことだけが証明され、それ以上のことは証明されません。フォールバックのテキストには、どちらの編集だったかが示されます。
  • ツールの結果にはサイズ上限があります。インスタンスが書き込んだすべての内容から制御文字を除去し、モデルに届く前に上流のエラーボディをサニタイズします。
  • インスタンス自体も信頼できません。WebSocket フレームはバッファーに格納する前にヘッダーでサイズを制限し、メッセージキューはバイト数に上限を設けています。また、各フレームは Pad に反映する前に形式を検証します。
  • RUSTPAD_INSECURE_TLS は、設定された接続に限って証明書の検証を緩和します。プロセス全体には適用されません。

ドキュメント

完全なガイド、ツールリファレンス、セキュリティに関する注意事項は rustpad-mcp.ni-c.de(ソースは docs/)にあります。

開発

npm install
npm run lint && npm run build && npm test

テストスイートは、実際の MCP プロトコルを介して、インメモリの rustpad-server のフェイク(同時編集の OT 変換を含む)と通信します。実際のインスタンスは不要です。アーキテクチャ図とソーシャルカードは生成されます。docs/assets/architecture.source.svg を編集して npm run assets を実行してください。レンダリング済みのコピーは編集しないでください。

リリース

リリースはタグによって実行されます。package.json のバージョンを更新し、CHANGELOG.md の [Unreleased] の内容を新しいバージョンの下に移動してコミットした後、次を実行します。

git tag -s vX.Y.Z -m "vX.Y.Z"
git push origin main vX.Y.Z

リリースワークフローでは、Trusted Publishing(プロベナンス付きの OIDC)を介して npm に公開し、マルチアーキテクチャのコンテナイメージを GHCR にプッシュします。また、CHANGELOG のセクションから GitHub リリースを作成し、公式 MCP レジストリのエントリーを更新します。

貢献

Issue、ディスカッション、プルリクエストを歓迎します。CONTRIBUTING.md をご覧ください。脆弱性については、公開 Issue ではなく非公開の報告をご利用ください。ポリシーは SECURITY.md に記載されています。

ライセンス

MIT © Willi Thiel

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。