How Aether is built: what it does, where it calls AI models in the OpenAI format, where it uses MCP,
how agents reach their tools, and every endpoint the app serves.
OpenAI-format model callsMCPMCP, not yet started or connectedlocal HTTP inside the app
1. Features
Chat
Model-only chat with any connection your account may use; stop, search, tags
Transforms and artifacts (summary, bullets, task list, To Aether, Teach Frame)
Talk with a heavyweight that has a cartridge; End files its own closing words (Admin)
Chat folder or personal scratchpad; reviewed edit proposals; PDF/Office reading and Windows OCR
Personal knowledge cartridge; data sources with @mentions
Work: missions, roadmaps, sprints
Missions → roadmaps → sprints → tasks; an example roadmap seeded on first run
Prepare a sprint (no model call): lead, connection, cost cap, turns, wanted file, output checks
Start, stop, continue, resume, raise budget; one Timer per sprint
Outputs checked against declared files; review tied to the exact bytes; Accept, or Accept anyway with a reason (Admin)
The lead records each sprint's outcome on the roadmap
Agents and staff
Leads (heavyweight, with Memory Fabric) and staff (lightweight, one identity file each); 40 staff in the catalog
Meridian, the app's own lead, set up on first run
Create a specialist in plain words; specialist catalog; Agent Editor for custom templates
Librarian the lead can consult; ultralight helpers if a connection named ultralight exists
Memory and teaching
One Memory Fabric cartridge per lead; the mind manages its own memory with 12 owner tools
Memory viewer: graph, time slider, table, Recorded dates, seal status (read-only)
Teach Frames: author, import, export; the School's frames for staff; the Lexicon reference
Outputs and dashboards
Creations: summaries, notes, HTML, SVG (drawn as images), import and export, Draft/Published
Save an accepted sprint output to Creations
Dashboards for Chat, Missions, Roadmaps, Sprints, Staff, Teach Frames, Creations
Models and keys
Hosted presets (DeepSeek, Claude, OpenAI); local servers found on :1234 and :8080; any OpenAI-compatible server
API Keys: management password, DPAPI-encrypted vault, add/reveal/rename/replace/delete, reset, lock
Keys granted per account; Suspend API use; secrets redacted from errors and records
Data sources and tools
MCP Data Sources: register a service, discover tools, choose what to expose, roles per source
Run tools, results as tables, CSV/JSON export, saved reports
Databases through a database MCP service your organization runs: the placeholder middle layer, not yet connected
Aether's own read-only MCP server for LM Studio
Accounts and safety
Sign-in; default Admin with a one-time welcome (own password, provider, key)
Networks: several computers host the older commission flow
Install and headless use
Install.cmd, Aether.cmd, Uninstall.cmd, Maintenance.cmd; Python bundled; app, data and credentials kept apart
Backup, verify, restore (staged), upgrade keeping data
Every action is a JSON API on 127.0.0.1, so scripts and AI assistants can drive it
2. Where the OpenAI API format is used
Every model call in the app goes through one client, LMStudio in aether/backends/model.py. Despite its name it speaks the OpenAI chat-completions format to any provider, using only the Python standard library: no OpenAI or Anthropic SDK.
Outbound endpoints
Call
When
Source
POST {base}/chat/completions
Every agent and chat turn. Body: model, messages, stream:false, tools (OpenAI function schemas), max_tokens, temperature 0.2 except to api.anthropic.com and api.openai.com, thinking for DeepSeek only. No tool_choice is ever sent.
model.py
GET {base}/models
Connection check after saving, "Load models from server", local discovery of :1234 and :8080. Never runs the model.
deployment_probe.py
Header
Authorization: Bearer <key> for every provider; keys only to HTTPS or this computer; no proxy and no redirects for saved keys.
model.py
Who calls the model
Caller
Loop and limits
Source
Sprint lead (Overseer) turn
Tasker loop: up to 40 rounds, then one final request without tools; cost cap checked before each call
overseer/turn.py, tasker/model.py
Sprint staff turn
Same loop; at most 2 JSON corrections
tasker/staff_turn.py
Librarian
At most 8 rounds; the lead may consult it twice per turn
overseer/librarian.py
Chat, model-only
7 requests, tools while under 12 calls and before the 7th
atelier/model_chat.py
Chat, Talk with a heavyweight
7 requests: 6 with memory tools, the 7th asks for the answer without tools
atelier/model_chat.py, overseer/chat.py
Ultralight helpers
One request, no tools, 1,024 tokens, 60 s
tasker/ultralight.py
Commission turns
Up to 40 rounds within the call budget
atelier/turn.py
The welcome
No model call: it saves the key and the connection only
atelier/welcome.py
Provider presets
Preset
Base URL
Model
Rules
DeepSeek
https://api.deepseek.com
deepseek-flash
DeepSeek dialect: text tool calls (DSML) converted to standard calls; malformed markup quarantined, nothing runs
Claude (Anthropic)
https://api.anthropic.com/v1
claude-opus-5-5
Anthropic's OpenAI-compatible endpoint; no temperature sent; not yet checked live
OpenAI
https://api.openai.com/v1
gpt-5.5
No temperature sent; the Responses API is not implemented; not yet checked live
LM Studio
http://127.0.0.1:1234/v1
chosen
No key
llama.cpp
http://127.0.0.1:8080/v1
chosen
No key
Other OpenAI-compatible
entered
entered
Dialect openai, deepseek or auto
Presets are defined twice and kept equal: model_connections.html and aether/atelier/welcome.py.
3. Where MCP is used
Role
Status
What it does
Source
Data Sources: Aether as MCP client
live
An Admin registers an organization's MCP reporting service (Streamable HTTP over HTTPS, or a local stdio process), discovers its tools and chooses which to expose. Protocol 2025-11-25 offered; 2025-06-18, 2025-03-26, 2024-11-05 accepted. Each use opens a fresh session: initialize → tools/list (fingerprint must still match) → tools/call; no retries; timeout 1–300 s; replies capped at 4 MiB. Tokens DPAPI-encrypted. Results become tables (≤5,000 rows) with CSV/JSON export and saved reports.
Model-only Chat and commission agents, through one function named data_sources (list, tools, call, reports, notes), always with the requesting person's access and the source's roles. Models see at most 50 rows plus a link. Sprint leads, sprint staff and Talk with do not have it.
service.py, model_chat.py
The middle layer: a database MCP service
placeholder
By design, Aether holds no database drivers or database passwords. A database MCP service that the organization runs, for example DBHub or MCP Toolbox for Databases, sits between Aether and SQL Server, Oracle, MySQL or PostgreSQL. It holds the drivers and a DBA's restricted read-only account, which is what limits the data. None has been chosen or connected yet: Aether's side is complete and tested against a stand-in MCP service. A real service may need a small result mapping, because MCP does not fix the shape of tables. Everyone allowed on a source shares that account's view; per-person row limits come later.
design of 2026-10-27
Aether's MCP server
live
python -m aether_bridge mcp-serve --root NAME=PATH over stdio for LM Studio or another MCP host. Five read-only tools: list_roots, list_dir, read_file, glob, search. Every root is mounted read-only; calls go through the ToolBelt registry and leave receipts. No network listener and no authentication: it runs only when a local host spawns it.
aether/toolbelt/mcp_server.py, examples/mcp.json
ToolBelt MCP client
built, not started
Would attach an external MCP server's tools to the ToolBelt as unapproved tools named server__tool, to be approved by an operator. Configured in toolbelt.mcp_servers and listed read-only on the tool registry page, but no production code starts a server or attaches its tools.
aether/toolbelt/mcp_client.py, config/settings.py
4. The tool belt: how tools are designed and reached
Aether has two layers of tools. The ToolBelt is the governed general-purpose layer with a registry; each product surface also has its own fixed list of tools, enforced by its own handlers.
ToolBelt and registry
Built-in tools: list_roots, list_dir, read_file, glob, search, write_file, edit_file, calculate, delete_file (opt-in), run_command (only with an allowlist)
Registry states: approved, unapproved, withdrawn. Built-ins are approved from source; anything external starts unapproved. Approving binds the full definition: a changed schema needs approval again.
Offered equals runnable. Every call is admitted against the registry and gets an fsynced receipt before it runs.
Files: named roots (read-write, read-only or sealed), write gates by operator manifest, writes journaled for undo, 24,000-character results
run_command: absolute executable plus argv prefix per project, no shells or pipes, 7 environment variables, 1–300 s, process tree killed on timeout
The surface builds the tool list for this agent and this turn, as OpenAI function schemas.
The model client sends the request; the model replies with tool calls (DeepSeek text calls are converted first; anything malformed is quarantined and nothing runs).
The loop checks stop conditions before each call: STOP, cost cap, Emergency Halt, connection access.
Arguments are parsed; invalid JSON or a reply cut off at the output limit runs nothing, and the model is told so.
The handler checks scope (its readable set, its write folder, its cartridge) and runs the tool. ToolBelt calls are admitted and receipted first.
The result goes back as a tool message. After the round limit, one last request without tools asks for the final words.
Safety boundaries
Kept from agents' programs: credentials. Commands and tests get only the operating system's bootstrap variables; key files and credential folders are refused to read_file.
Confined: file tools to their roots or folders; writes to the agent's own outputs; memory writes to its own cartridge; the roadmap path comes from configuration, never from the model.
Not a sandbox: programs an agent runs with run_tests or run_command have the person's user rights; only the working folder is confined. Give agents work you would run yourself.
5. Every endpoint the app serves
The shipped edition declares 105 routes (116 method and path pairs, 11 of them path prefixes that cover several actions, 17 pages), all on 127.0.0.1. Anything undeclared answers 404. Before any handler runs, the gateway requires the exact Host 127.0.0.1:<port> and refuses another site's Origin (gateway.py); every change must carry this app's own Origin, and sign-in uses an HttpOnly, SameSite=Strict cookie (operator_access_http.py). There is no MCP or ToolBelt endpoint over HTTP.
workspace views (Staff, Teach, Creations, Dashboards, Settings, Data Sources)
signed in
GET
/workspace-assets/*
45 allow-listed scripts and styles
public
Generated from the v0.2.0 source code on 2026-11-08. The endpoint tables are
built from the app's own route list, so they match the code. File names refer to the app's aether Python
package.