1. Conduid
  2. Agents
  3. Pepe
MCP server · Agents

Pepe

An Elixir/OTP AI agent runtime: define agents, connect any OpenAI-compatible model, and run a tool-calling loop. CLI, HTTP API, web dashboard, Telegram, WhatsApp.

Unclaimed MIT devtools
44Fair

Scored 5 days ago · breakdown

About Pepe

Pepe is an MCP server published by pepe-agent in the Agents category: an Elixir/OTP AI agent runtime: define agents, connect any OpenAI-compatible model, and run a tool-calling loop. CLI, HTTP API, web dashboard, Telegram, WhatsApp.

The repository has 69 stars and 4 forks, with the last commit 8 days ago. Recent commit activity is the strongest signal that reported issues will get attention.

Install

uvx
uvx pepe-http
pip
pip install pepe-http

This server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.

Ask AI

✦

Ask AI about Pepe

Powered by Claude · Grounded in docs

I know everything about Pepe. Ask me about installation, configuration, usage, or troubleshooting.

Security checks

Static checks derived from the repository 2 days ago. Heuristics on the source, not an audit.

  • ✓README presentThe repository ships documentation.
  • ✓License declaredUsable under a stated license.
  • ✓Tests presentA test suite exists in the repository.
  • ✓Dependencies pinnedA lockfile pins dependency versions.
  • ✓No dynamic code executionSource scan found no eval, dynamic Function, or shell execution.

1 check has not been run yet.

Releases

v0.21.0v0.21.0 · 8 Oct 2026Added Every agent's system prompt is now shorter where less applies, so existing agents' prompts change. The operating rules and conventions are no longer sent whole to every conversation: the paragraph about telling people apart in a…
v0.20.0v0.20.0 · 30 Sep 2026Added The Pepe logo now comes as one image with the name and the words agent runtime under it, in a dark and a light version (SVG with the text outlined, plus PNG), in `assets/brand/` and the website. Set in Inter (SIL Open Font License,…
v0.19.1v0.19.1 · 18 Sep 2026Fixed There is a Windows binary again, and `Pepe.Insight` works on it - every task type, on its smaller algorithm families. The whole Windows build had been failing, on two separate dependencies that each need a native artifact their…
v0.19.0v0.19.0 · 18 Sep 2026Added A new `Pepe.Insight` subsystem: an agent trains and keeps small local models over an operator's own data, so a specific, repeated question ("will this patient deteriorate", "will this lead convert", "how many admissions next week")…
v0.18.0v0.18.0 · 12 Aug 2026Added `mix pepe plugin install`/`skill install`, and their conversational equivalents (`manage_plugin`, and the new `manage_skill` tool), now accept a PepeHub reference: the short `@handle/name` form, or the package's own page URL copied…

README

Where Pepe comes from. Pepe was born out of solving real problems across a range of companies I provided development services to: some needed a simple way to run their marketing without expanding headcount; others wanted to connect their ERP and database to an agent capable of answering their team's questions, without compromising on security. The project didn't start as open source: it was internal, proprietary tooling, custom-built for each client. But the results proved consistent enough, across different enough businesses, that I decided to give it a name, an identity of its own, and release it as open source, for anyone to use and contribute to.

Why "Pepe"? The name nods to Chespirito's comedy universe, loved across Latin America generations grew up with. The character's whole thing? He did exactly what he was told. No arguing, no improvising beyond the order. Which, funnily enough, describes an AI agent runtime perfectly. The project was once called Cortex; now it's Pepe. Same engine, better name. 🫡

Under the hood, it leans on what Elixir is good at: a lightweight process per conversation (so many run side by side), supervision that isolates crashes (one conversation failing never takes the rest down), and a small streaming HTTP stack.

It exposes those core capabilities several ways:

Surface Endpoint Use it for
Web dashboard GET / (Phoenix LiveView) Browse sessions and chat from the browser
OpenAI-compatible HTTP POST /v1/chat/completions, GET /v1/models Point any OpenAI SDK / LangChain / curl at Pepe
Usage HTTP API GET /v1/usage, /usage/events, /usage/runs, /usage/runs/:id Read what was spent, per message, from a client's billing system
WebSocket ws://.../socket/websocket, topic agent:<name> Live, token-streamed conversations
Telegram a Telegram bot Chat with your agent from your phone
Code editor pepe acp (Agent Client Protocol) Drive the agent from your editor, tool calls and permission prompts included
Terminal console mix pepe tui An interactive console that remembers the conversation
CLI mix pepe ... Create agents & model connections, run, serve

Everything talks to providers over the OpenAI Chat Completions protocol, so OpenAI, OpenRouter, Together, Groq, DeepSeek, Mistral, z.ai/GLM, Kimi/Moonshot, MiniMax, NovitaAI, Ollama, LM Studio, vLLM, llama.cpp and any other compatible endpoint work with zero code changes.


Quick start

Install and use

Grab the self-contained pepe binary (macOS, Linux, Windows; no root, no runtime to install):

curl -fsSL https://pepe-agent.com/install.sh | sh

# 1) scaffold ~/.pepe/config.json (guided, interactive)
pepe setup

# 2) add a model connection (any OpenAI-compatible provider; openrouter is a
#    known provider, so its base URL is filled in automatically)
pepe model add openrouter --api-key '${OPENROUTER_API_KEY}' --model openai/gpt-5-chat

# 3) define an agent (defaults to all built-in tools; the first model/agent
#    you add becomes the default automatically)
pepe agent add assistant --prompt "You are Pepe, a helpful assistant."

# 4) run it
export OPENROUTER_API_KEY=sk-...
pepe run "summarize what this project does"

# 5) or run it toward an outcome: it works, an independent reviewer checks the
#    result against your criterion, and it retries until that criterion is met
pepe goal "write release notes for this version" \
  --criteria "mentions every change in CHANGELOG's Unreleased section, in one line each"

See the quickstart guide for the full walkthrough.

Run toward a goal, not just a prompt

A prompt gets you one turn: the agent answers, and you decide whether it's good enough. A goal gets you an outcome: you state what "done" means, and Pepe keeps working until an independent reviewer (a separate model call that only sees your criterion and the result, never the working conversation) agrees it's met, or the attempt cap is reached.

pepe goal "OBJECTIVE" --criteria "how we know it's done" \
  [--max-attempts 3] [--judge MODEL] [--agent NAME]

Also on the dashboard: /goal <objective> | <success criterion> in any chat. The panel above the conversation shows the criterion, the attempt count, and the reviewer's last verdict as it runs.

Talk to it out loud

A voice note sent to a Telegram bot arrives as text: transcribed on the way in, before the agent runs, so slash commands and mention rules work by voice too. Needs no configuration if you already have a model connection to OpenAI or Groq, or point at a local command to keep audio on the machine:

mix pepe media audio --model groq --language en
mix pepe media audio --command "whisper-cli -f {file}"   # keep audio on the machine

Replies can come back as voice too (media.tts), and a photo goes to a vision-capable model as the actual image, not a filename. Full detail (flags, fallback chains, image caps) in the Voice messages docs.

Docker

docker run -d --name pepe -p 4000:4000 \
  -v pepe-data:/data -v pepe-tools:/tools \
  -e PEPE_DASHBOARD_PASSWORD=a-strong-password \
  ghcr.io/pepe-agent/pepe

Open http://localhost:4000. Images are published for amd64 and arm64 from the same release tag, so docker pull resolves to the right one on an M-series Mac or a server.

Two things are not optional, and both fail quietly if skipped:

  • The volumes. /data holds config, agents and conversations, and is what you back up. /tools holds single-file CLIs the agent installs for itself, kept apart so a backup carries state rather than regenerable, architecture-specific binaries.
  • The dashboard password. A container is not loopback, so Pepe's network guard treats it as public: with no password, every request gets a 403.

To give the agent a tool inside the container, a single-file CLI (op, gh, kubectl) goes in /tools, which is on the PATH, so it survives a new container without root or a rebuild. A system package (psql, imagemagick) has to go in the image, either through the PEPE_IMAGE_APT_PACKAGES build argument or a derived image, because anything apt installs dies with the container. ffmpeg is deliberately not in the image: neither transcription route needs it, and Debian's package pulls 204 packages to serve a GPU video stack a headless container never touches, which is what keeps the image at 408 MB rather than 945 MB. See the Docker docs, and docker-compose.yml if you'd rather docker compose up -d.

From source (development)

Clone the repo and drive it with mix instead of the binary: same steps as above, with mix pepe in place of pepe.

git clone https://github.com/pepe-agent/pepe.git && cd pepe
mix deps.get
mix pepe setup
mix pepe model add openrouter --api-key '${OPENROUTER_API_KEY}' --model openai/gpt-5-chat
mix pepe agent add assistant --prompt "You are Pepe, a helpful coding agent."
export OPENROUTER_API_KEY=sk-...
mix pepe run "list the files here and summarize the project"

Documentation

The docs live at pepe-agent.com/docs, in English, Portuguese and Spanish. One topic per page; open just what you need.

Start   Install, Docker, Quickstart

Configure   Models, Agents, Configuration, Secrets & vaults, Usage & billing, Projects

What an agent can do   Skills, PepeHub (skill/plugin marketplace), Learning (memory search included), Agent-to-agent routing, Delegation, Admin agents, Session search, Browser, Fetch URL

Talk to it   Dashboard, HTTP API, Usage API, WebSocket, Code editors, Telegram, WhatsApp, Slack, Discord, Teams, Chat, Widget

Automate & operate   Goals, Scheduled tasks, Flows, Board, Watches, MCP servers, Plugins, Security, Privacy hooks, Traces, Evals

In this repository

Only what you read when you are working on Pepe rather than with it. Everything a user reads lives on the site, once, so the two cannot drift apart, which is precisely what they did while there were two copies.

Architecture, CLI reference, Adding a tool, Tests, Migrating from another runtime, Contributing & help wanted

More screenshots


Put it in your product

Pepe is meant to be embedded. A few common paths:

  • Behind your web app / SaaS: point any OpenAI SDK at the HTTP API, scope access with per-project tokens, and keep tenants isolated with Projects.
  • Customer support on WhatsApp: connect a number and bind it to a support agent; see WhatsApp. Redact PII before it reaches any model with Privacy hooks.
  • Bill your clients: every model call is metered per project; export invoices from Usage & billing, or let their own system read the figures over HTTP with a read-only token via the Usage API.
  • Automate: recurring jobs with Scheduled tasks, one-shot "notify me when X" with Watches, durable multi-step handoffs with Board.

Contributing: help wanted 🙌

Help is genuinely welcome: bug reports, docs fixes, features, and especially confirming providers work. Small, focused PRs are the easiest to review and merge.

Get set up in a minute (no database, no API keys needed for the test suite):

git clone https://github.com/pepe-agent/pepe.git && cd pepe
mix deps.get
mix test          # the whole suite, over real TCP - no DB, no keys

Then fork the repo on GitHub, clone your fork, branch off master, make your change (match the style in AGENTS.md), run mix precommit, and push:

git checkout -b my-fix
# ... make your change ...
git push -u origin my-fix

Open a PR against pepe-agent/pepe:master from your fork (GitHub shows a "Compare & pull request" button after the push). Adding a tool? Follow Adding a tool.

The single most useful thing you can do: I run Pepe day-to-day on one setup (the ChatGPT/Codex OAuth subscription), so most providers are unverified. If you use OpenRouter, Groq, DeepSeek, Together, Mistral, Ollama, LM Studio, the Claude Pro/Max sign-in, or anything else, run mix pepe model test, try one prompt, and open an issue saying whether streaming and tool-calling worked. That feedback is worth a lot.

Full guide, including everything that needs testing: Contributing & help wanted.


Support

If Pepe is useful to you, sponsoring helps cover the real cost of keeping it working across providers: verifying new models, testing streaming/tool-calling against paid APIs (OpenRouter, Groq, DeepSeek, Together, ...), and the time spent maintaining it.

License

MIT

README fetched from the repository 2 days ago. The original is authoritative.

Questions

About Pepe

How do I install Pepe?

Run uvx pepe-http, then add the server to your MCP client's configuration.

Is Pepe safe to use with an AI agent?

Its trust score is 44 out of 100 (fair). It passes 5 of the 5 static security checks run so far. It has no ConduID identity yet, so agent calls to it are not receipted.

Is Pepe still maintained?

Yes — the latest release is v0.21.0 (8 Oct 2026), and the last commit was 8 days ago. The repository has 69 stars and 5 open issues.