Claude Desktop Skills Proxy — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Claude Desktop Skills Proxy (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.
MCP server that bypasses Claude Desktop sandbox network restrictions.
Claude Desktop runs in a restricted sandbox that blocks many network operations and CLI tools that need internet access. This MCP server provides three tools that run outside the sandbox, enabling Claude to:
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"proxy": {
"command": "npx",
"args": ["-y", "github:CodefiLabs/claude-desktop-skills-proxy"]
}
}
}Restart Claude Desktop for changes to take effect. The server will be automatically downloaded and run.
git clone https://github.com/CodefiLabs/claude-desktop-skills-proxy.git
cd claude-desktop-skills-proxy
npm install
npm run buildThen configure Claude Desktop to use the local build:
{
"mcpServers": {
"proxy": {
"command": "node",
"args": ["/path/to/claude-desktop-skills-proxy/dist/index.js"]
}
}
}Make HTTP requests to any URL. Supports all common HTTP methods.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The URL to fetch |
method | string | No | HTTP method: GET, POST, PUT, DELETE, PATCH, HEAD (default: GET) |
headers | object | No | Custom HTTP headers as key-value pairs |
body | string | No | Request body for POST/PUT/PATCH |
timeout | number | No | Timeout in milliseconds (default: 30000) |
approve | string | No | Domain approval: "once" or "always" |
Example - Simple GET:
{
"url": "https://api.github.com/users/octocat"
}Example - POST with headers:
{
"url": "https://api.example.com/data",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer token123"
},
"body": "{\"key\": \"value\"}"
}Example - Approve new domain:
{
"url": "https://newsite.com/api",
"approve": "always"
}Execute CLI commands that require network access. Uses secure spawn() instead of shell execution.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
command | string | Yes | The command to execute (e.g., "yt-dlp", "curl") |
args | array | No | Command arguments as array |
cwd | string | No | Working directory |
env | object | No | Additional environment variables |
timeout | number | No | Timeout in milliseconds (default: 60000) |
approve | string | No | Command approval: "once" or "always" |
Example - Download video with yt-dlp:
{
"command": "yt-dlp",
"args": ["--output", "video.mp4", "https://youtube.com/watch?v=dQw4w9WgXcQ"],
"cwd": "/Users/kk/Downloads",
"approve": "always"
}Example - Fetch with curl:
{
"command": "curl",
"args": ["-s", "https://api.ipify.org?format=json"],
"approve": "once"
}Example - Convert video with ffmpeg:
{
"command": "ffmpeg",
"args": ["-i", "input.mp4", "-c:v", "libx264", "output.mp4"],
"cwd": "/Users/kk/Videos",
"timeout": 300000
}Read files from the host filesystem. Useful for reading files created by network_exec (e.g., subtitle files from yt-dlp).
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
path | string | Yes | Absolute path to the file to read |
encoding | string | No | "utf8" (default) or "base64" for binary files |
maxSize | number | No | Maximum file size in bytes (default: 5MB) |
Example - Read subtitle file:
{
"path": "/tmp/video.en.vtt"
}Example - Read binary file as base64:
{
"path": "/tmp/image.png",
"encoding": "base64"
}Workflow for yt-dlp subtitles:
network_exec: {
"command": "yt-dlp",
"args": ["--write-auto-sub", "--skip-download", "-o", "/tmp/%(id)s", "VIDEO_ID"],
"approve": "always"
}read_file: {
"path": "/tmp/VIDEO_ID.en.vtt"
}Blocked paths: Sensitive files like ~/.ssh/*, ~/.aws/*, /etc/shadow, .env files, and credential files are blocked for security.
When accessing a new domain or running a new command, the tool returns a needs_approval status:
{
"status": "needs_approval",
"domain": "example.com",
"message": "Domain \"example.com\" is not in your allowlist. To proceed, call proxy_fetch again with approve: \"once\" for this request only, or approve: \"always\" to remember this domain."
}Approval options:
"once" - Allow for this single request only"always" - Add to allowlist and remember for future requestsOnce approved with "always", subsequent requests to that domain/command work automatically.
The following domains are always blocked to prevent Server-Side Request Forgery attacks:
localhost, 127.0.0.1, ::1 - Loopback addresses169.254.169.254 - AWS metadata endpoint10.*, 172.16-31.*, 192.168.* - Private IP rangesfe80:*, fc00:*, fd00:* - IPv6 private/link-localThese commands are blocked for security:
rm, rmdir, del, mvsudo, su, doaschmod, chown, chgrpmkfs, fdisk, dd, formatapt, brew, yum, etc.bash, sh, zsh, etc.nc, netcat, telnetShell operators are blocked in command arguments to prevent injection:
;, |, &&, || - Command chaining>, < - Redirects$(, ` `, ${` - Command/variable substitutionRequests are rate-limited to prevent abuse:
Configuration is stored at ~/.config/mcp-proxy/config.json:
{
"allowedDomains": ["api.github.com", "example.com"],
"blockedDomains": ["localhost", "127.0.0.1", "..."],
"allowedCommands": ["yt-dlp", "curl", "ffmpeg"],
"blockedCommands": ["rm", "sudo", "..."]
}The file is created automatically on first use. User-approved domains/commands are added to the allowlists. Security blocklists cannot be overridden.
# Build
npm run build
# Watch mode
npm run watch
# Test with MCP Inspector
npx @modelcontextprotocol/inspector node dist/index.jsMIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.