"""Small stdio Skills fixture, not a production server or full conformance suite."""
import hashlib
import json
import sys

EXT = 'io.modelcontextprotocol/skills'
PREFIX = 'io.modelcontextprotocol/'
URI = 'skill://review-note/SKILL.md'
FRONTMATTER = {'name': 'review-note', 'description': 'Review a fictional release note for clarity.'}
FILES = {
    URI: '---\nname: review-note\ndescription: Review a fictional release note for clarity.\n---\n\n# Review a release note\n\nRead references/checklist.md and identify any missing version or affected audience.\n',
    'skill://review-note/references/checklist.md': '# Checklist\n\nIdentify the changed behavior, affected version, and next action.\n',
}
ENTRY = {'uri': URI, 'frontmatter': FRONTMATTER, 'resources': [
    {'uri': uri, 'digest': 'sha256:'+hashlib.sha256(text.encode()).hexdigest(), 'size': len(text.encode())}
    for uri, text in FILES.items()
]}

def fail(code, message, data=None):
    error = {'code': code, 'message': message}
    if data is not None: error['data'] = data
    return {'error': error}

def result(**fields):
    return {'result': {'resultType': 'complete', 'ttlMs': 0, 'cacheScope': 'public',
                       '_meta': {PREFIX+'serverInfo': {'name': 'mcpblog-skills-fixture', 'version': '1.0.0'}}, **fields}}

def dispatch(request):
    params = request.get('params', {})
    meta = params.get('_meta', {})
    if PREFIX+'protocolVersion' not in meta or PREFIX+'clientCapabilities' not in meta:
        return fail(-32602, 'Required request metadata is missing')
    if meta[PREFIX+'protocolVersion'] != '2026-07-28':
        return fail(-32022, 'Unsupported protocol version', {'supportedVersions': ['2026-07-28']})
    method = request['method']
    if method.startswith('skills/') and EXT not in meta[PREFIX+'clientCapabilities'].get('extensions', {}):
        return fail(-32021, 'Client has not declared Skills', {'requiredCapabilities': {'extensions': {EXT: {}}}})
    if method == 'server/discover':
        return result(supportedVersions=['2026-07-28'], capabilities={'resources': {}, 'extensions': {EXT: {}}})
    if method == 'skills/list': return result(skills=[ENTRY])
    if method == 'skills/get':
        return result(skill=ENTRY) if params.get('uri') == URI else fail(-32602, 'Unknown skill URI')
    if method == 'resources/list':
        return result(resources=[{'uri': uri, 'name': uri.rsplit('/',1)[1], 'mimeType': 'text/markdown'} for uri in FILES])
    if method == 'resources/read':
        uri = params.get('uri')
        if uri not in FILES: return fail(-32602, 'Unknown resource URI')
        text = FILES[uri]
        if '--bad-digest' in sys.argv and uri == URI: text += '\nChanged after manifest creation.\n'
        return result(contents=[{'uri': uri, 'mimeType': 'text/markdown', 'text': text}])
    return fail(-32601, 'Method not implemented by this bounded fixture')

if __name__ == '__main__':
    for line in sys.stdin:
        try:
            request = json.loads(line)
            if 'id' not in request: continue
            response = {'jsonrpc': '2.0', 'id': request['id'], **dispatch(request)}
        except (ValueError, KeyError, TypeError):
            response = {'jsonrpc': '2.0', 'id': None, **fail(-32600, 'Invalid request')}
        print(json.dumps(response), flush=True)
