Flyingduck Security Assistant
A VS Code extension and bundled MCP server that flag vulnerable Python dependencies and hardcoded secrets while you, or your coding agent, write code.
- Plugin: watches
requirements.txt, pyproject.toml, uv.lock, poetry.lock, Pipfile.lock and requirements.lock, and scans the files you are going to commit for secrets. Findings appear as diagnostics, hovers and a "Flyingduck Security" panel in the Explorer. It catches changes made by hand, by agents and by CLI tools.
- MCP server: exposes two advisory tools,
check_dependencies and check_secrets, so agents can check before they write.
Privacy: source code never leaves the machine. Only {name, version, ecosystem} is sent for CVE lookups. Secret scanning is fully local.
Getting started
- Install the extension. Secret detection works immediately, with no account needed.
- A one-time prompt (and the Flyingduck: Sign in status bar item) asks you to sign in. Paste your API token from the Flyingduck portal. It is verified with Flyingduck before it is saved.
- You're done:
- CVE checks start, and the workspace is rescanned.
- VS Code's agent mode gets the Flyingduck MCP tools automatically.
- Other agents on this machine can share the same sign-in (see below).
The token is stored in VS Code's secret storage and mirrored to ~/.flyingduck/credentials.json (readable only by you). The MCP server reads it from there, so no MCP config ever contains a token. To rotate or sign out, click the status bar item (Update token / Sign out); the change applies everywhere.
When a token expires or is revoked:
- The first rejected check (HTTP 401/403) turns the status bar item into Flyingduck: Token expired and shows one Update Token notification.
- Packages that couldn't be checked are marked "not checked". Agents get the same explanation from the MCP tools, so they can tell you.
- Updating the token re-verifies it, rescans the workspace and restarts the MCP server.
- If the token carries an expiry date (JWT
exp), you're warned about 7 days ahead. The gateway defaults to production, so nothing needs configuring.
Signing out removes the token from this machine (secret storage and ~/.flyingduck/credentials.json) and restarts the MCP server, so agents lose access at the same time:
- Packages already checked keep their cached results. New or changed packages are marked "not checked".
- Secret scanning keeps working; it is local. Only pattern-set updates stop.
- Telemetry stops.
- The token itself stays valid on the server until it expires or an admin revokes it.
The Flyingduck Security panel
Findings are grouped by category, each with a count and per-severity breakdown:
- SCA
- Direct: what your manifest (
requirements.txt / pyproject.toml) declares, at the declared version. If the lockfile is out of sync and resolves a different version, that version keeps its warning on the lockfile line but is not listed here a second time.
- Transitive: packages only in the lockfile.
- Unpinned: declarations without an exact version.
- Secrets: one entry per secret found, with vendor, pattern and line. The matched value is never shown.
The Actions menu (▶ in the panel's title bar) lists everything you can trigger by hand:
| Action |
What it does |
| Scan Workspace for Secrets |
Scans every file you would commit (see below). Also available on the Secrets row. |
| Copy MCP Server Config (other agents) |
See "MCP server for other coding agents". |
| Sign In / Update Token / Sign Out |
Shown according to whether you are signed in. |
When files are scanned for secrets
| Trigger |
Files scanned |
| Workspace opens |
Every file open in an editor tab, including restored tabs VS Code has not loaded yet |
| You open a file |
That file |
| A file is saved, or changes on disk (agent, CLI, git) |
That file; only the changed lines are matched |
| Actions → Scan Workspace for Secrets |
Every file in the workspace, every line, including files nobody opened or edited this session. Cancel stops before the next file; results found so far are kept. |
Always skipped:
- Gitignored files. Findings are about what will be committed. Every
.gitignore from the repository root down applies, plus .git/info/exclude, even when the workspace is a subfolder of the repo. Your global git excludes file (core.excludesFile) is not read.
- Environment, dependency and build folders (
.venv, node_modules, ...), and binary files.
- Files over 2 MB.
MCP server for other coding agents
Run Flyingduck: Copy MCP Server Config (other agents) and paste the result into the agent's MCP settings:
{
"mcpServers": {
"flyingduck-security": {
"command": "node",
"args": ["C:/Users/<you>/.flyingduck/bin/mcp-server.js"]
}
}
}
The command fills in your absolute path; MCP clients don't expand ~. ~/.flyingduck/bin/mcp-server.js is a stable launcher that the extension updates on every activation, so agent configs keep working across extension updates. Requires Node.js 18+ on PATH.
| Optional env var |
Use |
FLYINGDUCK_TOKEN |
CI/headless: a token without signing in (overrides the credentials file) |
FLYINGDUCK_API_BASE_URL |
Testing against a non-production gateway |
FLYINGDUCK_HOME / FLYINGDUCK_CACHE_DIR |
Relocate ~/.flyingduck / its cache |
Current limitations
- Python (PyPI) dependencies only.
- Secret detection uses 20 built-in vendor-prefixed patterns (AWS, GitHub, Slack, Stripe, OpenAI, private keys and more).
- Sign-in is by pasting an API token from the Flyingduck portal.
Support
Questions or problems: support@flyingduck.io