kicad:EasyEDA→KiCad 工程(Board1/Board2)、库、脚本与评审文档(IC 引脚、风扇、热、EDL 供电、布局规则)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
@@ -0,0 +1,65 @@
|
||||
"""Check the installed server over stdio without modifying design files."""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
import pcbnew
|
||||
from mcp import ClientSession, StdioServerParameters
|
||||
from mcp.client.stdio import stdio_client
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
PYTHON = Path('D:/kicad-mcp/.venv/Scripts/python.exe')
|
||||
|
||||
|
||||
async def verify():
|
||||
env = dict(os.environ)
|
||||
env.update(
|
||||
KICAD_CLI='D:/KiCad/bin/kicad-cli.exe',
|
||||
KICAD_PROJECT_PATHS=str(ROOT),
|
||||
PYTHONIOENCODING='utf-8',
|
||||
PYTHONDONTWRITEBYTECODE='1',
|
||||
)
|
||||
parameters = StdioServerParameters(
|
||||
command=str(PYTHON), args=['-B', '-m', 'kicad_mcp_server'],
|
||||
cwd=str(ROOT), env=env,
|
||||
)
|
||||
async with stdio_client(parameters) as (read, write):
|
||||
async with ClientSession(read, write) as session:
|
||||
info = await session.initialize()
|
||||
available = []
|
||||
cursor = None
|
||||
while True:
|
||||
page = await session.list_tools(cursor=cursor)
|
||||
available.extend(tool.name for tool in page.tools)
|
||||
cursor = page.nextCursor
|
||||
if not cursor:
|
||||
break
|
||||
required = {'list_schematic_components', 'run_erc', 'run_drc'}
|
||||
if not required.issubset(available):
|
||||
raise RuntimeError(f'Missing tools: {required - set(available)}')
|
||||
resource = await session.read_resource('kicad://config')
|
||||
configuration = json.loads(resource.contents[0].text)
|
||||
if configuration['project_paths'] != [str(ROOT)]:
|
||||
raise RuntimeError('Project search path was not applied')
|
||||
schematic = ROOT / 'PhoneRail-Board1' / 'P1-INPUT.kicad_sch'
|
||||
result = await session.call_tool(
|
||||
'list_schematic_components', {'file_path': str(schematic)}
|
||||
)
|
||||
output = '\n'.join(getattr(part, 'text', '') for part in result.content)
|
||||
if result.isError or 'Total:' not in output:
|
||||
raise RuntimeError(f'Schematic read failed: {output}')
|
||||
print(json.dumps({
|
||||
'server': info.serverInfo.name,
|
||||
'pcbnew': pcbnew.Version(),
|
||||
'tool_count': len(available),
|
||||
'project_paths': configuration['project_paths'],
|
||||
'schematic': str(schematic),
|
||||
'components': next(line for line in output.splitlines() if line.startswith('Total:')),
|
||||
'status': 'PASS',
|
||||
}, indent=2))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
asyncio.run(asyncio.wait_for(verify(), timeout=60))
|
||||
在新工单中引用
屏蔽一个用户