Voice: personal MCP tools + standalone assistant mode - #449
Open
jamesrochabrun wants to merge 1 commit into
Open
Voice: personal MCP tools + standalone assistant mode#449jamesrochabrun wants to merge 1 commit into
jamesrochabrun wants to merge 1 commit into
Conversation
…stant mode
- VoiceMCPToolProvider bridges the user's personal MCP servers (~/.claude.json
+ ~/.codex/config.toml, merged by name, Claude wins) into voice conversations
as namespaced {server}__{tool} function tools, proxied through a dedicated
MCPAppDiscoveryService instance with a longer request timeout. Handlers have
their own deadline and truncate output so a slow server can't freeze the
mic-muted conversation.
- Per-server opt-in checklist in Voice settings (default off); only enabled
servers are ever spawned. Tool cache warms when the HUD is shown.
- Assistant mode via the HUD target chip ("Assistant · no session"): no
session snapshot and a registry that hard-excludes send_prompt,
launch_session, create_worktree_tasks, approve_pending_tool, and screen
capture — read-only session tools + MCP tools only. The instructions builder
keys the persona on send_prompt presence and announces the MCP server roster
so the assistant can say what it can do.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two features that turn AgentHub Voice into more than a session controller:
MCP tools from the user's personal configs (one source of truth)
VoiceMCPToolProviderreads MCP servers from both Claude (~/.claude.json, global + per-project) and Codex (~/.codex/config.toml), merged by name (Claude wins), and exposes each enabled server's tools to voice conversations as namespaced{server}__{tool}function tools.MCPAppDiscoveryServiceinstance (AgentHubProvider.voiceMCPDiscoveryService, 45s request timeout) so the MCP Apps panel keeps its fast 6s instance. Both shut down on app quit.envblocks — they are never logged and never leave the machine; only tool schemas and results enter the conversation.Assistant mode ("Assistant · no session")
send_prompt,launch_session,create_worktree_tasks,approve_pending_tool) and screen capture — so "check my email" can only be answered directly, never forwarded into a session.RealtimeSessionConfigurationBuilderkeys the persona onsend_promptpresence: assistant registries get an answer-directly persona; an MCP server roster line is injected so the assistant can name its capabilities when asked.voice.assistantMode).Testing
AgentHubVoicepackage: 66 tests / 16 suites pass (swift test), incl. new assistant-persona, read-only-discipline, and MCP-roster instruction tests.AgentHubCoretargeted suites pass viaAgentHubCore-Testsscheme:VoiceMCPToolProviderTests(8 new tests: dedup/namespacing, handler proxying, timeout, truncation, opt-in gating),VoiceToolCatalogTests(assistant-mode exclusion + MCP append),VoiceControlCoordinatorTests,MCPAppDiscoveryServiceTests../scripts/test.sh packages(CI gate): all pass.🤖 Generated with Claude Code