aiohttp-tiny-mcp 0.5.4__tar.gz → 0.5.6__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 (58) hide show
  1. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/PKG-INFO +1 -1
  2. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/pyproject.toml +2 -1
  3. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/pyproject.toml.orig +2 -1
  4. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/protocol/schema.py +26 -0
  5. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/LICENSE +0 -0
  6. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/README.md +0 -0
  7. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/__init__.py +0 -0
  8. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/auth/__init__.py +0 -0
  9. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/auth/jwt.py +0 -0
  10. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/client/__init__.py +0 -0
  11. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/client/base.py +0 -0
  12. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/client/http.py +0 -0
  13. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/client/stdio.py +0 -0
  14. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/console/__init__.py +0 -0
  15. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/console/console.css +0 -0
  16. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/console/console.js +0 -0
  17. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/console/index.html +0 -0
  18. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/console/oauth-callback.html +0 -0
  19. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/extensions/__init__.py +0 -0
  20. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/extensions/skills.py +0 -0
  21. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/oauth/__init__.py +0 -0
  22. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/oauth/github.py +0 -0
  23. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/oauth/provider.py +0 -0
  24. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/oauth/server.py +0 -0
  25. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/oauth/tokens.py +0 -0
  26. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/protocol/__init__.py +0 -0
  27. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/protocol/adapter.py +0 -0
  28. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/protocol/core.py +0 -0
  29. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/protocol/models.py +0 -0
  30. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/protocol/selection.py +0 -0
  31. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/protocol/v2024_11_05.py +0 -0
  32. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/protocol/v2025_03_26.py +0 -0
  33. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/protocol/v2025_06_18.py +0 -0
  34. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/protocol/v2025_11_25.py +0 -0
  35. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/protocol/v2026_07_28.py +0 -0
  36. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/py.typed +0 -0
  37. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/server/__init__.py +0 -0
  38. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/server/dispatcher.py +0 -0
  39. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/server/exchange.py +0 -0
  40. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/server/http.py +0 -0
  41. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/server/registry.py +0 -0
  42. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/server/request_state.py +0 -0
  43. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/server/specs.py +0 -0
  44. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/server/sse.py +0 -0
  45. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/server/stdio.py +0 -0
  46. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/server/subscriptions.py +0 -0
  47. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/server/tasks.py +0 -0
  48. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/storage/__init__.py +0 -0
  49. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/storage/hub.py +0 -0
  50. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/storage/namespaces.py +0 -0
  51. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/storage/postgres.py +0 -0
  52. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/storage/redis.py +0 -0
  53. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/storage/sessions.py +0 -0
  54. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/storage/sqlite.py +0 -0
  55. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/testing.py +0 -0
  56. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/transport/__init__.py +0 -0
  57. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/transport/metadata.py +0 -0
  58. {aiohttp_tiny_mcp-0.5.4 → aiohttp_tiny_mcp-0.5.6}/src/aiohttp_tiny_mcp/transport/sse.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiohttp-tiny-mcp
3
- Version: 0.5.4
3
+ Version: 0.5.6
4
4
  Summary: Remote MCP server and client library for aiohttp
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aiohttp-tiny-mcp"
3
- version = "0.5.4"
3
+ version = "0.5.6"
4
4
  description = "Remote MCP server and client library for aiohttp"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -51,6 +51,7 @@ dev = [
51
51
  "PyJWT[crypto]>=2.13",
52
52
  "aiosqlite>=0.20",
53
53
  "furo>=2025.12.19",
54
+ "jsonschema>=4.26",
54
55
  "markdown-pytest>=0.6.6",
55
56
  "mcp[cli]==2.0.0",
56
57
  "myst-parser>=4.0.1",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aiohttp-tiny-mcp"
3
- version = "0.5.4"
3
+ version = "0.5.6"
4
4
  description = "Remote MCP server and client library for aiohttp"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -56,6 +56,7 @@ dev = [
56
56
  "PyJWT[crypto]>=2.13",
57
57
  "aiosqlite>=0.20",
58
58
  "furo>=2025.12.19",
59
+ "jsonschema>=4.26",
59
60
  "markdown-pytest>=0.6.6",
60
61
  "mcp[cli]==2.0.0",
61
62
  "myst-parser>=4.0.1",
@@ -100,6 +100,26 @@ def simplify_legacy_schema(schema: dict) -> dict | None:
100
100
  return node
101
101
 
102
102
 
103
+ def _accept_null(branch: dict[str, Any]) -> dict[str, Any] | None:
104
+ """Keep null valid in a branch that replaces a nullable union. Return None if the branch
105
+ cannot accept null.
106
+ """
107
+ if "const" in branch:
108
+ return None
109
+ kind = branch.get("type")
110
+ if isinstance(kind, str):
111
+ branch = {**branch, "type": [kind, "null"]}
112
+ elif isinstance(kind, list):
113
+ if "null" not in kind:
114
+ branch = {**branch, "type": [*kind, "null"]}
115
+ elif kind is not None:
116
+ return None
117
+ choices = branch.get("enum")
118
+ if isinstance(choices, list) and None not in choices:
119
+ branch = {**branch, "enum": [*choices, None]}
120
+ return branch
121
+
122
+
103
123
  def _simplify_node(node: Any) -> Any:
104
124
  if not isinstance(node, dict):
105
125
  return node
@@ -116,6 +136,12 @@ def _simplify_node(node: Any) -> Any:
116
136
  branch = _simplify_node(branches[0])
117
137
  if branch is None:
118
138
  return None
139
+ if len(branches) != len(any_of):
140
+ # The union accepted null. Declare null in the collapsed branch, or results that
141
+ # carry null fail client-side validation.
142
+ branch = _accept_null(branch)
143
+ if branch is None:
144
+ return None
119
145
  node = {**{k: v for k, v in node.items() if k != "anyOf"}, **branch}
120
146
  if "oneOf" in node:
121
147
  return None