nowaikit — Installation Guide
Complete setup instructions for connecting nowaikit to ServiceNow and any AI client.
Difficulty: Beginner-friendly
Option A: Interactive Setup Wizard (Recommended)
The fastest way to get started — no config file editing required.
$ npm install -g nowaikit
$ npx nowaikit setup
The wizard walks you through:
Enter your instance URL and choose an authentication method.
Provide your username and password (or OAuth details).
The wizard verifies connectivity to your ServiceNow instance.
Select a tool package and configure write permissions.
Choose your target: Claude Desktop, Cursor, Both, or .env only.
Additional commands
$ 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.
macOS / Linux:
curl -fsSL https://nowaikit.com/install.sh | bashWindows:
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
# Make executable and move to PATH
$ chmod +x nowaikit-macos-arm64
$ sudo mv nowaikit-macos-arm64 /usr/local/bin/nowaikit
$ nowaikit setup
# 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
$ git clone https://github.com/aartiq/nowaikit.git
$ cd nowaikit
$ npm install
$ npm run build
Step 2: Configure
$ cp .env.example .env
Edit .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
Check with node --version. Download from nodejs.org.
Developer, sandbox, or production. Admin access is required for OAuth setup.
ServiceNow OAuth 2.0 Setup
OAuth 2.0 is recommended for production.
- In ServiceNow: navigate to System OAuth › Application Registry › New › Create an OAuth API endpoint for external clients
- Set Name:
nowaikit, Refresh Token Lifespan:8640000, Access Token Lifespan:1800 - Enable Password Grant and Refresh Token grant types
- Copy the Client ID and Client Secret
Enterprise Configuration
SSO / OIDC
Connect to Okta, Azure AD, Ping Identity, or any OIDC-compatible IdP.
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).
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
{
"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.
$ TRANSPORT=sse npx nowaikit
SSE Configuration
| Variable | Default | Description |
|---|---|---|
TRANSPORT | stdio | Set to sse |
PORT | 3000 | Server port |
HOST | 0.0.0.0 | Bind address |
CORS_ORIGIN | * | Allowed CORS origins |
SSE Endpoints
| Method | Path | Description |
|---|---|---|
GET | /sse | Establish SSE connection (streaming) |
POST | /messages | Send messages to the server |
GET | /health | Health check (always unauthenticated) |
# 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.
$ TRANSPORT=http npx nowaikit
Uses the same PORT, HOST, and CORS_ORIGIN variables as SSE.
HTTP Endpoint
| Method | Path | Description |
|---|---|---|
POST | /mcp | Single multiplexed MCP endpoint |
GET | /health | Health check (always unauthenticated) |
$ curl -X POST http://localhost:3000/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
Transport Authentication
For SSE and Streamable HTTP transports, you can optionally secure access with an API key.
NOWAIKIT_API_KEY=your-secret-api-key
When NOWAIKIT_API_KEY is set, all requests must include an Authorization header:
$ 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 /healthis 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)
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.
| Method | Path | Description |
|---|---|---|
GET | /api/tools | List all available tools |
POST | /api/tool | Execute a tool by name |
GET | /api/resources | List available resources |
GET | /api/prompts | List available prompts |
GET | /api/instances | List configured ServiceNow instances |
# 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.
| Method | Path | Description |
|---|---|---|
GET | /.well-known/agent.json | Agent card (discovery metadata) |
POST | /a2a/tasks/send | Send a task to the agent |
POST | /a2a/tasks/sendSubscribe | Send a task and subscribe to streaming updates |
GET | /a2a/tasks/:id | Get the status/result of a task |
# 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
# Start with SSE transport and open dashboard
$ TRANSPORT=sse npx nowaikit
# Then open http://localhost:3000 in your browser
Transport Environment Variables
| Variable | Default | Description |
|---|---|---|
TRANSPORT | stdio | Transport mode: stdio, sse, or http |
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 auth (SSE and HTTP only) |
SERVICENOW_INSTANCE_URL | — | ServiceNow instance URL (required) |
SERVICENOW_AUTH_METHOD | basic | Authentication method: basic or oauth |
SERVICENOW_BASIC_USERNAME | — | ServiceNow username (basic auth) |
SERVICENOW_BASIC_PASSWORD | — | ServiceNow password (basic auth) |
WRITE_ENABLED | false | Enable create/update/delete operations |
MCP_TOOL_PACKAGE | full | Role-based tool package to activate |
Example Configurations
Stdio (default — MCP clients)
# 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)
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)
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
.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
# 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
# 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
# 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
# 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:
"List my 5 most recent open incidents"
Manual verification
- Restart your AI client
- Ask: "Get the schema for the incident table"
- Ask: "Show me 5 open P1 incidents"
- Ask: "Create a test incident" — should fail if
WRITE_ENABLED=false
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) |
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 |



