Metadata-Version: 2.4
Name: arbora
Version: 0.1.8.dev12
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: meristem<5.0.0,>=4.2.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: scion-sdk[a2a,mcp]<0.6.0,>=0.5.9
Requires-Dist: aiohttp>=3.14.5
Requires-Dist: anyio>=4.15.1
Requires-Dist: medulla<3.0.0,>=2.27.10
Requires-Dist: medulla-stem<3.0.0,>=2.27.10
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.63.0
Requires-Dist: universal-skills<2.0.0,>=1.3.11
Requires-Dist: cryptography>=50.0.2
Provides-Extra: acp
Requires-Dist: agent-client-protocol==0.11.0; extra == "acp"
Requires-Dist: pydantic-ai-harness[acp]==0.63.0; extra == "acp"
Provides-Extra: test
Requires-Dist: agent-client-protocol==0.11.0; extra == "test"
Requires-Dist: tuig==2.3.6; (sys_platform == "linux" and (platform_machine == "x86_64" or platform_machine == "aarch64")) and extra == "test"
Requires-Dist: pyte==0.8.2; 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.8.3; extra == "webui"
Requires-Dist: uvicorn>=0.54.0; extra == "webui"
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 Overstory 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 |
|---|---|---|
| [Overstory](https://knuckles-team.github.io/overstory/) | Browser experience and local interaction state | Arbora hosts it and supplies governed application routes. |
| Tuig | Terminal and headless interaction | Uses the governed Arbora REST interface. |
| Axil | Desktop GUI | Uses the governed Arbora gateway for its primary panels. |
| Messaging channels | Chat and voice entrypoints | Arbora hosts and supervises them; Meristem holds no adapters or routing. |
| **Arbora** | MCP, REST, A2A, identity policy, fleet supervision | The running process and public door. |
| [Meristem](https://knuckles-team.github.io/meristem/) | In-run execution harness | Applies decisions it receives from Arbora. Holds no store and serves no MCP, API, or A2A. |
| [Medulla](https://knuckles-team.github.io/medulla/) | Durable graph, SQL, RDF, vector, time, reasoning, and provenance | Arbora uses a hand-written client tested on round-trip vectors. One engine, no synced second database. |
| [Scion SDK](https://knuckles-team.github.io/scion-sdk/) | Connector contracts and transports | Arbora admits and routes SDK-based connector services. External stores stay connector sources, read as virtual graphs. |

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/medulla/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 and generate the local profile:

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

The doctor command is the first observable result: it reports whether the local
profile and required authorities are ready before a listener starts. MCP
clients can start the 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).
