# Terminal-based Chat Client with MCP Server Integration

This project demonstrates how to build a terminal-based chat client interface that connects to an MCP server and integrates with OpenAI's API. It includes a simple weather service as an example of MCP functionality.

## Prerequisites

- Python 3.8 or higher
- UV package manager (a fast, reliable Python package installer and resolver)

## Installation

### 1. Install UV

UV is a modern Python package manager that offers significant performance improvements over traditional tools like pip. It's written in Rust and provides:
- Faster package installation
- Reliable dependency resolution
- Built-in virtual environment management
- Compatible with existing Python tooling

To install UV, run:

```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```

### 2. Project Setup

1. Initialize a new project:
```bash
uv init
```

2. Create and activate a virtual environment:
```bash
uv venv
source .venv/bin/activate  # On Unix/macOS
# or
.venv\Scripts\activate  # On Windows
```

3. Install required packages:
```bash
uv pip install httpx mcp[cli] openai python-dotenv
```

## Project Structure and Implementation Guide

The project consists of two main components: a chat client (`client.py`) and a weather service (`weather.py`). Let's walk through how each component was built and what each part does.

### Building the Chat Client (client.py)

The chat client is built as an asynchronous Python application that connects to both an MCP server and OpenAI's API. Here's how it was constructed:

1. **Imports and Setup**
   ```python
   import asyncio
   import os
   import sys
   from typing import Optional
   from contextlib import AsyncExitStack
   from dotenv import load_dotenv
   import openai
   from mcp import ClientSession, StdioServerParameters
   from mcp.client.stdio import stdio_client
   ```
   - `asyncio`: For asynchronous programming
   - `AsyncExitStack`: Manages cleanup of async resources
   - `dotenv`: Loads environment variables from .env file
   - `mcp`: Core MCP functionality for server communication

2. **MCPClient Class**
   The main client class handles:
   - Connection to the MCP server
   - OpenAI API integration
   - Message processing
   - Tool execution

   Key methods:
   - `connect_to_server()`: Establishes connection to the MCP server
   - `process_query()`: Handles user queries and tool execution
   - `chat_loop()`: Manages the interactive chat session
   - `cleanup()`: Ensures proper resource cleanup

3. **Main Function**
   ```python
   async def main():
       client = MCPClient()
       try:
           await client.connect_to_server(sys.argv[1])
           await client.chat_loop()
       finally:
           await client.cleanup()
   ```
   - Entry point that initializes the client
   - Connects to the specified server
   - Runs the chat loop
   - Ensures proper cleanup

### Building the Weather Service (weather.py)

The weather service is built as an MCP server that provides weather information through the National Weather Service API:

1. **Service Initialization**
   ```python
   from mcp.server.fastmcp import FastMCP
   mcp = FastMCP("weather")
   ```
   - Creates an MCP server instance named "weather"
   - Sets up the server infrastructure

2. **API Integration**
   ```python
   NWS_API_BASE = "https://api.weather.gov"
   USER_AGENT = "weather-app/1.0"
   ```
   - Defines constants for the National Weather Service API
   - Sets up proper user agent for API requests

3. **Helper Functions**
   - `make_nws_request()`: Handles API requests with proper error handling
   - `format_alert()`: Formats weather alerts into readable text

4. **MCP Tools**
   Two main tools are implemented:
   
   a. `get_alerts(state)`:
   - Fetches active weather alerts for a US state
   - Returns formatted alert information
   
   b. `get_forecast(latitude, longitude)`:
   - Retrieves weather forecast for a location
   - Returns detailed forecast information

5. **Server Execution**
   ```python
   if __name__ == "__main__":
       mcp.run(transport="stdio")
   ```
   - Runs the MCP server using stdio transport
   - Enables communication with the chat client

## Usage

1. Create a `.env` file with your OpenAI API key:
```
OPENAI_API_KEY=your_api_key_here
```

2. Start the MCP server:
```bash
python weather.py
```

3. In a separate terminal, run the chat client:
```bash
python client.py weather.py
```

4. Interact with the chat interface:
   - Ask general questions to chat with the AI
   - Use weather-related queries to get weather information
   - Example: "What's the weather in California?" or "Are there any alerts in New York?"

## Using with Cursor's Agent Mode

This MCP server can be integrated directly with Cursor's Agent mode (Note: This is different from Cursor's Ask feature and only works in Agent mode). Here's how to set it up:

### Adding the MCP Server to Cursor

1. Open Cursor Settings
2. Navigate to `Features` > `MCP`
3. Click `+ Add New MCP Server`
4. Fill out the form:
   - **Type**: Select `stdio`
   - **Name**: "Weather Service" (or any name you prefer)
   - **Command**: Enter the full path to run the weather server:
     ```bash
     python /full/path/to/your/weather.py
     ```

### Alternative: Project-Specific Configuration

You can also configure the MCP server for your project by creating a `.cursor/mcp.json` file:

1. Create the `.cursor` directory in your project root:
```bash
mkdir .cursor
```

2. Create `mcp.json` with the following content:
```json
{
  "mcpServers": {
    "weather": {
      "command": "python",
      "args": [
        "/full/path/to/your/weather.py"
      ]
    }
  }
}
```

### Using the Weather Tools

1. Open Cursor's Composer (Agent mode)
2. The Agent will automatically detect when weather information is needed
3. Example queries:
   - "What's the current weather in San Francisco?"
   - "Are there any weather alerts in California?"
   - "Get me the forecast for New York City"

### Important Notes

- Tools are only available in Cursor's Agent mode (Composer), not in Ask mode
- By default, Cursor will ask for approval before using MCP tools
- You may need to click the refresh button in the MCP settings to see newly added tools
- The server must be running on your local machine (remote servers require SSE transport)

## Features

- Real-time chat interface with OpenAI integration
- MCP server integration for extensible functionality
- Weather service with alerts and forecasts
- Asynchronous operation for better performance
- Proper error handling and resource cleanup
- Environment variable configuration for API keys

## Contributing

Feel free to submit issues and enhancement requests!
