Skip to main content

ObjectiveAI

The Swarm Harness.

Define an agent once — model, prompts, tools, MCP servers — then spawn it to do work, or hand it a Docker sandbox to act in. From the CLI or your own agent.

Website · Discord · GitHub

Release License: MIT

Binaries

Install the prebuilt binaries with one command:

curl -fsSL https://raw.githubusercontent.com/ObjectiveAI/objectiveai/main/install.sh | bash
export PATH="$HOME/.objectiveai/bin:$PATH"
Binary What it does Download
objectiveai CLI + embedded viewer latest
objectiveai-api API server latest
objectiveai-viewer Standalone Tauri desktop app latest

Supported platforms: Linux x86_64, Linux aarch64, macOS x86_64, macOS aarch64, Windows x86_64. See Binaries & self-hosting for per-binary detail.

Scaffolding a plugin

scaffold.sh lays down a complete plugin — both halves, one manifest — into the directory you run it from. The plugin's name is the directory's name, so that is the only thing you choose up front:

mkdir my-plugin && cd my-plugin
curl -fsSL https://raw.githubusercontent.com/ObjectiveAI/objectiveai/main/scaffold.sh | bash -s -- rust

You get:

my-plugin/
├── objectiveai.json   # the manifest — both halves, at the root
├── README.md
├── mcp/               # the MCP server (Rust): the tools an agent calls
├── viewer/            # tabs, channel handlers, browser scripts
└── .agents/skills/    # skills for a coding agent working on the plugin

The name is written into the Cargo package, the binary, the lockfile, the Containerfile, the MCP server's NAME constant, and package.json. rust (or rs) is currently the only MCP language.

Then register the root — one directory, both halves — and start the viewer's watch build:

objectiveai laboratories spawn                       # once per machine; never auto-started

objectiveai development plugins mcp create \
  --owner you --name my-plugin --version v0.1.0 --path "$PWD"
objectiveai development plugins viewer create \
  --owner you --name my-plugin --version v0.1.0 --path "$PWD"

cd viewer && pnpm install && pnpm run dev

An agent declaring you/my-plugin@v0.1.0 now gets your working tree instead of a git tag. After editing the MCP half, development plugins mcp reset … — a registered plugin still takes the image-exists fast path, so without it the old image keeps serving. The viewer half needs no reset: the watch build writes, and the viewer reloads open tabs.

To release, tag vX.Y.Z, push, and delete the registrations.

See Plugins for what a plugin is, the manifest reference, and the first-party ones.


What ObjectiveAI is

ObjectiveAI is a harness for defining and running agents — distributed across the CLI, the API, the MCP server, and your own agents. You define an Agent once — model, prompts, decoding parameters, output mode, tools, MCP servers — and then run it: spawn it to do work, or hand it a Docker sandbox to act in.

Agents are content-addressed, Git-hosted resources. The same agent.json that powers your CLI invocation tonight is the one your colleague pins by commit SHA next month.

The mechanism is the Agent: a reusable, composable, version-tracked configuration of a model. Everything else (the CLI, the API, the web app, the MCP server) exists to drive agents in the ways that matter.

Why this system

Reusability. Content-addressing throughout:

  • Reusable. An Agent is a 22-character ID — define one once and reference it from anywhere. Run it for action or for sandboxed work without re-defining anything.
  • Reproducible. Every resource reference is (owner, repo, commit). Pin a commit SHA, get the exact same agent your run used six months ago.
  • Composable. Agents call other agents. The CLI dispatches plugins as unknown subcommands. The viewer surfaces plugin UIs as sandboxed iframe tabs.

Quick start

Install the CLI, API server, viewer, and MCP server from the latest release:

curl -fsSL https://raw.githubusercontent.com/ObjectiveAI/objectiveai/main/install.sh | bash
export PATH="$HOME/.objectiveai/bin:$PATH"

Set your API key:

objectiveai api headers x-objectiveai-authorization config set "apk_your_key_here"

CLI — spawn an agent to do work

objectiveai agents spawn \
  --agent remote=github,owner=your-org,repository=writer-agent \
  --inline '[{"role":"user","content":"Write a haiku about ocean waves."}]'

Pin a commit=<sha> segment to lock in a specific version of any remote resource. See Core primitives for a full explanation of Agents and agent completions.

Core primitives

One resource (the Agent) defines what's in the system; one execution mode (the agent completion) defines what you can do with it. Resources are content-addressed Git-hosted JSON; an execution resolves them at request time and streams typed results back.

Agents

An Agent is a fully-specified configuration of a single upstream model: model identity, prompt structure, decoding parameters, output mode, tools, MCP servers, provider preferences. Agents are content-addressed via XXHash3-128 — the same configuration always produces the same 22-character base62 ID. IDs are deterministic because the serialized configuration is hashed after normalization (empty fields stripped, defaults canonicalized). Two Agents with identical effective settings are the same Agent.

Agents are stored as agent.json in Git repositories and referenced by owner/repo@commit everywhere an agent is needed. Authoring agents lives in source control; calling them happens by reference.

{
  "description": "Skeptical evaluator",
  "upstream": "openrouter",
  "model": "openai/gpt-4o",
  "output_mode": "json_schema",
  "temperature": 0.2,
  "prefix_messages": [
    { "role": "system", "content": "You are a rigorous critic. Challenge assumptions." }
  ]
}

Each upstream (OpenRouter, Claude Agent SDK, Codex SDK) has its own agent type with its own parameter set.

Agent completions

An agent completion spawns a single Agent to do work. The Agent receives a task as a conversation and acts on it — calls tools, talks to MCP servers, executes a multi-turn loop, writes code, generates artifacts.

The Agent is supplied by remote reference. Messages can include images, audio, and files in addition to text. Tool calls are detected mid-stream and executed automatically; MCP servers attached to the Agent are dialed transparently. The response carries a Continuation that captures the conversation state so the next call can pick up where this one left off.

{
  "agent": { "remote": "github", "owner": "your-org", "repository": "writer-agent" },
  "messages": [
    { "role": "user", "content": "Rewrite this commit message as a conventional-commits changelog entry." }
  ]
}

CLI: objectiveai agents spawn --agent remote=github,owner=...,repository=... --inline '...'. Executions stream typed chunks over Server-Sent Events.

Resource resolution

Resources are referenced by (owner, repository, commit) triple. Content-addressing plus commit pinning makes any execution reproducible from its request alone.

Remote references resolve lazily: the retrieval system fetches and caches each resource exactly once, deduplicating by triple. All fetches are content-verified — a cached resource is never re-fetched if the commit SHA matches.

Binaries & self-hosting

curl -fsSL https://raw.githubusercontent.com/ObjectiveAI/objectiveai/main/install.sh | bash
export PATH="$HOME/.objectiveai/bin:$PATH"

All binaries land in ~/.objectiveai/bin/ and are added to PATH. The CLI (objectiveai) self-updates on startup; re-run the installer to upgrade objectiveai-api and objectiveai-viewer.

objectiveai (CLI)

The primary user-facing binary. Built with clap derive macros and emits newline-delimited JSON (NDJSON) on stdout. Top-level command groups: agents, laboratories, channels, tasks, development, daemon, db, api, viewer, python, update.

objectiveai agents list
objectiveai agents spawn --agent remote=github,owner=...,repository=... --inline '...'
objectiveai laboratories spawn

The default build embeds the Tauri viewer as a sidecar: running a streaming command opens a live viewer window backed by an in-process HTTP server. Pass --no-viewer at install time for a smaller build without the embedded viewer. JSON schemas for every public type are accessible at objectiveai schemas list / objectiveai schemas output <name>.

objectiveai-api

Standalone HTTP API server. Run it with:

objectiveai-api

Key environment variables (all optional):

Variable Default Effect
ADDRESS 0.0.0.0 Bind address
PORT 5000 Bind port
OBJECTIVEAI_ADDRESS https://api.objectiveai.dev Upstream ObjectiveAI address when proxying
OBJECTIVEAI_AUTHORIZATION Bearer token for the ObjectiveAI API
OPENROUTER_AUTHORIZATION Bearer token for OpenRouter
GITHUB_AUTHORIZATION GitHub token for resource retrieval
MCP_AUTHORIZATION Bearer token for outbound MCP calls

The server is streaming-first: every layer produces a typed stream of chunks and yields immediately to the HTTP response — nothing is buffered in the hot path.

objectiveai-viewer

Standalone Tauri desktop application. Presents the same UI that the CLI embeds as a sidecar, but runs as a first-class window manager process rather than being spawned in-process by a CLI command. Reach for it when you want the viewer always open and decoupled from CLI invocations.

MCP (served by the daemon)

The daemon itself serves MCP (Model Context Protocol) over streamable HTTP at /mcp on its own address, executing commands in-process. Editors and agents (Claude, Cursor, etc.) point at http://127.0.0.1:<daemon-port>/mcp (plus the X-OBJECTIVEAI-SIGNATURE header when a daemon secret is configured).

Three crates make up the MCP surface:

  • the daemon's /mcp route — the primary MCP surface. Wraps the CLI as MCP tools over streamable HTTP, in-process. What users expose upstream for distributed agents.
  • objectiveai-mcp-proxy — a multiplexing sidecar of objectiveai-api. Terminates an MCP client connection and forwards tool calls to an upstream MCP server or to ObjectiveAI-native tools. Embedded inside objectiveai-api at runtime.
  • objectiveai-mcp-laboratory — MCP filesystem helpers (read/write/list) adapting the SDK's filesystem layer to MCP tool calls.

Plugins

A plugin extends ObjectiveAI with tools an agent can call, and optionally with UI in the viewer. It is a container: an MCP server built from a Containerfile in your repository, run as an ephemeral laboratory container for the completion that uses it. A plugin may also ship a viewer half — tabs, channel-request handlers, and scripts injected into browser tabs — from the same repository, under the same identity.

Both halves are declared by one objectiveai.json at the repository root.

An agent uses a plugin by declaring its coordinates:

{ "plugins": [{ "owner": "you", "name": "my-plugin", "version": "v0.1.0" }] }

The laboratory host fetches that GitHub repository at the v-prefixed tag, builds the image, and starts a container per completion. Its tools reach the agent prefixed with the MCP server's name — a tool called greet arrives as my-plugin_greet.

First-party plugins

Built and maintained by ObjectiveAI:

  • psychological-operations — run autonomous persona agents on X (Twitter) and Discord. Each agent is an X account plus a Discord bot, addressed by a tag, with tool-mediated presence on both platforms (the x and discord MCP servers), ranked ingestion pipelines ("psyops" that pull posts/messages, rank them, and deliver the survivors to agents' work queues), and event-driven wake-ups from a resident daemon that fires when an agent is mentioned, replied to, or DM'd.
  • mundus-animarum — persistent, self-authored "souls" for agents. A key/value store keyed by an agent's content-addressed ID, with cross-agent lookups, subscriptions, and change notifications; every instance of the same agent definition shares one soul, which the agent can rewrite over time.
  • arcanum — skills for agents. Lets agents load skills and governs which agents may use which skills.
  • quas-wex-exort — programmatic invocation of MCP tools and the ObjectiveAI CLI from within an agent, including running them as background tasks (create / list / wait / cancel) and batched multi-calls.

The manifest

objectiveai.json at the repository root. At least one of mcp / viewer must be present; a plugin may ship either or both.

Field Type Notes
description string One-line summary.
mcp.containerfile string Repo-relative path (forward slashes). The file's own directory is the build context, so mcp/Containerfile sees mcp/ as its root.
mcp.port number The port the server listens on inside the container. Must match PORT in the server and EXPOSE in the Containerfile.
mcp.postgres bool Required. Opts the plugin in to its own database; only then is OBJECTIVEAI_POSTGRES_URL set in the container.
mcp.development.caches string[] CONTAINER paths kept between development rebuilds (e.g. /build/target). Ignored for a released plugin.
viewer.containerfile string As above; its own directory is the build context.
viewer.output string Absolute path INSIDE the built image whose contents are the built assets.
viewer.tabs array { title, module, styles } for a normal tab, or { channel_key, module, styles } for a channel-request handler. module/styles are relative to the built output.
viewer.scripts array { name, module } — classic scripts a tab can inject into a browser tab it spawns.
viewer.development.output string HOST path, relative to the REGISTERED directory, where the watch build writes (viewer/dist in the scaffolded layout).
{
  "description": "An ObjectiveAI plugin: a Rust MCP server and a viewer extension.",
  "mcp": {
    "containerfile": "mcp/Containerfile",
    "port": 8080,
    "postgres": true,
    "development": { "caches": ["/build/target", "/usr/local/cargo/registry"] }
  },
  "viewer": {
    "containerfile": "viewer/Containerfile",
    "output": "/dist",
    "tabs": [{ "title": "home", "module": "./home.js", "styles": ["./home.css"] }],
    "scripts": [{ "name": "capture", "module": "./capture.js" }],
    "development": { "output": "viewer/dist" }
  }
}

Identity is not in the manifest: owner, name and version come from the repository and its tag on release, and from the explicit --owner/--name/--version of a development registration otherwise.

License

MIT.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

objectiveai_sdk-2.2.16.tar.gz (870.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

objectiveai_sdk-2.2.16-cp310-abi3-win_arm64.whl (5.4 MB view details)

Uploaded CPython 3.10+Windows ARM64

objectiveai_sdk-2.2.16-cp310-abi3-win_amd64.whl (5.7 MB view details)

Uploaded CPython 3.10+Windows x86-64

objectiveai_sdk-2.2.16-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

objectiveai_sdk-2.2.16-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.1 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

objectiveai_sdk-2.2.16-cp310-abi3-macosx_11_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

objectiveai_sdk-2.2.16-cp310-abi3-macosx_10_12_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file objectiveai_sdk-2.2.16.tar.gz.

File metadata

  • Download URL: objectiveai_sdk-2.2.16.tar.gz
  • Upload date:
  • Size: 870.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for objectiveai_sdk-2.2.16.tar.gz
Algorithm Hash digest
SHA256 02984e7abba50e187e1e0fac4b7cabc584e2448025c28c5fa192feee25100d52
MD5 0b81c46ad7147b1236e079aab8948178
BLAKE2b-256 f232397bebc7a633775715e69fcf5a1663f406def1ac5fad773a05582f4c7c39

See more details on using hashes here.

File details

Details for the file objectiveai_sdk-2.2.16-cp310-abi3-win_arm64.whl.

File metadata

File hashes

Hashes for objectiveai_sdk-2.2.16-cp310-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 05d029323050961fde23782683d9cf0a52c66dd9738e16fd441910980fc9b8ce
MD5 045fb743c37e166afb4b61d7526a1372
BLAKE2b-256 35a5567696aba8a3bdf32a24f7a6ee3391d1537e742dee9c5d6a15a2a0ba9316

See more details on using hashes here.

File details

Details for the file objectiveai_sdk-2.2.16-cp310-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for objectiveai_sdk-2.2.16-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 c193b63df99bdb3802a07b85c2577648e1d29cdbf82f875ad9b29367f7bd4d2d
MD5 6eab0f92394f67c74f06e8447cf705a1
BLAKE2b-256 90a4654b26ed4b7172128be14b4eb34821f61c4a9a21abaa20eed5b41db16eac

See more details on using hashes here.

File details

Details for the file objectiveai_sdk-2.2.16-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for objectiveai_sdk-2.2.16-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d2e1af7d6cea8a537b63a47cedd3514f03197e463a7044e43f7b5aeb7c0ba592
MD5 71fe9edcd0727228ac0f13529df8979b
BLAKE2b-256 2341ff1843d796262624c773d681114644386925109d422c802d60227435e93d

See more details on using hashes here.

File details

Details for the file objectiveai_sdk-2.2.16-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for objectiveai_sdk-2.2.16-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3acfe4644de180692f70781e808df0f45ac3dfd9ff5891f648827d184acc184f
MD5 41dabc3f3624688de0f4800561c731b3
BLAKE2b-256 77b18a11a71a3b80d5af8855eff252804a47624bbf276033ac62e167e32b4fa3

See more details on using hashes here.

File details

Details for the file objectiveai_sdk-2.2.16-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for objectiveai_sdk-2.2.16-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 657b3aa04096da89da0e780f9285c957fc68082d38432143366acd6f9b1af4dc
MD5 56ffe8230ab1392b963079dd4839f922
BLAKE2b-256 3c17f7b039b009c745f7770dcd476086dfd6b92d1dbefee3df89066ce1f509bc

See more details on using hashes here.

File details

Details for the file objectiveai_sdk-2.2.16-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for objectiveai_sdk-2.2.16-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3ff4d1c6090189ac368c51fe21d155625641a07522bbe36b089a2884209736de
MD5 d595878c09d09e481962d977dd9acda9
BLAKE2b-256 2811f8e974b1cde7c85d9424c11fd736235bc6ea283972f4352b1f07b4045406

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

2.2.16 This release

7 files

2.2.15

7 files

2.2.14

7 files

2.2.13

7 files

2.2.12

7 files

2.2.11

7 files

2.2.10

7 files

2.2.9

7 files

2.2.8

7 files

2.2.7

7 files

2.2.6

7 files

2.2.5

6 files

2.2.4

5 files

2.2.3

5 files

2.2.2

5 files

2.2.1

5 files

2.2.0

5 files

2.1.3

5 files

2.1.2

5 files

2.1.1

5 files

2.0.11

5 files

2.0.10

5 files

2.0.9

5 files

2.0.8

5 files

2.0.7

5 files

2.0.6

5 files

2.0.5

5 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page