nocturnusai-admin — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited nocturnusai-admin (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
ALL admin operations in this skill are REST-only. There are no MCP tools for database management, tenant management, health checks, metrics, backups, or API key management. Use curl via the Bash tool for every operation in this skill.
Prerequisite: See the nocturnusai-connect skill for server setup, connection configuration, and auth bootstrap details.
Required headers (when applicable):
| Header | When Required |
|---|---|
Content-Type: application/json | All POST/PATCH requests |
X-API-Key: <key> | When auth is LEGACY or RBAC mode |
X-Database: <name> | When targeting a non-default database |
curl http://localhost:9300/admin/databasescurl -X POST http://localhost:9300/admin/databases \
-H "Content-Type: application/json" \
-d '{"name": "my-database"}'Optional field: "defaultConflictStrategy" — one of REJECT (default), NEWEST_WINS, CONFIDENCE, KEEP_BOTH.
curl -X DELETE http://localhost:9300/admin/databases/my-databaseThis is irreversible. All tenants, facts, rules, and memory within the database are permanently destroyed.
curl http://localhost:9300/admin/databases/default/facts \
-H "X-Tenant-ID: my-tenant"Optional query parameter: ?scope=my-scope to filter by scope.
curl http://localhost:9300/admin/databases/default/rules \
-H "X-Tenant-ID: my-tenant"All NocturnusAI databases are forced multi-tenant. You must create at least one tenant before asserting facts or running queries.
curl -X POST http://localhost:9300/admin/databases/default/tenants \
-H "Content-Type: application/json" \
-d '{"tenantId": "my-tenant"}'curl http://localhost:9300/admin/databases/default/tenantscurl -X DELETE http://localhost:9300/admin/databases/default/tenants/my-tenantClears all data in all tenants within a database without deleting the database itself:
curl -X POST http://localhost:9300/admin/databases/default/nukeClears all data in a specific tenant without deleting the tenant:
curl -X POST http://localhost:9300/admin/databases/default/tenants/my-tenant/nukeAll health endpoints bypass authentication.
curl http://localhost:9300/healthReturns JSON with status field ("healthy" or "unhealthy"), database count, storage info, and LLM configuration status. Returns HTTP 503 when unhealthy.
curl http://localhost:9300/health/liveReturns plain text OK. Use for Kubernetes liveness probes.
curl http://localhost:9300/health/readySame as /health — returns full health status with HTTP 503 when unhealthy. Use for Kubernetes readiness probes.
The /metrics endpoint returns Prometheus-format metrics and bypasses authentication.
curl http://localhost:9300/metricsReturns text/plain with counters, gauges, and histograms for HTTP requests, JVM stats, and application metrics. Scrape with Prometheus or any compatible monitoring system.
RBAC must be enabled (AUTH_ENABLED=true) for key management endpoints to work. All key management endpoints (except /auth/status) require an admin API key.
| Role | Permissions |
|---|---|
ADMIN | Full access: read, write, manage keys, admin operations |
WRITER | Read and write facts/rules, query, memory operations |
READER | Read-only: query facts, inspect, context retrieval |
curl http://localhost:9300/auth/statusReturns mode (disabled/legacy/rbac), bootstrapRequired, and keyCount. Bypasses auth.
curl -X POST http://localhost:9300/auth/keys \
-H "Content-Type: application/json" \
-H "X-API-Key: nocturnusai_ak_ADMIN_KEY_HERE" \
-d '{
"name": "agent-key",
"role": "writer",
"databases": ["default"],
"tenants": ["my-tenant"],
"expiresInDays": 90,
"description": "Key for production agent"
}'databases and tenants arrays scope the key. Empty arrays mean unrestricted access to all databases/tenants. Only admin keys can create other admin keys.
Response includes the raw API key (shown only once):
{
"id": "uuid",
"name": "agent-key",
"key": "nocturnusai_ak_...",
"prefix": "nocturnusai_ak_abc",
"role": "writer",
"databases": ["default"],
"tenants": ["my-tenant"],
"expiresAt": "2026-06-11T..."
}curl http://localhost:9300/auth/keys \
-H "X-API-Key: nocturnusai_ak_ADMIN_KEY_HERE"curl http://localhost:9300/auth/keys/KEY_ID \
-H "X-API-Key: nocturnusai_ak_ADMIN_KEY_HERE"curl -X PATCH http://localhost:9300/auth/keys/KEY_ID \
-H "Content-Type: application/json" \
-H "X-API-Key: nocturnusai_ak_ADMIN_KEY_HERE" \
-d '{"enabled": false}'Updatable fields: name, databases, tenants, enabled, description.
curl -X DELETE http://localhost:9300/auth/keys/KEY_ID \
-H "X-API-Key: nocturnusai_ak_ADMIN_KEY_HERE"You cannot revoke your own key. Use a different admin key.
curl http://localhost:9300/auth/whoami \
-H "X-API-Key: nocturnusai_ak_YOUR_KEY"Returns the key's role, permissions, and database/tenant scoping.
curl -X POST http://localhost:9300/admin/backupsOptional query parameter: ?db=my-database (defaults to default).
Creates a full-state JSON snapshot in the backups/ directory relative to the configured STORAGE_DIR.
Both discovery endpoints bypass authentication.
curl http://localhost:9300/llm.txtReturns auto-generated plain-text API documentation designed for LLM consumption. Describes all available endpoints, parameters, and usage patterns.
curl http://localhost:9300/.well-known/agent.jsonReturns an Agent2Agent Protocol discovery document describing NocturnusAI's capabilities, authentication scheme, skills, and protocol support (MCP + REST). Used by other AI agents to discover and interact with NocturnusAI.
curl http://localhost:9300/userguideReturns the bundled USERGUIDE.md in plain text.
# 1. Verify server is running
curl http://localhost:9300/health
# 2. Create a database (or use 'default')
curl -X POST http://localhost:9300/admin/databases \
-H "Content-Type: application/json" \
-d '{"name": "my-app"}'
# 3. Create a tenant (required — all databases are multi-tenant)
curl -X POST http://localhost:9300/admin/databases/my-app/tenants \
-H "Content-Type: application/json" \
-d '{"tenantId": "my-tenant"}'
# 4. Verify by listing tenants
curl http://localhost:9300/admin/databases/my-app/tenantsSee the nocturnusai-connect skill for the full auth bootstrap sequence (starting the server with AUTH_ENABLED=true, bootstrapping the first admin key with POST /auth/bootstrap).
After bootstrap:
# Create a scoped writer key for an agent
curl -X POST http://localhost:9300/auth/keys \
-H "Content-Type: application/json" \
-H "X-API-Key: nocturnusai_ak_ADMIN_KEY" \
-d '{
"name": "agent-writer",
"role": "writer",
"databases": ["my-app"],
"tenants": ["my-tenant"]
}'
# Create a read-only key for monitoring
curl -X POST http://localhost:9300/auth/keys \
-H "Content-Type: application/json" \
-H "X-API-Key: nocturnusai_ak_ADMIN_KEY" \
-d '{
"name": "monitor-reader",
"role": "reader",
"databases": ["my-app"],
"tenants": ["my-tenant"]
}'
# List all keys to verify
curl http://localhost:9300/auth/keys \
-H "X-API-Key: nocturnusai_ak_ADMIN_KEY"# Quick health check
curl http://localhost:9300/health
# Kubernetes-style probes
curl http://localhost:9300/health/live # liveness
curl http://localhost:9300/health/ready # readiness
# Prometheus metrics scrape
curl http://localhost:9300/metricsUse separate databases for dev/staging/prod. The X-Database header selects the target:
# Create environment databases
curl -X POST http://localhost:9300/admin/databases \
-H "Content-Type: application/json" -d '{"name": "dev"}'
curl -X POST http://localhost:9300/admin/databases \
-H "Content-Type: application/json" -d '{"name": "staging"}'
curl -X POST http://localhost:9300/admin/databases \
-H "Content-Type: application/json" -d '{"name": "prod"}'
# Create tenants in each
for db in dev staging prod; do
curl -X POST "http://localhost:9300/admin/databases/$db/tenants" \
-H "Content-Type: application/json" \
-d '{"tenantId": "app"}'
done
# Target a specific environment with X-Database header
curl -X POST http://localhost:9300/tell \
-H "Content-Type: application/json" \
-H "X-Database: staging" \
-H "X-Tenant-ID: app" \
-d '{"predicate": "status", "args": ["deploy", "pending"]}'default database requires a tenant before you can assert facts or run queries.POST /auth/bootstrap only succeeds when no admin keys exist. After the first admin key is created, use POST /auth/keys with an admin key to create additional keys. The bootstrap endpoint is also rate-limited (5 attempts per minute, 5-minute lockout)./health, /health/live, /health/ready, /metrics, /llm.txt, /.well-known/agent.json, /userguide, /auth/status.POST /admin/databases/{name}/nuke clears all data but keeps the database and tenant structure. DELETE /admin/databases/{name} removes the database entirely. Use nuke for data resets; use delete for decommissioning.POST /admin/backups defaults to the default database. Use ?db=my-database to back up a specific database.GET /admin/databases/{name}/facts and /rules require X-Tenant-ID header to specify which tenant's data to list.DELETE /auth/keys/{id} endpoint prevents self-revocation. Use a different admin key to revoke the current one.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.