fix(mcp): /reload-mcp now updates agent tools + injects history message
- CLI: After reload, refreshes self.agent.tools and valid_tool_names so the model sees updated tools on its next API call - Both CLI and Gateway: Appends a [SYSTEM: ...] message at the END of conversation history explaining what changed (added/removed/ reconnected servers, tool count). This preserves prompt-cache for the system prompt and earlier messages — only the tail changes. - Gateway already creates a new AIAgent per message so tools refresh naturally; the injected message provides context for the model
This commit is contained in:
parent
7df14227a9
commit
eec31b0089
2 changed files with 61 additions and 2 deletions
|
|
@ -1422,6 +1422,31 @@ class GatewayRunner:
|
|||
lines.append("No MCP servers connected.")
|
||||
else:
|
||||
lines.append(f"\n🔧 {len(new_tools)} tool(s) available from {len(connected_servers)} server(s)")
|
||||
|
||||
# Inject a message at the END of the session history so the
|
||||
# model knows tools changed on its next turn. Appended after
|
||||
# all existing messages to preserve prompt-cache for the prefix.
|
||||
change_parts = []
|
||||
if added:
|
||||
change_parts.append(f"Added servers: {', '.join(sorted(added))}")
|
||||
if removed:
|
||||
change_parts.append(f"Removed servers: {', '.join(sorted(removed))}")
|
||||
if reconnected:
|
||||
change_parts.append(f"Reconnected servers: {', '.join(sorted(reconnected))}")
|
||||
tool_summary = f"{len(new_tools)} MCP tool(s) now available" if new_tools else "No MCP tools available"
|
||||
change_detail = ". ".join(change_parts) + ". " if change_parts else ""
|
||||
reload_msg = {
|
||||
"role": "user",
|
||||
"content": f"[SYSTEM: MCP servers have been reloaded. {change_detail}{tool_summary}. The tool list for this conversation has been updated accordingly.]",
|
||||
}
|
||||
try:
|
||||
session_entry = self.session_store.get_or_create_session(event.source)
|
||||
self.session_store.append_to_transcript(
|
||||
session_entry.session_id, reload_msg
|
||||
)
|
||||
except Exception:
|
||||
pass # Best-effort; don't fail the reload over a transcript write
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
except Exception as e:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue