Dify接入MCP服务
定义mcp工具
集成Django代码示例

- init.py
from mcp.server.fastmcp import FastMCP
# 启动django
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cam_agent.settings")
import django
django.setup()
_mcp = FastMCP("CamAgent")
- main.py
import uvicorn
import logging
import contextlib
from collections.abc import AsyncIterator
from datetime import datetime
from mcp.server import Server
from mcp.server.sse import SseServerTransport
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.requests import Request
from starlette.routing import Mount, Route
from starlette.types import Receive, Scope, Send
# 引入全局_mcp
from mcp_sse import _mcp
logger = logging.getLogger("server.mcp")
# 分块设计,显性加载
from mcp_sse.services import base
from mcp_sse.services import user
from mcp_sse.services import device
from mcp_sse.services import weather
from mcp_sse.services import settings
def create_starlette_app(mcp_server: Server, json_response: bool = True, debug: bool = False) -> Starlette:
"""Mcp Server"""
sse = SseServerTransport("/messages/")
session_manager = StreamableHTTPSessionManager(
app=mcp_server,
event_store=None,
json_response=json_response,
stateless=True,
)
async def handle_sse(request: Request):
async with sse.connect_sse(request.scope, request.receive, request._send) as (
read_stream,
write_stream,
):
await mcp_server.run(
read_stream, write_stream, mcp_server.create_initialization_options()
)
return JSONResponse({"status": "ok"})
async def handle_streamable_http(
scope: Scope, receive: Receive, send: Send
) -> None:
await session_manager.handle_request(scope, receive, send)
async def health_check(request: Request):
"""Health Check"""
return JSONResponse(
{
"status": "healthy",
"timestamp": datetime.now().isoformat(),
}
)
@contextlib.asynccontextmanager
async def lifespan(app: Starlette) -> AsyncIterator[None]:
"""Context manager for session manager."""
async with session_manager.run():
logger.info("Application started with StreamableHTTP session manager!")
try:
yield
finally:
logger.info("Application shutting down...")
return Starlette(
debug=debug,
routes=[
Route("/health", endpoint=health_check),
Route("/sse", endpoint=handle_sse, methods=["GET"]), # sse
Mount("/messages/", app=sse.handle_post_message),
Mount("/mcp", app=handle_streamable_http), # streamable http
],
lifespan=lifespan
)
if __name__ == '__main__':
_mcp_server = _mcp._mcp_server
starlette_app = create_starlette_app(_mcp_server, json_response=True, debug=True)
uvicorn.run(starlette_app, host="0.0.0.0", port=18001)
- base.py
"""
基础工具
"""
from mcp_sse import _mcp
from datetime import datetime
def get_current_time():
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
@_mcp.tool(name="获取当前时间")
async def get_current_time_info() -> str:
"""
获取当前时间信息,包含当前时间、常见时间名词(凌晨、早上、上午等)的定义和对应时间范围,
以及一些时间相关的规则说明。当用户问题或意图涉及到 `时间` 时,无论是否明确提及时间,都应调用此工具。
Returns:
包含当前时间信息和时间名词定义的字符串。
"""
current_time = get_current_time()
time_info = f"""
请注意,当前时间为:{current_time},所有的分析都应基于这个日期!
每天时间划分如下:
凌晨:00:00:00 - 04:59:59
早上:05:00:00 - 07:59:59
上午:08:00:00 - 10:59:59
中午:11:00:00 - 12:59:59
下午:13:00:00 - 16:59:59
傍晚:17:00:00 - 18:59:59
晚上:19:00:00 - 23:59:59
今天:00:00:00 - {current_time}
需要注意以下规则:
1. 今天表示当天 00:00 到当前时间;
2. 今天下午五点表示从四点半到五点;
3. 没有指定时间以当前时间作为结束时间,当前时间往前 30 分钟作为开始时间;
4. 如果结束时间大于当前的时间,则结束时间为当前时间;
"""
return time_info
- 启动

接入Dify
- dify安装MCP插件

- dify配置MCP

- mcp config
{
"CamAgentStreamable": {
"transport": "streamable_http",
"url": "http://localhost:18001/mcp/"
},
"Sse": {
"transport": "sse",
"url": "http://localhost:18001/sse/"
},
}
本文来自博客园,作者:一石数字欠我15w!!!,转载请注明原文链接:https://www.cnblogs.com/52-qq/p/18870757

浙公网安备 33010602011771号