"""Illustrative in-memory JSON-RPC/stdio subset. NOT a complete MCP server. No network, credentials, SDK, real tenant authentication or durable state. The fixed fixture principal belongs to team-a. fault is test-only injection. """ import hashlib import json import sys version = '2025-11-25' initialized = False negotiated = False tickets = {'A-1': {'tenant': 'team-a', 'status': 'open', 'effects': 0}, 'A-2': {'tenant': 'team-a', 'status': 'open', 'effects': 0}, 'B-1': {'tenant': 'team-b', 'status': 'open', 'effects': 0}} operations = {} def error(code, message): return {'error': {'code': code, 'message': message}} def result(value=None, failure=None): if failure: return {'result': {'content': [{'type': 'text', 'text': failure}], 'isError': True}} return {'result': {'content': [{'type': 'text', 'text': json.dumps(value)}], 'structuredContent': value, 'isError': False}} def handle(req): global initialized, negotiated method = req.get('method') if method == 'initialize': negotiated = True return {'result': {'protocolVersion': version, 'capabilities': {'tools': {}}, 'serverInfo': {'name': 'article-safe-fixture', 'version': '0.1.0'}}} if method == 'notifications/initialized': initialized = negotiated return None if not initialized: return error(-32000, 'Fixture not initialized') if method == 'tools/list': definitions = [] for name in ['get_ticket', 'close_ticket']: props = {'ticket_id': {'type': 'string'}} required = ['ticket_id'] if name == 'close_ticket': props.update({'operation_key': {'type': 'string'}, 'fault': {'type': 'string', 'enum': ['after_write']}}) required.append('operation_key') definitions.append({'name': name, 'description': 'Fictional local ticket fixture', 'inputSchema': {'type': 'object', 'properties': props, 'required': required, 'additionalProperties': False}}) return {'result': {'tools': definitions}} if method != 'tools/call': return error(-32601, 'Method not in fixture profile') params = req.get('params', {}) name, args = params.get('name'), params.get('arguments') if name not in ['get_ticket', 'close_ticket']: return error(-32602, 'Unknown fixture tool') allowed = {'ticket_id'} if name == 'get_ticket' else {'ticket_id', 'operation_key', 'fault'} if not isinstance(args, dict) or set(args) - allowed or not isinstance(args.get('ticket_id'), str): return result(failure='Invalid fixture arguments') ticket = tickets.get(args['ticket_id']) if not ticket or ticket['tenant'] != 'team-a': return result(failure='Access denied') if name == 'get_ticket': return result({'ticket_id': args['ticket_id'], **ticket}) key = args.get('operation_key') if not isinstance(key, str) or not key or len(key) > 100 or args.get('fault') not in [None, 'after_write']: return result(failure='Invalid operation key or fault setting') digest = hashlib.sha256(json.dumps({'ticket_id': args['ticket_id'], 'status': 'closed'}, sort_keys=True).encode()).hexdigest() if key in operations: prior = operations[key] return result(prior['value']) if prior['digest'] == digest else result(failure='Operation key conflicts with changed intent') ticket['status'] = 'closed' ticket['effects'] += 1 value = {'ticket_id': args['ticket_id'], 'status': 'closed', 'effects': ticket['effects']} operations[key] = {'digest': digest, 'value': value} if args.get('fault') == 'after_write': return result(failure='Simulated uncertain response after local effect; check state before retry') return result(value) for line in sys.stdin: req = None try: req = json.loads(line) if not isinstance(req, dict) or req.get('jsonrpc') != '2.0' or not isinstance(req.get('method'), str): response = error(-32600, 'Invalid fixture request') else: response = handle(req) if isinstance(req, dict) and 'id' not in req: continue if response is not None: print(json.dumps({'jsonrpc': '2.0', 'id': req.get('id') if isinstance(req, dict) else None, **response}), flush=True) except json.JSONDecodeError: print(json.dumps({'jsonrpc': '2.0', 'id': None, **error(-32700, 'Invalid JSON')}), flush=True)