Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/emre-guler/websec/apinpx skills add emre-guler/websec --skill apigit clone --depth 1 https://github.com/emre-guler/websecWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00092 | $0.05750 |
| Opus 5 | $0.00046 | $0.02875 |
| Sonnet 5 | $0.00018 | $0.01150 |
| Haiku 4.5 | $0.00009 | $0.00575 |
Grade A, and why
api scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
| Node / Express, Nest, Mongoose, Prisma | `Object.assign(user, req.body)`, `new User(req.body)`, `Model.create(req.body)`, `findByIdAndUpdate(id, req.body)`, `prisma.user.update({ data: req.body })`, spread `{ ...req.bo How it starts
The opening of the file, as written. The whole thing — 169 lines — stays where its author put it; the contents beside it link to each section on GitHub.
API Surface Detection
Overview
Every dynamic application is built on an API, and the API almost always accepts more than the front end sends: endpoints nobody links to, versions nobody retired, HTTP methods nobody intended, parameters nobody documented, and object properties the framework binds because it binds everything. Separately, when a public handler builds a request to an internal service by pasting user input into a URL, a path segment, or a JSON body, the caller can inject or override parameters in that internal request. Both sit in the same place in the lifecycle — after routing, at the point where the application decides which fields of the request it will honour and how it forwards them onward. The attacker is anyone who can reach the endpoint, usually an authenticated low-privilege user who interacts with the API directly rather than through the UI. What they gain is a property they should not be able to set, an operation the documented surface never offered, or control over a parameter in a request made on their behalf by a component they cannot reach. This skill finds such exposure by locating every binding site, unguarded surface, and internal-request assembly point, checking each one in parallel, and merging the results into <output_dir>/api-results.md.
What it is NOT
This skill's boundary with /websec:access-control is the one that matters most, so state it in every finding.
- Object-level and function-level authorization (
/websec:access-control): "may this caller touch this object or invoke this function". Discriminating test — if the fix is an ownership or role check on a field and an operation that were both intended to exist, it belongs there. This skill owns property-level and surface-level exposure: "does this property bind, does this endpoint or version exist, does this parameter reach an internal request at all". If the fix is removing the field from the binding set, retiring or guarding a route or version, constraining the methods, or encoding input before it is embedded, it belongs here. A body that setsowner_idto another user's id is judged here as a binding failure and cross-referenced there for the authorization consequence. - Server-side request forgery (
/websec:ssrf): the attacker chooses the destination of the outbound request. In parameter pollution the destination is fixed and the attacker steers parameters within the request the application already makes. They chain; classify by which one the code actually permits. - Prototype pollution (
/websec:prototype-pollution): unrelated despite the similar name — that is object-prototype corruption in the runtime, not parameters in a request. - Path traversal (
/websec:path-traversal): traversal that resolves against the filesystem belongs there. Encoded traversal injected into an internal REST path, resolving to a different API resource, is judged here. - GraphQL (
/websec:graphql): a GraphQL endpoint's schema, resolvers, and operation limits belong there. - Injection classes (
/websec:sql-injection,/websec:nosql-injection,/websec:xxe): reached through an API but owned by their own skills. A content-type branch that routes a body into an XML parser is a candidate here; the parser's entity configuration is/websec:xxe. - Model-driven endpoints (
/websec:llm): an endpoint whose request or response passes through a language model, or that exposes a tool the model can call, is judged there — the binding set is decided by a tool definition rather than a serialiser. Test: does a model choose what this endpoint receives or does with the input? - Domain rules on a bindable field (
/websec:business-logic): this skill owns fields that should not be bindable at all — the binding set is too wide and the fix is to remove the property from it. A field the caller is legitimately allowed to send, carrying a value that violates a rule (a negative quantity, a discount past its cap, a backdated effective date), is theirs. Test: should this property bind at all, or does it bind correctly and simply go unvalidated? - Information disclosure (
/websec:information-disclosure): verbose errors that hand back the shape of a valid request are noted, not classified here. - Surface decided outside this tree: which paths, versions, and methods are actually exposed can be a gateway's route table rather than this repository's router. Read the "Enforced where" column and the trust-boundary section of
architecture.mdbefore reporting a stale version or an internal handler as exposed surface — a version tree the edge does not publish is reachable only from inside. Judge that configuration where it is readable; where it is not, the label is NEEDS MANUAL REVIEW naming it. What is judged here: whether the handler is safe when reached directly, since a route unreachable only by convention is reachable to anything already inside the boundary. Binding is different — a body bound onto an entity is a sink in this code, and no external layer changes that. - Not a finding: an extra field in a response that is not bindable on any write path; an endpoint that is merely unlinked but properly authorized; a deprecated version that is documented but not routed; a scanner-style "input was transformed" lead with no traced path.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago First seen · 169 lines · 92 tokens per session scan A 3ff3f5d29c59
api is a skill published in the GitHub repository emre-guler/websec (2 stars, last pushed 5d ago), licensed MIT. It adds 92 tokens to every session and 5,750 once invoked, about $0.0005 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
vantage
Autonomous, artifact-driven SAST (Static Application Security Testing) for web AND mobile app repositories, plus optional code-level remediation. Use whenever the user asks to security-review, pentest, audit, or scan a codebase for vulnerabilities — web (SQLi, XSS, IDOR/BOLA, auth bypass, SSRF, XXE, hardcoded secrets…
prowler-ui
Prowler UI-specific patterns. For generic patterns, see: typescript, react-19, nextjs-16, tailwind-4. Trigger: When working inside ui/ on Prowler-specific conventions (shadcn, folder placement, actions/adapters, shared types/hooks/lib).
prowler-test-api
Testing patterns for Prowler API: JSON:API, Celery tasks, RLS isolation, RBAC. Trigger: When writing tests for api/ (JSON:API requests/assertions, cross-tenant isolation, RBAC, Celery tasks, viewsets/serializers).
prowler-pr
Creates Pull Requests for Prowler following the project template and conventions. Trigger: When working on pull request requirements or creation (PR template sections, PR title Conventional Commits check, changelog gate/no-changelog label), or when inspecting PR-related GitHub workflows like conventional-commit.yml…
tailwind-4
Tailwind CSS 4 patterns and best practices. Trigger: When styling with Tailwind (className, variants, cn()), especially when dynamic styling or CSS variables are involved (no var() in className).
prowler-docs
Prowler documentation style guide and writing standards. Trigger: When writing documentation for Prowler features, tutorials, or guides.