Webappmcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Webappmcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A Model Context Protocol (MCP) server that enables AI assistants to interact with web applications through DOM inspection, user interaction simulation, and application state management.
npm install @cgaspard/webappmcpimport express from 'express';
import { webappMCP } from '@cgaspard/webappmcp';
const app = express();
// Configure the MCP middleware
app.use(webappMCP({
transport: 'sse',
wsPort: 4835,
appPort: 3000, // Tell middleware what port Express will use
cors: {
origin: true,
credentials: true
}
}));
app.listen(3000);
// The middleware will display the correct MCP URL when initialized<script src="https://unpkg.com/@cgaspard/webappmcp/dist/browser.min.js"></script>
<script>
const mcpClient = new WebAppMCP.WebAppMCPClient({
serverUrl: 'ws://localhost:4835',
autoConnect: true
});
mcpClient.connect();
</script>Or with npm:
import { WebAppMCPClient } from '@cgaspard/webappmcp';
const mcpClient = new WebAppMCPClient({
serverUrl: 'ws://localhost:4835',
autoConnect: true
});
mcpClient.connect();#### Claude Desktop App
Add using the command line (example for basic todos app):
claude mcp add webapp-sse sse:http://localhost:4834/mcp/sseFor any of the example apps, use the same standardized port:
http://localhost:4834/mcp/sseOr manually edit your configuration (example for basic todos app):
{
"mcpServers": {
"webapp-sse": {
"transport": {
"type": "sse",
"url": "http://localhost:4834/mcp/sse"
}
}
}
}#### Claude Code CLI
Add to your Claude Code configuration (~/.config/claude-code/settings.json):
{
"mcpServers": {
"webapp": {
"transport": {
"type": "sse",
"url": "http://localhost:4834/mcp/sse"
}
}
}
}#### Cline (VS Code Extension)
Add to your Cline MCP settings in VS Code:
{
"webapp": {
"transport": {
"type": "sse",
"url": "http://localhost:4834/mcp/sse"
}
}
}#### Continue.dev
Add to your Continue configuration (~/.continue/config.json):
{
"models": [...],
"mcpServers": {
"webapp": {
"transport": {
"type": "sse",
"url": "http://localhost:4834/mcp/sse"
}
}
}
}#### Zed Editor
Add to your Zed assistant panel settings:
{
"mcpServers": {
"webapp": {
"transport": {
"type": "sse",
"url": "http://localhost:4834/mcp/sse"
}
}
}
}All tools are prefixed with webapp_ to prevent naming conflicts with other MCP servers.
webapp_dom_query - Find elements using CSS selectorswebapp_dom_get_properties - Get element properties and attributeswebapp_dom_get_text - Extract text contentwebapp_dom_get_html - Get HTML structurewebapp_dom_manipulate - Modify DOM elements (setAttribute, addClass, etc.)webapp_interaction_click - Click on elementswebapp_interaction_type - Type text into inputswebapp_interaction_scroll - Scroll page or elementswebapp_interaction_hover - Hover over elementswebapp_capture_screenshot - Take full page screenshotswebapp_capture_element_screenshot - Capture specific elementswebapp_state_get_variable - Access JavaScript variableswebapp_state_local_storage - Read/write local storagewebapp_console_get_logs - Retrieve browser console logswebapp_console_save_to_file - Save browser logs to filewebapp_console_get_server_logs - Retrieve Node.js server logswebapp_server_execute_js - Execute JavaScript on the server (sandboxed)webapp_server_get_system_info - Get process and system informationwebapp_server_get_env - Inspect environment variables (masked)webapp_list_clients - List connected browser clientswebapp_javascript_inject - Execute JavaScript code in the browserwebapp_execute_javascript - Execute JavaScript with async supportWhen working with AI assistants using WebApp MCP, use these terms for clarity:
✅ Good:
❌ Avoid:
webappMCP({
// Transport type: 'sse' (default), 'stdio', 'socket', or 'none'
transport: 'sse',
// Express app port (defaults to process.env.PORT || 3000)
appPort: 3000,
// WebSocket port for client connections
wsPort: 4835,
// MCP SSE endpoint path
mcpEndpointPath: '/mcp/sse',
// Authentication settings
authentication: {
enabled: true,
token: 'your-secure-token'
},
// Permission controls
permissions: {
read: true, // Allow DOM reading
write: true, // Allow DOM modifications
screenshot: true, // Allow screenshots
state: true // Allow state access
},
// CORS settings
cors: {
origin: '*',
credentials: true
},
// Screenshot storage directory (relative to project root)
screenshotDir: '.webappmcp/screenshots',
// Debug logging
debug: false,
// Server-side console log capture
captureServerLogs: true, // Enable/disable all server log capture (default: true)
serverLogLimit: 1000, // Maximum logs to keep in memory (default: 1000)
// Winston logger (RECOMMENDED: pass your logger directly)
winstonLogger: logger, // Optional Winston logger instance for direct integration
// Granular log capture configuration
logCapture: {
console: false, // Capture console.log/warn/error/info (disable if using Winston)
streams: false, // Capture stdout/stderr streams (disable if using Winston)
winston: true, // Capture Winston logs via transport (default: true)
bunyan: false, // Capture Bunyan logs (default: true)
pino: false, // Capture Pino logs (default: true)
debug: false, // Capture debug library logs (default: true)
log4js: false // Capture log4js logs (default: true)
}
});WebApp MCP can capture server-side console logs and logging library output, making them accessible through the MCP tools. This is especially useful for debugging and monitoring.
#### Features
#### Winston Integration (Recommended)
The best way to capture Winston logs is to pass your logger directly:
const winston = require('winston');
// Create Winston logger
const logger = winston.createLogger({
level: 'info',
transports: [new winston.transports.Console()]
});
// Pass it to the middleware
const mcpMiddleware = app.use(webappMCP({
winstonLogger: logger, // Direct integration (recommended!)
captureServerLogs: true,
logCapture: {
console: false, // Disable console capture
winston: true // Winston capture via winstonLogger param
}
}));
// Alternative: Attach logger after setup (if created elsewhere)
// mcpMiddleware.attachWinston(logger);#### Configuration Examples
// Winston-only capture (recommended for production)
const logger = winston.createLogger({ /* ... */ });
app.use(webappMCP({
winstonLogger: logger,
captureServerLogs: true,
logCapture: {
console: false,
streams: false,
winston: true
}
}));
// Console only (lightweight, development)
app.use(webappMCP({
captureServerLogs: true,
logCapture: {
console: true,
streams: false,
winston: false
}
}));
// Attach Winston from separate module
const mcpMiddleware = app.use(webappMCP({ captureServerLogs: true }));
const logger = require('./config/logger');
mcpMiddleware.attachWinston(logger); // Attach after the factCheck out the Todos App Example - a fully functional todo application that demonstrates all WebApp MCP features.
// Add a new todo
await webapp.interaction.type({
selector: '#new-todo',
text: 'Buy groceries'
});
await webapp.interaction.click({ selector: '#add-todo' });
// Toggle todo completion
await webapp.interaction.click({ selector: '.todo-checkbox' });
// Filter todos
await webapp.interaction.click({ selector: '[data-filter="active"]' });
// Access application state
const todos = await webapp.state.getVariable({
path: 'window.todosApp.todos'
});WebApp MCP Server includes several security features:
import { useEffect } from 'react';
import { WebAppMCPClient } from '@cgaspard/webappmcp';
function App() {
useEffect(() => {
const client = new WebAppMCPClient({
serverUrl: 'ws://localhost:4835',
autoConnect: true
});
client.connect();
return () => client.disconnect();
}, []);
return <div>Your app content</div>;
}import { WebAppMCPClient } from '@cgaspard/webappmcp';
export default {
mounted() {
this.mcpClient = new WebAppMCPClient({
serverUrl: 'ws://localhost:4835',
autoConnect: true
});
this.mcpClient.connect();
},
beforeUnmount() {
if (this.mcpClient) {
this.mcpClient.disconnect();
}
}
}import { Component, OnInit, OnDestroy } from '@angular/core';
import { WebAppMCPClient } from '@cgaspard/webappmcp';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent implements OnInit, OnDestroy {
private mcpClient: WebAppMCPClient;
ngOnInit() {
this.mcpClient = new WebAppMCPClient({
serverUrl: 'ws://localhost:4835',
autoConnect: true
});
this.mcpClient.connect();
}
ngOnDestroy() {
if (this.mcpClient) {
this.mcpClient.disconnect();
}
}
}# Clone the repository
git clone https://github.com/cgaspard/webappmcp.git
cd webappmcp
# Install dependencies
npm install
# Build all packages
npm run build
# Run tests
npm test
# Start development server
npm run devThis project includes full VS Code support for easy development and debugging. See VS_CODE_SETUP.md for details.
Quick start with VS Code:
F5 to launch both the demo app and MCP serverWe welcome contributions! Please see our Contributing Guide for details.
MIT © cgaspard
Built with ❤️ to make AI-powered web automation accessible to everyone.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.