完整的Elixir实现的模型上下文协议(MCP)
入门指南 | 用户手册 | API文档 | 示例 | 变更日志
</div>ExMCP 是一个全面的Elixir实现的 模型上下文协议,使AI模型能够通过标准化协议安全地与本地和远程资源交互。它提供了客户端和服务器实现,并支持多种传输选项,包括通过Plug兼容性进行的原生Phoenix集成。
ExMCP.HttpPlug实现原生Phoenix集成在mix.exs中添加ex_mcp到依赖列表:
def deps do
[
{:ex_mcp, "~> 0.6.0"}
]
end
然后运行:
mix deps.get
为你的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
# 连接到基于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
})
对于可信的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提供了针对不同需求的全面文档:
| 传输方式 | 延迟 | 最佳用途 | 使用场景 |
|---|---|---|---|
| 原生BEAM | 约15微秒 | 内部服务 | Elixir集群通信 |
| stdio | 约1-5毫秒 | 外部工具 | 子进程通信 |
| HTTP/SSE | 约5-20毫秒 | 网络客户端 | Web应用程序、远程API |
查看变更日志以获取详细信息和重大更改。
我们欢迎贡献!请参阅:
在贡献之前:
make quality以确保代码质量此项目根据MIT许可发布 - 查看LICENSE文件以获取详细信息。