nanomcp
A minimal MCP server demo written without the MCP Python SDK that demonstrates the complete protocol flow. It provides weather, file search, and datetime tools, and includes a CLI client that bridges MCP tools with OpenAI function calling.
README
nanomcp
这是一个不用 MCP Python SDK 手写的最小 MCP demo。它包含完整链路:
nanomcp.server作为 MCP server,通过 stdio 收发 JSON-RPC。nanomcp.cli作为 MCP client/host,启动 server,做initialize、tools/list、tools/call。chat命令调用 OpenAI Chat Completions。模型返回 function/tool call 后,CLI 把它转成 MCPtools/call,再把工具结果发回模型生成最终回答。
MCP 和 function call 的关系
一句话:function call 是“模型告诉你的应用它想调用什么函数”的模型 API 能力;MCP 是“你的应用如何用统一协议发现和调用外部工具/上下文服务”的连接协议。
更具体地说:
- Function/tool calling 发生在
LLM API <-> 你的应用之间。模型不会真的执行函数,它只返回类似{"name":"get_weather","arguments":{...}}的调用意图。 - MCP 发生在
你的应用 <-> MCP server之间。MCP server 暴露工具清单和执行入口,比如tools/list和tools/call。 - Host/client 是中间人。它先从 MCP server 拿工具 schema,把这些 schema 转成模型 API 的 tools;模型选择工具后,host/client 再调用 MCP server。
本项目里的链路是:
用户问题
-> nanomcp.cli
-> OpenAI Chat Completions tools=function schemas
<- 模型返回 tool_calls
-> nanomcp.cli 把 tool_call 映射为 MCP tools/call
-> nanomcp.server 执行 get_weather 或 find_files
<- MCP tool result
-> nanomcp.cli 把结果发回模型
<- 模型最终回答
所以它们不是同一个层级:
Function call: 模型 API 的工具选择/参数生成机制
MCP: 应用连接工具服务器的标准协议
文件结构
nanomcp/
nanomcp/
cli.py # MCP client + model caller
server.py # hand-written MCP server over stdio
tests/
test_protocol.py
pyproject.toml
README.md
直接跑 MCP,不调用模型
在项目目录运行:
cd ~/Desktop/nanomcp
python3 -m nanomcp.cli list-tools
直接调用天气工具:
python3 -m nanomcp.cli call get_weather '{"location":"Shanghai","unit":"celsius"}'
直接调用当前日期时间工具:
python3 -m nanomcp.cli call get_current_datetime '{"timezone":"Asia/Shanghai"}'
直接调用文件查找工具:
python3 -m nanomcp.cli call find_files '{"query":"*.pdf","max_results":5}'
默认只搜索 ~/Desktop。可以临时扩大或缩小搜索根目录:
NANOMCP_FILE_ROOT=~/Desktop/nanomcp python3 -m nanomcp.cli call find_files '{"query":"*.py"}'
跑完整模型 + MCP 链路
需要 OpenAI API key。这里没有使用 OpenAI Python SDK,而是用标准库 urllib 直接发 HTTP。
推荐把本地配置写进 .env:
cd ~/Desktop/nanomcp
cp .envtemplate .env
然后编辑 .env:
OPENAI_API_KEY=你的 key
OPENAI_BASE_URL=https://api.openai.com/v1
NANOMCP_MODEL=gpt-4.1-mini
NANOMCP_TIMEZONE=Asia/Shanghai
.env 会被 CLI 自动读取,并且已经被 .gitignore 忽略。
cd ~/Desktop/nanomcp
python3 -m nanomcp.cli chat "上海今天天气怎么样?顺便帮我找桌面上的 PDF 文件"
默认模型是 gpt-4.1-mini。你可以改:
NANOMCP_MODEL=gpt-5-mini python3 -m nanomcp.cli chat "找一下这个项目里的 py 文件"
如果你使用 OpenAI-compatible gateway:
OPENAI_BASE_URL=http://localhost:8000/v1 python3 -m nanomcp.cli chat "上海天气怎么样?"
轻量检查本地配置和 MCP server:
python3 -m nanomcp.cli doctor
Troubleshooting
如果 chat 输出 OpenAI API quota is exhausted (429 insufficient_quota),意思是模型 API 拒绝了请求:当前 OPENAI_API_KEY 所属项目没有可用额度或 billing 没开通。这不是 MCP server 失败,因为请求在模型返回 tool call 之前就被拒绝了。
排查顺序:
python3 -m nanomcp.cli doctor
echo "$OPENAI_API_KEY"
cat .env
python3 -m nanomcp.cli call get_weather '{"location":"Shanghai"}'
OPENAI_BASE_URL=http://localhost:8000/v1 python3 -m nanomcp.cli chat "上海天气怎么样?"
- 第一个命令脱敏显示有效配置、shell 是否覆盖
.env、MCP server 是否能列出工具。 - 第二个命令确认 shell 里是否已经设置了 key。
- 第三个命令确认
.env里的本地配置。 - 第四个命令验证本地 MCP 链路是否正常,不依赖模型 API。
- 第五个命令演示如何切到 OpenAI-compatible gateway。
- 如果仍然使用 OpenAI 官方 API,需要更换有额度的 key/project,或检查 billing 和模型权限。
可选真实天气
默认天气是 deterministic demo data,方便无网络、无第三方 key 时学习协议链路。要尝试真实查询:
NANOMCP_LIVE_WEATHER=1 python3 -m nanomcp.cli call get_weather '{"location":"Shanghai"}'
真实天气使用 https://wttr.in,失败时会自动回退到 demo data。
测试
cd ~/Desktop/nanomcp
python3 -m unittest discover -s tests
测试覆盖:
- MCP
initialize - MCP
tools/list - MCP
tools/call get_weather - MCP
tools/call find_files - MCP
tools/call get_current_datetime
关键观察
看 nanomcp/cli.py 的 openai_tools_from_mcp():它把 MCP tool schema 转成 OpenAI function tool schema。
看 run_chat():它收到模型 tool_calls 后调用 mcp.call_tool()。这就是 MCP 和 function call 的衔接点。
看 nanomcp/server.py 的 main():它只读 stdin、写 stdout,每一行都是 JSON-RPC。server 不知道 OpenAI,也不直接接触模型。
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。