Vancouver

by jameslong

38 stars
161 downloads
Not rated
GitHub

About

Vancouver is an Elixir library that integrates the Model Context Protocol (MCP) into Phoenix/Bandit servers. It handles initialization, request validation, and provides helper functions to simplify creating MCP tools and prompts. It is for developers building MCP endpoints in…

Details

Author
jameslong
GitHub stars
38
Downloads
161
Categories
Other

- Integrates MCP into Phoenix/Bandit servers.
- Handles initialization and request validation.
- Provides helpers for tools and prompts.
- Supports tools and prompts (sync responses only).
- Simple and extensible for custom needs.
- Published on Hex.pm for easy dependency management.

Add {:vancouver, "~> 0.3"} to your mix.exs, implement tool and prompt modules using Vancouver.Tool and Vancouver.Prompt, configure the server name and version in config.ex, then forward the /mcp route in your router with your modules. Optionally, configure MCP clients like Claude Desktop via mcp-remote.

Vancouver

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.

Getting started

1. Add dependency

In mix.exs:

defp deps do
  [
    {:vancouver, "~> 0.3"}
  ]
end

2. Create your tools/prompts

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

3. Add config

In config.ex:

config :vancouver,
  name: "My MCP Server",
  version: "1.0.0"

4. Add your MCP route

In router.ex:

forward "/mcp", Vancouver.Router, 
  tools: [MyApp.Tools.CalculateSum],
  prompts: [MyApp.Prompts.CodeReview]

5. (Optional) Add to your MCP client

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. 🚀

FAQ

Does Vancouver support all parts of the Model Context Protocol specification?

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.

Is Vancouver stable / ready for production?

No. This library is in early development. Expect breaking changes.

Why is this library called Vancouver?

Vancouver is the natural home of MCP (Mountain, Coffee, and Phoenix).

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.