1. 简单实现一个查询IP信息的MCP服务
mcp服务端,mcp_server.py
import argparse
from mcp.server.fastmcp import FastMCP
from pydantic import BaseModel, IPvAnyAddress
import ipinfo
import os
import dotenv
dotenv.load_dotenv()
# Create MCP server
mcp = FastMCP("BasicServer")
class IPDetails(BaseModel):
ip: IPvAnyAddress = None # type: ignore
hostname: str | None = None
city: str | None = None
region: str | None = None
country: str | None = None
loc: str | None = None
timezone: str | None = None
class Config:
extra = "ignore"
@mcp.tool()
async def fetch_ipinfo(ip: str | None = None, **kwargs) -> IPDetails:
"""Get the detailed information of a specified IP address
Args:
ip(str or None): The IP address to get information for. Follow the format like 192.168.1.1 .
**kwargs: Additional keyword arguments to pass to the IPInfo handler.
Returns:
IPDetails: The detailed information of the specified IP address.
"""
handler = ipinfo.getHandler(
access_token=os.environ.get("IPINFO_API_TOKEN", None), #https://ipinfo.io 获取API_KEY
headers={"user-agent": "basic-mcp-server", "custom_header": "yes"},
**kwargs,
)
details = handler.getDetails(ip_address=ip)
return IPDetails(**details.all)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--server_type", type=str, default="sse", choices=["sse", "stdio"])
args = parser.parse_args()
mcp.run(args.server_type)
# 终端:启动SSE服务端 python mcp_server.py --server_type sse
mcp客户端,mcp_client.py
from contextlib import asynccontextmanager
from mcp.client.session import ClientSession
from mcp.client.sse import sse_client
from mcp.client.stdio import StdioServerParameters, stdio_client
from urllib.parse import urlparse
import logging
logger = logging.getLogger(__name__)
class MCPClient:
def __init__(self, command_or_url: str, args: list[str] = [], env: dict[str, str] = {}):
self.command_or_url = command_or_url
self.args = args
self.env = env
async def _receive_loop(self, session: ClientSession):
logger.info("Starting receive loop")
async for message in session.incoming_messages:
if isinstance(message, Exception):
logger.error("Error: %s", message)
continue
logger.info("Received message from server: %s", message)
@asynccontextmanager
async def _run_session(self):
if urlparse(self.command_or_url).scheme in ("http", "https"):
async with sse_client(self.command_or_url) as streams:
async with ClientSession(*streams) as session:
logger.info("Initializing session")
await session.initialize()
yield session
else:
server_parameters = StdioServerParameters(
command=self.command_or_url, args=self.args, env=self.env
)
async with stdio_client(server_parameters) as streams:
async with ClientSession(*streams) as session:
logger.info("Initializing session")
await session.initialize()
yield session
async def call_tool(self, tool_name: str, arguments: dict):
async with self._run_session() as session:
return await session.call_tool(tool_name, arguments)
async def list_tools(self):
async with self._run_session() as session:
return await session.list_tools()
2. 在Dify中使用MCP服务
2.1在智能体Agent中使用
需要安装插件MCP SSE / StreamableHTTP,在Marketpace里就能搜索到
点击去授权,填写启动的MCP服务地址
{
"server_name1": {
"transport": "sse",
"url": "http://192.168.209.1:8000/sse",
"headers": {},
"timeout": 60,
"sse_read_timeout": 300
}
}
新建智能体,添加工具
注意:一定两个都要加
然后就可以查询ip的位置信息了
2.2 在工作流程里面调用MCP服务
需要安装另一个插件
新建工作流程
添加开始节点,添加输入参数
添加智能体节点,选择AGENT策略为刚才安装的插件
跟在单独智能体里配置一样,工具里要选择两个
添加结束节点,添加输出变量,值选择agent输出文本
最后,点击运行测试
注意:本文归作者所有,未经作者允许,不得转载