树莓派5:充当streamable-http类型的MCP服务器

为了尽量提高本地部署的小参量打折精度LLM获取数据时的幻觉问题,最近研究了下MCP。stdio和streamable-http方式都尝试了一下,在我的测试场景下都可行。鉴于streamable-http方式部署更为灵活,因此也尝试了一下用树莓派5充当streamable-http类型的MCP服务器。其实方法是通用的,跨平台完全可用。

我的测试场景是数据库内存放一套员工信息,模拟我知道某人姓名或前几个字,希望查询到他的工号。

跑通后在Cherry Studio中实际效果如下:

代码编写也很简单。首先还是环境准备,先创建一个名为mcp的环境:

bash 复制代码
source ~/anaconda3/bin/activate
conda create -n mcp python=3.11
conda activate mcp

然后安装fastmcp主框架。顺带着把数据库连接库也一起装了(我的计划里mssql和mysql都会用到):

python 复制代码
pip install fastmcp pymssql pymysql

然后写python(这里只用到了mysql。调用mssql的代码整体类似,个别细节上略有不同),保存为server.py

python 复制代码
from fastmcp import FastMCP
import pymysql
import json
from decimal import Decimal
from datetime import datetime, date
from pymysql.cursors import DictCursor

# ---------- 通用序列化补丁 ----------
def json_default(obj):
    if isinstance(obj, (datetime, date)):
        return obj.strftime('%Y-%m-%d %H:%M:%S')[:19]
    if isinstance(obj, Decimal):
        return float(obj)
    raise TypeError(f'Unsupported type: {type(obj)}')

mcp = FastMCP("Demo")          # 1. 实例化

@mcp.tool()                    # 2. 注册工具
def query_staff(emp_name: str) -> str:
    """
    根据提供的姓名查询员工基本信息。以二维表格方式呈现。
    Query basic employee infomation by employee name.

    :param emp_name: 姓名。
    """

    rows = []

    # 这里去数据库查
    conn = pymysql.connect(
        host="你的mysql服务器",
        user="你的用户名",
        password="你的密码",
        database="你的数据库",
        charset="utf8mb4",
        cursorclass=DictCursor
    )
    sql = """ 
        select * from Sheet1 where staff_name like %s 
    """

    try:
        with conn.cursor() as cur:
            cur.execute(sql, (emp_name + "%",))
            rows = cur.fetchall()          # 一次性拿列表
    except pymysql.DatabaseError as e:   # 数据库层错误
        print('数据库报错:', e)
    except Exception as e:               # 其他所有异常
        print('其他异常:', e)
    finally:
        conn.close()

    return json.dumps(rows, ensure_ascii=False, default=json_default)


if __name__ == "__main__":
    # 3. 以 streamable-http 方式监听 8000 端口
    mcp.run(transport="streamable-http", host="0.0.0.0", port=8000, path="/mcp")

需要注意的是:

1、@mcp.tool() 是第一个关键。我的这个小示例里仅提供了一个工具(query_staff),但实际上可以继续添加其他工具 ,只要在函数前也加上@mcp.tool()。

2、注意函数体内的这段注释,

"""

根据提供的姓名查询员工基本信息。以二维表格方式呈现。

Query basic employee infomation by employee name.

:param emp_name: 姓名。

"""

看着是"注释",但实际上有它极为重要的用途,回答了一个很现实的问题:LLM怎么知道什么时候去触发调用MCP工具,又怎么知道那个词其实是参数?

运行就一句话,python server.py。一切正常的话看起来应该这样:

Cherry Studio中需要配置该MCP,参考信息如下。IP地址改成你实际的。以目前的测试情况看请求头并不能省略:

最后想说的是,给LLM会话工具配置mcp也不是万能的。小参量LLM的幻觉表现之一就是它会不调用工具直接编个结果扔给你。因此如果在意数据准确性的话,建议每次都要看下答复上方是否出现了成功调用工具的记录。

相关推荐
小七-七牛开发者6 小时前
Coding Agent 规则管理:CLAUDE.md、Skills、Hooks、Subagents 到底怎么选?
ai·大模型·agent·claude·token·loop·mcp·claudecode·ai coding
doiito12 小时前
左脚踩右脚:让 LLM 自进化的 Agent 轨迹训练法——为什么它能补上主流范式的最后一块拼图
ai·系统设计
带刺的坐椅21 小时前
从 Claude Code 隐私争议,看 SolonCode 的设计选择
ai·llm·agent·claudecode·soloncode·codingplan
lincats1 天前
Claude Code项目越写越乱?这套清理流程能救你
ai·ai agent·claude code
云燕实验室CloudLab1 天前
《AI开始"抱团"思考了!多智能体 + 思维图到底有多强?》
ai·学习工具·智慧学伴
小七-七牛开发者1 天前
论文解读:DeepSeek DSpark 在真实高并发推理服务中,如何保证 Token 生成又好又快?
ai·大模型·编程·ai coding
doiito2 天前
【Agent Harness】Gliding Horse 核心设计理念,不跟风开发自己的AI Agent
ai·rust·架构设计·系统设计·ai agent
doiito2 天前
【Agent Harness】Gliding Horse 的 L2 作战地图:让多 Agent 协作从“摸黑”变成“透明”
ai·rust·架构设计·系统设计·ai agent
xiezhr3 天前
逛GitHub发现一款免费带有AI功能的数据库管理工具DBX
ai·开源软件·自然语言·数据库管理工具
垚森4 天前
我用 GLM-5.2 造了个炸裂主题后台:16 套主题随心切,可在线体验
ai·react