Skylos

Local static analysis for dead code, security flaws, secrets and code quality, callable from an MCP client

By oha (individual) Python Local · stdio Developer toolsSecurity

69 popularity score ★ 887 ↓ 65k/mo

Connect your client

Local (PyPI)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

It needs SKYLOS_API_KEY. Replace each <NAME> with your value.

FirstTerminal
pip install skylos
Claude CodeTerminal
claude mcp add skylos -e SKYLOS_API_KEY=<SKYLOS_API_KEY> -- python -m skylos_mcp.server
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "skylos": {
      "command": "python",
      "args": [
        "-m",
        "skylos_mcp.server"
      ],
      "env": {
        "SKYLOS_API_KEY": "<SKYLOS_API_KEY>"
      }
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "skylos": {
      "command": "python",
      "args": [
        "-m",
        "skylos_mcp.server"
      ],
      "env": {
        "SKYLOS_API_KEY": "<SKYLOS_API_KEY>"
      }
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "skylos": {
      "type": "stdio",
      "command": "python",
      "args": [
        "-m",
        "skylos_mcp.server"
      ],
      "env": {
        "SKYLOS_API_KEY": "<SKYLOS_API_KEY>"
      }
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.skylos]
command = "python"
args = ["-m", "skylos_mcp.server"]

[mcp_servers.skylos.env]
SKYLOS_API_KEY = "<SKYLOS_API_KEY>"
Gemini CLITerminal
gemini mcp add --scope user -e SKYLOS_API_KEY=<SKYLOS_API_KEY> skylos python -- -m skylos_mcp.server

Settings 8

SKYLOS_API_KEY secret Required: Skylos Cloud key from the dashboard settings; without it only analyze works, 5 calls a day.
SKYLOS_MCP_RESULTS_DIR Optional: Where results are saved. Default ~/.skylos/mcp_results.
SKYLOS_CLOUD_URL Optional: Skylos Cloud address for key checks and credits. Default https://skylos.dev.
SKYLOS_GREP_BUDGET Optional: Seconds allowed for the reference search before a patch. Default 30. For generate_fix.
Set together: http
MCP_TRANSPORT Optional: sse or streamable-http serves over HTTP; then SKYLOS_MCP_TOKEN is required. Default stdio.
MCP_BIND Optional: Address to listen on in HTTP mode. Default 127.0.0.1.
PORT Optional: Port in HTTP mode. Default 8080.
SKYLOS_MCP_TOKEN secret Optional: Bearer token clients must send in HTTP mode, at least 16 characters.

What it does

Skylos is a static analysis tool, and its Python package ships an MCP server (the skylos_mcp.server module) that gives an MCP client the same engine the skylos CLI uses. The assistant passes a folder or file path and gets structured findings back: unused functions, imports and classes with confidence scores, taint-tracked injection and SSRF issues, hard-coded keys, complexity and architecture problems, and supply-chain risks such as imported packages that do not exist on the registry. Python has the deepest coverage; TypeScript/JavaScript and Java get dead-code, security and quality checks, while PHP, Dart, Rust, C#, Kotlin and Shell get narrower coverage. Since 4.50 the PyPI wheels for Linux, macOS and Windows on x86_64 and arm64 bundle the skylos-go engine that Go checks need; on other platforms it has to be built separately.

Beyond scanning, some tools are meant for coding agents: checking a diff or an edited line range for hallucinated references and removed controls, scoring an AI agent's guardrails against OWASP lists, attributing changes to bots or people from git history, and learning from triage decisions. Two tools can change code. generate_fix builds a patch that deletes or comments out dead code and writes it only with apply=true. remediate plans fixes by default; with dry_run=false it asks an LLM for fixes and edits files in place. At v5.0.0 it does not run your tests and rejects test_cmd over MCP, although the docs page still says it validates fixes with tests and reverts broken ones.

The server file at v5.0.0 (skylos_mcp/server.py) registers sixteen tools. The README and docs also describe a change_map tool, but that file does not register it. Every result is saved to ~/.skylos/mcp_results/ (or SKYLOS_MCP_RESULTS_DIR) and can be read back through skylos://results resources.

What it needs

RuntimePython 3.10+
Runs onmacOS, Windows, Linux
Skylos Cloud (skylos.dev)Free tierAPI key needed for every tool except analyze; remediate is paid with credits (10 per call per the README)

Install skylos (pip install skylos) in the Python interpreter the client starts; the docs' config points at a venv's python when it lives in one. Create SKYLOS_API_KEY in the skylos.dev dashboard settings. remediate with dry_run=false and verify_dead_code need the LLM extra (pip install "skylos[llm]", which brings litellm) plus credentials for the model provider in the server's environment (the docs name OPENAI_API_KEY and ANTHROPIC_API_KEY, or SKYLOS_LLM_BASE_URL for a local model). Go checks outside the bundled wheel platforms need the skylos-go engine built separately; skylos doctor prints the build command.

Limits

  • Rate limit Without SKYLOS_API_KEY only analyze works, 5 calls per rolling 24 hours; the other fifteen tools return an authentication error (skylos_mcp/auth.py).
  • Rate limit With a key, calls are capped per hour by plan: 50 Free, 500 Pro, 5,000 Enterprise (auth.py).
  • Cost remediate costs 10 credits per call per the README. At v5.0.0 Enterprise is charged too, despite the docs page's 'unlimited credits' line (auth.py).
  • Cost With a key, analyze and the security, quality, architecture, health, secrets and provenance tools also go through a credit deduction on skylos.dev, and Skylos Cloud sets their cost.
  • Limit With a key set, credit-tracked tools are blocked when skylos.dev cannot confirm the deduction, for example when you are offline.
  • Limit If the key check fails at start, or the 15-minute recheck fails, the server drops to keyless mode (analyze only).
  • Not covered remediate does not run tests over MCP and rejects test_cmd; the docs page's 'validate with tests, revert if broken' does not hold at v5.0.0.
  • Not covered change_map is in the README and docs but is not registered by server.py at v5.0.0.
  • Limit validate_code_change accepts a policy path but does not apply it to the result at v5.0.0.
  • Limit Relative paths resolve against the server's working directory, not the client's project.

Without SKYLOS_API_KEY only analyze works, capped at 5 calls a day (skylos_mcp/auth.py); the other fifteen tools return an authentication error. With a key, calls are capped per hour by plan: 50 free, 500 Pro, 5,000 Enterprise. remediate costs 10 credits per call except on Enterprise plans. The key is checked against skylos.dev when the server starts; if that check fails, the server falls back to the keyless mode. The plain pip install does not bring litellm, so the LLM tools fail until the skylos[llm] extra is added; the MCP docs page does not mention this. Relative paths resolve against the server's working directory.

Who it suits

Developers who want an assistant to scan a local codebase for dead code, injection flaws or leaked keys, and agents that should check their own edits before a person sees them. Analysis runs on your machine, so it fits private code, but most tools need a skylos.dev account key. With a key, the server must reach skylos.dev for credit checks, so it does not suit offline or air-gapped use. Keyless use is limited to one tool five times a day. If you cannot create an account, the skylos CLI (skylos verify, skylos defend, skylos . -a) runs the same checks locally with no key.

Tools 16

13 only read, 1 changes things, 2 can delete or overwrite. A ? marks an optional parameter.

analyze
Finds unused functions, imports, classes, variables and parameters with confidence scorespath: stringconfidence?: integerexclude_folders?: arrayexpand_advice?: boolean
security_scan
Runs taint analysis and dangerous-call checks for injection, SSRF, path traversal and similar flawspath: stringconfidence?: integerexclude_folders?: arrayexpand_advice?: boolean
quality_check
Reports complexity, nesting, logic patterns and circular dependenciespath: stringconfidence?: integerexclude_folders?: arrayexpand_advice?: boolean
architecture_check
Reports architecture findings for a projectpath: stringconfidence?: integerexclude_folders?: arrayexpand_advice?: boolean
health_score
Gives an overall health assessment, optionally leaving out security, secrets or qualitypath: stringconfidence?: integerinclude_security?: booleaninclude_secrets?: booleaninclude_quality?: booleanexclude_folders?: arrayexpand_advice?: boolean
secrets_scan
Finds hard-coded API keys, tokens, passwords and private keyspath: stringconfidence?: integerexclude_folders?: arrayexpand_advice?: boolean
remediate deletes
Plans fixes for findings; with dry_run false, asks an LLM for fixes and edits filespath: stringmax_fixes?: integerdry_run?: booleanmodel?: stringtest_cmd?: stringseverity?: string
verify_dead_code
Has an LLM review dead-code candidates to cut false positivespath: stringconfidence?: integermodel?: stringmax_verify?: integermax_challenge?: integerexclude_folders?: string
provenance_scan
Attributes changes to agents, bots or people from git signalspath: stringdiff_base?: string
generate_fix deletes
Builds a patch deleting or commenting out dead code; writes it when apply is truepath: stringmode?: stringmin_safety?: numberapply?: boolean
learn_triage changes
Records whether a finding was accepted or dismissed in local project statepath: stringaction_id: stringaction: string
get_triage_suggestions
Suggests accept or dismiss for current findings from recorded decisionspath: string
validate_code_change
Checks a unified diff for regressions and non-existent dependencies before it landsdiff: stringpath?: stringpolicy?: stringcheck_dependencies?: boolean
verify_change
Checks an edited file or line range for AI-code defects such as hallucinated referencespath?: stringfile?: stringline_range?: stringconfidence?: integerproject_context?: booleaninclude_dependency_hallucinations?: booleanexclude_folders?: stringcontract_path?: stringcontract_enabled?: booleaninclude_security_findings?: boolean
verify_agent
Scores an AI agent's guardrails and returns failed checks, OWASP mapping and an attestation digestpath?: stringfail_on?: stringmin_score?: integerowasp_framework?: stringowasp_version?: stringexclude_folders?: string
get_security_context
Summarises a project's frameworks, auth patterns, headers and rate limitingpath: string

Resources 3

skylos://results
Lists saved result runs
skylos://results/latest
The most recent saved result
skylos://results/{run_id}
One saved result by run id

Similar servers