给本地大模型装上手脚:MCP 模型上下文协议实战,让 Ollama 也能调工具、读文件、查系统

本地跑大模型的朋友应该都有这种憋屈感:模型再…

本地跑大模型的朋友应该都有这种憋屈感:模型再聪明,它也只能待在聊天框里。你让它“帮我看看服务器负载”,它一本正经地编;你让它“读一下这个日志文件”,它两手一摊。不是模型笨,是它没有手脚——没有连接外部世界的通道。

今天聊的就是给本地模型装手脚的标准协议:MCP(Model Context Protocol,模型上下文协议)。这玩意儿 2025 年开始火起来,到 2026 年已经是本地 Agent 的标配了。学完这篇,你的 Ollama 就能真正调用工具、读写文件、查询系统,从“聊天机器人”进化成“能干活的助理”。

一、MCP 到底是什么,为什么本地党更需要它

一句话概括:MCP 是一个开放协议,让大模型能以标准化的方式连接外部工具和数据源。它解决的核心问题是“模型和外部世界之间的接口混乱”——以前你想让模型调个工具,每个框架、每个工具都得单独写一套对接代码,现在统一成一套协议了。

MCP 里有三个角色,第一次接触容易绕晕,记住这个对应关系就行:

  • Host(宿主):承载 AI 的应用,比如 Claude Desktop、Cursor、Cline 这类。
  • Client(客户端):跑在 Host 内部,和 Server 建立一对一连接。
  • Server(服务端):暴露具体能力的程序,比如“读文件”“查数据库”“搜网页”。

对本地党来说,MCP 最香的地方在于:它是模型无关的。Server 写一次,既能给 Claude Desktop 用,也能通过 OpenAI 兼容接口给 Ollama 用的客户端(比如 Cline、Roo Code)用。这意味着你用本地模型,也能享受那些原本只有云端旗舰模型才有的工具调用能力。

二、动手:写一个能查系统状态的 MCP Server

环境按最省事的方式配:Python 3.10+,配合之前写过的 uv(秒级装包),用官方 mcp 包自带的 FastMCP 快速开发。先建环境、装依赖:

uv venv && source .venv/bin/activate && uv pip install mcp

然后新建 server.py,写一个能查负载、读文件的 Server:

from mcp.server.fastmcp import FastMCP
import subprocess

mcp = FastMCP("homelab")

@mcp.tool()
def get_uptime() -> str:
    """查看当前服务器的运行时长与负载。"""
    return subprocess.run(["uptime"], capture_output=True, text=True).stdout

@mcp.tool()
def read_file(path: str) -> str:
    """读取指定绝对路径的文本文件内容。"""
    with open(path, "r", encoding="utf-8") as f:
        return f.read()

if __name__ == "__main__":
    mcp.run(transport="stdio")

注意函数里的 docstring 不是写着玩的,它就是给模型看的“说明书”,后面会展开讲。

三、把 Server 挂到客户端上

先用 Claude Desktop 演示(它原生支持 MCP)。配置文件 claude_desktop_config.json 一般在 macOS 的 ~/Library/Application Support/Claude/ 或 Windows 的 %APPDATA%/Claude/ 下,加一段:

{
  "mcpServers": {
    "homelab": {
      "command": "uv",
      "args": ["run", "--with", "mcp", "/absolute/path/server.py"]
    }
  }
}

重启后,聊天框右下角会出现一个锤子图标,点开就能看到 homelab 暴露的两个工具:get_uptimeread_file

不过大多数场景你根本不用自己造轮子。MCP 生态已经攒了不少现成的 Server,官方仓库里就有文件系统、GitHub、PostgreSQL、SQLite、浏览器自动化等一大堆。比如想给模型接文件系统,直接拉官方 server:

npx -y @modelcontextprotocol/server-filesystem /home/cortex/documents

这条命令启动后,模型就能在指定目录下读文件、列目录了。把上面配置里的 command 换成 npxargs 换成对应参数即可。学会挂自己写的、再学会挂现成的,基本就能覆盖 80% 的自动化需求。

四、把 MCP 喂给本地 Ollama

这才是重点。想用本地模型调 MCP,推荐 Cline 或 Roo Code 这类 VS Code 扩展,它们既支持 MCP,又支持通过 OpenAI 兼容接口连 Ollama。三步走:

  1. Ollama 先拉起一个工具调用稳定的模型(推荐 qwen2.5 或 llama3.1 系列):
ollama run qwen2.5:14b
  1. 在 Cline 的 API 设置里,Provider 选 OpenAI Compatible,Base URL 填 http://localhost:11434/v1,API Key 随便填个 ollama,Model ID 填 qwen2.5:14b
  2. 在 Cline 的 MCP 设置里,同样挂上刚才那个 server.py,保存后工具就会出现在模型可见的工具列表里。

然后你在 Cline 里问一句“服务器现在负载怎么样?”,它就会真的去调 get_uptime,把真实结果拿回来,而不是张口就编。

五、怎么确认工具真的被调用了

光配置好还不够,得验证。最直接的办法是用官方 SDK 写个极简客户端,直连你刚写的 server,手动触发一次工具调用:

import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def main():
    params = StdioServerParameters(command="uv", args=["run", "--with", "mcp", "server.py"])
    async with stdio_client(params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            tools = await session.list_tools()
            print("可用工具:", [t.name for t in tools.tools])
            result = await session.call_tool("get_uptime", {})
            print("返回结果:", result.content[0].text)

asyncio.run(main())

跑通之后,你能在终端里直接看到工具列表和 uptime 的真实输出。这一步能帮你把问题隔离在“MCP 层”还是“模型层”——如果这里通了但模型还不调用,那就是模型能力或提示词的问题;如果这里都不通,先回去查配置。

六、踩坑记录,全是我实际翻过的车

  • 路径必须写绝对路径。args 里写相对路径,很多客户端会找不到文件,报一堆玄学错误。
  • stdio 和 SSE 别搞混。本地单机用 stdio 就够了;只有跨机器、需要远程调用时才考虑 SSE/HTTP 传输,配置复杂得多,新手别一上来就碰。
  • Windows 上 command 别直接写 python。建议用 uv run 或写全 Python 绝对路径,否则就是经典的“找不到命令”。
  • 工具描述要写清楚,模型才敢用。docstring 越具体,模型调用越准;别写“读取文件”这种模糊话,写“读取指定绝对路径的文本文件内容”。
  • 小模型工具调用稳定性差。14b 以下偶尔出现“参数格式错”“调一半放弃”,这是模型能力问题,不是 MCP 的锅;上 14b 及以上体验会明显好转。

写在最后

MCP 的价值,是把“模型调用工具”这件事从各家私有的野路子,收编成一个开放标准。对于咱们玩本地 AI 的,这意味着你今天写的 Server,明天换个模型、换个客户端照样能用,工具和模型彻底解耦。

如果你已经在折腾多节点分布式架构,那 MCP 更是绕不开的一环——把每个节点的能力(图像生成、语音合成、日志查询)都封装成 MCP Server,再由一个中枢 Agent 统一调度,这才是本地 Agent 架构该有的样子。下一期可以聊聊怎么用 MCP 把 ComfyUI、IndexTTS 这些节点串成可编排的 Agent 工作流,想看的评论区扣 1。

一句话收尾:本地模型不弱,弱的是没接上真实世界。先把 MCP 这套手脚装上,你手里的 Ollama 就真能替你干活了。有问题欢迎评论区聊。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注