Metadata-Version: 2.4
Name: arbora
Version: 0.1.8.dev2
Summary: The deployable MCP, REST, control-plane, fleet, WebUI, and operations composition for the Knuckles agent platform.
Author-email: Repository Maintainers <maintainers@knuckles.team>
License-Expression: MIT
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Environment :: Console
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Python: >=3.12
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: agent-utilities<4.0.0,>=3.1.0
Requires-Dist: eunomia-core>=0.3.10
Requires-Dist: httpx>=0.28.1
Requires-Dist: pyjwt>=2.15.1
Requires-Dist: joserfc>=1.7.5
Requires-Dist: python-multipart>=0.0.32
Requires-Dist: agent-connector-sdk[a2a,mcp]<0.4.0,>=0.3.19
Requires-Dist: aiohttp>=3.14.5
Requires-Dist: anyio>=4.15.1
Requires-Dist: epistemic-graph[server]<3.0.0,>=2.27.5
Requires-Dist: fastapi>=0.143.3
Requires-Dist: filelock>=4.2.0
Requires-Dist: msgpack>=1.2.1
Requires-Dist: prometheus-client>=0.26.0
Requires-Dist: pydantic<3.0.0,>=2.14.1
Requires-Dist: PyYAML>=6.0.3
Requires-Dist: starlette>=1.8.0
Requires-Dist: fastmcp>=4.1.0
Requires-Dist: mcp<3.0.0,>=2.3.0
Requires-Dist: opentelemetry-api>=1.45.1
Requires-Dist: pydantic-ai-slim[openai]==2.57.0
Requires-Dist: universal-skills<2.0.0,>=1.3.11
Provides-Extra: test
Requires-Dist: agent-terminal-ui>=2.3.1; extra == "test"
Requires-Dist: pytest>=9.1.1; extra == "test"
Requires-Dist: pytest-asyncio>=1.4.0; extra == "test"
Requires-Dist: pytest-cov>=7.1.0; extra == "test"
Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
Requires-Dist: pytest-timeout>=2.4.0; extra == "test"
Requires-Dist: mypy>=2.4.0; extra == "test"
Requires-Dist: ruff==0.17.1; extra == "test"
Requires-Dist: types-PyYAML>=6.0.12.20260906; extra == "test"
Requires-Dist: python-telegram-bot>=22.8; extra == "test"
Requires-Dist: setuptools>=84.0.0; extra == "test"
Provides-Extra: webui
Requires-Dist: agent-webui<3.0.0,>=2.7.1; extra == "webui"
Requires-Dist: uvicorn>=0.54.0; extra == "webui"
Provides-Extra: gateway-widgets
Requires-Dist: agent-connector-sdk[a2a,mcp]<0.4.0,>=0.3.19; extra == "gateway-widgets"
Provides-Extra: vault
Requires-Dist: hvac>=2.4.0; extra == "vault"
Provides-Extra: messaging-telegram
Requires-Dist: python-telegram-bot>=22.8; extra == "messaging-telegram"
Provides-Extra: messaging-mattermost
Requires-Dist: mattermostdriver>=7.3.2; extra == "messaging-mattermost"
Provides-Extra: messaging-discord
Requires-Dist: discord.py>=2.7.1; extra == "messaging-discord"
Provides-Extra: messaging-slack
Requires-Dist: slack-bolt>=1.30.0; extra == "messaging-slack"
Provides-Extra: messaging-whatsapp
Requires-Dist: neonize>=0.5.2; extra == "messaging-whatsapp"
Requires-Dist: httpx>=0.28.1; extra == "messaging-whatsapp"
Provides-Extra: messaging-teams
Requires-Dist: botbuilder-core>=4.17.1; extra == "messaging-teams"
Provides-Extra: messaging-googlechat
Requires-Dist: google-api-python-client>=2.198.0; extra == "messaging-googlechat"
Requires-Dist: google-auth>=2.62.0; extra == "messaging-googlechat"
Provides-Extra: messaging-googlemeet
Requires-Dist: google-api-python-client>=2.198.0; extra == "messaging-googlemeet"
Requires-Dist: google-auth>=2.62.0; extra == "messaging-googlemeet"
Provides-Extra: messaging-matrix
Requires-Dist: matrix-nio>=0.26.0; extra == "messaging-matrix"
Provides-Extra: messaging-irc
Requires-Dist: irc>=20.5.0; extra == "messaging-irc"
Provides-Extra: messaging-signal
Provides-Extra: messaging-imessage
Provides-Extra: messaging-line
Requires-Dist: line-bot-sdk>=3.26.0; extra == "messaging-line"
Provides-Extra: messaging-twitch
Requires-Dist: twitchio>=3.3.2; extra == "messaging-twitch"
Provides-Extra: messaging-synology
Requires-Dist: httpx>=0.28.1; extra == "messaging-synology"
Provides-Extra: messaging-voicecall
Requires-Dist: twilio>=9.12.0; extra == "messaging-voicecall"
Provides-Extra: messaging-nextcloud
Requires-Dist: httpx>=0.28.1; extra == "messaging-nextcloud"
Provides-Extra: messaging
Requires-Dist: arbora[messaging-discord,messaging-googlechat,messaging-googlemeet,messaging-irc,messaging-line,messaging-matrix,messaging-mattermost,messaging-nextcloud,messaging-signal,messaging-slack,messaging-synology,messaging-teams,messaging-telegram,messaging-twitch,messaging-voicecall,messaging-whatsapp]; extra == "messaging"
Dynamic: license-file

# Arbora

<p align="center">
  <img src="docs/assets/brands/arbora-logo-v1.png" alt="Arbora logo" width="176">
</p>

<p align="center">
  <strong>The process the operator runs to open the Knuckles agent platform.</strong><br>
  <sub>MCP · REST · A2A · identity policy · fleet supervision · hosted interfaces</sub>
</p>

<p align="center">

[![PyPI - Version](https://img.shields.io/pypi/v/arbora)](https://pypi.org/project/arbora/)
[![Build](https://github.com/Knuckles-Team/arbora/actions/workflows/release.yml/badge.svg)](https://github.com/Knuckles-Team/arbora/actions/workflows/release.yml)
[![Documentation](https://github.com/Knuckles-Team/arbora/actions/workflows/pages.yml/badge.svg)](https://knuckles-team.github.io/arbora/)
[![MCP Server](https://badge.mcpx.dev?type=server "MCP Server")](https://github.com/Knuckles-Team/arbora)
[![GitHub Repo stars](https://img.shields.io/github/stars/Knuckles-Team/arbora)](https://github.com/Knuckles-Team/arbora/stargazers)
[![GitHub forks](https://img.shields.io/github/forks/Knuckles-Team/arbora)](https://github.com/Knuckles-Team/arbora/forks)
[![GitHub contributors](https://img.shields.io/github/contributors/Knuckles-Team/arbora)](https://github.com/Knuckles-Team/arbora/graphs/contributors)
[![GitHub license](https://img.shields.io/github/license/Knuckles-Team/arbora)](LICENSE)
[![GitHub last commit (by committer)](https://img.shields.io/github/last-commit/Knuckles-Team/arbora)](https://github.com/Knuckles-Team/arbora/commits/main)
[![GitHub pull requests](https://img.shields.io/github/issues-pr/Knuckles-Team/arbora)](https://github.com/Knuckles-Team/arbora/pulls)
[![GitHub closed pull requests](https://img.shields.io/github/issues-pr-closed/Knuckles-Team/arbora)](https://github.com/Knuckles-Team/arbora/pulls?q=is%3Apr+is%3Aclosed)
[![GitHub issues](https://img.shields.io/github/issues/Knuckles-Team/arbora)](https://github.com/Knuckles-Team/arbora/issues)
[![GitHub top language](https://img.shields.io/github/languages/top/Knuckles-Team/arbora)](https://github.com/Knuckles-Team/arbora)
[![GitHub language count](https://img.shields.io/github/languages/count/Knuckles-Team/arbora)](https://github.com/Knuckles-Team/arbora)
[![GitHub repo size](https://img.shields.io/github/repo-size/Knuckles-Team/arbora)](https://github.com/Knuckles-Team/arbora)
[![GitHub repo file count (file type)](https://img.shields.io/github/directory-file-count/Knuckles-Team/arbora)](https://github.com/Knuckles-Team/arbora)
[![PyPI - Downloads](https://img.shields.io/pypi/dd/arbora)](https://pypi.org/project/arbora/)
[![PyPI - License](https://img.shields.io/pypi/l/arbora)](https://pypi.org/project/arbora/)
[![PyPI - Wheel](https://img.shields.io/pypi/wheel/arbora)](https://pypi.org/project/arbora/)
[![PyPI - Implementation](https://img.shields.io/pypi/implementation/arbora)](https://pypi.org/project/arbora/)

</p>

<p align="center">
  <a href="https://knuckles-team.github.io/arbora/">Documentation</a> ·
  <a href="https://knuckles-team.github.io/arbora/capabilities/">Capabilities</a> ·
  <a href="https://knuckles-team.github.io/arbora/interfaces/">Interfaces</a> ·
  <a href="https://knuckles-team.github.io/arbora/status/">Status</a>
</p>

## Overview

Run Arbora when an MCP client, HTTP application, A2A peer, or hosted interface
needs one authenticated way into the platform. One serving lifecycle composes
the same application services across transports, applies identity and tenant
policy, and keeps tool discovery tied to the live fleet catalog.

Arbora is the platform edge and composition root. It is not the agent harness,
the durable database, a connector implementation, or the browser UI.

## Key Capabilities

- Serve local MCP over `stdio` and authenticated MCP over streamable HTTP.
- Project the same governed operations through REST and unary A2A.
- Discover, admit, supervise, and route the MCP connector fleet.
- Apply identity, tenant, action-policy, idempotency, and provenance controls.
- Host Agent Web UI and coordinate terminal, desktop, messaging, and attended
  browser capabilities.
- Generate deployment configuration and report live readiness through `/health`.

## Documentation

Start with the **[visual platform guide](https://knuckles-team.github.io/arbora/)**,
then use the task-oriented references:

- [Start Arbora](https://knuckles-team.github.io/arbora/get-started/)
- [Review capabilities](https://knuckles-team.github.io/arbora/capabilities/)
- [Choose an interface](https://knuckles-team.github.io/arbora/interfaces/)
- [Understand the architecture](https://knuckles-team.github.io/arbora/architecture/)
- [Check live status](https://knuckles-team.github.io/arbora/status/)
- [Configure a deployment](https://knuckles-team.github.io/arbora/deployment/)

## Architecture

| Layer | Authority | Relationship to Arbora |
|---|---|---|
| [Agent Web UI](https://knuckles-team.github.io/agent-webui/) | Browser experience and local interaction state | Arbora hosts it and supplies governed application routes. |
| Agent Terminal UI | Terminal and headless interaction | Uses the governed Arbora REST interface. |
| Geniusbot | Desktop cockpit | Uses the governed Arbora gateway for its primary panels. |
| Messaging channels | Chat and voice entrypoints | Arbora hosts and supervises them; agent-utilities owns adapters and routing. |
| **Arbora** | MCP, REST, A2A, identity policy, fleet supervision | The running process and public door. |
| [agent-utilities](https://knuckles-team.github.io/agent-utilities/) | Agents, workflows, evaluation, and skills | Arbora invokes its typed control-plane services. |
| [epistemic-graph](https://knuckles-team.github.io/epistemic-graph/) | Durable graph, SQL, RDF, vector, time, reasoning, and provenance | Arbora uses its generated client contracts. |
| [agent-connector-sdk](https://knuckles-team.github.io/agent-connector-sdk/) | Connector servers, source synchronization, and governed effects | Arbora discovers and routes SDK-based connector services. |

The boundary is deliberate: Arbora authenticates, composes, routes,
supervises, and projects. Each sibling remains the source of truth for its own
domain.

[![Knuckles platform runtime architecture](https://raw.githubusercontent.com/Knuckles-Team/epistemic-graph/main/docs/assets/runtime-architecture.svg)](https://knuckles-team.github.io/.github/architecture/#arbora)

[Explore the live architecture](https://knuckles-team.github.io/.github/architecture/#arbora)

## Quick Start

Requires Python 3.12–3.14 and [`uv`](https://docs.astral.sh/uv/). Install the
bundled runtime, generate the local profile, and register its `stdio` launcher
with Codex:

```bash
uv tool install "arbora[webui]"
setup-config generate --profile tiny
setup-config doctor --profile tiny
setup-config codex
```

The doctor command is the first observable result: it reports whether the local
profile and required authorities are ready before a listener starts. Arbora
then appears as the `arbora` MCP server in Codex. Other MCP clients can
start the same local transport directly:

```bash
arbora --transport stdio
```

Network deployments use the identity, TLS, and authorization settings in the
[deployment guide](https://knuckles-team.github.io/arbora/deployment/).

## Contributing

Issues and pull requests are welcome. Read [AGENTS.md](AGENTS.md) for source
boundaries and quality gates. Report vulnerabilities through
[GitHub Security Advisories](https://github.com/Knuckles-Team/arbora/security/advisories/new).

### Development

Run `scripts/bootstrap.sh`, then follow [CONTRIBUTING.md](CONTRIBUTING.md)
for the hooks, tests, and branch and pull-request flow.

## License

Arbora is released under the [MIT License](LICENSE).
