zoedsoupe

zoedsoupe

Anubis (formerly Hermes) MCP - Model Context Protocol Implementation for Elixir

update (since 2025-07-24)

the project got forked and rebranded to anubis-mcp, since i not on CloudWalk anymore and can’t ensure they will have interest of maintaining the original project. the fork happened from the v0.13.0 and i’m tracking the opened issues on hermes while developing new features and following the feedback from this thread. thanks for the attention!

original description

Hey folks!

I would like to introduce hermes-mcp, a comprehensive elixir implementation of the https://spec.modelcontextprotocol.io/ that we’ve been building and using in production at CloudWalk. MCP enables standardized communication between LLMs and external tools, and we’re excited to share what we’ve built with the community.

current state & protocol support

hermes provides both client and server implementations with full support for the MCP spec:

  • draft & 2024-11-05 spec: complete implementation
  • 2025-03-26 spec: partial (missing OAuth authentication)
  • 2025-06-18 spec: on the roadmap

client architecture

the client supports multiple transport layers:

  • STDIO
  • SSE (Server-Sent Events)
  • WebSocket
  • Streamable HTTP

what’s interesting about the architecture is how it leverages OTP patterns. each client runs as a supervised process tree:
Client.Supervisor
├── Client.Base (handles MCP protocol and state management)
└── Transport Process (manages I/O and acts like a bridge between external world and the client process)

you can use it either as a long-running process or spawn one-off clients for specific tasks. the supervision strategy ensures fault tolerance based on the :one_for_all strategy.

server architecture

the server implementation supports:

  • STDIO, SSE, and Streamable HTTP transports
  • direct integration with Plug/Phoenix applications
  • component-based design for tools, prompts, and resources
  • low level implementation or higher-level where the library handle most of the requests/notifications

the server supervision tree adapts based on transport type:
Server.Supervisor
├── Session.Supervisor (for HTTP transports)
├── Server.Base (protocol handler)
└── Transport Process

production usage

we’re currently running hermes in production at CloudWalk, powering capabilities for JIM, our financial assistant serving hundreds of thousands of users across Brazil. our setup includes:

  • as MCP client: both local and clusterized deployments providing server capabilities to JIM
  • as MCP server (in progress): building a clusterized implementation using Horde for JIM to expose capabilities to external clients like Claude Desktop

why elixir for MCP?

Have you thought about how elixir’s concurrency model maps perfectly to MCP’s architecture? each session gets its own supervised process, state management is clean through genservers, and the fault tolerance means a single bad request won’t bring down your integration. plus, with libraries like Horde, we can easily distribute MCP servers across nodes.

looking for community input

some questions we’re exploring:

  • what patterns have you found useful for managing stateful connections with external services?
  • how are you handling protocol version negotiation in your APIs?
  • anyone else working with MCP or similar AI tool protocols?

we’d particularly love feedback on:

  • the component-based server design (using use Hermes.Server.Component)
  • our approach to transport abstraction and supervision tree architecture
  • ideas for the clusterized server implementation and possible edge cases/caveats

The library is available on

Documentation is on anubis_mcp v0.17.0 — Documentation

What challenges are you facing with LLM integration that MCP and maybe hermes-mcp might help solve?

Most Liked

zoedsoupe

zoedsoupe

hey everyone!

I’m the core maintainer of hermes-mcp, which has grown to 30k+ downloads and 250+ GitHub stars. Since i’m not working anymore on the Cloudwalk org and I’m uncertain about their long-term maintenance plans for the project, I’ve decided to fork and rebrand it as Anubis MCP :wolf:

What’s the situation:

  • I’ve been the primary developer and maintainer of hermes-mcp
  • Given corporate uncertainties, I want to ensure the community has a guaranteed maintained version
  • Anubis MCP is already published following the same latest release
  • I’m tracking all existing issues and pull requests from the original

What you get:

  • Same battle-tested Elixir MCP implementation
  • Continued active development and community support
  • All the performance and reliability you’re used to
  • Same API, easy migration path

The name Anubis felt fitting - as the Egyptian god of transitions, it seemed appropriate for guiding this project through its own transition. Plus, sometimes you need a deity of change to help you… transition :transgender_flag:

If you’re currently using hermes-mcp, I’d encourage migrating to anubis-mcp for guaranteed ongoing support and development.

Repository: GitHub - zoedsoupe/anubis-mcp: Elixir Model Context Protocol (MCP) SDK (hermes-mcp fork)
Hex: anubis_mcp | Hex

Would love your continued support and feedback! And now i have more free time to take care about more delicate parts of the project, like documentation ^-^

netProphET

netProphET

I’ve gotten a proof of concept working of a Hermes.Server that can register and call AshAi tools. It’s enough of a “walking skeleton” that it seems worth exploring further.

josevalim

josevalim

Creator of Elixir

What we did in Tidewave was to allow the tool to specify if it is stateful or not. If it is stateful, it runs within the SSE/frame process and receives the frame state argument. Otherwise, it just runs within its request process. If no tools are stateful, then there is no need for the session ID.

And for the frame/SSE process location, you can use a registry. I would start with Erlang’s built in global.

Finally, I think a MCP library has to solve two separate problems: the implementation of the MCP protocol and the abstraction for defining tools. I would suggest solving them separately. For example, MCP protocol implementation could do all negotiation and then call a module for listing and invoking tools, without actually caring how these tools are defined.

zoedsoupe

zoedsoupe

hey @ziinc!

  1. yes! i would like to make the server architecture more reliable/stable and then allow users to customize/extend it like with custom HTTP clients or even session stores, which cover the nest topic
  2. yeah, i over complicated the session managed and sincerely i should ditch it totally and merge with the frame concept since as i already said on this thread, “session” in the perspective of MCP is an internal technical detail and should not be exposed to users directly (at least the management). we already have a auto-cleanup/auto-close feature tho, but ETS is way better in this case and we could extend it as said on 1. making an interface for whim would to store session on other stores like redis.
  3. i don’t think is possible to do that actually, although it seems to be better, it need to hold state but we can think of it as a router? so sessions process the message and answer directly to the transport/SSE process
  4. yes! i will be doing that

thanks for the feedback, i’ll be tackling it in the next weeks and i generally agree with all points! also remembering that i forked the original repo to anubis-mcp

LostKobrakai

LostKobrakai

I’ve adjused the title.

Where Next?

Popular in Announcing Top

shahryarjb
The Chelekom project is a library of Phoenix and LiveView components generated via Mix tasks to fit developer needs seamlessly. One of i...
New
MRdotB
Greetings Elixir community! Today, I’m thrilled to present you with resvg_nif, an open-source project that provides Elixir bindings for ...
New
pcharbon
This is a new extension for the Ash framework that lets you use the Commanded library in a more declarative manner and removes most of th...
New
frerich
An application wishing to store larger amounts of data typically has two options for doing so: A new column on some table can be introd...
New
metehan
exterm_ai runs a real PTY in Elixir and exposes it in the browser using xterm.js. Previously I shared exterm library without AI this one ...
#ai
New
restlessronin
The repo is at GitHub - cyberchitta/openai_ex: Community maintained Elixir library for OpenAI API. Docs are at OpenaiEx User Guide — ope...
New
sonic182
Hi everyone, at Doofinder we have been building llm_composer for some new apps, and we thought it could be useful to share it with the co...
New
munksgaard
flakify is an igniter installer that allows you to quickly get a Nix flake-based development shell up and running for your Elixir/Phoenix...
New
mattmower
I’m pleased to announce that we’ve released DemoGen v0.1.7, a library for creating repeatable demo scenarios in your Ecto-based SaaS appl...
New
byoungdale
Hey everyone, I’m excited to share my first hex package: parrot_platform | Hex - a pure Elixir SIP protocol implementation with RTP audi...
New

Other popular topics Top

9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1140 51847 244
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
Tee
can someone please explain to me how Enum.reduce works with maps
New
AstonJ
You’re a programmer, so you don’t need spoon feeding with the conventional drivel about “this is an integer.” No. You need to know what’s...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
johnnyicon
Hi all, I've just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I'm trying to use Postg...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New

We're in Beta

About us Mission Statement