MCP Server 開發實戰指南(Elixir Phoenix 版)

July 19, 2025
本文詳細介紹如何用 Elixir 和 Phoenix 框架構建 MCP Server,適合追求高併發和實時性能的開發者。
mcp
elixir
phoenix
server
api
開發指南

MCP Server 開發實戰指南(Elixir Phoenix 版)

用 Elixir 的高併發優勢,打造高效穩定的 MCP Server。


為什麼你需要這篇 Elixir 版指南?

MCP Server 要求高併發和低延遲,Elixir 與 Phoenix 以其輕量進程和實時通訊能力,成為理想選擇。 但很多人對如何用 Phoenix 搭建 MCP Server 感到困惑。 作為多年 Elixir 生態實踐者,我將引導你從零開始,用最地道的 Phoenix 代碼實現智能上下文管理與插件機制。

如果你想構建高性能智能服務,這篇指南不可錯過。


🧱 項目初始化:Phoenix API-only 模式

先安裝 Elixir 和 Phoenix,創建 API-only 項目:

mix archive.install hex phx_new
mix phx.new mcp_server --no-html --no-webpack
cd mcp_server

配置 mix.exs,安裝依賴:

mix deps.get

🧠 創建核心接口:實現 /api/invoke 路由

編輯 lib/mcp_server_web/controllers/invoke_controller.ex

defmodule McpServerWeb.InvokeController do
  use McpServerWeb, :controller

  @context_store :ets.new(:context_store, [:named_table, :public, read_concurrency: true])

  def invoke(conn, %{"session_id" => session_id, "message" => message}) do
    history = case :ets.lookup(:context_store, session_id) do
      [{^session_id, msgs}] -> msgs ++ [message]
      [] -> [message]
    end

    :ets.insert(:context_store, {session_id, history})

    reply = if String.starts_with?(message, "天氣") do
      city = String.trim_leading(message, "天氣")
      weather_plugin(city)
    else
      "你說的是:#{message}"
    end

    json(conn, %{reply: reply, history: history})
  end

  defp weather_plugin(city), do: "#{city} 今天晴,溫度 26°C。"
end

🧩 配置路由

lib/mcp_server_web/router.ex 添加路由:

scope "/api", McpServerWeb do
  post "/invoke", InvokeController, :invoke
end

🔐 添加安全認證

你可以用 Plug 添加 API Key 驗證:

defmodule McpServerWeb.Plugs.ApiKeyAuth do
  import Plug.Conn

  def init(opts), do: opts

  def call(conn, _opts) do
    case get_req_header(conn, "x-api-key") do
      ["supersecret"] -> conn
      _ -> conn |> send_resp(401, "Unauthorized") |> halt()
    end
  end
end

然後在 Router 中使用:

pipeline :api_auth do
  plug McpServerWeb.Plugs.ApiKeyAuth
end

scope "/api", McpServerWeb do
  pipe_through [:api, :api_auth]

  post "/invoke", InvokeController, :invoke
end

🚀 運行與部署

本地啟動:

mix phx.server

默認監聽 http://localhost:4000

生產部署推薦使用 Distillery 或 Gigalixir。


🧪 調試建議

  • 使用 Logger 打印上下文狀態
  • 利用 Phoenix 自帶的 LiveDashboard 監控請求
  • 確保請求內容為 JSON,且包含正確字段

🧱 拓展思路

  • 利用 GenServer 或 Agent 持久化上下文
  • 支持多插件並行調用,集成異步任務隊列
  • 結合 Phoenix Channels 實現實時上下文同步

💬 總結與行動號召

Elixir 與 Phoenix 的優勢在於輕鬆支持高併發與實時特性,完美契合 MCP Server 需求。 希望這份指南幫助你構建出極具擴展性的智能中控服務。


📌 立即動手嘗試吧! 收藏本文,分享給你關注性能的開發者,一起探索 Elixir 生態的魅力!

思考:你認為 Elixir 的併發模型,會給 MCP Server 帶來哪些創新?歡迎評論區暢聊 👇