Skip to main content
Glama
pansin
by pansin
navigation-tools.ts3.34 kB
/** * 导航工具实现 */ import { z } from 'zod'; import { BaseTool } from './base-tool.js'; import { NavigationTools } from '../interfaces/tools.js'; import { NavigationOptions, NavigationOptionsSchema } from '../types/index.js'; import { NavigationError } from '../errors/index.js'; import { ToolExecutionContext } from '../interfaces/mcp.js'; export class NavigateTool extends BaseTool { private pageController: any; constructor(pageController: any) { super( 'navigate', '导航到指定URL', z.object({ url: z.string().url('必须提供有效的URL'), waitUntil: z.enum(['load', 'domcontentloaded', 'networkidle0', 'networkidle2']).optional(), timeout: z.number().positive().optional(), referer: z.string().optional() }) ); this.pageController = pageController; } protected async run(args: { url: string } & Partial<NavigationOptions>): Promise<{ success: boolean; url: string }> { try { const options: NavigationOptions = { waitUntil: args.waitUntil, timeout: args.timeout, referer: args.referer }; await this.pageController.navigate(args.url, options); return { success: true, url: args.url }; } catch (error) { throw new NavigationError(`导航到 ${args.url} 失败: ${(error as Error).message}`, error as Error); } } } export class RefreshTool extends BaseTool { private pageController: any; constructor(pageController: any) { super( 'refresh', '刷新当前页面', z.object({}) ); this.pageController = pageController; } protected async run(): Promise<{ success: boolean }> { try { const page = this.pageController.getCurrentPage(); this.validatePage(page); await page.reload({ waitUntil: 'load' }); return { success: true }; } catch (error) { throw new NavigationError(`刷新页面失败: ${(error as Error).message}`, error as Error); } } } export class GoBackTool extends BaseTool { private pageController: any; constructor(pageController: any) { super( 'goBack', '返回上一页', z.object({}) ); this.pageController = pageController; } protected async run(): Promise<{ success: boolean }> { try { const page = this.pageController.getCurrentPage(); this.validatePage(page); await page.goBack({ waitUntil: 'load' }); return { success: true }; } catch (error) { throw new NavigationError(`返回上一页失败: ${(error as Error).message}`, error as Error); } } } export class GoForwardTool extends BaseTool { private pageController: any; constructor(pageController: any) { super( 'goForward', '前进到下一页', z.object({}) ); this.pageController = pageController; } protected async run(): Promise<{ success: boolean }> { try { const page = this.pageController.getCurrentPage(); this.validatePage(page); await page.goForward({ waitUntil: 'load' }); return { success: true }; } catch (error) { throw new NavigationError(`前进到下一页失败: ${(error as Error).message}`, error as Error); } } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pansin/browserMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server