GustavoZiaugra

GustavoZiaugra

Ectomancer - Auto-generate MCP tools from Ecto schemas

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!

https://github.com/GustavoZiaugra/ectomancer

Where Next?

Popular in Announcing Top

zorbash
I created Kitto a framework for dashboards inspired by Dashing. The distributed characteristics of Elixir and the low memory footprint...
New
mischov
import Meeseeks.CSS html = HTTPoison.get!("https://news.ycombinator.com/").body for story <- Meeseeks.all(html, css("tr.athing")) do...
New
Azolo
Hey everyone, I just released WebSockex which is a Elixir WebSocket client. WebSockex strives to work as a OTP special process, be RFC6...
New
tmbb
PhoenixWS - Websockets over Phoenix Channels Source code on Github here: GitHub - tmbb/phoenix_ws: Websockets implemented over Phoenix Ch...
New
kevinlang
Hey all, We have made an Ecto3 Adapter for SQLite3, ecto_sqlite3! We have successfully on-boarded the full suite of integration tests (...
New
trisolaran
Hi! :waving_hand: I would like to present LiveSelect, a little library that I wrote to easily add a dynamic selection input to your LV f...
198 11220 107
New
type1fool
WebAuthnLiveComponent WebAuthnComponents See this post about renaming the package. Passwordless authentication for Phoenix LiveView app...
New

Other popular topics Top

KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36654 110
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44532 311
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New

We're in Beta

About us Mission Statement