NowAIKit
Get started
Use cases Pricing Docs Contact Get started

nowaikit — Installation Guide

Complete setup instructions for connecting nowaikit to ServiceNow and any AI client.

Estimated Time: 5 minutes (wizard) or 20–30 minutes (manual)
Difficulty: Beginner-friendly

Option A: Interactive Setup Wizard (Recommended)

The fastest way to get started — no config file editing required.

bash
$ npm install -g nowaikit
$ npx nowaikit setup

The wizard walks you through:

1
Step 1/5 — ServiceNow Instance

Enter your instance URL and choose an authentication method.

2
Step 2/5 — Credentials

Provide your username and password (or OAuth details).

3
Step 3/5 — Testing Connection

The wizard verifies connectivity to your ServiceNow instance.

4
Step 4/5 — Permissions & Role

Select a tool package and configure write permissions.

5
Step 5/5 — Install into AI Client

Choose your target: Claude Desktop, Cursor, Both, or .env only.

Additional commands

bash
$ nowaikit setup --add         # Add a second instance
$ nowaikit instances list      # List configured instances
$ nowaikit instances remove dev # Remove an instance
$ nowaikit auth login          # Per-user OAuth login
$ nowaikit auth whoami         # Show active ServiceNow user

Option B: Standalone Binary

Download a standalone binary — no Node.js required. Includes the full MCP server and setup CLI.

One-line install:
macOS / Linux: curl -fsSL https://nowaikit.com/install.sh | bash
Windows: irm https://nowaikit.com/install.ps1 | iex
Platform Architecture Download
macOS Apple Silicon (M1/M2/M3/M4) nowaikit-arm64.dmg
macOS Intel x64 nowaikit-x64.dmg
Windows x64 nowaikit-Setup-x64.exe
Windows ARM64 nowaikit-Setup-arm64.exe
Linux x86_64 AppImage nowaikit-x86_64.AppImage
Linux Debian / Ubuntu nowaikit-amd64.deb

After downloading

macOS / Linux
# Make executable and move to PATH
$ chmod +x nowaikit-macos-arm64
$ sudo mv nowaikit-macos-arm64 /usr/local/bin/nowaikit
$ nowaikit setup
Windows (PowerShell)
# Move to a folder in your PATH, then run:
> .\nowaikit-Setup-2.4.0.exe setup

Option C: Manual Setup

Step 1: Clone and build

bash
$ git clone https://github.com/aartiq/nowaikit.git
$ cd nowaikit
$ npm install
$ npm run build

Step 2: Configure

bash
$ cp .env.example .env

Edit .env:

.env
SERVICENOW_INSTANCE_URL=https://yourcompany.service-now.com
SERVICENOW_AUTH_METHOD=basic
SERVICENOW_BASIC_USERNAME=your_username
SERVICENOW_BASIC_PASSWORD=your_password

Step 3: Point your AI client at the server

Config file locations by client:

Client Config path
Claude Desktop (macOS) ~/Library/Application Support/Claude/claude_desktop_config.json
Claude Desktop (Windows) %APPDATA%\Claude\claude_desktop_config.json
Claude Desktop (Linux) ~/.config/Claude/claude_desktop_config.json
Cursor ~/.cursor/mcp.json
VS Code .vscode/mcp.json
Windsurf ~/.codeium/windsurf/mcp_config.json
Continue.dev ~/.continue/config.json

System Prerequisites

Node.js 20.0.0 or higher

Check with node --version. Download from nodejs.org.

A ServiceNow instance

Developer, sandbox, or production. Admin access is required for OAuth setup.

ServiceNow OAuth 2.0 Setup

OAuth 2.0 is recommended for production.

  1. In ServiceNow: navigate to System OAuth › Application Registry › New › Create an OAuth API endpoint for external clients
  2. Set Name: nowaikit, Refresh Token Lifespan: 8640000, Access Token Lifespan: 1800
  3. Enable Password Grant and Refresh Token grant types
  4. Copy the Client ID and Client Secret
Security tip: Never commit your OAuth credentials to source control. Use environment variables or a secrets manager.

Enterprise Configuration

SSO / OIDC

Connect to Okta, Azure AD, Ping Identity, or any OIDC-compatible IdP.

SSO/OIDC requires the Enterprise license tier. View pricing →

Audit Logging

Every tool call is automatically logged. Configure with the following environment variables:

Variable Description
AUDIT_ENABLED Set to true to enable audit logging
AUDIT_LOG_PATH File path for the audit log (JSONL format)
AUDIT_WEBHOOK_URL Webhook URL for SIEM integration

Org / Team Policy

Deploy nowaikit.org.json via MDM/GPO to enforce organisation-wide configuration policies.

HTTP API Server

Use nowaikit serve to expose all tools as a REST API.

Method Path Description
GET / Web dashboard
GET /api/health Health + instance info
GET /api/tools List all tools
POST /api/tool Execute a tool

Transport Configuration

NowAIKit v4.0.0 supports three transport modes: stdio (default, for MCP clients), SSE (Server-Sent Events for web integrations), and Streamable HTTP (for modern HTTP-based agents).

Default behaviour: If you don't set the TRANSPORT environment variable, NowAIKit uses stdio — no extra configuration needed.

Stdio (Default)

Stdio is the standard MCP transport. It communicates over standard input/output and is used by Claude Desktop, Cursor, VS Code extensions, and most MCP-compatible clients.

  • No configuration needed — just run npx nowaikit
  • Fastest transport with the lowest latency
  • No network ports opened
  • One client per process
claude_desktop_config.json
{
  "mcpServers": {
    "nowaikit": {
      "command": "npx",
      "args": ["-y", "nowaikit"],
      "env": {
        "SERVICENOW_INSTANCE_URL": "https://yourinstance.service-now.com",
        "SERVICENOW_AUTH_METHOD": "basic",
        "SERVICENOW_BASIC_USERNAME": "admin",
        "SERVICENOW_BASIC_PASSWORD": "your_password"
      }
    }
  }
}

SSE Transport

SSE (Server-Sent Events) is ideal for web integrations, browser-based clients, and scenarios where you need a persistent HTTP connection with real-time streaming.

bash
$ TRANSPORT=sse npx nowaikit

SSE Configuration

VariableDefaultDescription
TRANSPORTstdioSet to sse
PORT3000Server port
HOST0.0.0.0Bind address
CORS_ORIGIN*Allowed CORS origins

SSE Endpoints

MethodPathDescription
GET/sseEstablish SSE connection (streaming)
POST/messagesSend messages to the server
GET/healthHealth check (always unauthenticated)
bash
# Test SSE connection
$ curl -N http://localhost:3000/sse

# Send a message
$ curl -X POST http://localhost:3000/messages \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'

Streamable HTTP Transport

Streamable HTTP is the modern MCP transport, preferred for new integrations. It uses a single multiplexed endpoint and supports both request-response and streaming patterns over standard HTTP.

bash
$ TRANSPORT=http npx nowaikit

Uses the same PORT, HOST, and CORS_ORIGIN variables as SSE.

HTTP Endpoint

MethodPathDescription
POST/mcpSingle multiplexed MCP endpoint
GET/healthHealth check (always unauthenticated)
bash
$ curl -X POST http://localhost:3000/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
Recommendation: Use Streamable HTTP for new integrations. It is simpler than SSE (single endpoint), works with standard HTTP infrastructure (load balancers, proxies), and supports both streaming and non-streaming responses.

Transport Authentication

For SSE and Streamable HTTP transports, you can optionally secure access with an API key.

.env
NOWAIKIT_API_KEY=your-secret-api-key

When NOWAIKIT_API_KEY is set, all requests must include an Authorization header:

bash
$ curl -X POST http://localhost:3000/mcp \
  -H 'Authorization: Bearer your-secret-api-key' \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
  • The health endpoint at GET /health is always unauthenticated
  • When no API key is set, all endpoints are open (suitable for local development)
  • Stdio transport does not use API key authentication (process-level isolation instead)
Security: Always set NOWAIKIT_API_KEY when exposing SSE or HTTP transports on a network. Never run an unauthenticated server on a public interface.

REST API (SSE/HTTP only)

When running in SSE or HTTP transport mode, a REST API is available at /api/* for direct tool invocation outside of the MCP protocol.

MethodPathDescription
GET/api/toolsList all available tools
POST/api/toolExecute a tool by name
GET/api/resourcesList available resources
GET/api/promptsList available prompts
GET/api/instancesList configured ServiceNow instances
bash
# List all tools
$ curl http://localhost:3000/api/tools

# Execute a tool
$ curl -X POST http://localhost:3000/api/tool \
  -H 'Content-Type: application/json' \
  -d '{"name":"get_incident","arguments":{"number_or_sysid":"INC0010001"}}'

A2A Protocol (SSE/HTTP only)

NowAIKit exposes an Agent-to-Agent (A2A) interface when running in SSE or HTTP transport mode.

MethodPathDescription
GET/.well-known/agent.jsonAgent card (discovery metadata)
POST/a2a/tasks/sendSend a task to the agent
POST/a2a/tasks/sendSubscribeSend a task and subscribe to streaming updates
GET/a2a/tasks/:idGet the status/result of a task
bash
# Discover the agent
$ curl http://localhost:3000/.well-known/agent.json

# Send a task
$ curl -X POST http://localhost:3000/a2a/tasks/send \
  -H 'Content-Type: application/json' \
  -d '{"task":{"message":"List my open P1 incidents"}}'

Dashboard

When running in SSE or HTTP transport mode, NowAIKit serves a web dashboard at the root path (/).

  • Tool explorer — browse and search all 450+ tools
  • Search — filter tools by name, category, or module
  • Instance info — see which ServiceNow instance is connected
bash
# Start with SSE transport and open dashboard
$ TRANSPORT=sse npx nowaikit
# Then open http://localhost:3000 in your browser

Transport Environment Variables

VariableDefaultDescription
TRANSPORTstdioTransport mode: stdio, sse, or http
PORT3000Server port (SSE and HTTP only)
HOST0.0.0.0Bind address (SSE and HTTP only)
CORS_ORIGIN*Allowed CORS origins (SSE and HTTP only)
NOWAIKIT_API_KEY(none)API key for bearer token auth (SSE and HTTP only)
SERVICENOW_INSTANCE_URLServiceNow instance URL (required)
SERVICENOW_AUTH_METHODbasicAuthentication method: basic or oauth
SERVICENOW_BASIC_USERNAMEServiceNow username (basic auth)
SERVICENOW_BASIC_PASSWORDServiceNow password (basic auth)
WRITE_ENABLEDfalseEnable create/update/delete operations
MCP_TOOL_PACKAGEfullRole-based tool package to activate

Example Configurations

Stdio (default — MCP clients)

.env
# Stdio transport (default — no TRANSPORT variable needed)
SERVICENOW_INSTANCE_URL=https://yourinstance.service-now.com
SERVICENOW_AUTH_METHOD=basic
SERVICENOW_BASIC_USERNAME=admin
SERVICENOW_BASIC_PASSWORD=your_password

SSE (web integrations)

.env
TRANSPORT=sse
PORT=3000
HOST=0.0.0.0
CORS_ORIGIN=https://myapp.example.com
NOWAIKIT_API_KEY=my-secret-key-here

SERVICENOW_INSTANCE_URL=https://yourinstance.service-now.com
SERVICENOW_AUTH_METHOD=oauth
SERVICENOW_OAUTH_CLIENT_ID=your_client_id
SERVICENOW_OAUTH_CLIENT_SECRET=your_client_secret
SERVICENOW_OAUTH_USERNAME=svc_account
SERVICENOW_OAUTH_PASSWORD=svc_password

WRITE_ENABLED=true
MCP_TOOL_PACKAGE=full

Streamable HTTP (modern agents)

.env
TRANSPORT=http
PORT=8080
HOST=127.0.0.1
CORS_ORIGIN=*
NOWAIKIT_API_KEY=my-secret-key-here

SERVICENOW_INSTANCE_URL=https://yourinstance.service-now.com
SERVICENOW_AUTH_METHOD=oauth
SERVICENOW_OAUTH_CLIENT_ID=your_client_id
SERVICENOW_OAUTH_CLIENT_SECRET=your_client_secret
SERVICENOW_OAUTH_USERNAME=svc_account
SERVICENOW_OAUTH_PASSWORD=svc_password

WRITE_ENABLED=true
MCP_TOOL_PACKAGE=full
Never commit .env files — they contain credentials. Add .env to your .gitignore and use a secrets manager in production.

Quick Recipes

Copy-paste examples for common v4.0.0 workflows.

Start HTTP server and call a tool in one go

bash
# Terminal 1 — start the server
$ TRANSPORT=http PORT=3000 NOWAIKIT_API_KEY=my-key npx nowaikit

# Terminal 2 — call a tool via REST API
$ curl -X POST http://localhost:3000/api/tool \
  -H 'Authorization: Bearer my-key' \
  -H 'Content-Type: application/json' \
  -d '{"name":"get_incident","arguments":{"number_or_sysid":"INC0010001"}}'

Discover a custom table via REST API

bash
# Use discover_table to auto-generate CRUD tools for any table
$ curl -X POST http://localhost:3000/api/tool \
  -H "Authorization: Bearer $NOWAIKIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"discover_table","arguments":{"table_name":"u_custom_app"}}'

A2A agent-to-agent task

bash
# 1. Discover the agent
$ curl http://localhost:3000/.well-known/agent.json

# 2. Send a task via A2A
$ curl -X POST http://localhost:3000/a2a/tasks/send \
  -H "Content-Type: application/json" \
  -d '{"task":{"message":"Create a P2 incident for slow VPN performance"}}'

SSE transport with curl

bash
# Start SSE server
$ TRANSPORT=sse PORT=3000 npx nowaikit

# Connect to SSE stream (long-lived connection)
$ curl -N http://localhost:3000/sse

# Send an MCP message
$ curl -X POST http://localhost:3000/messages \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'

Verification and Testing

Using the wizard

After setup, restart your AI client and test with a natural language prompt:

prompt
"List my 5 most recent open incidents"

Manual verification

  1. Restart your AI client
  2. Ask: "Get the schema for the incident table"
  3. Ask: "Show me 5 open P1 incidents"
  4. Ask: "Create a test incident" — should fail if WRITE_ENABLED=false
Tip: If the "create a test incident" command succeeds when you expect it to fail, double-check that WRITE_ENABLED is set to false (the default).

Troubleshooting

Common issues and their solutions:

# Error Solution
1 "Cannot find module 'dist/server.js'" Rebuild with npm run build
2 "AUTHENTICATION_FAILED" Check your OAuth credentials and ensure the client ID/secret are correct
3 "TABLE_NOT_ALLOWED" Use ALLOW_ANY_TABLE=true or add the table to ALLOWED_TABLES
4 MCP Server Not Showing Validate JSON syntax in your config file and check the file location is correct
5 "WRITE_NOT_ENABLED" Set WRITE_ENABLED=true in your environment variables
6 "Request timeout" Increase REQUEST_TIMEOUT_MS (default is 30000)
Still stuck? Open an issue on GitHub with your error message, Node.js version, and AI client details.

Environment Variables Reference

ServiceNow Connection

Variable Description
SERVICENOW_INSTANCE_URL Instance URL (e.g. https://yourcompany.service-now.com)
SERVICENOW_AUTH_METHOD Authentication method: basic or oauth

Basic Auth

Variable Description
SERVICENOW_BASIC_USERNAME ServiceNow username
SERVICENOW_BASIC_PASSWORD ServiceNow password

OAuth 2.0

Variable Description
SERVICENOW_OAUTH_CLIENT_ID OAuth Client ID
SERVICENOW_OAUTH_CLIENT_SECRET OAuth Client Secret
SERVICENOW_OAUTH_USERNAME OAuth username
SERVICENOW_OAUTH_PASSWORD OAuth password

Permission Tiers

Variable Default Description
WRITE_ENABLED false Enable create/update/delete operations
CMDB_WRITE_ENABLED false Enable CMDB write operations
SCRIPTING_ENABLED false Enable script management tools
NOW_ASSIST_ENABLED false Enable Now Assist AI tools
ATF_ENABLED false Enable ATF testing tools

Tool Packaging

Variable Default Description
MCP_TOOL_PACKAGE full Role-based tool package to activate

Multi-Instance

Variable Description
SN_INSTANCES_CONFIG Path to instances.json configuration file

Transport & Server

Variable Default Description
TRANSPORT stdio Transport mode: stdio, sse, or http. Use sse or http to run as a web server with dashboard, REST API, and A2A support.
PORT 3000 Server port (SSE and HTTP only)
HOST 0.0.0.0 Bind address (SSE and HTTP only)
CORS_ORIGIN * Allowed CORS origins (SSE and HTTP only)
NOWAIKIT_API_KEY (none) API key for bearer token authentication (SSE and HTTP only)

See the Transport Configuration section below for full setup details, curl examples, and .env templates for each transport mode.

Audit Logging

Variable Default Description
AUDIT_ENABLED true Enable audit logging
AUDIT_LOG_PATH ~/.config/nowaikit/audit.jsonl Audit log file path
AUDIT_WEBHOOK_URL (none) SIEM webhook URL

SSO / OIDC

Variable Description
OIDC_ISSUER Identity Provider URL
OIDC_CLIENT_ID OAuth client ID for OIDC
OIDC_CLIENT_SECRET OAuth client secret for OIDC
OIDC_REDIRECT_URI Callback URL for OIDC flow