Skip to main content
Glama
Germain-D

Pulsar MCP Server

by Germain-D
README.md
# Pulsar MCP Server

A Model Context Protocol (MCP) server for Apache Pulsar that provides tools to interact with Pulsar clusters through MCP-compatible clients.

## Features

- **Publish Messages**: Send messages to Pulsar topics with optional properties
- **Consume Messages**: Receive messages from topics with configurable subscription settings
- **Topic Management**: Create, delete, and list topics
- **Topic Statistics**: Get detailed statistics and metadata about topics
- **Connector Management**: List, get status, and configuration of Pulsar IO connectors
- **Flexible Configuration**: Environment-based configuration with sensible defaults

## Installation

### From Source

1. Clone the repository:
```bash
git clone <repository-url>
cd pulsar-mcp-server
```

2. Install dependencies:
```bash
pip install -r requirements.txt
```

3. Install the package in development mode:
```bash
pip install -e .
```

### Using pip (when published)

```bash
pip install pulsar-mcp-server
```

## Usage

### Command Line

After installation, you can run the server using:

```bash
pulsar-mcp-server
```

The server will start and listen for MCP requests via stdio.

### Programmatic Usage

```python
from pulsar_mcp_server import main

# Run the server
main()
```

### Cursor MCP Server Usage

In your `~/.cursor/mcp.json` file, add the following:

```json
  "pulsar": {
    "command": "pulsar-mcp-server",
    "env": {
        "PULSAR_SERVICE_URL": "pulsar://localhost:6650",
        "PULSAR_WEB_SERVICE_URL": "http://localhost:8080"
    }
}
```




## Configuration

The server can be configured using environment variables or a `.env` file:

```bash
# Pulsar connection settings
PULSAR_SERVICE_URL=pulsar://localhost:6650
PULSAR_WEB_SERVICE_URL=http://localhost:8080

# Topic and subscription settings
TOPIC_NAME=my-topic
SUBSCRIPTION_NAME=pulsar-mcp-subscription
SUBSCRIPTION_TYPE=Shared
IS_TOPIC_READ_FROM_BEGINNING=false

# Authentication (optional)
PULSAR_TOKEN=your-jwt-token
PULSAR_TLS_TRUST_CERTS_FILE_PATH=/path/to/certs
PULSAR_TLS_ALLOW_INSECURE_CONNECTION=false
```

## Available Tools

### pulsar_publish
Publish a message to a Pulsar topic.

**Parameters:**
- `topic` (string, required): The Pulsar topic to publish to
- `message` (string, required): The message content to publish
- `properties` (object, optional): Message properties as key-value pairs

### pulsar_consume
Consume messages from a Pulsar topic.

**Parameters:**
- `topic` (string, required): The Pulsar topic to consume from
- `subscription_name` (string, required): The subscription name
- `max_messages` (integer, optional): Maximum number of messages to consume (default: 10)

### pulsar_create_topic
Create a new Pulsar topic.

**Parameters:**
- `topic` (string, required): Name of the topic to create
- `partitions` (integer, optional): Number of partitions (default: 1)

### pulsar_delete_topic
Delete an existing Pulsar topic.

**Parameters:**
- `topic` (string, required): Name of the topic to delete

### pulsar_list_topics
List all topics in the Pulsar cluster.

**Parameters:** None

### pulsar_topic_stats
Get statistics and metadata about a topic.

**Parameters:**
- `topic` (string, required): Name of the topic to get stats for

### pulsar_list_connectors
List all connectors of a specified type (source or sink).

**Parameters:**
- `connector_type` (string, optional): Type of connectors to list ("source" or "sink", default: "source")

### pulsar_connector_status
Get the status of a specific connector.

**Parameters:**
- `connector_name` (string, required): Name of the connector to get status for

### pulsar_connector_config
Get the configuration of a specific connector.

**Parameters:**
- `connector_name` (string, required): Name of the connector to get configuration for

### pulsar_all_connectors
Get all connectors organized by type (source and sink).

**Parameters:** None

## Development

### Project Structure

```
pulsar-mcp-server/
├── src/
│   └── pulsar_mcp_server/
│       ├── __init__.py          # Package entry point
│       ├── server.py            # MCP server implementation
│       ├── pulsar_connector.py  # Pulsar client wrapper
│       └── settings.py          # Configuration settings
├── pyproject.toml               # Project configuration
├── requirements.txt             # Dependencies
├── test_server.py              # Test script
└── README.md                   # This file
```

### Testing

Run the test script to verify the server functionality:

```bash
python test_server.py
```

### Running with Docker

You can also run Pulsar locally using Docker for testing:

```bash
# Start Pulsar standalone
docker run -it -p 6650:6650 -p 8080:8080 apachepulsar/pulsar:latest bin/pulsar standalone
```

## Requirements

- Python 3.12+
- Apache Pulsar cluster (local or remote)
- MCP-compatible client

## Dependencies

- `mcp>=1.1.0,<2.0`: Model Context Protocol library
- `pulsar-client>=3.4.0`: Apache Pulsar Python client
- `pydantic>=2.10.3`: Data validation and settings management
- `pydantic-settings>=2.6.1`: Settings management for Pydantic

## License

MIT License

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests if applicable
5. Submit a pull request

## Support

For issues and questions, please open an issue on the GitHub repository. 

TDQS

A3.6/5.0

Scored across 10 tools

Disambiguation5/5

All tools have clearly distinct purposes. The slight overlap between 'pulsar_all_connectors' and 'pulsar_list_connectors' is resolved by descriptions: one returns all connectors organized by type, the other lists connectors of a specified type.

Naming Consistency5/5

All tool names follow the consistent pattern 'pulsar_<verb>_<noun>' (e.g., create_topic, list_connectors). The naming is uniform and predictable, aiding agent selection.

Tool Count5/5

With 10 tools, the server is well-scoped for a Pulsar cluster management interface. Each tool serves a necessary function without redundancy.

Completeness4/5

The tool set covers core topic operations (CRUD, publish, consume, stats) and connector inspection. However, it lacks connector creation/deletion, which may be needed for full lifecycle management.

Maintenance

ActivityInactive
ResponsivenessNo issues