diff --git a/packages/provider-pi/src/server/mcpExtensionSource.test.ts b/packages/provider-pi/src/server/mcpExtensionSource.test.ts index c4119157a0175..6a909f4e374f9 100644 --- a/packages/provider-pi/src/server/mcpExtensionSource.test.ts +++ b/packages/provider-pi/src/server/mcpExtensionSource.test.ts @@ -387,9 +387,12 @@ describe("Pi tool discovery permissions", () => { }, }, }; - assert.isUndefined( - await toolCall!({ toolName: "tool_search", input: { query: "preview_snapshot" } }, ctx), - ); + for (const builtinPath of ["builtin:tool-search", ""]) { + searchPath = builtinPath; + assert.isUndefined( + await toolCall!({ toolName: "tool_search", input: { query: "preview_snapshot" } }, ctx), + ); + } assert.equal(confirmations.length, 0); const result = await toolCall!({ toolName: "mcp__t3-code__preview_snapshot", input: {} }, ctx); assert.equal(result?.block, true); diff --git a/packages/provider-pi/src/server/mcpExtensionSource.ts b/packages/provider-pi/src/server/mcpExtensionSource.ts index 48aeff24370de..0f137d0f4d4d0 100644 --- a/packages/provider-pi/src/server/mcpExtensionSource.ts +++ b/packages/provider-pi/src/server/mcpExtensionSource.ts @@ -343,9 +343,11 @@ export default async function t3McpExtension(pi: ExtensionAPI) { // keep their normal meaning without replacing or shadowing Pi's runtime. // Only Pi's own search is known to be read-only. An extension that replaces // it keeps the name, and cannot discover deferred tools either. + // OmO reports Pi's builtin search with angle brackets around the same path. + const BUILTIN_TOOL_SEARCH_PATHS = new Set(["builtin:tool-search", ""]); const hasBuiltinToolSearch = () => typeof pi.getAllTools === "function" && - pi.getAllTools().some((tool) => tool.name === "tool_search" && tool.sourceInfo?.path === "builtin:tool-search"); + pi.getAllTools().some((tool) => tool.name === "tool_search" && BUILTIN_TOOL_SEARCH_PATHS.has(tool.sourceInfo?.path ?? "")); const readOnlyMcpTools = new Set(); const isReadOnlyMcpTool = (name: string) => {