:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;::;;;;;;;;;;
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;:;;;;;;;;;
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::c:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::c::c:::c:cc:::::c::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::c:cccccccccllodddddxdOxxxxxkxxxxkOxxdxddddoollcccccccccc:::c:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::ccc:::::c:c:c:cccccccclododdk0kkxxxdxddox0kOdkokoOoxoddOdOoOdOxkkKOOxxddlccccccccccccccccccccccc::c::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::c::::c:::ccc:c:cc:ccccccccccccccccclddddxxxddoookOxxddoddolokkkOdkdkxxdxdxxkxxxxxxxdkOkOxOxxOkkkOxdlcccccccccccccccc::ccccccc::cccc:c::::c:c::cc:c:::::c:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::ccc::c:cccc:::cccc::ccc:ccccccc:cccccccccccccccccccccloooxlkOxddolocccxO0OOxOdkdolkOkkKO0x0kxxkxOOKO0OOKkxkOk0kOdkdxxOoO00kkxdoccccccccccccccccccccccccccccccccccccccc:ccccccccccccc:::::c::c:c:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ccccccccccccccccccccccccccccccccccccccccccccccccccccoooddooloclkOOxxxdoclcdOk00kkxxokdkOkkKx0x0kkkxxK000OKk0kOdK0XOK00KO0dxO0kkkOxOkxkxocccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:::c::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ccccccccccccccccccccccccccccccccccccccccccccccccclllxkdoolc::llkk0OkxdlooolOx0O0xkxkkxkOkOKk0O0OOOxOKKOKOKOKOdOKKKKOXOXOOxKKX0OOdxkOd00OOxdlcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:c:cc::c::::::::::::::::::::::::::::::::::::::::::::::::::
ccccccccccccccccccccccccccccccccccccccccccccclllllcolxkdolclclloOx0Oxdodxdokx000Okk0OOOKk0000O00O000XXKX00XKOx0KNKXK0XOKxO0XKXKKXKKkx00O0kkkxdlcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:cc:ccccccc:ccccc::::::::::::::::::::::::::::::::::::::::
cccccccccccccccccccccccccccccccccccccccccclllcccc:ccxlOOolodollckdk0OddxOOkOkkKO0kxxddkdOxxxkdxOkddkOkxxkOOkkOOKKKKXXXK0OKXKNKKKKKO0XXKOxxO0Od0Kkocccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:c:c:cc:::::::::::::::::::::::::::::
ccccccccccccccccccccccccccccccccccccccccl:ollc::clloxolkkoddddolxxx00OxddooxoOOOkkxxdokkOxkxxdxxkkx0KkOOOkOkxxkKkOOdkxkX0XNNXXXXKO0XXXNXXKkkOkKX0kxocccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:c:::c::::::::::::::::::
cccccccccccccccccccccccccccccccccccccc:::::dlcccllllkllcdOxxxxxxOdlOOkkddolkoOxO0OOxxdk0kkOOkxkkxOO0KOK0K0kkk00K0kOkxxx0kxxOO0XKK0XNXXXXXXXKk0O0K0kxxdlcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:ccc:cc:::c::::::
ccccccccccccccccccccccccccccccccccccc:::::::lc:cclloxlcclk0kxdllddlOdOOOdodkdxd0O00kkxOKkOOOkxkOkkOKXKK0k0kx00K0K0K0OxK00Ok0xxdd0XKNWNXXXX00XNXKkk00kk0Oocccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:::
ccccccccccccccccccccccccccccccccxdlcccc::::::cocclllxocldodOkoolokokokOOkdxOOxdk0O00kkKkk0OkOOOOOOOKXKKKOkOkKK0K0OK0k00X00KKK0xk00kkOKXNN0KXNNXXXKOkO00kOdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccc;;doooocccc::::codoooxclolllk0koddkxoookkOOxO0ddd0OO0OOKkOOOOOOOkxxkKKOOOKKOOKX0O000O00K0K00000OKXKOxKOkx0XNXNNXNNNX000KKxkklcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccc:;;;;dllcoooc::::coxkclxllkoooldk0xdkOolooOkkOOKxox00kOxKk0OOO0kxddook00kkxxxOOOKKK000OKXKXK0OKO0KXXXXKKkkkXX0KNWNNNKKXNKkOXOxOxllccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccclcclc;;;;;;;:d:::clollcc::ldocxokdooolldxkxOOllodkOxk00xxxdkkkxkOkdkkxkkkxxdkK0kkOxxd0k0kKOOK00KXX0KO0OXXXXKXKKOON0OK0kOXNXXNNNNXOkXO0XKlccclclccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccclcclcclcccclclllc:oc;;:::;;:x::coolcooocclxlkddoolloooxkkO0dxxddxkxxkdoookxxxxldkOOxxdOOkxkK0OkxxdOxxxO0OkkK00O0OOOKKXNXXXKK0XNX0OkKKk0KKNWNNNNNK0KXXkkllllllllcclccllcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
llllclllllllcclllllllllc;,;cc:;::::::d::odccllcodoldOOxddkxxdlclod0kdooxokdxOdllldkxxddxxdkOOkxxxd0XOkOOkx0O000kdxkOxkkk0k00O0KXN0OKXXXKXNXX0OXK00NWNNNXKKOXXOxklllllllllllllllllllllllcllllcccccccccccclccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
llllllllllllllllllllll:,,;;:o:::;:::;ld::d:c::::clllxodooclccloloxoxxxxdodOkkOolookxddookxOxxkOkkxKXO0O0O00K00kxx000kOkxdkO0KK0OOOOXXXXKNNX0XKKKXOOXXKKKXNNO0XxkOolllllllllllllllllllllllllllllllllllcllllllllccclllcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
llllllllllllllllllllc:,,;;;;;l:clc;:::oo:ol::c::::lo:olclllllloloodlolkkxdx0kOxoldxxllooxkkkxdoooOXNK0OOOKKOKOxx000OKOOxkOOOxkkkO0K0O0KXXXXXNXWKKX0OXNXXNNNXk0KKN0lllllllllllllllllllllllllllllllllllllllllllllllllllllllllclllllllcclcccccccccccccccccccccccccccccccccccccccccccccccccc
lllllllllllllllllllc:;,,;;;;;;c:;coo;::docl:::cccoc::collddclldoollxoddooxkOOk0xdkxxddddkdokddoookO0kkkkkkO0O0k00OO0KKkOOKKKOOO0OkOOkddKKKXKXNNK0OOXKOXWWNWNN0NNOkolllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllcccccccccccccccccccccccccccccccccc
lllllllllllllllllll;,;;;;;;;;;;::;;lol::dll::::ldl:::ccoccldoodolllldxxddxxO0OkxOkooddxkddxdkooloOO0xxxxOkOkOO0OOOO0000K0KXK0O00KKOOOxxkx0KKX0K00K0OKOkXWNX00XKXOxxllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllclccccccccccccccccccccc
llllllllllllllllll:,,,;:;:;;;;;;;;;:d:ll:xkc::dd::::;::clc:cxkdooooddxolokxxdooxOdooooldkxdddxdlo00OxkkkkkOkxkk0O0OkkKKKK0K0KX00XX0000kkOx0K00NXKXX00K0XNKKNXWkO0xkdllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllcccccc
lllllllllllllllllc,,,;;;l;;;:::,,;::xc:::c0dcoc::::::::::c::lokdddoooddodooxlooxdkxooollodddddxldKK0OOO0OkkkkkkkkkkOO00OOOO0KKKKNXKKOKXkkKK0O0XNXXNNK0KKXXNNWNX0KKN0llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
llllllllllllllll:;,,,;;;;lc;;:c:;;;::o:;;:lOkdddooolllolllllxdddddolooxdooddookddodkkolllloxkkkxx0KKKXKOkkkOO0OOkOOkx0Oxk000kkOO0K0OK0OkKKK0kkKKNNNX0XKKkKNNNNK0XKkxllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
llllllllllllllll:,;;;,,,;;:;;,,:;:c:c:;;;;cll::::;:::::::cccoc:cooxolldxooxdookoddxkOO0xxdddoocdxNKOOOO0K00KXK000kkkk0kxkOOOOk0O0k0000KKOkKKkxONXX0XNN00x0NX0000KOxxolllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
olllllolllolooll;',;;;;;,,,;;;;;:;:lloc;;c:;ld:::::c;;;;c::ccll::lcdxllxdkxxkkOkkxxOxxdOkdloloxxOXKkkkOO000OXXXXK0k0000O00OkOkkXddkOKKXXN0O0K000XXXNKXX00NNXXKNO0kxkooooooooooollllollllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
oooooooooolloooc,,,;;;,;;;;;';;;c;;;;:dc:;;;:ol:::;:c::c::::::coc:lclOOkdxxkxkdddxxOOxxxdxkoxkxxKXKKkxk0000K0OOOO00K00XKKK0kxxXO0xdkKX00K0kOkOxd00K0NXO0XKKKNXN000XKoooooooooooooooooooooooolooooooollolllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
ooooooooooollll:,',,;;;;,,:;;;:l;:;;;;:ooc:;;;:c::;;;:c:lllc::::ll:dlodxxxdokxdoddddOooclok00Oxx0XKNX0xO0OOKK0OOOkkkxkXKXXO00Kkkkk0OkKK00OkxxkkxOXKK0KKKKOONXNKOXXkdoooooooooooooooooooooooooooooooooooooooooooooolooooolllloollllllllllllllllolllllllllllllllllllllllllllllllllllllllll
ooooooooooooooo:,,,,,,;;;;,,,:ccc:;;;c;,;;::::;lc;;;::::::::::::;cdllcxokXNO0kkxollcoklkO00OO0OkkXXWNNX0odO0xdxOO000O00OOXKOOOkk0K0OkOK0000OO0kOk0KKKNKkKkXN00OOKxxoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooloooooooolllllolllllllllllllllllllllllllllllllllllll
oooooooooooooooc;,;;;,,,;;'';,,;:ol:;;,;;;;;:c::cc::;;:::::::::;:cclldokkX000KKKOOkx0KOXOkxkkkxk00KXXXXK0OKKK00KXNNWWX0xkkkNOxOOkkOOOx0K0OK0kkOkxOKXKK000KXK0000xddooloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooloooooloolollllllllllllllllllllllll
oooooooooooooooc;,,,;;;;;;,';,,,,;:c:;cclc::c::;:cllc::::::::;:cc:::cldkkXKK0O0NNNX000xKN00OOOk0KKK0WMMWNNXNNWWWWWNNNKKkXOX00K0OkdkkOkxOOOkOkk0K0O0XXKkKKKK0XXOkOOddddooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooolllolllllllllll
ooooooooooollooc:',,,;,;;;';,;,,;;,:c',;;;;;;;;;:;;c;:llloollooc:;;::;cxKXKNWMNXXXNW0XOKK0OOO0koxOxxONNWWWXWMMMMMMMMMWKXXXK00K0kkxxOOxd0K0OK00kOOkk0OKXN0OKKKO0kxdoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooool
ooooooooooollool:;,,;;;;;;,,;;,;;,,;lc,,,,,,,,;;,;;:l;;;;;;;ccdkdolc:;;lod0NWXXXXNK00KO0KOOkOklloKoloONWWNNNNNNWWMMMMMXNXXK000O0OkkO00O0XKOOkO0kOK00K0Ox0XK0Okxddooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooc:,,,;;;;;,,;;;:;;,,,:;;;;,;;:,.',,;cx:;;;:c;;;;::;;;;;clollookKNNNN0XOkK0kc;;;;co:::;:kNNNNMMMWWNNWWWNXXXKK00KK0OxkOOxx0O0kxkxxkkOOOkdO0KK0kkddoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
oooooooooooooooolc,,;;,,,;;',,;;;;;,''c;,,,;c,;:;,,,,;x;;::,,,,;,,,:c:;clc;'..',;cldxkkdxOkkolccxOdolc:cd0XKNNNXK0OoxKXXKKOkkxO0kkxxkdxOOKK0OxxOkkxkxOOKXKK0k00doooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooocc',,;;,,;,'',;,,,:;;,:,,:o,c,,;;,,,;;cc:;;;;::ccccccccl,..'',,;;;:c:;c:;;;:cddxKxxcccc:llokdolc::,,lOKKkkddkO0OxddxkOOKKXKOxdxxkOkO00K0Oxkkxddoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ddooodoodddodddodo:;,,,,;;,,',,;,,,,,';;:ccllo;',;:::,,;c;',;:cccccccl::o,'',;;:cc:;',,;o:ldOkoldKOKXkccdc,,:oxdllc;;lkXKKO0OOO0O0dxkx0xooodkkxkk000kk0xddkxddddddddddodddoddddoddddddddodooooooododoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ddddddddddddddddddocc,;,,,,;;,,,;,,,,,';;cccol;,.',,;cc,,o:';:cccccllc::d,,;:cc:''',,;;lxOkdlc:cOWocd0XKl:;',,;okxoc:o0WNKXKlloOlxkOOxoodoodk0kO0kllkOlok0xdddddddddddddddddddddxxxxxxxxxxxxxxxxxxxddddddddddddddoodoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
dddddddddddddddddddocc',;;;,;;,,;,,,;;,'',c,;:::;,,,,,::;,l;,:cccclccc::o;cc::',,,,;lxOOxollccdxkW0c:xk0XKd;,.',,cxdloKWWNXKdcddl00xcloodlokkkOkdodk0okOK0xddddddddddddddxxxdddkdoolokkdddooxxxxdxkkkkkxxxxddddddddddddddddddddddddoooodoooddooooooooooooooooooooooooooooooooooooooooooo
ddddddddddddddddddddocc'',,,,,;;;;;,,,,'.';c,,,,;;;:c:;;;:;:;:::cccccc:clc:ll:;,:dxOOxxOoollodxxkWXxxkkkkOXXd....,;lxd0MMMNWOlOkXKokllxxxkxkdlldkd0Od0OkdddddddddddddddlkdooclxOxdoldOkkxxxkOkkxkOOkkkdkOxdkxkxddddddddddddddddddddddddddddddddddddddoddooddoooooooooooooooooooooooooooo
ddddddddddddddddddddddl;;,,,,,;,,;;;,,,''.',::,,,''',,:,,;;;;;:cc:;,'..;l'',;coookdxddd0kkOOxxxkxOKOkkkkkkkOKXd;;;:clxdOXWMXX0K0okx0kkdocclocllokOXKKkdddddddddooldoccclxOxlooxkkxxoxkOOOkkO0OOKk0K0Okk0K00dkOxkxkxddddddddddddddddddddddddddddddddddddddddddddddddddddodoooooddoooooooo
dddddddddddddddddddddddocl;,,,,;;,,',,,,,,'',,',,','.',,''......... . .cOo,;lxxxxdldOkxOXkkkxxkxo;cOxxxxxxxxkd0Nk:';x0::lod0KKKkodxkclodlllxcdokxkNKxddddddollc:colxlooloxkddddxkxdldxxxdxoOxxxxkOOOkk0KKKO0KK0OxOOxxdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddoo
dddddddddddddddddddddddddllc,,,,,;;;,,,',;;;'',,,,,,,':kxl:;,,;:'......l0Kkkdc,:lodoxododXXOxodxo;;kddddddddo.;l0NKx0XdodloOkxdkdddKcclol::ddxxx0Kxdddddoc:;:cclcoccxxdoodkxdldxkOxlxkxdxxkOOOkxOOkkd0xkxx0KXK00XKOOkOxddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddoc:;,,,,,,,,,,,,,,,,,;;;;'''';;oo;;,;:dkxdl;.'0OkxOkxOkoxOO0ddddk0xdoOd;:Oddddooooc,:;oXXXKOdxkkkooddx0OOKoldooddolk00xddddollc:::::lclocclkdccddkkddkkkOoOxxxxkkKKOkOOkkk00O0k00xkkKXXXXK0Okkxddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddl::;,,,,;''.',,,,'',,,,,,''.lo:,,;,0WNNxO',0k0OOxxOkxkO00OkodkOKKxOo,:NWNWMWWWWNNNWNWMW00lN0ooodclddOxkOdooccxdOOxddddl:;;ccccc:::dllcollxxlxooxOkkxkxx0kxxdodOxdxkOOkOKOOO0KK0k0OO0XKXXK000xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddxddddddddollc;;,;;,,'','''',''';lc:ld::;:;xxoOkXc'ox0000kdooooooooddodokodl,;kxxkOOOOO00XK0K00Od'MXxdoloddx0dloococdxkxxdddcc;;;;;c:cclcc:loolllcddxoddddxoxdddxxdxdx0xoxxkkkOkkkO0KO0KKK0O00XXXX0Okxddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
xddddddddddddddxxxxxxxxxxdxxxxxxxdll::,,,;,,,''',,,''lddxxxcodddllONOXx,clxOkxl,.';:cccloxxdoxkl:':xoooc:;;::cld0XWXkc,XXNXxddkK0koodkkxxkxxxxdl;,;:c;;;;l:c;::ccddllcccloddoxddcdooodddodO0xxOOxxkkddxOOkOOKKKKX00KKNNX0Kkddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdolcc;,;;,,'''','cdoooxcdddxcokK00Kk,o00kdxXkc;,,:ldXXXXXXOc:.oNNXNNXXXkokXMWX0xc,kXKXNccokK0dccoxkdxxxxxd;,,;;;:;::;:lc;;;:c:cclclclolloxkdollloddlldk0kkOkxOOkkOOkx0Oxxk0OKK0OxXXXKOkxdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdooc:c;,;,,'',,lc:cxkWWNNOdOk0KXXd,.:oodoloooc:;dK00KK0dlc.dXKKKKK0KNMWK0OdkdoKXMXXXcdxOO0o:;cxkxxxxxd;,,;;;,;;;:c::l:;lc;;;c:oollloooxoodoloxooockdkdxxxkkkkOOOKOKOkkxkOKXNXk0NNXKKkxxxxxddxxxxdxdxxdddddddddddddddddddddddddddddddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdoolc:,,,,:::cllodoodoo0OOKXKKXc'';d0OdlllolkO0000kllc.kK0000000XOOkl::coXXXNKOXOkOKX0KXXXXkxxxxo,,,,;:;;;;;;c;;cdoc::;;,;cdoololllllodocclodokOOkdxxxdxkkkkkOOOOkk0x0XKKKOXK0Kxxxxxxxxxxxxxxxxxxxxxxxxxxxddddxddxddddddddddddddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdol::;:;;'''..;:;;::xOkO0kkdo;;,cxXXo,cokOOOOkooo:.OOOOOOOO0XOl:c;:dXWX00kKOOONkddddxxxxxxxd,,;,,,,,,,;;::,;::l:c:::ccclclcllooodddxxdlccd0OxkkO00kOkkkxdOxx000OOkKKK00XNKK0kOkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxddddxxxdddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdoc;::cc:,,;::co:oOkkKXNWO:,,ccxKKooxxkkxdddo;'Okkkkkkk0KxdkxokWWNK0kX0OKNOxxxxxxxxxxxx;,,,,,,,,;;;,,;c:,;:;,;:l:;;;:clddooooldoccdxlxX0odxOkxddO00xxkkxO0Oxkxk0KKKXO0OkkxOOkxOOkkOkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxolllccccc:c:okdkKXOOO0ol:cccoxkdkkxkxxxxd;oOkxkkkxkkkkkxo0WNXO0KK0OKXxxxxxxxxxxxxxd',,,,,,',,;:;;:,;;;;;,c;;;;,,;cclxOkkdccdxxxkxd0K0dxkkOKKkxkOxxOkdOkkkxOKOOXXKOOOOO00OOKKOO0Ok0kxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkxxxxxkxxxxkxxxoolc:::lxxd0NO0O0xdOxxldcxkkxddoold;OOOkkkkkkkkOOxKNNKOKXXK0KNkdxxxxxxxxxxxxl',,,,,',,',,,:;::,;,:c:;:;,;;;,;lxK0O0XkxxOxddx00NX0XWWWNK0kK0xdxoOOkOOO0O0XKkk0OkOOOk0Ok0KK0K0OOOkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxkxxxxxxxkxkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxdo:'oxxxdxddlddxodcxkkkdlldool0XKOOO0XXkOKKXXN0OXKXXKKNOkkkkkkkkkkkkkko',,,,,',,,,'':,,'',;,,;,,:ccl:;,:oOKNXKKkxkxkkcx:dNXXNNWWWKK0OkkOxk0kkkxkk000OkKOO00OK00KKOOKKXXKOOOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkc,k0dodxkokxk0klOKKKOkONKx,kK0kxKKKK0x0XXKk0KKXNONNkkkkOkkkkkkkkkkkd',,,,,''',,',';,;:,,,',c;'',',,';:c:;cxOkxxkoc:dcccO0WX0kOKkkOxdox0OkxdxOkkOkdkOdxkkOOO0XKKXKOKXXXKOkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkd;:XWOoxkxcdKK0XKKKXXXXXXKXXNNNNNXNNNNXNNXXNXNXNKNkkkkkOkkkkkkkkkkkkc',,,,''',''.,;:c'.',,',:,;;;;;;;c'..',;,,:;colOkl::;l:,.:OOoddcooloxkdkkkOxdxO0O0xOOxkkxO0KKXK0KNXKOkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklx;l0WNK0kl:::c::;;;;::;:;:ldoddxxdxxxkkkkk00OX0OOkkkkkOkkkkkkkkkkkkx,',,,'',,,'''',;:,,,,;,'c;;;:::,c',;;,';lddlccKdkOl..;c:lXKcllklloxxdkdkxxdlkkOkkOkOO000OOx0XNX0XNK0OOOkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdd,,oXXWXklcccc:;;;;':,':,';;,::l:cldkdddxkXKXNOOOOkkkkOkkkkkkkkkkkkkx:,,,,'',,,'.'',,'',,;;,,;;::;;;c;ll:oxkdxddddO0ddkkc';cdXNOkkdkxoooxkkdloookOkxkxxkkxkOOOOO0XXKXXKKK0KOO0kkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxllOOkoccccccc::::;:,,:,,:;;:ccclxddxdkK0XK0KN0OOOkkkkOkkkkkkkkkkkkkkl'',,'',''''''''.''';;'..''..,x;coddodkxOddoooooocoOolx;dkxdodcoxdddxxddld0Okk0OOO0Oxxk00OOXKKXXKOO00KXKKOOkkkkkkkkkkkkkkkkkkxxkkkkkkxxxkxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxlllccccccccc::::::;;:;,:;;:ccclloodddxkkX000WKO0OkkkOOOkkkkkkkkkkkkkxl;,,,'''''''','...'dol',ooc,kkkxxokO0ddOdxo,xxdccdX0xxoolokOodxkxdlddxkd00xOO00kOOkkk0OkkK0KNKO0K0K00KXX0Okkkkkkkkkkkkkkkkkkkkkkkkkkxxxxk
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkoccccccc:;;;;;;;,,,,;;;;;;,;;ccllloxxxxxkKKO0NX0OOkkxkOOkkkkkkkkkkkkkkxo:,','''...'''''';cl,:k0O;ckkdlodddoldkxo,kO00K0X0;XkodokdockK0XKkOkxdOKNKWWWX0KOxkO0OK0OKKOkOOOKKX0KNX0O0Okkkkkkkkkkkkkkkkkkkkkkkkxxxk
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkOOkkOOOOOOOkOOOkOOOOOOOOOOOOOOOOOOOOkkkkkkkxo;,;::::cccoooodoooollcoxxxxkk00Ok0KOkKX0OOOOOOOOkOOOkkkkkkkkkkkkxo::,''''.'...;oOOxkl0Ok:dxoo;;;::xkOd:,odddxKKo,KXkloKoclcdkOK0kkdcl;xKNNXXK0OkkOOkkOO0O000KOO0XXKNXKXXK0Okkkkkkkkkkkkkkkkkkkkkkkkkk
kkkkkkOkkkkkkOOOOOOOOOOOkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOd::ccclldox0X0kWXOxOxkxxkOOOOOO00OkOX0OKW00OOOOOOOOOOOOOOOOOOOOOOOOOkxd::,,,'''ccloxK0k0KOl:oo::;,:000dc:K0000dlcKX0kokKOkx:,.',;::olxxc:ll'c0dodkodOkKKOOOkkk000KXXNXK0KNX00Okkkkkkkkkkkkkkkkkkkkkkkk
OkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOc:colokxOxkKWOkWMMXXKMWX0OOOOOOOOO0OkKKO0WXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkdol:;:::,,',;:dOOOo:lkolcdOOxl:lOOOOkcoXKOkxOO:cc:c;:;:lodllOxko'':dNkdkkkx0OOO000OkOOOO0KXX00KXKNXKX0Okkkkkkkkkkkkkkkkkkkkkk
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOx;:OOxxOkOkkKNOONWMNNMMMWNOOOOOOOOOOO0k0KO0XN0000OOOOOOOOOOOOOOOOOOOOOOOOOOOOOkxdddllclcodO00ododdoxxddo:xxxxxodXK0OkkO,,'.'l:ooddxxkoddolddlddOOdkOxk0XNWWK0kOO0000K0000XXNXKXNKOOkkkkkkkkkkkkkkkkkkkx
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOxoONKkxoco:loooOKOO0kcxXNNNXOOOOOOOO0O0OOXKOKN00OOOOOOOOOOOOOOOOkkxkxkkkOOOOOOOOOOOOOkxxo:kdxkxkxoddkkdcl0kk0kOX000Ox0o;;dk;xkkdkO0xxkx:kkx0Kkkookxxcocd0Ox00kxOOkO00O00OKXNKXKNKXKOkkkkkkkkkkkkkkkkxl:
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0NNkdoONxkkollxONOOO0kXNXO0XNKkkxkxOkOOO0OKKO0NK00OOOOOOOOOkdooookdkxkkOOOOO0000OOOOOOOOOc;0kxoxolddO0KkoX00KKX000XdOodclo0xckdlccccxkc:kOxKO:Xd:koookxl';:0kxkxkKXKOOO00KKK0XXNK0X0OkkOkkkkkkkkkkko:;:
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkOkOkO0O0000000XWKo,. :OW00,.,okW'lkK0WNx0odOXNKdkxkkOO0OOO0KO0NX0O0OOOOOxclcloldxxxkkxkkOO0000KXK0OOOOOOx,cKN0l;;c::cccccoddxkxkKOdccocodO00old::;c0kcl000oc0KOo0kOddxooood0kOxOOOKOkOOk0000KX0KKX0OOOOOOOOOOOOOkl;;;;
OOOOOOOOOOOOOOOOOOOOkOkOOO000000OOOOOOOOOOOOOOOOOOOOOOOOOOOOOkdddxxkkOOO00K0KKOWXoc;....,kNXO:'lxWoON0NMkkXllddkKNKOkdkkOOO000OOOKKO00OOx:;:clclllddxoddkkkOOOOOKKXX0OOOOOOl;oxc:::;;,;,,;,::llokOKk0kddlolcoOOdldolddocoxxdlK00O00kdxdoOx0OOxd0x:cxKOOk00O00O00O0K0OOOOOOOOOOOOOOx;;;;;
OkkkOOOOOOOOOOOxdddxkkOOO000KKKKKK00OOOOOOOOOOOOOOOOOOOOOOOxolooxdkkOkOOOO0KXWWXcccc.'',,;xNKdOK0WWOoKMKdkXdc:cldx0NXkOkkOOOkOk00O0XK0Ok;;;;:cc::looddooOxkkkkO0OKKK0OOOOOOx:::;:;;;;;;;;;,,:ldxOkO0OK000OxxckOxxdodkxocOxkkK00O0x;;dkllxx0l00oOoxkkkOOdOOOkOOOOkO0OOOOOOOOOOOOOOOd;;,;;
OOkkkOOkkOOOOdlllddxkOkkkOO00KKKXXXK0OOOOOOOOOOOOOOOOOOOOOo:cldollxxkkxxOOKWWX0dclo;;.cc';ldNNNMXNNoOWM0kOXdc:ccodxxONNKOOOkOOO00XO0NK0ll:;::;::::cOOxkkKKXXOkkOOOK0OOOOOOOx;;;;;;:c:coxO0OxkxxXXK0O0OK0K0OOd,OKkdlok0Oo0OKK00XOkdllkkcdkOo00OOdkONxKokdxOOkOxkxOOOOOOOOOOOOOOOOOOOl;,,,
doollllllllol;clollddxkxxOO000000XXXK0OOOOOOOOOOOOOOOOOOOk:;:clllllxOOOkKXWWKOxcc,';:';ccllddXMMKNNOWWXX0O0kldodd0000OOXNX0OkOOkO0X0OXKkldc:o:,;;::clddlddkdOxoxkkOOOOOOOOOOl;;;;;ddodxkk0NKWNkl:xKkk00K00OOO::Od::;'',',;lox000xdoddolkxOK000Ol00o0KOKOOkxxkkOOOOOOOOOOOOOOOOOOOOOOxl;,
llllllllllll:;::::cco0OOkXKXXKOO0OKK0doddxxxxddollcclclccc:;;::cccllkKKNWXXKXkcc;.,lc:c:lll;ddKWKXNXMWNNk000locdcd:lkOkxkKX00kkO0k0K0OKXkxcco;,;;;,ccoxlxdcoOkxxkOOOOOOOOOOOOxc:;xKkOxkcoK0OOX000kkkkkOk0Okddocll:;;,,;;;:odxxO00xoldkokO00000ddxkK00KOdKKOdKxkOOOOOOOOOOOOOOOOOOOOOOOkx
ooooollllllll;;;::cccoxxxO000XOkkkOOdollllllllcccccllllllllc:;;:::;:oKNW0xdoKl:;':xllcclcccco0kKXKNNKNXW0O0NxodkdOxkOkkkOkk0KNK000OOKKO0XKkod,,;loxxdodkokOOOkkkkkxxxxddddolllooKO:;lKNxXXXKNKxOO00kxcokdkko:::::;:cldOOKK0kkOdOOklc,;,;cox0kOkOOK0K0O0K00kOO000OOOOOOOOOOOOOOOOOOOOOOOO
ooooooooooooolc:;;::cdxOkOkxOOOxdxxooololllcccllllooollllllllc:;:loxNNKOOOk0kll:okkooooolloox00kO0XNKNXNXXXKkkO000Od0OOO000OOK0OXXXlolloxk0K0dlclokkolxddOk00ko::::cccclllccccxXd::cclkKWXN0W0Ok0KO0kdclkxxOocc::cOxkxdOKKK0kdooOkxocdxxxollxxoccox0OkO0K00000OOOOOOOkkxxxxxxddddddddddo
ooooooooolllllloollxOxxdxO0O0KkddllclclclllllloooooolllllllllllcclON0NXKk0XNXXXXXXXXXXXXXNXNXXXKO0KNX0kkOXNXXKKNNNXkxddxxxdolddOOdd::cclloxdxxolllcxkdkxkO00kc:::ccccllllcc:lK0c;:ccccdxNXXXX0k000dokO0OxOOdkdllo0c:dKOXNXOcoxxclxO0xd00XklodO0KKcldkOdcxkdxkxooolc:::;:;::::::::::::ccc
oooooollcllllloodooodOxkdkO0Xxlcc:cccccclcccllclcccclllllcccccccllxdOkkxxkO0l';ccccccc'lokxddoxKNNOocc:::;':cccccldc:cldk0oc:;,ckkc:cc:cccoldl::c:::l;;,;coOxl::::::c:::::cdXk:,;cccccckOKXNNK0OkOOddlok0OOodOxOk:ccco0NKNkllcoOxOkxKKXXX:x000kKX0OO0KO00Okoxxlc:cccclclcllc::::::;:::;;
llllcc:ccccccclllcllloolcldO0dollcccllllooollllllllollclllccclcllolllxxdoooOOdlcc:cc;cc:o000OXNNkcclcc:::c:cc::::c:odxkxcoOl,,cccoxdc:::::llo:;;:::::dxOKOlcxkc;;;;::;:;;;oK0xkOOOOOOk00000X0kXX000Okdddddkd::Od:lccclOOKXOxxllkOk0OxKXXKxkcdOKKKkOKXK00KOOkldx:;;,,;,,,;,,,;,,,,,,,,,,'
cccllccclllccclllllllldk0XKxdOkolllcllccccclccclccccclcccccllc:col::lxOOXKdddOd:::;:l:::c0XNN0dclc:::ccccccc:::::lxokKNklccllcccclxx::;;;:lco::::;clxld0XOclldklc::::::;:lxddc;:;;c;coxOkK0ddkNxlddkkd;;,:oo:dOdddddxkOO0xoxkxkkdkdxkkOKO00kkxkkO000OO00KkOkkxdxlc:::cc:cc:cc:c::;;;;;;,
;;;;;;;;;;;;;;;;;;;cdkdoKWKxxdxkd;;:;;;;;;;;;;;;;;;;;;;;;;;;c::ld:llldokK0kxkxxxc;cc'::d0XXkc',;:::::::::ccllcclk0ddxkklclooolllooxOllllccooolllloxKdxxoxololdxxollllcc::clcoo,...;odxO0Oxoxddxdxxxoddllcccll:oc..coxk0OolcllokklcccoO0l:;'lod0O0kxOOklldoclocxdooolollllloolooooloooooo
clolllllllllololloooKxoodddxxxkoxoooooooooooddoooddddddddddolo' .. ';;ldxxllxxxkoo:cXNKl;xo..:xxxxxxdoxxxxxxxddKcckoxxxxl''''''',,:cddddxxkdddxdlK:odlddddo;xodddooooc;...;l, ;k00o;,:.clclllll,cllc...':;c: cOOdcccc:cclkOc,'';cc;;;.cod:llodool;';cc:l,cllc:cclclllc,,;;;'.d:;;;;
dkkodooodddddddddddokdoldoddookoooooolooollooodoooddloolodxooc,''',,:dkOdlll:clc:doOXWO:..':;;':::c:::;;ccclcllcc:::;;,;;;,......'oxdlx,,;:;:,,,;;,,,,,,,,''''','.......;l::lol''':dd;,,,',,,,''';,,,'..::::c:::;,;ccccc::;,:lllloc::::::loooooloooooooc::coxdoooddddolllllccollllodddod
dOkddxxddxdxddddxdoodollcccc:::;::;;:;;,,;,;;cccc;;::ll:;;x:,'ccc:llldOOo:cccloook0WNc .;ll;coooollllclollllcc:cccccccccccllcllcdkxcxllllccc::c::cc:ccllc:ccccc:,''';:::,,dkk:lcololllclololllllllolllccccccllllcclloolooxolldldkkxxxdoooddodxxxxkxooolllooddooddoddxdloddxxxxxxxxkxdd
Model Context Protocol diagram Every few months, something gets released that looks like infrastructure plumbing but turns out to matter more than the flashy launches. Model Context Protocol (MCP) is one of those things.
If you’re a developer working with LLMs, MCP will change how you integrate AI into your workflows. Here’s an early-adopter perspective on what it is, why it matters, and how to actually use it.
What Problem Does MCP Solve?# Today’s AI tools are context-starved. You paste code into ChatGPT, upload files to Claude, manually copy database schemas into prompts. Every session starts from scratch. Every context window is a blank slate.
This is absurd.
Your IDE knows your codebase. Your browser knows your tabs. Your database has a schema. Why are you the middleman copying information between tools that should talk to each other?
MCP is a protocol for AI models to access external context sources directly. Instead of “paste your code here,” the model can ask “what files are in this project?” and get an answer.
It’s not magic—it’s plumbing. But it’s plumbing that enables magic.
MCP Architecture for Developers# MCP has three components:
1. MCP Hosts: Applications that want to use AI (Claude Desktop, IDEs, custom apps)
2. MCP Servers: Programs that expose data/functionality to AI (database connectors, file system access, API wrappers)
3. The Protocol: JSON-RPC communication between hosts and servers
┌─────────────┐ MCP Protocol ┌─────────────┐
│ MCP Host │◄───────────────────►│ MCP Server │
│ (Claude) │ JSON-RPC/stdio │ (Your DB) │
└─────────────┘ └─────────────┘
The key insight: MCP servers are just programs that respond to standard queries. You can write one in any language, for any data source.
How it differs from function calling# Function calling (tool use) lets models invoke specific functions you’ve defined. MCP is broader—it lets models discover what’s available and query it dynamically.
# Function calling: You predefine everything
tools = [
{"name" : "get_user" , "parameters" : {... }},
{"name" : "list_orders" , "parameters" : {... }},
]
# MCP: Model discovers capabilities
# "What resources are available?"
# → ["users", "orders", "products", "analytics"]
# "What can I do with users?"
# → [list, get, search, ...]
MCP is more flexible, but requires more trust. You’re giving the model keys to explore, not just execute predefined actions.
Building an MCP Server# Let’s build a simple MCP server that exposes a PostgreSQL database. This is genuinely useful—suddenly Claude can query your database schema, understand relationships, and help with queries.
# db_mcp_server.py
import asyncio
import json
from mcp.server import Server
from mcp.types import Resource, Tool, TextContent
import asyncpg
server = Server("postgres-explorer" )
pool = None
@server.list_resources ()
async def list_resources ():
"""List available database resources."""
async with pool. acquire() as conn:
tables = await conn. fetch("""
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
""" )
return [
Resource(
uri= f "postgres://tables/ { t['table_name' ]} " ,
name= t['table_name' ],
description= f "Table: { t['table_name' ]} "
)
for t in tables
]
@server.read_resource ()
async def read_resource (uri: str):
"""Get schema for a specific table."""
table_name = uri. split("/" )[- 1 ]
async with pool. acquire() as conn:
columns = await conn. fetch("""
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = $1
ORDER BY ordinal_position
""" , table_name)
schema = " \n " . join([
f " { c['column_name' ]} : { c['data_type' ]} "
f " { '(nullable)' if c['is_nullable' ] == 'YES' else '' } "
for c in columns
])
return TextContent(
type= "text" ,
text= f "Table: { table_name} \n\n { schema} "
)
@server.list_tools ()
async def list_tools ():
"""Expose query capability as a tool."""
return [
Tool(
name= "query" ,
description= "Execute a read-only SQL query" ,
inputSchema= {
"type" : "object" ,
"properties" : {
"sql" : {"type" : "string" , "description" : "SQL query" }
},
"required" : ["sql" ]
}
)
]
@server.call_tool ()
async def call_tool (name: str, arguments: dict):
"""Execute the query tool."""
if name != "query" :
raise ValueError (f "Unknown tool: { name} " )
sql = arguments["sql" ]
# Safety: only allow SELECT
if not sql. strip(). upper(). startswith("SELECT" ):
return TextContent(
type= "text" ,
text= "Error: Only SELECT queries allowed"
)
async with pool. acquire() as conn:
rows = await conn. fetch(sql)
return TextContent(
type= "text" ,
text= json. dumps([dict(r) for r in rows], default= str)
)
async def main ():
global pool
pool = await asyncpg. create_pool(
"postgresql://user:pass@localhost/mydb"
)
await server. run()
if __name__ == "__main__" :
asyncio. run(main())
Configure Claude Desktop to use this server:
// claude_desktop_config.json
{
"mcpServers" : {
"postgres" : {
"command" : "python" ,
"args" : ["/path/to/db_mcp_server.py" ]
}
}
}
Now Claude can explore your database schema, understand table relationships, and help write queries—with real context, not guesses.
Use Cases That Make Sense# After building several MCP integrations, here’s where they shine:
Database introspection# The example above. Claude understanding your actual schema instead of inventing tables that don’t exist. Worth the setup for any database-heavy work.
Documentation access# Point an MCP server at your internal docs, and Claude can reference them when answering questions. Better than pasting docs into prompts.
@server.list_resources ()
async def list_resources ():
docs_path = Path("/path/to/docs" )
return [
Resource(
uri= f "docs:// { p. relative_to(docs_path)} " ,
name= p. stem,
description= f "Documentation: { p. stem} "
)
for p in docs_path. rglob("*.md" )
]
Git repository analysis# Give Claude read access to your git history. “What changed in the last week?” “Who usually works on this file?” “Show me the commit that introduced this function.”
External API wrappers# Wrap frequently-used APIs as MCP tools. Instead of explaining API semantics in every prompt, Claude can discover and call them directly.
At Entropy Labs, we built an MCP server for our internal APIs. Now Claude can check deployment status, query metrics, and look up customer data—all without manual copy-paste.
Current Limitations# MCP is early-stage. Expect rough edges:
1. Ecosystem is immature. Pre-built servers exist for common tools (filesystem, GitHub, Slack), but you’ll write custom ones for anything domain-specific.
2. Security requires thought. MCP servers have access to real systems. A poorly-written server can expose sensitive data or allow unintended actions. Audit carefully.
3. Performance varies. Large resource lists or slow database queries can delay responses. Implement timeouts and pagination.
4. Discovery UX is evolving. Models don’t always explore available resources effectively. Sometimes you need to prompt “check the available MCP resources” explicitly.
5. Not all hosts support it equally. Claude Desktop has full support. Third-party integrations are catching up.
Security Considerations# MCP gives AI models access to real systems. Take security seriously:
1. Principle of least privilege. Your MCP server for database exploration should use a read-only database user. Don’t give Claude DROP TABLE permissions.
2. Input validation. The model controls tool inputs. Validate everything. SQL injection is a real risk if you’re not careful.
# Bad: Direct interpolation
sql = f "SELECT * FROM { arguments['table' ]} "
# Good: Whitelist validation
allowed_tables = ["users" , "orders" , "products" ]
if arguments["table" ] not in allowed_tables:
raise ValueError ("Invalid table" )
3. Rate limiting. Models can call tools repeatedly. Implement rate limits to prevent runaway queries.
4. Audit logging. Log every MCP call with timestamps and context. You’ll want this when debugging or investigating unexpected behavior.
5. Network isolation. Run MCP servers with minimal network access. They shouldn’t be able to reach arbitrary endpoints.
The Bigger Picture# MCP is part of a larger trend: AI systems becoming first-class participants in developer workflows, not just chat windows you paste into.
Where this leads:
IDE integration. Your editor’s AI isn’t just autocompleting—it’s understanding your entire project, git history, and documentation.
Agentic workflows. AI that can actually do things: run tests, check CI status, deploy to staging. MCP provides the plumbing.
Custom enterprise AI. Organizations can expose internal knowledge bases, APIs, and databases to AI tools without sending data to external services.
Standardization. MCP is open spec. If it gains adoption, we’ll see interoperability between AI tools that currently don’t talk to each other.
This is infrastructure work. It’s not as exciting as a new model release. But it’s what turns capable models into capable systems .
Getting Started# If you want to experiment:
Install Claude Desktop and enable MCP in settingsTry existing servers: Filesystem, GitHub, and Postgres servers exist as reference implementationsBuild something small: Start with a read-only server exposing one data sourceIterate on discovery: Watch how Claude explores resources and tune your server’s descriptionsThe learning curve is manageable if you’ve built APIs before. The mental shift is thinking about what context would help the model, then building servers to provide it.
The Bottom Line# MCP solves the “context starvation” problem that limits current AI tools. It’s not a product—it’s infrastructure that makes better products possible.
For developers, the implications are:
Less copy-paste, more integration AI tools that understand your environment, not generic examples Custom workflows that weren’t possible before If you’re building AI-powered developer tools, MCP is worth learning now. The ecosystem is early, but the direction is clear.
And honestly? Building MCP servers is kind of fun. There’s something satisfying about giving Claude access to your systems and watching it figure things out.