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!

3 Likes