# ⚙️ ServiceNow MCP Server A comprehensive [Model Context Protocol](https://modelcontextprotocol.io) (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/sdk` and `zod` — Bun provides native fetch, test runner, TypeScript - **Single JSON config file** — no env vars, one source of truth ## 🚀 Quick Start ### Prerequisites - [Bun](https://bun.sh) v1.0+ - A ServiceNow instance with REST API access ### Install & Configure ```bash git clone git@github.com: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) ```bash bun run start # or with explicit config path: bun run start -- --config /path/to/config.json ``` ### Run (HTTP transport) ```bash 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: 1. `config/servicenow-config.json` (relative to cwd) 2. `servicenow-config.json` (relative to cwd) Or specify an explicit path with `--config`: ```bash bun run src/index.ts --config /etc/servicenow/config.json ``` ### Config File Format ```json { "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:** ```json { "type": "basic", "username": "admin", "password": "secret" } ``` **OAuth 2.0:** ```json { "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): ```json { "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: ```bash 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): ```json { "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): ```json { "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)"): ```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): ```json { "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`: ```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`: ```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: ```bash 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: 1. **`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.json` manifest. 2. Edit in your IDE with full syntax highlighting, linting, IntelliSense. 3. **`sn_sync_local_to_script`** — push the local file back to ServiceNow. Auto-detects the target from the manifest. 4. **`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 ```bash # 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 implementation - `zod` — Schema validation Zero other runtime dependencies. Bun provides native fetch, test runner, and TypeScript execution. ## 📄 License MIT