ServiceNow MCP Demo — Incident Assistant
README.md
# ServiceNow MCP Demo — Incident Assistant
An end-to-end **Model Context Protocol** demo that connects Claude to **ServiceNow Incident Management**. Built to showcase MCP fundamentals (servers, clients, tools, resources, stdio transport, agent loops) applied to a real ITSM workflow.
## Architecture
```
┌─────────────────────────────┐ ┌───────────────────────────────┐ ┌────────────────┐
│ Web Client (Streamlit) │ MCP │ MCP Server (FastMCP) │ REST │ ServiceNow │
│ - MCP host + client │◄──────►│ - create_incident │◄──────►│ Table API │
│ - Claude agent loop │ stdio │ - get_incident │ │ (or mock mode)│
│ - Incident cards in UI │JSON-RPC│ - list_recent_incidents │ │ │
│ │ │ - update_incident_state │ │ │
│ │ │ - resolve_incident │ │ │
│ │ │ - search_knowledge_articles │ │ │
│ │ │ - resource: priority │ │ │
│ │ │ matrix reference │ │ │
└─────────────────────────────┘ └───────────────────────────────┘ └────────────────┘
```
Flow for "my laptop won't boot, open a ticket":
1. The web client sends your message to Claude along with the tool schemas it **discovered from the MCP server** at startup (`tools/list`).
2. Claude decides to call `create_incident` with inferred urgency/impact/category.
3. The client forwards the call over MCP (`tools/call`); the server hits the ServiceNow Table API (or the in-memory mock).
4. The result flows back; Claude confirms the incident number; the UI renders an incident card.
## Quick start
```bash
# 1. Create a virtual environment
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 2. Install dependencies
pip install -r requirements.txt
# 3. Configure
cp .env.example .env # then edit: add your ANTHROPIC_API_KEY
# leave SERVICENOW_MODE=mock for a no-setup demo
# 4. Run the web client (it launches the MCP server automatically)
streamlit run client/app.py
```
Open http://localhost:8501 and try:
- *"My laptop won't boot and I have a client demo in an hour — open a ticket."*
- *"Show me the 5 most recent incidents."*
- *"Move INC0010001 to In Progress with a work note that the tech is en route."*
- *"Any KB articles on a laptop that won't power on?"*
- *"That fixed it — resolve INC0010001, solved permanently, replaced the charger."*
## Live ServiceNow mode
1. Request a free **Personal Developer Instance (PDI)** at https://developer.servicenow.com (takes ~2 minutes).
2. In `.env`, set `SERVICENOW_MODE=live` and fill in `SERVICENOW_INSTANCE`, `SERVICENOW_USER`, `SERVICENOW_PASSWORD`.
3. Restart the app. Created incidents will appear in your PDI under **Incident > All** — great for showing the ticket in the real ServiceNow UI during the demo.
> PDIs hibernate after inactivity. Wake yours up ~15 minutes before your interview, and keep `mock` mode as a fallback.
> `search_knowledge_articles` queries the PDI's `kb_knowledge` table directly — before demoing in live mode, seed 2–3 **published** KB articles there with titles matching your demo scenario (e.g. "Laptop won't power on"), or the live search will come back empty. Mock mode already ships with 3 seeded articles so it works out of the box.
## Testing the server standalone (no UI)
The MCP Inspector is the fastest way to prove the server works on its own:
```bash
npx @modelcontextprotocol/inspector python server/servicenow_server.py
```
You can also add the server to **Claude Desktop** (`claude_desktop_config.json`):
```json
{
"mcpServers": {
"servicenow": {
"command": "python",
"args": ["/absolute/path/to/server/servicenow_server.py"]
}
}
}
```
## Project layout
```
servicenow-mcp-demo/
├── server/servicenow_server.py # FastMCP server: 6 tools + 1 resource, mock/live backends
├── client/app.py # Streamlit web app: MCP client + Claude agent loop
├── requirements.txt
├── .env.example
├── PROJECT_PLAN.md # Phase-by-phase build plan and status
└── DEMO_SCRIPT.md # 5-minute recorded-demo script
```
## MCP concepts demonstrated
- **Server** built with FastMCP: tools with typed parameters and docstring-driven schemas
- **Resource** (`servicenow://reference/priority-matrix`) — read-only context, distinct from tools
- **stdio transport** — client launches the server subprocess and speaks JSON-RPC
- **Capability discovery** — the client never hardcodes tools; it calls `tools/list`
- **Agent loop** — multi-round tool use with Claude until a final text answer
- **Separation of concerns** — the same server works with this web client, Claude Desktop, or MCP Inspector, unchanged
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues