learn-mcp-server 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. learn_mcp_server/__init__.py +3 -0
  2. learn_mcp_server/data/__init__.py +15 -0
  3. learn_mcp_server/data/concepts.py +197 -0
  4. learn_mcp_server/data/configs.py +142 -0
  5. learn_mcp_server/data/curriculum.py +102 -0
  6. learn_mcp_server/data/examples.py +135 -0
  7. learn_mcp_server/data/practices.py +54 -0
  8. learn_mcp_server/prompts/__init__.py +3 -0
  9. learn_mcp_server/prompts/learning_prompts.py +84 -0
  10. learn_mcp_server/registry.py +156 -0
  11. learn_mcp_server/resources/__init__.py +15 -0
  12. learn_mcp_server/resources/concept_resources.py +221 -0
  13. learn_mcp_server/resources/config_resources.py +46 -0
  14. learn_mcp_server/resources/curriculum_resources.py +32 -0
  15. learn_mcp_server/resources/debug_resources.py +37 -0
  16. learn_mcp_server/resources/example_resources.py +72 -0
  17. learn_mcp_server/server.py +27 -0
  18. learn_mcp_server/settings.py +25 -0
  19. learn_mcp_server/tools/__init__.py +17 -0
  20. learn_mcp_server/tools/basic_tools.py +71 -0
  21. learn_mcp_server/tools/concept_tools.py +95 -0
  22. learn_mcp_server/tools/config_tools.py +112 -0
  23. learn_mcp_server/tools/debug_tools.py +122 -0
  24. learn_mcp_server/tools/example_tools.py +54 -0
  25. learn_mcp_server/tools/practice_tools.py +141 -0
  26. learn_mcp_server/utils/__init__.py +10 -0
  27. learn_mcp_server/utils/formatters.py +25 -0
  28. learn_mcp_server/utils/validators.py +39 -0
  29. learn_mcp_server-0.1.0.dist-info/METADATA +230 -0
  30. learn_mcp_server-0.1.0.dist-info/RECORD +33 -0
  31. learn_mcp_server-0.1.0.dist-info/WHEEL +4 -0
  32. learn_mcp_server-0.1.0.dist-info/entry_points.txt +2 -0
  33. learn_mcp_server-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,3 @@
1
+ __version__ = "0.1.0"
2
+
3
+ __all__ = ["__version__"]
@@ -0,0 +1,15 @@
1
+ from learn_mcp_server.data.concepts import CONCEPTS, LEARNING_MODULES
2
+ from learn_mcp_server.data.configs import CONFIG_DOCS, DEBUG_GUIDES
3
+ from learn_mcp_server.data.curriculum import CURRICULUMS
4
+ from learn_mcp_server.data.examples import CODE_EXAMPLES
5
+ from learn_mcp_server.data.practices import PRACTICE_TASKS
6
+
7
+ __all__ = [
8
+ "CODE_EXAMPLES",
9
+ "CONCEPTS",
10
+ "CONFIG_DOCS",
11
+ "CURRICULUMS",
12
+ "DEBUG_GUIDES",
13
+ "LEARNING_MODULES",
14
+ "PRACTICE_TASKS",
15
+ ]
@@ -0,0 +1,197 @@
1
+ CONCEPTS = {
2
+ "mcp": """
3
+ MCP,全称是 Model Context Protocol,中文可以理解为模型上下文协议。
4
+
5
+ 它的核心作用是让大模型应用能够用一种统一的方式连接外部工具、数据和提示词。
6
+
7
+ MCP Server 不直接等于大模型,它只是给大模型应用提供可用能力。
8
+ """,
9
+ "host": """
10
+ Host 是 MCP 架构中的宿主应用。
11
+
12
+ 它通常是用户真正使用的应用,例如 AI 编程工具、聊天应用、IDE、桌面客户端等。
13
+ """,
14
+ "client": """
15
+ Client 是 Host 内部负责和 MCP Server 通信的组件。
16
+
17
+ 它负责发送初始化请求、获取能力清单、调用工具、读取资源和获取提示词。
18
+ """,
19
+ "server": """
20
+ Server 是 MCP 架构中提供能力的一方。
21
+
22
+ MCP Server 可以提供 Tools、Resources 和 Prompts。
23
+ """,
24
+ "tool": """
25
+ Tool 是 MCP Server 暴露给模型调用的可执行能力。
26
+
27
+ Tool 适合表示动作、计算、查询、生成、处理等操作。
28
+
29
+ 在 FastMCP 中,可以使用 @mcp.tool() 把一个 Python 函数注册成 MCP Tool。
30
+ """,
31
+ "resource": """
32
+ Resource 是 MCP Server 暴露出来的可读取上下文资源。
33
+
34
+ Resource 更像文档、资料、文件、说明书、数据库记录等内容。
35
+ """,
36
+ "prompt": """
37
+ Prompt 是 MCP Server 提供的可复用提示词模板。
38
+
39
+ Prompt 适合封装一段固定的任务说明,让用户或模型可以复用。
40
+
41
+ 在 FastMCP 中,可以使用 @mcp.prompt() 注册 Prompt。
42
+ """,
43
+ "stdio": """
44
+ stdio 是 MCP 的一种本地传输方式。
45
+
46
+ 它通过标准输入和标准输出传输 MCP 消息。
47
+
48
+ stdio 模式下,不应该随便使用 print 输出普通日志,因为 stdout 是协议通信通道。
49
+ """,
50
+ "streamable-http": """
51
+ Streamable HTTP 是 MCP 的一种 HTTP 传输方式。
52
+
53
+ 它通常适合远程访问、Web 服务、长期运行的 MCP Server。
54
+ """,
55
+ "json-rpc": """
56
+ JSON-RPC 是一种基于 JSON 的远程过程调用格式。
57
+
58
+ MCP 的消息通信基于 JSON-RPC 结构,常见字段包括 jsonrpc、id、method、params、result 和 error。
59
+ """,
60
+ "resource-template": """
61
+ Resource Template 是带参数的动态 Resource。
62
+
63
+ 它通过 URI 占位符把路径中的值映射到函数参数,例如 mcp://concepts/{name} 会把 name 传给对应函数。
64
+
65
+ Resource Template 适合按名称、ID、路径或主题动态读取上下文内容。
66
+ """,
67
+ "transport": """
68
+ Transport 是 MCP Client 和 MCP Server 之间传输 JSON-RPC 消息的通道。
69
+
70
+ 常见 Transport 包括本地 stdio 和基于 HTTP 的 streamable-http。
71
+
72
+ 选择 Transport 时,要先判断 Server 是由 Host 启动,还是作为长期运行的服务被远程访问。
73
+ """,
74
+ "sse": """
75
+ SSE,全称是 Server-Sent Events,是一种服务端向客户端持续推送事件的 HTTP 技术。
76
+
77
+ 在 MCP 早期或部分生态里,SSE 曾经常被用来承载远程 MCP 通信。
78
+
79
+ 学习 SSE 的重点不是把它和 streamable-http 混为一谈,而是理解它解决的是“服务端持续发送消息”的问题。
80
+ """,
81
+ "capability-negotiation": """
82
+ 能力协商是 MCP Client 和 MCP Server 在连接初始化阶段互相确认支持能力的过程。
83
+
84
+ Client 会通过 initialize 等消息了解 Server 支持哪些 Tools、Resources、Prompts 或其他能力。
85
+
86
+ 能力协商的意义是让 Host 不需要猜测 Server 能做什么,而是通过协议清单发现可用能力。
87
+ """,
88
+ "notification": """
89
+ 通知是 MCP 中不要求对方返回结果的协议消息。
90
+
91
+ 它适合表达状态变化、进度变化、资源变更等事件。
92
+
93
+ 和普通请求不同,通知通常没有 result,重点是让另一端知道某件事已经发生。
94
+ """,
95
+ "sampling": """
96
+ 采样是 MCP 中让 Server 请求 Host 或模型生成内容的一类能力。
97
+
98
+ 它可以让某些 Server 在需要语言模型能力时,不直接内置模型,而是通过 Host 侧模型完成生成。
99
+
100
+ 学习采样时要注意权限边界:Server 不应该绕过 Host 直接滥用模型能力。
101
+ """,
102
+ "roots": """
103
+ 根目录是 Host 告诉 MCP Server 的可访问工作区范围。
104
+
105
+ 它通常用于让 Server 知道哪些目录、项目或文件范围可以作为上下文来处理。
106
+
107
+ 根目录的意义是限制边界,避免 Server 在不了解上下文范围时访问不该访问的位置。
108
+ """,
109
+ "elicitation": """
110
+ Elicitation 是 MCP 中 Server 向 Host 请求用户补充信息的一类能力。
111
+
112
+ 它适合在工具调用或工作流继续之前,让用户确认、补充或选择必要信息。
113
+
114
+ 学习 elicitation 时要注意:Server 不能假装用户已经同意,应该由 Host 控制用户交互和授权边界。
115
+ """,
116
+ "authorization": """
117
+ Authorization 是 MCP 中围绕访问授权、身份和权限边界的设计。
118
+
119
+ 它用于帮助 Host 和 Server 明确谁能访问什么资源、什么时候需要用户同意,以及凭证不能被随意暴露。
120
+
121
+ 学习授权时,不要只看“能不能连上”,还要看最小权限、用户确认和凭证保护。
122
+ """,
123
+ "security": """
124
+ Security 是 MCP 项目必须持续考虑的安全边界。
125
+
126
+ 它包括工具调用前的用户确认、敏感数据保护、prompt injection 风险、权限最小化和不信任外部输入。
127
+
128
+ 学习 MCP 安全时,要把 Server 看成会接触真实文件、网络或凭证的组件,而不只是一个普通示例函数。
129
+ """,
130
+ "tasks": """
131
+ Tasks 是 MCP 中用于描述长时间运行任务的实验性方向。
132
+
133
+ 它适合表达需要持续跟踪、可能产生进度或结果更新的工作,而不是一次请求马上返回的简单 Tool 调用。
134
+
135
+ 学习 tasks 时,重点理解它和普通 Tool 的区别:Tool 偏即时调用,长时间运行任务更强调状态、进度和后续结果。
136
+ """,
137
+ "config": """
138
+ 配置是 Host 发现和启动 MCP Server 的入口。
139
+
140
+ stdio 配置通常依赖 command 和 args,由 Host 启动本地进程。
141
+
142
+ streamable-http 配置通常依赖 url,由 Host 连接已经运行的 MCP 服务。
143
+ """,
144
+ "debug": """
145
+ Debug 是 MCP 项目开发中定位启动、注册、配置、传输和调用问题的过程。
146
+
147
+ 常见排查顺序是:先确认环境,再确认启动命令,再确认能力注册,最后确认 Host 是否重新加载配置。
148
+ """,
149
+ }
150
+
151
+ LEARNING_MODULES = [
152
+ {
153
+ "name": "MCP 基础概念",
154
+ "topics": ["mcp", "host", "client", "server"],
155
+ "description": "理解 MCP 的整体架构和核心角色。",
156
+ },
157
+ {
158
+ "name": "MCP 原语",
159
+ "topics": ["tool", "resource", "prompt"],
160
+ "description": "学习 Tool、Resource、Prompt 的用途和区别。",
161
+ },
162
+ {
163
+ "name": "MCP 传输方式",
164
+ "topics": ["stdio", "streamable-http"],
165
+ "description": "学习 MCP Server 和 Client 之间如何通信。",
166
+ },
167
+ {
168
+ "name": "MCP 协议消息",
169
+ "topics": ["json-rpc"],
170
+ "description": "理解 MCP 底层消息格式和请求响应结构。",
171
+ },
172
+ {
173
+ "name": "MCP 进阶能力",
174
+ "topics": [
175
+ "sse",
176
+ "capability-negotiation",
177
+ "notification",
178
+ "sampling",
179
+ "roots",
180
+ "elicitation",
181
+ "tasks",
182
+ ],
183
+ "description": "理解 MCP 生态里更深入的通信、能力发现、通知、采样、用户交互和任务状态。",
184
+ },
185
+ {
186
+ "name": "MCP 安全与授权",
187
+ "topics": ["security", "authorization"],
188
+ "description": "学习 MCP 项目里的安全边界、用户确认、权限最小化和凭证保护。",
189
+ },
190
+ {
191
+ "name": "MCP 工程化实践",
192
+ "topics": ["resource-template", "config", "debug"],
193
+ "description": "学习动态资源、Host 配置和常见调试流程。",
194
+ },
195
+ ]
196
+
197
+ __all__ = ["CONCEPTS", "LEARNING_MODULES"]
@@ -0,0 +1,142 @@
1
+ CONFIG_DOCS = {
2
+ "stdio": """
3
+ # stdio 配置
4
+
5
+ stdio 配置适合本地 MCP Server。Host 会启动一个本地进程,并通过标准输入输出交换 MCP 消息。
6
+
7
+ 发布后推荐使用 uvx 运行。uvx 会为这个 MCP Server 创建隔离环境并自动安装依赖,不需要用户手动配置 Python 解释器路径。
8
+
9
+ 发布版示例:
10
+
11
+ ```json
12
+ {
13
+ "mcpServers": {
14
+ "learn-mcp-server": {
15
+ "command": "uvx",
16
+ "args": [
17
+ "--from",
18
+ "learn-mcp-server==0.1.0",
19
+ "learn-mcp-server"
20
+ ]
21
+ }
22
+ }
23
+ }
24
+ ```
25
+
26
+ 本地开发示例:
27
+
28
+ ```json
29
+ {
30
+ "mcpServers": {
31
+ "learn-mcp-server": {
32
+ "command": "uv",
33
+ "args": [
34
+ "run",
35
+ "--directory",
36
+ "E:\\\\SoftwareProject\\\\learn-mcp-server",
37
+ "learn-mcp-server"
38
+ ]
39
+ }
40
+ }
41
+ }
42
+ ```
43
+ """,
44
+ "streamable-http": """
45
+ # streamable-http 配置
46
+
47
+ streamable-http 配置适合已经通过 HTTP 运行的 MCP Server。
48
+
49
+ 示例:
50
+
51
+ ```json
52
+ {
53
+ "mcpServers": {
54
+ "learn-mcp-server-http": {
55
+ "url": "http://127.0.0.1:8000/mcp"
56
+ }
57
+ }
58
+ }
59
+ ```
60
+ """,
61
+ "local-vs-remote": """
62
+ # 本地配置和远程配置
63
+
64
+ 本地 stdio 配置通常包含 command 和 args,由 Host 负责启动进程。
65
+
66
+ 给别人使用时,推荐 command 使用 uvx,并通过 --from 指定包名和版本。
67
+
68
+ 本地开发时,推荐 command 使用 uv,并通过 run --directory 指向项目目录。
69
+
70
+ 远程或 HTTP 配置通常包含 url,由 Host 连接已经运行的 MCP 服务。
71
+ """,
72
+ "common-errors": """
73
+ # 配置常见错误
74
+
75
+ 常见配置问题包括:
76
+
77
+ 1. command 没有使用 uvx,或者用户机器没有安装 uv
78
+ 2. uvx 的 --from 包名或版本号写错
79
+ 3. 本地开发配置中的 uv run --directory 路径写错
80
+ 4. stdio 配置中误写了 url
81
+ 5. streamable-http 配置中服务没有启动
82
+ 6. 修改配置后没有重启 Host
83
+ """,
84
+ }
85
+
86
+ DEBUG_GUIDES = {
87
+ "stdio": """
88
+ # stdio 调试
89
+
90
+ stdio 模式通过标准输入和标准输出传输 MCP 协议消息。
91
+
92
+ 调试时要注意:
93
+
94
+ 1. 不要使用 print 输出普通日志
95
+ 2. stdout 是协议通道
96
+ 3. 普通日志应写入 stderr 或日志文件
97
+ 4. Host 修改配置后通常需要重启
98
+ """,
99
+ "stdio-errors": """
100
+ # stdio 错误
101
+
102
+ stdio 常见错误包括:
103
+
104
+ 1. 使用 print 污染 stdout 协议通道
105
+ 2. Host 配置中的 command 没有指向 uvx 或 uv
106
+ 3. uvx 的 --from 包名或版本号不正确
107
+ 4. 本地开发配置中的 uv run --directory 路径不正确
108
+ """,
109
+ "http-errors": """
110
+ # HTTP 错误
111
+
112
+ streamable-http 常见错误包括:
113
+
114
+ 1. MCP Server 没有启动
115
+ 2. url 没有指向 /mcp
116
+ 3. 端口被占用
117
+ 4. Host 无法访问对应地址
118
+ """,
119
+ "config-errors": """
120
+ # 配置错误
121
+
122
+ 配置常见错误包括:
123
+
124
+ 1. JSON 格式不合法
125
+ 2. mcpServers 字段缺失
126
+ 3. stdio 的 command 或 args 写错
127
+ 4. streamable-http 的 url 写错
128
+ """,
129
+ "common-errors": """
130
+ # 常见错误
131
+
132
+ 常见 MCP 调试问题包括:
133
+
134
+ 1. 用户机器没有安装 uv,或者 uvx 无法解析包名
135
+ 2. 启动命令路径写错
136
+ 3. 本地开发配置中的 --directory 不在期望目录
137
+ 4. 工具函数缺少类型注解
138
+ 5. Resource URI 写错
139
+ """,
140
+ }
141
+
142
+ __all__ = ["CONFIG_DOCS", "DEBUG_GUIDES"]
@@ -0,0 +1,102 @@
1
+ CURRICULUMS = {
2
+ "beginner": """
3
+ # MCP Beginner 课程
4
+
5
+ 学习目标:
6
+ 用最短路径理解 MCP 是什么,并能运行、观察、调用一个最小 MCP Server。
7
+
8
+ 第 1 课:MCP、Host、Client、Server
9
+ - 理解 MCP 不是模型本身,而是模型应用连接外部能力的协议。
10
+ - 读取 mcp://docs/introduction 和 mcp://docs/architecture。
11
+ - 练习 explain_concept("mcp") 和 get_concept_map()。
12
+
13
+ 第 2 课:Tool
14
+ - 理解 Tool 是模型可以调用的动作。
15
+ - 读取 mcp://docs/tools 和 mcp://examples/basic-tool。
16
+ - 练习 get_practice_task("tool"),再用 check_answer 检查理解。
17
+
18
+ 第 3 课:Resource
19
+ - 理解 Resource 是模型可以读取的上下文。
20
+ - 读取 mcp://docs/resources 和 mcp://examples/basic-resource。
21
+ - 对比 compare_concepts("tool", "resource")。
22
+
23
+ 第 4 课:Prompt
24
+ - 理解 Prompt 是可复用任务模板。
25
+ - 读取 mcp://docs/prompts 和 mcp://examples/basic-prompt。
26
+ - 调用 explain_mcp_topic 观察 Prompt 返回结构。
27
+
28
+ 第 5 课:Inspector 和客户端验证
29
+ - 使用 uv run fastmcp dev inspector src\\learn_mcp_server\\server.py 查看能力列表。
30
+ - 运行 examples/client_test.py,确认 Tools、Resources、Prompts 都能被发现。
31
+ """,
32
+ "intermediate": """
33
+ # MCP Intermediate 课程
34
+
35
+ 学习目标:
36
+ 掌握动态资源、配置生成、传输方式和端到端 Client 调用流程。
37
+
38
+ 第 1 课:Resource Template
39
+ - 理解 Resource Template 是带参数的动态 Resource。
40
+ - 读取 mcp://docs/resource-template 和 mcp://examples/resource-template。
41
+ - 练习 get_practice_task("resource-template")。
42
+
43
+ 第 2 课:Transport
44
+ - 对比 stdio 和 streamable-http。
45
+ - 读取 mcp://docs/stdio、mcp://docs/streamable-http 和 mcp://docs/config-local-vs-remote。
46
+ - 调用 compare_local_and_remote_config()。
47
+
48
+ 第 3 课:Host 配置
49
+ - 调用 generate_stdio_config(command, args) 生成本地配置。
50
+ - 调用 generate_http_config(server_url) 生成 HTTP 配置。
51
+ - 用 explain_config(config_text) 解释配置。
52
+
53
+ 第 4 课:端到端 Client
54
+ - 读取 mcp://examples/end-to-end-client。
55
+ - 理解 list_tools、list_resources、call_tool、read_resource、get_prompt 的顺序。
56
+
57
+ 第 5 课:JSON-RPC
58
+ - 读取 mcp://docs/json-rpc。
59
+ - 练习 get_practice_task("json-rpc")。
60
+ """,
61
+ "advanced": """
62
+ # MCP Advanced 课程
63
+
64
+ 学习目标:
65
+ 理解 MCP 进阶能力、边界和真实项目排查方式。
66
+
67
+ 第 1 课:能力协商
68
+ - 理解 initialize 阶段如何发现 Server 能力。
69
+ - 学习 capability-negotiation,知道 Host 为什么能列出工具、资源和 Prompt。
70
+
71
+ 第 2 课:通知
72
+ - 学习 notification,理解不需要 result 的协议消息。
73
+ - 区分请求响应和单向事件通知。
74
+
75
+ 第 3 课:sampling
76
+ - 学习 sampling,理解 Server 请求 Host 侧模型生成内容的场景。
77
+ - 重点关注权限边界和 Host 控制权。
78
+
79
+ 第 4 课:elicitation
80
+ - 学习 elicitation,理解 Server 如何通过 Host 请求用户补充信息。
81
+ - 重点区分“Server 需要信息”和“Host 负责用户交互”。
82
+
83
+ 第 5 课:roots
84
+ - 学习 roots,理解 Host 提供给 Server 的工作区边界。
85
+ - 思考为什么 Server 不应该默认拥有全盘访问范围。
86
+
87
+ 第 6 课:authorization 和 security
88
+ - 学习授权、最小权限、用户确认和敏感数据保护。
89
+ - 思考 Tool 访问文件、网络或凭证前应该满足哪些条件。
90
+
91
+ 第 7 课:tasks
92
+ - 学习长时间运行任务的设计思路。
93
+ - 区分一次性 Tool 调用和需要状态、进度、后续结果的任务。
94
+
95
+ 第 8 课:调试闭环
96
+ - 调用 diagnose_issue 和 explain_error_message。
97
+ - 练习 get_practice_task("debug")。
98
+ - 按环境、启动命令、注册表、Host 重载、Client 调用顺序排查问题。
99
+ """,
100
+ }
101
+
102
+ __all__ = ["CURRICULUMS"]
@@ -0,0 +1,135 @@
1
+ CODE_EXAMPLES = {
2
+ "basic-tool": """
3
+ # basic-tool
4
+
5
+ 下面是一个最小 MCP Tool 示例:
6
+
7
+ ```python
8
+ @mcp.tool()
9
+ def get_server_info() -> str:
10
+ return "learn-mcp-server"
11
+ ```
12
+
13
+ 这个示例说明:普通 Python 函数可以通过 @mcp.tool() 注册成模型可调用的 Tool。
14
+ """,
15
+ "basic-resource": """
16
+ # basic-resource
17
+
18
+ 下面是一个最小 MCP Resource 示例:
19
+
20
+ ```python
21
+ @mcp.resource("mcp://docs/introduction")
22
+ def get_docs_introduction() -> str:
23
+ return "MCP 入门文档"
24
+ ```
25
+
26
+ 这个示例说明:Resource 通过 URI 暴露可读取的上下文内容。
27
+ """,
28
+ "resource-template": """
29
+ # resource-template
30
+
31
+ 下面是一个最小 MCP Resource Template 示例:
32
+
33
+ ```python
34
+ @mcp.resource("mcp://concepts/{name}")
35
+ def get_concept_resource(name: str) -> str:
36
+ return f"概念名称:{name}"
37
+ ```
38
+
39
+ 这个示例说明:URI 中的 {name} 会映射到同名函数参数 name。
40
+ """,
41
+ "basic-prompt": """
42
+ # basic-prompt
43
+
44
+ 下面是一个最小 MCP Prompt 示例:
45
+
46
+ ```python
47
+ @mcp.prompt()
48
+ def explain_mcp_topic(topic: str, level: str) -> str:
49
+ return f"请用 {level} 水平解释 MCP 主题:{topic}"
50
+ ```
51
+
52
+ 这个示例说明:Prompt 适合封装可复用的任务提示词模板。
53
+ """,
54
+ "tool-params": """
55
+ # tool-params
56
+
57
+ 下面是一个带参数的 MCP Tool 示例:
58
+
59
+ ```python
60
+ @mcp.tool()
61
+ def explain_concept(concept: str) -> str:
62
+ return f"解释概念:{concept}"
63
+ ```
64
+
65
+ 这个示例说明:函数参数会成为 Tool 的输入 schema。
66
+ """,
67
+ "async-tool": """
68
+ # async-tool
69
+
70
+ 下面是一个异步 MCP Tool 示例:
71
+
72
+ ```python
73
+ @mcp.tool()
74
+ async def fetch_status(url: str) -> str:
75
+ return "ok"
76
+ ```
77
+
78
+ 这个示例说明:FastMCP 可以注册 async 函数。
79
+ """,
80
+ "error-handling": """
81
+ # error-handling
82
+
83
+ 下面是一个错误处理示例:
84
+
85
+ ```python
86
+ @mcp.tool()
87
+ def explain_concept(concept: str) -> str:
88
+ if not concept.strip():
89
+ raise ValueError("concept 不能为空")
90
+ return concept
91
+ ```
92
+
93
+ 这个示例说明:Tool 可以通过清晰的异常信息帮助调用方理解输入错误。
94
+ """,
95
+ "end-to-end-client": """
96
+ # end-to-end-client
97
+
98
+ 下面是一个端到端 FastMCP Client 示例,它会列出能力、调用 Tool、读取 Resource,并获取 Prompt:
99
+
100
+ ```python
101
+ import asyncio
102
+
103
+ from fastmcp import Client
104
+ from learn_mcp_server.server import mcp
105
+
106
+
107
+ async def main() -> None:
108
+ async with Client(mcp) as client:
109
+ tools = await client.list_tools()
110
+ resources = await client.list_resources()
111
+ prompts = await client.list_prompts()
112
+
113
+ tool_result = await client.call_tool("explain_concept", {"concept": "tool"})
114
+ resource_result = await client.read_resource("mcp://docs/introduction")
115
+ prompt_result = await client.get_prompt(
116
+ "explain_mcp_topic",
117
+ {"topic": "resource", "level": "beginner"},
118
+ )
119
+
120
+ print([tool.name for tool in tools])
121
+ print([resource.uri for resource in resources])
122
+ print([prompt.name for prompt in prompts])
123
+ print(tool_result.data)
124
+ print(resource_result[0].text)
125
+ print(prompt_result.messages[0].content.text)
126
+
127
+
128
+ asyncio.run(main())
129
+ ```
130
+
131
+ 这个示例说明:学习 MCP 时,不只要知道 Tool、Resource、Prompt 怎么写,还要知道 Client 如何发现并使用它们。
132
+ """,
133
+ }
134
+
135
+ __all__ = ["CODE_EXAMPLES"]
@@ -0,0 +1,54 @@
1
+ PRACTICE_TASKS = {
2
+ "tool": {
3
+ "title": "Tool 练习",
4
+ "task": "实现一个 get_server_info Tool,返回 Server 名称、用途和当前支持的能力。",
5
+ "keywords": ["tool", "@mcp.tool", "动作", "执行"],
6
+ },
7
+ "resource": {
8
+ "title": "Resource 练习",
9
+ "task": "实现一个 mcp://docs/introduction Resource,返回一段 MCP 入门文档。",
10
+ "keywords": ["resource", "@mcp.resource", "uri", "上下文"],
11
+ },
12
+ "prompt": {
13
+ "title": "Prompt 练习",
14
+ "task": "实现一个 explain_mcp_topic Prompt,根据主题和水平生成讲解提示词。",
15
+ "keywords": ["prompt", "@mcp.prompt", "模板", "提示词"],
16
+ },
17
+ "resource-template": {
18
+ "title": "Resource Template 练习",
19
+ "task": "实现一个 mcp://concepts/{name} Resource Template,根据 name 返回不同概念文档。",
20
+ "keywords": ["resource template", "@mcp.resource", "{name}", "动态资源", "uri"],
21
+ },
22
+ "transport": {
23
+ "title": "Transport 练习",
24
+ "task": "对比 stdio 和 streamable-http,说明它们分别适合什么运行场景。",
25
+ "keywords": ["transport", "stdio", "streamable-http", "通信"],
26
+ },
27
+ "json-rpc": {
28
+ "title": "JSON-RPC 练习",
29
+ "task": "写出一个 MCP 请求消息包含哪些关键字段,并解释 method、params、result、error 的作用。",
30
+ "keywords": ["json-rpc", "method", "params", "result", "error"],
31
+ },
32
+ "config": {
33
+ "title": "Config 练习",
34
+ "task": "分别生成一个 stdio 配置和一个 streamable-http 配置,并解释 command、args、url 的区别。",
35
+ "keywords": ["config", "mcpServers", "command", "args", "url"],
36
+ },
37
+ "elicitation": {
38
+ "title": "Elicitation 练习",
39
+ "task": "设计一个需要用户补充信息才能继续的 MCP 场景,说明 Server 应该请求什么、Host 应该如何让用户确认。",
40
+ "keywords": ["elicitation", "用户", "补充信息", "确认", "Host"],
41
+ },
42
+ "security": {
43
+ "title": "Security 练习",
44
+ "task": "列出一个 MCP Tool 访问本地文件或网络前需要做的安全检查,包括用户确认、最小权限和输入校验。",
45
+ "keywords": ["security", "授权", "用户确认", "最小权限", "输入校验"],
46
+ },
47
+ "debug": {
48
+ "title": "Debug 练习",
49
+ "task": "假设 Host 看不到工具,按环境、启动命令、注册表、Host 重载的顺序写出排查步骤。",
50
+ "keywords": ["debug", "环境", "启动", "注册", "Host"],
51
+ },
52
+ }
53
+
54
+ __all__ = ["PRACTICE_TASKS"]
@@ -0,0 +1,3 @@
1
+ from learn_mcp_server.prompts import learning_prompts
2
+
3
+ __all__ = ["learning_prompts"]