{"name":"io.github.sidebutton/sidebutton","slug":"sidebutton","title":"SideButton MCP Server","description":"Open-source MCP server with browser automation and knowledge packs for AI agents","url":"https://mcp.market/server/sidebutton","rating":null,"grade":"B","score":72,"certified":false,"status":"active","category":"scraping","tags":["scraping"],"presence":{"score":34,"stars":5,"forks":1,"downloads_week":44,"last_push_at":"2026-09-22T02:51:08.000Z","license":"Apache-2.0"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/sidebutton/sidebutton","website":"https://sidebutton.com","version":"1.5.2","remotes":[],"packages":[{"registryType":"npm","identifier":"@sidebutton/server","version":"1.5.2","runtimeHint":"npx","transport":{"type":"stdio"},"packageArguments":[{"type":"named","name":"--stdio"}]}],"tools":[{"name":"browser_batch","description":"Run a SEQUENCE of browser actions in ONE call instead of one round trip per action. Each step is the same shape you would pass to the individual tool, plus a \"cmd\" field naming which tool to run. A batch is a DETERMINISTIC run: actions you already know the selectors for, executed top to bottom, halting at the first failure (unless on_error:\"continue\"). By default it ends by returning a fresh acces","write_action":true,"price_micros":0,"input_schema":null},{"name":"capture_page","description":"Capture selectors and interactive elements from the current page.","write_action":false,"price_micros":0,"input_schema":null},{"name":"clear_basic_auth","description":"Remove stored HTTP Basic Auth credentials. Omit \"origin\" to clear all stored credentials; pass \"origin\" to clear just that site.","write_action":true,"price_micros":0,"input_schema":null},{"name":"click","description":"Click an element on the page.","write_action":false,"price_micros":0,"input_schema":null},{"name":"evaluate","description":"Execute JavaScript in the browser page context and return the result. Useful for reading page state, checking values, or performing calculations.","write_action":true,"price_micros":0,"input_schema":null},{"name":"exists","description":"Check if an element exists on the page. Returns true/false without throwing. Useful for conditional logic.","write_action":false,"price_micros":0,"input_schema":null},{"name":"extract","description":"Extract text content from an element.","write_action":false,"price_micros":0,"input_schema":null},{"name":"extract_all","description":"Extract text from all elements matching a selector, joined by a separator. Useful for getting lists of items, table columns, or repeated elements.","write_action":false,"price_micros":0,"input_schema":null},{"name":"extract_map","description":"Extract structured data from repeated elements. For each element matching the outer selector, extracts named fields using sub-selectors. Returns JSON array of objects.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fill","description":"Fill a form field by setting its value programmatically. Unlike \"type\" (which simulates keystrokes), \"fill\" sets the value directly and triggers React/Vue/Angular change events. Use this for framework-controlled inputs where \"type\" doesn't work.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_browser_status","description":"Check if the browser extension is connected.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_run_log","description":"Retrieve the execution log for a completed workflow run.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_workflow","description":"Get detailed information about a specific workflow.","write_action":false,"price_micros":0,"input_schema":null},{"name":"hover","description":"Hover over an element (positions cursor for scroll targeting).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_run_logs","description":"List recent workflow execution logs.","write_action":true,"price_micros":0,"input_schema":null},{"name":"list_workflows","description":"List all available workflow automations.","write_action":false,"price_micros":0,"input_schema":null},{"name":"navigate","description":"Navigate the connected browser tab to a URL.","write_action":false,"price_micros":0,"input_schema":null},{"name":"press_key","description":"Press a key on the keyboard. Use this for keyboard shortcuts, Tab navigation, Enter, Escape, arrow keys, etc. Supports key combinations like \"Ctrl+A\" or \"Shift+Tab\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"publish_artifact","description":"Publish a piece of evidence (a screenshot, a design mockup, an RCA/coverage report) to the portal RIGHT NOW, mid-session, and get back a paste-ready snippet to cite in your ONE resolution comment on the ticket. The file is uploaded, attached to the ticket automatically, and given a tokenized no-login download link \\u2014 the snippet contains that link plus the Jira inline-attachment reference. Use","write_action":true,"price_micros":0,"input_schema":null},{"name":"run_workflow","description":"Execute a workflow automation by ID. Returns a run_id for tracking execution status.","write_action":true,"price_micros":0,"input_schema":null},{"name":"screenshot","description":"Capture a screenshot of the current page. Prefer cropping to a specific area instead of capturing the full viewport \\u2014 use ref (from snapshot), selector (CSS), or region (manual rect) to save context tokens. Full viewport is fine for first visit to a new page; after that, crop to the relevant section.","write_action":false,"price_micros":0,"input_schema":null},{"name":"scroll","description":"Scroll the page.","write_action":false,"price_micros":0,"input_schema":null},{"name":"scroll_into_view","description":"Scroll a specific element into the viewport. More precise than \"scroll\" \\u2014 targets an exact element.","write_action":false,"price_micros":0,"input_schema":null},{"name":"select_option","description":"Select an option from a native <select> dropdown element. Use this instead of click for <select> elements, as native dropdowns cannot be controlled via click events.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_basic_auth","description":"Provide HTTP Basic Auth credentials so the browser logs in silently instead of showing the native username/password modal, which would otherwise block the page and hang automation. Applies to the connected tab. Omit \"origin\" to use the credentials for any site that challenges; pass \"origin\" (e.g. \"https://staging.example.com\") to scope them to one site. When a challenge has no matching credentials","write_action":false,"price_micros":0,"input_schema":null},{"name":"snapshot","description":"Capture accessibility snapshot of the current page. Returns YAML with element refs for use with click/type. Use includeContent=true to also include visible text content as markdown. Note: taking a snapshot may dismiss inline modals or popups \\u2014 use screenshot instead if you need to verify modal content.","write_action":false,"price_micros":0,"input_schema":null},{"name":"type","description":"Type text into an input element.","write_action":false,"price_micros":0,"input_schema":null},{"name":"wait","description":"Wait for an element to appear on the page. Blocks until the element matching the selector exists in the DOM, or throws after timeout.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":72,"grade":"B","scanned_at":"2026-09-24T21:40:30.768Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-24T21:40:30.716Z","components":{"code":{"score":13,"max":25,"notes":["34 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 3 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[{"id":"exec.shell-concat","severity":"high","component":"code","title":"Shell command built from a string (injection risk)","evidence":"dist/cli.js: …=== \"win32\" ? \"start\" : \"xdg-open\"; exec(`${openCmd} \"${deviceData.verification_uri_complete}\"`)…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"@sidebutton/server","version":"1.5.2","found":true,"license":"Apache-2.0","hasInstallScripts":false,"dependencyCount":15,"publishedAt":"2026-07-27T12:58:53.603Z","repositoryUrl":"git+https://github.com/sidebutton/sidebutton.git","weeklyDownloads":44}],"repo":{"found":true,"owner":"sidebutton","repo":"sidebutton","archived":false,"pushedAt":"2026-09-22T02:51:08Z","stars":5,"forks":1,"openIssues":22,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/251921899?v=4","ownerCreatedAt":"2025-12-28T22:55:47Z","license":"Apache-2.0"},"icon":{"url":"https://avatars.githubusercontent.com/u/251921899?v=4&s=128","source":"github"},"presence":{"stars":5,"forks":1,"downloadsWeek":44,"license":"Apache-2.0","lastPushAt":"2026-09-22T02:51:08.000Z","score":34}}}},"grade_history":[],"reviews":[]}