MCP టూల్ దాని స్కీమాను మార్చుకుంది. మీ ఏజెంట్ గమనించలేదు.

మీ టూల్ కాల్ క్రాష్ కాలేదు. అది 200 స్టేటస్ కోడ్ మరియు సరైన JSONను తిరిగి ఇచ్చింది.

కానీ అది తప్పు కాంట్రాక్ట్‌తో రన్ అయ్యింది. మూడు రోజుల క్రితం అప్‌స్ట్రీమ్ సర్వర్ ఒక ఫీల్డ్ పేరును మార్చింది. మీ ఏజెంట్ పాత పేరునే పంపుతూనే ఉంది. సర్వర్ దానిని నిశ్శబ్దంగా వదిలేసింది. ఫలితం ఖాళీగా వచ్చింది. ఎటువంటి ఎర్రర్ కనిపించలేదు. వారం రోజుల వరకు ఎవరూ గమనించలేదు.

ఇది సైలెంట్ ఫెయిల్యూర్ (silent failure). లాగ్‌లు ఎర్రగా మారే రకమైన శబ్దంతో కూడిన వైఫల్యం ఇది కాదు. సర్వర్ సమాధానం ఇస్తుంది కానీ, డేటా మాత్రం తప్పుగా ఉండే రకం ఇది.

MCP సర్వర్లు కాల్స్ మధ్యలో టూల్ కాంట్రాక్ట్‌ను మార్చగలవు. అవి పారామీటర్‌ను రీనేమ్ చేయవచ్చు లేదా ఫీల్డ్ డిస్క్రిప్షన్‌ను మార్చవచ్చు. ఈ మార్పులు తరచుగా స్ట్రక్చరల్‌గా (structurally) సరైనవేగా ఉంటాయి. JSON వాలిడేషన్ పాస్ అవుతుంది. సర్వర్ 200 అని సమాధానం ఇస్తుంది. మీ ఏజెంట్ ఒక్క ఎర్రర్ కూడా లేకుండా తప్పు డేటాపై పనిచేస్తుంది.

పరిష్కారం సులభం: • ప్రతి టూల్ కాంట్రాక్ట్ యొక్క SHA-256 హాష్‌ను పిన్ చేయండి. • ఆ హాష్‌లో స్కీమా మరియు డిస్క్రిప్షన్ రెండింటినీ చేర్చండి. • ప్రతి కాల్‌కు ముందు హాష్‌ను తనిఖీ చేయండి. • కాంట్రాక్ట్ మారితే (drift అయితే) కాల్‌ను ఆపివేయండి.

టూల్ సమాధానం ఇస్తుందో లేదో అనే దానిపైనే మనం దృష్టి పెడతాము. మనం స్టేటస్ కోడ్‌లను తనిఖీ చేస్తాము. టైమ్ అవుట్‌లను సెట్ చేస్తాము. 5xx ఎర్రర్‌ల కోసం మళ్ళీ ప్రయత్నిస్తాము (retry). ఏజెంట్ స్కీమాను నేర్చుకున్న సమయానికి మరియు అది కాల్ చేసిన సమయానికి మధ్య కాంట్రాక్ట్ మారిందో లేదో దాదాపు ఎవరూ తనిఖీ చేయరు.

ఒక MCP సర్వర్ tools/list ద్వారా టూల్స్‌ను ఎక్స్‌పోజ్ చేస్తుంది. ప్రతి టూల్‌కు ఒక inputSchema మరియు ఒక డిస్క్రిప్షన్ ఉంటాయి. మీ ఏజెంట్ సెషన్ ప్రారంభంలో దీనిని ఒకసారి చదువుతుంది.

సర్వర్ అప్‌డేట్ అయితే, అది ఇవి చేయవచ్చు:

  • అదనపు ప్రాపర్టీలను అలాగే ఉంచుతూ, ఒక పారామీటర్‌ను రీనేమ్ చేయవచ్చు (ఉదాహరణకు query నుండి q కి). పాత పారామీటర్ నిశ్శబ్దంగా వదిలివేయబడుతుంది.
  • ఒక ఫీల్డ్ యొక్క అర్థాన్ని మార్చవచ్చు. "max results" నుండి "page index" కి లిమిట్ మారవచ్చు. దాని టైప్ ఇంటెజర్‌గానే ఉంటుంది, కాబట్టి వాలిడేషన్ పాస్ అవుతుంది.
  • ఒక enum పరిధిని తగ్గించవచ్చు. ఒక సరైన విలువ కొత్త డిఫాల్ట్ విలువగా మారిపోవచ్చు.

లిస్ట్ మారితే సర్వర్ క్లయింట్‌కు తెలియజేయాలి (SHOULD) అని MCP స్పెసిఫికేషన్ చెబుతుంది. కానీ అది తప్పనిసరిగా (MUST) చేయాలని చెప్పదు. చాలా సర్వర్లు ఈ నోటిఫికేషన్‌ను పంపవు. ఒకవేళ పంపినా, ఒక నిర్దిష్ట టూల్ స్కీమా మారిందని అవి మీకు చెప్పకపోవచ్చు.

స్ట్రక్చరల్ వాలిడేషన్‌పై ఆధారపడటం ఆపండి. అది అర్థంలో వచ్చే మార్పును గుర్తించలేదు.

మీ MCP టూల్స్‌ను సాఫ్ట్‌వేర్ డిపెండెన్సీలలాగా పరిగణించండి. లాక్‌ఫైల్ (lockfile) విధానాన్ని ఉపయోగించండి. మొదటిసారి కనెక్ట్ అయినప్పుడు, టూల్ యొక్క స్కీమా మరియు డిస్క్రిప్షన్ యొక్క SHA-256 హాష్‌ను తీసుకోండి. ప్రతి కాల్‌కు ముందు, హాష్‌ను మళ్ళీ లెక్కించండి. అవి సరిపోలితే, కొనసాగించండి. అవి సరిపోలకపోతే, మార్పును (drift) గుర్తించి ఆపివేయండి.

డిస్క్రిప్షన్‌ను హాష్ చేయడం అనేది అసలైన రహస్యం. ఒక పారామీటర్ "max results" నుండి "page index" కి మారితే, స్కీమా ఒకేలా కనిపిస్తుంది. కానీ పదాలు మారడం వల్ల హాష్ మారుతుంది. ఇది వాలిడేషన్ గుర్తించలేని సెమాంటిక్ డ్రిఫ్ట్‌ను (semantic drift) పట్టుకుంటుంది.

కాంట్రాక్ట్ ఎప్పుడు మారుతుందో ఊహించకండి. గుడ్డిగా మళ్ళీ ప్రయత్నించకండి. కాసేపు ఆగి, తేడాను లాగ్ చేసి, కాంట్రాక్ట్‌ను సరిచేయండి.

మూలం: https://dev.to/0012303/the-mcp-tool-your-agent-calls-changed-its-schema-it-didnt-notice-5g6m

ఐచ్ఛిక అభ్యాస సమూహం: https://t.me/GyaanSetuAi