Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ Visor is an AI-powered code review tool for GitHub Pull Requests that can run as
- `src/providers/` - Pluggable check provider architecture
- `ai-check-provider.ts` - AI-powered analysis (Gemini, Claude, OpenAI)
- `mcp-check-provider.ts` - Direct MCP tool execution via stdio/SSE/HTTP
- `utcp-check-provider.ts` - UTCP tool execution via native protocols (HTTP/CLI/SSE)
- `claude-code-check-provider.ts` - Claude Code SDK integration with MCP tools
- `tool-check-provider.ts` - Integration with external tools
- `command-check-provider.ts` - Execute shell commands
Expand All @@ -78,7 +79,8 @@ Visor is an AI-powered code review tool for GitHub Pull Requests that can run as
2. **Pluggable Providers**: Extensible system for different analysis types
3. **AI Integration**: Multi-provider AI support including Claude Code SDK
4. **MCP Provider**: Direct MCP tool execution with stdio, SSE, and HTTP transports
5. **Claude Code Provider**: Advanced AI with MCP tools, subagents, and streaming
5. **UTCP Provider**: Direct UTCP tool execution via native protocols (HTTP, CLI, SSE); also bridges to MCP for AI agent tool access via `ai_mcp_servers`
6. **Claude Code Provider**: Advanced AI with MCP tools, subagents, and streaming
6. **Incremental Analysis**: Smart PR updates that analyze only new commits
7. **Comment Management**: Unique comment IDs prevent duplicate reviews
8. **Multiple Output Formats**: table, json, markdown, sarif
Expand Down
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ Visor is an open-source workflow engine that lets you define multi-step AI pipel

- **YAML-driven pipelines** — define checks, transforms, routing, and AI prompts in a single config file.
- **8 runtime modes** — CLI, GitHub Action, Slack bot, Telegram bot, Email, WhatsApp, Teams, HTTP server — same config, any surface.
- **12+ provider types** — `ai`, `command`, `script`, `mcp`, `http`, `claude-code`, `github`, `memory`, `workflow`, and more.
- **AI orchestration** — multi-provider (Gemini, Claude, OpenAI, Bedrock), session reuse, MCP tool calling, retry & fallback.
- **17 provider types** — `ai`, `command`, `script`, `mcp`, `utcp`, `http`, `claude-code`, `a2a`, `github`, `memory`, `workflow`, and more.
- **AI orchestration** — multi-provider (Gemini, Claude, OpenAI, Bedrock), session reuse, MCP/UTCP tool calling, retry & fallback.
- **Execution engine** — dependency DAGs, parallel waves, forEach fan-out, conditional routing, failure auto-remediation.
- **Built-in testing** — YAML-native integration tests with fixtures, mocks, and assertions.

Expand All @@ -34,6 +34,7 @@ Visor is an open-source workflow engine that lets you define multi-step AI pipel
| **Chat assistant / Bot** | [Bot Integrations](docs/bot-integrations.md) | [teams-assistant.yaml](examples/teams-assistant.yaml) |
| **Run shell commands + AI** | [Command Provider](docs/command-provider.md) | [ai-with-bash.yaml](examples/ai-with-bash.yaml) |
| **Connect MCP tools** | [MCP Provider](docs/mcp-provider.md) | [mcp-provider-example.yaml](examples/mcp-provider-example.yaml) |
| **Call tools via UTCP** | [UTCP Provider](docs/utcp-provider.md) | [utcp-provider-example.yaml](examples/utcp-provider-example.yaml) |
| **Add API integrations (TDD)** | [Guide: TDD Assistant Workflows](docs/guides/tdd-assistant-workflows.md) | [workable.tests.yaml](https://github.com/TykTechnologies/REFINE/blob/main/Oel/tests/workable.tests.yaml) |

> **First time?** Run `npx visor init` to scaffold a working config, then `npx visor` to run it.
Expand Down Expand Up @@ -241,7 +242,7 @@ Learn more: [docs/commands.md](docs/commands.md)
| Concept | What it is |
|---------|-----------|
| **Step** (or Check) | Unit of work — a shell command, AI call, HTTP request, script, etc. |
| **Provider** | How a step runs: `ai`, `command`, `script`, `mcp`, `http`, `claude-code`, `github`, `memory`, `workflow`, … |
| **Provider** | How a step runs: `ai`, `command`, `script`, `mcp`, `utcp`, `http`, `claude-code`, `github`, `memory`, `workflow`, … |
| **depends_on** | Execution order — independents run in parallel, dependents wait. |
| **forEach** | Fan-out — transform output into an array, run dependents per item. |
| **Routing** | `on_fail`, `on_success`, `goto`, `retry` — conditional flow with loop safety. |
Expand All @@ -260,6 +261,7 @@ Learn more: [docs/commands.md](docs/commands.md)
| `command` | Shell commands with Liquid templating | Run tests, build, lint |
| `script` | JavaScript in a secure sandbox | Transform data, custom logic |
| `mcp` | MCP tool execution (stdio/SSE/HTTP) | External tool integration |
| `utcp` | UTCP tool execution (HTTP/CLI/SSE) | Direct tool calling via manuals |
| `claude-code` | Claude Code SDK with MCP tools | Deep code analysis, refactoring |
| `http` | HTTP output/webhook sender | Notify Slack, trigger CI |
| `http_input` | Webhook receiver | Accept external events |
Expand Down Expand Up @@ -778,7 +780,7 @@ Learn more: [docs/enterprise-policy.md](docs/enterprise-policy.md)
[Tools & Toolkits](docs/tools-and-toolkits.md) · [Assistant workflows](docs/assistant-workflows.md) · [TDD for assistant workflows](docs/guides/tdd-assistant-workflows.md) · [Workflow creation](docs/workflow-creation-guide.md) · [Workflow style guide](docs/guides/workflow-style-guide.md) · [Dependencies](docs/dependencies.md) · [forEach propagation](docs/foreach-dependency-propagation.md) · [Failure routing](docs/failure-routing.md) · [Router patterns](docs/router-patterns.md) · [Lifecycle hooks](docs/lifecycle-hooks.md) · [Liquid templates](docs/liquid-templates.md) · [Schema-template system](docs/schema-templates.md) · [Fail conditions](docs/fail-if.md) · [Failure conditions schema](docs/failure-conditions-schema.md) · [Failure conditions impl](docs/failure-conditions-implementation.md) · [Timeouts](docs/timeouts.md) · [Execution limits](docs/limits.md) · [Event triggers](docs/event-triggers.md) · [Output formats](docs/output-formats.md) · [Output formatting](docs/output-formatting.md) · [Default output schema](docs/default-output-schema.md) · [Output history](docs/output-history.md) · [Reusable workflows](docs/workflows.md) · [Criticality modes](docs/guides/criticality-modes.md) · [Fault management](docs/guides/fault-management-and-contracts.md)

**Providers:**
[A2A](docs/a2a-provider.md) · [Command](docs/command-provider.md) · [Script](docs/script.md) · [MCP](docs/mcp-provider.md) · [MCP tools for AI](docs/mcp.md) · [Claude Code](docs/claude-code.md) · [AI custom tools](docs/ai-custom-tools.md) · [AI custom tools usage](docs/ai-custom-tools-usage.md) · [Custom tools](docs/custom-tools.md) · [GitHub ops](docs/github-ops.md) · [Git checkout](docs/providers/git-checkout.md) · [HTTP integration](docs/http.md) · [Memory](docs/memory.md) · [Human input](docs/human-input-provider.md) · [Custom providers](docs/pluggable.md)
[A2A](docs/a2a-provider.md) · [Command](docs/command-provider.md) · [Script](docs/script.md) · [MCP](docs/mcp-provider.md) · [UTCP](docs/utcp-provider.md) · [MCP tools for AI](docs/mcp.md) · [Claude Code](docs/claude-code.md) · [AI custom tools](docs/ai-custom-tools.md) · [AI custom tools usage](docs/ai-custom-tools-usage.md) · [Custom tools](docs/custom-tools.md) · [GitHub ops](docs/github-ops.md) · [Git checkout](docs/providers/git-checkout.md) · [HTTP integration](docs/http.md) · [Memory](docs/memory.md) · [Human input](docs/human-input-provider.md) · [Custom providers](docs/pluggable.md)

**Operations:**
[Security](docs/security.md) · [Performance](docs/performance.md) · [Observability](docs/observability.md) · [Debugging](docs/debugging.md) · [Debug visualizer](docs/debug-visualizer.md) · [Telemetry setup](docs/telemetry-setup.md) · [Dashboards](docs/dashboards/README.md) · [Troubleshooting](docs/troubleshooting.md) · [Suppressions](docs/suppressions.md) · [GitHub checks](docs/GITHUB_CHECKS.md) · [Bot integrations](docs/bot-integrations.md) · [Slack](docs/slack-integration.md) · [Telegram](docs/telegram-integration.md) · [Email](docs/email-integration.md) · [WhatsApp](docs/whatsapp-integration.md) · [Teams](docs/teams-integration.md) · [Scheduler](docs/scheduler.md) · [Sandbox engines](docs/sandbox-engines.md)
Expand Down
1 change: 1 addition & 0 deletions docs/ai-configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -757,6 +757,7 @@ Each server config can be:
- **SSE/HTTP MCP server**: `{ url, transport }`
- **Workflow tool**: `{ workflow, inputs }`
- **Built-in tool**: `{ tool: 'schedule' }`
- **UTCP tools**: `{ type: 'utcp', manual: '...', variables: {...} }` — discovers and exposes all tools from a UTCP manual

Dynamic servers are merged with any static `ai_mcp_servers` configuration.

Expand Down
25 changes: 25 additions & 0 deletions docs/ai-custom-tools.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,31 @@ steps:
- You want to give a meaningful name to your tool server
- You prefer all MCP configuration in one place

### Method 3: Using UTCP tools in `ai_mcp_servers`

UTCP tools can be exposed as MCP tools to AI agents. All tools discovered from the UTCP manual are automatically available:

```yaml
steps:
security-review:
type: ai
prompt: |
Use the scanner tools to check for security issues.
ai_mcp_servers:
scanner:
type: utcp
manual: https://scanner.example.com/utcp
variables:
API_KEY: "${SCANNER_API_KEY}"
```

**Choose UTCP in `ai_mcp_servers` when:**
- You have UTCP-compatible tools (tools that publish JSON manuals)
- You want direct tool calling without MCP server processes
- You need to integrate HTTP/CLI tools with AI agents

See [UTCP Provider — AI Integration](./utcp-provider.md#using-utcp-tools-with-ai-checks) for details.

### Basic Example

### API Bundle Example (`type: api`)
Expand Down
3 changes: 3 additions & 0 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,7 @@ class CheckProviderRegistry {
| `http_input` | HTTP Input | Receives webhook data |
| `http_client` | HTTP Client | Makes HTTP requests |
| `mcp` | MCP | Connects to MCP tool servers |
| `utcp` | UTCP | Calls UTCP tools via native protocols |
| `claude-code` | Claude Code | Uses Claude Code SDK with MCP tools |
| `memory` | Memory | Persistent key-value storage |
| `log` | Logger | Debug logging output |
Expand Down Expand Up @@ -1249,6 +1250,7 @@ src/
http-input-provider.ts # HTTP webhook input provider
http-client-provider.ts # HTTP client provider
mcp-check-provider.ts # MCP tool provider
utcp-check-provider.ts # UTCP tool provider
mcp-tools.ts # MCP server management
memory-check-provider.ts # Key-value memory provider
log-check-provider.ts # Debug logging provider
Expand Down Expand Up @@ -1420,3 +1422,4 @@ Events that flow through the state machine:
| **Task Store** | SQLite-backed persistence layer for A2A tasks |
| **Task Queue** | Async execution queue for processing A2A tasks with concurrency control |
| **MCP** | Model Context Protocol - standard for AI tool integration |
| **UTCP** | Universal Tool Calling Protocol - client-side protocol for calling tools directly via native protocols |
3 changes: 2 additions & 1 deletion docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ Visor supports the following check types:
| `http_input` | Receive webhooks | [HTTP Integration](./http.md) |
| `http_client` | Fetch data from APIs | [HTTP Integration](./http.md) |
| `mcp` | MCP tool execution | [MCP Provider](./mcp-provider.md) |
| `utcp` | UTCP tool execution (HTTP/CLI/SSE) | [UTCP Provider](./utcp-provider.md) |
| `memory` | Key-value storage operations | [Memory](./memory.md) |
| `workflow` | Reusable workflow invocation | [Workflows](./workflows.md) |
| `git-checkout` | Git repository checkout | [Git Checkout](./providers/git-checkout.md) |
Expand Down Expand Up @@ -137,7 +138,7 @@ If there are errors, you'll get detailed messages with hints:
```
❌ Configuration validation failed!

Error: Invalid check type "webhook". Must be: ai, claude-code, mcp, command, script, http, http_input, http_client, memory, noop, log, github, human-input, workflow, git-checkout
Error: Invalid check type "webhook". Must be: ai, claude-code, mcp, utcp, command, script, http, http_input, http_client, memory, noop, log, github, human-input, workflow, git-checkout, a2a

💡 Hint: The 'webhook' type has been renamed to 'http' for output and 'http_input' for input.
```
Expand Down
10 changes: 9 additions & 1 deletion docs/glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Configuration for retry delays. Supports `fixed` (constant delay) or `exponentia
A single unit of work in a Visor workflow. Each check has a type (provider), configuration, and optional dependencies. The terms "check" and "step" are used interchangeably; `steps:` is the recommended configuration key.

### Check Provider
A pluggable component that executes a specific type of check. Visor includes 15 built-in providers: `ai`, `claude-code`, `mcp`, `command`, `script`, `http`, `http_input`, `http_client`, `memory`, `noop`, `log`, `github`, `human-input`, `workflow`, and `git-checkout`. See [Pluggable Architecture](./pluggable.md).
A pluggable component that executes a specific type of check. Visor includes 17 built-in providers: `ai`, `claude-code`, `mcp`, `utcp`, `a2a`, `command`, `script`, `http`, `http_input`, `http_client`, `memory`, `noop`, `log`, `github`, `human-input`, `workflow`, and `git-checkout`. See [Pluggable Architecture](./pluggable.md).

### Claude Code Provider
A provider (`type: claude-code`) that integrates the Claude Code SDK with MCP tools and advanced agent capabilities including subagents and streaming. See [Claude Code](./claude-code.md).
Expand Down Expand Up @@ -299,6 +299,14 @@ The `transform` (Liquid) or `transform_js` (JavaScript) fields that modify step
### Transitions
Declarative routing rules in `on_success`, `on_fail`, or `on_finish` blocks. Each rule has `when` (condition), `to` (target step), and optional `goto_event`. Evaluated in order; first match wins. See [Failure Routing](./failure-routing.md).

## U

### UTCP (Universal Tool Calling Protocol)
A client-side protocol for AI agents to discover and call tools directly via their native protocols (HTTP, CLI, SSE). Tools publish JSON "manuals" describing how to call them; the UTCP client reads the manual and makes direct calls without intermediate servers. Visor supports UTCP via the `utcp` provider. See [UTCP Provider](./utcp-provider.md).

### UTCP Provider
A provider (`type: utcp`) that calls UTCP tools directly using their native protocols. Supports manual discovery from URLs, local files, or inline call templates. UTCP tools can also be exposed as MCP tools to AI agents via `ai_mcp_servers` with `type: utcp` entries. See [UTCP Provider](./utcp-provider.md).

## V

### Validate Command
Expand Down
4 changes: 4 additions & 0 deletions docs/guides/build-ai-agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,9 @@ steps:
server-name:
command: "..."
args: [...]
utcp-tools: # or UTCP tools
type: utcp
manual: https://tools.example.com/utcp
```

## Complete examples
Expand All @@ -210,6 +213,7 @@ steps:
- [ai-with-bash.yaml](../../examples/ai-with-bash.yaml) — AI with bash access
- [claude-code-config.yaml](../../examples/claude-code-config.yaml) — Claude Code with MCP tools
- [mcp-provider-example.yaml](../../examples/mcp-provider-example.yaml) — Direct MCP tool calls
- [utcp-provider-example.yaml](../../examples/utcp-provider-example.yaml) — UTCP tools (standalone and with AI)

## Common mistakes

Expand Down
21 changes: 20 additions & 1 deletion docs/mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,14 +144,33 @@ ai_mcp_servers:
- [Jira Workflow Automation](../examples/jira-workflow-mcp.yaml) - Complete Jira integration examples
- [Simple Jira Analysis](../examples/jira-simple-example.yaml) - Basic JQL → analyze → label workflow

#### UTCP Tools in AI Checks

You can also expose UTCP tools to AI agents via `ai_mcp_servers`. UTCP tools are discovered from a manual and bridged to MCP automatically:

```yaml
steps:
review:
type: ai
prompt: "Use the scanner to check for security issues."
ai_mcp_servers:
scanner:
type: utcp
manual: https://scanner.example.com/utcp
variables:
API_KEY: "${SCANNER_API_KEY}"
```

All tools discovered from the UTCP manual are exposed as MCP tools to the AI agent. See [UTCP Provider — AI Integration](./utcp-provider.md#using-utcp-tools-with-ai-checks).

#### Built-in MCP Tools

Visor's MCP SSE server automatically exposes a `graceful_stop` tool alongside any custom workflow tools. This tool is called by Probe when a [negotiated timeout](./timeouts.md#negotiated-timeout) observer declines an extension. It signals all active sub-workflow executions to wind down gracefully by shortening the shared execution deadline and notifying running ProbeAgent sessions.

You do not need to configure `graceful_stop` — it is always available. See [Timeouts: Negotiated Timeout](./timeouts.md#negotiated-timeout) for details.

#### Related Documentation

- [MCP Provider](./mcp-provider.md) - Standalone MCP tool execution (direct tool calls without AI)
- [UTCP Provider](./utcp-provider.md) - Standalone UTCP tool execution and AI integration
- [Custom Tools](./custom-tools.md) - Define custom tools for use with MCP
- [Timeouts](./timeouts.md) - Timeout configuration including negotiated timeout and `graceful_stop`
2 changes: 2 additions & 0 deletions docs/migration.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@ The following providers have been added:
| `script` | `script` | Execute custom JavaScript logic |
| `log` | `log` | Debug logging (replaces `logger`) |
| `github` | `github` | Native GitHub API operations |
| `a2a` | `a2a` | Call external A2A-compatible agents |
| `utcp` | `utcp` | Call UTCP tools via native protocols (HTTP/CLI/SSE); also usable as `ai_mcp_servers` entry with `type: utcp` |

### Provider Type Renames

Expand Down
29 changes: 28 additions & 1 deletion docs/pluggable.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Visor supports multiple provider types. You can also add custom providers.

**Built-in Providers:** a2a, ai, mcp, command, script, http, http_input, http_client, log, memory, noop, github, human-input, workflow, git-checkout, claude-code
**Built-in Providers:** a2a, ai, mcp, utcp, command, script, http, http_input, http_client, log, memory, noop, github, human-input, workflow, git-checkout, claude-code

### Custom Provider Skeleton (TypeScript)

Expand Down Expand Up @@ -63,6 +63,33 @@ steps:

[Learn more](./mcp-provider.md)

#### UTCP Provider (`type: utcp`)
Call UTCP (Universal Tool Calling Protocol) tools directly via their native protocols. Unlike MCP which requires a running server, UTCP tools publish JSON "manuals" and the client calls them directly over HTTP, CLI, or SSE.

```yaml
steps:
api-check:
type: utcp
manual: https://api.example.com/utcp
method: analyze
methodArgs:
files: "{{ files | map: 'filename' | join: ',' }}"
```

UTCP tools can also be exposed to AI agents via `ai_mcp_servers`:

```yaml
steps:
ai-review:
type: ai
ai_mcp_servers:
scanner:
type: utcp
manual: https://scanner.example.com/utcp
```

[Learn more](./utcp-provider.md)

#### Command Provider (`type: command`)
Execute shell commands with templating and security controls.

Expand Down
Loading
Loading