May 31, 2026

Probe-detected vision and outbound MCP client

Vision capability is now a provider-level flag verified by a synchronous content probe

Vision capability is now a provider-level flag verified by a synchronous content probe. When saving a provider, a static image with three shapes and text is sent with an exact JSON prompt; a weighted score ≥0.80 sets supports_vision. A new vision_provider_id setting resolves explicitly, then auto‑detects, or disables vision. The multimodal send‑path adds an image branch in all four LLM converters, routed through a thin vision_service; image‑free messages convert byte‑for‑byte identically. The Brain UI shows a vision badge on providers and a new Vision settings page. The document pipeline now uses vision instead of OCR in image_context_service.analyze() when a vision provider is configured, falling back to OCR with a no‑vision note. Image upload is hidden in chat when no vision provider is available. Legacy image‑attachment code is removed.

Chalie gained an outbound MCP client. A new mcp_client_servers table backs McpClientService with CRUD, ping/sync, tool dispatch, and a 15‑minute heartbeat. The mcp_manager ability (SYSTEM+DISCOVERABLE) searches across both abilities.sqlite and data/mcp_tools.sqlite. Tools are dispatched as mcp_ with dynamically‑seeded ask/deny policy rows. A /api/mcp-clients REST blueprint exposes management, and the Brain MCP tab reuses one panel split into Inbound and Outbound sections.

A critic/arbiter rework tightened the MCP integration. McpClientService.get_tool_schema() retrieves the remote tool’s inputSchema from mcp_tools.sqlite, and message_processor.find_tools now injects it into the prompt for mcp* names — so the model sees real parameters instead of brute‑forcing arguments. The duplicate ~70‑line _enforce_mcp_policy was deleted; mcp* dispatch now routes through the unified _enforce_policy with a relaxed guard, and the dispatch‑time policy call is wrapped in try/except. To prevent MCP tools from evicting ability matches, the BM25 score for _query_mcp is capped at min(0.12, abs(bm25)). New tests cover schema round‑trips and _DATA_DIR‑monkeypatch isolation, and phase‑4 invariants now exercise mcp_manager.

  • Vision capability is a probe‑verified provider flag (3‑shapes+text PNG, ≥0.80 score) instead of a tool.

  • Outbound MCP client with CRUD, ping/sync, dispatch, and 15‑min heartbeat; dual‑DB tool search.

  • Tool schemas from mcp_tools.sqlite are injected into LLM prompts for mcp* tools, giving the model real parameters.

  • Redundant ~70‑line MCP policy enforcement removed; now routed through unified policy with try/except.

  • BM25 score for MCP tools capped at min(0.12, abs(bm25)) to prevent them from pushing abilities out of top results.

  • Image upload hidden in UI when no vision provider is configured; OCR used as fallback.