Vancouver makes it easy to add Model Context Protocol (MCP) functionality to your Phoenix/Bandit server. Vancouver handles initialization, request validation, and offers helper functions to simplify the creation of MCP tools and prompts.
In mix.exs
:
defp deps do
[
{:vancouver, "~> 0.3"}
]
end
You can implement tools like this:
defmodule MyApp.Tools.CalculateSum do
use Vancouver.Tool
def name, do: "calculate_sum"
def description, do: "Add two numbers together"
def input_schema do
%{
"type" => "object",
"properties" => %{
"a" => %{"type" => "number"},
"b" => %{"type" => "number"}
},
"required" => ["a", "b"]
}
end
def run(conn, %{"a" => a, "b" => b}) do
send_text(conn, "#{a + b}")
end
end
And prompts like this:
defmodule MyApp.Prompts.CodeReview do
use Vancouver.Prompt
def name, do: "code_review"
def description, do: "Asks the LLM to analyze code quality and suggest improvements"
def arguments do
[
%{
"name" => "code",
"description" => "The code to review",
"required" => true
}
]
end
def run(conn, %{"code" => code}) do
send_text(conn, "Please review this code: #{code}")
end
end
In config.ex
:
config :vancouver,
name: "My MCP Server",
version: "1.0.0"
In router.ex
:
forward "/mcp", Vancouver.Router,
tools: [MyApp.Tools.CalculateSum],
prompts: [MyApp.Prompts.CodeReview]
E.g. For Claude Desktop, you can modify your config Settings -> Developer -> Edit config
as follows:
{
"mcpServers": {
"MyApp": {
"command": "npx",
"args": [
"mcp-remote",
"http://localhost:4000/mcp"
]
}
}
}
Run your server, and restart Claude to starting using your MCP tools. 🚀
Not yet. Vancouver currently supports:
- tools
- prompts
- sync responses (no streaming)
However, the library is simple enough that you should be able to modify it for your needs.
For more info on the protocol itself, see the MCP User Guide.
No. This library is in early development. Expect breaking changes.
Vancouver is the natural home of MCP (Mountain, Coffee, and Phoenix).