sendKeysTool.ts•2.49 kB
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { By, Key } from 'selenium-webdriver';
import { getWebDriver } from "../services/seleniumService.js";
const SendKeysInputSchema = z.object({
selector: z.string().min(1, { message: "CSS selector cannot be empty." }),
text: z.string(),
clearFirst: z.boolean().optional().default(false),
});
type SendKeysInput = z.infer<typeof SendKeysInputSchema>;
const SendKeysOutputSchema = z.object({
success: z.boolean(),
message: z.string(),
});
export function registerSendKeysTool(server: McpServer): void {
const description = "Finds an element by CSS selector and sends keystrokes to it.";
server.tool(
'selenium_sendKeys',
description,
SendKeysInputSchema.shape,
async (params: SendKeysInput) => {
const driver = getWebDriver();
try {
console.log(`Finding element to send keys to: ${params.selector}`);
const element = await driver.findElement(By.css(params.selector));
if (!(await element.isDisplayed()) || !(await element.isEnabled())) {
throw new Error(`Element found but is not interactable: ${params.selector}`);
}
if (params.clearFirst) {
console.log(`Clearing element: ${params.selector}`);
await element.clear();
}
console.log(`Sending keys "${params.text}" to element: ${params.selector}`);
await element.sendKeys(params.text);
console.log(`Successfully sent keys to element: ${params.selector}`);
return {
content: [
{
type: "text",
text: `Successfully sent keys to element matching selector: ${params.selector}`,
},
]
};
} catch (error: any) {
if (error.name === 'NoSuchElementError') {
console.error(`Element not found to send keys to: ${params.selector}`);
throw new Error(`Element not found to send keys to: ${params.selector}`);
} else if (error.name === 'ElementNotInteractableError') {
console.error(`Element not interactable for sending keys: ${params.selector}.`);
throw new Error(`Element not interactable: ${params.selector}.`);
} else {
console.error(`Error sending keys to element ${params.selector}:`, error);
throw new Error(`Failed to send keys. Error: ${error.message || 'Unknown error'}`);
}
}
}
);
}