AI & Claude

Building a Security Audit Skill for Claude Code: AppSec Inside the AI IDE

April 20, 2026 9 min read DevSecOps · AI

Developers used to bounce between their editor, a ticketing system and a separate security dashboard. In 2026 they bounce a lot less — because much of their day now happens inside Claude Code, Cursor, Windsurf and Gemini Code Assist. If a security tool doesn't meet them there, it simply doesn't get adopted.

This post describes how we built the SF365 Claude Code Skill: a zero-install, Python-stdlib-only skill that turns "scan this repo" into a real enterprise-grade scan of an application. Every finding still lands in the full Security Factor 365 portal — dashboards, compliance reports, Slack and Jira notifications — but the developer never has to leave the prompt.

Why a skill, not just an MCP server? SF365 already ships a 28-tool MCP server that AI agents can query. A Claude Code skill is different: it is a self-contained capability the developer explicitly installs and invokes with a slash command. Skills shine for human-in-the-loop workflows where the developer, not the agent, is the conductor.

The design brief

We set four constraints before writing a single line of code:

Architecture in ten seconds

The skill is four small Python files behind one SKILL.md manifest:

skill layout
SF.Skill/
+-- README.md
+-- LICENSE
+-- .gitignore
+-- skills/sf365/
    +-- SKILL.md                  # Claude Code manifest
    +-- scripts/
        +-- sf365_client.py       # HTTP + token cache
        +-- sf365_auth.py         # login / status / logout
        +-- sf365_apps.py         # list applications
        +-- sf365_scan.py         # trigger scan
        +-- sf365_findings.py     # list findings

The SKILL.md describes the skill to Claude — purpose, env vars, when to call which script. The Python scripts speak the SF365 REST API directly. Everything uses urllib.request and json from the standard library.

Authentication without theatre

SF365's mobile REST API already issues signed JWTs via POST /api/mobile/auth/login — we reuse exactly that endpoint. The first time the developer invokes the skill, it reads SF365_EMAIL and SF365_PASSWORD from the environment (or prompts for them), exchanges them for a token, and writes:

credentials cache
~/.sf365/credentials.json       # chmod 0600 on Unix
{
  "token": "eyJhbGciOi...",
  "refreshToken": "base64-entropy...",
  "user": { "id": 1, "email": "you@company.com", ... },
  "baseUrl": "https://sf.peopleworksservices.com"
}

Subsequent commands read the token from that file and attach it as Authorization: Bearer <token>. If the token expires, 401 triggers a one-line prompt to re-authenticate. The developer's plaintext password is never logged, never sent back to Claude, and never written to disk.

The scanning round-trip

A typical session looks like this:

  1. Developer types "scan the current repo with SF365, show me anything Critical".
  2. Claude reads SKILL.md, checks authentication via sf365_auth.py status, and sees we are authenticated.
  3. Claude calls sf365_apps.py to list applications and picks the one whose RepositoryUrl matches the repo the developer has open.
  4. Claude calls sf365_scan.py <appId> Full — this hits the existing anonymous /api/webhooks/generic endpoint, which kicks off all 11 scanner engines and returns the counts.
  5. Claude calls sf365_findings.py <appId> Critical — this GETs /api/mobile/applications/{id}/findings, filters client-side, and returns JSON.
  6. Claude formats the top findings as a markdown table inline in the chat and drops a link to https://sf.peopleworksservices.com/applications/<id> for the full experience.

The total wall-clock time is dominated by the scan itself. The skill adds negligible overhead.

The parts we deliberately did not build

It is worth listing what the skill is not, because those omissions are features:

What we learned shipping it

Three non-obvious lessons from the first week:

Where this is heading

The next iteration will:

None of that is blocking today's workflow. The skill is already the fastest way a developer can go from "I want to scan this" to "here are the three Criticals I need to fix" — without ever leaving the IDE. That shift, more than any dashboard or PDF, is what changes adoption of AppSec.

Put SF365 inside your IDE today

The skill is MIT-licensed and lives in the SF365 repo under SF.Skill/skills/sf365. Install, point it at your portal, run /sf365 scan — you're in.

Explore SF365 Features