nowaikit installation guide
Complete setup instructions for connecting nowaikit to ServiceNow and any AI client.
Difficulty: Beginner-friendly
Option A: Interactive Setup Wizard (Recommended)
Install and run the guided setup. No config file editing required.
$ npm install -g nowaikit
$ npx nowaikit@latest setup
nowaikit setup connects ServiceNow and configures your AI client. After that, each user signs in for themselves with nowaikit auth login, which opens the browser. 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.
Per-user sign-in
Once setup is done, each person signs in as themselves so their own ServiceNow identity is used. Run nowaikit auth login and it opens your browser to complete OAuth. Nothing to paste back into the terminal.
$ nowaikit auth login
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.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, with 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@latest - 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@latest
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@latest
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 500+ 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@latest
# 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 | (none) | ServiceNow instance URL (required) |
SERVICENOW_AUTH_METHOD | basic | Authentication method: basic or oauth |
SERVICENOW_BASIC_USERNAME | (none) | ServiceNow username (basic auth) |
SERVICENOW_BASIC_PASSWORD | (none) | 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, for 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@latest
# 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@latest
# 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". This 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 |



