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 带来哪些创新?欢迎评论区畅聊 👇