aixtools 0.2.19__py3-none-any.whl → 0.2.21__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.

Potentially problematic release.


This version of aixtools might be problematic. Click here for more details.

aixtools/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.2.19'
32
- __version_tuple__ = version_tuple = (0, 2, 19)
31
+ __version__ = version = '0.2.21'
32
+ __version_tuple__ = version_tuple = (0, 2, 21)
33
33
 
34
34
  __commit_id__ = commit_id = None
aixtools/mcp/__init__.py CHANGED
@@ -4,8 +4,12 @@ Model Context Protocol (MCP) implementation for AI agent communication.
4
4
 
5
5
  from aixtools.mcp.exceptions import AixToolError
6
6
  from aixtools.mcp.fast_mcp_log import FastMcpLog
7
+ from aixtools.mcp.middleware import AixErrorHandlingMiddleware
8
+ from aixtools.mcp.server import create_mcp_server
7
9
 
8
10
  __all__ = [
9
- "FastMcpLog",
11
+ "AixErrorHandlingMiddleware",
10
12
  "AixToolError",
13
+ "FastMcpLog",
14
+ "create_mcp_server",
11
15
  ]
aixtools/mcp/client.py CHANGED
@@ -23,6 +23,7 @@ from pydantic_ai.toolsets.abstract import ToolsetTool
23
23
  from aixtools.context import SessionIdTuple
24
24
  from aixtools.logging.logging_config import get_logger
25
25
  from aixtools.server.utils import create_session_headers
26
+ from aixtools.utils.config import MCP_TOOLS_MAX_RETRIES
26
27
 
27
28
  MCP_TOOL_CACHE_TTL = 300 # 5 minutes
28
29
  DEFAULT_MCP_CONNECTION_TIMEOUT = 30
@@ -87,6 +88,7 @@ def get_mcp_servers(
87
88
  mcp_configs: list[MCPConfig],
88
89
  session_id_tuple: SessionIdTuple,
89
90
  auth_token: str = None,
91
+ max_retries: int = MCP_TOOLS_MAX_RETRIES,
90
92
  *,
91
93
  timeout: float = DEFAULT_MCP_CONNECTION_TIMEOUT,
92
94
  ):
@@ -115,7 +117,7 @@ def get_mcp_servers(
115
117
  servers = []
116
118
  for config in mcp_configs:
117
119
  server = CachedMCPServerStreamableHTTP(
118
- url=config.url, headers=headers, timeout=timeout, read_timeout=config.read_timeout
120
+ url=config.url, headers=headers, timeout=timeout, read_timeout=config.read_timeout, max_retries=max_retries
119
121
  )
120
122
  logger.info("Using MCP server at %s", config.url)
121
123
  servers.append(server)
@@ -7,7 +7,7 @@ import traceback
7
7
  from fastmcp.server.middleware.error_handling import ErrorHandlingMiddleware
8
8
  from fastmcp.server.middleware.middleware import MiddlewareContext
9
9
 
10
- from aixtools.mcp import AixToolError
10
+ from aixtools.mcp.exceptions import AixToolError
11
11
 
12
12
 
13
13
  class AixErrorHandlingMiddleware(ErrorHandlingMiddleware):
aixtools/mcp/server.py ADDED
@@ -0,0 +1,72 @@
1
+ """Utilities for FastMCP servers."""
2
+
3
+ from typing import Any
4
+
5
+ from fastmcp import FastMCP
6
+ from fastmcp.server.middleware.logging import LoggingMiddleware
7
+ from fastmcp.server.middleware.timing import TimingMiddleware
8
+ from fastmcp.utilities.types import NotSet
9
+
10
+ from aixtools.auth.auth import AccessTokenAuthProvider
11
+ from aixtools.logging.logging_config import get_logger
12
+ from aixtools.mcp.middleware import AixErrorHandlingMiddleware
13
+
14
+
15
+ def create_mcp_server(
16
+ *,
17
+ name: str,
18
+ instructions: str | None = None,
19
+ **kwargs: Any,
20
+ ) -> FastMCP:
21
+ """
22
+ MCP server instance with preconfigured auth and middleware.
23
+
24
+ All FastMCP constructor parameters are supported via **kwargs.
25
+
26
+ Args:
27
+ name: Server name
28
+ instructions: Optional server instructions
29
+ **kwargs: All other FastMCP constructor parameters:
30
+ - version: str | None
31
+ - auth: AuthProvider | None (AccessTokenAuthProvider if not set, pass None to disable)
32
+ - middleware: list[Middleware] | None (custom middleware if not set, pass None to disable)
33
+ - lifespan: Callable | None
34
+ - tool_serializer: Callable[[Any], str] | None
35
+ - cache_expiration_seconds: float | None
36
+ - on_duplicate_tools: DuplicateBehavior | None
37
+ - on_duplicate_resources: DuplicateBehavior | None
38
+ - on_duplicate_prompts: DuplicateBehavior | None
39
+ - resource_prefix_format: Literal["protocol", "path"] | None
40
+ - mask_error_details: bool | None
41
+ - tools: list[Tool | Callable] | None
42
+ - tool_transformations: dict[str, ToolTransformConfig] | None
43
+ - dependencies: list[str] | None
44
+ - include_tags: set[str] | None
45
+ - exclude_tags: set[str] | None
46
+ - include_fastmcp_meta: bool | None
47
+
48
+ Returns:
49
+ Configured FastMCP server instance
50
+ """
51
+ middleware = kwargs.pop("middleware", NotSet)
52
+ auth = kwargs.pop("auth", NotSet)
53
+
54
+ if middleware is NotSet:
55
+ middleware = [
56
+ LoggingMiddleware(include_payloads=True, logger=get_logger("middleware.log")),
57
+ AixErrorHandlingMiddleware(include_traceback=True, logger=get_logger("middleware.err")),
58
+ TimingMiddleware(logger=get_logger("middleware.timing")),
59
+ ]
60
+
61
+ if auth is NotSet:
62
+ auth = AccessTokenAuthProvider()
63
+
64
+ mcp_args = {
65
+ "name": name,
66
+ "instructions": instructions,
67
+ "auth": auth,
68
+ "middleware": middleware,
69
+ **kwargs,
70
+ }
71
+
72
+ return FastMCP(**mcp_args)
aixtools/utils/config.py CHANGED
@@ -144,3 +144,5 @@ SKIP_MCP_AUTHORIZATION = str2bool(get_variable_env("SKIP_MCP_AUTHORIZATION", Tru
144
144
  APP_DEFAULT_SCOPE = get_variable_env("APP_DEFAULT_SCOPE", allow_empty=True)
145
145
 
146
146
  AUTH_TEST_TOKEN = get_variable_env("AUTH_TEST_TOKEN", allow_empty=True)
147
+
148
+ MCP_TOOLS_MAX_RETRIES = int(get_variable_env("MCP_TOOLS_MAX_RETRIES", default=10))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aixtools
3
- Version: 0.2.19
3
+ Version: 0.2.21
4
4
  Summary: Tools for AI exploration and debugging
5
5
  Requires-Python: >=3.11.2
6
6
  Description-Content-Type: text/markdown
@@ -1,5 +1,5 @@
1
1
  aixtools/__init__.py,sha256=9NGHm7LjsQmsvjTZvw6QFJexSvAU4bCoN_KBk9SCa00,260
2
- aixtools/_version.py,sha256=32XF9c5EeiOUdyiWeKcwkXTWZQBgtvbmKx8wZoDEW0o,706
2
+ aixtools/_version.py,sha256=ssMI60XkNnqSio7IM67x0S2AEvggFaGv48yM5LcifrI,706
3
3
  aixtools/app.py,sha256=JzQ0nrv_bjDQokllIlGHOV0HEb-V8N6k_nGQH-TEsVU,5227
4
4
  aixtools/chainlit.md,sha256=yC37Ly57vjKyiIvK4oUvf4DYxZCwH7iocTlx7bLeGLU,761
5
5
  aixtools/context.py,sha256=I_MD40ZnvRm5WPKAKqBUAdXIf8YaurkYUUHSVVy-QvU,598
@@ -59,16 +59,17 @@ aixtools/logging/log_objects.py,sha256=gohsgcfyr8vsY7G_hfmj973-Ek1_PN-bMMLEUA-4u
59
59
  aixtools/logging/logging_config.py,sha256=LvxV3C75-I0096PpcCIbgM-Cp998LzWXeMM14HYbU20,4985
60
60
  aixtools/logging/mcp_log_models.py,sha256=7-H2GJXiiyLhpImuyLLftAGG4skxJal8Swax0ob04MY,3463
61
61
  aixtools/logging/mcp_logger.py,sha256=d2I5l4t0d6rQH17w23FpE1IUD8Ax-mSaKfByCH86q4I,6257
62
- aixtools/logging/mcp_middleware.py,sha256=0kpTAwvz9Fd_mFDP3J9ldH4dPP-bhcUjLJKELGOx0IQ,2257
63
62
  aixtools/logging/model_patch_logging.py,sha256=CW5-kKI-zNEgZhNV4vx3EQu6fbrEtX7VjA6fE5loRLQ,2916
64
63
  aixtools/logging/open_telemetry.py,sha256=fJjF1ou_8GyfNfbyWDQPGK6JAUrUaPwURYPHhXEtDBE,1121
65
- aixtools/mcp/__init__.py,sha256=Qp4uD1RtypCYgzWrt_ThBVxa5-CFBgcwMWkHbHFUQ54,232
66
- aixtools/mcp/client.py,sha256=1flZ49irNzM6kdoKKocwFslFR3exDVWccoR0fp9SPvk,18396
64
+ aixtools/mcp/__init__.py,sha256=y6Akm5xeEFJ0K0TNM6aiTsUSe5k5kft8LSTaSEaY7vE,404
65
+ aixtools/mcp/client.py,sha256=5iyQ7IGPhgTH7ATC3vP-fSgrw6Prd0OuD1v0ZAWK3Rs,18523
67
66
  aixtools/mcp/example_client.py,sha256=QCFGP3NCNJMOKWjUOnFwjnbJhUSb879IA1ZYmwjRnmc,889
68
67
  aixtools/mcp/example_server.py,sha256=1SWCyrLWsAnOa81HC4QbPJo_lBVu0b3SZBWI-qDh1vQ,458
69
68
  aixtools/mcp/exceptions.py,sha256=9m3hy9fRINbXTSgkE71XW_luklgH6xBRp7VnSRfpyzQ,173
70
69
  aixtools/mcp/fast_mcp_log.py,sha256=XYOS406dVjn5YTHyGRsRvVNQ0SKlRObfrKj6EeLFjHg,1057
71
70
  aixtools/mcp/faulty_mcp.py,sha256=uU9vlNGCS_i2k20wocVMaDHTlYjMQxuzjILad9O1cjA,12807
71
+ aixtools/mcp/middleware.py,sha256=V-bWhSL6F-tv74EtqaoYjbvxIUCIfG3XKz1khU7ebU4,2268
72
+ aixtools/mcp/server.py,sha256=wpN7tJmUZqGsb_rOVfXbyTFJ9VPnQl7nG5wa1JAz-No,2566
72
73
  aixtools/model_patch/model_patch.py,sha256=JT-oHubIn2LeoSwWbzEQ5vLH7crJmFUecHyQfaAFHa0,1813
73
74
  aixtools/server/__init__.py,sha256=rwPx020YpOzCnrxA80Lc4yLLcIp-Mpe9hNqVO9wDPv0,448
74
75
  aixtools/server/app_mounter.py,sha256=0tJ0tC140ezAjnYdlhpLJQjY-TO8NVw7D8LseYCCVY8,3336
@@ -84,7 +85,7 @@ aixtools/tools/doctor/mcp_tool_doctor.py,sha256=sX2q5GfNkmUYxnXrqMpeGIwGfeL1LpYJ
84
85
  aixtools/tools/doctor/tool_doctor.py,sha256=EY1pshjLGLD0j6cc1ZFtbc0G19I5IbOZwHFDqypE49Q,2661
85
86
  aixtools/tools/doctor/tool_recommendation.py,sha256=LYyVOSXdAorWiY4P-ucSA1vLlV5BTEfX4GzBXNE_X0M,1569
86
87
  aixtools/utils/__init__.py,sha256=xT6almZBQYMfj4h7Hq9QXDHyVXbOOTxqLsmJsxYYnSw,757
87
- aixtools/utils/config.py,sha256=e6gzGfo9c21V4ImuthLMP1RmF2-2FbBnsirMmve3ZWE,5491
88
+ aixtools/utils/config.py,sha256=OGTlvkc8hxL9GJk9AqEWTUIKLntl6TeL10Ni7t6C0nE,5575
88
89
  aixtools/utils/config_util.py,sha256=3Ya4Qqhj1RJ1qtTTykQ6iayf5uxlpigPXgEJlTi1wn4,2229
89
90
  aixtools/utils/enum_with_description.py,sha256=zjSzWxG74eR4x7dpmb74pLTYCWNSMvauHd7_9LpDYIw,1088
90
91
  aixtools/utils/files.py,sha256=8JnxwHJRJcjWCdFpjzWmo0po2fRg8esj4H7sOxElYXU,517
@@ -94,8 +95,8 @@ aixtools/utils/chainlit/cl_agent_show.py,sha256=vaRuowp4BRvhxEr5hw0zHEJ7iaSF_5bo
94
95
  aixtools/utils/chainlit/cl_utils.py,sha256=fxaxdkcZg6uHdM8uztxdPowg3a2f7VR7B26VPY4t-3c,5738
95
96
  aixtools/vault/__init__.py,sha256=fsr_NuX3GZ9WZ7dGfe0gp_5-z3URxAfwVRXw7Xyc0dU,141
96
97
  aixtools/vault/vault.py,sha256=9dZLWdZQk9qN_Q9Djkofw9LUKnJqnrX5H0fGusVLBhA,6037
97
- aixtools-0.2.19.dist-info/METADATA,sha256=sWkvJFInIkf9THB_rs-E5HOZ3nXBLiMtn7aL8TtdZLc,27958
98
- aixtools-0.2.19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
99
- aixtools-0.2.19.dist-info/entry_points.txt,sha256=q8412TG4T0S8K0SKeWp2vkVPIDYQs0jNoHqcQ7qxOiA,155
100
- aixtools-0.2.19.dist-info/top_level.txt,sha256=wBn-rw9bCtxrR4AYEYgjilNCUVmKY0LWby9Zan2PRJM,9
101
- aixtools-0.2.19.dist-info/RECORD,,
98
+ aixtools-0.2.21.dist-info/METADATA,sha256=jlzBoBeNrkpGy8Pd0KZwEIy3ynz8mMZiA1XEtK6SNQU,27958
99
+ aixtools-0.2.21.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
100
+ aixtools-0.2.21.dist-info/entry_points.txt,sha256=q8412TG4T0S8K0SKeWp2vkVPIDYQs0jNoHqcQ7qxOiA,155
101
+ aixtools-0.2.21.dist-info/top_level.txt,sha256=wBn-rw9bCtxrR4AYEYgjilNCUVmKY0LWby9Zan2PRJM,9
102
+ aixtools-0.2.21.dist-info/RECORD,,