199 lines
5.3 KiB
Python
199 lines
5.3 KiB
Python
"""
|
|
MCP Tools with Config Dict Format - Example
|
|
|
|
This example demonstrates using MCP tools with the simplified config dict format.
|
|
Instead of explicitly creating MCPClient objects, you can pass MCP server configs
|
|
directly to the tools parameter.
|
|
"""
|
|
|
|
import os
|
|
from dotenv import load_dotenv
|
|
import aisuite as ai
|
|
|
|
# Load environment variables
|
|
load_dotenv()
|
|
|
|
# Create aisuite client
|
|
client = ai.Client()
|
|
|
|
print("=" * 70)
|
|
print("Example 1: Basic Config Dict Usage")
|
|
print("=" * 70)
|
|
|
|
# Instead of creating MCPClient explicitly, pass config dict directly!
|
|
response = client.chat.completions.create(
|
|
model="openai:gpt-4o",
|
|
messages=[
|
|
{"role": "user", "content": "List all Python files in the current directory"}
|
|
],
|
|
tools=[
|
|
{
|
|
"type": "mcp",
|
|
"name": "filesystem",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-filesystem", os.getcwd()],
|
|
}
|
|
],
|
|
max_turns=2,
|
|
)
|
|
|
|
print(response.choices[0].message.content)
|
|
|
|
print("\n" + "=" * 70)
|
|
print("Example 2: Filtering Tools with allowed_tools")
|
|
print("=" * 70)
|
|
|
|
# Only allow specific tools for security
|
|
response = client.chat.completions.create(
|
|
model="openai:gpt-4o",
|
|
messages=[{"role": "user", "content": "Read the README.md file"}],
|
|
tools=[
|
|
{
|
|
"type": "mcp",
|
|
"name": "filesystem",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-filesystem", os.getcwd()],
|
|
"allowed_tools": ["read_file"], # Security: only allow reading, not writing
|
|
}
|
|
],
|
|
max_turns=2,
|
|
)
|
|
|
|
print(response.choices[0].message.content)
|
|
|
|
print("\n" + "=" * 70)
|
|
print("Example 3: Multiple MCP Servers with Tool Prefixing")
|
|
print("=" * 70)
|
|
|
|
import tempfile
|
|
|
|
temp_dir = tempfile.mkdtemp()
|
|
|
|
# Connect to two different filesystem servers with prefixing
|
|
# This avoids tool name collisions
|
|
response = client.chat.completions.create(
|
|
model="anthropic:claude-3-5-sonnet-20240620",
|
|
messages=[
|
|
{
|
|
"role": "user",
|
|
"content": "How many files are in the current directory vs the temp directory?",
|
|
}
|
|
],
|
|
tools=[
|
|
{
|
|
"type": "mcp",
|
|
"name": "current_dir",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-filesystem", os.getcwd()],
|
|
"use_tool_prefix": True, # Tools named "current_dir__list_directory", etc.
|
|
},
|
|
{
|
|
"type": "mcp",
|
|
"name": "temp_dir",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-filesystem", temp_dir],
|
|
"use_tool_prefix": True, # Tools named "temp_dir__list_directory", etc.
|
|
},
|
|
],
|
|
max_turns=3,
|
|
)
|
|
|
|
print(response.choices[0].message.content)
|
|
|
|
print("\n" + "=" * 70)
|
|
print("Example 4: Mixing MCP Configs with Python Functions")
|
|
print("=" * 70)
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
def get_current_time() -> str:
|
|
"""Get the current date and time."""
|
|
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
|
|
def calculate_stats(numbers: list) -> dict:
|
|
"""Calculate basic statistics for a list of numbers.
|
|
|
|
Args:
|
|
numbers: List of numbers to analyze
|
|
"""
|
|
return {
|
|
"count": len(numbers),
|
|
"sum": sum(numbers),
|
|
"average": sum(numbers) / len(numbers) if numbers else 0,
|
|
}
|
|
|
|
|
|
# Mix everything: MCP configs + Python functions!
|
|
response = client.chat.completions.create(
|
|
model="openai:gpt-4o",
|
|
messages=[
|
|
{
|
|
"role": "user",
|
|
"content": "What time is it? Also, list all files in the current directory.",
|
|
}
|
|
],
|
|
tools=[
|
|
get_current_time, # Regular Python function
|
|
calculate_stats, # Another Python function
|
|
{
|
|
"type": "mcp",
|
|
"name": "filesystem",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-filesystem", os.getcwd()],
|
|
}, # MCP config dict
|
|
],
|
|
max_turns=3,
|
|
)
|
|
|
|
print(response.choices[0].message.content)
|
|
|
|
print("\n" + "=" * 70)
|
|
print("Example 5: When to Use Config Dict vs MCPClient")
|
|
print("=" * 70)
|
|
|
|
print("""
|
|
Use Config Dict When:
|
|
✓ Quick prototypes and simple scripts
|
|
✓ One-off tool usage
|
|
✓ Don't need to reuse MCP client across multiple requests
|
|
✓ Want automatic cleanup
|
|
✓ Less code is better
|
|
|
|
Use Explicit MCPClient When:
|
|
✓ Need to reuse the same MCP connection across multiple requests
|
|
✓ Want to inspect available tools before using them
|
|
✓ Need fine-grained control over connection lifecycle
|
|
✓ Building a long-running application
|
|
✓ Want to manually manage resources
|
|
|
|
Example of explicit MCPClient:
|
|
""")
|
|
|
|
from aisuite.mcp import MCPClient
|
|
|
|
# Create once, reuse many times
|
|
mcp = MCPClient(
|
|
command="npx", args=["-y", "@modelcontextprotocol/server-filesystem", os.getcwd()]
|
|
)
|
|
|
|
# Inspect available tools
|
|
print(f"\\nAvailable tools: {[t['name'] for t in mcp.list_tools()]}")
|
|
|
|
# Reuse across multiple requests
|
|
for query in ["List files", "Count files", "Check if README exists"]:
|
|
response = client.chat.completions.create(
|
|
model="openai:gpt-4o",
|
|
messages=[{"role": "user", "content": query}],
|
|
tools=mcp.get_callable_tools(),
|
|
max_turns=2,
|
|
)
|
|
print(f"\\n{query}: {response.choices[0].message.content[:100]}...")
|
|
|
|
mcp.close()
|
|
|
|
print("\n" + "=" * 70)
|
|
print("All examples completed!")
|
|
print("=" * 70)
|