पाठ 5 / 31

5 मिनट में JSON-RPC 2.0

वे तीन संदेश-रूप पढ़ें जिन पर MCP बना है।

Requests, responses और notifications

MCP संदेश JSON-RPC 2.0 हैं। Request में jsonrpc: "2.0", method, वैकल्पिक params और id होता है, और वह उसी id वाला response अपेक्षित करता है जिसमें result या error (संख्यात्मक code और message सहित) हो। Notification में method होता है पर id नहीं और उत्तर नहीं मिलता। मानक error codes में -32700 (parse error), -32600 (invalid request), -32601 (method not found), -32602 (invalid params) और -32603 (internal error) हैं। संदेश सादे JSON होने से MCP को सामान्य औज़ारों से log, replay और परखना आसान है।

नीचे JSON-RPC

MCP JSON-RPC संदेश, capability handshake और तीन server primitives है।

पाँच हिस्से: messages, handshake, tools, resources, prompts।
चित्र 2.1 — Messages, handshake, tools, resources और prompts।

छोटा JSON-RPC dispatcher, चलाकर

मैंने यह सादे Python 3 (सिर्फ़ standard library) से चलाया। Function वैध call पर result, notification (id नहीं, उत्तर नहीं) पर None, और अज्ञात method (-32601), ग़लत params (-32602) व parse न होने वाले पाठ (-32700) के लिए मानक error ऑब्जेक्ट लौटाता है।

import json

def handle(raw, methods):
    """A tiny JSON-RPC 2.0 dispatcher showing request, notification and error shapes."""
    try:
        msg = json.loads(raw)
    except json.JSONDecodeError:
        return {"jsonrpc": "2.0", "id": None, "error": {"code": -32700, "message": "Parse error"}}
    if "id" not in msg:                                   # notification: do the work, send no reply
        methods.get(msg["method"], lambda p: None)(msg.get("params"))
        return None
    if msg["method"] not in methods:
        return {"jsonrpc": "2.0", "id": msg["id"], "error": {"code": -32601, "message": "Method not found"}}
    try:
        return {"jsonrpc": "2.0", "id": msg["id"], "result": methods[msg["method"]](msg.get("params"))}
    except (KeyError, TypeError):
        return {"jsonrpc": "2.0", "id": msg["id"], "error": {"code": -32602, "message": "Invalid params"}}

methods = {"add": lambda p: p["a"] + p["b"], "ping": lambda p: {}}
for raw in ('{"jsonrpc":"2.0","id":1,"method":"add","params":{"a":2,"b":3}}',
            '{"jsonrpc":"2.0","method":"ping"}',
            '{"jsonrpc":"2.0","id":2,"method":"mul","params":{}}',
            '{"jsonrpc":"2.0","id":3,"method":"add","params":{"a":2}}',
            '{not json'):
    print(handle(raw, methods))

Output:

{'jsonrpc': '2.0', 'id': 1, 'result': 5}
None
{'jsonrpc': '2.0', 'id': 2, 'error': {'code': -32601, 'message': 'Method not found'}}
{'jsonrpc': '2.0', 'id': 3, 'error': {'code': -32602, 'message': 'Invalid params'}}
{'jsonrpc': '2.0', 'id': None, 'error': {'code': -32700, 'message': 'Parse error'}}

त्वरित जाँच: JSON-RPC संदेश को notification क्या बनाता है?

  • उसमें result field होता है
  • उसमें id नहीं होता और उत्तर अपेक्षित नहीं
  • वह XML उपयोग करता है
  • उसमें error code -32601 है
Answer

उसमें id नहीं होता और उत्तर अपेक्षित नहीं — सिर्फ़ requests में id होता है जिसे response दोहराता है।