A side-by-side look at the AtlaSent MCP Server and Vulnify MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose AtlaSent MCP Server for security work as a local process; choose Vulnify for security as a local process. You can also run both side by side in one mcpServers block.
ATLASENT_MODE, ATLASENT_API_KEY, ATLASENT_BASE_URL.evaluate, verify_permit, deploy_service.VULNIFY_API_KEY.check_action, decide_action, get_decision.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Security | Security |
| Quality signal | 63/100 · Good | 63/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | Not declared |
| Pricing | Freemium | Not declared |
| Required env vars | ATLASENT_MODEATLASENT_API_KEYATLASENT_BASE_URL | VULNIFY_API_KEY |
| Verified owner | Community listing | Community listing |
| GitHub stars | 0 | 2 |
| Directory activity | 1 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 20 | 7 |
| Full listing | View AtlaSent MCP Server | View Vulnify |
evaluateCall this BEFORE performing any sensitive action. Returns a Decision: `allow` (verify the returned permit_token at the execution boundary before proceeding), `deny` (you MUST NOT proceed), or `hold` (do not proceed; route for review).verify_permitCall this AFTER `evaluate` returns allow and BEFORE the protected native side effect. It verifies the permit for the presented execution context. Proceed only when `valid` is true; expired, invalid, replayed, mismatched, or error outcomes must block the action.deploy_serviceExample protected tool. Every call is authorized AND its Permit is verified by AtlaSent before the deploy runs. Denied, held, expired, replayed, mismatched, or unverifiable calls are blocked and never touch the target system.atlasent_evaluateEvaluate an action against your published AtlaSent policies. Returns allow/deny/hold/escalate with a permitToken on allow. Use this when ATLASENT_MODE=remote and you need to gate an action against your hosted policy engine. For agent.* actions the result may carry bound_payload_hash and bound_actor_id: pass them to verify_permit as payload_hash and actor_id, since the permit is bound to them.atlasent_list_policiesList all constraint bundles / policies for this organization.atlasent_list_audit_eventsRetrieve recent evaluation events from the audit log.atlasent_explain_authorityExplain why a principal currently has (or lacks) authority for a scope. Answers 'why may principal P exercise scope/action A in organization O right now?' — strictly read-only, does not change /v1-evaluate, /v1-verify-permit, or any deny/hold/allow semantics; it explains the same facts those paths already read. Every matched authority mechanism (direct_grant, delegation, role_capability) is reported as its own path entry; every excluded or ambiguous relationship is reported as its own unresolved finding.atlasent_integrity_auditAudit the organization's authority graph for internal inconsistency and return the report verbatim. Strictly read-only; changes no policy, permit, or decision. THIS IS NOT A PASS/FAIL HEALTH CHECK and the tool synthesizes no verdict of its own. Each finding carries a three-way `classification`: `defect` is a genuine inconsistency; `non_exercisable` is frequently the CORRECT, healthy state (e.g. an expired grant that is supposed to be expired) and must not be read as a failure; `unresolved` means the proposition COULD NOT BE VERIFIED and must never be treated as clean. Read `summary.audited_scope` before drawing any conclusion from an empty findings list — a short decision window is not an absence of findings. If the audit cannot complete, the server refuses rather than returning a partial report, and this tool surfaces that as an error — never an empty report.atlasent_list_permitsList issued permit tokens for audit and monitoring.atlasent_await_approvalWait for a person to approve or reject a held action in the AtlaSent console. Use the approval_request_id from a 'hold' result. This tool cannot approve anything; it only waits. If approved, it returns a permit_token that you MUST verify with verify_permit before running the action. Any other outcome (rejected, expired, timed out) means the action must not run.atlasent_lookup_actionLook up canonical action specifications from the Authorization Intelligence Library. Returns the permanent canon_id, gate flags (requires_human_approval, requires_mfa, requires_verified_actor, requires_state_snapshot), authorization pattern, risk posture, AI risk classification, regulatory mappings, evidence requirements, and the action's knowledge-graph relationships (what it requires and produces, and which frameworks / control objectives it satisfies) for every governed action type in the Canon. Use `slug` for an exact match (e.g. 'production.deploy') or `query` to describe what you want to do in plain language (e.g. 'deploy the api service to prod', 'grant admin access', 'close the books'). `query` is ranked offline against the vendored Canon and returns a `retrieval` block with `confidence` = confident | ambiguous | none — act only on `confident`; the tool never invents an action type, and a `none` result means the Canon has no such action (see the hint). Omit both to list the full Canon.atlasent_atlas_lookupLook up a canonical AtlaSent concept from the Knowledge Atlas — the compiled graph of the system's own vocabulary (Caller, Authority, Policy, Decision, Permit, Verification, Evidence, Audit Chain, Gate, Trust Root, ...). Returns the concept's canonical definition (its source-of-truth doc), its relationships (what it depends on and what depends on it), the surfaces that realize it, and its ADR / API / SDK / implementation anchors — so every AI host reasons from the same canonical knowledge instead of guessing. Use `id` for an exact concept id (e.g. 'permit', 'audit-chain', 'gate') or `query` for a case-insensitive substring search across id, term, and definition. Omit both to list every concept.check_actionUse for what-if questions when you are not about to act. Dry-run a proposed action against the organization policies (POST /v1/policies/test, one case, stored policies). This skips the PII scan and records nothing: no security event and no audit entry. There is no content field and no DLP scan. The result has no event id and no finalDecision. decide_action is the call that records a decision. Dry runs are limited to 60 requests per minute per key. test_policies covers up to 200 cases in one call.decide_actionCall this before a consequential action with any tool or connector: sending an email or message, exporting or sharing data, deleting data, writing to production or financial records, payments, or external API writes. ALLOW: proceed. REVIEW: hold the action, tell the user it waits for approval in Vulnify, and check again with get_decision. BLOCK: skip the action and explain the reasons. Records a decision for a proposed action (POST /v1/events). This writes a security event and an audit entry, counts toward the organization quota, and may open a human review. The finalDecision field is the authoritative result. decision is what was stored and does not change when a review is resolved. finalDecision stays REVIEW until a human approves, denies, or the review expires. This tool does not approve the review. A REVIEW or BLOCK finalDecision means the action was not allowed. Optional content is scanned in memory and is not stored. An idempotencyKey makes a retry return the same event.get_decisionRead a recorded decision (GET /v1/events/{id}), including a REVIEW. finalDecision is REVIEW while the review is pending, then ALLOW after approval or BLOCK after denial or expiry. decision itself does not change. The finalDecision field is the authoritative result. waitMs polls until finalDecision is ALLOW or BLOCK, or until the bounded wait elapses (30 seconds maximum). waitTimedOut is true when the wait ended and finalDecision is still REVIEW. This does not approve or deny the review.list_policiesList the organization policies as code (GET /v1/policies). Returns apiVersion vulnify.io/v1 and policies sorted by name. Read-only. Any non-revoked API key of the organization may call it. Limited to 60 requests per minute per key.test_policiesEvaluate up to 200 policy cases without recording an event (POST /v1/policies/test). When policies is omitted, the enabled stored policies are used. When policies is set, those proposed policies are evaluated instead and nothing is written. This skips the PII scan: cases have no content field. pass is null when a case omits expect. One call covers up to 200 cases. Limited to 60 requests per minute per key.plan_policy_changesDiff policy creates, updates, and deletes without writing them (POST /v1/policies/apply). dryRun is forced to true and cannot be turned off. Nothing is stored and no audit entry is written. prune only marks missing policies for deletion in the plan. Requires an org-wide LIVE API key; a TEST key or an agent-bound key is refused with 403. This tool does not apply the plan.check_mcp_tool_callRecords a decision for a downstream MCP tool call (POST /v1/gateway/mcp). Vulnify maps the tool name to an action by substring and returns the same recorded decision as decide_action, including an id. This writes a security event and an audit entry. The tool arguments are not executed. The finalDecision field is the authoritative result. A REVIEW or BLOCK finalDecision means the downstream tool was not allowed. This server cannot approve the review. An idempotencyKey makes a retry return the same event.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"atlasent-mcp-server": {
"command": "npx",
"args": [
"-y",
"@atlasent/mcp-server"
],
"env": {
"ATLASENT_MODE": "YOUR_ATLASENT_MODE_HERE",
"ATLASENT_API_KEY": "YOUR_ATLASENT_API_KEY_HERE",
"ATLASENT_BASE_URL": "YOUR_ATLASENT_BASE_URL_HERE"
}
}
}
}
{
"mcpServers": {
"vulnify": {
"command": "npx",
"args": [
"-y",
"@vulnify/mcp"
],
"env": {
"VULNIFY_API_KEY": "YOUR_VULNIFY_API_KEY_HERE"
}
}
}
}