iOfficeAI / iOfficeAI/AionCore

ToolSearch always returns nothing: deferred is hardcoded false for every MCP server

Open
#793 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
105
Forks
169
Avg merge
5h 58m
Merged PRs (30d)
84

Description

## Summary

`ToolSearch` can never return a result in AionUi. Every MCP server is constructed with `deferred: Some(false)`, so no tool is ever marked deferred, and `ToolSearch`'s filter matches nothing — while the tool is still advertised to the model and the system prompt still tells it that deferred tools exist.

Models that follow that instruction get stuck in a retry loop.

## Root cause

`aionrs` implements deferred tools correctly:

- `crates/aion-config/src/config.rs` — `McpServerConfig::deferred: Option`, documented as *"Defaults to true when omitted"*
- `crates/aion-mcp/src/tool_proxy.rs:135` — reads the per-server flag
- `crates/aion-tools/src/tool_search.rs` — `ToolSearch` filters `tool_defs` on `.filter(|d| d.deferred)`
- `crates/aion-agent/src/bootstrap.rs:361` — registers `ToolSearchTool` **unconditionally**

AionCore overrides the flag at every construction site in `crates/aionui-ai-agent/src/factory/aionrs.rs`:

| Function | Lines |
|---|---|
| `row_to_mcp_server_config` (DB-configured servers) | 534, 560, 586 |
| `session_server_to_mcp_server_config` | 615, 630, 645, 660 |
| `team_mcp_to_config` | 749 |

All `deferred: Some(false)`, with no conditional and no explanatory comment.

Result: `.filter(|d| d.deferred)` yields an empty set on every call, and `ToolSearch` returns `No deferred tools matching "" found.`

## Reproduction

1. Register any MCP server and enable it for a conversation.
2. Ask the model to do something requiring a tool it must discover.
3. `ToolSearch` returns "No deferred tools matching …" — always, regardless of tool count or how the server was installed.

I also verified from the outside that this is not user-configurable: adding `"deferred": true` to the server's `transport_config` JSON persisted across a full app + backend restart, the server connected normally, and `ToolSearch` still returned nothing — because `row_to_mcp_server_config` does not read the key.

## Impact

Observed across ~20 sessions on AionUi 2.1.50 / AionCore v0.1.61, with 12 MCP servers (~1,300 tools):

| model | sessions | ToolSearch calls | real tool calls |
|---|---|---|---|
| glm-5.2 | 13 | **204** | 17 |
| glm-5.1-cloud | 5 | 1 | 17 |
| gpt-5.5 | 2 | 0 | 16 |

Worst single session: 53 ToolSearch calls, 8 real tool calls. Several sessions made 10–20 ToolSearch calls and accomplished nothing before giving up and telling the user to "enable the file/exec tools".

The failure is model-dependent, which is likely why it has gone unnoticed: gpt-5.5, kimi-k27-code and glm-5.1-cloud ignore `ToolSearch` and call tools directly. glm-5.2 trusts the system prompt, searches, finds nothing, and retries.

## Suggested fix

Read `deferred` from the server config instead of hardcoding it — PR attached. Absent key keeps today's behaviour exactly, so there is no default change.

Separately, it may be worth not registering `ToolSearchTool` (or injecting the "some tools are deferred" prompt) when nothing in the snapshot is deferred — that would have prevented the symptom regardless of this setting. That belongs in `aionrs`.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start in crates/aionui-ai-agent/src/factory/aionrs.rs at the listed construction sites, then compare them with crates/aion-config/src/config.rs and crates/aion-mcp/src/tool_proxy.rs. Check crates/aion-tools/src/tool_search.rs and verify that a configured deferred tool can be found instead of every search reporting no matches.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
backend, tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.