Tavily Web Search MCP Server
<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:
Choose an API that you enjoy using - and build an MCP server for it!
##### ✅ Answer:
Built a client that connects with [ExchangeRate-API](https://www.exchangerate-api.com/docs/overview)
See code in this repository and screen capture of it working!
<img src="Screenshot 2025-08-06 at 9.29.51 AM.png" width="599" alt="screen capture of MCP use in Cursor" />
### 🏗️ Activity #2:
Build a simple LangGraph application that interacts with your MCP Server.
You can find details [here](https://github.com/langchain-ai/langchain-mcp-adapters)!
##### ✅ Answer:
See my [GitHub Homework Branch](https://github.com/julie-berlin/aie-cohort-7/tree/feat/homework/13_MCP/ACTIVITY_2.md) for implementation!
TDQS
Scored across 3 tools
Each tool has a clearly distinct and non-overlapping purpose: get_exchange_rate handles currency conversion, roll_dice performs random dice rolls, and web_search conducts internet searches. There is no ambiguity in their functions, making it easy for an agent to select the correct tool for each task.
The naming conventions are mixed and not fully consistent. get_exchange_rate and web_search follow a verb_noun pattern, but roll_dice uses a verb_noun format without an underscore. While all names are readable, the deviation in roll_dice breaks a consistent pattern, leading to a moderate score.
With only 3 tools, the count feels too thin for a server labeled 'Tavily Web Search MCP Server', as it suggests a broader scope than just web search. The inclusion of unrelated tools like get_exchange_rate and roll_dice makes the set seem incomplete or mismatched, lacking focus on a cohesive domain.
There are significant gaps in the tool surface for the implied domain of web search. While web_search is present, there are no complementary tools for refining searches, handling results, or managing search history. The unrelated tools (exchange rates and dice) do not contribute to a coherent workflow, leaving the core functionality underdeveloped.