Skip to main content

servicenow-cli

CI crates.io PyPI License: MIT

Fast, safe, human-friendly ServiceNow operations from the terminal.

servicenow is an unofficial open-source CLI for people, scripts, and agents. It pairs focused daily workflows with generic Table API access, works through supported instance APIs, and requires no instance-side CLI plugin.

$ servicenow incidents mine
┌────────────┬──────────────┬─────────────────┬─────────────┬──────────┬─────────────────────┐
│ NUMBER     │ PRIORITY     │ DESCRIPTION     │ STATE       │ ASSIGNEE │ UPDATED             │
╞════════════╪══════════════╪═════════════════╪═════════════╪══════════╪═════════════════════╡
│ INC0010042 │ 2 - High     │ VPN unavailable │ In Progress │ Ada      │ 2026-08-22 10:30:00 │
└────────────┴──────────────┴─────────────────┴─────────────┴──────────┴─────────────────────┘

Why it feels different

  • Workflow-first commands for incidents and attachments, with every table still available.
  • Human inputs such as incident numbers, user names, emails, group names, and @me; no routine sys_id hunting.
  • Zero-admin browser sign-in for SSO instances, with managed OAuth available when administrators provide it.
  • Credentials in the operating-system keychain, with a permission-locked file fallback for environments such as WSL2 that do not provide a credential service.
  • Beautiful responsive tables for humans; deterministic JSON, JSONL, YAML, and CSV for automation.
  • Read-only profiles, semantic editor patches, dry runs, and explicit dangerous operation confirmation.
  • Stable error kinds and exit codes for scripts and agents.

Install

Both packages install the servicenow binary:

cargo install servicenow-cli --locked

# or
pipx install servicenow-cli

From a checkout:

cargo install --path .

Two-minute start

# Detects SSO and opens a private browser window; no OAuth app is required.
servicenow init work --instance company

# Managed OAuth remains available when your organization provides a client ID:
servicenow auth login work --instance company --method oauth \
  --client-id YOUR_CLIENT_ID

# On headless Linux/WSL2, choose the permission-locked file fallback directly:
servicenow init work --instance company --insecure-storage

servicenow doctor
servicenow incidents mine
servicenow incidents show INC0010042

# Or stay in the terminal and browse interactively
servicenow tui

For browser SSO, OAuth, bearer-token, CI, migration, and production-profile guidance, see Authentication and profiles.

Interactive terminal browser

Launch the read-only Ratatui interface on incidents, or start directly on any standard or custom table:

servicenow tui
servicenow tui cmdb_ci
servicenow tui change_request --query 'active=true^ORDERBYDESCsys_updated_on'

The ledger adapts to the terminal width: wide terminals keep the selected record's field sheet beside the index, while compact terminals open that sheet on demand. Use / or j/k to move, enter to inspect, / to apply an encoded query, t to change tables, n/p to page, and ? for the complete keyboard map. Press o to hand the selected record off to the ServiceNow web interface.

Incident inspection unfolds into four read-only views: Overview shows every readable field, Activity shows recent comments and work notes, Attachments lists file metadata, and SLAs shows task-SLA progress and breach state. Move between them with tab/shift-tab or jump directly with 14; related views load only when opened, return up to 100 recent entries, and can be retried independently with r. Access remains subject to the active ServiceNow user's table and field ACLs.

The first TUI release deliberately performs no ServiceNow writes. It reuses the active profile and credentials, keeps secrets out of the rendered state, honors --no-color, and refuses to start when stdin or stdout is not an interactive terminal. Fields whose names identify passwords, secrets, tokens, cookies, credentials, authorization values, or private/API keys are always shown as [REDACTED].

Incident workflows

# Find work
servicenow incidents list --active
servicenow incidents list --query 'priority=1^ORDERBYDESCsys_updated_on'
servicenow incidents mine
servicenow incidents show INC0010042

# Create and update
servicenow incidents create \
  --short-description "VPN unavailable" \
  --description "Unable to connect since 08:30" \
  --impact 2 --urgency 2

servicenow incidents update INC0010042 --state 2

# Focused daily actions
servicenow incidents note INC0010042 "Investigating the gateway"
servicenow incidents assign INC0010042 --to ada@example.com --group "Network"
servicenow incidents open INC0010042
servicenow incidents watch INC0010042

Edit safely in $EDITOR. The document contains only curated editable fields; the CLI shows a diff, confirms, and PATCHes only values that changed:

servicenow incidents edit INC0010042

# Review a non-interactive plan without writing, even on a read-only profile.
servicenow incidents edit INC0010042 --file incident.yaml --dry-run
servicenow incidents note INC0010042 --file note.md --dry-run
servicenow incidents assign INC0010042 --to @me --dry-run

Use repeated --field name=value arguments for instance-specific fields. Values that parse as JSON retain their JSON type.

Attachment workflows

Attachment commands work with any table. Records can be identified by number, sys_id, or a form URL copied from the configured ServiceNow instance:

# Discover files without looking up the incident sys_id
servicenow attachments list incident INC0010042

# Stream the upload, infer text/plain, and keep status output off stdout
servicenow attachments upload incident INC0010042 ./diagnostic.txt

# Preview writes even when the active profile is read-only
servicenow attachments upload incident INC0010042 ./diagnostic.txt --dry-run

# Download atomically; existing files are never replaced accidentally
servicenow attachments download 0123456789abcdef0123456789abcdef ./downloads/
servicenow attachments download 0123456789abcdef0123456789abcdef - > diagnostic.txt

# Inspect the exact deletion before permanently removing the attachment
servicenow attachments delete 0123456789abcdef0123456789abcdef --dry-run
servicenow attachments delete 0123456789abcdef0123456789abcdef --yes

Uploads and downloads are streamed rather than loaded entirely into memory. Server-provided file names are reduced to a safe local basename, downloads use a temporary file plus atomic persistence, and replacing a local file requires --force. Upload and delete operations honor profile-level read-only mode.

Discover your instance

ServiceNow tables, choices, and custom fields vary by instance. The CLI can cache its dictionary locally and resolve human references before writes:

servicenow schema incident --refresh
servicenow choices incident state
servicenow resolve user ada@example.com
servicenow resolve group "Network"

# Inspect the full offline contract, or one token-efficient command
servicenow schema
servicenow schema --command 'incidents list'

Cached metadata contains no credentials or record data.

Every ServiceNow table

Focused commands never take away generic access:

servicenow tables list cmdb_ci \
  --query 'operational_status=1' \
  --fields sys_id,name,sys_class_name --limit 100

servicenow tables get cmdb_ci 0123456789abcdef0123456789abcdef
servicenow tables create u_example --data '{"name":"Demo","active":true}'
servicenow tables update u_example 0123456789abcdef0123456789abcdef \
  --field active=false
servicenow tables delete u_example 0123456789abcdef0123456789abcdef --yes

Only records and fields allowed by the authenticated user's ServiceNow ACLs are available.

Output and automation contract

Interactive stdout uses a table. Piped stdout automatically becomes JSON. An explicit format always wins:

servicenow incidents list --output json
servicenow incidents list --output jsonl
servicenow incidents list --output yaml
servicenow incidents list --output csv
servicenow incidents list --output table

Incident tables prefer ServiceNow display values and curated columns. Machine output intentionally keeps raw values by default for stable automation. Use --display-value false|true|all to override either behavior explicitly.

Data goes to stdout; status messages and errors go to stderr. --quiet suppresses status messages. --no-color and the NO_COLOR environment variable disable ANSI color. During browser authentication, --verbose streams timestamped, secret-free handoff milestones to stderr:

servicenow auth login work --method browser --verbose

Verbose browser diagnostics report only stage transitions and HTTP status codes. URLs, cookies, tokens, usernames, browser paths, and page content are never logged. SERVICENOW_VERBOSE=true enables the same behavior.

Machine-readable errors use a stable envelope:

{"error":{"kind":"not_found","message":"not found: ..."}}
Exit Meaning
0 Success
1 Unexpected or transport error
2 Invalid input or configuration
3 Authentication or authorization failure
4 Record not found
5 Other ServiceNow API error
6 Rate limited
7 Conflict or ambiguous match

The versioned offline command schema describes argument types, defaults, enums, side effects, confirmation and dry-run behavior, output envelopes, and exit codes. Query a single command to keep agent context small:

servicenow schema | jq '.commands[].name'
servicenow schema --command 'attachments delete'
servicenow completions zsh > _servicenow

Configuration precedence

Command options override environment variables, which override the active profile. Environment variables are useful for ephemeral automation:

Variable Purpose
SERVICENOW_INSTANCE Instance name, hostname, or full base URL
SERVICENOW_USERNAME Basic-auth username
SERVICENOW_PASSWORD Basic-auth password
SERVICENOW_COOKIE Ephemeral ServiceNow browser-session cookie
SERVICENOW_USER_TOKEN Matching browser anti-CSRF token for write requests
SERVICENOW_TOKEN Bearer/OAuth access token
SERVICENOW_AUTH_TYPE browser, basic, bearer, or oauth
SERVICENOW_BROWSER chrome, edge, chromium, a platform executable path, or a windows-* WSL override
SERVICENOW_PROFILE Named profile
SERVICENOW_READ_ONLY Block all actual mutations when true
SERVICENOW_CACHE_DIR Override the metadata cache root
servicenow profile list
servicenow profile use production
servicenow auth status
servicenow auth logout

Development and release trust

make check
make test-e2e # requires an ignored .env.e2e file and a PDI

The default suite uses mock servers. The ignored PDI lifecycle suite creates isolated records, verifies incident and attachment lifecycles, and cleans up every record and file it creates.

CI runs formatting, linting, tests on Linux/macOS/Windows, and a RustSec audit. Tagged releases produce native archives, Cargo/PyPI packages, SHA-256 checksums, a CycloneDX SBOM, and GitHub artifact attestations, then install and execute both public packages as a final smoke test. See SECURITY.md, SUPPORT.md, and the release runbook.

Status

This project is unofficial and is not affiliated with or supported by ServiceNow. ServiceNow is a trademark of ServiceNow, Inc.

Licensed under the MIT License.

Releasing

Vership owns versioning, changelog generation, release commits, and tags. See the release runbook for the verified workflow and recovery policy.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

servicenow_cli-0.4.0.tar.gz (155.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

servicenow_cli-0.4.0-py3-none-win_amd64.whl (5.4 MB view details)

Uploaded Python 3Windows x86-64

servicenow_cli-0.4.0-py3-none-manylinux_2_28_x86_64.whl (6.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

servicenow_cli-0.4.0-py3-none-manylinux_2_28_aarch64.whl (5.8 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

servicenow_cli-0.4.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (9.7 MB view details)

Uploaded Python 3macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file servicenow_cli-0.4.0.tar.gz.

File metadata

  • Download URL: servicenow_cli-0.4.0.tar.gz
  • Upload date:
  • Size: 155.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for servicenow_cli-0.4.0.tar.gz
Algorithm Hash digest
SHA256 b9dee59fa486843db7120a4a6850a817d40a6343545ce703d49397fdb47f77aa
MD5 d44bd0554aab8fd8fe801621ed5949e2
BLAKE2b-256 fb013304b5a445882b7111c0ad16f49f7bbeb4680a0491c6312edf797a35617a

See more details on using hashes here.

Provenance

The following attestation bundles were made for servicenow_cli-0.4.0.tar.gz:

Publisher: release.yml on rvben/servicenow-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file servicenow_cli-0.4.0-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for servicenow_cli-0.4.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 e7278fa42d33b9bfd2f60bb0fc5902b131ce77e846771f79a706c7b6b74ff116
MD5 5b1f3bf94924bc169bf9037957b5c5c7
BLAKE2b-256 e25c2c05d68021c8f2e6a961264eea4f1b722e789cf6378102b726fd59fdf9a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for servicenow_cli-0.4.0-py3-none-win_amd64.whl:

Publisher: release.yml on rvben/servicenow-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file servicenow_cli-0.4.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for servicenow_cli-0.4.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1f75343648b257ec64aef5a420f6e676537cfce720fefa38be9c8aeaf63fa963
MD5 89f6d53adee0a20f55d89ff80c1d0249
BLAKE2b-256 e52e9ae85a9f95fdcb17e9310d4d4b831ec45bc559b97784e81ba48e7e5e59ee

See more details on using hashes here.

Provenance

The following attestation bundles were made for servicenow_cli-0.4.0-py3-none-manylinux_2_28_x86_64.whl:

Publisher: release.yml on rvben/servicenow-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file servicenow_cli-0.4.0-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for servicenow_cli-0.4.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 480212de613d41ed3ab085a95a28aefd60cf50115a4e20a93634d8a039c9e220
MD5 356fa9da8f2c9bbb4f4f7b465b7735a4
BLAKE2b-256 774da88ef7342f69aebbeeabd4afc333dd7bf43e534324e8e72cd08a7f251089

See more details on using hashes here.

Provenance

The following attestation bundles were made for servicenow_cli-0.4.0-py3-none-manylinux_2_28_aarch64.whl:

Publisher: release.yml on rvben/servicenow-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file servicenow_cli-0.4.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for servicenow_cli-0.4.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 776c875ede64d777d34e9973a107bf2bd45127c42c4e4e28af2282656ae7cbab
MD5 b2711c34d37baf8a0e3331eb327f1b36
BLAKE2b-256 248bb35ab8be1c88206c8854040c9a7596a024ad381c1a4031dac55b1e974b22

See more details on using hashes here.

Provenance

The following attestation bundles were made for servicenow_cli-0.4.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on rvben/servicenow-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.5.0

5 files

0.4.5

5 files

0.4.4

5 files

0.4.3

5 files

0.4.2

5 files

0.4.1

5 files

This release

0.4.0 This release

5 files

0.3.14

5 files

0.3.13

5 files

0.3.12

5 files

0.3.11

5 files

0.3.10

5 files

0.3.9

5 files

0.3.8

5 files

0.3.7

5 files

0.3.6

5 files

0.3.5

5 files

0.3.4

5 files

0.3.3

5 files

0.3.2

5 files

0.3.1

5 files

0.3.0

5 files

0.2.1

5 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page