Navigator¶
Navigator component — hierarchical MCP discovery and composition.
Cluster: Goal & Planning | Type: component | MCP Tools: 37
Overview¶
Hierarchical MCP discovery and composition engine with 36 operations spanning discovery, introspection, composition, delegation, routing, monitoring, orchestration, analytics, sessions, capability inspection, and MCP lifecycle management. Maintains a capability registry, routing engine with quality modes, circuit breaker fallback, and agency tracker that enforces progressive distillation as solutions stabilise — serving as the G6 system's central component directory.
When to use:
- Dynamically discovering which G6 components or MCP tools satisfy a stated capability requirement
- Composing multi-step pipelines from named components without hard-coding tool chains
- Routing a request to the best available component with automatic fallback when circuit breakers trip
- Inspecting maturity gates, effect signatures, circuit breakers, routing cache freshness, and MCP lifecycle state before composing or routing
Navigator scope
Navigator is a discovery, routing, and orchestration layer. It can execute through registered components, but a successful route only proves that the target component was found and invoked. Production use still depends on the target component's maturity, dependencies, input schema, tier access, and domain validation. Treat the first workflow as an MCP smoke test, not a regulated-domain assurance result.
Example:
from mvp.navigator import NavigatorMCPBlock, MCPNavigatorInput
block = NavigatorMCPBlock()
result = block.infer(MCPNavigatorInput(op="nav_search", query="semantic retrieval over documents"))
# result.ok → True; result.value → MCPNavigatorOutput with ranked component recommendations
Works well with: guide, autonomous_orchestrator, recursive_architect
Public API¶
EffectSignature¶
Effect grade ε = (io, cost, auth, fail).
| Field | Type | Default |
|---|---|---|
io | bool | False |
cost | float | 0.0 |
auth | frozenset[str] | field(default_factory=frozenset) |
fail | bool | False |
CircuitBreaker¶
Per-component circuit breaker.
| Field | Type | Default |
|---|---|---|
max_failures | int | 3 |
window_seconds | float | 120.0 |
Methods:
is_open() -> bool¶
True if breaker is open (too many recent failures).
record_failure() -> None¶
record_success() -> None¶
FallbackManager¶
Manages fallback chains and circuit breakers.
Methods:
get_fallback_chain(component: str) -> list[str]¶
Get fallback chain for a component (empty if unknown).
get_next_fallback(component: str, tried: set[str] | None = None) -> str | None¶
Get next available fallback, skipping open breakers and tried.
execute_with_fallback(primary: str, invoke_fn: Callable[[str, str, dict[str, Any]], Result], op: str, params: dict[str, Any]) -> Result¶
Try primary, cascade through fallbacks on failure.
record_outcome(component: str, success: bool) -> None¶
Record success/failure for circuit breaker tracking.
register_chain(component: str, chain: list[str]) -> None¶
Register a custom fallback chain.
get_breaker_status(component: str) -> dict[str, Any]¶
Get circuit breaker status for a component.
NavigatorMCPBlock(AIBlock[MCPNavigatorInput, MCPNavigatorOutput, dict])¶
| Field | Type | Default |
|---|---|---|
name | str | 'navigator_mcp' |
state | dict \| None | None |
db_path | str | ':memory:' |
workspace_root | str | '' |
resource_bounds | ResourceBounds \| None | None |
usage | ResourceUsage | field(default_factory=ResourceUsage) |
Methods:
infer(data: MCPNavigatorInput) -> Result[MCPNavigatorOutput]¶
CapabilityRegistry¶
Registry of all MCP tools discovered via AST scanning.
Constructor:
| Parameter | Type | Default |
|---|---|---|
workspace_root | str \| None | None |
Methods:
scan() -> None¶
Scan all components for MCP tool registrations.
reset() -> None¶
Clear scan state so next access re-discovers all tools.
tools() -> dict[str, dict[str, Any]]¶
search(query: str = '', cluster: str = '', component: str = '', capability: str = '', limit: int = 20) -> list[dict[str, Any]]¶
Search tools by query, cluster, component, or capability.
recommend(task: str, limit: int = 5) -> list[dict[str, Any]]¶
Recommend tools for a task by content-weighted keyword matching.
stats() -> dict[str, Any]¶
Overall registry statistics.
QualityMode(Enum)¶
ComponentScore¶
| Field | Type | Default |
|---|---|---|
component | str | required |
cluster | str | required |
total_score | float | required |
latency_score | float | required |
quality_score | float | required |
competence_score | float | required |
health_score | float | required |
RoutingRequest¶
| Field | Type | Default |
|---|---|---|
task | str | required |
quality_mode | QualityMode | QualityMode.BALANCED |
required_clusters | list[str] | field(default_factory=list) |
excluded_components | list[str] | field(default_factory=list) |
max_candidates | int | 5 |
RoutingEngine¶
Scores and ranks components for a given task.
| Field | Type | Default |
|---|---|---|
ttl_seconds | float | _DEFAULT_TTL |
Methods:
route(request: RoutingRequest) -> list[ComponentScore]¶
Score and rank components for a task.
update_health(component: str, score: float) -> None¶
Update health score for a component (0.0-1.0).
update_competence(component: str, score: float) -> None¶
Update competence score for a component (0.0-1.0).
update_latency(component: str, latency_ms: float) -> None¶
Update observed latency for a component.
update_quality(component: str, score: float) -> None¶
Update quality score for a component (0.0-1.0).
MCPNavigatorInput(BaseModel)¶
| Field | Type | Default |
|---|---|---|
op | NavOp | required |
query | str | '' |
component | str | '' |
tool_name | str | '' |
tool_name_b | str | '' |
cluster | str | '' |
capability | str | '' |
mcp_name | str | '' |
tier | str | '' |
tags_json | str | '[]' |
steps_json | str | '[]' |
pipeline_id | str | '' |
pipeline_name | str | '' |
delegate_op | str | '' |
delegate_args_json | str | '{}' |
delegations_json | str | '[]' |
code | str | '' |
error_message | str | '' |
prompt | str | '' |
allowed_tools | str | 'Read,Grep,Glob' |
output_format | str | 'json' |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
max_agency | int | 5 |
effect_budget_json | str | '{}' |
limit | int | 20 |
quality_mode | str | 'balanced' |
task_description | str | '' |
components | list[str] | Field(default_factory=list) |
MCPNavigatorOutput(BaseModel)¶
| Field | Type | Default |
|---|---|---|
op | str | required |
key | str | '' |
value | Any | None |
found | bool | False |
count | int | 0 |
records | list[dict[str, Any]] | Field(default_factory=list) |
retrieved | list[str] | Field(default_factory=list) |
scores | list[float] | Field(default_factory=list) |
summary | str | '' |
message | str | '' |
metadata | dict[str, Any] | Field(default_factory=dict) |
degraded | bool | False |
degradation_reason | str \| None | None |
completion_state | Literal['verified', 'qualified-draft', 'blocked-escalated'] | 'qualified-draft' |
warning_card | dict[str, Any] \| None | None |
evidence | dict[str, Any] | Field(default_factory=dict) |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
NavigatorStore¶
Constructor:
| Parameter | Type | Default |
|---|---|---|
db_path | str | ':memory:' |
Methods:
cache_registry(tool_key: str, entry: dict[str, Any]) -> str¶
get_cached_registry() -> list[dict[str, Any]]¶
save_pipeline(name: str, steps: list[dict[str, Any]], validation: dict[str, Any] | None = None, effect_budget: dict[str, Any] | None = None) -> str¶
get_pipeline(name: str) -> dict[str, Any] | None¶
list_pipelines() -> list[dict[str, Any]]¶
record_delegation(component: str, op: str, args: dict[str, Any] | None = None, result_data: dict[str, Any] | None = None, success: bool = True, agency_level: int = 2) -> str¶
query_delegations(component: str = '', limit: int = 50) -> list[dict[str, Any]]¶
log_distillation(pipeline_id: str, original_agency: int, distilled_agency: int, savings: dict[str, Any]) -> str¶
count_all() -> dict[str, int]¶
record_routing(task: str, quality_mode: str, selected_component: str, score: float, success: bool = True, latency_ms: float = 0.0) -> str¶
get_routing_history(component: str = '', limit: int = 50) -> list[dict[str, Any]]¶
update_circuit_breaker(component: str, failure_count: int, is_open: bool) -> str¶
get_circuit_breakers() -> list[dict[str, Any]]¶
record_mcp_load(mcp_name: str, status: str = 'loaded') -> str¶
record_mcp_unload(mcp_name: str, reason: str = 'explicit') -> str¶
record_mcp_access(mcp_name: str) -> str¶
get_mcp_lifecycle_stats() -> dict[str, Any]¶
Functions¶
suggest_distillation(pipeline_steps: list[dict[str, Any]]) -> list[dict[str, Any]]¶
Analyze each step and suggest lower-agency alternatives.
enforce_max_agency(step: dict[str, Any], max_level: AgencyLevel) -> RResult[dict[str, Any], str]¶
Reject steps exceeding the allowed agency level.
compose_effects(e1: EffectSignature, e2: EffectSignature) -> EffectSignature¶
Effect composition ε₁⊕ε₂ (Definition 2.7).
check_budget(composed: EffectSignature, budget: EffectSignature) -> RResult[bool, str]¶
Verify ε ≤ₑ ε_max (Definition 2.6 ordering).
MCP Tools¶
| Operation | Source |
|---|---|
nav_discover | navigator_mcp |
nav_search | navigator_mcp |
nav_recommend | navigator_mcp |
nav_discover_by_capability | navigator_mcp |
nav_discover_by_protocol | navigator_mcp |
nav_inspect_mcp | navigator_mcp |
nav_examine_tool | navigator_mcp |
nav_diff_tools | navigator_mcp |
nav_inspect_agent | navigator_mcp |
nav_compose | navigator_mcp |
nav_validate_pipeline | navigator_mcp |
nav_execute_plan | navigator_mcp |
nav_delegate | navigator_mcp |
nav_batch_delegate | navigator_mcp |
nav_self_heal | navigator_mcp |
nav_distill | navigator_mcp |
nav_claude_headless | navigator_mcp |
nav_stats | navigator_mcp |
nav_inspect_capabilities | navigator_mcp |
nav_unified_search | navigator_mcp |
nav_health_check | navigator_mcp |
nav_dependency_graph | navigator_mcp |
nav_execute_workflow | navigator_mcp |
nav_get_execution | navigator_mcp |
nav_list_executions | navigator_mcp |
nav_aggregate_stats | navigator_mcp |
nav_cross_reference | navigator_mcp |
nav_save_session | navigator_mcp |
nav_load_session | navigator_mcp |
nav_route | navigator_mcp |
nav_refresh_catalog | navigator_mcp |
nav_mcp_load | navigator_mcp |
nav_mcp_unload | navigator_mcp |
nav_mcp_list_active | navigator_mcp |
nav_mcp_evict_idle | navigator_mcp |
nav_mcp_registry | navigator_mcp |
list_patterns | navigator_mcp |
Dependencies¶
mvp.core