README.md

# Vancouver

> [!WARNING]
>
> This library is under active development - expect breaking changes

Vancouver makes it easy to add [Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) functionality to your Phoenix/Bandit server. Vancouver handles initialization, request validation, and offers helper functions to simplify the creation of MCP tools. 

## Getting started

### 1. Add dependency

In `mix.exs`:

```elixir
defp deps do
  [
    {:vancouver, "~> 0.1.0"}
  ]
end
```

### 2. Create your tools

```elixir
defmodule MyProject.Tools.ExampleTool do
  @moduledoc """
  Implements the `ExampleTool` tool.
  """

  use Vancouver.Tool

  def name, do: "example_tool"
  def description, do: "An example tool for demonstration purposes"

  def input_schema do
    %{
      "type" => "object",
      "description" => "Input parameters for the example tool",
      "properties" => %{
        "example_param" => %{
          "type" => "string",
          "description" => "An example parameter for the tool"
        }
      },
      "required" => ["example_param"],
      "additionalProperties" => false
    }
  end

  def run(conn, %{"example_param" => example_param}) do
    send_text(conn, "Example tool executed successfully with param: #{example_param}")
  end
end
```

### 3. Update the config

In `config.ex`:

```elixir
config :vancouver,
  name: "My MCP Server",
  version: "1.0.0",
  tools: [
    MyProject.Tools.ExampleTool
  ]
```

### 4. Add your MCP route

In `router.ex`:

```elixir
post("/mcp/v1", do: Vancouver.Plugs.Pipeline.call(conn))
```