Skip to main content
Glama
srikanth-karthi

Portfolio MCP Server

README.md
# Portfolio MCP Server

A dual-stack Model Context Protocol (MCP) server for Srikanth Karthikeyan's portfolio data, available in both Node.js and Python implementations with containerized deployment options.

## Features

The server provides the following tools:

### 🔍 `search_portfolio`

Search through portfolio data by keywords, category, or content.

**Parameters:**

- `query` (required): Search query to find relevant information
- `category` (optional): Filter by specific category
- `limit` (optional): Maximum results to return (default: 10)

### 📂 `get_portfolio_categories`

Get all available categories in the portfolio data.

### 🎯 `get_portfolio_item`

Get a specific portfolio item by ID.

**Parameters:**

- `id` (required): The ID of the portfolio item

### 📞 `get_contact_info`

Get all contact information.

### 💻 `get_tech_stack`

Get detailed information about technical skills and tools.

**Parameters:**

- `type` (optional): Filter by specific tech type

## 🚀 Installation & Deployment

### Package Registries

#### Node.js Packages (Both Registries)

```bash
# From npmjs.com (public)
npm install srikanth-mcp-portfolio-server

# From GitHub Packages
npm install @srikanth-karthi/srikanth-mcp-portfolio-server
```

#### Python Package

```bash
# From PyPI (public)
pip install srikanth-mcp-portfolio
```

### Docker Deployment (Multiple Registries)

#### From Docker Hub (Public)

```bash
# Node.js version
docker run -it srikanthkarthi/mcp-portfolio-server:nodejs-latest

# Python version
docker run -it srikanthkarthi/mcp-portfolio-server:python-latest

# Multi-runtime version
docker run -it srikanthkarthi/mcp-portfolio-server:multi-latest
```

#### From GitHub Container Registry

```bash
# Node.js version
docker run -it ghcr.io/srikanth-karthi/mcp-portfolio-server:nodejs-latest

# Python version
docker run -it ghcr.io/srikanth-karthi/mcp-portfolio-server:python-latest

# Multi-runtime version
docker run -it ghcr.io/srikanth-karthi/mcp-portfolio-server:multi-latest
```

#### Using Docker Compose (Local Development)

```bash
# Choose one:
docker compose up mcp-portfolio-nodejs    # Node.js only
docker compose up mcp-portfolio-python    # Python only
docker compose up mcp-portfolio-multi     # Both runtimes
```

### Development Setup

#### Node.js Development

```bash
npm install
npm run dev
```

#### Python Development

```bash
pip install -e .
python -m mcp_portfolio_server.server
```

## 🔧 Claude Desktop Integration

### Using Docker Hub (Public)

```json
{
  "mcpServers": {
    "portfolio": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "srikanthkarthi/mcp-portfolio-server:latest"
      ]
    }
  }
}
```

### Using GitHub Container Registry

```json
{
  "mcpServers": {
    "portfolio": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/srikanthkarthi/mcp-portfolio-server:latest"
      ]
    }
  }
}
```

### Using npm Package (Public Registry)

```json
{
  "mcpServers": {
    "portfolio": {
      "command": "npx",
      "args": ["srikanth-mcp-portfolio-server"]
    }
  }
}
```

### Using npm Package from GitHub Packages

```json
{
  "mcpServers": {
    "portfolio": {
      "command": "npx",
      "args": ["@srikanth-karthi/srikanth-mcp-portfolio-server"]
    }
  }
}
```

### Using Python Package

```json
{
  "mcpServers": {
    "portfolio": {
      "command": "python",
      "args": ["-m", "mcp_portfolio_server.server"]
    }
  }
}
```

### Development Mode

```json
{
  "mcpServers": {
    "portfolio": {
      "command": "node",
      "args": ["/path/to/mcp-portfolio/src/index.js"],
      "cwd": "/path/to/mcp-portfolio"
    }
  }
}
```

## 📦 Automated Building & Publishing

### GitHub Actions Workflows

The repository includes automated CI/CD workflows:

- **Triggers**: Git tags (`v*`) or manual workflow dispatch
- **Builds**: Multi-architecture Docker images (AMD64/ARM64)
- **Publishes**:
  - Node.js package to GitHub Packages
  - Python package to PyPI
  - Docker images to GitHub Container Registry

### Manual Building

#### Docker Build Commands

```bash
# Build Node.js image
docker build --target nodejs -t mcp-portfolio:nodejs .

# Build Python image
docker build --target python -t mcp-portfolio:python .

# Build multi-runtime image
docker build --target multi -t mcp-portfolio:multi .
```

### Configuration Options

| Environment Variable | Description              | Default                                    |
| -------------------- | ------------------------ | ------------------------------------------ |
| `NODE_ENV`           | Node.js environment      | `production`                               |
| `PYTHONUNBUFFERED`   | Python output buffering  | `1`                                        |
| `DATA_PATH`          | Portfolio data file path | `/app/db/portfolio-data/ai-portfolio.json` |

Switch between Node.js and Python in multi-runtime container:

```yaml
# In docker-compose.yml, uncomment to use Python:
command: ["python3", "-m", "mcp_portfolio_server.server"]
```

## Data Categories

The server provides access to the following portfolio categories:

- **Profile Summary**: Overview and introduction
- **Current Position**: Job title, company, duration
- **Current Work**: Responsibilities and projects
- **Experience**: Work history and achievements
- **Education**: Academic background
- **Tech Stack**: Programming languages, frameworks, tools
- **Certifications**: Professional certifications
- **Volunteerism**: Community service and activities
- **Contact**: Social media and professional links
- **Languages**: Language proficiency

## Example Queries

- Search for cloud experience: `search_portfolio("cloud", "Experience")`
- Get all tech stack info: `get_tech_stack()`
- Find contact information: `get_contact_info()`
- Search for certifications: `search_portfolio("aws certification")`

## License

MIT

TDQS

A3.8/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct purpose: search_portfolio is for free-form discovery, get_portfolio_categories and get_portfolio_item handle browsing by category or ID, while get_contact_info and get_tech_stack provide specific static information. There is no meaningful overlap that would confuse an agent.

Naming Consistency4/5

Most tools follow the 'get_' verb pattern, but search_portfolio deviates by using 'search_' instead. The two get_portfolio_* tools share a clear prefix, and the remaining get_* tools are still predictable and consistent in style.

Tool Count5/5

With 5 tools, the server is well-scoped for a personal portfolio. Each tool serves a distinct and necessary function without redundancy or excessive granularity, making the set feel curated and complete for its purpose.

Completeness4/5

The read-only portfolio surface is well covered: search, category listing, item retrieval, contact information, and tech stack. A minor gap is the lack of an explicit 'list all items' operation, though search_portfolio may fill that role depending on implementation.

Maintenance

ActivityInactive
ResponsivenessNo issues