Conversation
Implement full UTCP (Universal Tool Calling Protocol) support as a new check provider type. Provider Implementation: - New utcp-check-provider.ts with full UTCP client lifecycle, three-way manual resolution (URL/file/inline), smart tool name resolution, Liquid template rendering in arguments, and automatic issue extraction - Configuration support: 'utcp' added to ConfigCheckType and validCheckTypes - Registered in CheckProviderRegistry with optional dependencies @utcp/sdk and @utcp/http Documentation: - Created docs/utcp-provider.md with complete reference guide - Updated README.md, docs/configuration.md, glossary.md, pluggable.md, architecture.md, migration.md, and CLAUDE.md to reference UTCP (17 providers total now) Testing: - 31 unit tests for UtcpCheckProvider covering validation, execution, transforms, and issue extraction - Updated check-provider-registry.test.ts (17 providers) - All 3731 tests passing Real Integration: - Verified with actual UTCP SDK calls to httpbin.org (3 successful checks: get_ip, get_uuid, echo_post) - Liquid template rendering and file-based manual discovery with suffix matching confirmed Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Add examples/utcp-provider-example.yaml with 10 examples covering: - URL-based manual discovery (OpenAPI/UTCP endpoints) - Inline call templates - File-based UTCP manuals - Liquid templates in arguments - Variable-based authentication - JavaScript transforms for issue extraction - Chaining UTCP with AI analysis - Dynamic args via argsTransform - Conditional execution with if expressions - Multi-step pipeline with dependencies Also link the example from README.md and docs/utcp-provider.md. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PR Overview: UTCP Provider for Direct Tool CallingSummaryThis PR adds full support for the UTCP (Universal Tool Calling Protocol) as a new check provider type in Visor. UTCP is a client-side protocol that enables direct tool calling via native protocols (HTTP, CLI, SSE) without intermediate servers. Tools publish JSON "manuals" describing how to call them, and the UTCP client makes direct calls. Files Changed Analysis29 files changed with +2,683 / -169 lines: New Files (6)
Modified Files (23)
Architecture & Impact AssessmentWhat This PR Accomplishes
Key Technical Changes1. UtcpCheckProvider Class (
2. AI Provider Integration (
3. MCP SSE Server Routing (
4. Shared Issue Normalizer (
5. Provider Registry (
Affected System Componentsgraph TD
A[Visor Config] --> B[type: utcp check]
A --> C[type: ai check with ai_mcp_servers]
B --> D[UtcpCheckProvider.execute]
D --> E[resolveManualCallTemplate]
E --> F{Manual Type?}
F -->|URL| G[HTTP Call Template]
F -->|File| H[File Call Template]
F -->|Inline| I[Inline Template]
D --> J[UtcpClient.create]
J --> K[client.callTool]
K --> L[Transform Output]
L --> M[Extract Issues]
C --> N[AI Provider]
N --> O[Parse ai_mcp_servers]
O --> P{type: utcp?}
P -->|Yes| Q[Discover UTCP Tools]
Q --> R[Create CustomToolDefinition]
R --> S[CustomToolsSSEServer]
S --> T[AI Agent via MCP]
T --> U[executeUtcpTool]
U --> V[UtcpCheckProvider.callTool]
V --> W[Direct Tool Execution]
style D fill:#e1f5ff
style V fill:#e1f5ff
style Q fill:#fff4e1
style U fill:#fff4e1
Component Relationships
Scope Discovery & Context ExpansionImmediate Impact
Related Modules
Potential Future Work
Testing Coverage31 unit tests for
Integration tests for UTCP-MCP bridge:
Registry test: Updated to expect 17 providers (was 16) ReferencesCore Implementation:
AI Integration:
Registry & Config:
Documentation:
Tests:
Metadata
Powered by Visor from Probelabs Last updated: 2026-03-13T18:41:03.892Z | Triggered by: pr_updated | Commit: 03d2af2 💡 TIP: You can chat with Visor using |
Architecture Issues (9)
Architecture Issues (9)
Quality Issues (16)
Powered by Visor from Probelabs Last updated: 2026-03-13T18:40:08.960Z | Triggered by: pr_updated | Commit: 03d2af2 💡 TIP: You can chat with Visor using |
UTCP tools can now be exposed as MCP tools to AI agents via ai_mcp_servers with type: utcp entries. Tools are discovered from the UTCP manual at setup time and routed through the UTCP SDK at call time via the CustomToolsSSEServer. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract shared extractIssuesFromOutput/normalizeIssue to src/utils/issue-normalizer.ts, used by MCP and UTCP providers - Add UtcpCheckProvider.callTool() static method for shared UTCP client lifecycle (import, create, call, close) - Make executeUtcpTool in SSE server delegate to callTool() - Add file existence check and JSON parse error handling in resolveManualCallTemplate Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…e wrapping The --fail-fast description wraps across lines at 80 columns, causing toContain to fail. Normalize whitespace before asserting. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Clear timeout timer in Promise.race .finally() to prevent resource leaks when the tool call succeeds before the timeout fires - Throw from transform error handlers instead of returning early, so the outer finally block properly closes the UTCP client Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Reject null bytes in file paths - Validate resolved path stays within cwd using normalized prefix check - Resolve symlinks and re-validate to prevent symlink-based traversal - URL and inline manuals are unaffected (handled by SDK, not read locally) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The instance execute() method now delegates to the static callTool() for SDK import, plugin loading, client creation, tool calling with timeout, and cleanup. This eliminates the duplicated lifecycle logic and makes callTool the single entry point for both the standalone provider and the MCP-bridge SSE server. Also moved tool name suffix matching into callTool so it works for both code paths, and removed dead instance wrapper methods. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Summary
Implement full UTCP (Universal Tool Calling Protocol) support as a new check provider type. UTCP is a client-side protocol that lets Visor call external tools directly via their native protocols (HTTP, CLI, SSE) without intermediate servers.
Changes
Provider Implementation:
utcp-check-provider.ts(~700 lines) with full client lifecycle managementConfiguration & Registry:
'utcp'toConfigCheckTypeunion andvalidCheckTypesarrayUtcpCheckProviderin provider registry@utcp/sdkand@utcp/httpas optional dependenciesDocumentation:
docs/utcp-provider.md(299 lines) with reference guide, examples, and UTCP vs MCP comparisonCLAUDE.mdwith UTCP provider referencesTesting:
UtcpCheckProvider(config, execution, transforms, issue extraction)Verification:
get_ip,get_uuid,echo_postTest Plan
npm run build(no dist/ commits)npm run lintnpm test(3731 passing)🤖 Generated with Claude Code