Skarn integrations.

Skarn plugs into the agent you already run. The MCP server gives it read-only tools over the session logs and assistant configuration on this machine; the plugins and guard hooks wire the same binary into the hosts that have their own plugin systems. Everything below runs on your machine, the scan makes no network call, and the MCP server exposes no tool that writes anything.

Skarn 0.27.0 - macOS, Linux, and Windows, on x86_64 and ARM64.

The MCP server

skarn mcp starts a stdio Model Context Protocol server on the Skarn binary you already installed. Your client spawns it as a child process and talks to it over the pipe. It needs no account and no license, it opens no socket, and every tool it exposes only reads.

Availability: Skarn 0.25.0.

Tools in the default set

ToolWhat it returnsArgumentsAnnotations
scan_sessionsA redacted scan of the AI coding sessions on this machine, plus a short summary of what leaked and what to rotate first.severity, hours, projectRead-only, non-destructive, closed-world
vet_configsThe masked vet report over the assistant configuration on this machine: hooks, MCP servers, and permission grants.noneRead-only, non-destructive, closed-world
list_sessionsSession metadata: ids, assistant, timestamps, and message, tool and token counts. Never message content, and never a label written inside a transcript.hours, limit, project, cliRead-only, non-destructive, closed-world
session_statsCounts over those sessions: how many per assistant, total messages, how many distinct projects, token totals and estimated cost. No content.hours, project, cliRead-only, non-destructive, closed-world

You can filter by project, but no tool hands the model a project name, a branch or a model id back. Those labels are written inside the transcript, so treating them as data the model reads would put attacker-authored text into the conversation; the tools return structure and counts instead.

Every tool in the table declares itself read-only, non-destructive, and closed-world, so a client that reads those annotations can tell you what a call will do before it runs. Those annotations are the server's own declaration rather than an enforcement mechanism; what stands behind them is that the default set contains no tool that writes and that the scan makes no network call.

Content search, off by default

skarn mcp --enable-recall adds two more tools, search_sessions and get_session. Both pass every session they return through the same redaction mask skarn export uses. search_sessions requires an explicit project or hours scope, so there is no unbounded call; get_session takes one session id, which is its scope. Their tool descriptions say what that means: content that comes back leaves for your model provider, like everything else in the conversation. That is why the flag is off and the default set carries no content-bearing tool.

A tool result pasted back into a session does not re-trigger a finding. The values Skarn hands the model are already masked, and a masked value is not what the detector matches on the next scan.

Add it to your client

Install the binary first, because every declaration below calls skarn on your PATH: brew install skarn-security/tap/skarn, npm install -g @skarn-security/skarn, or a release binary. Install covers every platform. Then paste the block for your client into the file named above it.

claude mcp add, or .mcp.json at your project root

claude mcp add skarn -- skarn mcp

.mcp.json

{ "mcpServers": { "skarn": { "command": "skarn", "args": ["mcp"] } } }

The command writes to your own configuration; the file is what you commit for the whole team, and Claude Code asks each person to approve it the first time.

~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)

{ "mcpServers": { "skarn": { "command": "skarn", "args": ["mcp"] } } }

Settings, Developer, Edit Config opens this file. Quit Claude Desktop and start it again for the server to load.

~/.cursor/mcp.json

{ "mcpServers": { "skarn": { "command": "skarn", "args": ["mcp"] } } }

A project-scoped copy at .cursor/mcp.json in a repository works the same way.

codex mcp add, or ~/.codex/config.toml

codex mcp add skarn -- skarn mcp

~/.codex/config.toml

[mcp_servers.skarn] command = "skarn" args = ["mcp"]

Codex starts the server on demand and gives it ten seconds to come up, which the local binary does not need.

.vscode/mcp.json

{ "servers": { "skarn": { "type": "stdio", "command": "skarn", "args": ["mcp"] } } }

Or add it from a terminal

code --add-mcp '{"name":"skarn","command":"skarn","args":["mcp"]}'

The Copilot CLI reads ~/.copilot/mcp-config.json instead, in the same mcpServers shape the blocks above use.

~/.gemini/settings.json

{ "mcpServers": { "skarn": { "command": "skarn", "args": ["mcp"] } } }

~/.gemini/config/mcp_config.json

{ "mcpServers": { "skarn": { "command": "skarn", "args": ["mcp"] } } }

A workspace copy at .agents/mcp_config.json applies to that workspace only.

grok mcp add, or ~/.grok/config.toml

grok mcp add skarn -- skarn mcp

~/.grok/config.toml

[mcp_servers.skarn] command = "skarn" args = ["mcp"]

~/.codeium/windsurf/mcp_config.json

{ "mcpServers": { "skarn": { "command": "skarn", "args": ["mcp"] } } }

Settings, Tools, AI Assistant, Model Context Protocol (MCP), then paste

{ "mcpServers": { "skarn": { "command": "skarn", "args": ["mcp"] } } }

settings.json

{ "context_servers": { "skarn": { "command": "skarn", "args": ["mcp"] } } }

Without installing the binary

You can run the server straight from npm instead: npx -y @skarn-security/[email protected] mcp. Pin the version, as that line does. Written as a client declaration it looks like this.

{ "mcpServers": { "skarn": { "command": "npx", "args": ["-y", "@skarn-security/[email protected]", "mcp"] } } }

npx fetches the package the first time and caches it, so this form makes a network call the installed binary never makes, and it starts more slowly. The scan itself still makes none.

Each declaration above produces zero findings under skarn vet: the launcher is a bare command on your PATH or a version-pinned package, never an unpinned one that resolves to whatever is newest at the moment your agent starts.

Plugins and hooks per host

A plugin carries configuration, never the binary, so install Skarn first and the hooks call skarn guard on your PATH. Installing a newer Skarn then changes the detection engine without touching the plugin.

HostWhat shipsInstallListing
Claude CodeSkills, guard hooks, and the local MCP declarationclaude plugin marketplace add skarn-security/agent-guard
claude plugin install skarn-guard@skarn
Listing pending
Codex CLISkills and guard hookscodex plugin marketplace add skarn-security/agent-guard
codex plugin add skarn-guard-codex@skarn
Listing pending
CursorSkills, hooks in Cursor's own dialect, and the MCP declarationFrom the repository skarn-security/cursor-pluginListing pending
AntigravitySkills and the MCP declarationThe antigravity/ directory of skarn-security/agent-guardListing pending
Gemini CLIThe extension manifest and its skillsgemini extensions install https://github.com/skarn-security/agent-guardListing pending
Grok BuildReads a Claude Code marketplace nativelyThe same claude plugin marketplace add targetListing pending
MCP RegistryThe server entry com.getskarn/skarnPublished from the release pipelineListing pending
ClineThe MCP server entryFrom the repository skarn-security/agent-guardListing pending
Glama and mcp.soThe MCP server entryFrom the same repositoryListing pending

The hooks ship in audit mode, which reports the verdict they would have reached and never changes what your agent does. Codex asks you to trust the hooks the first time you start it after installing; until you do, they do not run.

Where a row says listing pending, the marketplace entry is not live yet and the repository link above is the install route. No directory URL is printed here until it resolves.

Three things to ask your agent

"Before I hand this branch over, scan my AI coding sessions from the last 24 hours for leaked credentials and tell me what to rotate first."

scan_sessions with hours set to 24. The agent gets the redacted findings and their severity, never the secret itself.

"Vet my assistant configuration and list any hook or MCP server that could send data off this machine or run remote code."

vet_configs. The report comes back masked, with a rule id per finding.

"How many AI coding sessions did I run this week, on which assistants, and what did they cost?"

list_sessions and session_stats. Metadata and counts only, so no message content is read.

With --enable-recall there is a fourth: "Search this week's sessions in project X for the migration decision we made." That one reads your own text, masks it on the way out, and sends what it finds to your model provider.

Support and disclosure

[email protected] for questions about an integration or a marketplace listing. For a vulnerability, write to [email protected] and read the disclosure policy first. The manual is the full command-line reference, and Privacy and Terms cover the rest.

Common questions

Does the MCP server send anything off my machine?
No. skarn mcp runs as a local process your client starts over stdio; it opens no socket and the scan makes no network call. What does leave is whatever the model reads, exactly as with any other tool: that is why every default tool returns redacted findings or metadata rather than your session text.
Does it need a license?
No. skarn mcp and skarn assess need no account and no license. skarn check, the repeatable scan you put in CI, needs a free license issued at getskarn.com/free after a one-time email confirmation and verified offline.
Why is content search off by default?
Because the default tools return findings and metadata, while a content search returns your own text. --enable-recall turns it on and masks every session it returns. search_sessions refuses a call that names no project and no time window; get_session takes one session id, which is the scope it is given.
Why bare skarn rather than npx?
Because an unpinned npx launcher resolves its package when your agent starts it, and Skarn's own skarn vet flags exactly that in a configuration as vet-mcp-unpinned. A bare command on your PATH is the version you installed and checked. The version-pinned npx form is fine and is shown above.

Next: install Skarn, the manual, trust and verification