用于模型上下文协议(MCP)的Elixir SDK
 
用于构建的官方Elixir SDK 模型上下文协议 (MCP)服务器和客户端。
什么是MCP?
模型上下文协议(MCP)是一个开放协议,它规范了应用程序如何向大型语言模型(LLM)提供上下文。它能够:
- 工具:LLM可以执行的函数
- 资源:LLM可以访问的数据
- 提示:LLM交互的可重用模板
特性
- ✅ 完全遵守协议:实施MCP规范版本
2024-11-05 - ✅ JSON-RPC 2.0:完成JSON-RPC消息处理
- ✅ 类型安全:所有功能的模式验证
- ✅ 多个传输:stdio(本地)和HTTP/SSE(远程)
- ✅ 成语灵丹妙药:基于GenServer,支持监督
- ✅ 轻松注册:用于工具、资源和提示的简单API
安装
添加 mcp_sdk 到中的依赖项列表 mix.exs:
def deps do
[
{:mcp_sdk, "~> 0.1.0"}
]
end快速开始
1.定义MCP服务器
defmodule MyApp.MCPServer do
use MCP.Server
def init(_opts) do
{:ok, %{}}
end
def handle_init(state) do
server = self()
# Register a tool
MCP.Server.register_tool(
server,
"add",
"Adds two numbers",
%{a: :number, b: :number},
fn %{a: a, b: b} -> a + b end
)
# Register a resource
MCP.Server.register_resource(
server,
"config://version",
"Version",
"Application version",
"text/plain",
fn _params -> "1.0.0" end
)
# Register a prompt
MCP.Server.register_prompt(
server,
"explain",
"Generates an explanation prompt",
[%{name: "topic", description: "Topic to explain", required: true}],
fn %{topic: topic} -> "Explain #{topic} in simple terms" end
)
{:ok, state}
end
end2.启动服务器
# Start the MCP server
{:ok, server_pid} = MyApp.MCPServer.start_link(name: "my-server", version: "1.0.0")
# Start stdio transport (for local/desktop use)
{:ok, _transport_pid} = MCP.Transport.Stdio.start_link(server: server_pid)3.与克劳德桌面一起使用
添加到您的Claude Desktop配置(~/Library/Application Support/Claude/claude_desktop_config.json 在macOS上):
{
"mcpServers": {
"my-server": {
"command": "/path/to/your/elixir/app"
}
}
}核心概念
工具
工具是AI可以执行的功能:
MCP.Server.register_tool(
server,
"multiply",
"Multiplies two numbers",
%{a: :number, b: :number},
fn %{a: a, b: b} ->
%{
result: a * b,
message: "#{a} × #{b} = #{a * b}"
}
end
)资源
资源通过基于URI的路由提供数据访问:
# Static resource
MCP.Server.register_resource(
server,
"config://database",
"Database Config",
"Database configuration",
"application/json",
fn _params ->
Jason.encode!(%{host: "localhost", port: 5432})
end
)
# Dynamic resource with parameters
MCP.Server.register_resource(
server,
"user://{user_id}/profile",
"User Profile",
"User profile data",
"application/json",
fn %{user_id: user_id} ->
Jason.encode!(%{id: user_id, name: "User #{user_id}"})
end
)提示
提示是LLM交互的可重用模板:
MCP.Server.register_prompt(
server,
"code_review",
"Generates a code review prompt",
[
%{name: "language", description: "Programming language", required: true},
%{name: "code", description: "Code to review", required: true}
],
fn %{language: language, code: code} ->
"""
Please review this #{language} code:
#{code}
Focus on:
- Code quality
- Best practices
- Potential bugs
"""
end
)运输
标准运输(当地)
对于桌面应用程序和本地集成:
MCP.Transport.Stdio.start_link(server: server_pid)HTTP传输(远程)
对于使用Phoenix或Plug的基于web的部署:
defmodule MyAppWeb.MCPController do
use MyAppWeb, :controller
def mcp_endpoint(conn, _params) do
MCP.Transport.HTTP.handle_request(conn, MyApp.MCPServer)
end
end架构定义
SDK提供了一个简单的模式DSL:
# Simple type mapping
%{
name: :string,
age: :integer,
email: :string
}
# Advanced schemas with constraints
%{
name: MCP.Schema.string(description: "User name", min_length: 1, max_length: 100),
age: MCP.Schema.integer(description: "User age", minimum: 0, maximum: 150),
tags: MCP.Schema.array(items: MCP.Schema.string())
}例子
完整服务器示例
看 examples/calculator_server.ex 一个完整的工作示例。
与Phoenix整合
看 示例/phoenix集成.ex 凤凰整合。
建筑
lib/mcp/
├── server.ex # Main server behavior
├── schema.ex # Schema definition and validation
├── protocol/
│ └── message.ex # JSON-RPC message handling
├── capabilities/
│ ├── tool.ex # Tool capability
│ ├── resource.ex # Resource capability
│ └── prompt.ex # Prompt capability
└── transport/
├── stdio.ex # Stdio transport
└── http.ex # HTTP/SSE transport协议版本
此SDK实现了MCP协议版本: 2024-11-05
与其他SDK的比较
| 功能 | Elixir SDK | Python SDK | TypeScript SDK |
|---|---|---|---|
| 协议版本 | 2024-11-05 | 2024年11月05 | 20241年11月5日 |
| 工具 | ✅ | ✅ | ✅ |
| 资源 | ✅ | ✅ | ✅ |
| 提示 | ✅ | ✅ | ✅ |
| 标准运输 | ✅ | ✅ | ✅ |
| HTTP传输 | ✅ | ✅ | ✅ |
| 类型安全 | ✅ 类型规格 | ✅ Pydantic | ✅ 佐德 |
| API风格 | 注册 | 装饰师 | 注册 |
贡献
欢迎投稿!请随时提交拉取请求。
许可证
MIT许可证-请参阅 许可证 了解详情。
链接
致谢
根据以下内容构建 模型上下文协议规范 通过Anthropic。
