Ectomancer automatically exposes Phoenix/Ecto applications as MCP (Model Context Protocol) servers, making them conversationally operable by AI assistants like Claude with minimal configuration.
Key Features
Zero-Config Tool Generation
The expose macro automatically generates MCP tools from your Ecto schemas:
defmodule MyApp.MCP do
use Ectomancer, name: "myapp-mcp"
# Generates: list_users, get_user, create_user, update_user, destroy_user
expose MyApp.Accounts.User
# Filter sensitive fields
expose MyApp.Blog.Post,
only: [:title, :body],
except: [:internal_notes]
end
Authorization System
Production-ready access control with three strategies:
Inline functions for simple checks:
tool :admin_stats do
authorize fn actor, _ -> actor.role == :admin end
end
Policy modules for complex logic:
defmodule MyApp.Policy do
def authorize(actor, action) do
case action do
:list -> :ok
:create when actor.role == :admin -> :ok
_ -> {:error, "Unauthorized"}
end
end
end
tool :user_action do
authorize with: MyApp.Policy
end
Cascade authorization at multiple levels:
expose User,
actions: [:list, :get, :create],
authorize: [
list: :none, # public
get: fn actor, _ -> actor != nil end, # authenticated
create: with: AdminPolicy # policy module
]
Additional Features
• Binary ID/UUID support - Automatic string-to-UUID casting
• Field filtering - :only and :except options
• Namespace support - Prevent tool naming collisions
• Custom tools - Define tools with params for complex operations
• Automatic actor threading - Current user passed to every tool call
Installation
def deps do
[
{:ectomancer, "~> 0.1.0-rc.2"}
]
end
Usage
Add to your router:
scope "/mcp" do
pipe_through :api
forward "/", Ectomancer.Plug, server: MyApp.MCP
end
Current Status
Version 0.1.0-rc.2 is feature-complete with:
• Full CRUD operations (list, get, create, update, destroy)
• Complete authorization system
• Binary ID/UUID support
Questions:
• How are you integrating LLMs with your Phoenix apps?
• What patterns do you use for exposing Ecto schemas to external consumers?
Love to hear more from you guys on this!






















