Multi-instance read-only MCP server for ServiceNow
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
A read-only Model Context Protocol (MCP) server for ServiceNow β built for developers, AI workflows, and tools that need deep visibility into ServiceNow across multiple instances (Prod, Dev, Test, PDI).
sn_sdk_explain tool is registered when now-sdk is installed globally (npm install -g now-sdk)SN_MCP_VERBOSE=truesn_read_docs searches the ServiceNowDocs repo, returns file_path/raw_url for direct reads, and can resolve the selected branch when a non-default version is requestedsn-instance.jsonπ Full example: sn-instance.example.json
| Field | Required | Description |
|---|---|---|
alias | β | Short name used in tool calls ("prod", "dev-2") |
instance | β | Subdomain ("mycompany-dev") or full URL ("https://...") |
auth | optional | "basic" (default) or "oauth2" |
label | optional | Human-friendly display name |
default | optional | Use either a top-level "default" alias or per-entry "default": true to select the default instance |
auth: "basic")| Field | Required | Description |
|---|---|---|
username | β | Service account username |
password | β | Password or API token |
auth: "oauth2")| Field | Required | Description |
|---|---|---|
grant_type | β | "client_credentials", "password", "authorization_code", or "jwt_bearer" |
client_id / client_secret | β | OAuth application credentials |
username / password | conditional | Required for password grant |
refresh_token | conditional | Required for authorization_code grant |
jwt_private_key / jwt_subject | conditional | Required for jwt_bearer grant (PEM key string & subject user) |
jwt_issuer | optional | Optional issuer value for jwt_bearer |
token_url | optional | Override the default token endpoint (default: /oauth_token.do) |
Default selection is resolved in this order:
"default" alias in the config object"default": trueAll optional β set them in your shell, in the MCP client "env" block, or in a .env file at the project root. Values from the shell take precedence over .env.
Note: If you are running the server from a local clone, a root-level
.envfile is loaded automatically at startup.
| Variable | Description | Default |
|---|---|---|
SN_INSTANCE_CONFIG | Path to sn-instance.json | Auto-resolved |
SN_MCP_VERBOSE | Set to "true" to enable debug logs | false |
LOGS_TIMEZONE | IANA timezone for log timestamps (CURRENT, GLOBAL, or a named zone) | CURRENT |
SN_LOG_DIR | Override log file directory | OS temp folder |
GITHUB_TOKEN | GitHub Personal Access Token for sn_read_docs (branch lookup and GitHub search) | none |
CLI flags are also supported as an alternative to environment variables:
--config <path> β sets SN_INSTANCE_CONFIG--verbose β sets SN_MCP_VERBOSE=true--github-token <token> β sets GITHUB_TOKENVS Code: Press
Ctrl+Shift+P, select Add MCP
Claude Desktop: Edit
~/Library/Application Support/Claude/claude_desktop_config.json(macOS) or%APPDATA%\Claude\claude_desktop_config.json(Windows)
Gemini Code Assist: Create or edit
~/.gemini/mcp.json
Amazon Q: Create or edit
~/.aws/amazonq/mcp.json
Using npx (recommended):
Using local clone:
β οΈ Always use absolute paths in MCP client configs.
Each server run creates a new timestamped log file:
Stored in the OS temp directory:
| OS | Default log location |
|---|---|
| Windows | %TEMP%\ImJaineel_SN-MCP-Instance_logs\ |
| macOS | $TMPDIR/ImJaineel_SN-MCP-Instance_logs/ |
| Linux | /tmp/ImJaineel_SN-MCP-Instance_logs/ |
Override with SN_LOG_DIR env var. Log files are cleaned up automatically by the OS on reboot.
The startup banner always prints the exact log file path:
The server exposes 16 tools at runtime when the current environment supports them:
sn-instance.json| Tool | Description | Visibility |
|---|---|---|
sn_list_instances | List all configured instances and their aliases, labels, and URLs. | Visible when sn-instance.json is configured and loaded. |
sn_ping | Test connectivity to a specific instance or the default instance. | Visible when sn-instance.json is configured and loaded. |
sn_get_identity | Query users, groups, and group membership from identity tables. | Visible when sn-instance.json is configured and loaded. |
sn_inspect_table | Inspect table schema or search for matching tables by name/label. | Visible when sn-instance.json is configured and loaded. |
sn_aggregate_table | Run aggregate queries such as count, sum, avg, min, and max. | Visible when sn-instance.json is configured and loaded. |
sn_query_table | Generic read from any ServiceNow table with encoded queries, fields, paging, and display values. | Visible when sn-instance.json is configured and loaded. |
sn_get_record | Resolve and fetch a record by sys_id, record number, task table, or CMDB CI class. | Visible when sn-instance.json is configured and loaded. |
sn_get_attachment | Fetch attachment metadata or file content from the Attachment API. | Visible when sn-instance.json is configured and loaded. |
sn_get_update_sets | List update sets or drill into the files inside a specific update set. | Visible when sn-instance.json is configured and loaded. |
sn_code_search | Search scripting artifacts using the native ServiceNow Code Search API. | Visible when sn-instance.json is configured and loaded. |
sn_get_scripted_artifacts | Fetch Script Includes, Business Rules, Client Scripts, UI Actions, Scheduled Jobs, Fix Scripts, and Scripted REST artifacts. | Visible when sn-instance.json is configured and loaded. |
sn_legacy_workflow_search | Search classic workflow activity variable values and resolve the owning workflow versions. | Visible when sn-instance.json is configured and loaded. |
sn_get_legacy_workflow_artifacts | Fetch legacy workflow artifacts from wf_* tables. | Visible when sn-instance.json is configured and loaded. |
sn_get_workflow_studio_artifacts | Fetch Workflow Studio and Flow Designer artifacts from sys_hub_* and related tables. | Visible when sn-instance.json is configured and loaded. |
| Tool | Description | Visibility |
|---|---|---|
sn_read_docs | Search, browse, and read ServiceNowDocs markdown by release branch. Search mode returns file_path and raw_url values for direct reads, and get_file accepts either a raw GitHub URL or a repo-relative path. | Always visible. |
sn_sdk_explain | Query the ServiceNow SDK for explanations of SDK skills, APIs, and concepts via now-sdk. | Visible only when now-sdk is installed and can be executed successfully. |
sn-instance.json provided). In that mode, only the 2 knowledge tools remain visible.sn_read_docs is always registered, because it does not depend on ServiceNow instance credentials.sn_sdk_explain is added only after a successful probe of now-sdk; if the package is not installed or cannot be executed, the tool is omitted entirely. Install it globally with: npm install -g now-sdkinstance parameter. If omitted, the server uses the configured default instance.Use mode": "get_file" with the returned file_path or raw_url to read the matching doc.
Invalid credentials
sn-instance.jsonInstance unreachable
instance value format β subdomain or full URLsn-instance.json validation error
MCP client not detecting server
sn-instance.json is in .gitignore β never commit itadmin credentials safely since they're isolatedPRs welcome! Please open an issue first for larger changes.
If you hit a bug, please open a GitHub issue here:
Include the following in your report so it can be fixed quickly:
sn-instance.json or .envSee LICENSE for details.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/sn-mcp-server)<a href="https://allmcps.com/mcp/sn-mcp-server"><img src="https://allmcps.com/api/badge/sn-mcp-server?style=directory" alt="SN MCP Server on AllMCPs" /></a>