Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions examples/basic-host/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,17 @@ interface HostProps {
type ToolCallEntry = ToolCallInfo & { id: number };
let nextToolCallId = 0;

// Parse URL query params for debugging: ?server=name&tool=name&call=true&theme=hide
// Parse URL query params for debugging:
// ?server=name&tool=name&call=true&theme=hide
// &input={"question":"..."} (URL-encoded JSON to pre-fill tool arguments)
function getQueryParams() {
const params = new URLSearchParams(window.location.search);
return {
server: params.get("server"),
tool: params.get("tool"),
call: params.get("call") === "true",
hideThemeToggle: params.get("theme") === "hide",
input: params.get("input"),
};
}

Expand Down Expand Up @@ -123,6 +126,7 @@ function Host({ serversPromise }: HostProps) {
addToolCall={(info) => setToolCalls([...toolCalls, { ...info, id: nextToolCallId++ }])}
initialServer={queryParams.server}
initialTool={queryParams.tool}
initialInput={queryParams.input}
autoCall={queryParams.call}
/>
</>
Expand All @@ -136,12 +140,13 @@ interface CallToolPanelProps {
addToolCall: (info: ToolCallInfo) => void;
initialServer?: string | null;
initialTool?: string | null;
initialInput?: string | null;
autoCall?: boolean;
}
function CallToolPanel({ serversPromise, addToolCall, initialServer, initialTool, autoCall }: CallToolPanelProps) {
function CallToolPanel({ serversPromise, addToolCall, initialServer, initialTool, initialInput, autoCall }: CallToolPanelProps) {
const [selectedServer, setSelectedServer] = useState<ServerInfo | null>(null);
const [selectedTool, setSelectedTool] = useState("");
const [inputJson, setInputJson] = useState("{}");
const [inputJson, setInputJson] = useState(initialInput ?? "{}");
const [hasAutoCalledRef] = useState({ called: false });

// Filter out app-only tools, prioritize tools with UIs
Expand Down Expand Up @@ -174,8 +179,9 @@ function CallToolPanel({ serversPromise, addToolCall, initialServer, initialTool
: visibleTools[0]?.name ?? "";

setSelectedTool(targetTool);
// Set input JSON to tool defaults (if any)
setInputJson(getToolDefaults(server.tools.get(targetTool)));
if (!initialInput) {
setInputJson(getToolDefaults(server.tools.get(targetTool)));
}
};

const handleToolSelect = (toolName: string) => {
Expand All @@ -197,7 +203,8 @@ function CallToolPanel({ serversPromise, addToolCall, initialServer, initialTool
const url = new URL(window.location.href);
url.searchParams.set("server", server.name);
url.searchParams.set("tool", tool);
url.searchParams.set("call", "true"); // Auto-call on refresh
url.searchParams.set("call", "true");
url.searchParams.set("input", inputJson);
history.replaceState(null, "", url.toString());
};

Expand Down