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]"
```
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues