返回市场
扩展MCP

扩展MCP

作者:azmaveth11 星标更新:2025-11-19

项目介绍

ExMCP

<div align="center">

Hex.pm Documentation CI Coverage License

完整的Elixir实现的模型上下文协议(MCP)

入门指南 | 用户手册 | API文档 | 示例 | 变更日志

</div>

生产就绪: ExMCP v0.6.0 现在已准备好用于生产环境,具有100%的MCP合规性和全面测试。API稳定,适合生产使用。

概览

ExMCP 是一个全面的Elixir实现的 模型上下文协议,使AI模型能够通过标准化协议安全地与本地和远程资源交互。它提供了客户端和服务器实现,并支持多种传输选项,包括通过Plug兼容性进行的原生Phoenix集成

✨ 主要特性

协议及标准

  • 🚀 多个MCP版本 - 支持协议版本2024-11-05、2_025-03-26 和 2025-06-18
  • 100% MCP合规 - 完整实现了官方MCP规范
  • 🛠️ 完整功能集 - 工具、资源、提示、根目录、订阅、批量请求
  • 🔐 OAuth 2.1支持 - 完整的资源服务器实现

性能及可靠性

  • 超快的原生BEAM - 本地调用约15微秒,零序列化开销
  • 🔄 自动重连 - 内置带有指数退避的重连机制
  • 🏗️ OTP集成 - 基于坚实的OTP原则构建,包含监督树
  • 📊 进度通知 - 跟踪长时间运行的操作

集成及灵活性

  • 🔌 Phoenix Plug - 通过ExMCP.HttpPlug实现原生Phoenix集成
  • 🌐 多种传输方式 - 支持HTTP/SSE、stdio以及原生BEAM
  • 🎯 会话管理 - 自动跟踪SSE连接的会话
  • 🔄 双向通信 - 服务器可以向客户端发起请求

开发者体验

  • 🧪 全面测试 - 包含500多个测试的综合测试套件
  • 📚 详尽文档 - 完整的指南和实际案例
  • 🔧 易于配置 - 提供合理的默认设置和灵活的自定义选项
  • 🛡️ 安全第一 - 内置认证、TLS/SSL、CORS支持

📦 安装

mix.exs中添加ex_mcp到依赖列表:

def deps do
  [
    {:ex_mcp, "~> 0.6.0"}
  ]
end

然后运行:

mix deps.get

🚀 快速开始

Phoenix集成(推荐)

为你的Phoenix应用添加MCP服务器能力:

# 在你的Phoenix路由器中(lib/my_app_web/router.ex)
defmodule MyAppWeb.Router do
  use MyAppWeb, :router
  
  pipeline :mcp do
    plug :accepts, ["json"]
    # 在这里添加你的认证/授权
  end
  
  scope "/api/mcp" do
    pipe_through :mcp
    
    # 在/api/mcp挂载MCP服务器
    forward "/", ExMCP.HttpPlug,
      handler: MyApp.MCPHandler,
      server_info: %{name: "my-phoenix-app", version: "1.0.0"},
      sse_enabled: true,
      cors_enabled: true
  end
end

# 创建你的MCP处理器(lib/my_app/mcp_handler.ex)
defmodule MyApp.MCPHandler do
  use ExMCP.Server.Handler
  
  @impl true
  def init(_args), do: {:ok, %{}}
  
  @impl true
  def handle_initialize(_params, state) do
    {:ok, %{
      name: "my-phoenix-app",
      version: "1.0.0",
      capabilities: %{tools: %{}, resources: %{}}
    }, state}
  end
  
  @impl true
  def handle_list_tools(state) do
    tools = [
      %{
        name: "get_user_count",
        description: "获取总用户数",
        input_schema: %{type: "object", properties: %{}}
      }
    ]
    {:ok, tools, state}
  end
  
  @impl true
  def handle_call_tool("get_user_count", _args, state) do
    count = MyApp.Accounts.count_users()
    {:ok, [%{type: "text", text: "总用户数: #{count}"}], state}
  end
end

从任何MCP客户端连接:

mcp connect http://localhost:4000/api/mcp

独立的MCP客户端

# 连接到基于stdio的服务器
{:ok, client} = ExMCP.Client.start_link(
  transport: :stdio,
  command: ["node", "my-mcp-server.js"]
)

# 列出可用工具
{:ok, tools} = ExMCP.Client.list_tools(client)

# 调用工具
{:ok, result} = ExMCP.Client.call_tool(client, "search", %{
  query: "Elixir编程",
  limit: 10
})

超快的原生BEAM服务

对于可信的Elixir集群,使用原生BEAM传输:

# 使用ExMCP.Service宏创建服务
defmodule MyToolService do
  use ExMCP.Service, name: :my_tools

  @impl true
  def handle_mcp_request("list_tools", _params, state) do
    tools = [
      %{
        "name" => "ping",
        "description" => "测试工具",
        "inputSchema" => %{"type" => "object", "properties" => %{}}
      }
    ]
    {:ok, %{"tools" => tools}, state}
  end

  @impl true
  def handle_mcp_request("tools/call", %{"name" => "ping"}, state) do
    {:ok, %{"content" => [%{"type" => "text", "text" => "Pong!"}]}, state}
  end
end

# 启动服务(自动注册到ExMCP.Native)
{:ok, _} = MyToolService.start_link()

# 直接服务调用(约15微秒延迟)
{:ok, tools} = ExMCP.Native.call(:my_tools, "list_tools", %{})

📚 文档

ExMCP提供了针对不同需求的全面文档:

🚀 入门指南

📖 综合指南

🔧 开发与API

📋 协议及规范

🎯 传输性能

传输方式延迟最佳用途使用场景
原生BEAM约15微秒内部服务Elixir集群通信
stdio约1-5毫秒外部工具子进程通信
HTTP/SSE约5-20毫秒网络客户端Web应用程序、远程API

✨ v0.6.0 新特性

  • 增强的安全性:完整的OAuth 2.1资源服务器实现
  • MCP 2025-06-18支持:最新协议版本,带有结构化的工具输出
  • 改进的测试:全面的合规性测试套件
  • 更好的性能:优化的原生BEAM传输
  • 文档:增强的指南和示例

查看变更日志以获取详细信息和重大更改。

🤝 贡献

我们欢迎贡献!请参阅:

在贡献之前:

  1. 分叉仓库
  2. 创建功能分支
  3. 运行make quality以确保代码质量
  4. 提交拉取请求

📄 许可

此项目根据MIT许可发布 - 查看LICENSE文件以获取详细信息。

🙏 致谢

  • 模型上下文协议规范的创建者
  • 提供优秀工具和库的Elixir社区
  • 提供反馈的贡献者和早期采用者

<div align="center"> 为Elixir社区制作 ❤️ </div>