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.
- {mcp_server_core-0.2.2/mcp_server_core.egg-info → mcp_server_core-0.2.3}/PKG-INFO +1 -1
- mcp_server_core-0.2.3/mcp_framework/response.py +1 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/__init__.py +2 -0
- mcp_server_core-0.2.3/mcp_server_core/response.py +59 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/server.py +10 -5
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3/mcp_server_core.egg-info}/PKG-INFO +1 -1
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core.egg-info/SOURCES.txt +2 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/pyproject.toml +1 -1
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/LICENSE +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/README.md +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/__init__.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/env.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/http_server.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/oauth.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/process.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/server.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_framework/tunnel.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/env.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/http_server.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/oauth.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/process.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core/tunnel.py +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core.egg-info/dependency_links.txt +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core.egg-info/requires.txt +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core.egg-info/top_level.txt +0 -0
- {mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/setup.cfg +0 -0
|
@@ -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
|
-
|
|
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
|
-
|
|
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={
|
|
173
|
-
print(f" * Header 接入: Authorization: Bearer {
|
|
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 {
|
|
184
|
+
print(f" Header: Authorization: Bearer {token_display}")
|
|
180
185
|
else:
|
|
181
186
|
print(f" URL: {local_mcp_url}")
|
|
182
187
|
|
|
@@ -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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_server_core-0.2.2 → mcp_server_core-0.2.3}/mcp_server_core.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|