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/"  
  },  
}

python sdk

posted @ 2025-05-11 14:11  一石数字欠我15w!!!  阅读(808)  评论(0)    收藏  举报