Skip to content

Commit 0fc8a3c

Browse files
committed
fix: use new
1 parent a3d2290 commit 0fc8a3c

File tree

3 files changed

+18
-48
lines changed

3 files changed

+18
-48
lines changed

src/mcp_scan/MCPScanner.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,6 @@ async def scan_server(self, server: ServerScanResult, inspect_only: bool = False
170170
)
171171

172172
if not inspect_only:
173-
logger.debug("Verifying server: %s", server.name)
174-
result = await verify_server(result, base_url=self.base_url)
175173
logger.debug("Checking if server has changed: %s", server.name)
176174
result = await self.check_server_changed(result)
177175
logger.debug("Checking whitelist for server: %s", server.name)
@@ -189,6 +187,9 @@ async def scan_path(self, path: str, inspect_only: bool = False) -> ScanPathResu
189187
for i, server in enumerate(path_result.servers):
190188
logger.debug("Scanning server %d/%d: %s", i + 1, len(path_result.servers), server.name)
191189
path_result.servers[i] = await self.scan_server(server, inspect_only)
190+
191+
logger.debug("Verifying server: %s", server.name)
192+
path_result = await verify_server(path_result, base_url=self.base_url)
192193
path_result.cross_ref_result = await self.check_cross_references(path_result)
193194
await self.emit("path_scanned", path_result)
194195
return path_result

src/mcp_scan/models.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -153,22 +153,6 @@ class ServerScanResult(BaseModel):
153153
result: list[EntityScanResult] | None = None
154154
error: ScanError | None = None
155155

156-
@model_serializer
157-
def serialize(self, _info):
158-
entities_with_result = self.entities_with_result
159-
prompts_with_result = entities_with_result[: len(self.prompts)]
160-
resources_with_result = entities_with_result[len(self.prompts) : len(self.prompts) + len(self.resources)]
161-
tools_with_result = entities_with_result[len(self.prompts) + len(self.resources) :]
162-
163-
return {
164-
"name": self.name,
165-
"server": self.server,
166-
"prompts": prompts_with_result,
167-
"resources": resources_with_result,
168-
"tools": tools_with_result,
169-
"error": self.error,
170-
}
171-
172156
@property
173157
def entities(self) -> list[Entity]:
174158
return self.prompts + self.resources + self.tools
@@ -191,3 +175,7 @@ class ScanPathResult(BaseModel):
191175
servers: list[ServerScanResult] = []
192176
error: ScanError | None = None
193177
cross_ref_result: CrossRefResult | None = None
178+
179+
@property
180+
def entities(self) -> list[Entity]:
181+
return sum([server.entities for server in self.servers], start=[],)

src/mcp_scan/verify_api.py

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,22 @@
11
import ast
22
import json
3-
3+
import rich
44
import aiohttp
55

6-
from .models import EntityScanResult, ServerScanResult, entity_type_to_str
6+
from .models import EntityScanResult, ScanPathResult
77

88

9-
async def verify_server(server_scan_result: ServerScanResult, base_url: str) -> ServerScanResult:
10-
result = server_scan_result.model_copy(deep=True)
11-
if len(server_scan_result.entities) == 0:
12-
return result
13-
messages = [
14-
{
15-
"role": "system",
16-
"content": (
17-
f"{entity_type_to_str(entity).capitalize()} Name:{entity.name}\n"
18-
f"{entity_type_to_str(entity).capitalize()} Description:{entity.description}"
19-
),
20-
}
21-
for entity in server_scan_result.entities
22-
]
9+
async def verify_server(scan_path: ScanPathResult, base_url: str) -> ScanPathResult:
10+
if len(scan_path.entities) == 0:
11+
return scan_path.model_copy(deep=True)
2312
url = base_url[:-1] if base_url.endswith("/") else base_url
24-
url = url + "/api/v1/public/mcp"
13+
url = url + "/api/v2/public/mcp"
2514
headers = {"Content-Type": "application/json"}
26-
data = {
27-
"messages": messages,
28-
}
2915
try:
3016
async with aiohttp.ClientSession() as session:
31-
async with session.post(url, headers=headers, data=json.dumps(data)) as response:
17+
async with session.post(url, headers=headers, data=scan_path.model_dump_json()) as response:
3218
if response.status == 200:
33-
response_content: dict = await response.json()
34-
result.result = [EntityScanResult(verified=True) for _ in messages]
35-
for error in response_content.get("errors", []):
36-
key = ast.literal_eval(error["key"])
37-
idx = key[1][0]
38-
result.result[idx].verified = False
39-
result.result[idx].status = "failed - " + " ".join(error["args"])
40-
return result
19+
return ScanPathResult.model_validate_json(await response.read())
4120
else:
4221
raise Exception(f"Error: {response.status} - {await response.text()}")
4322
except Exception as e:
@@ -46,5 +25,7 @@ async def verify_server(server_scan_result: ServerScanResult, base_url: str) ->
4625
errstr = errstr.splitlines()[0]
4726
except Exception:
4827
errstr = ""
49-
result.result = [EntityScanResult(status="could not reach verification server " + errstr) for _ in messages]
28+
result = scan_path.model_copy(deep=True)
29+
for server in result.servers:
30+
server.result = [EntityScanResult(status="could not reach verification server " + errstr) for _ in server.entities]
5031
return result

0 commit comments

Comments
 (0)