Metadata-Version: 2.4
Name: owui-mcp-server
Version: 1.0.0
Summary: MCP Server for Open WebUI Knowledge Bases
Author: Ronas IT
License-Expression: MIT
Project-URL: Homepage, https://github.com/RonasIT/open-webui-mcp-server
Project-URL: Repository, https://github.com/RonasIT/open-webui-mcp-server
Project-URL: Issues, https://github.com/RonasIT/open-webui-mcp-server/issues
Keywords: mcp,open-webui,knowledge-base,ai,model-context-protocol
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Software Development :: Libraries
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: httpx>=0.27.0
Requires-Dist: mcp>=1.0.0
Requires-Dist: fastapi>=0.104.0
Requires-Dist: uvicorn[standard]>=0.24.0
Requires-Dist: slowapi>=0.1.9
Provides-Extra: dev
Requires-Dist: pytest>=7.0.0; extra == "dev"
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
Requires-Dist: python-dotenv>=1.0.0; extra == "dev"
Requires-Dist: pre-commit>=3.5.0; extra == "dev"
Requires-Dist: black>=24.1.0; extra == "dev"
Requires-Dist: isort>=5.13.0; extra == "dev"
Requires-Dist: flake8>=7.0.0; extra == "dev"
Requires-Dist: flake8-docstrings>=1.7.0; extra == "dev"
Dynamic: license-file

# Open WebUI Knowledge Base MCP Server

An MCP (Model Context Protocol) server that exposes [Open WebUI](https://github.com/open-webui/open-webui) Knowledge Bases as tools and resources, enabling AI assistants like Cursor and Claude Desktop to search and access knowledge bases.

## Features

- 🔍 **Semantic Search** - Search knowledge bases using semantic search
- 📚 **Knowledge Base Management** - List and get information about knowledge bases
- 👥 **Multi-User Support** - Each connection uses its own API token for isolation
- 🌐 **Dual Transport Modes** - Supports both stdio (local) and HTTP (remote) transports
- 🔒 **Secure** - Per-connection authentication, input validation, rate limiting, CORS protection

## Quick Start

### Prerequisites

- Python 3.8+ or Docker
- Open WebUI instance with API access
- API token from Open WebUI (Settings → Account → API keys)

### Installation

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

Or using `uvx`:

```bash
pip install uv  # or: brew install uv
uvx --from . python mcp_server.py
```

## Usage

### stdio Mode (Local)

```bash
export OPEN_WEBUI_API_URL="https://your-open-webui-instance.com/api/v1"
export OPEN_WEBUI_API_TOKEN="sk-your-token-here"
python mcp_server.py
```

### HTTP Mode (Production)

**Docker Compose:**

```bash
# Create .env file
echo "OPEN_WEBUI_API_URL=https://your-open-webui-instance.com/api/v1" > .env

# Start server
docker-compose up -d

# View logs
docker-compose logs -f
```

**Direct Python:**

```bash
export OPEN_WEBUI_API_URL="https://your-open-webui-instance.com/api/v1"
export MCP_TRANSPORT="http"
export MCP_HTTP_PORT="8001"
python mcp_server.py
```

Server endpoints:

- **MCP**: `http://localhost:8001/mcp`
- **Health**: `http://localhost:8001/health`

## Configuring Cursor to use your MCP server

### Cursor: stdio Mode

Edit `~/.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "open-webui-knowledge": {
      "command": "uvx",
      "args": ["--from", "/path/to/open-webui-mcp-server", "python", "/path/to/open-webui-mcp-server/mcp_server.py"],
      "env": {
        "OPEN_WEBUI_API_URL": "https://your-open-webui-instance.com/api/v1",
        "OPEN_WEBUI_API_TOKEN": "sk-your-token-here"
      }
    }
  }
}
```

### Cursor: HTTP Mode

```json
{
  "mcpServers": {
    "open-webui-knowledge": {
      "url": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer sk-your-token-here"
      }
    }
  }
}
```

## Available Tools

- **`list_knowledge_bases`** - List all accessible knowledge bases
  - `permission` (optional): `"read"` or `"write"` (default: `"read"`)

- **`search_knowledge_base`** - Search a knowledge base using semantic search
  - `knowledge_base_id` (required): The ID of the knowledge base
  - `query` (required): Your search query
  - `k` (optional): Number of results (default: 5)

- **`get_knowledge_base_info`** - Get detailed information about a knowledge base
  - `knowledge_base_id` (required): The ID of the knowledge base

## Environment Variables

| Variable | Description | Default |
|----------|-------------|---------|
| `OPEN_WEBUI_API_URL` | Open WebUI API base URL | Required |
| `OPEN_WEBUI_API_TOKEN` | Default API token (optional) | None |
| `MCP_TRANSPORT` | Transport mode: `stdio` or `http` | `stdio` |
| `MCP_HTTP_HOST` | HTTP server host | `0.0.0.0` |
| `MCP_HTTP_PORT` | HTTP server port | `8001` |
| `MCP_CORS_ORIGINS` | Comma-separated CORS origins (empty = no CORS) | Empty |
| `MCP_RATE_LIMIT_PER_IP` | Rate limit per IP (e.g., "1000/minute") | `1000/minute` |
| `MCP_RATE_LIMIT_PER_TOKEN` | Rate limit per token | `1000/minute` |
| `MCP_RATE_LIMIT_HEALTH` | Rate limit for health endpoint | `10/minute` |

## Security

- Input validation and sanitization
- Rate limiting (per-IP and per-token)
- CORS protection (disabled by default)
- Request size limits (10MB max)
- Error message sanitization
- Token validation

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.

## License

This project is licensed under the **MIT License**.

---

<div align="center">

**Built with ❤️ by [Ronas IT](https://ronasit.com)**

_Professional development services • Open source contributors_

[Website](https://ronasit.com) • [GitHub](https://github.com/RonasIT) • [Email](mailto:hello@ronasit.com)

</div>
