findElementTool.ts•1.97 kB
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { By } from 'selenium-webdriver';
import { getWebDriver } from "../services/seleniumService.js";
const FindElementInputSchema = z.object({
selector: z.string().min(1, { message: "CSS selector cannot be empty." }),
});
type FindElementInput = z.infer<typeof FindElementInputSchema>;
const FindElementOutputSchema = z.object({
success: z.boolean(),
message: z.string(),
});
export function registerFindElementTool(server: McpServer): void {
const description = "Finds the first element on the page matching the given CSS selector.";
server.tool(
'selenium_findElement',
description,
FindElementInputSchema.shape,
async (params: FindElementInput) => {
const driver = getWebDriver();
try {
console.log(`Finding element with selector: ${params.selector}`);
const element = await driver.findElement(By.css(params.selector));
if (!(await element.isDisplayed())) {
console.warn(`Element found but not displayed: ${params.selector}`);
}
const tagName = await element.getTagName();
console.log(`Successfully found element <${tagName}> with selector: ${params.selector}`);
return {
content: [
{
type: "text",
text: `Successfully found element <${tagName}> matching selector: ${params.selector}`,
},
]
};
} catch (error: any) {
if (error.name === 'NoSuchElementError') {
console.error(`Element not found for selector: ${params.selector}`);
throw new Error(`Element not found for selector: ${params.selector}`);
} else {
console.error(`Error finding element with selector ${params.selector}:`, error);
throw new Error(`Failed to find element. Error: ${error.message || 'Unknown error'}`);
}
}
}
);
}