Claude Marketplaces
SkillsMCP serversMarketplacesDigestTools
Submit

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP servers by category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control
Claude Marketplaces

An independent directory of skills, plugins and MCP servers for Claude Code. Not affiliated with Anthropic.

Browse

  • Skills
  • MCP servers
  • Marketplaces
  • Weekly digest
  • Skill index
  • MCP index
  • Marketplace index

Site

  • About
  • Tools
  • Submit
  • Feedback
  • Privacy
  • llms.txt
  • Plugins reference

Maker

  • Snug
  • Agent Caffeine
  • knobs
  • Wax
  • Vectoys
  • mertduzgun.com
Crafted at
Skills/Security
waynesutton avatar

Convex Security Audit

waynesutton/convexskills

Convex Security Audit provides developers building on the Convex platform with comprehensive patterns and utilities for reviewing and implementing security controls across authorization logic, data access boundaries, action isolation, rate limiting, and sensitive operations. The skill addresses the problem of inconsistent or incomplete security implementation by offering concrete TypeScript examples and audit checklists for role-based access control, permission validation, and protected function patterns. It guides developers to fetch current documentation from Convex's official sources while applying security best practices to production applications.

installs
1.4K
GitHub stars
401
last updated
Aug 21, 2026
View on GitHubSave

Install

$ npx -y skills add waynesutton/convexskills --skill convex-security-audit --agent claude-code

Installs into .claude/skills of the current project.

Files

Convex security audit

Produces a written findings report covering every public function, every table, and every entry point (HTTP routes, file storage, scheduler). The one rule: every exported query, mutation, and action is a public endpoint anyone on the internet can call with any arguments, so each one must prove who the caller is and what they may touch.

For a ten minute pass, use convex-security-check instead. This skill is the slow, complete version.

When to reach for this

  • Before a production launch or a major release
  • After an incident, a leaked key, or suspicious data access
  • When the codebase has grown past a handful of public functions and nobody has mapped who can call what
  • When adding multi tenant, admin, or billing features
  • When the user asks for "a full audit", "security review", or "check the whole backend"

Reference files

  • references/authorization-patterns.md: open when fixing findings, it has the getCurrentUser helper, customQuery and customMutation wrappers for authed, admin, and tenant scoped access, ownership checks through indexes, and role checks.
  • references/attack-surface.md: open during steps 4 through 7, it covers HTTP actions, storage URL leakage, scheduler trust, rate limiting with @convex-dev/rate-limiter, secrets in env, and client supplied IDs.
  • references/audit-report-template.md: open at step 8, it is the findings template and the per table data access matrix to fill in.

Audit procedure

Work through the steps in order. Record every finding as you go. Do not fix anything until the inventory is complete; fixing early hides the shape of the problem.

1. Inventory public functions

List every exported query, mutation, and action. These are the attack surface.

rg -n "export const \w+ = (query|mutation|action)\(" convex --glob '!**/_generated/**'

For each one write down: file, name, type, whether a client needs to call it, and whether it is costly (sends email, calls an LLM, creates records) and so needs a rate limit. Anything only called by other Convex functions, crons, or the scheduler should be internalQuery, internalMutation, or internalAction. Flag each of those as a finding.

2. Map auth per function

For every public function from step 1, answer: does it call ctx.auth.getUserIdentity() (or a helper that does) before reading or writing? Which functions are intentionally anonymous?

rg -l "= (query|mutation|action)\(" convex --glob '!**/_generated/**' \
  | xargs rg -L "getUserIdentity|getCurrentUser|authedQuery|authedMutation"

Files that print here contain public functions with no auth call anywhere in the file. Read each one. Anonymous is fine for a public blog list. It is a critical finding for anything that returns or writes user data.

Check that auth helpers throw or return early on a missing identity, and that role checks read the role from your users table, not from client arguments.

3. Map data access per table

For every table in convex/schema.ts, list which public functions read it, which write it, and what condition scopes the access (owner ID, org membership, role, public flag). Fill in the data access matrix from the report template.

Look for:

  • Reads with no scoping: ctx.db.query("table").collect() inside a public function
  • ctx.db.get(args.someId) followed by a return or patch with no ownership comparison
  • Ownership compared against a spoofable value (email, display name) instead of user._id
  • .filter() used for scoping instead of .withIndex(); this usually means the scoping was an afterthought
  • Return validators that leak fields: v.any(), or spreading a full document that carries passwordHash, stripeCustomerId, or internal flags
rg -n "v\.any\(\)" convex --glob '!**/_generated/**'
rg -n "ctx\.db\.(get|patch|delete|replace)\(args\." convex --glob '!**/_generated/**'

4. Review http.ts

Every route in convex/http.ts is reachable without a Convex client. For each route check: how is the caller verified (webhook signature, bearer token, ctx.auth.getUserIdentity()), is the body validated before use, and does it call only internal.* functions with data it has already verified?

rg -n "http\.route|httpAction\(" convex/http.ts

Webhook handlers that skip signature verification are critical. Routes that call api.* functions from inside an httpAction may be bypassing auth those functions assume they have.

5. Review file storage

Find where upload URLs are generated and where file URLs are returned.

rg -n "storage\.(generateUploadUrl|getUrl|delete)" convex --glob '!**/_generated/**'

generateUploadUrl in a public mutation with no auth lets anyone fill your storage. A query that returns ctx.storage.getUrl(args.fileId) for any ID the client passes is a data leak; the URL works for anyone who holds it.

6. Review scheduled and internal boundaries

Internal functions skip auth by design. The question is whether anything schedules them with unverified input.

rg -n "(runAfter|runAt|runMutation|runAction|interval|cron)\([^)]*\bapi\." convex --glob '!**/_generated/**'

Scheduling an api.* function is a finding: use internal.*. Then trace each internal.* call site back to the public function or route that triggered it and confirm the caller validated ownership before scheduling.

7. Review env and secrets

rg -n -i "(sk_live|sk_test|whsec_|AKIA[0-9A-Z]{16}|-----BEGIN|api[_-]?key\s*[:=]\s*['\"][A-Za-z0-9])" convex src --glob '!**/_generated/**'
rg -n "process\.env\." convex src --glob '!**/_generated/**'

Secrets belong in Convex environment variables (npx convex env set NAME value), read through process.env in the action or HTTP action that makes the external call. A secret literal in source is critical. Anything read from process.env in client code (src/) is public; only non secret VITE_ or NEXT_PUBLIC_ values belong there. Confirm dev and prod deployments use different keys.

8. Write the report

Fill in references/audit-report-template.md. One finding per issue, ordered by severity, each with location, evidence, and a concrete fix. Include the data access matrix. Finish with the list of public functions reviewed and judged correctly anonymous, so the next auditor does not repeat that work.

Severity scale

SeverityMeaningExamples
CriticalAny anonymous caller can read or change other users' data, or a secret is exposedPublic mutation patches a document by client supplied ID with no ownership check; API key in source; webhook with no signature check
HighAn authenticated user can reach data or actions outside their scopeMissing org membership check in a multi tenant query; admin function reads role from client args
MediumDefense in depth gap with no direct exploit todayPublic function that should be internal; no rate limit on a costly action; upload URL with no auth
LowHygienev.any() on a non sensitive arg; missing return validator; .filter() where an index exists

Example finding

Severity: Critical
Location: convex/tasks.ts, updateTask (mutation, public)
Evidence: handler calls ctx.db.patch(args.taskId, { title: args.title }) after
  requireAuth(ctx) but never compares task.userId to the caller. Any signed in
  user can rename any task by guessing or capturing an ID.
Fix: load the task, compare task.userId to user._id, throw on mismatch. See
  references/authorization-patterns.md, "Ownership checks".
Verified: reproduced by calling updateTask with another user's task ID from the
  dashboard function runner.

Common mistakes

MistakeWhy it breaksDo this instead
Treating internalMutation as safe without tracing callersThe public function that schedules it may pass unverified IDsAudit the scheduling call site, not just the internal function
Checking auth only in the UIAnyone can call the function from the dashboard or a scriptEvery public handler checks identity itself
Comparing ownership to identity.emailEmails can be reused or unverified across providersCompare to user._id looked up via tokenIdentifier
Mixing return null and throw for the same caseLeaks record existence through response differencesIn queries, return null for both "not found" and "not yours"
Rate limiting only in the clientAttackers skip the clientUse @convex-dev/rate-limiter inside the mutation or action
Signing off after fixes without re running the grepsFixes often move the problemRe run steps 1 through 7 after remediation

Checklist

  • Every exported query, mutation, action is listed with its intended caller
  • Every function that should be internal is internal*
  • Every public function either checks identity or is documented as intentionally anonymous
  • Every table has a filled row in the data access matrix
  • Every http.ts route verifies its caller and validates its body
  • Upload URL generation and file URL reads are gated by ownership
  • No api.* reference inside scheduler, cron, or ctx.run* calls
  • No secret literals in source; dev and prod use different keys
  • Costly or abusable mutations and actions are rate limited
  • Report written with severity, location, evidence, and fix for each finding

Docs

  • https://docs.convex.dev/llms.txt
  • https://docs.convex.dev/auth/functions-auth
  • https://docs.convex.dev/functions/internal-functions
  • https://docs.convex.dev/functions/http-actions
  • https://docs.convex.dev/production/environment-variables
SKILL.md on GitHub

Sponsors

SnugThe clipboard manager you and your agent can use, safelyAgent CaffeineClose your lid, come back to finished workWaxBlock anything with supervision, without erasing your iPhoneOpen StepsSponsoredFree and open-source skills that make AI coding agents easier to understand, verify, and control.

Details

Repository
github.com/waynesutton/convexskills
Categories
Security, Git & Pull Requests, Code Review & Quality, Databases

More from waynesutton/convexskills

All 14
  • Convex Agents1.4K
  • Avoid Feature Creep1.2K
  • Convex Component Authoring1.1K
  • Convex5.7K
  • Convex Best Practices3.6K
  • Convex Functions2.9K
  • Convex Schema Validator2.8K
  • Convex Realtime2.7K
  • Convex Cron Jobs2.6K
  • Convex Http Actions2.5K
  • Convex Security Check2.5K
  • Convex File Storage2.4K
  • Convex Migrations2.4K

Recommended

More Security
1cap-go avatarcapacitor-securitycap-go/capgo-skillsComprehensive security guide for Capacitor apps using Capsec scanner. Covers 63+ security rules across secrets, storage, network, authentication, cryptography, 1.2Kinstalls
2charleswiltgen avataraxiom-securitycharleswiltgen/axiomUse when storing credentials securely, encrypting data, implementing passkeys, securing AI/agentic features against prompt injection, code signing, or managing 1.2Kinstalls
3mindrally avatarnextauth-authenticationmindrally/skillsGuidelines for implementing NextAuth.js (Auth.js v5) authentication in Next.js applications with session management and security best practices1.1Kinstalls
4vtex avatarvtex-io-security-boundariesvtex/skillsApply when reviewing or designing security-sensitive boundaries in VTEX IO apps. Covers public versus private exposure, trust assumptions at route and integrati1.1Kinstalls
5vtex avatarpayment-pci-securityvtex/skillsApply when handling credit card data, implementing secureProxyUrl flows, or working with payment security and proxy code. Covers PCI DSS compliance, Secure Prox1Kinstalls
6mindrally avatarsecurity-best-practicesmindrally/skillsSecurity best practices for backend development, microservices, and secure coding patterns with emphasis on input validation and authentication937installs