OARS is a production platform for governing, auditing, and standardizing AI agent actions across enterprise systems.
The platform delivers:
- policy enforcement for agent actions
- signed, tamper-evident action receipts
- delegated identity and access control for agents
- compliance evidence automation for audits and regulatory programs
This repository contains the production-oriented TypeScript reference implementation, SDK, conformance suite, operational tooling, and execution-ready documentation for building OARS end-to-end.
docs/README.mddocs/01-strategy/vision.mddocs/02-product/product-requirements.mddocs/02-product/use-cases.mddocs/03-architecture/system-architecture.mddocs/03-architecture/receipt-specification.mddocs/03-architecture/api-specification.mddocs/03-architecture/integration-patterns.mddocs/03-architecture/sdk.mddocs/04-security/security-architecture.mddocs/04-security/threat-model.mddocs/04-security/security-verification-checklist.mddocs/05-compliance/compliance-mapping.mddocs/05-compliance/evidence-operations.mddocs/06-delivery/full-build-plan.mddocs/06-delivery/work-breakdown.mddocs/06-delivery/testing-strategy.mddocs/06-delivery/implementation-status.mddocs/06-delivery/remaining-work-master-checklist.mddocs/06-delivery/full-depth-review.mddocs/06-delivery/productionization-master-checklist.mddocs/07-operations/operations-manual.mddocs/07-operations/runbooks.mddocs/07-operations/runbooks/backup-restore-validation.mddocs/07-operations/dr-drill-evidence-log.mddocs/07-operations/container-deployment.mddocs/07-operations/enterprise-deployment-checklist.mddocs/08-adoption/standardization-playbook.mddocs/08-adoption/pilot-program.mddocs/08-adoption/pilot-evidence.mddocs/09-governance/governance-model.mddocs/09-governance/decision-log.mddocs/09-governance/risk-register.mdopen-spec/oars-profile-v1.jsonopen-spec/compatibility-policy.mdopen-spec/conformance-suite.md
OARS runs between agents and enterprise systems.
It provides:
- Action mediation and policy checks before execution.
- Approval workflows for risky operations.
- Signed receipts for every approved, denied, or failed action.
- Immutable receipt storage and verification APIs.
- Real-time monitoring, alerting, and evidence packaging.
- Security by default.
- Auditability by construction.
- Vendor-neutral interoperability.
- Strong operational reliability.
- Compliance automation as an output, not an afterthought.
Node.js 24 and npm 11.16 are required.
npm ci
npm run devAPI base URL: http://localhost:8080
Environment: see .env.example for the recommended variables (especially for production secrets).
docker compose up --buildNote: the provided compose files set NODE_ENV=development for local use. In production (NODE_ENV=production),
you must provide non-development secrets (see Auth / runtime config).
Postgres-backed store:
docker compose -f docker-compose.postgres.yml up --buildUseful commands:
npm run check(type-check, unit/integration tests, and build)npm run typechecknpm testnpm run security:checknpm run buildnpm run perf:smokenpm run conformancenpm run release:gatenpm run test:docker(runs Postgres-backed integration tests; requires Docker Engine)npm run backup:create -- --reason="scheduled_backup"npm run backup:restore -- --backupId=<backup_id> --reason="restore_rehearsal"npm run backup:drill -- --reason="quarterly_drill"
An embedded TypeScript SDK is available as a package subpath export. See docs/03-architecture/sdk.md.
All /v1/* endpoints require Authorization: Bearer <token>.
Mutating endpoints may accept Idempotency-Key to safely replay requests.
Idempotency records have a configurable minimum replay window (24 hours by default). Records become eligible for
pruning after OARS_IDEMPOTENCY_TTL_SECONDS and may remain until the next
OARS_IDEMPOTENCY_PRUNE_INTERVAL_SECONDS cycle. Reusing a key after its record is pruned is treated as a new request.
This retention applies only to idempotency replay records; actions, receipts, security events, and audit evidence are
not pruned by this scheduler.
Default dev tokens:
dev_admin_tokendev_operator_tokendev_auditor_token
In production (NODE_ENV=production), dev tokens are disabled by default. To explicitly allow them (not recommended),
set OARS_ALLOW_DEV_TOKENS_IN_PRODUCTION=true.
You can override token config with OARS_API_TOKENS (JSON array).
Example:
curl -X GET "http://localhost:8080/v1/connectors" -H "Authorization: Bearer dev_admin_token"If OARS_MTLS_ENABLED=true, service-role tokens must present a workload identity. Supported modes:
OARS_MTLS_MODE=header(legacy): clients (or a trusted mTLS-terminating proxy) must forward headers:x-oars-mtls-subjectx-oars-mtls-fingerprint- when attestation secret is configured:
x-oars-mtls-issued-at,x-oars-mtls-signature
OARS_MTLS_MODE=tls(recommended): run the API with TLS client certificates enabled. OARS derives the same headers from the verified TLS peer certificate and overwrites any presented header values.
See docker-compose.mtls.yml for a self-contained local reference.
- Contributing guide:
CONTRIBUTING.md - Security policy:
SECURITY.md - Code of conduct:
CODE_OF_CONDUCT.md
Runtime config:
OARS_ALLOWED_TOOLScomma-separated connector allowlist (example:jira,slack)OARS_ALERT_CHANNELSJSON array of outbound alert channels (generic_webhook,slack_webhook,pagerduty_events_v2)OARS_ALERT_WEBHOOK_URLlegacy single-channel alert webhook sink (mapped aslegacy_alert_webhook)OARS_SIEM_WEBHOOK_URLoptional security event webhook sinkOARS_SIEM_FILE_PATHoptional newline-delimited JSON event file pathOARS_SIEM_TARGETSJSON array of SIEM targets (generic_webhook,splunk_hec,datadog_logs,sentinel_log_analytics)OARS_SIEM_RETRY_AUTO_STARTauto-start SIEM retry scheduler (true/false)OARS_SIEM_RETRY_INTERVAL_SECONDSretry intervalOARS_SIEM_RETRY_MAX_ATTEMPTSmax retry attempts per event/targetOARS_SIEM_RETRY_QUEUE_PATHpersistent SIEM retry queue file pathOARS_SIEM_RETRY_MAX_QUEUE_SIZEmax in-memory/persisted retry queue size before backpressure dropsOARS_JWT_SECRETsigning secret for JWT access tokensOARS_JWT_ISSUERJWT issuer value (defaultoars.local)OARS_JWT_AUDIENCEJWT audience value (defaultoars-api)OARS_TRUSTED_JWKSJSON array of trusted external IdP providers (issuer/audience/JWKS)OARS_JWKS_AUTO_REFRESH_ENABLEDenable background JWKS refresh scheduler (true/false)OARS_JWKS_AUTO_REFRESH_INTERVAL_SECONDSscheduler interval in seconds (minimum30)OARS_IDEMPOTENCY_TTL_SECONDSminimum idempotency replay window in seconds (default86400, minimum60)OARS_IDEMPOTENCY_PRUNE_INTERVAL_SECONDSidempotency prune interval in seconds (default3600, minimum30)OARS_APPROVAL_STEP_UP_SECRETshared step-up code required for critical approval decisions (defaultstepup_dev_code)OARS_IMMUTABLE_LEDGER_PATHappend-only immutable ledger file path for receipts and security eventsOARS_VAULT_KEYencryption secret for connector vault entries (default is development-only value)OARS_DASHBOARD_ENABLEDenable/dashboardin production (true/false; defaultfalsein production)OARS_DATA_ENCRYPTION_KEYencryption key for sensitive persisted payload fieldsOARS_DATA_ENCRYPTION_ENABLEDenable/disable field-level at-rest encryption (true/false)OARS_STOREpersistence backend selector (fileorpostgres)OARS_POSTGRES_URLPostgres connection string used whenOARS_STORE=postgresOARS_BACKPLANE_MODEexecution mode (inlineorqueue)OARS_BACKPLANE_DRIVERbackplane driver (postgresorfile)OARS_BACKPLANE_LOCK_TIMEOUT_SECONDSreclaim running jobs after this timeoutOARS_BACKPLANE_MAX_ATTEMPTSmax attempts before dead-letterOARS_BACKPLANE_RETRY_DELAY_SECONDSdelay before retrying a failed jobOARS_MCP_UPSTREAMSJSON array of MCP upstream servers (id,url, optionalheaders)OARS_MCP_ALLOW_PRIVATE_NETWORKallow private-network upstream URLs (true/false)OARS_MCP_TOOL_CACHE_TTL_SECONDStool list cache TTL for MCP proxyOARS_MCP_ALLOWED_ORIGINSoptional Origin allowlist for/mcprequests (comma-separated; supports*)OARS_BACKUP_ROOT_PATHbackup artifact root directoryOARS_DR_DRILL_REPORTS_PATHdisaster recovery drill report directoryOARS_DR_DRILL_WORKSPACE_PATHtemporary drill workspace directory
OARS_MTLS_ENABLEDenforce workload mTLS identity checks for service-role tokens (true/false)OARS_MTLS_MODEworkload identity mode (headerortls)OARS_MTLS_TRUSTED_IDENTITIES_FILEpath to JSON file containing trusted identities (same schema asOARS_MTLS_TRUSTED_IDENTITIES)OARS_MTLS_TRUSTED_IDENTITIESJSON array of trusted workload identities (subject,fingerprintSha256, optionalserviceAccountId,tenantIds)OARS_MTLS_ATTESTATION_SECREToptional HMAC secret for forwarded mTLS attestation headersOARS_MTLS_MAX_CLOCK_SKEW_SECONDSmax allowed timestamp skew for mTLS attestation validationOARS_TLS_CERT_PATHTLS server certificate (PEM)OARS_TLS_KEY_PATHTLS server private key (PEM)OARS_MTLS_CA_PATHCA bundle for validating client certs (PEM)
Security hardening: when NODE_ENV=production, OARS requires OARS_JWT_SECRET, OARS_VAULT_KEY, and
OARS_APPROVAL_STEP_UP_SECRET to be set to non-development values. To bypass this check (not recommended), set
OARS_ALLOW_INSECURE_DEFAULTS=1.
- A client (agent SDK, MCP client, or any service) submits an action request.
- OARS authenticates the caller (static token or JWT) and resolves tenant context.
- OARS evaluates policy + risk and optionally routes through an approval workflow.
- If approved, OARS executes via a connector (or queues execution when backplane is enabled).
- OARS emits signed, tamper-evident receipts and security events for auditing and compliance evidence.
Integration options:
- REST API: call
/v1/*endpoints directly. - TypeScript SDK: import the
./sdksubpath export described indocs/03-architecture/sdk.md. - MCP Proxy: connect to
/mcpto use upstream MCP tools with OARS policy/receipt controls (docs/03-architecture/mcp-proxy.md).
- Full API spec:
docs/03-architecture/api-specification.md - Source of truth (implemented routes):
src/api/routes/
Key entrypoints:
GET /healthPOST /v1/actionsandGET /v1/actions/:actionIdPOST /v1/receipts/verifyPOST/GET /mcp(MCP Streamable HTTP)
Start the API:
npm ci
npm run devConfirm it’s up:
curl http://localhost:8080/healthCall an authenticated endpoint (dev token):
curl http://localhost:8080/v1/connectors -H "Authorization: Bearer dev_admin_token"Submit an action (returns actionId):
curl -X POST http://localhost:8080/v1/actions \
-H "Authorization: Bearer dev_admin_token" \
-H "Content-Type: application/json" \
-d '{"tenantId":"tenant_alpha","agentId":"demo_agent","userContext":{"userId":"demo_user"},"resource":{"toolId":"jira","operation":"create_ticket","target":"project:SEC"},"input":{"title":"Test ticket","description":"Hello from OARS demo"}}'Fetch the action + receipts:
curl http://localhost:8080/v1/actions/<actionId> -H "Authorization: Bearer dev_admin_token"Verify a receipt signature:
curl -X POST http://localhost:8080/v1/receipts/verify \
-H "Authorization: Bearer dev_admin_token" \
-H "Content-Type: application/json" \
-d '{"receiptId":"<receiptId>"}'Apache-2.0 (see LICENSE).