模型上下文协议SDK

用于构建模型上下文协议(MCP)服务器和客户端的Elixir SDK,支持工具、资源和提示的标准化交互。

  • by Pranavj17
  • Elixir
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 Pranavj17/elixir-sdk

使用说明

用于模型上下文协议(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
end

2.启动服务器

# 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:

    ```#{language}
    #{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。