Metadata-Version: 2.4
Name: iflow-mcp_cwm-api-gateway-mcp
Version: 0.1.1
Summary: Model Context Protocol server for general API gateway to ConnectWise Manage
Author: Jason Smith
Author-email: Jason Smith <jason@example.com>
License: UNLICENSED
Project-URL: Homepage, https://github.com/iflow-mcp/cwm-api-gateway-mcp
Project-URL: Repository, https://github.com/iflow-mcp/cwm-api-gateway-mcp.git
Project-URL: Issues, https://github.com/iflow-mcp/cwm-api-gateway-mcp/issues
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: mcp>=1.3.0
Requires-Dist: httpx>=0.23.0
Requires-Dist: pydantic>=1.10.0
Requires-Dist: aiohttp>=3.8.4
Dynamic: author
Dynamic: requires-python

# ConnectWise API Gateway MCP Server

This Model Context Protocol (MCP) server provides a comprehensive interface for interacting with the ConnectWise Manage API. It simplifies API discovery, execution, and management for both developers and AI assistants.

## Core Capabilities

- **API Discovery:** Search for and explore ConnectWise API endpoints using keywords or natural language
- **Simplified API Execution:** Execute API calls with friendly parameter handling and automatic error management
- **Fast Memory System:** Save and retrieve frequently used API queries for more efficient workflows
- **Raw API Access:** Send custom API requests with complete control over endpoints, methods, and parameters

## Key Features

- **Database-Backed API Discovery:** Uses a SQLite database built from the ConnectWise API definition JSON for fast, efficient endpoint lookups
- **Natural Language Search:** Find relevant API endpoints using conversational descriptions of what you need
- **Categorized API Navigation:** Browse API endpoints organized by functional categories
- **Detailed Documentation Access:** View comprehensive information about API endpoints including parameters, schemas, and response formats
- **Adaptive Learning:** The system learns which API calls are most valuable to you through usage tracking

## Installation & Setup

### Prerequisites

- Python 3.10 or higher
- Access to ConnectWise Manage API credentials
- ConnectWise API definition file (`manage.json`) - included in the repository

### Installation Steps

#### Option 1: Using GitHub NPM Package (Recommended)

You can install the package directly from GitHub:

```bash
npm install -g jasondsmith72/CWM-API-Gateway-MCP
```

This method automatically handles all dependencies and provides a simpler configuration for Claude Desktop.

#### Option 2: Manual Installation

##### Windows

1. **Clone or download the repository:**
   ```bash
   git clone https://github.com/jasondsmith72/CWM-API-Gateway-MCP.git
   cd CWM-API-Gateway-MCP
   ```

2. **Install the package:**
   ```bash
   pip install -e .
   ```

#### macOS

For the NPM installation method, simply run:

```bash
npm install -g jasondsmith72/CWM-API-Gateway-MCP
```

For manual installation:

1. **Install Python 3.10+ if not already installed:**
   ```bash
   # Using Homebrew
   brew install python@3.10
   
   # Or using pyenv
   brew install pyenv
   pyenv install 3.10.0
   pyenv global 3.10.0
   ```

2. **Clone the repository:**
   ```bash
   git clone https://github.com/jasondsmith72/CWM-API-Gateway-MCP.git
   cd CWM-API-Gateway-MCP
   ```

3. **Set up a virtual environment (recommended):**
   ```bash
   python3 -m venv venv
   source venv/bin/activate
   ```

4. **Install the package:**
   ```bash
   pip install -e .
   ```

#### Linux (Ubuntu/Debian)

For the NPM installation method, simply run:

```bash
sudo npm install -g jasondsmith72/CWM-API-Gateway-MCP
```

For manual installation:

1. **Install Python 3.10+ if not already installed:**
   ```bash
   # For Ubuntu 22.04+
   sudo apt update
   sudo apt install python3.10 python3.10-venv python3.10-dev python3-pip
   
   # For older versions of Ubuntu/Debian
   sudo add-apt-repository ppa:deadsnakes/ppa
   sudo apt update
   sudo apt install python3.10 python3.10-venv python3.10-dev python3-pip
   ```

2. **Clone the repository:**
   ```bash
   git clone https://github.com/jasondsmith72/CWM-API-Gateway-MCP.git
   cd CWM-API-Gateway-MCP
   ```

3. **Set up a virtual environment (recommended):**
   ```bash
   python3.10 -m venv venv
   source venv/bin/activate
   ```

4. **Install the package:**
   ```bash
   pip install -e .
   ```

### Post-Installation Steps

After installing on any platform (Windows, macOS, or Linux), complete the following steps:

#### 1. (Optional) Build the API Database

This repository already includes a pre-built database, so this step is optional. Only run this if you need to use a newer ConnectWise API definition file:

```bash
# On Windows
python build_database.py path/to/manage.json

# On macOS/Linux
python3 build_database.py path/to/manage.json
```

This step only needs to be done once, or whenever the ConnectWise API definition changes.

#### 2. Configure API Credentials

Set the following environment variables with your ConnectWise credentials:
```
CONNECTWISE_API_URL=https://na.myconnectwise.net/v4_6_release/apis/3.0
CONNECTWISE_COMPANY_ID=your_company_id
CONNECTWISE_PUBLIC_KEY=your_public_key
CONNECTWISE_PRIVATE_KEY=your_private_key
CONNECTWISE_AUTH_PREFIX=yourprefix+  # Prefix required by ConnectWise for API authentication
```

These credentials are used in the authentication process as follows:

- **CONNECTWISE_API_URL**: The base URL for all API requests to your ConnectWise instance
  ```
  url = f"{API_URL}{endpoint}"  # e.g., https://na.myconnectwise.net/v4_6_release/apis/3.0/service/tickets
  ```

- **CONNECTWISE_COMPANY_ID**: Included in the 'clientId' header of each request to identify your company
  ```
  headers = {'clientId': COMPANY_ID, ...}
  ```

- **CONNECTWISE_PUBLIC_KEY** and **CONNECTWISE_PRIVATE_KEY**: Used together with AUTH_PREFIX to create the basic authentication credentials
  ```
  username = f"{AUTH_PREFIX}{PUBLIC_KEY}"  # e.g., "yourprefix+your_public_key"
  password = PRIVATE_KEY
  credentials = f"{username}:{password}"  # Combined into "yourprefix+your_public_key:your_private_key"
  ```

- **CONNECTWISE_AUTH_PREFIX**: Required prefix added before your public key in the authentication username. ConnectWise API requires this prefix to identify the type of integration (e.g., "api+", "integration+", etc.)

The final HTTP headers sent with every request will look like:
```
'Authorization': 'Basic [base64 encoded credentials]'
'clientId': 'your_company_id'
'Content-Type': 'application/json'
```

## Configuration for Claude Desktop

There are two methods to integrate with Claude Desktop:

### Method 1: Using NPM Package (Recommended)

Install the package using NPM:

```bash
npm install -g jasondsmith72/CWM-API-Gateway-MCP
```

Then configure Claude Desktop (`claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "CWM-API-Gateway-MCP": {
      "command": "npx",
      "args": [
        "-y",
        "@jasondsmith72/CWM-API-Gateway-MCP"
      ],
      "env": {
        "CONNECTWISE_API_URL": "https://na.myconnectwise.net/v4_6_release/apis/3.0",
        "CONNECTWISE_COMPANY_ID": "your_company_id",
        "CONNECTWISE_PUBLIC_KEY": "your_public_key",
        "CONNECTWISE_PRIVATE_KEY": "your_private_key",
        "CONNECTWISE_AUTH_PREFIX": "yourprefix+"
      }
    }
  }
}
```

### Method 2: Using Node.js Script (Alternate Method)

If you've cloned the repository and installed the dependencies, you can use the included Node.js script:

```json
{
  "mcpServers": {
    "CWM-API-Gateway-MCP": {
      "command": "node",
      "args": ["C:/path/to/CWM-API-Gateway-MCP/bin/server.js"],
      "env": {
        "CONNECTWISE_API_URL": "https://na.myconnectwise.net/v4_6_release/apis/3.0",
        "CONNECTWISE_COMPANY_ID": "your_company_id",
        "CONNECTWISE_PUBLIC_KEY": "your_public_key",
        "CONNECTWISE_PRIVATE_KEY": "your_private_key",
        "CONNECTWISE_AUTH_PREFIX": "yourprefix+"
      }
    }
  }
}
```

### Method 3: Using Direct Python Script Path

If you prefer to use the Python script directly:

```json
{
  "mcpServers": {
    "CWM-API-Gateway-MCP": {
      "command": "python",
      "args": ["C:/path/to/CWM-API-Gateway-MCP/api_gateway_server.py"],
      "env": {
        "CONNECTWISE_API_URL": "https://na.myconnectwise.net/v4_6_release/apis/3.0",
        "CONNECTWISE_COMPANY_ID": "your_company_id",
        "CONNECTWISE_PUBLIC_KEY": "your_public_key",
        "CONNECTWISE_PRIVATE_KEY": "your_private_key",
        "CONNECTWISE_AUTH_PREFIX": "yourprefix+"
      }
    }
  }
}
```

For macOS and Linux, use the appropriate path format:

```json
{
  "mcpServers": {
    "CWM-API-Gateway-MCP": {
      "command": "python3",
      "args": ["/path/to/CWM-API-Gateway-MCP/api_gateway_server.py"],
      "env": {
        "CONNECTWISE_API_URL": "https://na.myconnectwise.net/v4_6_release/apis/3.0",
        "CONNECTWISE_COMPANY_ID": "your_company_id",
        "CONNECTWISE_PUBLIC_KEY": "your_public_key",
        "CONNECTWISE_PRIVATE_KEY": "your_private_key",
        "CONNECTWISE_AUTH_PREFIX": "yourprefix+"
      }
    }
  }
}
```

The server can be run directly from the command line for testing:

```bash
# If installed via NPM
cwm-api-gateway-mcp

# If using the Node.js script (after cloning the repository)
node bin/server.js

# Or using the Python script directly
# On Windows
python api_gateway_server.py

# On macOS/Linux
python3 api_gateway_server.py
```

## Available Tools

The API Gateway MCP server provides several tools for working with the ConnectWise API:

### API Discovery Tools

| Tool | Description |
|------|-------------|
| `search_api_endpoints` | Search for API endpoints by query string |
| `natural_language_api_search` | Find endpoints using natural language descriptions |
| `list_api_categories` | List all available API categories |
| `get_category_endpoints` | List all endpoints in a specific category |
| `get_api_endpoint_details` | Get detailed information about a specific endpoint |

### API Execution Tools

| Tool | Description |
|------|-------------|
| `execute_api_call` | Execute an API call with path, method, parameters, and data |
| `send_raw_api_request` | Send a raw API request in the format "METHOD /path [JSON body]" |

### Fast Memory Tools

| Tool | Description |
|------|-------------|
| `save_to_fast_memory` | Manually save an API query to Fast Memory |
| `list_fast_memory` | List all queries saved in Fast Memory |
| `delete_from_fast_memory` | Delete a specific query from Fast Memory |
| `clear_fast_memory` | Clear all queries from Fast Memory |

## Usage Examples

### Search for Ticket-Related Endpoints

```python
search_api_endpoints("tickets")
```

### Search Using Natural Language

```python
natural_language_api_search("find all open service tickets that are high priority")
```

### Execute a GET Request

```python
execute_api_call(
    "/service/tickets", 
    "GET", 
    {"conditions": "status/name='Open' and priority/name='High'"}
)
```

### Create a New Service Ticket

```python
execute_api_call(
    "/service/tickets", 
    "POST", 
    None,  # No query parameters 
    {
        "summary": "Server is down",
        "board": {"id": 1},
        "company": {"id": 2},
        "status": {"id": 1},
        "priority": {"id": 3}
    }
)
```

### Send a Raw API Request

```python
send_raw_api_request("GET /service/tickets?conditions=status/name='Open'")
```

### View Fast Memory Contents

```python
list_fast_memory()
```

### Save a Useful Query to Fast Memory

```python
save_to_fast_memory(
    "/service/tickets", 
    "GET", 
    "Get all high priority open tickets", 
    {"conditions": "status/name='Open' and priority/name='High'"}
)
```

## Understanding Fast Memory

The Fast Memory feature allows you to save and retrieve frequently used API queries, optimizing your workflow in several ways:

### Benefits

- **Time Savings:** Quickly execute complex API calls without remembering exact endpoints or parameters
- **Error Reduction:** Reuse successful API calls to minimize potential errors
- **Adaptive Learning:** The system learns which API calls are most valuable to you
- **Parameter Persistence:** Parameters and request bodies are stored for future use

### How It Works

1. **Automatic Learning:** When you execute a successful API call, you're prompted to save it to Fast Memory
2. **Intelligent Retrieval:** The next time you use the same API endpoint, the system checks Fast Memory first
3. **Parameter Reuse:** If you don't provide parameters for a call, the system automatically uses those saved in Fast Memory
4. **Usage Tracking:** The system tracks how often each query is used and prioritizes frequently used queries

### Fast Memory Functionality

- **Automatic Parameter Suggestion:** The system will suggest parameters from Fast Memory if none are provided
- **Usage Counter:** Each time a query from Fast Memory is used, its usage count increases
- **Search Capability:** Search through your saved queries by description or endpoint path
- **Prioritization:** Queries are displayed in order of usage frequency, with most frequently used queries at the top

### Managing Your Fast Memory

- **View Saved Queries:** `list_fast_memory()`
- **Search Specific Queries:** `list_fast_memory("search term")`
- **Delete a Query:** `delete_from_fast_memory(query_id)`
- **Clear All Queries:** `clear_fast_memory()`

### Fast Memory Technical Details

The Fast Memory system is powered by a SQLite database (`fast_memory_api.db`) that stores:

- Query paths and methods
- Parameters and request bodies as JSON
- Usage metrics and timestamps
- User-friendly descriptions

The database structure includes:
- `id`: Unique identifier for each saved query
- `description`: User-provided description of what the query does
- `path`: API endpoint path
- `method`: HTTP method (GET, POST, PUT, etc.)
- `params`: Query parameters in JSON format
- `data`: Request body in JSON format
- `timestamp`: When the query was last used
- `usage_count`: How many times the query has been used

## Troubleshooting

### Common Issues

#### Database Not Found Error

```
Error: Database file not found at [path]
Please run build_database.py script first to generate the database
```

**Solution:** Run the `build_database.py` script with the path to your ConnectWise API definition file:
```bash
python build_database.py path/to/manage.json
```

#### API Authentication Issues

```
HTTP error 401: Unauthorized
```

**Solution:** Check your environment variables to ensure all ConnectWise credentials are correct:
- Verify your `CONNECTWISE_COMPANY_ID`, `CONNECTWISE_PUBLIC_KEY`, and `CONNECTWISE_PRIVATE_KEY`
- Ensure the API key has the necessary permissions in ConnectWise
- Check that `CONNECTWISE_AUTH_PREFIX` is set correctly for your environment

#### Timeouts on API Calls

```
Request timed out. ConnectWise API may be slow to respond.
```

**Solution:** 
- Check your internet connection
- The ConnectWise API may be experiencing high load
- For large data requests, consider adding more specific filters to your query

### Logs and Diagnostics

#### Log Locations

- Main log file: `api_gateway/api_gateway.log`
- SQLite databases:
  - API Database: `api_gateway/connectwise_api.db`
  - Fast Memory Database: `api_gateway/fast_memory_api.db`

#### Testing the Database

Verify that the database is correctly built and accessible:
```bash
python test_database.py
```

This will display statistics about the database and confirm it can be queried properly.

## Advanced Usage

### Optimizing API Queries

For better performance with the ConnectWise API:

1. **Use Specific Conditions:** Narrow your queries with precise conditions
   ```python
   execute_api_call("/service/tickets", "GET", {
       "conditions": "status/name='Open' AND dateEntered > [2023-01-01T00:00:00Z]"
   })
   ```

2. **Limit Field Selection:** Request only the fields you need
   ```python
   execute_api_call("/service/tickets", "GET", {
       "conditions": "status/name='Open'",
       "fields": "id,summary,status,priority"
   })
   ```

3. **Paginate Large Results:** Use page and pageSize parameters
   ```python
   execute_api_call("/service/tickets", "GET", {
       "conditions": "status/name='Open'",
       "page": 1,
       "pageSize": 50
   })
   ```

## License

This software is proprietary and confidential. Unauthorized copying, distribution, or use is prohibited.

## Acknowledgments

- Built using the Model Context Protocol (MCP) framework
- Powered by ConnectWise Manage API
