远程 MCP 实战:用 Python 直连 3 个免费公开服务,查询官方文档、开源项目与最新 API

上一篇我们通过 stdio 构建了本地 MCP Server。本文继续讲解 Remote MCP:不在电脑上启动 Server,直接通过 Streamable HTTP 连接公网 MCP 服务。我们将实际使用 Microsoft Learn、DeepWiki 和 Context7,分别完成官方技术文档检索、开源仓库问答和第三方库 API 查询。三个服务均可在不配置业务 API Key 的情况下开始体验。

本文面向第一次调用远程 MCP 的开发者。你不需要购买大模型 API,也不需要注册数据库。只要安装 Python 和 MCP SDK,就能独立验证远程连接、动态发现工具并执行调用。

说明:公开服务的端点、匿名额度和工具 Schema 可能随运营策略变化。本文示例按照 2026 年 7 月公开文档编写;实际开发时,应始终通过 list_tools() 获取当前能力。


一、本地 MCP 与远程 MCP 有什么区别?

本地 MCP Server 通常由客户端启动,通过 stdin/stdout 通信:

AI Client ── stdio ── 本地 MCP Server ── 本地文件或程序

远程 MCP Server 已经运行在服务提供方的服务器上,客户端通过网络连接:

AI Client ── HTTPS / Streamable HTTP ── 远程 MCP Server

两者使用相同的 MCP 语义,但工程特征不同:

对比项 本地 MCP 远程 MCP
Server 在哪里运行 用户电脑或本机容器 服务提供方的远程服务器
常用传输 stdio Streamable HTTP
是否需要本地启动命令 需要 不需要
网络依赖 不一定需要 必须联网
认证 常由本机权限控制 可能需要 OAuth、Token 或 API Key
更新方式 用户更新本地包 服务端集中更新
常见用途 文件、Git、本机自动化 公共知识、SaaS、团队服务、云端数据

本文选择的三个 Remote MCP 都可以匿名开始使用,省去账号授权过程,适合新手先把协议调用跑通。


二、Remote MCP 不是普通 REST API

第一次接触远程 MCP,很多人会直接在浏览器中打开:

https://learn.microsoft.com/api/mcp

然后看到 405 Method Not Allowed,误以为服务已经失效。

实际上,MCP 端点不是普通网页,也不是“访问一次 URL 就返回 JSON”的 REST 接口。MCP Client 需要:

  1. 使用支持的传输方式建立连接;
  2. 发送 initialize 完成协议版本和能力协商;
  3. 调用 tools/list 获取实时工具列表;
  4. 根据服务器返回的 JSON Schema 组织参数;
  5. 调用 tools/call 并处理 MCP 结果。

所以正确关系是:

Python 程序
  ↓
MCP Client SDK
  ↓ initialize / tools/list / tools/call
Streamable HTTP
  ↓
Remote MCP Server

不要用 requests.get(mcp_url) 代替 MCP Client,也不要把当前工具参数永远硬编码成某个 REST 契约。


三、这次要使用的三个 Remote MCP

3.1 Microsoft Learn MCP

端点:

https://learn.microsoft.com/api/mcp

特点:

  • 官方公开远程服务;
  • 使用 Streamable HTTP;
  • 无需登录、无需 API Key;
  • 免费访问公开技术文档;
  • 适合查询 .NET、Azure、PowerShell、Windows 等技术资料。

公开文档列出的工具包括:

Tool 作用
microsoft_docs_search 对官方技术文档执行语义检索
microsoft_docs_fetch 将指定文档页面读取为 Markdown
microsoft_code_sample_search 搜索官方代码片段,可按语言过滤

它尤其适合解决“模型训练数据可能已经过期”的问题。例如查询某项云服务的当前配置方式、SDK 方法或产品限制。

3.2 DeepWiki MCP

端点:

https://mcp.deepwiki.com/mcp

特点:

  • 免费、无需认证;
  • 面向公开 GitHub 仓库;
  • 可以查看项目文档结构、读取项目 Wiki、进行仓库问答;
  • 适合快速理解陌生开源项目。

主要工具:

Tool 作用
read_wiki_structure 查看仓库文档主题结构
read_wiki_contents 读取仓库的完整 Wiki 内容
ask_question 针对公开仓库提出问题并获取基于仓库上下文的回答

DeepWiki 同时保留旧式 SSE 端点,但官方推荐新集成使用 /mcp 的 Streamable HTTP。本文不使用正在退出主流的 /sse

3.3 Context7 MCP

端点:

https://mcp.context7.com/mcp

特点:

  • 可匿名调用;
  • API Key 是可选项,主要用于提高速率限制;
  • 面向开发框架和依赖库的最新文档及代码示例;
  • 适合核对模型容易答错的新版 API。

主要工具:

Tool 作用
resolve-library-id 将普通库名解析为 Context7 Library ID
query-docs 使用 Library ID 查询相关文档

Context7 通常要分两步使用:先确定库的唯一 ID,再查询文档。这和数据库中“先找主键,再读取记录”有些相似。

3.4 为什么没有选择更多服务?

很多知名 Remote MCP 需要 OAuth、个人访问令牌或单独申请 API Key。例如代码托管、企业协作、支付和数据库服务都涉及用户私有数据,要求认证是合理的。

本文的目标是让新手先完成协议实践,因此只选择:

  • 可以匿名连接;
  • 不要求准备第三方账号凭据;
  • 提供真实技术价值;
  • 有明确公开文档;
  • 不会修改用户业务数据。

“无需认证”不等于“无限调用”。公共服务仍可能执行限流、公平使用策略或临时维护。


四、准备 Python 环境

4.1 创建项目

mkdir remote-mcp-demo
cd remote-mcp-demo

python -m venv .venv

激活虚拟环境。

Windows PowerShell:

.venv\Scripts\Activate.ps1

macOS / Linux:

source .venv/bin/activate

4.2 安装 MCP Python SDK

python -m pip install --upgrade pip
pip install "mcp[cli]"

确认安装:

python -c "import mcp; print('MCP SDK 安装成功')"

本文不安装模型 SDK,因为所有调用都由我们手动指定 Tool。这样可以把“远程 MCP 协议是否可用”和“大模型是否正确选择工具”两个问题分开。


五、先写一个最小连接程序

创建 hello_remote_mcp.py

import asyncio

from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client


MCP_URL = "https://learn.microsoft.com/api/mcp"


async def main() -> None:
    async with streamable_http_client(MCP_URL) as (
        read_stream,
        write_stream,
        get_session_id,
    ):
        async with ClientSession(read_stream, write_stream) as session:
            # 初始化阶段会协商协议版本和双方能力
            await session.initialize()

            tools_result = await session.list_tools()
            print("连接成功,可用工具:")
            for tool in tools_result.tools:
                print(f"- {tool.name}: {tool.description}")

            session_id = get_session_id()
            if session_id:
                print("Session ID:", session_id)


if __name__ == "__main__":
    asyncio.run(main())

运行:

python hello_remote_mcp.py

正常情况下会看到 Microsoft Learn MCP 当前暴露的工具。请注意,我们没有自己写工具列表,而是通过 session.list_tools() 动态读取。

代码执行了什么?

streamable_http_client
  └─ 建立 HTTP 传输
      └─ ClientSession
          ├─ initialize()
          └─ list_tools()

get_session_id() 可能返回 Session ID,也可能为空,取决于 Server 是否采用有状态会话。客户端代码不应该假设所有远程服务一定返回 Session ID。


六、编写一个通用 Remote MCP 命令行工具

接下来实现一份通用 Client。它支持:

  • 连接不同 Remote MCP;
  • 实时列出工具和参数 Schema;
  • 通过 JSON 参数调用任意工具;
  • 打印结构化结果和错误状态。

创建 remote_mcp.py

from __future__ import annotations

import argparse
import asyncio
import json
from typing import Any

from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client


SERVERS = {
    "learn": "https://learn.microsoft.com/api/mcp",
    "deepwiki": "https://mcp.deepwiki.com/mcp",
    "context7": "https://mcp.context7.com/mcp",
}


def pretty(data: Any) -> str:
    return json.dumps(data, ensure_ascii=False, indent=2)


async def list_tools(server_name: str) -> None:
    url = SERVERS[server_name]

    async with streamable_http_client(url) as (
        read_stream,
        write_stream,
        _,
    ):
        async with ClientSession(read_stream, write_stream) as session:
            await session.initialize()
            result = await session.list_tools()

            print(f"Server: {server_name}")
            print(f"URL: {url}")
            print(f"Tools: {len(result.tools)}\n")

            for tool in result.tools:
                print(f"## {tool.name}")
                print(tool.description or "无描述")
                print("Input Schema:")
                print(pretty(tool.inputSchema))
                print()


async def call_tool(
    server_name: str,
    tool_name: str,
    arguments: dict[str, Any],
) -> None:
    url = SERVERS[server_name]

    async with streamable_http_client(url) as (
        read_stream,
        write_stream,
        _,
    ):
        async with ClientSession(read_stream, write_stream) as session:
            await session.initialize()

            # 每次连接先发现工具,避免把 MCP 当成固定 REST API
            tools_result = await session.list_tools()
            tools = {tool.name: tool for tool in tools_result.tools}

            if tool_name not in tools:
                available = ", ".join(sorted(tools))
                raise ValueError(
                    f"当前 Server 不存在工具 {tool_name!r}。"
                    f"可用工具:{available}"
                )

            print("即将调用:", tool_name)
            print("参数:", pretty(arguments))

            result = await session.call_tool(
                tool_name,
                arguments=arguments,
            )

            # model_dump 能同时保留文本内容、结构化内容和错误标记
            payload = result.model_dump(mode="json", by_alias=True)
            print("调用结果:")
            print(pretty(payload))

            if result.isError:
                raise RuntimeError("Remote MCP 返回了工具执行错误")


def parse_arguments() -> argparse.Namespace:
    parser = argparse.ArgumentParser(
        description="连接并调用公开 Remote MCP Server"
    )
    subparsers = parser.add_subparsers(dest="command", required=True)

    list_parser = subparsers.add_parser("list", help="列出远程工具")
    list_parser.add_argument("server", choices=SERVERS)

    call_parser = subparsers.add_parser("call", help="调用远程工具")
    call_parser.add_argument("server", choices=SERVERS)
    call_parser.add_argument("tool", help="工具名称")
    call_parser.add_argument(
        "arguments",
        help='JSON 参数,例如 {"query":"FastAPI lifespan"}',
    )
    return parser.parse_args()


async def main() -> None:
    args = parse_arguments()

    if args.command == "list":
        await list_tools(args.server)
        return

    try:
        arguments = json.loads(args.arguments)
    except json.JSONDecodeError as exc:
        raise SystemExit(f"arguments 不是合法 JSON:{exc}") from exc

    if not isinstance(arguments, dict):
        raise SystemExit("arguments 必须是 JSON 对象")

    await call_tool(args.server, args.tool, arguments)


if __name__ == "__main__":
    asyncio.run(main())

先不要急着复制后面的工具调用,依次查看三个 Server 的实时 Schema:

python remote_mcp.py list learn
python remote_mcp.py list deepwiki
python remote_mcp.py list context7

你会发现 MCP 的一个关键特征:同一个 Client 只替换 URL,就可以发现和调用完全不同的远程能力。


七、实战一:查询 Microsoft 官方技术文档

7.1 搜索文档

Windows PowerShell 建议使用单引号包住 JSON:

python remote_mcp.py call learn microsoft_docs_search '{"query":"How to configure rate limiting in ASP.NET Core"}'

macOS / Linux 同样可以使用:

python remote_mcp.py call learn microsoft_docs_search \
  '{"query":"How to configure rate limiting in ASP.NET Core"}'

结果通常包含相关页面的标题、URL 和摘要。它完成的是语义搜索,不是简单匹配网页标题。

7.2 读取完整文档

从搜索结果选择一个 learn.microsoft.com 页面 URL,再调用 microsoft_docs_fetch

python remote_mcp.py call learn microsoft_docs_fetch '{"url":"把搜索结果中的官方文档URL粘贴到这里"}'

推荐始终执行“搜索 → 选择来源 → 获取全文”的两阶段流程:

宽查询
  ↓ microsoft_docs_search
候选文档与摘要
  ↓ 选择最相关的官方 URL
microsoft_docs_fetch
  ↓
完整 Markdown 文档

搜索结果适合发现资料,但如果需要根据参数表、限制或具体步骤回答,最好再获取原文。

7.3 搜索官方代码示例

python remote_mcp.py call learn microsoft_code_sample_search '{"query":"ASP.NET Core rate limiter middleware example","language":"csharp"}'

使用场景:

  • 核对 SDK 的当前写法;
  • 查找官方 Python、C#、PowerShell 示例;
  • 避免模型编造不存在的方法;
  • 根据官方来源解决版本升级问题。

7.4 控制返回 Token

Microsoft Learn MCP 公开了实验性的 maxTokenBudget URL 参数,可用于限制搜索结果大小:

SERVERS = {
    "learn": "https://learn.microsoft.com/api/mcp?maxTokenBudget=2000",
}

它适合对上下文和成本有严格预算的 AI 应用。实验性参数可能变化,生产环境使用前应重新查看官方说明。


八、实战二:用 DeepWiki 快速读懂开源项目

DeepWiki 只面向公开仓库。仓库名称通常使用:

owner/repository

例如 MCP Python SDK:

modelcontextprotocol/python-sdk

8.1 查看项目文档结构

python remote_mcp.py call deepwiki read_wiki_structure '{"repoName":"modelcontextprotocol/python-sdk"}'

这个调用适合第一次接触项目时建立整体地图。你可能会看到架构、Server、Client、Transport、示例等主题,而不是从 README 第一行盲目向下阅读。

8.2 针对仓库提问

python remote_mcp.py call deepwiki ask_question '{"repoName":"modelcontextprotocol/python-sdk","question":"How does the Streamable HTTP client establish and close a session?"}'

再换一个知名公开仓库:

python remote_mcp.py call deepwiki ask_question '{"repoName":"fastapi/fastapi","question":"How is the lifespan mechanism implemented and when should it be used?"}'

它适合回答:

  • 项目各模块如何协作;
  • 某项能力在哪一层实现;
  • 请求从入口到核心逻辑经过哪些组件;
  • 项目推荐的扩展方式是什么;
  • 学习一个大型仓库应该先读哪些文件。

8.3 读取完整 Wiki 要谨慎

python remote_mcp.py call deepwiki read_wiki_contents '{"repoName":"modelcontextprotocol/python-sdk"}'

完整内容可能很长。人类调试时可以查看,但在 AI 应用中不应默认把整个 Wiki 放进模型上下文。更合理的策略是:

  1. 先读取结构;
  2. 根据问题缩小主题;
  3. 优先使用 ask_question
  4. 只把必要结果交给模型。

8.4 不要提交私有信息

DeepWiki 的匿名 Remote MCP 针对公开仓库。不要在问题中粘贴内部源码、密钥、客户信息或未公开漏洞。即使工具本身不要求登录,请求内容仍会发送给第三方远程服务。


九、实战三:使用 Context7 查询最新依赖库文档

大模型写代码时常见的问题不是完全不会,而是使用了旧版本 API。Context7 的目标就是检索当前库文档和代码示例。

9.1 第一步:解析 Library ID

python remote_mcp.py call context7 resolve-library-id '{"libraryName":"Next.js","query":"How do I create authentication middleware?"}'

结果会返回一个或多个匹配库及其 Library ID。选择与目标最匹配的官方项目,例如公开文档中的示例 ID:

/vercel/next.js

为什么不能只传 next?因为相似名称可能对应不同项目。Library ID 用于消除歧义。

9.2 第二步:查询具体文档

python remote_mcp.py call context7 query-docs '{"libraryId":"/vercel/next.js","query":"How to create middleware that redirects unauthenticated users to /login?"}'

再查询一个数据库项目:

python remote_mcp.py call context7 query-docs '{"libraryId":"/mongodb/docs","query":"Show a Python transaction example and explain retry behavior"}'

如果不确定 Library ID,必须先调用 resolve-library-id。不要让模型凭记忆编造 ID。

9.3 提问时带上版本和目标

低质量问题:

How to use middleware?

更好的问题:

In Next.js 14, how do I create middleware that checks a cookie and redirects unauthenticated requests to /login? Include the file location and matcher configuration.

具体问题更容易检索到正确版本、文件位置和配置方式。

9.4 匿名访问与可选 API Key

Context7 当前允许直接使用远程端点;官方建议配置免费的 API Key 以获得更高限额。本文故意不配置 Key,让读者验证“零凭据连接”。

如果后续用于高频开发,应查看 Context7 最新限额与服务条款,而不是通过并发请求规避匿名限制。


十、把三个 Remote MCP 配置进 AI 客户端

我们的 Python 脚本不需要大模型,它证明了传输和工具调用本身可以工作。下一步才是把 Remote MCP 接入支持该协议的 AI 客户端,让模型按问题选择工具。

许多客户端使用类似的配置结构:

{
  "servers": {
    "microsoft-learn": {
      "type": "http",
      "url": "https://learn.microsoft.com/api/mcp"
    },
    "deepwiki": {
      "type": "http",
      "url": "https://mcp.deepwiki.com/mcp"
    },
    "context7": {
      "type": "http",
      "url": "https://mcp.context7.com/mcp"
    }
  }
}

不同客户端的顶层字段可能是 serversmcpServers,传输类型可能写成 httpstreamableHttp。配置文件位置也不同。请以当前客户端文档为准,不要看到 JSON 相似就直接复制到任意软件。

配置成功后,可以这样提问:

请使用 Microsoft Learn MCP 查询 ASP.NET Core 当前推荐的限流配置方式,给出官方来源。
请使用 DeepWiki 分析 modelcontextprotocol/python-sdk,解释 Streamable HTTP Client 的连接生命周期。
请使用 Context7 查询 Next.js 当前文档,写一个基于 Cookie 的认证中间件。

为了提高工具调用概率,可以给 Agent 增加一条清晰规则:

回答第三方框架或 SDK 的具体 API 问题前,优先使用对应文档 MCP 获取当前资料;
回答公开 GitHub 仓库内部架构问题时,使用 DeepWiki;
所有事实性结论附带工具返回的来源,不用模型记忆替代检索结果。

十一、组合使用:完成一次真实技术调研

假设任务是:

为 Python MCP Client 写一篇 Streamable HTTP 连接教程,确保示例符合当前 SDK。

可以拆成三步:

第一步:DeepWiki 理解源码结构

调用:

read_wiki_structure(modelcontextprotocol/python-sdk)
ask_question(modelcontextprotocol/python-sdk, Streamable HTTP Client 的生命周期是什么?)

目标是理解项目内部概念和实现关系。

第二步:Context7 核对当前 Python SDK 用法

先解析 MCP Python SDK 的 Library ID,再查询:

如何使用 streamable_http_client 和 ClientSession?

目标是获取当前文档片段和用法。

第三步:Microsoft Learn 补充应用场景

如果教程涉及某项 Microsoft 技术,再用 microsoft_docs_search 查询官方配置和代码样例。

组合不是把三个工具都调用一遍,而是给每个 Server 明确职责:

DeepWiki   → 公开仓库架构与源码上下文
Context7   → 第三方库当前 API 与代码示例
Learn MCP  → Microsoft 官方技术文档与样例

这样比无差别网页搜索更容易追踪来源,也能避免将不同版本资料混在一起。


十二、使用 MCP Inspector 调试远程服务

如果不想先写 Python,可以使用 MCP Inspector 查看 Remote MCP。

已经安装 Node.js 时运行:

npx -y @modelcontextprotocol/inspector

在界面中:

  1. Transport 选择 Streamable HTTP
  2. URL 填写远程端点;
  3. 点击 Connect;
  4. 查看 Tools;
  5. 选择 Tool,按实时 Schema 填参数;
  6. 执行并查看原始返回。

建议按顺序测试:

https://learn.microsoft.com/api/mcp
https://mcp.deepwiki.com/mcp
https://mcp.context7.com/mcp

Inspector 的价值在于把以下问题分开:

  • 网络能否连接;
  • initialize 是否成功;
  • Server 暴露了哪些能力;
  • 参数 Schema 是什么;
  • Tool 返回的是文本还是结构化数据;
  • 错误来自协议层还是业务层。

十三、生产代码为什么必须动态发现工具?

Microsoft Learn MCP 的官方开发建议明确指出:MCP 是动态协议,工具和请求格式可能变化。

错误做法:

# 假设工具永远存在、参数永远不变
await session.call_tool(
    "some_fixed_tool",
    arguments={"old_parameter": "value"},
)

更稳妥的流程:

async def safe_call(session, tool_name: str, arguments: dict):
    tools_result = await session.list_tools()
    current_tools = {tool.name: tool for tool in tools_result.tools}

    if tool_name not in current_tools:
        raise LookupError(f"工具已不可用:{tool_name}")

    try:
        return await session.call_tool(tool_name, arguments=arguments)
    except Exception:
        # 失败时重新获取一次工具列表,判断是否发生 Schema 变化
        refreshed = await session.list_tools()
        refreshed_names = {tool.name for tool in refreshed.tools}
        if tool_name not in refreshed_names:
            raise RuntimeError("远程工具列表已更新,请重新规划调用")
        raise

成熟客户端还应监听 Server 的工具列表变更通知,并使本地缓存失效。

本文命令行工具虽然展示了当前工具名称,但每次调用前仍执行 list_tools()。示例命令是教学入口,动态发现才是生产原则。


十四、超时、限流与重试

Remote MCP 多了一层不可靠网络。需要区分不同错误:

错误 是否重试 处理方式
临时连接超时 可以 指数退避,限制次数
HTTP 429 可以延后 遵守服务端等待时间,降低频率
HTTP 401/403 不应原样重试 检查服务是否改为需要认证
HTTP 400 通常不重试 重新获取 Schema 并修正参数
Tool 不存在 不重试旧调用 刷新工具列表
Tool 返回业务错误 视错误而定 读取 isError 和错误内容

简单的退避函数:

import asyncio
import random


async def retry_transient(operation, attempts: int = 3):
    for index in range(attempts):
        try:
            return await operation()
        except (TimeoutError, ConnectionError):
            if index == attempts - 1:
                raise

            delay = min(0.5 * (2**index) + random.random() * 0.2, 5.0)
            await asyncio.sleep(delay)

不要为了突破匿名限额创建高并发重试。错误重试可能把临时故障放大成重试风暴。


十五、Remote MCP 的安全边界

“无需认证”只表示访问公开能力时不用提供身份凭据,不代表可以忽略安全。

15.1 请求内容会离开本机

以下内容不应发送给不受信任的 Remote MCP:

  • API Key、密码和访问令牌;
  • 私有源码;
  • 客户数据和个人信息;
  • 未公开漏洞;
  • 内部域名、日志和架构细节。

本文三个服务面向公开技术资料,请只提交适合公开传输的问题。

15.2 Tool 返回内容仍是不可信输入

远程结果可能包含:

  • 错误或过期资料;
  • 社区贡献内容;
  • 试图影响模型行为的恶意文本;
  • 超长内容;
  • 与问题不相关的信息。

Host 应把 Tool 结果作为数据,而不是高优先级指令。涉及执行代码、安装软件、修改文件时,仍需检查来源和影响。

15.3 不要连接来源不明的 Server

配置 Remote MCP 相当于让 AI 应用与一个外部服务交换数据。连接前应核对:

  • 官方文档和维护方;
  • 域名与 HTTPS;
  • 权限和认证范围;
  • 隐私政策;
  • Tool 是否包含写入或高风险动作;
  • 客户端是否会自动批准工具调用。

对于带写操作的 Server,建议关闭自动批准并逐次确认。


十六、常见问题排查

16.1 浏览器打开端点返回 405

这是最常见误区。Remote MCP 端点需要 MCP Client 通过 Streamable HTTP 访问,不是普通网页。请使用 Python SDK、Inspector 或支持 MCP 的 AI 客户端。

16.2 No module named 'mcp'

确认虚拟环境已激活:

python -m pip show mcp
python -c "import sys; print(sys.executable)"

安装包的 Python 和运行脚本的 Python 必须是同一个解释器。

16.3 找不到 streamable_http_client

通常是 MCP SDK 版本太旧:

pip install --upgrade "mcp[cli]"

升级后重新打开终端或 IDE Python 环境。

16.4 工具名称与文章不同

先执行:

python remote_mcp.py list learn
python remote_mcp.py list deepwiki
python remote_mcp.py list context7

Remote MCP 可以升级工具。以实时返回的名称和 inputSchema 为准。

16.5 Context7 返回限流

降低调用频率并稍后重试。匿名调用适合学习和轻量使用;高频场景根据官方当前说明配置可选 API Key。

16.6 DeepWiki 找不到仓库

检查:

  • 仓库是否公开;
  • 名称是否为 owner/repository
  • 拼写是否正确;
  • DeepWiki 是否已经索引该仓库。

16.7 公司网络无法连接

可能是代理、证书检查或防火墙导致。不要在代码里关闭 TLS 验证。应使用组织认可的代理和 CA 证书配置,并让网络管理员确认目标域名策略。

16.8 AI 客户端已经配置,但模型不调用

确认:

  1. 客户端状态页显示 Server 已连接;
  2. Tools 列表中能看到对应工具;
  3. 当前会话允许使用这些工具;
  4. 问题明确要求检索当前资料;
  5. 系统规则没有禁止外部工具。

先用 Inspector 或本文 Python Client 验证协议层,再调试模型行为。


不要一开始就把 MCP、Agent、RAG、多模型和复杂前端全部混在一起。先用本文这种“无模型 Client”验证协议,再逐层增加复杂度,排错会容易很多。


总结

本文完成了三类真正有用的 Remote MCP 调用:

Microsoft Learn MCP
  → 查询官方技术文档、读取全文、搜索代码示例

DeepWiki MCP
  → 查看公开仓库结构、阅读 Wiki、针对源码提问

Context7 MCP
  → 解析依赖库 ID、查询当前版本文档与代码示例

最值得记住的不是三个 URL,而是 Remote MCP 的通用调用方法:

建立 Streamable HTTP 连接
  → initialize
  → list_tools 动态发现
  → 按 inputSchema 组织参数
  → call_tool
  → 检查 isError 与结构化结果

当这条链路跑通后,更换 Remote MCP Server 只是更换端点和能力,Client 的协议代码可以继续复用。这正是 MCP 标准化连接的价值。


参考资料

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐