"""Exercise only the included fixture; no external MCP server is contacted.""" import json import subprocess import sys from pathlib import Path def message(i, method, params=None): x = {'jsonrpc': '2.0', 'method': method} if i is not None: x['id'] = i if params is not None: x['params'] = params return x def call(i, name, **args): return message(i, 'tools/call', {'name': name, 'arguments': args}) packets = [ message(1, 'tools/list'), message(2, 'initialize', {'protocolVersion': '2025-11-25', 'capabilities': {}, 'clientInfo': {'name': 'article-test', 'version': '0.1.0'}}), message(None, 'notifications/initialized'), message(3, 'tools/list'), call(4, 'get_ticket', ticket_id='A-1'), call(5, 'get_ticket', ticket_id='B-1'), call(6, 'close_ticket', ticket_id='A-1', operation_key=''), call(7, 'get_ticket', ticket_id='A-1'), call(8, 'unknown'), call(9, 'close_ticket', ticket_id='A-1', operation_key='op-1', fault='after_write'), call(10, 'get_ticket', ticket_id='A-1'), call(11, 'close_ticket', ticket_id='A-1', operation_key='op-1'), call(12, 'get_ticket', ticket_id='A-1'), call(13, 'close_ticket', ticket_id='A-2', operation_key='op-1'), call(14, 'get_ticket', ticket_id='A-2'), call(15, 'get_ticket', ticket_id='A-1', tenant_id='team-b')] run = subprocess.run([sys.executable, str(Path(__file__).with_name('mcp-fixture.py'))], input='\n'.join(map(json.dumps, packets))+'\n', capture_output=True, text=True, timeout=10, check=True) responses = [json.loads(s) for s in run.stdout.splitlines()] assert len(responses) == 15 by = {r['id']: r for r in responses} value = lambda i: by[i]['result']['structuredContent'] checks = { 'initialization_required': 'error' in by[1], 'version_returned': by[2]['result']['protocolVersion'] == '2025-11-25', 'two_tools_declared': len(by[3]['result']['tools']) == 2, 'allowed_read': value(4)['status'] == 'open', 'wrong_tenant_denied': by[5]['result']['isError'] is True, 'invalid_input_no_effect': by[6]['result']['isError'] is True and value(7)['effects'] == 0, 'unknown_tool_protocol_error': by[8]['error']['code'] == -32602, 'uncertain_after_effect': by[9]['result']['isError'] is True and value(10)['status'] == 'closed', 'retry_one_effect': value(11)['effects'] == 1 and value(12)['effects'] == 1, 'changed_intent_conflict': by[13]['result']['isError'] is True and value(14)['effects'] == 0, 'unexpected_field_denied': by[15]['result']['isError'] is True} assert all(checks.values()), checks print(json.dumps({'scope': 'In-memory fixture over a restricted stdio/JSON-RPC profile; not MCP conformance, OAuth or live integration.', 'checks': checks, 'passed': len(checks), 'external_calls': 0}, indent=2))