Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .claude/skills/aeon/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ Goal: one real notification in their phone, fast. Do not configure a schedule fi

> **Fastest start, no terminal: Aeon Connect.** If the user has no terminal, no Node or `gh`, or just wants the quickest path, send them to https://www.aeon.fun/connect. In the browser they sign in with GitHub, create their aeon (a public fork or a private copy), install the Aeon Connect GitHub App on that one repo, connect a model, and pick skills. Nothing else to do: the agent then runs on their own GitHub Actions. Use the terminal path below only if they want a local clone.

> **Want to drive it from a chat app instead?** Once an instance exists, the user can add https://www.aeon.fun/connect/mcp as a connector in ChatGPT, Claude or Cursor (Claude Code: `claude mcp add --transport http aeon https://www.aeon.fun/connect/mcp`). It signs in with GitHub and can run skills, read outputs and memory, and edit strategy and soul. Details: `references/mcp.md`.

1. **Run `./aeon init`.** Ask public or private first (public: Actions minutes are free; private: `--private`, minutes bill against the account quota, 2,000/mo on Free). Then, from a clone of the template:

```bash
Expand Down
5 changes: 3 additions & 2 deletions .claude/skills/aeon/references/mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@

## First: which direction?

Two unrelated things share the name. Get this wrong and nothing works.
Three things share the name. Get this wrong and nothing works.

| | |
|---|---|
| **`.mcp.json`** - *external MCP servers, called BY Aeon skills* | Wired via the dashboard MCP panel or `./aeon mcp add`. This is what you want when a skill needs a tool. |
| **`bin/add-mcp`** - *Aeon itself AS an MCP server* | Builds `apps/mcp-server` and registers it with Claude Code / Desktop, so all 85 skills appear as `aeon-*` tools **in your local Claude**. Nothing to do with a skill calling out. |
| **`www.aeon.fun/connect/mcp`** - *your Aeon as a HOSTED MCP server* | Aeon Connect's remote server: sign in with GitHub, pick your agent repo, then run skills (on your GitHub Actions), read runs, output and memory, and toggle skills **from ChatGPT, Claude or any MCP client**. Nothing to install, no keys in chat. Claude Code: `claude mcp add --transport http aeon https://www.aeon.fun/connect/mcp`. |

The rest of this doc is the first one. For the second: `bin/add-mcp`, `--desktop` for a Claude Desktop snippet, `--uninstall` to remove, `claude mcp list` to verify.
The rest of this doc is the first one. For the second: `bin/add-mcp`, `--desktop` for a Claude Desktop snippet, `--uninstall` to remove, `claude mcp list` to verify. For the third: add the URL as a custom connector (ChatGPT, Claude) or with the command above, then sign in when asked.

## Adding a server

Expand Down
4 changes: 2 additions & 2 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ catalog/ ← registries the dashboard reads (generated + hand-au
bin/ ← operator + maintainer CLI (run from repo root, e.g. bin/add-skill)
onboard ← validate the fork's setup (secrets, workflows, channels)
add-skill ← import skills from GitHub repos (with security scanning)
add-mcp ← register Aeon as an MCP server for Claude Desktop/Code
add-mcp ← register Aeon as a local MCP server for Claude Desktop/Code
install-skill-pack ← install a curated community skill pack
export-skill ← package skills for standalone distribution
new-from-template ← scaffold a skill from a template (--category sets its pack)
Expand All @@ -153,7 +153,7 @@ skills/ ← each skill is a SKILL.md prompt file (`category:` =
apps/ ← standalone sub-projects, each with its own package.json
dashboard/ ← local web UI (Next.js + json-render feed)
cli/ ← headless CLI (`./aeon <command>`) — the dashboard's features as commands
mcp-server/ ← MCP server — exposes skills as Claude tools
mcp-server/ ← local stdio MCP server (the hosted one lives in Aeon Connect)
webhook/ ← Telegram instant-mode Cloudflare Worker (~1s delivery)
memory/ ← durable memory the agent reads/writes across runs
MEMORY.md ← goals, active topics, pointers
Expand Down
8 changes: 7 additions & 1 deletion .github/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
> **▶ Start in your browser:** **[www.aeon.fun/connect](https://www.aeon.fun/connect)** - sign in with GitHub, connect a model, pick skills. No clone, no terminal.
>
> **🤖 Using a coding agent?** Point it here: **read https://www.aeon.fun/skills/aeon.md and follow the instructions to set up your Aeon agent.**
>
> **Already have an agent?** Drive it from ChatGPT, Claude or Cursor: add **https://www.aeon.fun/connect/mcp** as a connector and sign in with GitHub.

<div align="center">

Expand All @@ -46,6 +48,8 @@

**Using a coding agent?** Paste this into Claude Code, Codex, Hermes or OpenClaw: `read https://www.aeon.fun/skills/aeon.md and follow the instructions to set up your aeon agent`.

**Drive it from ChatGPT, Claude or Cursor.** Add `https://www.aeon.fun/connect/mcp` as a connector (custom MCP server). Sign in with GitHub, pick which agent it can reach, then list and run skills, read their output and memory, or edit your strategy and soul from the chat. Nothing to install, no keys. Claude Code: `claude mcp add --transport http aeon https://www.aeon.fun/connect/mcp`. Runs still happen on your own GitHub Actions.

<details>
<summary><strong>Prefer the terminal?</strong></summary>

Expand Down Expand Up @@ -189,6 +193,8 @@ Read-only skills can't touch the repo, irreversible actions fail closed, an opti

Muse, Grok, and Hermes Cloud run around the clock too, but on their own servers, and they train on your chats unless you opt out ([Muse](https://www.engadget.com/2256577/how-to-get-started-with-meta-s-new-ai-agent-muse/), [Grok](https://x.ai/legal/faq), [Hermes Cloud](https://portal.nousresearch.com/privacy)). Aeon runs on your own GitHub Actions: memory is files in your repo, keys are your repo's encrypted secrets, there is no Aeon server in the loop, and nothing is sent anywhere unless you point tracing at your own collector. Keep it fully private with a **private** instance ([two-repo strategy](../docs/CONFIGURATION.md#two-repo-strategy)) and your own model key - your model provider's terms still apply.

The hosted MCP server is opt-in: when you connect it, Aeon Connect reads what you ask for (runs, outputs, memory) from your repo and hands it to your chat client.

---

## Configure
Expand Down Expand Up @@ -235,7 +241,7 @@ The deep reference lives in [`docs/`](../docs) - jump in:
</p>
<p align="center">
<a href="../apps/cli/README.md"><img src="../docs/assets/doc-cli.svg" alt="CLI - the whole dashboard as scriptable ./aeon commands" height="30" align="absmiddle"></a>&nbsp;
<a href="../apps/mcp-server/README.md"><img src="../docs/assets/doc-mcp.svg" alt="MCP server - every skill as an aeon MCP tool in Claude" height="30" align="absmiddle"></a>&nbsp;
<a href="../apps/mcp-server/README.md"><img src="../docs/assets/doc-mcp.svg" alt="MCP server - run Aeon from ChatGPT, Claude or Cursor (hosted at www.aeon.fun/connect/mcp) or every skill as a local MCP tool" height="30" align="absmiddle"></a>&nbsp;
<a href="../apps/webhook/README.md"><img src="../docs/assets/doc-webhooks.svg" alt="Webhooks - ~1s Telegram instant mode via a self-hosted worker" height="30" align="absmiddle"></a>&nbsp;
<a href="../docs/ADK.md"><img src="../docs/assets/doc-adk.svg" alt="ADK - build products on top of Aeon over the GitHub API" height="30" align="absmiddle"></a>&nbsp;
<a href="../docs/ECOSYSTEM.md"><img src="../docs/assets/doc-ecosystem.svg" alt="Ecosystem - products and agents built on Aeon" height="30" align="absmiddle"></a>
Expand Down
8 changes: 8 additions & 0 deletions .github/SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,14 @@ injection — see the `## Security` section of [`CLAUDE.md`](../CLAUDE.md).
through the Aeon Connect GitHub App, installed on that one repo only. Keys you
connect are encrypted straight into the repo's Actions secrets; Aeon Connect
does not store them.
- The hosted MCP server at [www.aeon.fun/connect/mcp](https://www.aeon.fun/connect/mcp)
uses OAuth 2.1 with GitHub sign-in. A client reaches only the repos you
approve, through the same Aeon Connect GitHub App. Its write tools
(`run_skill`, `update_skill`, `update_strategy`, `update_soul`,
`install_pack`) act on that repo. Secret values are never readable or
writable over it. To cut access at once, uninstall the Aeon Connect GitHub
App or remove the repo from it; otherwise unused access expires after 30
days.
- A public instance's `memory/`, `output/`, and run logs are public. To keep
them private, make the instance a **private repo** (a copy of the template:
GitHub does not allow private forks of a public repo).
Expand Down
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,17 @@ from or pin to; the template keeps serving the latest `main` to new forks.

### Added

- **Hosted MCP server: drive your agent from ChatGPT, Claude or Cursor.** Aeon Connect now serves
a remote MCP server at [www.aeon.fun/connect/mcp](https://www.aeon.fun/connect/mcp) (Streamable
HTTP, OAuth 2.1 with dynamic client registration and PKCE, GitHub sign-in). The consent screen
picks which agent repo a client can reach, and `switch_instance` moves between your Aeon repos
after a fresh GitHub check. About 20 tools list and run skills (runs dispatch on the repo's own
GitHub Actions), read runs, output and memory, edit skills, strategy and soul, show setup status
(key names only) and install packs. Secret values are never readable or writable over it. Claude
Code: `claude mcp add --transport http aeon https://www.aeon.fun/connect/mcp`. The README, setup
skill, `apps/mcp-server` README, security policy, `llms.txt` and docs now point to it, and
`bin/add-mcp` warns before its `claude mcp remove aeon` would delete a hosted `aeon` entry.
(aeon-connect #66, #68)
- **Aeon Connect: start an agent from the browser.** [www.aeon.fun/connect](https://www.aeon.fun/connect)
is the hosted, multi-tenant version of the dashboard (aaronjmars/aeon-connect). Sign in with GitHub,
**Create your aeon**: the repo is created first (public = a real fork of aeonfun/aeon that can pull
Expand Down
4 changes: 3 additions & 1 deletion apps/cli/src/commands/mcp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ const USAGE = `aeon mcp — MCP servers wired into skill runs (.mcp.json)

Options:
--dry-run Preview the change to .mcp.json
--json Machine-readable output`
--json Machine-readable output

Driving Aeon itself from ChatGPT, Claude or Cursor? Hosted: https://www.aeon.fun/connect/mcp - local: bin/add-mcp`

async function readServers(): Promise<McpServers> {
let content: string
Expand Down
4 changes: 4 additions & 0 deletions apps/dashboard/components/McpPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,10 @@ export function McpPanel({ servers, loading, saving, secrets, busy, onSave, onSe
Servers your skills can <span className="text-primary-100">call</span> during a run - GitHub, a database,
a paid API.
</p>
<p className="mt-2 max-w-xl text-sm text-primary-70 leading-relaxed">
Want the other direction? Drive this agent from ChatGPT, Claude or Cursor with the hosted MCP server:{' '}
<a href="https://www.aeon.fun/connect/mcp" target="_blank" rel="noopener noreferrer" className="text-primary-70 underline decoration-dotted underline-offset-2 hover:text-aeon-fg transition-colors">www.aeon.fun/connect/mcp</a>
</p>
</div>
</section>

Expand Down
31 changes: 29 additions & 2 deletions apps/mcp-server/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,33 @@
# Aeon MCP Server
# Aeon MCP Server (local)

Expose every Aeon skill as a [Model Context Protocol](https://modelcontextprotocol.io) tool, so you can run any skill straight from **Claude Desktop** or **Claude Code** — no GitHub Actions, no cron, no separate UI. Each skill shows up as an `aeon-<slug>` tool; ask Claude to use it and it runs the exact same `SKILL.md` prompt the scheduled runner uses.
Expose every Aeon skill as a [Model Context Protocol](https://modelcontextprotocol.io) tool, so you can run any skill straight from **Claude Desktop** or **Claude Code** on your own machine. Each skill shows up as an `aeon-<slug>` tool; ask Claude to use it and it runs the exact same `SKILL.md` prompt the scheduled runner uses. Using ChatGPT or Cursor, or want nothing to install? Use the hosted server at [www.aeon.fun/connect/mcp](https://www.aeon.fun/connect/mcp) instead (see below).

## Hosted or local?

There are two Aeon MCP servers. Pick the one that fits:

| | Hosted (Aeon Connect) | Local (this app) |
|---|---|---|
| **Add it with** | `https://www.aeon.fun/connect/mcp` as a connector | `bin/add-mcp` |
| **Transport** | Streamable HTTP, OAuth 2.1 with GitHub sign-in | stdio |
| **Works in** | ChatGPT, Claude, Claude Code, Cursor, any remote MCP client | Claude Code, Claude Desktop |
| **Runs skills on** | your repo's own GitHub Actions | your machine, through `harness-adapter/run-harness` |
| **Tools** | about 20: list and run skills, read runs, output and memory, edit skills, strategy and soul, check setup, install packs, switch between your Aeon repos | one `aeon-<slug>` tool per skill |
| **Needs** | an Aeon repo with the Aeon Connect GitHub App installed | a clone of your repo, Node 20+, a harness CLI signed in, and the keys your skills use |

**Hosted how-to.** Add `https://www.aeon.fun/connect/mcp` as a custom connector (custom MCP server) in ChatGPT, Claude or Cursor. In Claude Code:

```bash
claude mcp add --transport http aeon https://www.aeon.fun/connect/mcp
```

Sign in with GitHub when asked, then pick which agent repo the client can reach on the consent screen. Secret values are never readable or writable over it; `setup_status` only shows key names.

**Using both?** `bin/add-mcp` registers the local server under the name `aeon` and first runs `claude mcp remove aeon`, which would delete a hosted entry with the same name (the script warns you when it sees one). To keep both, add the hosted one under another name:

```bash
claude mcp add --transport http aeon-cloud https://www.aeon.fun/connect/mcp
```

## What it is

Expand Down
31 changes: 28 additions & 3 deletions bin/add-mcp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# add-mcp — Install the Aeon MCP server so Claude Code and Claude Desktop
# add-mcp - Install the Aeon MCP server so Claude Code and Claude Desktop
# can invoke any Aeon skill directly from the Claude interface.
#
# Usage:
Expand All @@ -10,15 +10,18 @@
# bin/add-mcp --help Show this help
#
# After running, every Aeon skill appears as an 'aeon-<name>' tool in Claude.
# Skills run locally via `claude -p -` exactly as they do on GitHub Actions.
# Skills run locally through harness-adapter/run-harness, as on GitHub Actions.
#
# No install wanted, or using ChatGPT or Cursor? Use the hosted server instead:
# claude mcp add --transport http aeon https://www.aeon.fun/connect/mcp

set -euo pipefail

DIR="$(cd "$(dirname "$0")/.." && pwd)"
MCP_DIR="$DIR/apps/mcp-server"

usage() {
sed -n '3,12p' "$0" | sed 's/^# //'
sed -n '2,16p' "$0" | sed -E 's/^# ?//'
exit 0
}

Expand All @@ -27,6 +30,15 @@ info() { printf '\033[0;34m%s\033[0m\n' "$*"; }
ok() { printf '\033[0;32m✓ %s\033[0m\n' "$*"; }
warn() { printf '\033[0;33m⚠ %s\033[0m\n' "$*"; }

HOSTED_URL="https://www.aeon.fun/connect/mcp"

# True when the 'aeon' entry in Claude Code is the hosted server, not this one.
aeon_entry_is_hosted() {
local entry
entry="$(claude mcp get aeon 2>/dev/null)" || return 1
[[ "$entry" == *"aeon.fun/connect/mcp"* ]]
}

BUILD_ONLY=false
SHOW_DESKTOP=false
UNINSTALL=false
Expand All @@ -47,6 +59,11 @@ if [[ "$UNINSTALL" == "true" ]]; then
if ! command -v claude &>/dev/null; then
err "'claude' CLI not found. Nothing to uninstall."
fi
if aeon_entry_is_hosted; then
warn "The 'aeon' entry in Claude Code is the hosted server ($HOSTED_URL), not this local one. Leaving it in place."
warn "To remove it anyway, run: claude mcp remove aeon"
exit 0
fi
info "Removing Aeon MCP server from Claude Code..."
if claude mcp remove aeon 2>/dev/null; then
ok "Removed 'aeon' from Claude Code MCP servers"
Expand Down Expand Up @@ -111,6 +128,11 @@ if ! command -v claude &>/dev/null; then
warn "Then run: claude mcp add aeon node \"$SERVER_PATH\""
else
info "Registering with Claude Code..."
if aeon_entry_is_hosted; then
warn "Your existing 'aeon' entry is the hosted server ($HOSTED_URL). Replacing it with the local one."
warn "To keep both, re-add the hosted one under another name:"
warn " claude mcp add --transport http aeon-cloud $HOSTED_URL"
fi
# Remove existing entry to avoid duplicates, then re-add
claude mcp remove aeon 2>/dev/null || true
claude mcp add aeon node "$SERVER_PATH"
Expand All @@ -131,6 +153,9 @@ echo "│ Example usage in Claude: │"
echo "│ Use the aeon-digest tool for a digest on AI agents │"
echo "│ Use aeon-token-movers with var=\"bitcoin\" │"
echo "│ Run aeon-article with var=\"lens:AI agent frameworks\" │"
echo "│ │"
echo "│ No install, or ChatGPT / Cursor? Use the hosted server: │"
echo "│ www.aeon.fun/connect/mcp │"
echo "└──────────────────────────────────────────────────────────┘"
echo ""

Expand Down
3 changes: 2 additions & 1 deletion docs/ADK.md
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,8 @@ Total infrastructure on your side: one GitHub App and a session store. No agent

### 5.4 Other entry points worth knowing

- **MCP server** ([`apps/mcp-server`](../apps/mcp-server/README.md)) - every skill as an `aeon-<slug>` tool in Claude Desktop/Code; the local, push-button complement to your hosted integration.
- **Hosted MCP server** ([www.aeon.fun/connect/mcp](https://www.aeon.fun/connect/mcp)) - Aeon Connect's remote MCP server (Streamable HTTP, OAuth 2.1 with GitHub sign-in): users drive their own instance from ChatGPT, Claude, Claude Code or Cursor, with runs on the instance's own GitHub Actions. Secret values are never readable or writable over it.
- **Local MCP server** ([`apps/mcp-server`](../apps/mcp-server/README.md)) - every skill as an `aeon-<slug>` tool in Claude Desktop/Code; the local, push-button complement to your hosted integration.
- **`ai-build` label** - label any GitHub issue `ai-build` and the agent implements it and opens a PR; your app can create labeled issues to request work.
- **Telegram instant mode** ([`apps/webhook`](../apps/webhook/README.md)) - ~1s command replies via a Cloudflare Worker, if your product fronts a chat surface.

Expand Down
2 changes: 2 additions & 0 deletions docs/CONFIGURATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@ Turn it off per repo with the variable **`SKILL_DRYRUN=0`** (default on), so a f

Let skills **call** MCP servers (GitHub, a database, a paid API, your own) while they run in GitHub Actions. Opt-in and safe - with no `.mcp.json` at the repo root, runs are byte-identical to before.

This is about skills calling *other* MCP servers. To drive Aeon itself from ChatGPT, Claude or Cursor, use the hosted server at [www.aeon.fun/connect/mcp](https://www.aeon.fun/connect/mcp) or the local one ([hosted or local?](../apps/mcp-server/README.md#hosted-or-local)).

```bash
cp docs/examples/mcp/.mcp.json.example .mcp.json # then edit, commit, push
```
Expand Down
Loading
Loading