Skip to main content
Glama

FleetQ — Open-Source AI Agent Orchestration Platform

Self-hosted mission control for AI agents. Build, run, and monitor autonomous multi-agent systems with a visual DAG builder, human-in-the-loop approvals, MCP server integration, and full audit trail. Works with Claude, GPT-4o, Gemini, Ollama, Codex, Claude Code, and any OpenAI-compatible LLM.

CI License: AGPL v3 PHP Laravel MCP Server

Keywords: AI agents · agent orchestration · MCP server · Model Context Protocol · LangGraph alternative · CrewAI alternative · n8n for AI · Claude agents · LLM workflow · autonomous agents · agent framework · AI automation · self-hosted

☁️ Prefer managed? Try FleetQ Cloud — zero setup, free tier. ⭐ Like the project? Give it a star on GitHub — it helps others find FleetQ.


Table of Contents


Related MCP server: LangChain Agent MCP Server

Why FleetQ?

Most agent frameworks give you a Python notebook. FleetQ gives you a production platform.

  • 🧩 670+ MCP tools across 60+ domains — every feature is exposed via Model Context Protocol, so any LLM (Claude Desktop, Cursor, ChatGPT, local agents) can drive the platform programmatically. New in 1.27: web UIs for previously headless capabilities (agent sessions, release signing keys, drift & eval monitors, broadcasts, test suites, CSV import); eight outbound chat channels as first-class drivers; the Agentic AI Flywheel (self-growing eval set + drift/production monitors); policy-governed autonomy (versioned per-agent policies + replay); cost-aware orchestration and Return on Cognitive Spend (ROCS) metrics.

  • 🔁 Visual DAG workflows with 8 node types (agent, conditional, human-task, switch, dynamic-fork, do-while, compensation, sub-workflow) — no Python glue code.

  • 👥 Multi-agent crews with coordinator/worker/reviewer roles, weighted QA scoring, and cross-validation.

  • 🛡️ Real-World Action governance — assistant tool calls, integration writes, and git pushes route through a per-tier risk policy (auto / ask / reject for low / medium / high). Approvals auto-execute. Audit trail attached.

  • 💰 Budget controls with a real credit ledger, pessimistic locking, and auto-pause on overspend — not just token counters.

  • 🧠 Agent evolution — LLM analyzes execution history and proposes config changes you approve with one click.

  • ⚙️ BYOK + Local LLMs — Anthropic, OpenAI, Google, plus Ollama, LM Studio, vLLM, Codex, Claude Code. Zero vendor lock-in.

  • 🔒 Production-grade — tenant isolation, encrypted credential vault, HMAC webhooks, SSRF guards, circuit breakers, audit trail.

  • 📊 OpenTelemetry observability — structured error codes (gRPC-canonical), deadline propagation, distributed tracing. Jaeger UI one-command away. Per-team OTLP collector endpoints for BYO observability.

  • 📈 Live team graph — Cytoscape.js force-directed visualization of agents, humans, and crews. Real-time updates via Laravel Reverb WebSockets.

  • 🏠 Self-host or cloud — MIT-friendly AGPLv3 license, runs on Docker Compose, or use FleetQ Cloud.

Key Concepts

Concept

What it is

When to use

Agent

A configured AI personality with role, goal, backstory, skills, and tool access

The basic unit — one agent per specialized task

Skill

A reusable LLM prompt, rule, connector, or GPU compute call

When multiple agents need the same capability

Experiment

A stateful run through a 20-stage pipeline (scoring → planning → building → executing → evaluating)

Any non-trivial agent task with lifecycle

Crew

A team of agents working on one goal (sequential, parallel, hierarchical, adversarial, fanout, chat-room)

Multi-perspective tasks or when you need review/QA

Workflow

A visual DAG template (reusable across experiments) with branching, loops, human-tasks

Recurring processes — CI/CD, content pipelines, QA flows

Project

A continuous (cron-scheduled) or one-shot container for experiments, with budget + milestones

Long-running initiatives, scheduled agent work

Signal

An inbound event (webhook, RSS, email, bug report, GitHub issue) that can trigger agents

Event-driven automation

MCP Tool

A programmatic action any LLM can call to query or mutate the platform

Expose FleetQ to external agents (Claude, Cursor, etc.)

Screenshots

Dashboard KPI overview with active experiments, success rate, budget spend, and pending approvals.

Agent Template Gallery Browse 14 pre-built agent templates across 5 categories. Search, filter by category, and deploy with one click.

Agent LLM Configuration Per-agent provider and model selection with fallback chains. Supports Anthropic, OpenAI, Google, and local agents.

Agent Evolution AI-driven agent self-improvement. Analyze execution history, propose personality and config changes, and apply with one click.

Crew Execution Live progress tracking during multi-agent crew execution. Each task shows its assigned skill, provider, and elapsed time.

Task Output Expand any completed task to inspect the AI-generated output, including structured JSON responses.

Visual Workflow Builder DAG-based workflow editor with conditional branching, human tasks, switch nodes, and dynamic forks.

Tool Management Manage MCP servers, built-in tools, and external integrations with risk classification and per-agent assignment.

AI Assistant Sidebar Context-aware AI chat embedded in every page with 28 built-in tools for querying and managing the platform.

Experiment Detail Full experiment lifecycle view with timeline, tasks, transitions, artifacts, metrics, and outbound delivery.

Settings & Webhooks Global platform settings, AI provider keys (BYOK), outbound connectors, and webhook configuration.

Error Handling Failed tasks display detailed error information including provider, error type, and request IDs for debugging.

Features

Agents, crews, and workflows

  • AI Agents — role, goal, backstory, personality traits, skill assignments, per-agent provider/model fallback chains

  • Agent Templates — 14 pre-built templates across 5 categories (engineering, content, business, design, research)

  • Agent Evolution — LLM analyzes execution history, proposes config changes, one-click approval

  • Agent Crews — Multi-agent teams with coordinator/QA/worker roles, 7 process types (sequential, parallel, hierarchical, self-claim, adversarial, fanout, chat-room), weighted QA scoring

  • Pre-Execution Scout Phase — cheap LLM pre-call identifies what knowledge the agent needs → targeted semantic search instead of generic recall

  • Step Budget Awareness — agent system prompt targets 80% of allowed steps for core work, reserves the rest for synthesis

  • Experiment Pipeline — 20-state machine with automatic stage progression (scoring → planning → building → approval → executing → metrics → evaluating)

  • Visual Workflow DAG — 8 node types (agent, conditional, human-task, switch, dynamic-fork, do-while, compensation, sub-workflow). Pre-built Web Dev Cycle template. NL → workflow generator.

  • Projects — one-shot and continuous projects with cron scheduling, budget caps, milestones, overlap policies

LLMs and compute

  • BYOK — bring your own keys for Anthropic (Claude), OpenAI (GPT-4o), Google (Gemini)

  • Local LLMs — Ollama, LM Studio, vLLM, llama.cpp via OpenAI-compatible endpoints; 17 preset Ollama models; SSRF protection

  • Local Agents — Codex and Claude Code as execution backends (auto-detected, zero cost)

  • Portkey Gateway — optional drop-in that unlocks 250+ LLM providers with semantic caching and fallbacks

  • RunPod GPU Integration — invoke RunPod serverless endpoints or manage full GPU pod lifecycles as skills; BYOK API key; spot pricing

  • Pluggable Compute Providers — gpu_compute skills backed by RunPod, Replicate, Fal.ai, Vast.ai

  • AI Gateway — provider-agnostic via PrismPHP with 6-layer middleware (rate-limit, budget, idempotency, semantic-cache, schema-validation, usage-tracking), circuit breakers, fallback chains

  • Semantic Cache — pgvector-backed cosine similarity (threshold 0.92) cross-team cache — cuts LLM spend on repeat prompts

Signals, triggers, outbound

  • Signal connectors — 20+ drivers: webhook, RSS, IMAP, Slack, Discord, WhatsApp, GitHub, Linear, Jira, PagerDuty, Sentry, Datadog, ClearCue, Telegram, Matrix, Notion, Confluence, Screenpipe, Searxng, more

  • Bug Report signals — lightweight QA pipeline with public JS widget, screenshot + console + network + action log capture, threaded comments (reporter + agent + support), agent delegation, SLA escalation

  • Trigger rules — event-driven automation with condition evaluator, dry-run testing

  • Multi-Channel Outbound — Email (SMTP), Webhook, ntfy plus eight chat channels as first-class drivers (Telegram, Slack, Discord, Microsoft Teams, Google Chat, Matrix, Signal, Supabase Realtime), each with a config page, rate limiting and blacklist

  • Webhooks — inbound (HMAC-SHA256) + outbound (retry, event filtering)

Human-in-the-loop, budgets, security

  • Approvals — inbox with SLA enforcement + escalation

  • Human Tasks — embedded form schemas on workflow nodes

  • Credit Ledger — per-experiment and per-project with pessimistic locking and auto-pause on overspend

  • Credential Vault — encrypted external service credentials with rotation, OAuth2, expiry tracking, per-project injection

  • SSH tools — TOFU (Trust On First Use) fingerprint verification, per-tool allowed-commands whitelist, multi-layer command security policy

  • Audit Trail — full activity log (spatie/activitylog), searchable + filterable

  • Tenant Isolation — multi-layer TeamScope + BelongsToTeam + withoutGlobalScopes() discipline

Integrations & web dev pipeline

  • Integrations — GitHub, Slack, Notion, Airtable, Linear, Stripe, Vercel, Netlify, generic webhook/polling with OAuth 2.0

  • Autonomous Web Dev Pipeline — agents can open PRs, merge, dispatch CI workflows, create releases, trigger Vercel/Netlify/SSH deploys through MCP tools

  • Website Builder — AI-generated static sites with 8 widget types, Vercel + ZIP deployment drivers, form submissions, blog/navigation/contact widgets

  • Founder Mode pack — marketplace bundle of 6 persona agents (Strategist, Product Lead, Growth Hacker, Finance Advisor, Ops Manager, Risk Officer), 20 framework skills (RICE, SPIN, BANT, MEDDIC, OKRs, Shape Up, Unit Economics, Kano, TAM-SAM-SOM, K-Factor, NPV-IRR, RACI, A/B Testing, OWASP), 5 pre-built workflows

  • Marketplace — browse, publish, install shared skills, agents, workflows, and bundles with AI risk scanning

API & MCP surface

  • REST API — 175+ endpoints under /api/v1/ with Sanctum auth, cursor pagination, auto-generated OpenAPI 3.1 at /docs/api

  • MCP Server — 670+ Model Context Protocol tools across 60+ domains (stdio + HTTP/SSE + OAuth2/PKCE)

  • Real-World Action governance — ActionProposal flow gates assistant tool calls, integration writes, and git pushes through a per-tier risk policy with auto-execute on approval

  • Public discovery endpoint — GET /.well-known/fleetq returns a config-gated capability manifest so external AI tools can auto-configure

  • Live team graph — /team-graph page with real-time updates via Laravel Reverb WebSockets

  • Structured MCP errors — canonical gRPC-style error codes (UNAVAILABLE, PERMISSION_DENIED, RESOURCE_EXHAUSTED, DEADLINE_EXCEEDED, INVALID_ARGUMENT, FAILED_PRECONDITION, NOT_FOUND, INTERNAL) with retryable hints — agents know when to retry vs. fail fast

  • Per-tool deadlines — optional deadline_ms parameter on every MCP tool; agents can bound wall-clock time per call

  • OpenTelemetry tracing — OTLP HTTP exporter, Jaeger all-in-one via docker compose --profile observability up, spans for MCP tool → AI gateway → LLM provider

  • Tool Management — MCP servers (stdio/HTTP), built-in tools (bash/filesystem/browser), risk classification, per-agent assignment

  • MCP client compatibility — Claude Desktop, Claude.ai, ChatGPT Apps, Cursor, Codex, Claude Code, Gemini CLI, any OAuth2 client

Infrastructure

  • Queue Management — Laravel Horizon with 6 priority queues and auto-scaling

  • Testing — regression test suites for agent outputs with automated evaluation

  • Per-Call Working Directory — local/bridge agents can operate in a configured working directory per-agent, isolated project contexts

Use Cases

FleetQ is built for teams running AI agents in production, not toy demos.

  • Autonomous dev pipelines — agent opens PR → CI runs → reviewer agent approves → merge → deploy. Human approves only on risk signals.

  • Customer support triage — bug report widget → agent extracts reproduction steps from console/network log → experiment runs → notifies reporter with fix or agent-generated workaround.

  • Multi-agent research — crew of Strategist + Researcher + Writer with QA reviewer. Each step weighted by domain rubric.

  • Scheduled content ops — continuous project runs daily, each run executes a DAG: draft → review → SEO-check → publish → schedule social.

  • Incident response — PagerDuty/Sentry signal → trigger rule → diagnosis agent → human approval on runbook action → Slack notify.

  • GPU workloads — agent calls gpu_compute skill on RunPod serverless (Whisper, FLUX, Bark) as part of a larger workflow, with cost accounting.

  • Local-first agent dev — Ollama + Codex + Claude Code auto-detected, zero API cost for prototyping; switch to cloud providers for production.

  • Bring FleetQ into Claude — expose your internal data + tools as MCP server, Claude Desktop/ChatGPT/Cursor can drive the platform programmatically.

How FleetQ compares

FleetQ

n8n

CrewAI

LangGraph

Make.com

Open source

✅ AGPLv3

✅ Sustainable Use

✅ MIT

✅ MIT

❌ Proprietary

Visual DAG builder

✅ 8 node types

✅ (not AI-first)

❌

❌

✅

Multi-agent crews

✅ 7 process types

❌

✅

✅ (build-your-own)

❌

MCP server (native)

✅ 670+ tools

❌

❌

❌

❌

Human-in-the-loop

✅ native

⚠️ workaround

⚠️ code

⚠️ code

⚠️ approve-node

Budget ledger + locks

✅ pessimistic

❌

❌

❌

❌

Audit trail

✅ every action

✅

❌

❌

✅

BYOK + local LLMs

✅ both

⚠️ BYOK only

⚠️ depends

⚠️ BYOK

❌

Self-hosted

✅ Docker Compose

✅

n/a (library)

n/a (library)

❌

Agent evolution (self-improve)

✅

❌

❌

❌

❌

OpenTelemetry tracing

✅ native

❌

❌

⚠️ partial

❌

Credit/usage metering

✅ per-team/project

❌

❌

❌

per-workspace

TL;DR — if you're building production agent systems with LLMs and want visual workflows + MCP + human oversight, FleetQ is the only platform that bundles all of it.

Quick Start (Docker)

git clone https://github.com/escapeboy/agent-fleet-o.git
cd agent-fleet
make install

This will:

  1. Copy .env.example to .env

  2. Build and start all Docker services

  3. Run the interactive setup wizard (database, admin account, LLM provider)

Visit http://localhost:8080 when complete.

Quick Start (Manual — Web Setup)

Requirements: PHP 8.4+, PostgreSQL 17+, Redis 7+, Node.js 20+, Composer

git clone https://github.com/escapeboy/agent-fleet-o.git
cd agent-fleet
composer install
npm install && npm run build
cp .env.example .env
# Edit .env — set DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD, REDIS_HOST
php artisan key:generate
php artisan migrate
php artisan horizon &
php artisan serve

Then open http://localhost:8000 in your browser. The setup page will guide you through creating your admin account.

Alternative: Run php artisan app:install for an interactive CLI setup wizard that also seeds default agents and skills.

Authentication

  • No email verification — the self-hosted edition skips email verification entirely. Accounts are active immediately on registration.

  • Single user — all registered users join the default workspace automatically.

No-Password Mode (local installs)

If you're running FleetQ locally on your own machine and don't want to enter a password on every visit, set APP_AUTH_BYPASS=true in .env:

APP_AUTH_BYPASS=true   # Auto-login as first user
APP_ENV=local          # Required — bypass is disabled in production

With bypass enabled, the app logs you in automatically on every request. A logout link is still shown but you'll be logged back in on the next page load — this is intentional.

Warning: Never set APP_AUTH_BYPASS=true on a server accessible from the internet.

Configuration

All configuration is in .env. Key variables:

# Database (PostgreSQL required)
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_DATABASE=agent_fleet

# Redis (queues, cache, sessions, locks)
REDIS_HOST=redis
REDIS_DB=0          # Queues
REDIS_CACHE_DB=1    # Cache
REDIS_LOCK_DB=2     # Locks

# LLM Providers -- at least one required for AI features
ANTHROPIC_API_KEY=
OPENAI_API_KEY=
GOOGLE_AI_API_KEY=

# Auth bypass -- local no-password mode (never use in production)
APP_AUTH_BYPASS=false

Additional LLM keys can be configured in Settings > AI Provider Keys after login.

To use local models (Ollama, LM Studio, vLLM):

LOCAL_LLM_ENABLED=true
LOCAL_LLM_SSRF_PROTECTION=false  # set false if Ollama is on a LAN IP (192.168.x.x)
LOCAL_LLM_TIMEOUT=180

Then configure endpoints in Settings > Local LLM Endpoints.

SSH Host Access

Agents can execute commands on the host machine (or any remote server) via SSH using the built-in SSH tool type. This is useful for running local scripts, interacting with the filesystem, or orchestrating host-level processes from an agent.

How it works

  1. The platform stores SSH private keys encrypted in the Credential vault.

  2. An SSH Tool is configured with host, port, username, credential_id, and an optional allowed_commands whitelist.

  3. On the first connection to a host, the server's public key fingerprint is stored via TOFU (Trust On First Use). Subsequent connections verify the fingerprint — a mismatch raises an error to prevent MITM attacks.

  4. Manage trusted fingerprints via Settings > SSH Fingerprints or the tool_ssh_fingerprints MCP tool.

Setup (Docker — connecting container to host)

The containers reach the host machine via host.docker.internal, which is pre-configured in docker-compose.yml via extra_hosts: host.docker.internal:host-gateway.

Step 1 — Enable SSH on the host

OS

Command

macOS

System Settings → General → Sharing → Remote Login → On

Ubuntu/Debian

sudo apt install openssh-server && sudo systemctl enable --now ssh

Fedora/RHEL

sudo dnf install openssh-server && sudo systemctl enable --now sshd

Windows

Settings → System → Optional Features → OpenSSH Server, then Start-Service sshd

Step 2 — Generate an SSH key pair

ssh-keygen -t ed25519 -C "fleetq-agent@local" -f ~/.ssh/fleetq_agent_key -N ""

Step 3 — Authorize the key on the host

cat ~/.ssh/fleetq_agent_key.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Step 4 — Create a Credential in FleetQ

Navigate to Credentials → New Credential:

  • Type: SSH Key

  • Paste the contents of ~/.ssh/fleetq_agent_key (private key)

Or via API:

curl -X POST http://localhost:8080/api/v1/credentials \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Host SSH Key",
    "credential_type": "ssh_key",
    "secret_data": {"private_key": "<contents of fleetq_agent_key>"}
  }'

Step 5 — Create an SSH Tool

Navigate to Tools → New Tool → Built-in → SSH Remote, or via API:

curl -X POST http://localhost:8080/api/v1/tools \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Host SSH",
    "type": "built_in",
    "risk_level": "destructive",
    "transport_config": {
      "kind": "ssh",
      "host": "host.docker.internal",
      "port": 22,
      "username": "your-username",
      "credential_id": "<credential-id>",
      "allowed_commands": ["ls", "pwd", "whoami", "uname", "date", "df"]
    },
    "settings": {"timeout": 30}
  }'

Step 6 — Assign the tool to an agent

In the Agent detail page, go to Tools and assign the SSH tool. The agent will now have an ssh_execute function available during execution.

Command security policy

The platform enforces a multi-layer security hierarchy for bash and SSH commands:

  1. Platform-level — always blocked: rm -rf /, mkfs, shutdown, reboot, pipe-to-shell patterns

  2. Organization-level — configure in Settings → Security Policy or via the tool_bash_policy MCP tool

  3. Tool-level — allowed_commands whitelist in the tool's transport config

  4. Project-level — additional restrictions in project settings

  5. Agent-level — per-agent overrides on the tool pivot

More restrictive layers always win. A command blocked at the platform level cannot be unblocked by any other layer.

SSH fingerprint management

Trusted host fingerprints are viewable and removable via:

  • API: GET /api/v1/ssh-fingerprints / DELETE /api/v1/ssh-fingerprints/{id}

  • MCP: tool_ssh_fingerprints with list or delete action

Remove a fingerprint when a host's SSH key is legitimately rotated — the next connection will re-verify via TOFU.

Architecture

flowchart LR
    subgraph Clients["Operators & external agents"]
        UI["Admin UI — Livewire 4 + Alpine"]
        MCPCLI["MCP clients (Claude Desktop, Cursor, Codex, Claude Code)"]
        APIC["REST clients — /api/v1/* (Sanctum)"]
        SIG["Inbound signals (webhook / RSS / IMAP / Slack / Telegram)"]
    end

    UI --> WEB
    APIC --> API
    MCPCLI -->|HTTP/SSE or stdio| MCP
    SIG --> INGEST

    subgraph App["FleetQ app (Laravel 13 / PHP 8.4)"]
        WEB["Web routes (auth:web)"] --> DOM
        API["/api/v1/* — Sanctum tokens"] --> DOM
        MCP["AgentFleetServer — 670+ MCP tools / 60+ domains"] --> DOM
        INGEST["SignalWebhookController / IngestSignalAction"] --> TRIG["TriggerRule evaluator"]
        TRIG --> DOM

        DOM["Domain layer — Agent / Crew / Experiment / Workflow / Project / Approval / Budget / Tool / Credential / Skill / Outbound"]
        DOM --> SM["ExperimentStateMachine (20 states)"]
        SM --> EVT(("ExperimentTransitioned event"))
        EVT --> STAGE["BaseStageJob + PlaybookExecutor"]
        STAGE --> GATEWAY["AI Gateway (PrismPHP) — 6-layer middleware + circuit breakers"]
        GATEWAY --> LLM["Providers: Anthropic / OpenAI / Google / Ollama / vLLM / Codex / Claude Code"]
        STAGE --> TOOLS["ToolTranslator — MCP stdio/HTTP, bash, filesystem, browser, SSH (TOFU)"]
        STAGE --> APPR["ApprovalRequest / HumanTask (auth:web inbox)"]
        STAGE --> OUT["Outbound connectors — Email / Telegram / Slack / Webhook / ntfy"]
        STAGE --> ARTI[("Artifact + ArtifactVersion")]

        DOM --> DB[("Postgres 17 + pgvector — semantic cache, UUIDv7, JSONB+GIN")]
        STAGE --> QUEUE[("Redis 7 — 6 Horizon queues, cache, locks")]
        APPR --> DB
        ARTI --> DB
    end

    subgraph Optional["Optional Docker profiles"]
        REVERB["Reverb — WebSocket live team graph"]
        BROWSER["browserless (Chromium)"]
        SEARX["searxng"]
        VOICE["voice-worker (LiveKit / Deepgram)"]
        SANDBOX["bash_sidecar (sandboxed shell)"]
        RELAY["fleetq-bridge relay"]
        JAEGER["Jaeger — OTLP traces (--profile observability)"]
    end

    App -.OTLP spans.-> JAEGER
    UI <-->|WebSocket| REVERB
    TOOLS -.->|browser tools| BROWSER
    TOOLS -.->|web search skill| SEARX
    TOOLS -.->|bash skill| SANDBOX
    App <-->|relay| RELAY
    DOM <--> VOICE

The platform is a single Laravel 13 monolith that exposes three coequal control surfaces over the same domain layer: the Livewire admin UI, a Sanctum-authenticated REST API at /api/v1/* (~175 endpoints), and AgentFleetServer — an MCP server with 670+ tools across 60+ domains served over both HTTP/SSE and local stdio. Inbound signals (webhook, RSS, IMAP, Slack, Telegram, and the rest of the 20+ connectors) flow through IngestSignalAction and the TriggerRule evaluator into the domain layer, where the ExperimentStateMachine walks a 20-state pipeline by emitting ExperimentTransitioned events whose listeners dispatch the next BaseStageJob onto Horizon-managed Redis queues. Stage jobs talk to LLMs through the PrismPHP-backed AI Gateway (rate-limit, budget, idempotency, semantic-cache, schema-validation, usage-tracking middleware + circuit breakers + provider fallbacks), invoke Tool instances translated to PrismPHP tool calls (MCP stdio/HTTP, built-in bash/filesystem/browser, SSH with TOFU fingerprints), park ApprovalRequest/HumanTask records for the human-in-the-loop inbox, and persist Artifact versions plus deliver outbound messages over Email/Telegram/Slack/Webhook/ntfy. State and tenant data live in Postgres 17 with pgvector (semantic cache, UUIDv7 primary keys, JSONB+GIN indexes); Redis 7 carries the six Horizon queues, application cache, and pessimistic budget locks. Optional Docker Compose profiles add Reverb for the live team-graph WebSocket, browserless for browser tools, searxng for web search, a voice worker (LiveKit/Deepgram), a sandboxed bash sidecar, the fleetq-bridge relay, and Jaeger for OpenTelemetry tracing via --profile observability.

Built with Laravel 13, Livewire 4, and Tailwind CSS. Domain-driven design with 45 bounded contexts — table below shows the 17 primary domains:

Domain

Purpose

Agent

AI agent configs, execution, personality, evolution

Crew

Multi-agent teams with lead/member roles

Experiment

Pipeline, state machine, playbooks

Signal

Inbound data ingestion

Outbound

Multi-channel delivery

Approval

Human-in-the-loop reviews and human tasks

Budget

Credit ledger, cost enforcement

Metrics

Measurement, revenue attribution

Audit

Activity logging

Skill

Reusable AI skill definitions

Tool

MCP servers, built-in tools, risk classification

Credential

Encrypted external service credentials

Workflow

Visual DAG builder, graph executor

Project

Continuous/one-shot projects, scheduling

Assistant

Context-aware AI chat with 28 tools

Marketplace

Skill/agent/workflow sharing

Integration

External service connectors (GitHub, Slack, Notion, Airtable, Linear, Stripe, Generic)

Docker Services

Service

Purpose

Port

app

PHP 8.4-fpm

--

nginx

Web server

8080

postgres

PostgreSQL 17

5432

redis

Cache/Queue/Sessions

6379

horizon

Queue workers

--

scheduler

Cron jobs

--

vite

Frontend dev server

5173

Common Commands

make start          # Start services
make stop           # Stop services
make logs           # Tail logs
make update         # Pull latest + migrate
make test           # Run tests
make shell          # Open app container shell

Or with Docker Compose directly:

docker compose exec app php artisan tinker       # REPL
docker compose exec app php artisan test          # Run tests
docker compose exec app php artisan migrate       # Run migrations

Decision-Model Eval Harness

jev:eval scores a decision model — TypeSafe's Jev, a second System One endpoint, or an ordinary chat LLM — against a JSONL dataset, and jev:report turns the recorded answers into accuracy, calibration, coverage, latency, cost and determinism numbers. Nothing in the request path calls it: it is a measurement tool, not a production dependency.

The API key never touches the repo

TYPESAFE_API_KEY lives in 1Password and reaches the process only through op run. .env.op (committed) holds the reference, never the value:

TYPESAFE_API_KEY="op://AI Agent/Jev API Key/credential"

The baseline drivers follow the same rule — .env.op also carries references for ANTHROPIC_API_KEY, GEMINI_API_KEY / GOOGLE_AI_API_KEY and OPENAI_API_KEY, and each command passes only the names it needs through docker compose run -e.

Every command that calls the API is run through op run, which resolves the reference into the child process and masks it in the output. Do not pass --no-masking, do not op read the item into a variable, and do not write the value into .env, a compose file or a fixture.

Running an eval end to end

# 1. Build the datasets.
python3 base/scripts/jev-eval/export_next_tool_dataset.py    # -> next-tool.jsonl
python3 base/scripts/jev-eval/export_routing_v2_dataset.py   # -> routing-v2.jsonl + routing-v2-synth.jsonl
python3 base/scripts/jev-eval/export_domain_prefilter_dataset.py  # -> domain-prefilter.jsonl
#    both write into ~/jev-eval/datasets/fleetq/

# 2. Make them reachable from the container (storage/ is bind-mounted).
mkdir -p storage/app/jev-eval
cp ~/jev-eval/datasets/fleetq/*.jsonl storage/app/jev-eval/

# 3. Run the eval. The key is injected by op, by name, for this process only.
export OP_SERVICE_ACCOUNT_TOKEN=$(cat ~/.config/op/sa-token)

op run --env-file=.env.op -- docker compose run --rm -e TYPESAFE_API_KEY app \
  php artisan jev:eval storage/app/jev-eval/routing-v2.jsonl --driver=jev --split=test --concurrency=8

# 4. Report on the run id the eval printed.
docker compose exec app php artisan jev:report <run-id> \
  --dataset-path=storage/app/jev-eval/routing-v2.jsonl

Measuring determinism — the same requests sent N times:

op run --env-file=.env.op -- docker compose run --rm -e TYPESAFE_API_KEY app \
  php artisan jev:eval storage/app/jev-eval/routing-v2.jsonl --driver=jev --split=dev --repeat=3

Comparing Jev against a chat model on the same dataset — the LLM drivers use the platform AI gateway, so they need no TypeSafe key:

op run --env-file=.env.op -- docker compose run --rm -e ANTHROPIC_API_KEY app \
  php artisan jev:eval storage/app/jev-eval/routing-v2.jsonl --driver=haiku --split=test --team=<team-id>

--team is required: the gateway logs every call to the tenant-scoped llm_request_logs, and an eval has no tenant of its own. The gateway also caps Anthropic at 60 requests per minute across the whole process, so the LLM drivers publish their own requests_per_minute and the eval throttles itself to it — two of these running flat out in parallel will still starve each other.

gemini-flash and gpt-mini exist for one reason: on a dataset whose gold labels were produced by Claude models, an Anthropic baseline is scoring its own homework. A model family that had no hand in the labels is the only baseline that means anything there.

When the metered Anthropic key is unavailable, claude_cli_haiku and claude_cli_sonnet run the same prompts through the local Claude Code CLI on its subscription credentials. They need no key, no --team and no gateway:

docker compose run --rm -v "$HOME/.claude/.credentials.json:/root/.claude/.credentials.json:ro" \
  -e CLAUDE_CLI_CONCURRENCY=5 app \
  php artisan jev:eval storage/app/jev-eval/topics-bg.jsonl --driver=claude_cli_sonnet --split=test

Without Docker, the same commands run directly:

op run --env-file=.env.op -- php artisan jev:eval ~/jev-eval/datasets/fleetq/routing-v2.jsonl --driver=jev --split=test
op run --env-file=.env.op -- php artisan jev:report

Options

jev:eval:

Option

Default

Meaning

--driver

jev

A key from config/decision.php: jev, jeff, haiku, sonnet, gemini-flash, gpt-mini, claude_cli_haiku, claude_cli_sonnet

--split

test

dev, test, or all. 20/80, decided by a hash of the case id

--repeat

1

Send each case N times; feeds the determinism columns

--concurrency

8

Cases in flight at once, for drivers that support batching

--limit

0

Stop after N cases, taken in file order so two drivers stay comparable

--team

—

Team the LLM drivers log their gateway calls under (required for haiku/sonnet)

jev:report:

Option

Meaning

run_id...

One or more runs; several put different drivers in one table set

--group-by=meta.source

Split every table by a dataset meta key

--where=meta.source=assistant_turn

Keep only cases matching a meta key (comma-separated values allowed)

--questions=domain

Report only these question ids

--multi-label

Score each case as one label SET (Noul per label) instead of per question

--dataset-path=

The dataset file; required by --group-by, --where and the variant analysis

Accuracy is printed with a 95% Wilson interval, which is what makes a per-source table readable when some sources have only a handful of cases.

Each question type also gets its own block under the headline table:

Type

Extra metrics

Choice

top-2 accuracy (gold within the two highest-probability options), per-class precision / recall / F1, confusion pairs sorted by count

Noul

precision, recall and F1 of the positive class at t=0.5, PR-AUC (average precision), and the gold positive rate printed next to accuracy

Score

MAE on the level index, and binary accuracy for level 0 vs level > 0

The run stays under Jev's published ceilings (1,200 requests/minute and 250,000 tokens/second) on its own. A case whose state plus longest question is estimated over 32k tokens is rejected and logged by id, never truncated — a shortened state is a different case, and scoring it would move the accuracy number without saying so.

Datasets

JSONL, one case per line:

{"id":"routing-006cbe1f682e","state":{...},"questions":{"domain":{"type":"choice","instructions":"...","criteria":{...}}},"gold":{"domain":"filesystem"},"meta":{"lang":"en","source":"phoenix:local_agent.tool","split":"test"}}

File

What it measures

Gold comes from

next-tool.jsonl

next-tool prediction inside a coding loop

the tool the agent in fact called next

routing-v2.jsonl

which FleetQ MCP domain handles a request

configuration, or a human's recorded choice

routing-v2-synth.jsonl

the same question, on registry-phrased requests

the registry domain of the tool a description came from

domain-prefilter.jsonl

which domains can be ruled out (multi-label)

every MCP domain the assistant drew a tool from in that turn

next-tool.jsonl is one case per tool call an agent actually made inside a session belonging to an experiment that reached completed. The state carries the task brief and the steps already taken; the gold answer is the tool that was in fact chosen next. The assistant's own narration is deliberately excluded — it routinely names the next tool, which would turn routing into string extraction. This is agent behaviour, not FleetQ routing.

routing-v2.jsonl never scores against what an agent decided. Each gold answer is a configuration fact or an explicit human choice already in the database: a user asked the assistant for something and it called tools from exactly one MCP domain (turns spanning two domains are dropped, because the gold would be ambiguous); a signal was routed into an experiment whose workflow template was configured; a human created an experiment and assigned a specific agent to it. meta.source records which, so a subset can be scored on its own. A single source task contributes at most 15 cases.

routing-v2-synth.jsonl is generated from the tool registry's own descriptions to cover the domains production data never exercises. Every case carries meta.source = "synthetic" and it lives in its own file so it is never mixed into headline numbers — score it separately or not at all.

domain-prefilter.jsonl asks a different question from routing-v2: not "which one domain handles this" but "which domains can be ruled out" — the shape a prefilter in front of a 700-tool MCP server needs. One Noul per domain, all 67 in a single request, gold true for every domain the turn drew a tool from. Multi-domain turns are kept here, because a turn spanning two domains is a correct multi-label answer rather than an ambiguous one. Score it with jev:report --multi-label, which sweeps the threshold and reports the tightest prefilter that still keeps essentially every true label.

On routing-v2 headline numbers: only the assistant_turn source belongs in one. The signal_workflow and experiment_agent sources encode a configuration fact that the request text cannot support — a Sentry bug report reads like a signal whatever the tenant configured it to trigger — and model_tier has a single value across every case where prod data can derive it. Report those per source, never merged:

docker compose exec app php artisan jev:report <run-id> \
  --dataset-path=storage/app/jev-eval/routing-v2.jsonl \
  --where=meta.source=assistant_turn --questions=domain

The domain option list and its one-sentence descriptions are read out of the registry by base/scripts/jev-eval/mcp_domain_registry.py; add a tool group and the option appears on its own.

Upgrading

make update

This pulls the latest code, rebuilds containers, runs migrations, and clears caches.

Tech Stack

  • Framework: Laravel 13 (PHP 8.4)

  • Database: PostgreSQL 17

  • Cache/Queue: Redis 7

  • Frontend: Livewire 4 + Tailwind CSS 4 + Alpine.js

  • AI Gateway: PrismPHP

  • Queue: Laravel Horizon

  • Auth: Laravel Fortify (2FA) + Sanctum (API tokens)

  • Audit: spatie/laravel-activitylog

  • API Docs: dedoc/scramble (OpenAPI 3.1)

  • MCP: laravel/mcp (Model Context Protocol)

Contributing

Contributions are welcome. Please open an issue first to discuss proposed changes.

  1. Fork the repository

  2. Create a feature branch (git checkout -b feat/my-feature)

  3. Make your changes and add tests

  4. Run php artisan test to verify

  5. Submit a pull request

See CONTRIBUTING.md for coding conventions, commit style, and PR checklist.

Community & Support

Star History

If FleetQ saves you time, a ⭐ helps others find it. GitHub ranks repos by star velocity.

License

FleetQ Community Edition is open-source software licensed under the GNU Affero General Public License v3.0.

TL;DR of AGPLv3: You can self-host, modify, and run FleetQ for free — including commercial use. If you offer FleetQ as a hosted service to others, you must open-source your modifications. Questions? See our AGPLv3 FAQ.

Available Tools

34 tools
admin_manageCloud Admin Manage ToolA

Platform super-admin operations — suspend tenants, adjust billing, force-rotate user sessions, browse cross-team security signals. Restricted to users with is_super_admin=true (HTTP 403 for all other callers regardless of team role). Every write is audit-logged with the calling super-admin's id, target id, and reason.

When to use: incident response (suspend a compromised team, revoke leaked sessions), customer-success billing adjustments, or platform-wide security review. Do NOT use for routine tenant operations — those have team-scoped tools.

Actions (pass alongside action):

  • team_suspend (DESTRUCTIVE — disables tenant logins) — team_id (UUID), reason (string). Existing API tokens for the team are invalidated; users see a 403 on all API calls.

  • team_billing (read) — team_id. Returns current invoice + plan summary, including next-cycle estimate.

  • billing_credit (write — moves money) — team_id, amount (positive integer cents), reason (string). Adds to the team's CreditLedger; reflects in the next invoice.

  • billing_refund (DESTRUCTIVE — issues a real Stripe refund) — team_id, amount (cents). Refunds against the most recent successful charge; partial refunds supported.

  • security_overview (read) — recent suspicious activity across all teams: failed logins, token leaks, abuse signals.

  • user_revoke_sessions (DESTRUCTIVE) — user_id (UUID). Invalidates ALL sessions and Sanctum/Passport tokens for the user; they must re-authenticate everywhere.

  • user_send_password_reset (write) — user_id. Emails a password-reset link with a 60-minute one-time token.

Cloud note: feedback management (feedback_list/feedback_update) lives under platform support tooling, not exposed via MCP. Errors: 401, 403 (not super-admin), 404, 422, 429, 503 (Stripe down for billing actions).

Inputs: action (required), team_id (required), amount_cents (required), payment_intent_id (required), +4 more.

agent_advancedAgent Advanced ToolA
Destructive

Auxiliary agent operations beyond core CRUD: configuration history, rollback, live runtime inspection, skill/tool wiring, user feedback. For create/update/delete/toggle use agent_manage. Every action requires agent_id; remaining params depend on action.

Actions:

  • config_history (read) — agent_id. Past config snapshots with timestamps.

  • rollback (DESTRUCTIVE) — agent_id, version. Overwrites the current config with the named snapshot — current state is lost unless already snapshotted.

  • runtime_state (read) — agent_id. Last execution status, queue depth, error counters.

  • skill_sync (write) — agent_id, skill_ids[]. Replaces attached skills (full set semantics).

  • tool_sync (write) — agent_id, tool_ids[]. Replaces attached tools (full set semantics).

  • feedback_submit (write) — agent_id, rating (1-5), comment.

  • feedback_list (read) — agent_id. Recent feedback entries.

  • feedback_stats (read) — agent_id. Aggregate score + sentiment.

Inputs: action (required), agent_id (required), revision_id (required), skill_ids (required), +10 more.

agent_manageAgent Manage ToolA
Destructive

Core CRUD for AI agents in the caller's team. For runtime inspection, rollback, skill/tool wiring or feedback use agent_advanced. provider and model are validated against team-configured BYOK and local-LLM credentials at create/update time.

Actions:

  • list (read) — optional: status, limit (default 50), cursor.

  • get (read) — agent_id.

  • create (write) — name, role, goal; optional: backstory, provider, model, skill_ids[], tool_ids[].

  • update (write) — agent_id + any creatable field. Partial updates allowed.

  • delete (DESTRUCTIVE) — agent_id, confirm=true. Soft-deletes; recoverable for 30 days.

  • toggle_status (write) — agent_id. Flips active ↔ disabled.

  • templates (read) — pre-built agent templates from the platform catalog.

Inputs: action (required), agent_id (required), name (required), confirm (required), +24 more.

approval_manageApproval Manage ToolA
Destructive

Human-in-the-loop approvals and workflow human-task completion. Use this to unblock workflow steps gated on reviewer decisions or to submit form data for human_task DAG nodes. Each decision is audit-logged and emits a domain event the workflow runtime listens for.

Actions:

  • list (read) — optional: status (pending/approved/rejected/expired), assignee_id, limit.

  • approve (write) — approval_id, optional comment. Unblocks the dependent step.

  • reject (write) — approval_id, reason. Terminates the dependent step (workflow may branch on rejection).

  • complete_human_task (write) — approval_id, form_data (JSON matching the node's form_schema). Validates against the schema before commit.

  • webhook_config (write) — approval_id, webhook_url. Configures external notification when status changes.

Inputs: action (required), approval_id (required), reason (required), form_response (required), +6 more.

artifact_manageArtifact Manage ToolA
Destructive

Read-only access to artifacts produced by experiments, crew executions, and project runs (code, documents, data, media). Each artifact has 1..N ArtifactVersion entries; version defaults to latest when omitted. download returns a signed URL valid for ~5 minutes; content returns the body inline (base64 for binary MIMEs).

Actions:

  • list (read) — exactly one of: experiment_id, crew_execution_id, project_run_id; optional limit.

  • get (read) — artifact_id. Metadata only (size, mime, version count, created_by AiRun id).

  • content (read) — artifact_id; optional version. Returns raw or base64 body.

  • download (read) — artifact_id; optional version. Returns short-lived signed URL.

Inputs: action (required), artifact_id (required), deadline_ms, experiment_id, +5 more.

assistant_manageAssistant Manage ToolA
Destructive

FleetQ AI assistant conversations — the in-app chat panel that can call MCP tools on the user's behalf with role-gated authorization (read for all, write for Member+, destructive for Admin/Owner). Conversations bind to a context object (experiment, project, agent, crew, workflow) on first message.

Actions:

  • conversation_list (read) — optional: limit, context_type filter.

  • conversation_get (read) — conversation_id. Full history including tool_calls / tool_results.

  • send_message (write) — message; optional: conversation_id (omit to start new), context_type, context_id, attachments[]. Triggers a synchronous tool-loop LLM call; consumes team credits.

  • conversation_clear (DESTRUCTIVE) — conversation_id. Erases all messages, retains the conversation shell.

Inputs: action (required), conversation_id (required), message (required), deadline_ms, +3 more.

boruna_manageBoruna Manage ToolA
Destructive

Boruna deterministic capability-safe .ax script runtime (v1.x LTS) — execute, validate, and audit Boruna scripts. Side effects depend entirely on the script's declared capabilities. Requires an active mcp_stdio Tool record pointing to a working Boruna binary; otherwise every action returns dependency_unavailable.

Actions:

  • run (write — side effects per script capabilities) — inline .ax source OR skill_id of a saved boruna_script skill; optional: timeout_ms, mem_limit_mb.

  • validate (read) — .ax source. Syntax + semantic check, no execution.

  • policy_validate (read; v0.4.0+) — policy JSON. Strict schema validation.

  • evidence (read) — run_id. Capability/effect evidence record for an executed run.

  • capability_list (read) — registered capabilities and capability_set_hash.

  • skill_manage (write) — sub-actions list/get/create/update/delete on boruna_script-typed skills.

Inputs: action (required), mode (required), policy_json (required), execution_id (required), +11 more.

bridge_manageBridge Manage ToolA
Destructive

FleetQ Bridge — a WebSocket relay that lets cloud experiments reach private endpoints on a self-hosted runner (laptop, on-prem VPS): local Ollama instances, internal MCP servers, on-prem APIs. All actions operate on the team's currently-registered bridge.

Actions:

  • status (read) — connection state, last heartbeat, registered endpoint count.

  • endpoint_list (read) — local LLM agents + MCP servers announced by the bridge.

  • endpoint_toggle (write) — endpoint_id, enabled (bool). Flips visibility to cloud experiments without redeploying the bridge.

  • disconnect (DESTRUCTIVE) — terminates the active bridge session; the runner must re-register before agents can reach private endpoints again.

Inputs: action (required), endpoint_id (required), deadline_ms, type, +2 more.

budget_manageBudget Manage ToolB
Destructive

Team-wide credit budget overview, pre-flight cost guards, and spend forecasting. Read-only — does not move money. 1 credit ≈ $0.001 USD; balances and reservations track LLM + outbound + compute spend with pessimistic locking. Use check before dispatching any expensive job to avoid mid-run pause-on-budget-exhausted events.

Actions:

  • summary (read) — current balance, pending reservations, MTD spend by category (llm/outbound/compute).

  • check (read) — estimated_cost (credits). Returns pass/fail without reserving funds.

  • forecast (read) — period (week|month|quarter), granularity (day|week). Projects spend by extrapolating recent ledger entries.

Inputs: action (required), deadline_ms, amount.

chatbot_manageChatbot Manage ToolA
Destructive

Embeddable chatbots backed by an existing FleetQ agent. Each instance issues per-widget tokens for embedding, tracks sessions, and exposes analytics + learning entries. Conversations consume team credits via the bound agent's provider.

Actions:

  • list / get (read) — list all or fetch one (chatbot_id).

  • create (write) — name, agent_id, config (theme, greeting, allowed_origins[]).

  • update (write) — chatbot_id + any creatable field.

  • delete (DESTRUCTIVE) — chatbot_id. Cascades — also revokes all widget tokens.

  • toggle_status (write) — chatbot_id. Flips active ↔ disabled.

  • token_create (write) — chatbot_id. Returns an embeddable widget token (display once).

  • token_revoke (DESTRUCTIVE) — chatbot_id, token_id. Invalidates a single widget instance.

  • session_list / analytics / learning_entries (read) — chatbot_id; optional date range.

Inputs: action (required), id (required), name (required), type (required), +19 more.

credential_manageCredential Manage ToolA
Destructive

Encrypted credential vault for external services (API keys, OAuth2 tokens, basic auth, bearer tokens). Secrets are encrypted at rest with the team's per-tenant key; secret_data is never returned by get — only metadata (name, type, expires_at, last_rotated_at).

Actions:

  • list (read) — optional: type, status filter.

  • get (read) — credential_id. Metadata only, secrets redacted.

  • create (write) — name, type (api_key/oauth2/basic_auth/bearer_token/custom), secret_data (object).

  • update (write) — credential_id + any creatable field.

  • delete (DESTRUCTIVE) — credential_id. Hard delete; not recoverable.

  • rotate (write) — credential_id, new_secret_data. Bumps last_rotated_at and re-encrypts.

  • oauth_initiate (write) — provider, scopes[]. Returns authorization URL.

  • oauth_finalize (write) — provider, code (from OAuth callback). Stores tokens, returns credential_id.

Inputs: action (required), credential_id (required), name (required), type (required), +12 more.

crew_manageCrew Manage ToolA
Destructive

Multi-agent crews — coordinated teams of agents that decompose a goal across roles (sequential, parallel, or hierarchical process). execute is async: it queues ExecuteCrewJob and returns immediately with an execution_id; poll execution_status for progress. Each crew member must be a real agent_id in the same team.

Actions:

  • list / get (read) — list all or fetch one (crew_id).

  • create (write) — name, process_type (sequential|parallel|hierarchical), agents[] (array of {agent_id, role}).

  • update (write) — crew_id + any creatable field.

  • delete (DESTRUCTIVE) — crew_id. Soft-deletes the crew.

  • execute (write — long-running) — crew_id, goal. Reserves budget, returns execution_id.

  • execution_status (read) — crew_id, execution_id. Status, current task, partial results.

  • executions_list (read) — crew_id; optional limit.

Inputs: action (required), crew_id (required), name (required), coordinator_agent_id (required), +11 more.

email_manageEmail Manage ToolA
Destructive

Email themes (visual styling) and templates (transactional + marketing copy). Templates can be hand-written MJML/HTML or AI-generated via template_generate (consumes credits). Deleting a theme used by templates is blocked unless those templates are deleted first.

Theme actions:

  • theme_list / theme_get (read).

  • theme_create (write) — name, styles (object: colors, fonts, spacing).

  • theme_update (write) — theme_id + any creatable field.

  • theme_delete (DESTRUCTIVE) — theme_id. Fails if any template references it.

Template actions:

  • template_list / template_get (read).

  • template_create (write) — name, subject, body (MJML/HTML); optional theme_id.

  • template_update (write) — template_id + any creatable field.

  • template_delete (DESTRUCTIVE) — template_id.

  • template_generate (write — costs credits) — prompt. Calls the team's default LLM to produce a template, returns draft for review.

Inputs: action (required), id (required), name (required), description (required), +30 more.

evolution_manageEvolution Manage ToolA
Destructive

AI-generated improvement proposals — the platform analyzes recent agent runs and suggests prompt tweaks, model swaps, skill additions. Proposals must be reviewed (analyze), then either apply (mutates the target agent/skill) or reject. apply is irreversible without a manual rollback through agent_advanced.rollback.

Actions:

  • list (read) — optional: status (pending/applied/rejected), target_type, limit.

  • analyze (read) — proposal_id. Returns LLM-generated rationale, confidence score, diff preview.

  • approve (write) — proposal_id. Marks as approved without applying (queue for batch apply).

  • apply (DESTRUCTIVE) — proposal_id. Mutates the target entity in place; rollback only via config_history snapshot.

  • reject (write) — proposal_id, reason. Closes the proposal.

Inputs: action (required), agent_id (required), proposal_id (required), deadline_ms, +3 more.

experiment_manageExperiment Manage ToolA
Destructive

Experiments — the platform's core unit of work. Each experiment runs a workflow (DAG) through a 20-state machine: Draft → Scoring → Planning → Building → AwaitingApproval → Approved → Executing → CollectingMetrics → Evaluating → (Iterating | Completed). Lifecycle transitions are validated by ExperimentTransitionMap; use valid_transitions to discover what's currently allowed.

Actions:

  • list (read) — optional: status, workflow_id, limit.

  • get (read) — experiment_id.

  • create (write) — name, hypothesis; optional workflow_id (else uses default workflow).

  • start (write) — experiment_id. Transitions Draft → Scoring; reserves budget.

  • pause / resume (write) — experiment_id. Pause holds at the current stage.

  • retry (write) — experiment_id. Re-runs the failed stage.

  • retry_from_step (write) — experiment_id, step_id. Graph-aware BFS reset of step + downstream.

  • kill (DESTRUCTIVE) — experiment_id. Terminal; cannot resume.

  • valid_transitions (read) — experiment_id. Allowed next states for current state.

  • cost / steps / share (read) — experiment_id. Cost breakdown / step list / public share token.

Inputs: action (required), experiment_id (required), title (required), step_id (required), +11 more.

git_manageGit Manage ToolA
Destructive

Connect, browse, and modify external git repositories (GitHub, GitLab, Bitbucket, generic SSH). Repo connections store encrypted credentials and use phpseclib for SSH. File and commit ops happen through the platform's AtomicCommittingGitClient so concurrent agent edits don't corrupt working trees.

Repo actions:

  • repo_list / repo_get (read).

  • repo_create (write) — name, url, credentials (object).

  • repo_update (write) — repo_id + any creatable field.

  • repo_delete (DESTRUCTIVE) — repo_id. Drops connection; does not delete the remote repo.

  • repo_test (read) — repo_id. Verifies connectivity + auth.

File / branch / commit actions:

  • file_read (read) — repo_id, path, optional branch.

  • file_write (write — pushes to remote) — repo_id, path, content, branch, message.

  • file_list (read) — repo_id, optional path, branch.

  • branch_create (write) — repo_id, name, source branch.

  • commit (write — pushes to remote) — repo_id, message, files[].

  • pr_create (write) — repo_id, title, body, source branch, target branch. Returns PR URL.

  • pr_list (read) — repo_id; optional state filter.

Inputs: action (required), id (required), name (required), url (required), +21 more.

integration_executeIntegration Execute ToolA
Destructive

Execute an action on a connected integration, e.g. create_issue on GitHub, send_message on Slack.

Inputs: integration_id (required), integration_action (required), params.

integration_manageIntegration Manage ToolB
Destructive

Third-party service integrations (Airtable, Notion, Linear, Stripe, Slack, GitHub via OAuth2 + driver interface). Each integration declares typed capabilities (action endpoints) discoverable at runtime. execute invokes one capability with params validated against the driver's schema; output is normalized to JSON.

Actions:

  • list (read) — optional: driver, status filter.

  • connect (write) — driver, name, credentials (object — driver-specific). Initiates OAuth or stores API keys.

  • disconnect (DESTRUCTIVE) — integration_id. Revokes tokens and deletes the connection.

  • ping (read) — integration_id. Health-check the upstream API.

  • execute (write — side effects on upstream) — integration_id, integration_action (capability name), params (object).

  • capabilities (read) — integration_id. Available actions + parameter schemas.

Inputs: action (required), name (required), integration_id (required), integration_action (required), +6 more.

knowledge_manageKnowledge Manage ToolA
Destructive

Per-team knowledge bases — vector-indexed document collections agents can search at runtime. Ingestion runs an embedding job (consumes credits via the team's embedding provider). search is hybrid: cosine similarity over pgvector + keyword fallback.

Actions:

  • list (read) — all knowledge bases for the team.

  • create (write) — name, description.

  • ingest (write — costs embedding credits) — knowledge_base_id; one of: content (raw text), url (fetched + extracted), file_id.

  • search (read) — knowledge_base_id, query; optional limit (default 10), threshold.

  • delete (DESTRUCTIVE) — knowledge_base_id. Drops all ingested chunks and embeddings.

Inputs: action (required), name (required), knowledge_base_id (required), content (required), +10 more.

marketplace_manageCloud Marketplace Manage ToolA

Cross-team marketplace for shared skills, agents, and workflows. browse and categories are public (no auth scope); publish, install, review operate within the caller's team. Installing a listing copies the artifact into the team and increments the listing's install count.

Actions:

  • browse (read) — optional: query, category, sort. Public.

  • categories (read) — taxonomy of available categories. Public.

  • publish (write) — listing data: target_type (skill/agent/workflow), target_id, name, description, visibility (public/private/team).

  • install (write) — listing_slug. Copies the listed entity into your team.

  • review (write) — listing_slug, rating (1-5), comment. One review per user per listing.

  • analytics (read) — listing_slug. Install counts, ratings (publisher only).

Inputs: action (required), entity_type (required), listing_slug (required), rating (required), +10 more.

memory_manageCloud Memory Manage ToolA

Team-scoped semantic memory — short notes agents store and retrieve across conversations (preferences, constraints, prior decisions). Backed by pgvector with HNSW indexing; cross-team isolation enforced by TeamScope. Distinct from knowledge_manage: this stores unstructured short notes (1-2 paragraphs), knowledge_manage stores document corpora.

When to use: an agent needs to recall a stable fact about the user/team across runs, or wants to remember a decision so the next conversation starts with that context. Do NOT use for transient run-state — use the experiment artifact system instead.

Actions:

  • search (read; semantic) — query (string), optional limit (default 20, max 100). Returns ranked entries with similarity score 0..1; entries below threshold 0.6 are filtered.

  • list_recent (read) — optional limit (default 50). Reverse-chronological by created_at.

  • stats (read) — returns { total_entries, embedding_dim, last_write_at, storage_bytes }.

  • add (write — costs ~1 credit per ~1k tokens for embedding) — content (string, max 4000 chars), optional metadata (object).

  • delete (DESTRUCTIVE) — memory_id (UUID). Hard delete; not recoverable.

  • upload_knowledge (write — costs embedding credits, async) — one of: file content (string), url. Bulk-ingests into memory; returns job_id. Up to 50 MB per call.

Cloud note: supabase_provision not available in cloud (provisioning happens at platform level). Errors: 401, 403, 404 if memory_id missing, 413 on oversized payload, 422 validation, 429 rate limit, 503 if budget exhausted.

Inputs: action (required), query (required), content (required), memory_ids (required), +12 more.

outbound_manageCloud Outbound Manage ToolA

Outbound delivery connectors — channels through which agents send messages: email (SMTP), Slack, Telegram, generic webhook. One connector per channel per team (save uses upsert semantics). All sends pass through ChannelRateLimit and TargetRateLimit middleware and are recorded as OutboundActions.

Actions:

  • list / get (read).

  • save (write — upsert) — channel (email/slack/telegram/webhook), config (channel-specific). Replaces any existing connector for the channel.

  • delete (DESTRUCTIVE) — connector_id. Pending outbound actions on this connector are cancelled.

  • test (write — sends a real test payload) — connector_id, test_payload (object). Counts against rate limits and budgets.

Inputs: action (required), credentials (required), deadline_ms, channel, +2 more.

profile_manageCloud Profile Manage ToolA

Caller's own profile and account settings (name, email, password, 2FA, OAuth links). Operates on the authenticated user — there is no user_id parameter; super-admins managing other users use admin_manage instead. All actions are rate-limited per user (60/min) and audit-logged.

When to use: agent or assistant needs to read/update the current user's profile, list linked OAuth providers, or unlink a social provider. Do NOT use to create accounts (that's a self-service signup flow only).

Actions:

  • get (read) — returns profile object: name, email, locale, timezone, current_team_id, last_login_at, email_verified_at.

  • update (write) — optional fields: name, email, locale, timezone. Email change re-issues the verification mail and clears email_verified_at until confirmed.

  • password_update (DESTRUCTIVE; rotates session) — current_password, password, password_confirmation. Verifies current password then bcrypts the new one; revokes all OTHER active sessions of this user.

  • 2fa_status (read) — returns { enabled: bool, recovery_codes_remaining: int }.

  • connected_accounts (read) — list of linked OAuth provider records (provider, provider_user_id, linked_at).

  • social_list (read) — duplicate of connected_accounts kept for backward client compatibility.

  • social_unlink (DESTRUCTIVE) — provider. Removes the OAuth link; rejected with 422 if it would leave the user with no remaining auth method.

Errors: 401 unauthenticated; 403 if Sanctum token lacks team:{id} ability; 422 for validation; 429 on rate limit.

Inputs: action (required), deadline_ms, name, email, +4 more.

project_manageProject Manage ToolA
Destructive

Projects — recurring (continuous) or one-shot containers that schedule workflow runs against goals. Continuous projects spawn ProjectRuns on the configured cadence (cron-style or natural language); one-shot projects fire once on trigger_run. Lifecycle states: draft → active → (paused | archived). Each run reserves budget independently.

Actions:

  • list / get (read).

  • create (write) — name, type (one_shot | continuous), workflow_id.

  • update (write) — project_id + any creatable field.

  • activate / pause / resume / restart (write) — project_id. Lifecycle transitions.

  • trigger_run (write — costs credits) — project_id. Dispatches a single run immediately.

  • archive (write) — project_id. Stops scheduling and hides from default lists; reversible via restart.

  • schedule (write) — project_id, frequency or cron expression.

  • schedule_nlp (write) — project_id, natural language schedule (e.g. "every weekday at 9am"). Calls LLM, costs credits.

  • run_list (read) — project_id; optional limit, status filter.

  • run_get (read) — project_id, run_id.

Inputs: action (required), project_id (required), title (required), operation (required), +13 more.

signal_connectorsCloud Signal Connectors ToolA

Inbound signal SOURCES (ticketing, alerts, Slack, HTTP monitors, ClearCue, Telegram bots) plus the team's knowledge graph (KG) read/write surface. Distinct from signal_manage: this tool wires up connector configurations; signal_manage operates on already-ingested signals.

When to use: bind a new external system to FleetQ so its events become signals (which trigger rules → projects → agents), or query/extend the team's knowledge graph that agents reason over. Do NOT use to send outbound messages — use outbound_manage for that.

Connector actions (each accepts a config object specific to that channel; idempotent — re-call to update):

  • ticket (write — upsert) — config (Jira/Linear/Zendesk fields). Polls every 5 min.

  • alert (write — upsert) — config (PagerDuty/Opsgenie webhook). Pushes signals on incident events.

  • slack (write — upsert) — config (workspace_id, channel_ids[], event filters).

  • http_monitor (write — upsert) — config: url, interval_seconds (min 60), expected_status. Emits a signal when status flips.

  • clearcue (write — upsert) — config (ClearCue API key, query).

  • inbound_connector (write) — sub-actions: create, update, delete on generic connectors.

  • subscription (write) — sub-actions: list, create, delete on per-connector subscriptions.

  • telegram (write — upsert) — config: bot_token, allowed_chat_ids[]. Webhook auto-registered.

Knowledge graph actions:

  • kg_search (read — hybrid semantic+symbolic) — query (string), optional types (array). Returns ranked entities with relevance score.

  • kg_facts (read) — entity_id (UUID). All facts attached, paginated.

  • kg_add_fact (write) — entity_id, fact: { predicate (string), object (string), source (string), confidence (0..1) }.

  • intent_score (read — costs ~1-2 LLM credits) — company (string), query (string). Returns intent classification + confidence.

Cloud note: supabase connector not exposed in cloud (TeamProviderCredential handles per-team Supabase access through integration_manage). Side effects: writes update KG and trigger downstream rule evaluation (may dispatch agent runs and consume budget). Errors: 401, 403, 404, 422 (config validation), 429, 503 (upstream connector down).

Inputs: action (required), query (required), entity_name (required), source_entity (required), +24 more.

signal_manageSignal Manage ToolA
Destructive

Inbound signals — events from connectors (webhooks, RSS, email, Slack, ticketing) the platform processes through trigger rules into agent actions. Operates on already-ingested signals; for connector setup use signal_connectors.

Actions:

  • list (read) — optional: status, source, channel, limit.

  • get (read) — signal_id. Full payload + processing trail.

  • ingest (write) — source, payload (object). Manually emits a signal as if from a connector; runs trigger evaluation.

  • assign (write) — signal_id, assignee_user_id, reason.

  • connector_binding (write) — connector_id, channel_id. Links a connector to a logical channel.

  • connector_binding_delete (DESTRUCTIVE) — binding_id. Severs the link; future signals from that connector go unrouted.

  • contact (write) — sub-actions on Contact (action, contact data).

  • imap (write) — mailbox config object. Sets/updates IMAP poller settings.

  • email_reply (write — sends email) — signal_id, body. Replies to the originating email signal via the team's outbound email connector.

Inputs: action (required), signal_id (required), source (required), payload (required), +20 more.

skill_manageCloud Skill Manage ToolA

AI skills — reusable units agents invoke (LLM prompt templates, connector calls, rules, hybrid pipelines, guardrails). Skill executions are versioned (SkillVersion) and metered against the team budget. Direct execution actions (guardrail, multi_model, code_exec, browser) bypass the agent layer for ad-hoc invocation by humans/assistants.

When to use: build reusable prompt or workflow primitives that multiple agents share, or run a one-off skill (e.g. code_exec to evaluate Python in a sandbox). Do NOT use for raw LLM calls — use assistant_manage instead.

CRUD actions:

  • list (read) — optional: type (llm|connector|rule|hybrid|guardrail), status, limit (default 50).

  • get (read) — skill_id. Returns full config + latest version.

  • create (write) — name, type, config (type-specific JSON). Returns skill_id.

  • update (write) — skill_id + any creatable field. Bumps version; old version retained.

  • delete (DESTRUCTIVE) — skill_id. Soft-deletes; existing version history retained for 30 days.

  • versions (read) — skill_id. Version log with diffs and created_by AiRun id.

Direct execution (each costs credits; rate-limited per skill):

  • guardrail (read — costs ~1-3 LLM credits) — input (string), rules (array). Returns { passed: bool, violations: [...] }.

  • multi_model (write — costs ~N × LLM credits where N=models[].length) — prompt, models[]. Runs same prompt across providers and returns consensus.

  • code_exec (DESTRUCTIVE — runs in sandboxed Docker, costs sandbox-minute credits) — code, language (python|node|bash). Network-disabled by default; max 60s wall-clock; max 256 MB memory.

  • browser (write — costs browser-minute credits) — url, actions (array of {type, selector, value}). Headless Chromium with SSRF guards.

Cloud note: supabase_edge_function not exposed in cloud (use integration_execute with a Supabase integration instead). Errors: 401, 403, 404, 422, 429, 503 (sandbox/browser worker pool exhausted).

Inputs: action (required), skill_id (required), name (required), deadline_ms, +12 more.

system_manageCloud System Manage ToolA

Platform system administration, monitoring, and infrastructure control — KPIs, health checks, audit log, semantic cache, GPU compute providers, browser-relay bridge. Mixed permission tiers: read actions (dashboard_kpis, health, version_check, audit_log, cache_stats) need any authenticated user; write actions marked PLATFORM ADMIN require the user's is_super_admin=true flag (HTTP 403 otherwise). Every write is audit-logged.

When to use: agent monitoring platform health, on-call investigating an incident via audit log, super-admin adjusting platform-wide settings or purging the semantic cache after a model swap. Do NOT use for tenant-level operations — those have dedicated tools (e.g. team_manage).

Read actions:

  • dashboard_kpis — { active_users, runs_today, spend_today_credits, ... }.

  • health — { status: ok|degraded|down, db, cache, queue, providers[] }.

  • version_check — { current, latest, update_available }.

  • audit_log — optional: actor_id, action, entity_type, since, limit (max 100). Cursor-paginated.

  • cache_stats — semantic cache hit/miss/savings since last purge.

Write actions:

  • global_settings (write — PLATFORM ADMIN) — settings object. Replaces platform-wide settings.

  • blacklist (write — PLATFORM ADMIN) — sub-actions: list, add, remove. Affects email/domain blocklists for sign-ups.

  • security_policy (write — PLATFORM ADMIN) — sub-actions: list, save, delete on security policies.

  • cache_purge (DESTRUCTIVE — PLATFORM ADMIN) — purges semantic cache CROSS-TEAM. All teams lose cached LLM responses; first calls after purge will be slower and more expensive.

  • compute (write — PLATFORM ADMIN) — sub-actions on compute provider records (Replicate, Fal.ai, Vast.ai, RunPod).

  • runpod (write — PLATFORM ADMIN, costs real $) — sub-actions on RunPod GPU pods. Spinning up a pod bills the platform Stripe account immediately at the pod's per-minute rate.

  • browser_relay (write — relays through local bridge) — sub-actions for browser automation through the team's connected FleetQ Bridge runner. Requires an active bridge.

Errors: 401, 403 (insufficient role for PLATFORM ADMIN action), 404, 422, 429, 503 (provider down).

Inputs: action (required), settings (required), operation (required), deadline_ms, +21 more.

team_manageCloud Team Manage ToolA

Caller's team — settings, membership, BYOK provider credentials, API tokens, notifications, and KMS-managed encryption keys. Most write actions require team role owner or admin (HTTP 403 otherwise); viewer and member are limited to read + their own profile-level toggles (notifications). Every write is audit-logged.

When to use: agent or assistant managing the current team's configuration — invite a member, mint an API token, register a BYOK Anthropic key, etc. Do NOT use for cross-team operations — those require admin_manage (super-admin only).

Core team actions:

  • get (read) — returns team object (name, slug, plan, settings, owner_id, member_count).

  • update (write — admin/owner) — optional: name, settings (object). Plan changes happen via Stripe webhook only.

  • members (write — admin/owner) — sub-actions: list, invite (email, role), remove (user_id). Invitations expire after 7 days.

LLM provider config (admin/owner):

  • local_llm (read) — bridge-discovered local LLM agents (Ollama, LM Studio, Codex, Claude Code).

  • byok_credential (write) — sub-actions on BYOK keys (Anthropic, OpenAI, Google, Mistral, Perplexity). Keys encrypted at rest; never echoed back.

  • custom_endpoint (write — plan-enforced; pro/enterprise only) — sub-actions on custom OpenAI-compatible LLM endpoints (vLLM, LiteLLM, custom proxies).

Tokens & access (admin/owner):

  • api_token (write) — sub-actions: create (returns token once), list, revoke. Tokens are team-scoped and inherit the user's role; rotate on suspected leak.

Notifications & system:

  • notification (write — any role) — sub-actions: list, dismiss, dismiss_all on the user's notification inbox.

  • join_request (write — admin/owner) — sub-actions: list, approve, reject pending team join requests.

  • kms (DESTRUCTIVE — owner only) — sub-actions on KMS encryption keys: list, rotate (re-encrypts all team credentials with new key — cannot be undone), revoke.

Errors: 401, 403 (insufficient role), 404, 409 (cannot remove self if last owner), 422, 429.

Inputs: action (required), deadline_ms, name, settings, +16 more.

tool_manageCloud Tool Manage ToolA

LLM tool management — registers MCP servers (stdio, HTTP, bridge) and built-in tools (bash, filesystem, browser, SSH) that agents can call at inference time. Tool execution may have any side effect declared by the underlying tool; the platform constrains bash/filesystem/SSH only via the agent's bash_policy. Tool credentials are encrypted at rest with the team's per-tenant key.

When to use: connect a new external MCP server (e.g. GitHub, Slack, Notion) so agents can call its tools, toggle a tool's availability without deleting it, or test a remote MCP server's reachability before wiring it to an agent. Do NOT use to invoke tools — agents call them automatically based on attached configuration.

CRUD actions:

  • list (read) — optional: type (mcp_stdio|mcp_http|mcp_bridge|built_in), status, limit (default 50).

  • get (read) — tool_id (UUID). Metadata only; credentials redacted in response.

  • create (write) — name, type, config (type-specific JSON: command for stdio, url+headers for http, kind for built_in).

  • update (write) — tool_id + any creatable field. Re-encrypts credentials if provided.

  • delete (DESTRUCTIVE) — tool_id. Soft-deletes; agents lose access on next ResolveAgentTools call (cached up to 5 minutes).

  • activate / deactivate (write) — tool_id. Flips active flag without deletion; affects all agents that reference the tool.

Discovery (cloud restricts these to safe operations):

  • probe_remote (read — calls the remote URL, no registration) — url. Sends an MCP initialize request; returns server name, version, declared capabilities.

Cloud note: discover_mcp and import_mcp (which auto-register all tools from a remote server) are NOT available in cloud — they require explicit per-tool review under cloud's security policy. Use probe_remote then create per tool instead.

Errors: 401, 403, 404, 422 (config validation), 429, 503 (remote MCP server unreachable for probe_remote).

Inputs: action (required), tool_id (required), name (required), deadline_ms, +11 more.

trigger_manageTrigger Manage ToolA
Destructive

Event-driven trigger rules — when-this-then-that automations that fire on signals or domain events. Rules evaluate conditions (expression-based) against the event payload and execute actions (start_experiment, send_outbound, etc.). test is a dry-run that returns whether the rule would have matched without executing actions.

Actions:

  • list (read) — optional: event filter, status filter.

  • get (read) — trigger_id.

  • create (write) — name, event (e.g. "signal.ingested"), conditions (array of expressions), actions (array of action specs).

  • update (write) — trigger_id + any creatable field.

  • delete (DESTRUCTIVE) — trigger_id. Future events stop matching this rule.

  • test (read — costs no credits) — trigger_id, sample payload. Returns matched (bool), action_preview (what would have run).

Inputs: action (required), name (required), rule_id (required), deadline_ms, +10 more.

webhook_manageCloud Webhook Manage ToolA

Outbound webhook endpoints — URLs the platform POSTs to when subscribed events fire (experiment.completed, signal.ingested, approval.decided, etc.). Each delivery is HMAC-signed with the configured secret (header: X-FleetQ-Signature). Failed deliveries retry with exponential backoff up to 24h.

Actions:

  • list (read) — all webhooks for the team.

  • get (read) — webhook_id. Includes recent delivery stats.

  • create (write) — url, events[] (array of event names), secret (used for HMAC signing; show once).

  • update (write) — webhook_id + any creatable field. Updating secret invalidates the old one immediately.

  • delete (DESTRUCTIVE) — webhook_id. In-flight deliveries are cancelled.

Inputs: action (required), name (required), url (required), events (required), +5 more.

workflow_graphWorkflow Graph ToolA
Destructive

Surgical edits to a workflow's DAG (nodes + edges). For metadata changes (name, description, status, validation, AI generation) use workflow_manage. Every edit re-validates the graph; an edit that would create a cycle, an unreachable node, or an invalid edge type is rejected before commit.

Actions:

  • save_graph (write — full replace) — workflow_id, nodes[], edges[]. Atomically replaces the entire graph; existing in-flight runs continue on the old graph.

  • node_add (write) — workflow_id, type (start|end|agent|conditional|human_task|switch|dynamic_fork|do_while), config (type-specific).

  • node_update (write) — workflow_id, node_id, config (partial).

  • node_delete (DESTRUCTIVE) — workflow_id, node_id. Cascade-deletes incident edges; rejected if it would orphan nodes.

  • edge_add (write) — workflow_id, source_id, target_id; optional condition / case_value for switch nodes.

  • edge_delete (DESTRUCTIVE) — workflow_id, edge_id. Rejected if it would disconnect the graph.

Inputs: action (required), workflow_id (required), nodes (required), node_id (required), +19 more.

workflow_manageWorkflow Manage ToolA
Destructive

Workflow templates — reusable DAGs that experiments and project runs execute. This tool covers metadata and lifecycle; for graph editing use workflow_graph. Lifecycle states: draft → active → archived. Activation is gated on validate passing.

Core actions:

  • list / get (read) — optional: status filter.

  • create (write) — name, description.

  • update (write) — workflow_id + any creatable field.

  • delete (DESTRUCTIVE) — workflow_id. Soft-deletes; running experiments continue on cached graph.

  • validate (read) — workflow_id. Returns errors[] (cycles, orphans, invalid types) and warnings[].

  • activate (write) — workflow_id. Requires validation to pass.

  • duplicate (write) — workflow_id. Creates a draft copy with the same graph.

AI / cost:

  • generate (write — costs LLM credits) — prompt. Decomposes natural language into a workflow graph and saves as draft.

  • estimate_cost (read) — workflow_id. Projected per-run credit cost.

  • suggestion (read — costs LLM credits) — context (object). Recommends improvements.

Advanced:

  • time_gate (write) — workflow_id, config (delay/window). Adds time-based gating around step execution.

  • execution_chain (write) — workflow_id, chain config. Configures sequential workflow chaining.

Inputs: action (required), workflow_id (required), name (required), prompt (required), +10 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 34 tools

    Disambiguation5/5

    Each tool targets a distinct domain or entity (e.g., agents, approvals, credentials, experiments, signals). Even related tools like signal_connectors and signal_manage have clearly separated responsibilities (setup vs. operation). Descriptions and action lists further clarify boundaries, leaving no ambiguity.

    Naming Consistency4/5

    Most tools follow a consistent <noun>_manage pattern (e.g., agent_manage, credential_manage). Minor deviations exist: integration_execute, signal_connectors, and workflow_graph break the pattern but remain descriptive and predictable.

    Tool Count2/5

    With 34 tools, the server feels overloaded. While the platform is broad, many tools (e.g., boruna_manage, evolution_manage) are niche. The count exceeds the 'well-scoped' range and may overwhelm agents, though each tool serves a distinct purpose.

    Completeness4/5

    The tool surface covers the platform's major domains comprehensively: CRUD for core entities, lifecycle management, actions for special operations, and many auxiliary features. Minor gaps exist (e.g., no dedicated reporting tool), but overall the surface is robust.

    Maintenance

    ActivityActive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers