About Servicenow Mcp Server
Servicenow Mcp Server is a ServiceNow MCP server built with Bun and TypeScript for service desk staff, administrators, and platform developers. It exposes tools across ServiceNow domains and read-only resources, with multi-instance configuration and role-based tool packages.
Key features
- 01Tools spanning ITSM and platform development
- 02Multiple instances with per-call targeting
- 03Read-only `servicenow://` resources
- 04Role-based tool packages
- 05Basic and OAuth 2.0 authentication
- 06stdio and Streamable HTTP transports
Use cases
- 01Work with records across dev, test, and production instances
- 02Manage incidents and service requests for a service desk
- 03Edit scripts and workflows for platform development
- 04Restrict available tools by team role
MCP support
The MCP server exposes ServiceNow tools and read-only `servicenow://` resources to clients. It supports stdio and Streamable HTTP transports, with access configurable by instance and tool package.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project README⚙️ ServiceNow MCP Server
A comprehensive Model Context Protocol (MCP) server for ServiceNow, built with Bun and TypeScript. Exposes 176 tools across 28 ServiceNow domains, 7 read-only resources, and 10 role-based tool packages. Supports multi-instance configurations with per-call instance targeting.
✨ Features
- 176 MCP tools spanning ITSM, platform development, service catalog, CMDB, knowledge, agile, and more
- Multi-instance support — configure dev/test/prod with per-instance auth; target any instance per call
- 7 MCP resources — read-only
servicenow://URIs for incidents, users, knowledge, tables, schema - 10 tool packages — role-based subsets (service desk, platform developer, portal developer, integration developer, etc.)
- Smart resolution — tools accept human-readable names ("Beth Anglin"), record numbers ("INC0010045"), or sys_ids
- Two transports — stdio (Claude Desktop / Claude Code) and Streamable HTTP (web integrations)
- Basic & OAuth 2.0 auth with automatic token refresh, configured per instance
- Progress reporting — long-running operations (batch, clone, move) report progress to MCP clients
- Background script execution — run server-side JavaScript via
sys_trigger - Full platform development — business rules, client scripts, UI policies, UI actions, UI scripts, script includes, scripted REST APIs, widgets, UI pages, workflows, Flow Designer
- Script sync / local dev — download scripts to local files, edit in your IDE, auto-sync on save
- Application scope management — switch scoped app context programmatically
- Static table metadata — 100 pre-cached table definitions for fast schema lookups
- Zero runtime deps beyond
@modelcontextprotocol/sdkandzod— Bun provides native fetch, test runner, TypeScript - Single JSON config file — no env vars, one source of truth
🚀 Quick Start
Prerequisites
- Bun v1.0+
- A ServiceNow instance with REST API access
Install & Configure
git clone [email protected]:seemsindie/servicenow-mcp-server.git
cd servicenow-mcp-server
bun install
# Create your config file
cp config/servicenow-config.example.json config/servicenow-config.json
# Edit with your instance details and credentials
Run (stdio transport)
bun run start
# or with explicit config path:
bun run start -- --config /path/to/config.json
Run (HTTP transport)
bun run start:http
# or:
bun run start:http -- --config /path/to/config.json
# Server starts at http://127.0.0.1:3000
# Health check: GET /health
# MCP endpoint: /mcp
🔧 Configuration
All configuration lives in a single JSON file. The server searches for it in order:
config/servicenow-config.json(relative to cwd)servicenow-config.json(relative to cwd)
Or specify an explicit path with --config:
bun run src/index.ts --config /etc/servicenow/config.json
Config File Format
{
"instances": [
{
"name": "dev",
"url": "https://dev-instance.service-now.com",
"auth": {
"type": "basic",
"username": "admin",
"password": "dev-password"
},
"default": true,
"description": "Development instance"
},
{
"name": "prod",
"url": "https://prod-instance.service-now.com",
"auth": {
"type": "oauth",
"clientId": "your-client-id",
"clientSecret": "your-client-secret",
"username": "admin",
"password": "prod-password"
},
"description": "Production instance"
}
],
"toolPackage": "full",
"debug": false,
"http": {
"port": 3000,
"host": "127.0.0.1"
}
}
Config Reference
| Field | Required | Default | Description |
|---|---|---|---|
instances | Yes | — | Array of ServiceNow instance configs |
instances[].name | Yes | — | Unique identifier (used in instance parameter) |
instances[].url | Yes | — | ServiceNow instance URL |
instances[].auth | Yes | — | Auth config (basic or oauth) |
instances[].default | No | false | Mark as default (at most one) |
instances[].description | No | — | Human-readable description |
toolPackage | No | "full" | Tool package filter (see below) |
debug | No | false | Enable debug logging |
http.port | No | 3000 | HTTP transport port |
http.host | No | "127.0.0.1" | HTTP transport bind address |
Auth Types
Basic auth:
{ "type": "basic", "username": "admin", "password": "secret" }
OAuth 2.0:
{
"type": "oauth",
"clientId": "your-client-id",
"clientSecret": "your-client-secret",
"username": "admin",
"password": "secret"
}
Each instance independently specifies its own auth type and credentials.
🌐 Using Multiple Instances
Every tool accepts an optional instance parameter. When omitted, the default instance is used.
# Query incidents on the default instance
sn_query_table(table: "incident", query: "active=true")
# Query incidents on a specific instance
sn_query_table(table: "incident", query: "active=true", instance: "prod")
# List all configured instances
sn_list_instances()
# Get info about a specific instance
sn_instance_info(instance: "dev")
MCP resources (servicenow:// URIs) always use the default instance.
🖥️ Client Integrations
All integrations use the same MCP server. Replace /path/to/servicenow-mcp-server with the actual path where you cloned the repo. Place your config/servicenow-config.json in the project directory, or use --config to point elsewhere.
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"servicenow": {
"command": "bun",
"args": [
"run", "/path/to/servicenow-mcp-server/src/index.ts",
"--config", "/path/to/servicenow-config.json"
]
}
}
}
Restart Claude Desktop after saving.
Claude Code (CLI)
Add via the CLI:
claude mcp add servicenow -- bun run /path/to/servicenow-mcp-server/src/index.ts --config /path/to/servicenow-config.json
Or add to .claude/settings.json (project-level) or ~/.claude/settings.json (global):
{
"mcpServers": {
"servicenow": {
"command": "bun",
"args": [
"run", "/path/to/servicenow-mcp-server/src/index.ts",
"--config", "/path/to/servicenow-config.json"
]
}
}
}
VS Code (Copilot)
Add to .vscode/mcp.json in your workspace (create the file if it doesn't exist):
{
"servers": {
"servicenow": {
"command": "bun",
"args": [
"run", "/path/to/servicenow-mcp-server/src/index.ts",
"--config", "/path/to/servicenow-config.json"
]
}
}
}
Or add to your user settings.json (Cmd+Shift+P > "Preferences: Open User Settings (JSON)"):
{
"mcp": {
"servers": {
"servicenow": {
"command": "bun",
"args": [
"run", "/path/to/servicenow-mcp-server/src/index.ts",
"--config", "/path/to/servicenow-config.json"
]
}
}
}
}
Requires VS Code 1.99+ with the GitHub Copilot extension. Enable MCP support with "chat.mcp.enabled": true in settings if prompted.
Cursor
Add to .cursor/mcp.json in your project root (create the file if it doesn't exist):
{
"mcpServers": {
"servicenow": {
"command": "bun",
"args": [
"run", "/path/to/servicenow-mcp-server/src/index.ts",
"--config", "/path/to/servicenow-config.json"
]
}
}
}
For global (all projects), add to ~/.cursor/mcp.json instead. Restart Cursor after saving. The server will appear in Cursor Settings > MCP.
Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"servicenow": {
"command": "bun",
"args": [
"run", "/path/to/servicenow-mcp-server/src/index.ts",
"--config", "/path/to/servicenow-config.json"
]
}
}
}
Restart Windsurf after saving.
Amazon Q CLI
Add to ~/.aws/amazonq/mcp.json:
{
"mcpServers": {
"servicenow": {
"command": "bun",
"args": [
"run", "/path/to/servicenow-mcp-server/src/index.ts",
"--config", "/path/to/servicenow-config.json"
]
}
}
}
Streamable HTTP (any client)
For clients that support HTTP-based MCP transport instead of stdio:
bun run start:http -- --config /path/to/servicenow-config.json
# Server starts at http://127.0.0.1:3000
# MCP endpoint: /mcp
# Health check: GET /health
Point your client to http://127.0.0.1:3000/mcp as the MCP server URL.
📦 Tool Packages
Limit exposed tools by role. Set toolPackage in your config file:
| Package | Modules | Use Case |
|---|---|---|
full | All 27 modules (176 tools) + instance tools | Full access (default) |
service_desk | tables, incidents, users, knowledge, search, problems, requests | Service desk agents |
change_coordinator | tables, changes, users, search | Change management |
catalog_builder | tables, catalog, search | Catalog administration |
knowledge_author | tables, knowledge, search | KB content creation |
platform_developer | tables, scripts, platform_scripts, workflows, flows, changesets, schema, search, background_scripts, scripted_rest, widgets, ui_pages, app_scope, script_sync | Platform development |
system_admin | tables, users, schema, search, batch, app_scope, changesets, aggregation, import_sets, attachments | System administration |
agile | tables, agile, users, search | Agile teams |
integration_developer | tables, scripts, platform_scripts, scripted_rest, schema, search, batch, background_scripts, aggregation, import_sets, attachments | Integration & API development |
portal_developer | tables, widgets, ui_pages, catalog, scripts, platform_scripts, search, schema, script_sync | Service Portal development |
Instance management tools (sn_list_instances, sn_instance_info) are always available regardless of package.
🛠️ Tools Reference
Instance Management (2 tools) — always available
sn_list_instances, sn_instance_info
Generic Table API (5 tools)
sn_query_table, sn_get_record, sn_create_record, sn_update_record, sn_delete_record
🎫 Incidents (7 tools)
sn_list_incidents, sn_create_incident, sn_update_incident, sn_add_incident_comment, sn_add_incident_work_notes, sn_resolve_incident, sn_close_incident
Supports smart resolution — assigned_to, caller_id, and assignment_group accept names, emails, or sys_ids. Record identifiers accept INC numbers or sys_ids.
👥 Users & Groups (9 tools)
sn_list_users, sn_get_user, sn_create_user, sn_update_user, sn_list_groups, sn_create_group, sn_update_group, sn_add_group_members, sn_remove_group_members
Group member tools accept user names, emails, or sys_ids and group names or sys_ids.
🔄 Change Management (10 tools)
sn_list_change_requests, sn_get_change_request, sn_create_change_request, sn_update_change_request, sn_add_change_task, sn_submit_change_for_approval, sn_approve_change, sn_reject_change, sn_add_change_comment, sn_add_change_work_notes
Supports smart resolution — accepts CHG numbers or sys_ids, resolves user/group fields by name.
🐛 Problem Management (7 tools)
sn_list_problems, sn_get_problem, sn_create_problem, sn_update_problem, sn_add_problem_comment, sn_add_problem_work_notes, sn_close_problem
📋 Service Requests / RITM (6 tools)
sn_list_requests, sn_get_request, sn_list_request_items, sn_get_request_item, sn_update_request_item, sn_submit_catalog_request
🛒 Service Catalog (13 tools)
sn_list_catalogs, sn_list_catalog_items, sn_get_catalog_item, sn_update_catalog_item, sn_list_catalog_categories, sn_create_catalog_category, sn_update_catalog_category, sn_move_catalog_items, sn_create_catalog_variable, sn_list_catalog_variables, sn_update_catalog_variable, sn_get_catalog_recommendations, sn_validate_catalog_item
sn_validate_catalog_item checks for common issues: missing descriptions, no variables, inactive items, missing category, mandatory variables without defaults, duplicate variable names, and missing price.
📚 Knowledge Base (8 tools)
sn_list_knowledge_bases, sn_create_knowledge_base, sn_create_kb_category, sn_list_articles, sn_get_article, sn_create_article, sn_update_article, sn_publish_article
🔀 Workflows (9 tools)
sn_list_workflows, sn_get_workflow, sn_create_workflow, sn_update_workflow, sn_delete_workflow, sn_create_workflow_full, sn_create_workflow_activity, sn_create_workflow_transition, sn_publish_workflow
sn_create_workflow_full is the recommended way to create workflows — orchestrates the full lifecycle in one call: creates the base workflow, version, activities, transitions (with optional conditions), and optionally publishes. Activities are referenced by name or array index in transition definitions.
📝 Script Includes (5 tools)
sn_list_script_includes, sn_get_script_include, sn_create_script_include, sn_update_script_include, sn_delete_script_include
▶️ Background Script Execution (2 tools)
sn_execute_background_script, sn_create_fix_script
sn_execute_background_script runs server-side JavaScript on the instance via the sys_trigger mechanism — creates a one-shot scheduled trigger that fires in ~1 second, executes with full GlideRecord/GlideSystem access, and auto-deletes.
🧩 Platform Script Types (25 tools)
Full CRUD (list, get, create, update, delete) for five script types:
| Type | Table | Tools |
|---|---|---|
| Business Rules | sys_script | sn_list_business_rules, sn_get_business_rule, sn_create_business_rule, sn_update_business_rule, sn_delete_business_rule |
| Client Scripts | sys_script_client | sn_list_client_scripts, sn_get_client_script, sn_create_client_script, sn_update_client_script, sn_delete_client_script |
| UI Policies | sys_ui_policy | sn_list_ui_policys, sn_get_ui_policy, sn_create_ui_policy, sn_update_ui_policy, sn_delete_ui_policy |
| UI Actions | sys_ui_action | sn_list_ui_actions, sn_get_ui_action, sn_create_ui_action, sn_update_ui_action, sn_delete_ui_action |
| UI Scripts | sys_ui_script | sn_list_ui_scripts, sn_get_ui_script, sn_create_ui_script, sn_update_ui_script, sn_delete_ui_script |
🔌 Scripted REST APIs (7 tools)
sn_list_scripted_rest_apis, sn_get_scripted_rest_api, sn_create_scripted_rest_api, sn_update_scripted_rest_api, sn_create_rest_resource, sn_update_rest_resource, sn_delete_rest_resource
sn_get_scripted_rest_api fetches the API definition and all its resource operations in parallel. sn_create_rest_resource creates an endpoint with HTTP method, path (supports {param} syntax), and a script handler.
🖼️ Service Portal Widgets (5 tools)
sn_list_widgets, sn_get_widget, sn_create_widget, sn_update_widget, sn_delete_widget
sn_get_widget returns all script components: HTML template, CSS/SCSS, client script (Angular controller), server script, link function, demo data, and option schema.
📄 UI Pages (5 tools)
sn_list_ui_pages, sn_get_ui_page, sn_create_ui_page, sn_update_ui_page, sn_delete_ui_page
Each UI page has three script components: html (Jelly/HTML body), client_script, and processing_script (server-side).
🌊 Flow Designer (6 tools)
sn_list_flows, sn_get_flow, sn_create_flow, sn_list_flow_variables, sn_create_flow_variable, sn_list_flow_stages
sn_get_flow fetches the flow definition plus all logic blocks and variables in parallel.
📦 Update Sets (9 tools)
sn_list_update_sets, sn_get_update_set, sn_create_update_set, sn_update_update_set, sn_set_current_update_set, sn_commit_update_set, sn_add_to_update_set, sn_move_to_update_set, sn_clone_update_set
sn_move_to_update_set moves records between update sets by sys_ids, source set, or time range with progress reporting. sn_clone_update_set duplicates a set with all its sys_update_xml records.
🏃 Agile (12 tools)
sn_list_stories, sn_create_story, sn_update_story, sn_list_epics, sn_create_epic, sn_update_epic, sn_list_scrum_tasks, sn_create_scrum_task, sn_update_scrum_task, sn_list_projects, sn_create_project, sn_update_project
🖧 CMDB (5 tools)
sn_list_ci, sn_get_ci, sn_create_ci, sn_list_ci_relationships, sn_create_ci_relationship
🔍 Schema Discovery (4 tools)
sn_get_table_schema, sn_discover_table, sn_list_tables, sn_explain_field
sn_explain_field provides detailed metadata about a specific field including type, reference target, max length, choices, and default value. Schema tools leverage a static cache of 100 pre-loaded table definitions for instant lookups.
🔎 Natural Language Search (1 tool)
sn_natural_language_search — translates plain English to ServiceNow encoded queries (16 pattern matchers)
🎯 Application Scope (2 tools)
sn_get_current_application, sn_set_application_scope
Switch the active application scope before creating records in a scoped app. Accepts either a sys_id or a scope string (e.g. x_myapp_module).
💻 Script Sync / Local Dev (3 tools)
sn_sync_script_to_local, sn_sync_local_to_script, sn_watch_and_sync
Local development workflow:
sn_sync_script_to_local— download any script record to local file(s). Multi-field records (widgets, UI pages) create one file per component in a subdirectory. Creates a.sn-sync.jsonmanifest.- Edit in your IDE with full syntax highlighting, linting, IntelliSense.
sn_sync_local_to_script— push the local file back to ServiceNow. Auto-detects the target from the manifest.sn_watch_and_sync— watch a file for changes and auto-sync on save (2s polling). Runs in background.
⚡ Batch Operations (3 tools)
sn_batch_create, sn_batch_update, sn_batch_delete — parallel record creation, updates, and deletion across tables with progress reporting
📎 Attachments (3 tools)
sn_upload_attachment, sn_list_attachments, sn_get_attachment
Upload files to any record, list attachments on a record, and retrieve attachment metadata/content.
📊 Aggregation (1 tool)
sn_aggregate_table — run aggregate queries (COUNT, SUM, AVG, MIN, MAX) via the /api/now/stats endpoint with optional grouping and encoded query filters
📥 Import Sets (2 tools)
sn_create_import_set, sn_run_transform
Create import set rows and run transform maps to load data into ServiceNow tables programmatically.
📡 MCP Resources
Resources always use the default instance.
| URI | Description |
|---|---|
servicenow://incidents | 20 most recent incidents |
servicenow://users | Active users (limit 50) |
servicenow://knowledge | Published knowledge articles |
servicenow://tables | Available table definitions |
servicenow://tables/{table} | Records from any table |
servicenow://schema/{table} | Table schema (fields, types) |
servicenow://incidents/{number} | Specific incident by number |
🧪 Development
# Type check
bun run typecheck
# Run tests (279 tests across 26 files)
bun test
# Dev mode (auto-reload)
bun run dev
🏗️ Architecture
src/
index.ts # stdio entry point (--config support)
http.ts # Streamable HTTP entry point (--config support)
server.ts # MCP server setup, modular tool registration
config.ts # JSON config loader + Zod validation
auth/ # Basic & OAuth providers (per-instance)
client/
index.ts # ServiceNow REST client
registry.ts # InstanceRegistry — maps instance names to clients
errors.ts # SN-specific error classes
types.ts # API response types
config/
table-definitions.json # 100 pre-cached table definitions
tools/ # 28 domain tool modules
tables.ts # Generic Table API CRUD (any table)
incidents.ts # Incident management + smart resolution
changes.ts # Change requests + tasks + approvals
users.ts # Users, groups, members
catalog.ts # Service catalog items/categories/variables/validation
knowledge.ts # Knowledge bases, categories, articles
workflows.ts # Workflows + orchestration (version/activities/transitions/publish)
scripts.ts # Script includes
changesets.ts # Update sets + move/clone
agile.ts # Stories, epics, scrum tasks, projects
cmdb.ts # CMDB CIs + relationships
schema.ts # Schema discovery / table introspection
search.ts # Natural language search
batch.ts # Batch create/update/delete with progress
background-scripts.ts # Background script execution via sys_trigger
platform-scripts.ts # Business rules, client scripts, UI policies/actions/scripts
scripted-rest.ts # Scripted REST API definitions + operations
widgets.ts # Service Portal widgets (sp_widget)
ui-pages.ts # UI pages (sys_ui_page)
flows.ts # Flow Designer (sys_hub_flow + related)
app-scope.ts # Application scope management
script-sync.ts # Script sync / local development workflow
problems.ts # Problem management
requests.ts # Service requests + requested items (RITM)
attachments.ts # File attachments (upload/list/get)
aggregation.ts # Aggregate stats (COUNT/SUM/AVG/MIN/MAX)
import-sets.ts # Import sets + transform maps
instances.ts # Instance management (always available)
resources/ # 7 servicenow:// MCP resources (default instance)
packages/ # 10 role-based tool package definitions
utils/
logger.ts # Logger (stderr-safe)
query.ts # Encoded query builder
resolve.ts # Smart name/number resolution
progress.ts # MCP progress notification helper
table-metadata.ts # Static table metadata loader
config/
servicenow-config.example.json # Config template
📦 Dependencies
@modelcontextprotocol/sdk— MCP protocol implementationzod— Schema validation
Zero other runtime dependencies. Bun provides native fetch, test runner, and TypeScript execution.
📄 License
MIT
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.