~/blog/laravel-mcp-centralized-prompt-management-2026.md
AI 自動化與智慧應用 · 2026 / 03 / 02

Laravel MCP 實戰:把散落各處的 Prompt 收進企業級提示詞中央銀行

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
Laravel MCP 實戰:把散落各處的 Prompt 收進企業級提示詞中央銀行
目錄 table-of-contents.md

把 Prompt 寫死在 Controller 裡,是 AI 狂熱期留給許多 Laravel 專案的技術債——提示詞像胡椒粉一樣撒在 Service 甚至 View 各處,改一個語氣得動十個檔案。Prompt 是資產,不是字串常數。這篇用 Laravel MCP 實作一座「提示詞中央銀行」,把散落各處的咒語收進統一管理、可版控的金庫。

到了 2026 年的今天,Model Context Protocol (MCP) 已經成為 AI 代理人溝通的標準協定。如果你還在用 `config('openai.prompts.system')` 或是資料庫裡的純文字欄位來管理提示詞,那你真的該升級了。今天這篇文章,我們要來聊聊「提示詞管理中心化」,以及如何利用 Laravel 結合 MCP 架構,將你的 Prompts 變成可版本控制、可動態注入的「模板化資源」。

為什麼 2026 年我們需要「提示詞中央銀行」?

在早期的開發模式中,我們常犯的一個錯誤是把 Prompt 當作「常數字串」處理。但隨著 LLM(大型語言模型)的迭代(現在都已經是 GPT-6 或 Gemini 3 的時代了),Prompt 的邏輯變得極度複雜。它不再只是一句話,它包含了:

  • 角色設定 (Persona):定義 AI 是客服、工程師還是數據分析師。
  • 上下文注入 (Context Injection):動態插入用戶數據、歷史訂單。
  • 輸出格式限制 (Output Schema):JSON、Markdown 或特定的 XML。
  • 防禦性指令 (Safety Rails):防止 Prompt Injection 的護欄。

當你的系統有 50 個不同的 AI 功能,而這些 Prompt 分散在 50 個不同的檔案時,一旦業務邏輯變更,或者需要從 OpenAI 切換到 Anthropic,維護成本是災難級的。這就是為什麼我們需要透過 Laravel MCP Server 來建立一個「提示詞中央銀行」。

Laravel MCP 架構:將 Prompt 視為 Resource

在 MCP 的規範中,除了 Tools (工具) 和 Prompts (提示詞) 是兩大核心。許多開發者只專注於寫 Tools讓 AI 操作資料庫,卻忽略了 MCP 原生就支援將 Prompt 定義為標準化的 Resource。

我們的目標架構如下:

  • Laravel Backend:作為 MCP Server,負責儲存、版本控制、渲染 Prompts。
  • AI Clients (Cursor, n8n, Custom App):作為 MCP Clients,透過協定「訂閱」或「請求」最新的 Prompt。

1. 資料庫設計:支援版本控制與變數

首先,別再只用一個 `content` 欄位存 Prompt 了。我們需要一個更嚴謹的 Schema。這不僅是為了存取,更是為了讓非技術人員(如 PM 或行銷)也能參與 Prompt Engineering。


Schema::create('ai_prompts', function (Blueprint $table) {
    $table->id();
    $table->string('slug')->unique(); // 例如: customer-service-refund
    $table->text('template'); // 包含變數的 Blade 模板,如: 你好 {{ $name }}...
    $table->json('input_schema'); // 定義需要的變數,如: {"name": "string", "order_id": "int"}
    $table->string('model_preference')->nullable(); // 建議使用的模型
    $table->integer('version')->default(1);
    $table->boolean('is_active')->default(true);
    $table->timestamps();
});

2. 實作 MCP Prompt Resource

在 Laravel 中,我們利用 MCP SDK 來註冊這些 Prompts。這裡的關鍵是,我們不直接回傳字串,而是回傳一個「渲染後」的結果。這讓 Laravel 的 Blade 引擎大顯身手。我們可以利用 Blade 的強大邏輯(if/else, loops)來動態組裝 Prompt。

這段程式碼展示了如何註冊一個動態 Prompt:


use Mcp\Server\Facades\McpServer;
use Mcp\Server\Resources\PromptResource;
use App\Models\AiPrompt;
use Illuminate\Support\Facades\Blade;

// 在 AppServiceProvider 或專屬的 McpServiceProvider 中註冊

public function boot()
{
    // 撈出所有活躍的 Prompts 並註冊到 MCP 列表
    $prompts = AiPrompt::where('is_active', true)->get();

    foreach ($prompts as $prompt) {
        McpServer::registerPrompt(
            name: $prompt->slug,
            description: "Version: {$prompt->version}. Auto-generated via Laravel MCP.",
            arguments: $prompt->input_schema, // 告訴 Client 需要傳什麼參數
            handler: function (array $args) use ($prompt) {
                // 這裡就是「模板化資源」的核心
                // 使用 Blade 渲染,確保變數被正確填入且經過跳脫處理
                $renderedContent = Blade::render($prompt->template, $args);

                return [
                    'role' => 'user',
                    'content' => [
                        [
                            'type' => 'text',
                            'text' => $renderedContent
                        ]
                    ]
                ];
            }
        );
    }
}

進階技巧:模板化資源的威力

為什麼要用 `Blade::render` 而不是簡單的字串替換?因為 2026 年的 Prompt 邏輯很複雜。想像一下,你的一個「程式碼審查 AI」,需要根據傳入的語言(PHP, Python, JS)載入不同的審查規範。如果你把這些規範全部塞在同一個 Prompt 裡,Token 消耗會爆炸。

利用 Laravel 的模板繼承,你可以這樣做:


{{-- prompts/base-reviewer.blade.php --}}
你是一位資深的 {{ $language }} 工程師。
請依據以下核心原則審查程式碼:
1. 安全性優先
2. 可讀性至上

@include('prompts.rules.' . $language)

審查標的:
{{ $code_snippet }}

透過 MCP 請求這個 Prompt 時,Laravel 會在後端動態組裝好最完美的 Prompt 文字,再透過網路協定回傳給 AI Agent。這就是「中心化管理」的真諦:客戶端不需要知道 Prompt 的組裝邏輯,它只需要發送數據,然後獲得指令。

安全性與快取考量

當我們將 Prompt 透過 API 或 MCP 暴露出去時,效能與資安是兩大考量。在 2026 年,我們通常會建議:

  1. 快取編譯後的模板:Blade 的渲染雖然快,但在高併發下仍是負擔。利用 Redis 快取渲染結果(針對相同的參數組合)是必要的。
  2. 參數驗證:既然我們定義了 `input_schema`,在 MCP Handler 內部必須使用 `Validator` 來檢查 Client 傳來的參數,避免 Prompt Injection 或是無效數據導致 AI 產生幻覺。

實際應用場景:跨平台一致性

這種架構最大的好處在於「一致性」。

想像一下,浪花科技同時維護著:
1. 一個 WordPress 官網(使用 AI 客服)。
2. 一個 iOS App(使用 AI 助理)。
3. 內部的 Slack Bot(使用 AI 查詢報表)。

過去,如果要更新「公司的退換貨政策」,我需要去改這三個地方的 Prompt string。現在,我只需要在 Laravel 的後台更新 `customer-service-policy` 這個 Prompt 記錄,所有連接到這個 MCP Server 的終端設備,下一次呼叫時就會自動拿到最新的指令。

這不僅是技術上的優化,更是企業治理(Governance)的一環。我們終於可以大聲地跟 CFO 說,我們的 AI 資產是受控的,而不是一團混亂的黑盒子。

說實話,身為工程師,把這些邏輯抽離出來後,Controller 變得乾淨多了,那種爽感真的是難以言喻。不用再為了修一個 typo 而重新部署整個 API,光是這點就值得你今晚開始重構。

相關推薦閱讀

為了讓你的 MCP 架構更完整,我強烈建議閱讀以下幾篇浪花科技的深度技術文章,涵蓋了從資料庫安全到成本控制的關鍵議題:

想為您的企業導入最先進的 AI MCP 架構嗎?別讓技術債拖垮您的創新速度。

立即聯繫浪花科技,諮詢企業級 AI 解決方案

// FAQ

常見問題

為什麼要把 AI 提示詞集中管理,而不是寫死在程式碼各處?
因為現代 Prompt 已不只是一句話,而包含角色設定、上下文注入、輸出格式限制與防注入護欄等複雜邏輯。當系統有數十個 AI 功能、Prompt 分散在數十個檔案時,一旦業務邏輯變更或要切換模型供應商,維護成本極高。集中管理能讓 Prompt 變成可版本控制、可動態注入的資源,並讓非技術人員也能參與調整。
在 MCP 架構中,為什麼要把 Prompt 視為一種 Resource?
MCP 規範原生支援把 Prompt 定義為標準化的 Resource,許多人只專注於寫讓 AI 操作資料庫的 Tools,卻忽略了這點。把 Prompt 當作標準化資源後,AI 客戶端可以透過協定「請求」最新的 Prompt,由後端統一儲存、版本控制與渲染,達成跨平台一致的中心化管理。
設計提示詞資料表時,為什麼不該只用一個 content 欄位?
因為單一 content 欄位無法支撐版本控制與動態變數。較嚴謹的設計應包含 slug(識別)、含變數的模板、定義所需變數的 input_schema、建議模型、版本號與啟用旗標等欄位。這樣不僅利於存取,也讓 PM 或行銷等非技術人員能參與 Prompt Engineering。
在 Laravel 中用 Blade 渲染 Prompt 模板有什麼好處?
Blade 引擎支援 if/else、迴圈與模板繼承等邏輯,能依傳入參數動態組裝最適合的 Prompt。例如程式碼審查 AI 可依語言(PHP、Python、JS)載入不同審查規範,而不必把所有規範塞進同一個 Prompt 造成 Token 爆炸。客戶端只需發送數據,後端便回傳組裝好的最終指令。
將 Prompt 透過 MCP 或 API 對外提供時,要注意哪些效能與資安問題?
效能上,Blade 渲染在高併發下仍是負擔,建議針對相同參數組合用 Redis 快取渲染結果。資安上,既然已定義 input_schema,就應在 Handler 內用 Validator 檢查客戶端傳來的參數,防止 Prompt Injection 或無效數據導致 AI 產生幻覺。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?