PE

pjullrich/emcp

Developer tools

Эта страница переведена автоматически. Технические детали смотрите в оригинале. Открыть оригинал

36 stars 4 forks Качество 58 Тренд 12MIT

Сервер Model Context Protocol (MCP) для Elixir

Обзор

Минимальный сервер Elixir MCP (Model Context Protocol). Добавьте инициализацию магазина сеансов в начало вашего приложения/2: Вы можете использовать пользовательский магазин сеансов, реализуя EMCP. Поведение SessionStore. Добавьте потоковый HTTP-транспорт в свой маршрутизатор Phoenix. Установите его за пределами любого трубопровода, поскольку EMCP обрабатывает сами переговоры по контенту: Шаблоны, которые возвращают структурированные сообщения: Ресурсы раскрывают данные, которые клиенты могут прочитать. Статический ресурс имеет фиксированный URI: Шаблоны ресурсов используют шаблоны URI, чтобы клиенты могли запрашивать динамический контент: Когда клиент вызывает ресурсы / чтение, сервер сначала пробует точное соответствие URI со статическими ресурсами. Если ни один из них не совпадает, он пробует каждый шаблон ресурса в порядке, пока один не обрабатывает URI.

Обзор (машинный перевод)

Минимальный сервер Elixir MCP (Model Context Protocol).

Настройка

###1. Инициировать магазин сеансов

Добавьте инициализацию магазина сеансов в приложение start/2:

Вы можете использовать пользовательский магазин сеансов, реализуя поведение EMCP.SessionStore.

###2 - Выберите сервер

###3.Свернуть транспорт

Добавьте потоковый HTTP-транспорт в свой маршрутизатор Phoenix. Установите его за пределами любого трубопровода, поскольку EMCP обрабатывает сами переговоры по контенту:

4. Добавьте инструменты на ваш сервер

##Скорые

Шаблоны, которые возвращают структурированные сообщения:

##Ресурсы

Ресурсы раскрывают данные, которые клиенты могут прочитать. Статический ресурс имеет фиксированный URI:

Шаблоны ресурсов используют шаблоны URI, чтобы клиенты могли запрашивать динамический контент:

Когда клиент вызывает T2, сервер сначала пробует точное соответствие URI со статическими ресурсами. Если ни один из них не совпадает, он пробует каждый шаблон ресурса в порядке, пока один не обрабатывает URI.

Происхождение

Чтобы предотвратить DNS-атаки, вы можете включить проверку происхождения на транспорте. При включении будут приниматься только запросы с заголовком Origin, соответствующим разрешенному списку. Запросы без заголовка Origin (например, из инструментов CLI) всегда разрешены.

Эта страница переведена автоматически. Технические детали смотрите в оригинале.

README

Показан фрагмент оригинального README. Открыть оригинал.

EMCP

A minimal Elixir MCP (Model Context Protocol) server.

Setup

1. Initialize the session store

Add the session store initialization to your application’s start/2:

defmodule MyApp.Application do
  use Application

  def start(_type, _args) do
    EMCP.SessionStore.ETS.init()

    children = [
      # ...
    ]

    Supervisor.start_link(children, strategy: :one_for_one)
  end
end

You can use a custom session store by implementing the EMCP.SessionStore behaviour.

2. Define a server

defmodule MyApp.MCPServer do
  use EMCP.Server,
    name: "my-app",
    version: "1.0.0",
    tools: [MyApp.Tools.Echo],
    prompts: [MyApp.Prompts.CodeReview],
    resources: [MyApp.Resources.Readme],
    resource_templates: [MyApp.ResourceTemplates.UserProfile],
    # You can optionally add these meta fields as well:
    title: "My App",
    description: "MCP server for My App",
    instructions: "Use the tools to interact with My App.",
end

3. Mount the transport

Add the StreamableHTTP transport to your Phoenix router. Mount it outside any pipeline since EMCP handles content negotiation itself:

scope "/mcp" do
  forward "/", EMCP.Transport.StreamableHTTP, server: MyApp.MCPServer
end

4. Add tools to your server

defmodule MyApp.Tools.Echo do
  @behaviour EMCP.Tool

  @impl EMCP.Tool
  def name, do: "echo"

  @impl EMCP.Tool
  def description, do: "Echoes back the provided message"

  @impl EMCP.Tool
  def input_schema do
    %{
      type: :object,
      properties: %{
        message: %{type: :string}
      },
      required: [:message]
    }
  end

  @impl EMCP.Tool
  def call(_conn, %{"message" => message}) do
    EMCP.Tool.response([%{"type" => "text", "text" => message}])
  end

  # Return errors with:
  # EMCP.Tool.error("something went wrong")
end

Prompts

Prompts are reusable templates that return structured messages:

defmodule MyApp.Prompts.CodeReview do
  @behaviour EMCP.Prompt

  @impl EMCP.Prompt
  def name, do: "code_review"

  @impl EMCP.Prompt
  def description, do: "Reviews code with optional focus area"

  @impl EMCP.Prompt
  def arguments do
    [
      %{name: "code", description: "The code to review", required: true},
      %{name: "focus", description: "Optional area to focus on"}
    ]
  end

  @impl EMCP.Prompt
  def template(_conn, %{"code" => code} = args) do
    focus = args["focus"]

    user_text =
      if focus,
        do: "Review this code, focusing on #{focus}:\n\n#{code}",
        else: "Review this code:\n\n#{code}"

    %{
      "description" => "Code review prompt",
      "messages" => [
        %{"role" => "user", "content" => %{"type" => "text", "text" => user_text}},
        %{"role" => "assistant", "content" => %{"type" => "text", "text" => "I'll review the code you've provided."}}
      ]
    }
  end
end

Resources

Resources expose data that clients can read. A static resource has a fixed URI:

Открыть полный README на GitHub

Установка

This server does not publish a one-line install command.

Open the repository installation guide Новичок в MCP? Начните с руководства на mcpskill.org →

Конфигурация

{ "mcpServers": { "my-app": { "command": "mix", "args": ["run", "--no-halt"], "cwd": "/path/to/your/elixir/project" } } }