loading…
Search for a command to run...
loading…
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,
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.
这是一个不用 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 把它转成 MCP tools/call,再把工具结果发回模型生成最终回答。一句话:function call 是“模型告诉你的应用它想调用什么函数”的模型 API 能力;MCP 是“你的应用如何用统一协议发现和调用外部工具/上下文服务”的连接协议。
更具体地说:
LLM API <-> 你的应用 之间。模型不会真的执行函数,它只返回类似 {"name":"get_weather","arguments":{...}} 的调用意图。你的应用 <-> MCP server 之间。MCP server 暴露工具清单和执行入口,比如 tools/list 和 tools/call。本项目里的链路是:
用户问题
-> 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
在项目目录运行:
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"}'
需要 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
如果 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 "上海天气怎么样?"
.env、MCP server 是否能列出工具。.env 里的本地配置。默认天气是 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
测试覆盖:
initializetools/listtools/call get_weathertools/call find_filestools/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,也不直接接触模型。
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"nanomcp": {
"command": "npx",
"args": []
}
}
}Web content fetching and conversion for efficient LLM usage.
Retrieval from AWS Knowledge Base using Bedrock Agent Runtime.
Provides auto-configuration for setting up an MCP server in Spring Boot applications.
A very streamlined mcp client that supports calling and monitoring stdio/sse/streamableHttp, and can also view request responses through the /logs page. It also