
pjullrich/emcp
Developer toolsЭта страница переведена автоматически. Технические детали смотрите в оригинале. Открыть оригинал
Сервер 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:
Установка
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"
}
}
}