Skip to main content
Glama
SAS-AII

mcp-server

by SAS-AII
README.md
<p align = "center" draggable=”false” ><img src="https://github.com/AI-Maker-Space/LLM-Dev-101/assets/37101144/d1343317-fa2f-41e1-8af1-1dbb18399719" 
     width="200px"
     height="auto"/>
</p>

## <h1 align="center" id="heading">AI Makerspace: MCP Session Repo for Session 13</h1>

This project is a demonstration of the MCP (Model Context Protocol) server, which utilizes the Tavily API for web search capabilities. The server is designed to run in a standard input/output (stdio) transport mode.

## Project Overview

The MCP server is set up to handle web search queries using the Tavily API. It is built with the following key components:

- **TavilyClient**: A client for interacting with the Tavily API to perform web searches.

## Prerequisites

- Python 3.13 or higher
- A valid Tavily API key

## ⚠️NOTE FOR WINDOWS:⚠️

You'll need to install this on the *Windows* side of your OS. 

This will require getting two CLI tool for Powershell, which you can do as follows:

- `winget install astral-sh.uv`
- `winget install --id Git.Git -e --source winget`

After you have those CLI tools, please open Cursor *into Windows*.

Then, you can clone the repository using the following command in your Cursor terminal:

```bash
git clone https://AI-Maker-Space/AIE7-MCP-Session.git
```

After that, you can follow from Step 2. below!

## Installation

1. **Clone the repository**:
   ```bash
   git clone <repository-url>
   cd <repository-directory>
   ```

2. **Configure environment variables**:
Copy the `.env.sample` to `.env` and add your Tavily API key:
   ```
   TAVILY_API_KEY=your_api_key_here
   ```

3. 🏗️ **Add a new tool to your MCP Server** 🏗️

Create a new tool in the `server.py` file, that's it!

## Running the MCP Server

To start the MCP server, you will need to add the following to your MCP Profile in Cursor:

> NOTE: To get to your MCP config. you can use the Command Pallete (CMD/CTRL+SHIFT+P) and select "View: Open MCP Settings" and replace the contents with the JSON blob below.

```
{
    "mcpServers":  {
        "mcp-server": {
            "command" : "uv",
            "args" : ["--directory", "/PATH/TO/REPOSITORY", "run", "server.py"]
        }
    }
}
```

The server will start and listen for commands via standard input/output.

## Usage

The server provides a `web_search` tool that can be used to search the web for information about a given query. This is achieved by calling the `web_search` function with the desired query string.

## Activities: 

There are a few activities for this assignment!

### 🏗️ Activity #1: ✅

- Built an MCP tool for the Chess.com API to fetch player details and ratings.
- Implemented as `chess_player_stats` in `server.py` and routed via `chess_router.py`.

### 🏗️ Activity #2: LangGraph + MCP Chess App ✅

- Implemented a LangGraph ReAct agent that connects to the local MCP server and automatically selects chess tools for natural-language queries.
- Requirements:
  - Install Stockfish and ensure `stockfish` is in your PATH (or set `STOCKFISH_PATH` in `.env`).
  - Set `.env` variables: `OPENAI_API_KEY`, `CHESS_USERNAME`. Optional: `TAVILY_API_KEY`, `STOCKFISH_PATH`.
- Run:
  ```bash
  uv run main.py
  ```

TDQS

B3.1/5.0

Scored across 10 tools

Disambiguation3/5

Most chess tools are clearly distinct (stats, matches, analysis by PGN or ID), but the generic 'chess' tool duplicates all their functionality, creating ambiguity about which tool to use. web_search and roll_dice are unrelated and easy to distinguish.

Naming Consistency3/5

web_search and roll_dice use verb_noun pattern consistently. Chess tools mostly follow chess_verb_noun but include exceptions like 'chess_player_stats' (noun_noun) and 'chess_recent_matches' (adjective_noun). The plain 'chess' tool breaks the pattern entirely.

Tool Count3/5

10 tools is a reasonable number, but the inclusion of the redundant 'chess' tool and the mix of unrelated domains (web search, dice, chess) makes the surface feel slightly bloated. Could be streamlined by removing the generic chess tool.

Completeness3/5

The chess subdomain covers stats, recent matches, and PGN analysis well, but lacks features like game archiving or move-by-move play. web_search and roll_dice are single-purpose and complete. Overall the surface is adequate but not deep in any area.

Maintenance

ActivityInactive
ResponsivenessNo issues