sn-mcp
MCP server that gives AI coding assistants read access to a ServiceNow instance — useful when building or debugging ServiceNow apps.
Prerequisites
- uv — Python package manager
- A ServiceNow instance with a user that has read access to
sys_dictionaryand any tables you want to query
Setup
git clone <this-repo>
cd sn-mcp
cp .env.example .env
Edit .env with your instance details:
SN_INSTANCE=https://yourinstance.service-now.com
SN_USERNAME=your_username
SN_PASSWORD=your_password
Adding to Claude
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (Mac) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"sn-mcp": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/sn-mcp", "sn-mcp"],
"env": {
"SN_INSTANCE": "https://yourinstance.service-now.com",
"SN_USERNAME": "your_username",
"SN_PASSWORD": "your_password"
}
}
}
}
You can use either the
envblock above or a.envfile in the repo directory — whichever you prefer.
Claude Code (CLI)
claude mcp add sn-mcp -- uv run --directory /absolute/path/to/sn-mcp sn-mcp
Then set credentials in .env or pass them via the env block in .mcp.json.
Tools
| Tool | Description |
|---|---|
get_table_schema(table, filter_keyword?) |
Field definitions for any table from sys_dictionary — type, label, mandatory, max_length, reference |
query_table(table, query?, fields?, limit?) |
Query any table with an encoded query string (e.g. state=1^category=network) |
get_record(table, sys_id) |
Fetch a single record by sys_id from any table |
Verify it's working
uv run python server.py
Or test the MCP handshake directly:
python3 -c "
import subprocess, json, select
proc = subprocess.Popen(['uv','run','python','server.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
def send(msg):
proc.stdin.write((json.dumps(msg)+'\n').encode()); proc.stdin.flush()
ready,_,_ = select.select([proc.stdout],[],[],5)
return json.loads(proc.stdout.readline()) if ready else None
r = send({'jsonrpc':'2.0','id':1,'method':'initialize','params':{'protocolVersion':'2024-11-05','capabilities':{},'clientInfo':{'name':'test','version':'0'}}})
print('server:', r['result']['serverInfo'])
proc.terminate()
"