aiohttp-tiny-mcp 0.2.4__tar.gz → 0.2.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 (43) hide show
  1. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/PKG-INFO +1 -1
  2. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/pyproject.toml +2 -2
  3. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/pyproject.toml.orig +6 -4
  4. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/__init__.py +6 -0
  5. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/models.py +38 -22
  6. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/protocol/v2026_07_28.py +2 -2
  7. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/LICENSE +0 -0
  8. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/README.md +0 -0
  9. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/adapter.py +0 -0
  10. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/auth.py +0 -0
  11. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/client.py +0 -0
  12. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/client_base.py +0 -0
  13. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/console/__init__.py +0 -0
  14. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/console/console.css +0 -0
  15. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/console/console.js +0 -0
  16. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/console/index.html +0 -0
  17. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/core.py +0 -0
  18. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/dispatcher.py +0 -0
  19. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/endpoint.py +0 -0
  20. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/exchange.py +0 -0
  21. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/http_sse.py +0 -0
  22. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/hub.py +0 -0
  23. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/namespaces.py +0 -0
  24. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/postgres.py +0 -0
  25. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/protocol/__init__.py +0 -0
  26. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/protocol/selection.py +0 -0
  27. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/protocol/v2024_11_05.py +0 -0
  28. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/protocol/v2025_03_26.py +0 -0
  29. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/protocol/v2025_06_18.py +0 -0
  30. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/protocol/v2025_11_25.py +0 -0
  31. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/py.typed +0 -0
  32. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/redis.py +0 -0
  33. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/registry.py +0 -0
  34. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/request_state.py +0 -0
  35. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/schema.py +0 -0
  36. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/sessions.py +0 -0
  37. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/specs.py +0 -0
  38. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/sqlite.py +0 -0
  39. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/sse.py +0 -0
  40. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/stdio.py +0 -0
  41. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/stdio_client.py +0 -0
  42. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/subscriptions.py +0 -0
  43. {aiohttp_tiny_mcp-0.2.4 → aiohttp_tiny_mcp-0.2.6}/src/aiohttp_tiny_mcp/testing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiohttp-tiny-mcp
3
- Version: 0.2.4
3
+ Version: 0.2.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.2.4"
3
+ version = "0.2.6"
4
4
  description = "Remote MCP server and client library for aiohttp"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -71,7 +71,7 @@ source-include = [
71
71
 
72
72
  [tool.pytest.ini_options]
73
73
  asyncio_mode = "auto"
74
- timeout = 1
74
+ timeout = 30
75
75
  filterwarnings = ["error::mcp.shared.exceptions.MCPDeprecationWarning"]
76
76
  testpaths = [
77
77
  "tests",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aiohttp-tiny-mcp"
3
- version = "0.2.4"
3
+ version = "0.2.6"
4
4
  description = "Remote MCP server and client library for aiohttp"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -77,9 +77,11 @@ build-backend = "uv_build"
77
77
 
78
78
  [tool.pytest.ini_options]
79
79
  asyncio_mode = "auto"
80
- # A test gets a second. A hung one then fails and names itself rather than
81
- # stopping the run. The few that pay for a process start say so with a marker.
82
- timeout = 1
80
+ # The guard against a hung test, not a measure of how fast the machine is. A
81
+ # loaded runner is an order of magnitude slower than a laptop, so a budget
82
+ # tight enough to catch a wait fails on a slow disk instead. A test that must
83
+ # not wait carries its own marker.
84
+ timeout = 30
83
85
  # Calling a deprecated SDK method is deliberate where it happens, and says so
84
86
  # with `pytest.warns`. Anywhere else it is a finding, not a log line.
85
87
  filterwarnings = ["error::mcp.shared.exceptions.MCPDeprecationWarning"]
@@ -19,14 +19,17 @@ from .http_sse import SseEndpoint
19
19
  from .hub import Hub, MemoryHub
20
20
  from .models import (
21
21
  AudioContent,
22
+ BlobResourceContents,
22
23
  CallToolResult,
23
24
  Completion,
25
+ EmbeddedResource,
24
26
  GetPromptResult,
25
27
  Hint,
26
28
  ImageContent,
27
29
  PromptMessage,
28
30
  ResourceLink,
29
31
  TextContent,
32
+ TextResourceContents,
30
33
  )
31
34
  from .namespaces import namespace
32
35
  from .protocol.selection import AdapterSet
@@ -42,11 +45,13 @@ __all__ = [
42
45
  "Answer",
43
46
  "AnswerAction",
44
47
  "AudioContent",
48
+ "BlobResourceContents",
45
49
  "CallToolResult",
46
50
  "Client",
47
51
  "ClientError",
48
52
  "Elicitor",
49
53
  "Completion",
54
+ "EmbeddedResource",
50
55
  "Endpoint",
51
56
  "SSEResponse",
52
57
  "Exchange",
@@ -67,6 +72,7 @@ __all__ = [
67
72
  "SessionStore",
68
73
  "StdioClient",
69
74
  "TextContent",
75
+ "TextResourceContents",
70
76
  "elicit",
71
77
  "elicit_accept",
72
78
  "elicit_cancel",
@@ -52,8 +52,27 @@ class ResourceLink(Model):
52
52
  mime_type: str | None = None
53
53
 
54
54
 
55
+ class TextResourceContents(Model):
56
+ uri: str
57
+ text: str
58
+ mime_type: str | None = None
59
+
60
+
61
+ class BlobResourceContents(Model):
62
+ uri: str
63
+ blob: str
64
+ mime_type: str | None = None
65
+
66
+
67
+ class EmbeddedResource(Model):
68
+ """Resource contents carried in the result, instead of a link to read later."""
69
+
70
+ type: Literal["resource"] = "resource"
71
+ resource: TextResourceContents | BlobResourceContents
72
+
73
+
55
74
  ContentBlock = Annotated[
56
- TextContent | ImageContent | AudioContent | ResourceLink,
75
+ TextContent | ImageContent | AudioContent | ResourceLink | EmbeddedResource,
57
76
  Field(discriminator="type"),
58
77
  ]
59
78
 
@@ -61,8 +80,8 @@ ContentBlock = Annotated[
61
80
  class ResultModel(Model):
62
81
  """resultType is required on 2026-07-28; legacy adapters leave it unset."""
63
82
 
64
- result_type: Literal["complete"] | None = Field(None, alias="resultType")
65
- meta: Meta | None = Field(None, alias="_meta")
83
+ result_type: Literal["complete"] | None = Field(default=None, alias="resultType")
84
+ meta: Meta | None = Field(default=None, alias="_meta")
66
85
 
67
86
 
68
87
  class CacheableResult(ResultModel):
@@ -107,7 +126,8 @@ class Hint(Enum):
107
126
  class ToolDef(Model):
108
127
  name: str
109
128
  title: str | None = None
110
- description: str
129
+ # A server may omit the description, so a tool list stays readable without one.
130
+ description: str = ""
111
131
  input_schema: dict[str, Any]
112
132
  output_schema: dict[str, Any] | None = None
113
133
  annotations: dict[str, Any] | None = None
@@ -163,18 +183,6 @@ class ResourceTemplateDef(Model):
163
183
  mime_type: str | None = None
164
184
 
165
185
 
166
- class TextResourceContents(Model):
167
- uri: str
168
- text: str
169
- mime_type: str | None = None
170
-
171
-
172
- class BlobResourceContents(Model):
173
- uri: str
174
- blob: str
175
- mime_type: str | None = None
176
-
177
-
178
186
  class ListResourcesResult(CacheableResult):
179
187
  resources: list[ResourceDef]
180
188
  next_cursor: str | None = None
@@ -264,15 +272,23 @@ class ErrorResponse(Model):
264
272
  class Meta(Model):
265
273
  """Wire _meta, aliased because Pydantic treats leading underscores as private."""
266
274
 
267
- protocol_version: str | None = Field(None, alias="io.modelcontextprotocol/protocolVersion")
268
- client_info: Implementation | None = Field(None, alias="io.modelcontextprotocol/clientInfo")
275
+ protocol_version: str | None = Field(
276
+ default=None, alias="io.modelcontextprotocol/protocolVersion"
277
+ )
278
+ client_info: Implementation | None = Field(
279
+ default=None, alias="io.modelcontextprotocol/clientInfo"
280
+ )
269
281
  client_capabilities: dict[str, Any] | None = Field(
270
- None, alias="io.modelcontextprotocol/clientCapabilities"
282
+ default=None, alias="io.modelcontextprotocol/clientCapabilities"
271
283
  )
272
284
  #: 2026-07-28 server identity, included in every result.
273
- server_info: Implementation | None = Field(None, alias="io.modelcontextprotocol/serverInfo")
274
- progress_token: str | int | None = Field(None, alias="progressToken")
275
- log_level: str | None = Field(None, alias="io.modelcontextprotocol/logLevel") # draft, SEP-2575
285
+ server_info: Implementation | None = Field(
286
+ default=None, alias="io.modelcontextprotocol/serverInfo"
287
+ )
288
+ progress_token: str | int | None = Field(default=None, alias="progressToken")
289
+ log_level: str | None = Field(
290
+ default=None, alias="io.modelcontextprotocol/logLevel"
291
+ ) # draft, SEP-2575
276
292
 
277
293
 
278
294
  class Params(Model):
@@ -123,14 +123,14 @@ class DiscoverResult(Model):
123
123
  instructions: str | None = None
124
124
  ttl_ms: int | None = None
125
125
  cache_scope: Literal["private", "public"] | None = None
126
- meta: Meta | None = Field(None, alias="_meta")
126
+ meta: Meta | None = Field(default=None, alias="_meta")
127
127
 
128
128
 
129
129
  class InputRequiredResult(Model):
130
130
  result_type: Literal["input_required"] = "input_required"
131
131
  input_requests: dict[str, Any]
132
132
  request_state: str | None = None
133
- meta: Meta | None = Field(None, alias="_meta")
133
+ meta: Meta | None = Field(default=None, alias="_meta")
134
134
 
135
135
 
136
136
  class Adapter2026_07_28(Adapter): # noqa: N801 -- revision date, greppable against the spec