๐ Quick Start
Get from zero to your first governed request in under 5 minutes. This guide covers SOHO tier for both MCP Fortress and PAT Fortress.
Prerequisites
- For MCP Fortress: Claude Team or Enterprise subscription, admin access to at least one SaaS tool
- For PAT Fortress: Claude API access with a Personal Access Token
- Both: Valid email address for Kestra Labs account
MCP Fortress Quick Start
Create Kestra Labs Account
Navigate to admin.kestralabs.com/signup and create your account. Takes ~1 minute.
Choose Tier & User Pack
In the Billing dashboard, select your tier (SOHO starts at $3/user/month per product, or $5/user/month for both) and confirm your pack size.
Add Your First Connector
Go to Vault โ Add Connector. Select a SaaS tool (e.g., Zendesk), paste credentials, and click Save & Test. Takes ~2 minutes.
Configure Role Policies
Go to Policy Radar โ Add Role. Toggle allowed/denied actions for your team role (e.g., allow list_tickets, deny delete_ticket). Takes ~1 minute.
Copy & Configure MCP Endpoint
From the dashboard, copy your MCP endpoint and add it to Claude's settings:
{
"mcpServers": {
"kestralabs": {
"url": "https://gateway.kestralabs.com/v1/mcp",
"headers": {
"x-api-key": "your_org_api_key"
}
}
}
}
Test It
Open Claude and try: "List my open Zendesk tickets." Your first governed request is live!
PAT Fortress Quick Start
Create Kestra Labs Account
If you don't have one already, go to admin.kestralabs.com/signup (~1 minute).
Choose Tier & User Pack
In Billing, select your tier (SOHO is $3/user/month per product, or $5/user/month for both).
Add Your Claude PAT
Go to Vault โ Add PAT. Paste your Claude Personal Access Token, set a label (e.g., "Production"), choose allowed models, and set a spend cap. Click Save & Encrypt.
Get PAT Fortress Endpoint
Copy your PAT Fortress endpoint from the dashboard:
https://pat.kestralabs.com/v1
Update Your Application
Point your app at PAT Fortress instead of api.anthropic.com:
# Before (direct Claude API)
client = Anthropic(api_key="sk-ant-your-real-key")
# After (through PAT Fortress)
client = Anthropic(
api_key="your_org_api_key",
base_url="https://pat.kestralabs.com/v1"
)
โ Success! Your developers never see the real Claude PAT. They authenticate with your org API key. PAT Fortress handles the rest, routing, policy enforcement, spend tracking, and request logging.
What Happens Behind the Scenes
Both MCP Fortress and PAT Fortress follow the same five-layer security flow:
- Identity Layer: Kestra Labs validates your org API key and user context (SSO token if applicable).
- Device Layer (Zero Trust only): Kestra Labs checks device compliance via your MDM provider (Intune, Jamf, Workspace ONE, or Google Endpoint).
- Credential Layer: Encrypted credentials are retrieved from the Vault.
- Policy Layer: Role permissions and conditional rules (rate limits, IP restrictions, time windows) are enforced.
- Access Layer: For MCP Fortress, the SaaS API is called and responses are parsed. For PAT Fortress, the request is proxied to Claude and logged.
๐ MCP Fortress Setup
MCP Connectors are secure, credential-backed integrations to your SaaS tools. Configure them once in the Vault, then control who can use them via Policy Radar.
Credential Types by Tier
Adding a Connector
- Navigate to Vault โ Connectors in the admin dashboard.
- Click Add Connector.
- Select a SaaS tool from the catalog (Zendesk, Slack, GitHub, Jira, Salesforce, etc.).
- Enter your credentials (API key, username/password, OAuth token, or app credentials).
- Click Test Connection to validate. Kestra Labs makes a test API call to the SaaS tool.
- If the test passes, click Save & Deploy. The connector is now ACTIVE.
Connector Lifecycle
| Status | Description | Actions Available |
|---|---|---|
| ACTIVE | Ready to serve requests. Users can call tools on this connector. | Edit, Test, Rotate, Disable, Delete |
| OFFLINE | Connector is temporarily unreachable (API down, network issue, credentials expired). | Retry, Edit, Rotate, Delete |
| PENDING | Connector was just created; test is in progress. | Retry, Delete |
| KILLED | Connector was manually disabled by an admin (e.g., due to detected abuse or credential compromise). | Rotate, Delete, Re-enable |
Testing a Connector
After adding a connector, always run a test. Kestra Labs validates that:
- Credentials are correct and not expired
- The target SaaS API is reachable and responding
- Basic permissions are granted (e.g., read access for test calls)
Test results appear in seconds. If the test fails, check credentials and try again.
โ Bank Tier: Encryption Key Setup If using Bank tier, you must configure a service-managed encryption key in Settings โ Encryption Keys. This key rotates automatically every 90 days. Kestra Labs handles the rotation; no action required from you.
Connector Tools
Once a connector is active, Kestra Labs automatically exposes its available tools to Claude. For example, a Zendesk connector exposes:
list_tickets(status, assignee)get_ticket(id)create_ticket(subject, description, priority)update_ticket(id, status, comment)
Which tools Claude can access is controlled by Policy Radar roles and conditional rules.
๐ PAT Fortress Setup
PAT Fortress is a transparent proxy to the Claude Messages API. Your developers point their apps at pat.kestralabs.com instead of api.anthropic.com. Kestra Labs holds the real Claude PAT and enforces policies.
Adding a Claude PAT
- Navigate to Vault โ PAT Keys in the admin dashboard.
- Click Add PAT Key.
- Paste your Claude Personal Access Token. Copy it directly from Claude.ai's settings.
- Configure controls:
- Label: A friendly name (e.g., "Production PAT", "Dev PAT", "Research PAT")
- Model Allowlist: Select which Claude models this PAT can access. For example, allow only
claude-sonnet-4-5-20250929and denyclaude-opus-4-20250115if desired. Leave blank to allow all models. - Max Tokens per Request: Hard limit on output tokens (e.g., 4000). Requests exceeding this are rejected.
- Monthly Spend Cap: Budget limit in USD. When exceeded, requests are denied until the next month.
- Click Save & Encrypt. PAT is encrypted and stored according to your tier.
PAT Lifecycle
| Status | Meaning | Serving Requests? |
|---|---|---|
| ACTIVE | PAT is ready to handle requests. | Yes |
| ROTATED | This PAT was replaced by a new one. 48-hour overlap window allows existing client apps to use the old key before it expires. | Yes (for 48 hours) |
| REVOKED | Permanently disabled (e.g., security incident, manual revocation). | No |
How Developers Use It
From the developer's perspective, PAT Fortress is a drop-in replacement for api.anthropic.com. The integration is simple:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "org_api_key_from_kestra_labs",
baseURL: "https://pat.kestralabs.com/v1",
});
const message = await client.messages.create({
model: "claude-sonnet-4-5-20250929",
max_tokens: 1024,
messages: [
{ role: "user", content: "Hello!" },
],
});
console.log(message);
Everything else, request body format, response structure, streaming, tool use, remains identical to the Claude API. Developers don't need to learn a new API.
What Gets Logged
Unlike MCP Fortress (which logs policy decisions only), PAT Fortress logs the full request and response:
- Every prompt sent to Claude
- Every response received from Claude
- Token usage (input/output counts)
- Model, timestamp, user/org, IP address
- Spend per request
All logs are archived to encrypted object storage with server-side encryption. This is critical for SOC 2 Type II audits and compliance evidence.
Usage Visibility
PAT Fortress gives admins visibility into how Claude API keys are being used, but Kestra Labs does not bill for token usage. Your Claude API costs are between your organization and Anthropic. The Settings โ PAT Usage dashboard shows per-PAT metrics:
- Request count (total and per-model breakdown)
- Estimated spend based on Anthropic's published rates (for budget planning only)
- Distance to spend cap
Spend caps are a governance feature, they let admins prevent runaway costs by capping how much a given PAT key can consume. Set up email alerts when approaching your cap (e.g., at 80%).
โ Transparent Proxy: PAT Fortress doesn't modify request or response bodies. The response your app receives is exactly what Claude sent, with no added metadata. We only add headers (e.g., x-kestra-request-id) for tracing.
๐ค SSO & SCIM
Centralize identity management for Kestra Labs. Use SSO to log in via your corporate directory, and SCIM to automatically provision and deprovision users.
Supported Identity Providers
- Microsoft Entra ID (Azure AD): SAML 2.0 and OIDC
- Okta: SAML 2.0 and OIDC
- Generic SAML 2.0: Any IdP supporting SAML 2.0
- Generic OIDC: Any IdP supporting OpenID Connect
SAML 2.0 Configuration
To configure SAML 2.0 SSO, you'll need:
- Go to Settings โ Identity & Access โ SAML 2.0 in the admin dashboard.
- Copy the following Kestra Labs identifiers:
- Entity ID:
urn:kestralabs:saml - ACS URL:
https://auth.kestralabs.com/saml/acs - Single Logout URL:
https://auth.kestralabs.com/saml/sls
- Entity ID:
- Provide these to your IdP admin. They'll create an Enterprise Application and give you:
-
- Signing certificate (X.509)
- Sign-in URL
- IdP Entity ID
- Paste the IdP metadata into Kestra Labs. Click Save & Test.
- Test SSO by logging out and visiting
admin.kestralabs.com/login. You'll be redirected to your IdP.
SCIM 2.0 Provisioning
SCIM automatically syncs users and groups from your IdP to Kestra Labs. When a user is added to a group in Entra ID or Okta, they're automatically created in Kestra Labs with the corresponding role.
Enable SCIM in Settings โ Identity & Access โ SCIM:
- Copy the SCIM endpoint and API bearer token.
- Configure in your IdP:
-
- SCIM Endpoint:
https://api.kestralabs.com/scim/v2/org_xxx - Authorization:
Bearer <token> - Content-Type:
application/scim+json
- SCIM Endpoint:
- Test the connection. Your IdP will POST a test request to verify the endpoint.
- Enable user provisioning. New users added to the group will be synced to Kestra Labs in real-time.
Important Notes
โน SSO applies to both products: Once you configure SSO, it applies to both MCP Fortress and PAT Fortress. Users log in once to the admin portal and can access both products. For Bank and Zero Trust tiers, SSO is mandatory for Kestra Labs portal access.
โน SCIM group mapping: SCIM syncs users and group membership. In Kestra Labs, groups are mapped to roles. E.g., "Engineering" group โ "Engineer" role, "Finance" โ "Finance" role. Configure mappings in Settings after enabling SCIM.
๐ก๏ธ Policy Configuration
Policies control who can access what. Configure them visually in the admin dashboard, no JSON required. Kestra Labs supports role-based access control (RBAC) with conditional rules for advanced scenarios.
Three-Layer Policy Architecture
Role Setup
To create a new role:
- Go to Policy Radar โ Roles.
- Click Add Role.
- Enter a name (e.g., "Support Agent", "Engineer", "Finance Manager").
- For each connector or API, toggle allowed actions. Use this table format:
list_ticketscreate_ticketupdate_ticketdelete_ticketread_ledgercreate_invoiceAfter creating the role, assign it to users in Settings โ Users & Groups.
Conditional Rules
Enhance role policies with conditional rules. Configure them in Policy Radar โ Conditional Rules:
user.overage webhook when exceeded.For MCP Fortress: PII Redaction
PII redaction is specific to MCP Fortress (not available for PAT Fortress, which logs full requests). Enable in Policy Radar โ PII Redaction:
/MRN-\d{8}/gi โ MRN-โโโโโโโโWhen enabled, Kestra Labs strips matching patterns from API responses before returning them to Claude. This is logged in the audit trail.
โน Change Log: Every policy change (role created, rule added, PII setting toggled) is logged in Settings โ Change Log. This is an immutable audit trail, perfect for compliance audits and incident response.
๐ก API Reference
Integrate Kestra Labs programmatically. Use the Gateway APIs to route requests, or the Admin API to manage configuration.
MCP Fortress Gateway API
Endpoint
POST https://gateway.kestralabs.com/v1/mcp
Authentication
Include your org API key in the request header:
x-api-key: org_xxxxxx
Request Format
MCP Fortress accepts MCP JSON-RPC 2.0 requests. Tool names follow the connector__action pattern:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "zendesk__list_tickets",
"arguments": { "status": "open" }
}
}
Response Format
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\"tickets\": [{\"id\": 123, \"subject\": \"Login Bug\", \"status\": \"open\"}]}"
}
]
}
}
Error Response
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "Policy denied",
"data": {
"reason": "Tool 'zendesk__close_ticket' is denied for your role"
}
}
}
PAT Fortress Gateway API
Endpoint
POST https://pat.kestralabs.com/v1/messages
Authentication
All tiers require the org API key. Bank and Zero Trust tiers also require an Entra ID bearer token for identity verification:
# SOHO tier (API key only)
x-api-key: org_xxxxxx
# Bank / Zero Trust tiers (API key + Entra ID required)
x-api-key: org_xxxxxx
Authorization: Bearer <entra_id_token>
Request Format
Identical to the Claude Messages API:
{
"model": "claude-sonnet-4-5-20250929",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "What is 2+2?"
}
]
}
Response Format
Identical to Claude API (transparent proxy):
{
"id": "msg_xxx",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "2+2 equals 4."
}
],
"model": "claude-sonnet-4-5-20250929",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 10,
"output_tokens": 5
}
}
Policy Denial Error (MCP & PAT)
If a policy denies access:
{
"error": {
"type": "policy_denied",
"message": "Access denied: model 'claude-sonnet' is not in your allowlist",
"code": 403
}
}
Admin API
Base URL
https://admin.kestralabs.com/api/v1
Authentication
Obtain a identity token (JWT) via /auth/token (username/password or SSO). Include in Authorization header:
Authorization: Bearer <jwt_token>
Existing Endpoints (MCP & Shared)
| Method | Endpoint | Description |
|---|---|---|
| GET | /connectors |
List all MCP connectors for this org |
| POST | /connectors |
Create a new connector |
| PUT | /connectors/{id} |
Update connector (name, label, enabled) |
| DELETE | /connectors/{id} |
Delete a connector |
| GET | /roles |
List all roles in this org |
| POST | /roles |
Create a new role |
| PUT | /roles/{id} |
Update role permissions |
| GET | /audit |
List audit log entries (paginated) |
| GET | /metering/usage |
Get current month usage and spend |
New PAT Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /pat-keys |
List all PAT keys for this org |
| POST | /pat-keys |
Create a new PAT key |
| PUT | /pat-keys/{id} |
Update PAT (label, model allowlist, spend cap) |
| DELETE | /pat-keys/{id} |
Revoke a PAT key (permanent) |
| GET | /pat-keys/{id}/usage |
Get usage stats for a PAT (spend, requests, models) |
New Device Endpoints (Zero Trust)
| Method | Endpoint | Description |
|---|---|---|
| GET | /devices |
List cached devices and their compliance status |
| POST | /devices/check |
Force a posture check for a device (bypasses cache) |
Webhook Events
Kestra Labs can send webhook events to your infrastructure. Configure in Settings โ Webhooks. Supported events:
| Event | Trigger |
|---|---|
request.denied |
A request was denied by policy (MCP or PAT) |
connector.killed |
A connector was killed due to detected abuse or error |
connector.error |
A connector returned an error on a request |
user.overage |
A user exceeded their rate limit or quota |
credential.expiring |
A credential is expiring soon (7 days notice) |
anomaly.detected |
Anomaly detection flagged unusual activity |
pat.spend_cap_reached |
A PAT key reached its monthly spend cap |
pat.model_blocked |
A model was blocked by a PAT's allowlist |
device.noncompliant |
A device failed posture check (Zero Trust only) |
๐ฅ๏ธ Admin Dashboard
The admin dashboard is your central hub for monitoring, configuring, and managing both MCP Fortress and PAT Fortress. All features are accessible via the web UI, no CLI or API calls required.
Status Board
The main landing page gives you a single-glance overview of your entire Kestra Labs deployment:
Policy Radar
Visual policy configuration for both MCP Fortress and PAT Fortress. See the Policies & RBAC section for the full interactive GUI showing roles, conditional rules, and PII redaction.
Traffic Feed
Real-time request stream showing every MCP and PAT request as it happens, think of it like a security camera feed for your AI traffic:
zendesk__list_ticketszendesk__delete_ticketclaude-sonnet-4-5 ยท 1,247 tokensgithub__list_issuesclaude-opus-4-20250115slack__send_messageVault
Secure credential management with two tabs: one for MCP Connector credentials, one for Claude PAT keys:
Change Log
Immutable audit trail of every admin action, who changed what and when. Searchable and exportable for compliance audits:
Billing
Subscription and usage management: view your tier, user pack, invoices, and payment method. See the Billing & Usage section for full details.
Device Registry (Zero Trust Only)
Cached device posture results, see the Device Posture section for the full device registry interface.
Support Tickets
Need help? Submit a support ticket directly from your dashboard, no email required. Every ticket is tracked, prioritized, and routed to the right team automatically.
High (P2): 4-hour response, 1-business-day resolution
Medium (P3): 1-business-day response
Low (P4): 2-business-day response
Zero Trust tier customers get priority routing, your tickets go to the front of the queue.
1. Steps to reproduce the issue
2. Expected vs. actual behavior
3. Screenshots or screen recordings
4. Browser console logs (if applicable)
5. Affected connector or product name
Tickets with reproduction steps are resolved 3x faster on average.
๐ณ Billing & Usage
Simple, transparent pricing for MCP Fortress and PAT Fortress. Purchase individually or bundle both for a discount.
Pricing Tiers
๐ก Bundle & Save: Get both MCP Fortress + PAT Fortress together. Start with one product and add the other anytime, your existing configuration carries over and the bundle discount applies automatically.
How Users Are Counted
Anyone who can access Kestra Labs via SSO or credentials. Users are managed in Settings โ Users & Groups, you must invite or provision users before they can access either product.
Users are counted against your tier's pack size. A SOHO tier holds 2โ5 users. A Bank tier holds 5โ150.
If a user accesses both MCP Fortress and PAT Fortress, they count as one seat at the bundle rate, not two separate seats.
Example: 60 bundle + 5 MCP-only + 3 PAT-only = 68 total seats, not 128.
Overage Pricing
If you exceed your pack size, overage users are billed at 1.25ร the standard rate. Think of it like a cell plan, stay in your data cap and you're fine, go over and you pay a premium per extra unit.
Zero Trust: Overage pricing is negotiated with your account manager.
Billing Cycle & Pro-Rata
Your billing cycle starts on the date you signed up. All user additions mid-cycle are pro-rated, you only pay for the days remaining. Think of it like a gym membership: add a family member halfway through the month, pay half-price for that first month, full price going forward.
Example: Mixed-Product Scenario (Bank Tier)
Billing cycle starts on the 15th. Here's how the invoice builds:
Next full cycle (Feb 15 โ Mar 14), assuming no changes: 60 ร $8 + 5 ร $5 + 3 ร $5 = $520.00/mo.
Bundle Pricing Auto-Applies
The bundle discount is per-user, not per-account. If a single-product user later adds the other product, their rate automatically drops to the bundle rate. No admin action needed.
Pro-rated credit of $2/user/mo applied immediately.
Pro-rated credit of $2/user/mo applied immediately.
Payment & Invoicing
๐ฑ Device Posture
Device posture checks are a Zero Trust tier feature. Before any credential is accessed, Kestra Labs verifies the requesting device is compliant, managed, and encrypted.
Overview
Identity alone is not sufficient in a zero-trust model. Even if a user is authenticated, their device might be compromised, outdated, or unmanaged. Device posture adds a second layer of verification:
- Device Identity: Extract device ID from Entra ID token claims
- Compliance Check: Query your MDM provider for device state
- Access Decision: Grant or deny credential access based on device compliance
- Caching: Cache results for 15 minutes to reduce API calls
Supported Providers
What Gets Checked
Device posture validation checks the following:
- MDM-Managed: Is the device enrolled in your MDM provider (Intune, Jamf, Workspace ONE, or Google Endpoint)?
- Disk Encryption: Is the device's disk encrypted (BitLocker on Windows, FileVault on macOS, dm-crypt on Linux, Chrome OS verified boot)?
- OS Version: Is the OS up-to-date (within N minor versions of latest release)?
- Jailbroken/Rooted: Is the device jailbroken (iOS) or rooted (Android)?
- Compliance Policy: Does the device pass the organization's compliance policy as reported by your MDM provider?
Setup: Intune Integration
- In Kestra Labs, go to Settings โ Device Posture โ Intune.
- Click Connect to Intune. You'll be redirected to Azure consent screen.
- Grant Kestra Labs permission to read device compliance state. This requires a Global Administrator in your Entra ID tenant.
- Return to Kestra Labs. The connection is established.
- Optionally configure Compliance Rules: Set which compliance policies trigger access denial. E.g., "If device compliance policy = 'Failed', deny access."
- Click Save & Test. Kestra Labs will query Intune for a sample device.
Setup: Jamf Integration
- In Jamf Pro, create an API user (e.g., "Kestra Labs") with read-only device access.
- Copy the API username and password.
- In Kestra Labs, go to Settings โ Device Posture โ Jamf.
- Enter your Jamf instance URL (e.g.,
myjamf.jamfcloud.com), username, and password. - Click Test Connection. Kestra Labs queries Jamf to verify credentials.
- Optionally configure Compliance Rules: E.g., "If encrypted != true, deny access."
- Click Save.
Setup: Workspace ONE Integration
- In Workspace ONE UEM console, navigate to Groups & Settings โ System โ Advanced โ API โ REST API and enable API access.
- Create an API key and note your tenant URL (e.g.,
as123.awmdm.com). - In Kestra Labs, go to Settings โ Device Posture โ Workspace ONE.
- Enter your tenant URL, API key, and admin credentials.
- Click Test Connection. Kestra Labs queries Workspace ONE for a sample device.
- Optionally configure Compliance Rules: Map Workspace ONE compliance policies to Kestra Labs access decisions.
- Click Save.
Setup: Google Endpoint Management
- In Google Admin Console, go to Security โ API Controls โ Domain-wide Delegation.
- Add a new client ID for Kestra Labs with the scope
https://www.googleapis.com/auth/admin.directory.device.mobile.readonly. - In Kestra Labs, go to Settings โ Device Posture โ Google Endpoint.
- Click Connect to Google Workspace. You'll be redirected to Google OAuth consent.
- Grant Kestra Labs permission to read device management data. Requires Super Admin role.
- Click Save & Test. Kestra Labs queries Google Endpoint for a sample device.
How It Works at Request Time
When a user makes a request (MCP or PAT):
- Identity Check: Kestra Labs validates the user's org API key and Entra ID token.
- Device Extraction: Kestra Labs extracts the device ID from the Entra ID token claims (e.g.,
deviceidclaim). - Cache Lookup: Check if this device was validated in the last 15 minutes (database TTL). If yes, allow or deny immediately.
- Posture Check: If not cached, call your configured MDM provider's API to fetch device state.
- Compliance Evaluation: Evaluate the device against your compliance rules.
- Decision: If compliant, allow the request and cache the result for 15 minutes. If not, deny and return a
device_noncomplianterror.
Device Registry Dashboard
The Device Registry (in Settings โ Device Posture) shows all cached devices:
| Device ID | User | OS | Compliance Status | Last Check | Actions |
|---|---|---|---|---|---|
| device-abc123 | alice@company.com | Windows 11 Build 22621 | โ PASS | 5 minutes ago | Force Re-check |
| device-def456 | bob@company.com | macOS 14.2 | โ FAIL | 2 minutes ago | Force Re-check |
Force Re-check bypasses the 15-minute cache and immediately re-validates the device. Useful after a user reboots, updates, or installs security patches.
Error Handling
If a device fails posture check:
{
"error": {
"type": "device_noncompliant",
"message": "Device failed compliance check: Encryption status is 'None'",
"device_id": "device-def456"
}
}
The user should:
- Update their device (install OS updates, enable encryption, etc.)
- Wait for the device to re-check with your MDM provider (can take 5โ30 minutes)
- Retry the request. If the device is now compliant, the request succeeds.
โน SOHO & Bank Tiers: Device posture is not available. Identity validation only. Zero Trust tier adds the device layer for true zero-trust security.