GAS開発ターボ化計画 v4.1:Hono x AIネイティブ・ユニファイドアーキテクチャ

1. 企画概要

本企画は、Google Apps Script (GAS) 開発における「壊れやすさ」「テストのしにくさ」「SPA連携の難しさ」を一挙に解決するソリューションです。
Webフレームワーク「Hono」をアダプターとして採用し、AI(MCP)が複雑なインフラコードを自律生成。 「1つのコードベース」で、ローカルAPIサーバーとしても、本番GASアプリとしても、完全に同一の挙動を実現します。

New Concept: Hono Adapter & Independent MCP GASを「普通のWebサーバー」として振る舞わせ、Webアプリ開発に拡張可能。AIツールは独立したプロジェクトとして管理し、開発環境を汚染しない。

2. 戦略的意義:それでもなぜGASを選ぶのか?

「ここまでWeb標準技術(Hono, REST API, Vite)をフル活用するなら、最初からCloud RunやAWSを使えば良いのでは?」
技術的には正論ですが、ビジネスと運用の観点からは「あえてGASを選ぶ」強力な理由が4つ存在します。

1. 完全無料の社内インフラ

サーバー代(GAS)もデータベース代(Spreadsheet)も無料。月額0円で永続的に運用可能な環境は、GAS以外に存在しません。

2. 認証・認可の即時構築

デプロイ時に「ドメイン内ユーザーのみ」を選ぶだけで、堅牢なGoogle認証付き社内ツールが完成します。実装コストはゼロです。

3. 属人化しない保守性

AWSアカウントの引き継ぎは困難ですが、GASなら「シートの共有」だけで管理権限を移譲できます。非エンジニアでもデータ管理が可能です。

4. 最高のイグジット戦略

本構成はWeb標準技術で書かれているため、GASの限界が来たらコードをそのままCloud Run等へ移行(Exit)可能です。「GASロックイン」を回避します。

3. 解決する課題とメリット

Hono 🔥

Web標準 API化

GAS特有のdoGetに依存せず、Honoのルーター機能で/api/usersのような標準的なREST APIを構築。Webアプリからの接続が極めて容易になります。

Architecture 💎

Single Source of Truth

REST API (Advanced Service) ベースの単一コードにより、ローカルテストでの「書式設定」や「メール送信」までもが本番と完全に一致します。

AI Agent 🤖

複雑性の隠蔽

人間が書くと数十行になる複雑なGoogle APIのリクエストJSONも、AIなら一瞬で生成。面倒なインフラ層はすべてAIにお任せ。

4. アーキテクチャ構成図

4.1 Human-AI Interaction Loop

Honoが「入り口」を、Native Fetchが「出口」を担当し、AIがその間を繋ぎます。

👨‍💻 人間 (開発者)

役割: ロジック & UI実装

  • VS Codeでコーディング
  • Geminiへの指示出し
  • ローカルでWebアプリ確認
自然言語で指示
"APIエンドポイント追加"

✨ Gemini (AI Agent)

役割: 設計 & Hono実装

  • ユーザーの意図を解析
  • Honoルーター設計
  • MCPへ実装命令
ローカルで
完全再現
Tool Call
(scaffold_unified)

📁 Hono x GAS環境

役割: 実行環境

  • src/index.ts (Hono App)
  • src/features/ (Unified Repo)
  • dist/ (Bundle Artifacts)
コード生成
設定更新

⚙️ 独立MCPサーバー

役割: 外部ロボットアーム

  • プロジェクト外で動作
  • ファイル操作 (fs)
  • JSONビルダー

4.2 MCP内部の処理イメージ:Unified Code Generator

AIは「Honoのコントローラー」と「REST APIリポジトリ」をセットで生成し、即座にAPIとして利用可能にします。

📥 1. Input (Tool Call)
{ "api": "POST /api/highlight", "logic": "Salesセルを赤くする" }
⚙️ 2. Process
// Hono Route
app.post(...)
// REST JSON
{ requests: [...] }
📄 3. Output
  • 🔥 index.ts (Route追記)
  • 💜 UniversalRepo.ts

5. MCPサーバーが提供する機能 (The Big 3)

AIツールは独立したプロジェクトとして管理され、GASアプリに対して外側から操作を行います。

Tool名 カテゴリ 機能詳細
setup_named_range Infrastructure 対話型・範囲定義ウィザード
API経由でスプレッドシートに「名前付き範囲」を設定し、コード内の定数と同期。列の挿入・移動に強い堅牢なデータ基盤を構築する。
scaffold_feature Hono/Coding フルスタックAPI生成
Honoのルーティング定義と、Advanced Service (REST API) を利用したリポジトリクラスを一括生成。Web APIとして即座に疎通可能な状態を作る。
sync_local_secrets Setup 環境構築オートメーション
GCPプロジェクト設定、API有効化チェック、JSON鍵配置を自動化。ローカル実行に必要な認証周りのトラブルを撲滅する。

6. ローカル実行のためのインフラ準備 (One-time Setup)

1. GCPプロジェクト

GAS紐付けプロジェクトを用意

2. API有効化

Google Sheets APIをON

3. サービスアカウント

JSON鍵を作成 & DL

4. 権限付与

Botメールアドレスを招待

⚠️ セキュリティ JSON鍵は .gitignore に追加し、絶対にリポジトリにコミットしないでください。

7. 推奨ディレクトリ構成:Workspace Hybrid

MCPサーバーを独立したプロジェクト(Sibling Project)として配置し、GASアプリ側はHonoを中心に構成します。
これにより、AIツール自体を別リポジトリとして管理したり、チーム間で共有することが容易になります。

root/ ├── gas-app/ # 🚀 [GASアプリ本体] Hono + Unified Repo │ ├── .clasp.json # dist/ をデプロイ対象に │ ├── package.json │ ├── build.js # esbuild設定 (Honoバンドル用) │ ├── secrets/ # 🔐 [Local専用] 認証鍵 │ ├── src/ │ │ ├── index.ts # 🔥 [共通] Honoアプリ定義 (Routes) │ │ ├── entry-node.ts# 🟢 [Local] Nodeサーバー起動 (localhost:3000) │ │ ├── entry-gas.ts # 🔴 [GAS] doGetアダプター │ │ ├── core/ # 💜 Client (Fetch Polyfill) │ │ └── features/ # 📦 Unified Repos (AI生成) │ └── test/ # ✅ [Local専用] 結合テスト │ └── features/ │ └── mcp-server/ # ⚙️ [独立AIツール] 開発支援ロボット ├── package.json ├── src/ │ ├── tools/ # scaffold_feature (Hono対応版) │ └── templates/ # Honoコントローラー等のテンプレート └── index.ts # MCPサーバー起動

ポイント:
gas-appmcp-server は完全に分離されています。AIは mcp-server から gas-app 内のファイルを操作します。
GASにデプロイされるのは gas-app/dist/bundle.js のみとなり、構成が非常にクリーンです。

8. 参考資料:Hono x REST API統一の実装例

Honoが「ルーター」としてリクエストを受け、Unified Repoが「Fetch」でGoogle APIを叩く流れです。

🔄 処理の流れ (Local / GAS 共通)

1. Request: POST /api/highlight (Web標準)
2. Hono: ルーティングを解析し、コントローラーを実行
3. Repo: 複雑なJSONを構築し、fetch でGoogle APIへ送信
4. Response: c.json({ success: true }) を返却

📝 Hono + Universal Repo コード例

// src/index.ts (Hono App) const app = new Hono(); app.post('/api/highlight', async (c) => { // 1. Honoでリクエスト解析 const { range } = await c.req.json(); // 2. Unified Repoを利用 (中身はREST API + Fetch Polyfill) const repo = new UniversalSheetRepo(); await repo.setRedBackground(range); return c.json({ status: 'ok' }); });

// src/features/sheets/UniversalSheetRepo.ts (AI生成) export class UniversalSheetRepo { async setRedBackground(range: string) { // AIが生成した複雑なJSON const resource = { requests: [{ repeatCell: { ... } }] }; // Fetch Polyfillで送信 (GASでもNodeでも動く) await apiClient.post('https://sheets.googleapis.com/...', resource); } }