ServiceNow MCP server: Table API, CMDB, schema, update sets. Read-only mode, OAuth, audit log.
uvx mcp-server-servicenow gives an AI assistant the ServiceNow developer data plane: the Table API, the data dictionary, Stats API aggregates, the CMDB and update sets, on any release from Tokyo up. It runs alongside ServiceNow's own MCP servers (how they differ).
cmdb_ci_server have, including inherited ones?"About ten minutes on a free developer instance. On a company instance, ask your ServiceNow admin for the user in step 2.
Sign up for a free Personal Developer Instance (PDI) — it comes with demo incidents, changes and CIs. PDIs hibernate after a few hours idle: wake yours from the developer portal before you start.
Don't connect as admin: new instances refuse REST basic auth for it (why), and the server needs far less.
mcp.integration, Identity type Machine (this ticks Web service access only), and tick Internal Integration User. If your form has no Identity type, tick Web service access only yourself. Submit, then open the user again.itil and snc_read_only, save.That user can read incidents, changes, problems, CMDB and aggregates, and can't change anything. Schema, update sets and writes need more: see roles.
You need uv (uvx runs the server without installing it). In Claude Code:
read -rs SERVICENOW_PASSWORD # paste the password; it is not shown or kept in your history
claude mcp add servicenow \
-e SERVICENOW_INSTANCE_URL=https://devNNNNNN.service-now.com \
-e SERVICENOW_USERNAME=mcp.integration \
-e SERVICENOW_PASSWORD="$SERVICENOW_PASSWORD" \
-- uvx mcp-server-servicenow
Install uv with winget install astral-sh.uv, then:
$s = Read-Host 'Password' -AsSecureString
$p = [Runtime.InteropServices.Marshal]::PtrToStringBSTR([Runtime.InteropServices.Marshal]::SecureStringToBSTR($s))
claude mcp add servicenow -e SERVICENOW_INSTANCE_URL=https://devNNNNNN.service-now.com -e SERVICENOW_USERNAME=mcp.integration -e "SERVICENOW_PASSWORD=$p" -- uvx mcp-server-servicenow
The button adds the server to your VS Code user profile and asks for the instance URL, user and password on first start, storing the password securely. Or add this to .vscode/mcp.json. Use Copilot Chat in Agent mode.
{
"inputs": [
{ "type": "promptString", "id": "servicenow-url", "description": "ServiceNow instance URL, e.g. https://devNNNNNN.service-now.com" },
{ "type": "promptString", "id": "servicenow-password", "description": "Password for mcp.integration", "password": true }
],
"servers": {
"servicenow": {
"type": "stdio",
"command": "uvx",
"args": ["mcp-server-servicenow"],
"env": {
"SERVICENOW_INSTANCE_URL": "${input:servicenow-url}",
"SERVICENOW_USERNAME": "mcp.integration",
"SERVICENOW_PASSWORD": "${input:servicenow-password}"
}
}
}
}
Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):
{
"mcpServers": {
"servicenow": {
"command": "uvx",
"args": ["mcp-server-servicenow"],
"env": {
"SERVICENOW_INSTANCE_URL": "https://devNNNNNN.service-now.com",
"SERVICENOW_USERNAME": "mcp.integration",
"SERVICENOW_PASSWORD": "your-password"
}
}
}
}
Codex, opencode, Antigravity, Cursor, pi, the Claude Code plugin and keeping the password out of config files: client setup.
Ask: "List the 5 most recent incidents." The start-here user holds snc_read_only, so the server lists only the 12 read-only tools. Give the user write roles (and remove snc_read_only) and the 7 write tools appear; your client asks before each write.
No answer? Run the same configuration with --check. It makes read-only requests, prints one line per check (instance reachable, identity, roles, table read, schema, aggregates) and never prints a secret:
SERVICENOW_INSTANCE_URL=https://devNNNNNN.service-now.com SERVICENOW_USERNAME=mcp.integration \
SERVICENOW_PASSWORD="$SERVICENOW_PASSWORD" uvx mcp-server-servicenow --check
Got an answer back? Say which client and ServiceNow release in Show and tell — it tells us what works. Questions go to Q&A.
| You see | Fix |
|---|---|
Got HTML instead of JSON | The PDI is asleep: wake it and retry |
401 | The user isn't Web service access only, or the password is wrong (401) |
403 | The user lacks a role for that table or tool (roles) |
Everything else: run --check (above), then TROUBLESHOOTING.
19 tools, 5 resources and 4 skills. Full reference: tools, resources and skills.
| Group | Tools |
|---|---|
| Table API | list_records get_record create_record update_record delete_record aggregate_records |
| CMDB | list_ci get_ci create_ci update_ci get_ci_relationships |
| System | get_table_schema get_current_user get_system_properties |
| Update sets | list_update_sets get_update_set create_update_set set_current_update_set list_update_set_changes |
Resources: table schemas, instance info, the current update set, the CMDB class hierarchy and an encoded-query reference — read without a tool call.
Skills: four guided workflows served over MCP as skill:// resources, so every client gets them with no plugin — triaging-incidents, servicenow-cmdb, reviewing-update-sets (risk categories and a pre-promotion checklist) and exploring-tables.
ServiceNow's ACLs decide what the user can do; the server adds nothing on top.
| You want | Roles | Run with |
|---|---|---|
| Read ITSM and CMDB data (the start-here user) | itil + snc_read_only | no flag: write tools are hidden for snc_read_only |
| …and create or update incidents and CIs | itil (no snc_read_only) | no flag; the client asks before writes (--read-only on clients that don't ask) |
| …and delete incidents, problems, changes | add itil_admin | |
| Table schemas | add personalize_dictionary | |
| Update sets, system properties | admin — on a PDI only |
Per-tool detail: roles per tool. Setting up a company instance: recommended integration identity.
--read-only hides the 7 write tools and refuses any non-GET request.snc_read_only the write tools are hidden without a flag. A convenience, not a control: ServiceNow refuses those writes anyway.--read-only when the identity can write.Flags and environment variables: configuration.
Verified on 2026-10-11 against ServiceNow Brazil: Claude Code 2.1.296, VS Code 1.140 with GitHub Copilot, Codex CLI 0.162.1, opencode 1.19.0, Antigravity CLI 1.1.20 and pi 1.1.0. Claude Desktop, Cursor and any other client that speaks MCP over stdio or Streamable HTTP should work too; behaviour per client: client setup.
Next: a skill for access and role hygiene, then a foundation for extending the server with your own skill packs, and MCP prompts.
Related: sn-app-template — a ServiceNow scoped app template for Claude Code + now-sdk that pairs with this server.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
uvx mcp-server-servicenowMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-jschuller-mcp-server-servicenow": {
"command": "uvx",
"args": [
"mcp-server-servicenow"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referencemcp-server-servicenowpypiServiceNow MCP Server works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.