远程 MCP 实战:用 Python 直连 3 个免费公开服务,查询官方文档、开源项目与最新 API
远程 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 需要:
- 使用支持的传输方式建立连接;
- 发送
initialize完成协议版本和能力协商; - 调用
tools/list获取实时工具列表; - 根据服务器返回的 JSON Schema 组织参数;
- 调用
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 放进模型上下文。更合理的策略是:
- 先读取结构;
- 根据问题缩小主题;
- 优先使用
ask_question; - 只把必要结果交给模型。
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"
}
}
}
不同客户端的顶层字段可能是 servers 或 mcpServers,传输类型可能写成 http 或 streamableHttp。配置文件位置也不同。请以当前客户端文档为准,不要看到 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
在界面中:
- Transport 选择
Streamable HTTP; - URL 填写远程端点;
- 点击 Connect;
- 查看 Tools;
- 选择 Tool,按实时 Schema 填参数;
- 执行并查看原始返回。
建议按顺序测试:
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 客户端已经配置,但模型不调用
确认:
- 客户端状态页显示 Server 已连接;
- Tools 列表中能看到对应工具;
- 当前会话允许使用这些工具;
- 问题明确要求检索当前资料;
- 系统规则没有禁止外部工具。
先用 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 标准化连接的价值。
参考资料
更多推荐


所有评论(0)