mcp-server-core 0.2.2__tar.gz → 0.2.3__tar.gz

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 (26) hide show
  1. {mcp_server_core-0.2.2/mcp_server_core.egg-info → mcp_server_core-0.2.3}/PKG-INFO +1 -1
  2. mcp_server_core-0.2.3/mcp_framework/response.py +1 -0
  3. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/__init__.py +2 -0
  4. mcp_server_core-0.2.3/mcp_server_core/response.py +59 -0
  5. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/server.py +10 -5
  6. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3/mcp_server_core.egg-info}/PKG-INFO +1 -1
  7. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core.egg-info/SOURCES.txt +2 -0
  8. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/pyproject.toml +1 -1
  9. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/LICENSE +0 -0
  10. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/README.md +0 -0
  11. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/__init__.py +0 -0
  12. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/env.py +0 -0
  13. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/http_server.py +0 -0
  14. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/oauth.py +0 -0
  15. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/process.py +0 -0
  16. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/server.py +0 -0
  17. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/tunnel.py +0 -0
  18. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/env.py +0 -0
  19. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/http_server.py +0 -0
  20. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/oauth.py +0 -0
  21. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/process.py +0 -0
  22. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/tunnel.py +0 -0
  23. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core.egg-info/dependency_links.txt +0 -0
  24. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core.egg-info/requires.txt +0 -0
  25. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core.egg-info/top_level.txt +0 -0
  26. {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-server-core
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Universal MCP Server Framework: Streamable HTTP ASGI, Cloudflare Tunnel, OAuth 2.1 & Process Supervisor
5
5
  Author: yimmr
6
6
  License-Expression: MIT
@@ -0,0 +1 @@
1
+ from mcp_server_core.response import * # noqa: F401, F403
@@ -25,6 +25,7 @@ from .process import (
25
25
  kill_stale_server_process,
26
26
  stop_mcp_service,
27
27
  )
28
+ from .response import ToolResultListDict
28
29
  from .server import (
29
30
  build_mcp_server_app,
30
31
  record_pid,
@@ -64,6 +65,7 @@ __all__ = [
64
65
  "get_client_ip",
65
66
  "get_server_public_url",
66
67
  "verify_pkce",
68
+ "ToolResultListDict",
67
69
  "build_mcp_server_app",
68
70
  "record_pid",
69
71
  "cleanup_pid",
@@ -0,0 +1,59 @@
1
+ """Structured response containers and protocol helpers for MCP tools."""
2
+ from __future__ import annotations
3
+
4
+ from typing import Any
5
+
6
+
7
+ class ToolResultListDict(dict):
8
+ """Structured container that ensures atomic, single-block MCP response serialization while preserving list semantics.
9
+
10
+ FastMCP converts any returned Python list into multiple separate TextContent blocks
11
+ in the MCP protocol response. When intermediate MCP gateways or LLM clients parse
12
+ the response, many gateways only inspect the last TextContent block, resulting in
13
+ truncation (e.g. only returning the last project, file, or item).
14
+
15
+ ToolResultListDict inherits from dict so FastMCP serializes the ENTIRE structure
16
+ into a single TextContent JSON payload:
17
+ {"status": "success", "count": N, "total": N, "<key>": items, "entries": items}
18
+
19
+ Simultaneously, for Python unit tests and backward compatibility, it implements
20
+ list-like iteration (__iter__), indexing (__getitem__ for int), length (__len__),
21
+ and membership (__contains__).
22
+ """
23
+
24
+ def __init__(
25
+ self,
26
+ items: list[Any],
27
+ key: str = "items",
28
+ status: str = "success",
29
+ **extra: Any,
30
+ ) -> None:
31
+ super().__init__()
32
+ self["status"] = status
33
+ self["total"] = len(items)
34
+ self["count"] = len(items)
35
+ self[key] = items
36
+ if key != "entries":
37
+ self["entries"] = items
38
+ for k, v in extra.items():
39
+ self[k] = v
40
+ self._items = items
41
+
42
+ def __iter__(self):
43
+ return iter(self._items)
44
+
45
+ def __len__(self) -> int:
46
+ return len(self._items)
47
+
48
+ def __getitem__(self, item: Any) -> Any:
49
+ if isinstance(item, int):
50
+ return self._items[item]
51
+ return super().__getitem__(item)
52
+
53
+ def __contains__(self, item: Any) -> bool:
54
+ try:
55
+ if super().__contains__(item):
56
+ return True
57
+ except TypeError:
58
+ pass
59
+ return item in self._items
@@ -154,8 +154,10 @@ async def serve_http(
154
154
  print(f" * 官方 MCP 门户: {portal_url} (ChatGPT 统一端点)")
155
155
  if upstream_mcp_url:
156
156
  print(f" * 内部隧道回源: {upstream_mcp_url}")
157
+ show_key = "--show-key" in sys.argv
157
158
  if env_cfg.require_auth:
158
- print(f" * 安全访问密钥: {env_cfg.api_key}")
159
+ key_display = env_cfg.api_key if show_key else "已配置 (运行传 --show-key 查看明文)"
160
+ print(f" * 安全访问密钥: {key_display}")
159
161
  print("-" * 76)
160
162
 
161
163
  print(" 【远程 Agent 配置指引 (Remote Agent Connection Guide)】")
@@ -164,19 +166,22 @@ async def serve_http(
164
166
  print(f" [ChatGPT Developer Mode / Custom Actions 连接指南]:")
165
167
  print(f" * 服务器 URL: {primary_endpoint}")
166
168
  print(f" * 身份验证类型: Bearer Token 或 OAuth")
167
- print(f" * 访问密钥: {env_cfg.api_key}")
169
+ key_hint = env_cfg.api_key if show_key else "请从本机安全配置获取 (日志不显示明文)"
170
+ print(f" * 访问密钥: {key_hint}")
168
171
  print(f" * 备用直连回源地址: {upstream_mcp_url}\n")
169
172
 
170
173
  if env_cfg.require_auth:
174
+ token_display = env_cfg.api_key if show_key else "<MCP_API_KEY>"
171
175
  print(f" [通用远程 Agent (网页端/Cursor/Claude Desktop/API)]: ")
172
- print(f" * 单 URL 快捷接入: {primary_endpoint}?token={env_cfg.api_key}")
173
- print(f" * Header 接入: Authorization: Bearer {env_cfg.api_key}")
176
+ print(f" * 单 URL 快捷接入: {primary_endpoint}?token={token_display}")
177
+ print(f" * Header 接入: Authorization: Bearer {token_display}")
174
178
  else:
175
179
  print(f" URL: {primary_endpoint}")
176
180
  else:
177
181
  if env_cfg.require_auth:
182
+ token_display = env_cfg.api_key if show_key else "<MCP_API_KEY>"
178
183
  print(f" URL: {local_mcp_url}")
179
- print(f" Header: Authorization: Bearer {env_cfg.api_key}")
184
+ print(f" Header: Authorization: Bearer {token_display}")
180
185
  else:
181
186
  print(f" URL: {local_mcp_url}")
182
187
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-server-core
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Universal MCP Server Framework: Streamable HTTP ASGI, Cloudflare Tunnel, OAuth 2.1 & Process Supervisor
5
5
  Author: yimmr
6
6
  License-Expression: MIT
@@ -6,6 +6,7 @@ mcp_framework/env.py
6
6
  mcp_framework/http_server.py
7
7
  mcp_framework/oauth.py
8
8
  mcp_framework/process.py
9
+ mcp_framework/response.py
9
10
  mcp_framework/server.py
10
11
  mcp_framework/tunnel.py
11
12
  mcp_server_core/__init__.py
@@ -13,6 +14,7 @@ mcp_server_core/env.py
13
14
  mcp_server_core/http_server.py
14
15
  mcp_server_core/oauth.py
15
16
  mcp_server_core/process.py
17
+ mcp_server_core/response.py
16
18
  mcp_server_core/server.py
17
19
  mcp_server_core/tunnel.py
18
20
  mcp_server_core.egg-info/PKG-INFO
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mcp-server-core"
7
- version = "0.2.2"
7
+ version = "0.2.3"
8
8
  description = "Universal MCP Server Framework: Streamable HTTP ASGI, Cloudflare Tunnel, OAuth 2.1 & Process Supervisor"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
File without changes