Skip to main content
Glama
sooth
by sooth
README.md
# MCP Port Manager

A Model Context Protocol (MCP) server for managing port registrations on your computer. Keep track of which applications are using which ports, find free ports, and maintain a central registry of port allocations.

## Features

- **Get Free Port**: Find available ports with OS-level verification
- **Lookup by Port**: Get information about what's using a specific port
- **Lookup by Application**: Find all ports registered to an application
- **Register Port**: Register a port to an application with description
- **Unregister Port**: Remove port registrations
- **JSON Persistence**: All registrations saved to `~/.mcp_portman/registry.json`
- **OS-Level Checking**: Verifies actual port availability using socket binding

## Installation

### Quick Install (Claude Code)

One command to install directly from GitHub:

```bash
claude mcp add port-manager -- uvx --from git+https://github.com/sooth/mcp_portman mcp-portman
```

**For global installation** (available in all projects on your machine):

```bash
claude mcp add --scope user port-manager -- uvx --from git+https://github.com/sooth/mcp_portman mcp-portman
```

Verify installation:
```bash
claude mcp list
```

#### Installation Scopes

Choose the appropriate scope for your needs:

- **Local** (default): Project/workspace-specific, not shared
  ```bash
  claude mcp add port-manager -- uvx --from git+https://github.com/sooth/mcp_portman mcp-portman
  ```

- **User** (global): Available across all projects on your machine
  ```bash
  claude mcp add --scope user port-manager -- uvx --from git+https://github.com/sooth/mcp_portman mcp-portman
  ```

- **Project**: Stored in `.mcp.json` in project root (can be committed to git for team sharing)
  ```bash
  claude mcp add --scope project port-manager -- uvx --from git+https://github.com/sooth/mcp_portman mcp-portman
  ```

### Alternative: Claude Desktop Manual Configuration

#### macOS

Edit `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "port-manager": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/sooth/mcp_portman",
        "mcp-portman"
      ]
    }
  }
}
```

#### Windows

Edit `%APPDATA%\Claude\claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "port-manager": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/sooth/mcp_portman",
        "mcp-portman"
      ]
    }
  }
}
```

After editing, restart Claude Desktop.

### Local Development Setup

For local development or contributing:

```bash
# Clone the repository
git clone https://github.com/sooth/mcp_portman.git
cd mcp_portman

# Install dependencies
uv sync

# Run the server
uv run mcp-portman
```

## Available Tools

### 1. get_free_port

Find an available port in the range 1024-49151.

**Parameters:**
- `preferred_port` (optional): Specific port to check

**Example requests to Claude:**
- "Find me a free port"
- "Is port 8080 available?"
- "Get me an available port for my web server"

**Returns:**
```json
{
  "port": 8080,
  "message": "Port 8080 is available"
}
```

### 2. lookup_by_port

Get information about a specific port.

**Parameters:**
- `port`: Port number to look up

**Example requests to Claude:**
- "What's using port 3000?"
- "Look up port 5432"
- "Is port 8080 registered?"

**Returns:**
```json
{
  "port": 3000,
  "registered": true,
  "app_name": "my-web-app",
  "description": "Development web server",
  "registered_at": "2025-01-15T10:30:00",
  "os_available": false
}
```

### 3. lookup_by_application

Find all ports registered to an application (case-insensitive).

**Parameters:**
- `app_name`: Application name to search for

**Example requests to Claude:**
- "Show me all ports for postgres"
- "What ports is my-app using?"
- "List ports registered to nginx"

**Returns:**
```json
{
  "app_name": "postgres",
  "count": 2,
  "ports": [
    {
      "port": 5432,
      "app_name": "postgres",
      "description": "Main database",
      "registered_at": "2025-01-15T09:00:00",
      "os_available": false
    },
    {
      "port": 5433,
      "app_name": "postgres",
      "description": "Test database",
      "registered_at": "2025-01-15T09:05:00",
      "os_available": true
    }
  ]
}
```

### 4. register_port

Register a port to an application.

**Parameters:**
- `port`: Port number to register
- `app_name`: Application name
- `description` (optional): What the port is used for

**Example requests to Claude:**
- "Register port 3000 to my-web-app"
- "Register port 5432 for postgres with description 'Main database'"
- "Add port 8080 for nginx development server"

**Returns:**
```json
{
  "success": true,
  "message": "Successfully registered port 3000 to \"my-web-app\"",
  "port": 3000,
  "app_name": "my-web-app",
  "description": "Development server",
  "os_available": true
}
```

### 5. unregister_port

Remove a port registration.

**Parameters:**
- `port`: Port number to unregister

**Example requests to Claude:**
- "Unregister port 3000"
- "Remove port 8080 from the registry"
- "Delete the registration for port 5432"

**Returns:**
```json
{
  "success": true,
  "message": "Successfully unregistered port 3000",
  "removed_registration": {
    "port": 3000,
    "app_name": "my-web-app",
    "description": "Development server",
    "registered_at": "2025-01-15T10:30:00"
  }
}
```

## Port Range

The server manages ports in the **user/registered port range: 1024-49151**

- **0-1023**: System/well-known ports (not managed)
- **1024-49151**: User/registered ports (managed by this server)
- **49152-65535**: Dynamic/private ports (not managed)

## Data Storage

Port registrations are stored in: `~/.mcp_portman/registry.json`

The directory and file are automatically created on first registration. Format:

```json
{
  "3000": {
    "app_name": "my-web-app",
    "description": "Development server",
    "registered_at": "2025-01-15T10:30:00.123456"
  },
  "5432": {
    "app_name": "postgres",
    "description": "Main database",
    "registered_at": "2025-01-15T09:00:00.654321"
  }
}
```

## Development

Built with modern Python tools:
- **FastMCP**: Modern framework for building MCP servers
- **uv**: Fast, reliable Python package manager

### Project Structure

```
mcp_portman/
├── pyproject.toml              # Project configuration
├── README.md                   # This file
├── .gitignore                  # Git ignore rules
└── src/
    └── mcp_portman/
        ├── __init__.py         # Package initialization
        └── server.py           # Main MCP server implementation
```

### Running in Development

```bash
# Install dependencies
uv sync

# Run the server
uv run mcp-portman

# Or run directly with Python
uv run python -m mcp_portman.server
```

## Troubleshooting

### Server not appearing in Claude Code/Desktop

1. Verify installation: `claude mcp list` should show "port-manager"
2. Check server status: `claude mcp get port-manager`
3. Verify uv is installed: `uv --version`
4. For Claude Desktop: Restart the application completely
5. Check logs for errors

### Port shows as unavailable but not registered

The port may be in use by another application. The server checks:
1. Registry database (managed by MCP Port Manager)
2. OS-level availability (actual socket binding)

A port must be free in BOTH to be considered available.

### Cannot write to registry file

Ensure you have write permissions to your home directory. The registry file is created at `~/.mcp_portman/registry.json`

## License

MIT License - feel free to use and modify as needed.

## Contributing

Contributions welcome! Feel free to submit issues or pull requests.

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: finding an available port, looking up by port, looking up by application, registering, and unregistering. There is no meaningful overlap or ambiguity between them.

Naming Consistency4/5

Tool names generally follow a verb-first pattern, but mix get_, lookup_by_, and register_/unregister_ prefixes. This is still predictable and readable, with only minor stylistic inconsistency.

Tool Count5/5

Five tools is well-scoped for a port management server. Each tool covers an essential operation without unnecessary bloat or redundancy.

Completeness4/5

The main lifecycle is covered: find a free port, register it, unregister it, and query by port or application. There is no direct update or list-all operation, but these can be worked around via unregister/register or existing lookup tools.

Maintenance

ActivityInactive
ResponsivenessNo issues