Google Sheets Write MCP Server
sheets-write-mcp-server
Google Sheets への書き込み専用 MCP サーバー。google-sheets-mcp-server(読み取り専用)の対になる存在で、読み取りツールは持たない。読むだけなら readonly を使う。
設計思想
コミュニティ製の Sheets MCP は「アカウント内の全シートに読み書き可」という過剰権限になりがち。本サーバーは書き込みという破壊的操作を扱うため、全ツールが以下の安全パイプラインを通る:
whitelist(fail-closed)→ サイズ制限 → dry_run → 書込前スナップショット → 実行 → 監査ログホワイトリスト:
~/.config/sheets-write-mcp/allowed_spreadsheets.yamlに登録された spreadsheet(さらに sheet 単位で絞り込み可)にしか書き込めない。ファイルが無い・壊れている場合は全拒否(fail-closed)。編集は即反映(再起動不要)dry_run:削除系ツール(clear_range / delete_rows / delete_columns / delete_sheet)はデフォルトで dry_run=true。実行計画と現在値のプレビューを返すだけで、明示的に
dry_run=falseを渡すまで何も起きない書込前スナップショット:上書き・削除される値(数式は数式文字列のまま)を
~/.local/share/sheets-write-mcp/rollback/に保存してから書き込む。スナップショット取得に失敗したら書き込みは実行されない。spreadsheet ごとに直近50世代監査ログ:全操作(拒否・dry_run・エラー含む)を
~/.local/share/sheets-write-mcp/audit.jsonlに1行1レコードで記録サイズ制限:1回の操作で 5,000 セル超は
force=trueが必要外部送信は Google APIs のみ。第三者サーバー経由なし
ロールバックの範囲
スナップショットが守るのは値と構造(行・列・シートの中身)。セル書式(色・罫線・条件付き書式等)の復元は対象外——書式事故は Google Sheets 本体の版履歴(ファイル > 変更履歴)で救済できるため、スナップショットの複雑化に見合わないと判断。schema_version フィールドがあるので将来拡張は可能。
ツール(18本・3層)
層 | ツール | dry_run 既定 |
L1 値 |
| false |
L1 値 |
| true |
L2 構造 |
| false |
L2 構造 |
| true |
L3 装飾 |
| false |
数式は既定で数式として解釈される(
USER_ENTERED)。raw=trueで文字列として格納シート指定は名前・gid どちらでも可
L3 は指定した項目だけを fields マスクで更新(触っていない書式は保持)
対象外:ピボット・グラフ(将来)/スプレッドシート自体の作成・削除・共有(Drive API 管轄)/表示・ツール・拡張機能メニュー(API 非対応)
セットアップ
git clone <this repo> && cd sheets-write-mcp-server
python3 -m venv .venv && .venv/bin/pip install -e .
# 1. OAuth クライアント(readonly と同じものを使い回せる)
mkdir -p ~/.config/sheets-write-mcp
cp ~/.config/sheets-mcp/credentials.json ~/.config/sheets-write-mcp/
# 2. ホワイトリスト作成
cat > ~/.config/sheets-write-mcp/allowed_spreadsheets.yaml <<'EOF'
spreadsheets:
- id: "<spreadsheet ID>"
note: "(用途メモ)"
writable_sheets: "*" # または ["シート名", ...]
EOF
# 3. OAuth を一度通す(ブラウザが開く。token.json が書き込みスコープで生成される)
.venv/bin/python -c "from sheets_write_mcp.auth import _load_credentials; _load_credentials()"トークンは readonly(spreadsheets.readonly)とは別ファイル・別スコープ(spreadsheets)。
Claude Code / Claude Desktop への登録
claude mcp add sheets-write -- /path/to/sheets-write-mcp-server/.venv/bin/sheets-write-mcpClaude Desktop(claude_desktop_config.json)で readonly と並走:
{
"mcpServers": {
"sheets-readonly": { "command": "/path/to/sheets-mcp-server/.venv/bin/sheets-mcp" },
"sheets-write": { "command": "/path/to/sheets-write-mcp-server/.venv/bin/sheets-write-mcp" }
}
}環境変数
変数 | デフォルト |
|
|
|
|
|
|
|
|
開発
.venv/bin/pip install -e ".[dev]"
.venv/bin/python -m pytest -q # 110+ tests
.venv/bin/python -m ruff check src/ tests/grid.py(A1⇔GridRange 変換)が範囲計算の単一障害点。1-indexed(ユーザー向け)と 0-indexed(GridRange)の変換ミスは「隣の行を消す」事故に直結するため、境界値テストを最も厚くしている。
既知の制約
スナップショットは
valueRenderOption=FORMULAで取得するため、数式セルの計算結果値は保存されない(数式は保存され、復元時に再計算される)rename_sheet後はホワイトリストのシート名指定が旧名のままになる——リネーム後に yaml を更新すること
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/tg-tool/google-sheets-write-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server