Skip to main content
Glama
cakhiltej9001-source

Internet Search MCP Server

README.md
# Internet Search Agent with Custom MCP Tool

This project is for the AI Engineer homework task:

- Create a custom MCP tool named `internet_search`
- Register it inside an MCP server
- Test the MCP server independently
- Connect the MCP server to a PydanticAI agent
- Connect the MCP server to CrewAI agents
- Use two CrewAI roles: Search Agent and Summary Agent

## 1. Project architecture

```text
User query
   │
   ▼
PydanticAI Agent OR CrewAI Search Agent
   │
   ▼
Custom MCP Server over stdio
   │
   ▼
internet_search MCP Tool
   │
   ▼
DuckDuckGo web results
   │
   ▼
Structured result: title, url, snippet, source
   │
   ▼
Agent summarizes answer with sources
```

## 2. Files

| File | Purpose |
|---|---|
| `internet_search_mcp_server.py` | MCP server exposing the custom `internet_search` tool |
| `search_models.py` | Pydantic models for structured search responses |
| `test_mcp_direct.py` | Tests MCP server independently without LLM/API key |
| `pydanticai_agent.py` | PydanticAI agent connected to the MCP server |
| `crewai_agents.py` | CrewAI Search Agent + Summary Agent connected to MCP server |
| `.env.example` | Environment variable template |
| `requirements.txt` | Python dependencies |

## 3. Setup

Use Python 3.11 or 3.12.

```bash
python -m venv .venv
```

Windows PowerShell:

```bash
.venv\Scripts\Activate.ps1
```

macOS/Linux:

```bash
source .venv/bin/activate
```

Install dependencies:

```bash
pip install --upgrade pip
pip install -r requirements.txt
```

## 4. Test the custom MCP tool directly

This step proves that the MCP server works independently.

```bash
python test_mcp_direct.py "AI engineering roadmap 2026"
```

Expected behavior:

- It prints available MCP tools
- It calls `internet_search`
- It prints structured JSON search results

This step does **not** need an OpenAI key.

## 5. Add API key for agent demos

Copy the example env file:

```bash
copy .env.example .env
```

On macOS/Linux:

```bash
cp .env.example .env
```

Then edit `.env` and add your real API key:

```bash
OPENAI_API_KEY=sk-your-real-key
```

Important: ChatGPT Plus is separate from API credits. PydanticAI and CrewAI need an API key from a model provider.

## 6. Run PydanticAI agent

```bash
python pydanticai_agent.py "Latest trends in AI agents"
```

What happens:

1. PydanticAI starts the MCP server as a subprocess using stdio.
2. The agent receives your question.
3. The agent calls the `internet_search` MCP tool.
4. The agent summarizes the returned search results.

## 7. Run CrewAI agents

```bash
python crewai_agents.py "Latest trends in AI product management"
```

CrewAI roles:

- `Search Agent`: calls the `internet_search` MCP tool
- `Summary Agent`: cleans and summarizes the information

The tasks run sequentially:

1. Search task
2. Summary task

## 8. Optional: Test with MCP Inspector

You can inspect the MCP server visually with:

```bash
npx -y @modelcontextprotocol/inspector
```

For stdio server configuration, use:

- Command: `python`
- Args: `internet_search_mcp_server.py`

## 9. What to tell your sir/demo explanation

> I created a custom MCP server using Python FastMCP. It exposes a tool called `internet_search`, which accepts a user query and returns structured web search results. I tested the server independently using the MCP Python client. Then I integrated the same MCP server with PydanticAI using `MCPServerStdio`. Finally, I integrated it with CrewAI using a Search Agent and Summary Agent. The Search Agent retrieves search results through MCP, and the Summary Agent converts them into a clean final answer with sources.

## 10. Common errors

### `OPENAI_API_KEY is missing`

Run the direct test first:

```bash
python test_mcp_direct.py "AI agents"
```

For PydanticAI/CrewAI, create `.env` and add your key.

### DuckDuckGo search failed

Check internet connection. Try a smaller query or run again after a few seconds.

### Import errors with CrewAI MCP

Upgrade packages:

```bash
pip install --upgrade crewai crewai-tools "mcp[cli]"
```