Skip to content

Commit 74eb870

Browse files
committed
Serper MCP Client
1 parent c2f96b6 commit 74eb870

File tree

5 files changed

+1134
-199
lines changed

5 files changed

+1134
-199
lines changed

README-Postman-Testing.md

Lines changed: 0 additions & 199 deletions
This file was deleted.

README-add.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,10 @@ docker build -t serper-mcp-server .
3737
docker run -it --rm -e SERPER_API_KEY=b3cf... serper-mcp-server
3838
docker run -it -d -e SERPER_API_KEY=b3cf... serper-mcp-server
3939
```
40+
41+
## Agent Client
42+
43+
```cmd
44+
uv add langchain-openai
45+
uv add langgraph
46+
```

fastmcp_serper_client.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import os
2+
import asyncio
3+
import traceback
4+
from dotenv import load_dotenv
5+
from langchain_openai import ChatOpenAI
6+
from langgraph.prebuilt import create_react_agent
7+
from langchain_mcp_adapters.client import MultiServerMCPClient
8+
from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
9+
10+
load_dotenv()
11+
12+
SERPER_API_KEY = os.getenv("SERPER_API_KEY")
13+
14+
15+
class SerperAgent:
16+
def __init__(self) -> None:
17+
self.llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
18+
self.client: MultiServerMCPClient | None = None
19+
self.agent = None
20+
self.is_initialized = False
21+
22+
async def initialize(self) -> None:
23+
"""Initialize MCP client and agent"""
24+
try:
25+
# Initialize MCP client for serper-mcp-server
26+
self.client = MultiServerMCPClient(
27+
{
28+
"serper": {
29+
"transport": "stdio",
30+
"command": "uvx",
31+
"args": ["serper-mcp-server"],
32+
"env": {"SERPER_API_KEY": SERPER_API_KEY},
33+
}
34+
}
35+
)
36+
tools = await self.client.get_tools()
37+
self.agent = create_react_agent(self.llm, tools)
38+
self.is_initialized = True
39+
print("✅ MCP client initialized with serper-mcp-server.")
40+
except Exception:
41+
traceback.print_exc()
42+
raise
43+
44+
async def ask(self, messages: list[BaseMessage]) -> str:
45+
"""Ask a question to the agent"""
46+
try:
47+
if not self.is_initialized:
48+
await self.initialize()
49+
50+
result = await self.agent.ainvoke({"messages": messages})
51+
for msg in reversed(result["messages"]):
52+
if isinstance(msg, AIMessage):
53+
return msg.content
54+
return "No valid AI response."
55+
except Exception as e:
56+
traceback.print_exc()
57+
return f"Error: {e}"
58+
59+
async def close(self):
60+
"""Clean up"""
61+
# MultiServerMCPClient does not have close(), just clear the client
62+
self.client = None
63+
self.agent = None
64+
self.is_initialized = False
65+
print("🛑 MCP client closed.")
66+
67+
68+
async def main():
69+
agent = SerperAgent()
70+
71+
# Example questions
72+
questions = [
73+
"What is the weather in Taipei?",
74+
"What is the benefit of using FastMCP?"
75+
]
76+
77+
for q in questions:
78+
messages = [HumanMessage(content=q)]
79+
response = await agent.ask(messages)
80+
print(f"💡 Q: {q}\n➡️ A: {response}\n")
81+
82+
await agent.close()
83+
84+
85+
if __name__ == "__main__":
86+
asyncio.run(main())

pyproject.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,14 @@ requires-python = ">=3.11"
1111
dependencies = [
1212
"aiohttp>=3.11.16",
1313
"certifi>=2025.1.31",
14+
"fastmcp>=2.10.6",
15+
"langchain>=0.3.27",
16+
"langchain-mcp-adapters>=0.1.9",
17+
"langchain-openai>=0.3.28",
18+
"langgraph>=0.6.2",
19+
"langgraph-prebuilt>=0.6.2",
1420
"mcp[cli]>=1.6.0",
21+
"openai>=1.98.0",
1522
"pydantic>=2.11.2",
1623
"python-dotenv>=1.1.0",
1724
]

0 commit comments

Comments
 (0)