-
Notifications
You must be signed in to change notification settings - Fork 0
feat(skill): add skill.json with multi-ecosystem exports #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Add FGP skill manifest with: - Full method definitions (18 browser automation methods) - Binary build configuration for Rust - Distribution config (prebuilt binaries, Homebrew tap) - Daemon configuration (socket, pid, log paths) - MCP bridge settings - Multi-ecosystem exports: - MCP: enabled with fgp_browser prefix - Claude Code: enabled with triggers and SKILL.md generation - Cursor: enabled with mcp.json integration - Windsurf/Continue: disabled by default This enables automatic registration across AI coding assistants when installed via `fgp skill install browser-gateway`. Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR adds a new FGP skill manifest (.fgp/skill.json) to enable multi-ecosystem auto-registration for the browser-gateway tool. The skill.json provides comprehensive configuration for browser automation methods and integration with MCP, Claude Code, and Cursor.
Changes:
- Add
.fgp/skill.jsonwith 18 browser automation method definitions and parameter schemas - Configure multi-ecosystem exports (MCP, Claude Code, Cursor, Windsurf, Continue Dev)
- Define binary distribution, daemon management, and Chrome requirements
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
.fgp/skill.json
Outdated
| "$schema": "https://fgp.dev/schemas/skill.json", | ||
| "name": "browser-gateway", | ||
| "version": "0.1.0", | ||
| "description": "Fast browser automation via Chrome DevTools Protocol - 292x faster than Playwright MCP", |
Copilot
AI
Jan 15, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The description claims "292x faster than Playwright MCP" but this specific performance claim is not verifiable from the skill manifest alone and may become outdated over time. Performance claims in manifests should either reference documentation/benchmarks or be more general.
| "description": "Fast browser automation via Chrome DevTools Protocol - 292x faster than Playwright MCP", | |
| "description": "Fast, high-performance browser automation via Chrome DevTools Protocol.", |
.fgp/skill.json
Outdated
| "description": "Press key with modifiers (e.g., Ctrl+A)", | ||
| "params": { | ||
| "key": { "type": "string", "required": true, "description": "Key to press" }, | ||
| "modifiers": { "type": "array", "description": "Modifiers (ctrl, alt, shift, meta)" }, |
Copilot
AI
Jan 15, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The modifiers parameter in browser.press_combo is defined as an array type but lacks specification of the array item type and constraints. The description mentions specific modifiers (ctrl, alt, shift, meta) but there's no schema enforcement. Consider adding "items" with type "string" and ideally an enum constraint to ensure valid modifier values.
| "modifiers": { "type": "array", "description": "Modifiers (ctrl, alt, shift, meta)" }, | |
| "modifiers": { | |
| "type": "array", | |
| "description": "Modifiers (ctrl, alt, shift, meta)", | |
| "items": { | |
| "type": "string", | |
| "enum": ["ctrl", "alt", "shift", "meta"] | |
| } | |
| }, |
.fgp/skill.json
Outdated
| "enabled": true, | ||
| "skill_name": "browser-fgp", | ||
| "triggers": ["browser", "navigate", "screenshot", "click", "fill", "automation", "web page"], | ||
| "tools": ["Bash"] |
Copilot
AI
Jan 15, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The claude export configuration references "Bash" in the tools array, but it's unclear what this represents in the context of Claude Code skills. This should be documented or clarified - does it mean the skill requires bash access, or is this specifying tool dependencies? The capitalization also seems inconsistent with typical tool naming.
| "tools": ["Bash"] | |
| "tools": [] |
.fgp/skill.json
Outdated
| "name": "session.new", | ||
| "description": "Create a new isolated browser session", | ||
| "params": { | ||
| "session_id": { "type": "string", "description": "Custom session ID (optional)" } | ||
| } | ||
| }, | ||
| { | ||
| "name": "session.list", | ||
| "description": "List active browser sessions", | ||
| "params": {} | ||
| }, | ||
| { | ||
| "name": "session.close", | ||
| "description": "Close a browser session", | ||
| "params": { | ||
| "session_id": { "type": "string", "required": true, "description": "Session ID to close" } | ||
| } | ||
| }, | ||
| { | ||
| "name": "state.save", | ||
| "description": "Save browser state (cookies, localStorage)", | ||
| "params": { | ||
| "name": { "type": "string", "required": true, "description": "State name" }, | ||
| "session_id": { "type": "string", "description": "Session ID (optional)" } | ||
| } | ||
| }, | ||
| { | ||
| "name": "state.load", | ||
| "description": "Load saved browser state", | ||
| "params": { | ||
| "name": { "type": "string", "required": true, "description": "State name" }, | ||
| "session_id": { "type": "string", "description": "Session ID (optional)" } | ||
| } | ||
| }, | ||
| { | ||
| "name": "state.list", | ||
| "description": "List saved browser states", | ||
| "params": {} | ||
| } |
Copilot
AI
Jan 15, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The method names in skill.json are inconsistent with the existing manifest.json. The existing manifest uses "browser.state.save", "browser.state.load", "browser.state.list", "browser.session.new", "browser.session.list", and "browser.session.close", while skill.json uses shortened names like "state.save", "session.new", etc. This inconsistency will cause the methods to not map correctly when auto-generating MCP configurations. Use the same naming convention as manifest.json for consistency.
.fgp/skill.json
Outdated
| "name": "browser.screenshot", | ||
| "description": "Capture PNG screenshot", | ||
| "params": { | ||
| "path": { "type": "string", "description": "Output file path (optional)" }, |
Copilot
AI
Jan 15, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The browser.screenshot method has an inconsistent parameter definition with the existing manifest.json. The existing manifest defines "path" as required with a "full_page" boolean parameter, while skill.json defines "path" as optional without the "full_page" parameter. This inconsistency will cause issues when the skill.json is used to generate MCP configurations. Align the parameter definitions with manifest.json.
| "path": { "type": "string", "description": "Output file path (optional)" }, | |
| "path": { "type": "string", "required": true, "description": "Output file path" }, | |
| "full_page": { "type": "boolean", "description": "Capture the full scrollable page (optional)" }, |
.fgp/skill.json
Outdated
| "mcp_bridge": { | ||
| "enabled": true, | ||
| "command": "${SKILL_BIN}", | ||
| "args": ["mcp"], | ||
| "tools_prefix": "fgp_browser" | ||
| }, | ||
|
|
Copilot
AI
Jan 15, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The mcp_bridge configuration appears to be duplicated functionality with the exports.mcp section. Both define MCP integration with the same tools_prefix. This creates ambiguity about which configuration should take precedence and may lead to conflicts. Consider consolidating these into a single configuration section.
| "mcp_bridge": { | |
| "enabled": true, | |
| "command": "${SKILL_BIN}", | |
| "args": ["mcp"], | |
| "tools_prefix": "fgp_browser" | |
| }, |
| "log_file": "${FGP_HOME}/services/browser/daemon.log", | ||
| "start_command": ["${SKILL_BIN}", "start"], | ||
| "stop_command": ["${SKILL_BIN}", "stop"], | ||
| "health_method": "health" |
Copilot
AI
Jan 15, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The daemon health_method references "health" but this method is not defined in the methods array. The methods list includes browser., session., and state.* methods but no "health" method. Either add the health method to the methods array or update the health_method reference to match an existing method name.
.fgp/skill.json
Outdated
| "direction": { "type": "string", "description": "up, down, left, right" }, | ||
| "amount": { "type": "integer", "description": "Pixels to scroll" }, |
Copilot
AI
Jan 15, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The scroll method has inconsistent parameter typing. The "direction" parameter should have a required field and ideally an enum constraint (up, down, left, right) to prevent invalid values. The "amount" parameter should specify if it's required, and consider if negative values are allowed.
| "direction": { "type": "string", "description": "up, down, left, right" }, | |
| "amount": { "type": "integer", "description": "Pixels to scroll" }, | |
| "direction": { "type": "string", "required": true, "enum": ["up", "down", "left", "right"], "description": "Scroll direction" }, | |
| "amount": { "type": "integer", "required": true, "minimum": 0, "description": "Pixels to scroll (must be non-negative)" }, |
.fgp/skill.json
Outdated
| "description": "Upload a file to an input", | ||
| "params": { | ||
| "selector": { "type": "string", "required": true, "description": "File input selector" }, | ||
| "path": { "type": "string", "required": true, "description": "Path to file" }, |
Copilot
AI
Jan 15, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The browser.upload method accepts a file path parameter but lacks validation requirements or security considerations. There's no indication of path validation, file size limits, or allowed file types. For a browser automation tool that handles file uploads, consider adding documentation about path validation and security constraints.
| "description": "Upload a file to an input", | |
| "params": { | |
| "selector": { "type": "string", "required": true, "description": "File input selector" }, | |
| "path": { "type": "string", "required": true, "description": "Path to file" }, | |
| "description": "Upload a file to an input. The implementation must validate the file path and enforce security constraints (allowed directories, file size limits, and allowed file types).", | |
| "params": { | |
| "selector": { "type": "string", "required": true, "description": "File input selector" }, | |
| "path": { "type": "string", "required": true, "description": "Absolute or workspace-local path to an existing file. Implementations must validate this path, restrict it to allowed directories, and enforce file size and type limits before uploading." }, |
| "darwin-arm64": "https://github.com/fast-gateway-protocol/browser/releases/download/v${VERSION}/browser-gateway-darwin-arm64", | ||
| "darwin-x64": "https://github.com/fast-gateway-protocol/browser/releases/download/v${VERSION}/browser-gateway-darwin-x64", | ||
| "linux-x64": "https://github.com/fast-gateway-protocol/browser/releases/download/v${VERSION}/browser-gateway-linux-x64" |
Copilot
AI
Jan 15, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The VERSION placeholder in distribution URLs uses ${VERSION} syntax but the version field is defined as "0.1.0". Ensure that the system performing substitution correctly handles the version format (with or without the 'v' prefix) since the URLs include "v${VERSION}".
- Replace `map_or(false, ...)` with `is_some_and(...)` in aria.rs - Replace redundant closures `|v| json_as_bool(v)` with `json_as_bool` - Use `sort_by_key` with Reverse instead of `sort_by` in client.rs - Change `&PathBuf` to `&Path` in service.rs parameter - Remove trivial `assert!(true)` from integration test Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
- Remove unverifiable "292x faster" performance claim from description - Use consistent author (Wolfgang Schoenberger) matching manifest.json - Sync version to 1.0.0 matching manifest.json - Add missing "health" method to methods array - Fix screenshot params: path now required, added full_page boolean - Add enum constraints for scroll direction (up/down/left/right) - Add items definition with enum for modifiers array - Use consistent method names: browser.session.*, browser.state.* - Remove duplicate mcp_bridge section, consolidated into exports.mcp - Remove unclear "Bash" from claude exports tools array Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Summary
.fgp/skill.json) with full browser-gateway configurationDetails
The skill.json enables:
manifest.jsonfor FGP MCP serverSKILL.mdin~/.claude/skills/browser-fgp/~/.cursor/mcp.jsonWhen users run
fgp skill install browser-gateway, the skill is automatically registered with all enabled ecosystems.Test plan
fgp skill install browser-gatewayand verify auto-registrationfgp skill mcp status browser-gatewayshows all targets~/.claude/skills/browser-fgp/SKILL.md~/.cursor/mcp.json🤖 Generated with Claude Code