total = sum(Decimal(row['amount']) for row in data['expenses'])
check('费用由程序实际加总为3.75', total == Decimal('3.75'))
report_data = {'total': str(total), 'row_count': len(data['expenses']), 'summary': output['summary']}
write_json(folder / 'report-data.json', report_data)
save_csv(folder / 'expenses.csv', data['expenses'])
server_source = Path(__file__).resolve().parent / 'mcp-report-server.py'
(folder / 'mcp-report-server.py').write_text(server_source.read_text())
requests = [
    {'jsonrpc': '2.0', 'id': 1, 'method': 'initialize', 'params': {'protocolVersion': '2025-06-18', 'capabilities': {}, 'clientInfo': {'name': 'local-fixture', 'version': '1'}}},
    {'jsonrpc': '2.0', 'method': 'notifications/initialized'},
    {'jsonrpc': '2.0', 'id': 2, 'method': 'tools/list'},
    {'jsonrpc': '2.0', 'id': 3, 'method': 'tools/call', 'params': {'name': 'expense_report', 'arguments': {}}},
    {'jsonrpc': '2.0', 'id': 4, 'method': 'resources/read', 'params': {'uri': 'report://expenses.csv'}},
]
process = subprocess.run(['python3', str(folder / 'mcp-report-server.py'), str(folder)], input='\n'.join(json.dumps(row) for row in requests) + '\n', text=True, capture_output=True, timeout=10)
responses = [json.loads(line) for line in process.stdout.splitlines()]
check('stdio初始化与三个请求都实际返回', process.returncode == 0 and len(responses) == 4 and all('result' in row for row in responses))
check('工具结构化合计与CSV资源行数一致', responses[2]['result']['structuredContent']['total'] == '3.75' and len(list(csv.DictReader(StringIO(responses[3]['result']['contents'][0]['text'])))) == 2)
write_json(folder / 'mcp-transcript.json', {'requests': requests, 'responses': responses})
result = {'report': report_data, 'protocol': 'minimal stdio sample', 'external_clients_installed': False}
