Skip to main content
Glama
README.md
# servicenow-mcp

An MCP (Model Context Protocol) server that lets Claude interact with a ServiceNow instance. Exposes ServiceNow functionality as tools Claude can call directly from Claude Desktop or any MCP-compatible client.

## Requirements

- Python 3.10+
- A ServiceNow instance (developer instance works fine)
- Claude Desktop or another MCP client

## Installation

```bash
pip install -r requirements.txt
```

For RAG-based knowledge search (optional):

```bash
pip install chromadb sentence-transformers
```

## Configuration

Set the following environment variables (or copy `.env.example` to `.env`):

```bash
SERVICENOW_INSTANCE_URL=https://your-instance.service-now.com
SERVICENOW_USERNAME=your-username
SERVICENOW_PASSWORD=your-password

# Optional — enables semantic knowledge search
OPENAI_API_KEY=your-openai-key
```

## Choosing a transport

The server supports two transports:

| Transport | When to use |
|---|---|
| `stdio` (default) | Claude Desktop — the standard local setup |
| `http` | Cursor, Cline, LangChain, OpenAI Agents SDK, any web client |

## Claude Desktop setup

Add this to your `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "servicenow": {
      "command": "python",
      "args": ["-m", "servicenow_mcp"],
      "env": {
        "SERVICENOW_INSTANCE_URL": "https://your-instance.service-now.com",
        "SERVICENOW_USERNAME": "your-username",
        "SERVICENOW_PASSWORD": "your-password"
      }
    }
  }
}
```

## HTTP transport (Cursor, Cline, LangChain, OpenAI Agents SDK)

Start the server in HTTP mode:

```bash
MCP_TRANSPORT=http python -m servicenow_mcp
```

The MCP endpoint is at `http://localhost:8000/mcp`.

To require an API key on all requests:

```bash
MCP_TRANSPORT=http MCP_API_KEY=your-secret-key python -m servicenow_mcp
```

Clients must then include `Authorization: Bearer your-secret-key` in every request.

### Cursor / Cline config

```json
{
  "mcpServers": {
    "servicenow": {
      "url": "http://localhost:8000/mcp",
      "headers": {
        "Authorization": "Bearer your-secret-key"
      }
    }
  }
}
```

### Docker + HTTP mode

```bash
docker run -p 8000:8000 \
  -e MCP_TRANSPORT=http \
  -e MCP_API_KEY=your-secret-key \
  -e SERVICENOW_INSTANCE_URL=https://your-instance.service-now.com \
  -e SERVICENOW_USERNAME=your-username \
  -e SERVICENOW_PASSWORD=your-password \
  servicenow-mcp
```

## What's included

Tools are grouped into packs by domain:

| Category | Packs |
|---|---|
| Core development | scripts, dev, background scripts, senior dev |
| Data / config | tables, data import/export, update sets, attachments |
| ITSM | incidents, changes, problems, requests, approvals |
| CMDB / discovery | CMDB, CSDM, discovery, ITAM, ITOM, SAM/HAM |
| Workflow | Flow Designer, pipelines, planner |
| Integrations | Scripted REST APIs, integration hub |
| UI | UI Builder, service catalog, UX |
| App development | scoped apps, best practices, naming conventions |
| Testing | ATF, troubleshooting |
| Knowledge | docs search, knowledge base, RAG search |
| Security | governance, impersonation, events |

## Running with Docker

If you don't want to deal with Python environments, you can run the server inside Docker instead.

1. Make sure you have [Docker Desktop](https://www.docker.com/products/docker-desktop/) installed and running.

2. Copy `.env.example` to `.env` and fill in your ServiceNow credentials:
   ```bash
   cp .env.example .env
   # then open .env and set SERVICENOW_INSTANCE_URL, SERVICENOW_USERNAME, SERVICENOW_PASSWORD
   ```

3. Build and start the container:
   ```bash
   docker-compose up --build
   ```
   The first run will take a minute to download and build everything. After that it's fast.

4. To stop it:
   ```bash
   docker-compose down
   ```

That's it. Logs are saved to a `logs/` folder in the project directory.

> If you want to use it with Claude Desktop, you still need to run it via `python -m servicenow_mcp` (the Claude Desktop integration talks over stdin/stdout, not HTTP). Docker is more useful if you're running this as a standalone service or testing it independently.

## Running tests

```bash
pytest
```

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md).

## License

MIT — see [LICENSE](LICENSE).

Maintenance

ActivityInactive
ResponsivenessNo issues