Goro commited on
Commit
e9d44f5
·
1 Parent(s): f7f3b5c

Fix typing warnings

Browse files
src/fastmcp/contrib/component_manager/component_manager.py CHANGED
@@ -9,7 +9,7 @@ from fastmcp.contrib.component_manager.component_service import ComponentService
9
  from fastmcp.exceptions import NotFoundError
10
 
11
  from mcp.server.auth.middleware.bearer_auth import RequireAuthMiddleware
12
- from typing import TYPE_CHECKING, Any
13
 
14
  from fastmcp.server.server import FastMCP
15
 
@@ -25,7 +25,8 @@ def set_up_component_manager(
25
  """
26
 
27
  service = ComponentService(server)
28
- routes: list[Route] | list[Mount] = []
 
29
  route_configs = {
30
  "tool": {
31
  "param": "tool_name",
@@ -50,28 +51,29 @@ def set_up_component_manager(
50
  )
51
  else:
52
  if root_path != "/":
53
- routes.append(
54
- build_component_manager_enpoints(
55
  route_configs, root_path, required_scopes
56
  ))
57
  else:
58
- routes.append(
59
- build_component_manager_enpoints(
60
  {"tool": route_configs["tool"]}, "/tools", required_scopes
61
  ))
62
- routes.append(
63
- build_component_manager_enpoints(
64
  {"resource": route_configs["resource"]}, "/resources", required_scopes
65
  ))
66
- routes.append(
67
- build_component_manager_enpoints(
68
  {"prompt": route_configs["prompt"]}, "/prompts", required_scopes
69
  ))
70
 
71
  server._additional_http_routes.extend(routes)
 
72
 
73
 
74
- def build_component_manager_enpoints(route_configs, root_path, required_scopes=None) -> list[Route] | Mount:
75
  component_management_routes: list[Route] = []
76
 
77
  for component in route_configs:
@@ -105,11 +107,44 @@ def build_component_manager_enpoints(route_configs, root_path, required_scopes=N
105
  route = Route(path, endpoint=endpoint, methods=["POST"])
106
  component_management_routes.append(route)
107
 
108
- if required_scopes is None:
109
- return component_management_routes
110
- else:
111
- return Mount(
112
- f"{root_path}",
113
- app=RequireAuthMiddleware(Starlette(routes=component_management_routes),
114
- required_scopes)
115
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  from fastmcp.exceptions import NotFoundError
10
 
11
  from mcp.server.auth.middleware.bearer_auth import RequireAuthMiddleware
12
+ from typing import Any
13
 
14
  from fastmcp.server.server import FastMCP
15
 
 
25
  """
26
 
27
  service = ComponentService(server)
28
+ routes: list[Route] = []
29
+ mounts: list[Mount] = []
30
  route_configs = {
31
  "tool": {
32
  "param": "tool_name",
 
51
  )
52
  else:
53
  if root_path != "/":
54
+ mounts.append(
55
+ build_component_manager_mount(
56
  route_configs, root_path, required_scopes
57
  ))
58
  else:
59
+ mounts.append(
60
+ build_component_manager_mount(
61
  {"tool": route_configs["tool"]}, "/tools", required_scopes
62
  ))
63
+ mounts.append(
64
+ build_component_manager_mount(
65
  {"resource": route_configs["resource"]}, "/resources", required_scopes
66
  ))
67
+ mounts.append(
68
+ build_component_manager_mount(
69
  {"prompt": route_configs["prompt"]}, "/prompts", required_scopes
70
  ))
71
 
72
  server._additional_http_routes.extend(routes)
73
+ server._additional_http_routes.extend(mounts)
74
 
75
 
76
+ def build_component_manager_enpoints(route_configs, root_path, required_scopes=None) -> list[Route]:
77
  component_management_routes: list[Route] = []
78
 
79
  for component in route_configs:
 
107
  route = Route(path, endpoint=endpoint, methods=["POST"])
108
  component_management_routes.append(route)
109
 
110
+ return component_management_routes
111
+
112
+ def build_component_manager_mount(route_configs, root_path, required_scopes) -> Mount:
113
+ component_management_routes: list[Route] = []
114
+
115
+ for component in route_configs:
116
+ config: dict[str, Any] = route_configs[component]
117
+ for action in ["enable", "disable"]:
118
+
119
+ async def endpoint(
120
+ request: Request,
121
+ action: str = action,
122
+ component: str = component,
123
+ config: dict[str, Any] = config,
124
+ ):
125
+ name = request.path_params[config["param"].split(":")[0]]
126
+
127
+ try:
128
+ await config[action](name)
129
+ return JSONResponse(
130
+ {"message": f"{action.capitalize()}d {component}: {name}"}
131
+ )
132
+ except NotFoundError:
133
+ raise StarletteHTTPException(
134
+ status_code=404,
135
+ detail=f"Unknown {component}: {name}",
136
+ )
137
+
138
+ if required_scopes is not None and root_path in ["/tools", "/resources", "/prompts"]:
139
+ path = f"/{{{config['param']}}}/{action}"
140
+ else:
141
+ path = f"/{component}s/{{{config['param']}}}/{action}"
142
+
143
+ route = Route(path, endpoint=endpoint, methods=["POST"])
144
+ component_management_routes.append(route)
145
+
146
+ return Mount(
147
+ f"{root_path}",
148
+ app=RequireAuthMiddleware(Starlette(routes=component_management_routes),
149
+ required_scopes)
150
+ )
src/fastmcp/contrib/component_manager/component_service.py CHANGED
@@ -41,7 +41,7 @@ class ComponentService:
41
  tool_key = key.removeprefix(f"{mounted.prefix}_")
42
  mounted_service = ComponentService(mounted.server)
43
  tool = await mounted_service._enable_tool(tool_key)
44
- tool.disable()
45
  return tool
46
  else:
47
  continue
@@ -112,9 +112,9 @@ class ComponentService:
112
  mounted.resource_prefix_format,
113
  )
114
  mounted_service = ComponentService(mounted.server)
115
- resource = await mounted_service._enable_resource(key)
116
- resource.enable()
117
- return resource
118
  else:
119
  continue
120
  raise NotFoundError(f"Unknown resource: {key}")
@@ -154,9 +154,9 @@ class ComponentService:
154
  mounted.resource_prefix_format,
155
  )
156
  mounted_service = ComponentService(mounted.server)
157
- resource = await mounted_service._disable_resource(key)
158
- resource.disable()
159
- return resource
160
  else:
161
  continue
162
  raise NotFoundError(f"Unknown resource: {key}")
 
41
  tool_key = key.removeprefix(f"{mounted.prefix}_")
42
  mounted_service = ComponentService(mounted.server)
43
  tool = await mounted_service._enable_tool(tool_key)
44
+ tool.enable()
45
  return tool
46
  else:
47
  continue
 
112
  mounted.resource_prefix_format,
113
  )
114
  mounted_service = ComponentService(mounted.server)
115
+ mounted_resource: Resource | ResourceTemplate = await mounted_service._enable_resource(key)
116
+ mounted_resource.enable()
117
+ return mounted_resource
118
  else:
119
  continue
120
  raise NotFoundError(f"Unknown resource: {key}")
 
154
  mounted.resource_prefix_format,
155
  )
156
  mounted_service = ComponentService(mounted.server)
157
+ mounted_resource: Resource | ResourceTemplate = await mounted_service._disable_resource(key)
158
+ mounted_resource.disable()
159
+ return mounted_resource
160
  else:
161
  continue
162
  raise NotFoundError(f"Unknown resource: {key}")