servicenow-mcp-server 2.1.7 → 2.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +6 -2
- package/README.md +1 -1
- package/docs/CLAUDE_DESKTOP_SETUP.md +1 -1
- package/docs/COLLABORATION_PROPOSAL.md +109 -0
- package/docs/DOCKER_DEPLOYMENT.md +1 -1
- package/package.json +8 -7
- package/src/server.js +4 -4
- package/.claude/settings.local.json +0 -98
- package/CLAUDE.md +0 -777
- package/scripts/background_script_2025-09-29T20-19-35-101Z.js +0 -23
- package/scripts/link_ui_policy_actions_2025-09-29T20-17-15-218Z.js +0 -90
- package/scripts/set_update_set_Integration_Governance_Framework_2025-09-29T19-47-06-790Z.js +0 -30
- package/scripts/set_update_set_Integration_Governance_Framework_2025-09-29T19-59-33-152Z.js +0 -30
- package/scripts/set_update_set_current_2025-09-29T20-16-59-675Z.js +0 -24
- package/scripts/test_sys_dictionary_403.js +0 -85
- package/setup/setup-report.json +0 -5313
package/Dockerfile
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Part of Happy Technologies composable service ecosystem
|
|
4
4
|
|
|
5
5
|
# Stage 1: Dependencies
|
|
6
|
-
FROM node:
|
|
6
|
+
FROM node:24-alpine AS dependencies
|
|
7
7
|
|
|
8
8
|
WORKDIR /app
|
|
9
9
|
|
|
@@ -15,7 +15,7 @@ RUN npm install && \
|
|
|
15
15
|
npm cache clean --force
|
|
16
16
|
|
|
17
17
|
# Stage 2: Production
|
|
18
|
-
FROM node:
|
|
18
|
+
FROM node:24-alpine AS production
|
|
19
19
|
|
|
20
20
|
# Set working directory
|
|
21
21
|
WORKDIR /app
|
|
@@ -33,6 +33,10 @@ RUN npm install --package-lock-only --omit=dev && \
|
|
|
33
33
|
npm ci --omit=dev && \
|
|
34
34
|
npm cache clean --force
|
|
35
35
|
|
|
36
|
+
# Runtime doesn't need package managers; remove them to reduce attack surface
|
|
37
|
+
RUN rm -rf /usr/local/lib/node_modules/npm && \
|
|
38
|
+
rm -f /usr/local/bin/npm /usr/local/bin/npx
|
|
39
|
+
|
|
36
40
|
# Copy application source
|
|
37
41
|
COPY src/ ./src/
|
|
38
42
|
COPY config/ ./config/
|
package/README.md
CHANGED
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
**Option A: Multi-Instance Setup (Recommended)**
|
|
73
73
|
```bash
|
|
74
74
|
# Create config file
|
|
75
|
-
cp config/servicenow-instances.example
|
|
75
|
+
cp config/servicenow-instances.json.example config/servicenow-instances.json
|
|
76
76
|
|
|
77
77
|
# Edit with your instances
|
|
78
78
|
nano config/servicenow-instances.json
|
|
@@ -130,7 +130,7 @@ To enable this, use the JSON config file instead of ENV variables:
|
|
|
130
130
|
|
|
131
131
|
```bash
|
|
132
132
|
# Copy example config
|
|
133
|
-
cp config/servicenow-instances.example
|
|
133
|
+
cp config/servicenow-instances.json.example config/servicenow-instances.json
|
|
134
134
|
|
|
135
135
|
# Edit with your instances
|
|
136
136
|
nano config/servicenow-instances.json
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Let's Do This — Response to Chris
|
|
2
|
+
|
|
3
|
+
**From:** Nick Zitzer
|
|
4
|
+
**Date:** March 2026
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Hey Chris —
|
|
9
|
+
|
|
10
|
+
First, totally hear you on the package names. You've put in the work to get those published, cleaned up, and stable on npm — the last thing we should do is break that for people who already depend on them. That's not on the table, full stop. Your packages keep their names, your npm scope stays as-is. No disruption to anyone already using `@sonisoft/now-sdk-ext-*`.
|
|
11
|
+
|
|
12
|
+
Same goes for mine — `servicenow-mcp-server` stays published and available where it is.
|
|
13
|
+
|
|
14
|
+
And honestly, re-reading my initial proposal I think I got ahead of myself on the restructuring side. You're right to push back on that. Let me recalibrate.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## What I Think Actually Makes Sense
|
|
19
|
+
|
|
20
|
+
### Shared Org — Your SNOS Idea Is Great
|
|
21
|
+
|
|
22
|
+
I love the SNOS-Coalition concept (or just SNOS). It's exactly the right framing: a community org for ServiceNow open-source work, not a rebrand of either of our existing projects.
|
|
23
|
+
|
|
24
|
+
**What the org would be:**
|
|
25
|
+
- A shared GitHub home — `github.com/snos-coalition/` (or `github.com/sn-os/`, whatever feels right)
|
|
26
|
+
- Both of us as Owners/maintainers
|
|
27
|
+
- A place for collaborative work that builds on what we've each already shipped
|
|
28
|
+
|
|
29
|
+
**What the org would NOT be:**
|
|
30
|
+
- A rename of your packages
|
|
31
|
+
- A migration that breaks anyone's existing installs
|
|
32
|
+
- A requirement that either of us stops maintaining our own repos
|
|
33
|
+
|
|
34
|
+
### How the Repos Could Work
|
|
35
|
+
|
|
36
|
+
I think the simplest path is:
|
|
37
|
+
|
|
38
|
+
**Option A: Fork into the org (preserve originals)**
|
|
39
|
+
Your repos stay exactly where they are under `sonisoft-cnanda/`. Mine stays under my account. We fork the relevant ones into the SNOS org as the "collaborative edition" — a place where we merge the best of both, experiment with consolidation, and ship new features together. Your originals remain the stable, published packages. The org fork becomes the next-gen version when it's ready.
|
|
40
|
+
|
|
41
|
+
**Option B: Transfer repos, keep names (your suggestion)**
|
|
42
|
+
Move the repos into the org with their original names intact. npm packages don't change — `@sonisoft/now-sdk-ext-core` still resolves, still installs, nothing breaks. The only thing that changes is the GitHub URL, and GitHub handles redirects automatically. This is cleaner if we're both comfortable with it.
|
|
43
|
+
|
|
44
|
+
Either way, the principle is: **nothing breaks for existing users.**
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Where I Think We Build Together
|
|
49
|
+
|
|
50
|
+
Rather than restructuring what exists, I think the highest-value work is combining our strengths into something neither of us has alone. Here's what I'd focus on:
|
|
51
|
+
|
|
52
|
+
### 1. Tool Consolidation (New Collaborative Work)
|
|
53
|
+
|
|
54
|
+
This is where I think the real win is, and it doesn't require renaming anything. Between us we have 90+ MCP tools. The research from Anthropic, Block, and Microsoft is clear that this hurts AI performance — sweet spot is 12-15 tools per server. I laid out a consolidation strategy in my earlier doc that I think is worth discussing on a call, but the short version:
|
|
55
|
+
|
|
56
|
+
- Fewer tools with richer parameters (one `SN-Query` instead of 8 table-specific list tools)
|
|
57
|
+
- Metadata-driven behavior so tools work on any table without per-table code
|
|
58
|
+
- Anthropic's `defer_loading` for specialist tools
|
|
59
|
+
|
|
60
|
+
This would be net-new work in the SNOS org, built on your core library, incorporating my metadata patterns. Not a replacement of either existing server — a next-gen version.
|
|
61
|
+
|
|
62
|
+
### 2. Cross-Pollinate Unique Features
|
|
63
|
+
|
|
64
|
+
Some things I've built that your server doesn't have yet (and vice versa) that would be straightforward to bring over:
|
|
65
|
+
|
|
66
|
+
**From mine → into yours (or the shared project):**
|
|
67
|
+
- Natural language query parser (15+ patterns, table-aware state mappings)
|
|
68
|
+
- SSE/HTTP transport (for Docker and hosted deployments)
|
|
69
|
+
- MCP Resources (8 read-only URIs for ambient AI context)
|
|
70
|
+
- sys_trigger background execution method
|
|
71
|
+
- Metadata-driven table definitions (94 tables, extraction scripts, runtime fallback)
|
|
72
|
+
|
|
73
|
+
**From yours → into mine (or the shared project):**
|
|
74
|
+
- Flow Designer integration (11 tools — huge gap in my server)
|
|
75
|
+
- ATF test execution (critical for CI/CD)
|
|
76
|
+
- WebSocket/AMB real-time events
|
|
77
|
+
- Aggregation queries (Stats API)
|
|
78
|
+
- Knowledge, Catalog, and App Management tools
|
|
79
|
+
- CMDB graph traversal
|
|
80
|
+
- Instance health monitoring
|
|
81
|
+
|
|
82
|
+
### 3. Documentation & Community Building
|
|
83
|
+
|
|
84
|
+
This is honestly where I think the ServiceNow ecosystem needs the most help, and where a shared org gives us leverage. I've got 40+ guides, research docs, and troubleshooting content. A docs site under the SNOS org — covering both our tools plus general ServiceNow MCP development patterns — could become the go-to resource for the community.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## The Bigger Picture (Why I Care)
|
|
89
|
+
|
|
90
|
+
I'll keep this brief since you said you don't care much about the marketing side, but I want you to know what's driving me beyond the code.
|
|
91
|
+
|
|
92
|
+
The ServiceNow developer community has been underserved for years. The platform itself is powerful, but the ecosystem around it has been starved while ServiceNow focuses on sales and enterprise licensing. Every other major enterprise platform has thriving open-source tooling. ServiceNow's is barely getting started.
|
|
93
|
+
|
|
94
|
+
I think open-source, community-built tools — like what we're both already doing — are how that changes. Not waiting for ServiceNow to prioritize developers, but just building the things developers need and putting them out there. The SNOS org could be a home for that kind of work, and not just from us — it's an open door for anyone in the community who wants to contribute.
|
|
95
|
+
|
|
96
|
+
That's the flag I want to plant. The code is the vehicle, but the point is: ServiceNow developers deserve better, and we can build it.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Practical Next Steps
|
|
101
|
+
|
|
102
|
+
1. **A quick call** — 30 minutes to align on the org name, repo structure (Option A vs B), and what we want to build first
|
|
103
|
+
2. **Create the GitHub org** — both as Owners, minimal governance to start
|
|
104
|
+
3. **Pick a first project** — I'd suggest the consolidated MCP server as the flagship, but open to your thinking
|
|
105
|
+
4. **Keep shipping our own stuff** — none of this blocks either of us from continuing to maintain and publish what we've already built
|
|
106
|
+
|
|
107
|
+
No rush on any of this. You just finished a cleanup cycle and I respect that you want to protect the stability of what you've shipped. Whenever you're ready to hop on a call, I'm in.
|
|
108
|
+
|
|
109
|
+
**— Nick**
|
|
@@ -55,7 +55,7 @@ For multi-instance support, mount your config file:
|
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
57
|
# Create config file
|
|
58
|
-
cp config/servicenow-instances.example
|
|
58
|
+
cp config/servicenow-instances.json.example config/servicenow-instances.json
|
|
59
59
|
# Edit with your instances
|
|
60
60
|
|
|
61
61
|
# Run with mounted config
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "servicenow-mcp-server",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.10",
|
|
4
4
|
"description": "Multi-instance ServiceNow MCP server with 40+ tools, natural language search, and local script development",
|
|
5
5
|
"main": "src/server.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"mcpName": "io.github.nickzitzer/servicenow-nodejs",
|
|
8
8
|
"bin": {
|
|
9
|
-
"servicenow-mcp-server": "
|
|
9
|
+
"servicenow-mcp-server": "src/stdio-server.js"
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
12
|
"dev": "nodemon src/server.js",
|
|
@@ -17,11 +17,12 @@
|
|
|
17
17
|
"test": "NODE_OPTIONS=--experimental-vm-modules jest",
|
|
18
18
|
"test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch",
|
|
19
19
|
"test:coverage": "NODE_OPTIONS=--experimental-vm-modules jest --coverage",
|
|
20
|
-
"test:verbose": "NODE_OPTIONS=--experimental-vm-modules jest --verbose"
|
|
20
|
+
"test:verbose": "NODE_OPTIONS=--experimental-vm-modules jest --verbose",
|
|
21
|
+
"release": "./scripts/release.sh"
|
|
21
22
|
},
|
|
22
23
|
"dependencies": {
|
|
23
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
24
|
-
"axios": "^1.13.
|
|
24
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
25
|
+
"axios": "^1.13.6",
|
|
25
26
|
"chokidar": "^4.0.3",
|
|
26
27
|
"dotenv": "^16.6.1",
|
|
27
28
|
"express": "^4.22.1",
|
|
@@ -30,13 +31,13 @@
|
|
|
30
31
|
"devDependencies": {
|
|
31
32
|
"@types/jest": "^30.0.0",
|
|
32
33
|
"jest": "^30.2.0",
|
|
33
|
-
"nodemon": "^3.
|
|
34
|
+
"nodemon": "^3.1.14"
|
|
34
35
|
},
|
|
35
36
|
"author": "Happy Technologies LLC",
|
|
36
37
|
"license": "MIT",
|
|
37
38
|
"repository": {
|
|
38
39
|
"type": "git",
|
|
39
|
-
"url": "https://github.com/Happy-Technologies-LLC/mcp-servicenow-nodejs.git"
|
|
40
|
+
"url": "git+https://github.com/Happy-Technologies-LLC/mcp-servicenow-nodejs.git"
|
|
40
41
|
},
|
|
41
42
|
"bugs": {
|
|
42
43
|
"url": "https://github.com/Happy-Technologies-LLC/mcp-servicenow-nodejs/issues"
|
package/src/server.js
CHANGED
|
@@ -96,9 +96,8 @@ app.get('/mcp', async (req, res) => {
|
|
|
96
96
|
sessions[transport.sessionId] = { server, transport, keepaliveInterval };
|
|
97
97
|
console.log(`🔗 New session established: ${transport.sessionId}`);
|
|
98
98
|
|
|
99
|
-
//
|
|
99
|
+
// connect() starts the transport automatically in current MCP SDK
|
|
100
100
|
await server.connect(transport);
|
|
101
|
-
await transport.start();
|
|
102
101
|
|
|
103
102
|
} catch (error) {
|
|
104
103
|
console.error('❌ Error establishing SSE connection:', error);
|
|
@@ -122,7 +121,8 @@ app.post('/mcp', async (req, res) => {
|
|
|
122
121
|
}
|
|
123
122
|
|
|
124
123
|
const { transport } = sessions[sessionId];
|
|
125
|
-
|
|
124
|
+
// express.json() already consumed the stream, so pass parsed body
|
|
125
|
+
await transport.handlePostMessage(req, res, req.body);
|
|
126
126
|
|
|
127
127
|
} catch (error) {
|
|
128
128
|
console.error('❌ Error handling POST message:', error);
|
|
@@ -163,4 +163,4 @@ app.listen(PORT, () => {
|
|
|
163
163
|
console.log('🐛 Debug mode enabled');
|
|
164
164
|
console.log(`🔗 Active ServiceNow instance: ${defaultInstance.name} - ${defaultInstance.url}`);
|
|
165
165
|
}
|
|
166
|
-
});
|
|
166
|
+
});
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"Read(//Users/nczitzer/WebstormProjects/**)",
|
|
5
|
-
"WebFetch(domain:medium.com)",
|
|
6
|
-
"WebSearch",
|
|
7
|
-
"Read(//Users/nczitzer/Downloads/**)",
|
|
8
|
-
"Bash(find:*)",
|
|
9
|
-
"Bash(node:*)",
|
|
10
|
-
"Bash(npm:*)",
|
|
11
|
-
"Bash(timeout 10s npm run dev)",
|
|
12
|
-
"Bash(curl:*)",
|
|
13
|
-
"Bash(lsof:*)",
|
|
14
|
-
"Bash(xargs kill:*)",
|
|
15
|
-
"Bash(grep:*)",
|
|
16
|
-
"Bash(echo:*)",
|
|
17
|
-
"Bash(tee:*)",
|
|
18
|
-
"Read(//Users/nczitzer/Library/Application Support/Claude/**)",
|
|
19
|
-
"Bash(timeout:*)",
|
|
20
|
-
"Bash(gtimeout:*)",
|
|
21
|
-
"Read(//Users/nczitzer/**)",
|
|
22
|
-
"Bash(mkdir:*)",
|
|
23
|
-
"Bash(pkill:*)",
|
|
24
|
-
"Bash(cp:*)",
|
|
25
|
-
"Bash(env PORT=3003 node src/server.js)",
|
|
26
|
-
"SlashCommand(/claude-flow-help)",
|
|
27
|
-
"Bash(open:*)",
|
|
28
|
-
"Bash(claude mcp:*)",
|
|
29
|
-
"Bash(kill:*)",
|
|
30
|
-
"mcp__servicenow-nodejs__SN-List-Incidents",
|
|
31
|
-
"mcp__servicenow-nodejs__SN-List-SysUsers",
|
|
32
|
-
"mcp__servicenow-nodejs__SN-List-CmdbCis",
|
|
33
|
-
"mcp__servicenow-nodejs__SN-Create-Incident",
|
|
34
|
-
"mcp__servicenow-nodejs__SN-List-SysUserGroups",
|
|
35
|
-
"mcp__servicenow-nodejs__SN-List-ChangeRequests",
|
|
36
|
-
"mcp__servicenow-nodejs__SN-Get-Incident",
|
|
37
|
-
"mcp__servicenow-nodejs__SN-Query-Table",
|
|
38
|
-
"mcp__servicenow-nodejs__SN-List-Problems",
|
|
39
|
-
"Bash(chmod:*)",
|
|
40
|
-
"WebFetch(domain:www.servicenow.com)",
|
|
41
|
-
"mcp__servicenow-nodejs__SN-Create-Record",
|
|
42
|
-
"mcp__servicenow-nodejs__SN-Update-Record",
|
|
43
|
-
"mcp__servicenow-nodejs__SN-Execute-Background-Script",
|
|
44
|
-
"mcp__servicenow-nodejs__SN-List-Update-Sets",
|
|
45
|
-
"mcp__servicenow-nodejs__SN-Set-Update-Set",
|
|
46
|
-
"mcp__servicenow-nodejs__SN-Get-Record",
|
|
47
|
-
"WebFetch(domain:docs.servicenow.com)",
|
|
48
|
-
"WebFetch(domain:community.servicenow.com)",
|
|
49
|
-
"mcp__servicenow-nodejs__SN-Get-Table-Schema",
|
|
50
|
-
"mcp__servicenow-nodejs__SN-Discover-Table-Schema",
|
|
51
|
-
"mcp__servicenow-nodejs__SN-Get-Current-Update-Set",
|
|
52
|
-
"Read(//private/tmp/**)",
|
|
53
|
-
"Bash(tree:*)",
|
|
54
|
-
"Bash(cat:*)",
|
|
55
|
-
"WebFetch(domain:github.com)",
|
|
56
|
-
"WebFetch(domain:raw.githubusercontent.com)",
|
|
57
|
-
"WebFetch(domain:api.github.com)",
|
|
58
|
-
"WebFetch(domain:www.npmjs.com)",
|
|
59
|
-
"Bash(git add:*)",
|
|
60
|
-
"Bash(git commit:*)",
|
|
61
|
-
"Bash(git push:*)",
|
|
62
|
-
"Bash(git config:*)",
|
|
63
|
-
"Bash(git remote set-url:*)",
|
|
64
|
-
"Bash(git mv:*)",
|
|
65
|
-
"WebFetch(domain:happy-tech.biz)",
|
|
66
|
-
"Bash(brew install:*)",
|
|
67
|
-
"Bash(mcp-publisher init:*)",
|
|
68
|
-
"Bash(mcp-publisher login:*)",
|
|
69
|
-
"Bash(mcp-publisher publish:*)",
|
|
70
|
-
"Bash(docker build:*)",
|
|
71
|
-
"Bash(docker login:*)",
|
|
72
|
-
"Bash(docker tag:*)",
|
|
73
|
-
"Bash(docker push:*)",
|
|
74
|
-
"Bash(magick:*)",
|
|
75
|
-
"Bash(docker info:*)",
|
|
76
|
-
"Bash(docker scout:*)",
|
|
77
|
-
"Bash(docker run:*)",
|
|
78
|
-
"Bash(git restore:*)",
|
|
79
|
-
"Bash(nc:*)",
|
|
80
|
-
"Bash(mv:*)",
|
|
81
|
-
"mcp__servicenow__SN-Create-Record",
|
|
82
|
-
"Bash(ps:*)",
|
|
83
|
-
"Bash(gh repo view:*)",
|
|
84
|
-
"Bash(docker stop:*)",
|
|
85
|
-
"Bash(docker rm:*)",
|
|
86
|
-
"Bash(docker logs:*)",
|
|
87
|
-
"Bash(docker buildx:*)",
|
|
88
|
-
"Bash(docker manifest inspect:*)",
|
|
89
|
-
"Bash(git stash:*)",
|
|
90
|
-
"Bash(git pull:*)",
|
|
91
|
-
"Bash(git rebase:*)",
|
|
92
|
-
"Bash(git fetch:*)",
|
|
93
|
-
"Bash(git reset:*)"
|
|
94
|
-
],
|
|
95
|
-
"deny": [],
|
|
96
|
-
"ask": []
|
|
97
|
-
}
|
|
98
|
-
}
|