Springing into AI - Part 13: MCP Server - Tools Playground ( Elicitation )
Project
For the elicitation sample playground, we being the owners of Hobbits Inc will be creating a dumb hobbit travel planner tool where they chose the source and destination in middle earth, The MCP Server will then present the user a choice of two options for a desired route. This will demonstrate user involvment in task fullfillment process by involving them for getting feedback so the task can continue to completion. An architecture overview of our tools playground is shown below:
Setup
Our project setup encompasses the following:
- Java: 17
- Spring AI: 1.1.2
- Spring Boot: 4.0.3
- Testing tool: MCP Inspector
- Source code: MCP Server ( Elicitation ) can be viewed here
- Project Demo: Youtube (MCP Server - Tools) here
Demo Screenshots
In this tool, the user supplies the parameters of from and to as shown in figure below:
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20parent%3D%221%22%20style%3D%22shape%3Dimage%3BverticalLabelPosition%3Dbottom%3BlabelBackgroundColor%3Ddefault%3BverticalAlign%3Dtop%3Baspect%3Dfixed%3BimageAspect%3D0%3Bimage%3Ddata%3Aimage%2Fpng%2CiVBORw0KGgoAAAANSUhEUgAAAucAAAGRCAYAAADGlB2JAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAE6QSURBVHhe7d17eBTV4cbxNxdIFGhUIiRAUqUigoYSpUQRLCXYFuPPglCoUWu5VfGCVaCirfdWtNwEq9RCoZaaFiqXWiO1JRbLRYLWUFJRUUHDJYEGNYVgQrKZ3x%2B7szszu0k2yW6YxO%2FnefJAZs7OnDlzJnn37JlJjGEYhhzMRYZh2P5v%2FRcAAABA88TExAT9GxMToxhnODcDufn1eVWNqk56dNLjkWFIZHMAAACgZWJivF8d4%2BKU2DFOpyV2CA7nZiCvq6tTVXWNjlfVSpK6nJ6ghA7xio%2BPtW4TAAAAQDPV1tapuqZWx05US5I6J8YHwrk1mJ%2F4%2FKT%2B93mNzuxymjqd1tG5HQAAAAARVPn5SX167HNvOHeOmH9WeVLJZ3RSYsd45%2BsAAAAAREHVyVr556kYhiGPx6PjVbU6s8tpBHMAAACgFSV2jFes8%2BZPSUxlAQAAAE6BWFlGzatr6tTl9ARnGQAAAACtwDatpaauTgkdmM4CAAAAnAq2kXMphsclAgAAAKdIrOUx5%2FyBIQAAAOAU8o%2BcW0M6AAAAgNbHHBYAAADAJQjnAAAAgEsQzgEAAACXIJwDAAAALkE4BwAAAFyCcA4AAAC4BOEcAAAAcAnCOQAAAOAShHMAAADAJQjnAAAAgEsQzgEAAACXIJwDAAAALkE4BwAAAFyCcA4AAAC4RPTC%2BYdLdNFpKYobtET7nOuarUQLBqUo7rRhWvChc51DE%2Ff%2F2a4tKjrqXNrWNaG9QtgwOUVxp6XohnznGgAAAERD9MJ5W7LtXvXMGqdBve7WBuc6KzPwN%2FjVvCDcegp0Q1CdU9R14DjNevGIszAAAABaEeFckrqfr8x4SYMzdIG57Pj7%2BsMj12tQiiWwxyfqnJ7dlGJ%2BJfqWJ1qW9UxXYrz5AndL7O6rc%2FcEffbeFi2YMECDFr7vLAYAAIBWQjiXpK9M1JZjZfK8NlHnmssOb9TP5xSoqKIqUO7LE%2FXSB7t00Pe15YE%2BkqR%2BD7zkX3bwg%2Bd165cDL3GvPnq0wFfnjz7W0Reu1RmSiu57XH847iwLAACA1kA4hyTpjJy7NKOvJG3Utl3OtQAAAGgNrRLOq44WaNblfX3zm7%2BsQbflq6zWUejgFt0%2FYZi6dvHNg%2B7SVxdNWKLX671Js0KvL5ysnr7ynS6arAU7KpyFvCre1IIJA%2Fz7P2%2FCEr1uLeq4eXTD5BTFXfSw3pEkrdXVTZxLHriRskKvP3K1Op2WoosWlkiSqj7M1%2F3jrlTPM8353vb6lC0f513%2B7TyV2bZarPvPSVHcaYN1%2F9u%2BRbVHtO7H43Seua0zB2jQbfnaZxnsD1%2BCbzpOtT791LnOVK19ax%2FX1ZcPUCdzvvqZgzVu4Zv6zFIqcPzVeueZyf76dbpospa%2FZyloafd3rH2kS18N%2BvEW2zYlSQfzNevbg%2F377nTOlZq6tkT%2Bw7Vu7%2BBa3XBeiuJOu7Xh%2BwgAAABcJPrhvHytbrzweuV1ydaknD6SqlW0fLJGPuUNq5Kk95Zo0Hnj9NiL76uqf7YmTbpW3%2BheoXdefFhDzxmn5QetG%2FR69Z4rNfSREmV%2B%2F1p9o6c39M76%2BjgtsIY%2FSardojuyrtb9H2Vo0vihSomv1r4XH9bQq5boHecbBJ%2BUy3M16doMeaeUp%2Bsbk3I1adJY9evsLNmwz9beq5Fz3gyER0n%2FeGyyHiuQMnNzNWlSrkb19dVngjeMp4zP1RhJem2tXj5seeFb%2BVp%2BWNLgabrtQkm172vB1wdo3FNblJjt3dZ1F0tFyyfrvNHOYB%2BG2hLt%2B1CSMnTxRc6Vpi26%2F%2Fon9Y%2FaDOVOytWkSdnqV1uidfddrXHLg28m3fnY1broF4d1ae61uqy79xxN%2Ffq9et3Z7r4%2BsiE1x9tHaitU9NQ4%2BzbfW6JB503Wgq0JvvNxrTJVrOXXD9bVQfsu1s%2B%2Fc6v%2BEKLfAAAAuJrH4zFOnjxpHDt2zCgp%2B8yImA%2BeMS5M7G7EJnY3clYFtrv7F0ON2MTuRuyQZ4y9hmEYxh7jp3295S5ZsMeygc%2BMlyedb8QmdjdOn77Zt%2BxjY%2F4l3rKxY583Pq0JLhs7aaN3kXX%2Fz1mO67ONxvXdvcuvf8m3zCx7iVkn6%2BunGS8HXm2zd4H3WC5c8LFt%2BcuTfHXsnGP8dKu9TfcWvmGpt2EYNS8Z1yd2N2ITxxq%2FKTMMw6gy8sab7VblL%2FbW%2FRlGbGJ3I%2Fs3hw3Dv%2B904%2Fo%2FW7d%2F2Hj6iu5GbGKG8dN%2FGZb2GmrM%2F8Ass9G3v8Cyzz%2FbY%2FxmvK%2F9vvW8UeoraR6Hv52Mj41tjuMx%2Fjyt3tfFXrLQ2G0ea81m4%2FYzuhuxienG7Vt9y%2FxtbD%2BO0qdzHNv0HccZ04y11t0fWG5cntjdiP3yHOMtw37Oe4x%2F3tj7uaUsAABAGxD9kXPl6rbxSf7v%2BmXnKEWSqn0LPt6oDR9LSpyop%2B7y3mDplaRRP56mfpKqfpev1y1rpATdeneuzvA%2FFSVJo26b6N3uv%2FfYn2ueOFE%2F%2BX5g%2F0rK1owfdpMk7dxjGb2PgsRJs%2FXoEMu%2BJZ17cR%2Fte3GJZt12vQadN0Bdz5ysP0iSDuuz45KUoOtunahESRtW5%2FtG3Yu19ndHJOVo8vhukkq07oX3JVXrDxPM6UIpijttgO7YIUlHtK%2FUttsQ3tesi3zTQ1KGaeqLFVL3XL20KtfbjiGl67K%2BJVq38GFNHXelep7XV3ET1npXlVfoc0fpUT%2Bepn7mOYofqhHXKPS0me7TNOOaQDulZI9UP1m2%2BXG%2B8t6WVLVW41LMY01R3Hn3evvF4RLHJwWD9JMFuTrXfJoOAABAGxH9cH5hn8DjCSUpKUlnWr%2BvlTeAfiU9OBT2zdBASaqqcMw%2FTte53W0LgrdrCrHdM860B%2BZoGZM91L6g9n0t%2BHpfDbr%2BYT3zWrUu%2BFauHn1umi6zl5Iuz9GkREn5a7TueGBKS%2BIPJ%2Bo6c2pNtSR103Xzf6MXng%2F%2BmjHQvslQvI9SzNCoSbm679m%2F6%2BgHCzSqoaZ5b4kG9bpS4%2B5brn8c76Orvj9bL9w1yFnK74xOCbbv633EZHKSzrB%2BH29%2Fnb%2BPdL9WT4U41heen6ZMa%2Fm%2BI%2FWNntYFAAAAbUP0w3m4PnSOfkp6r1g7Jam7M2BX6FPnvZ%2FvFntv4HTkOpU7g7307n%2B8z%2FKuNyxGSpz926q1D2nWW5K%2BtUAH%2F%2FOCfv%2F0bN167VCdYy8mxQ%2FVpDu6SSrQmperVbQ%2BT2VK0KRrHWFfFTrzwhyNuTb4K7PRcGo%2BSvHveunpBXr0%2BxmWTyJCqdYffvKwiiSNenaXPvjrM1r6wESNuTzdWTB6KpLU75rgYx1zbYa9f8Qn%2BO4XAAAAaFtOfTj%2FykiN%2BbKkqhW6w%2FYHcCq04RdL9I6kM8aOtI%2BM6oieebogELpr39eCx7zTK8791sjAs8ol6fAKzc%2B3JPn3luj%2BPElK16gR4QXLKucNjM1UetA3jSYpMFL8Wf6akE8TyZyQq3MlrXtlofJ%2Bd0T68jTd%2BnVzbbou%2B3qCpGo9c5%2Fjxtaq9%2FXM7960LIiUwyr9yPu%2FM84wh9crtGFtgbVQdHzla%2FpGorePzHrK%2FkeSqt5eoeU7bIsAAADarFMfztVHP1nknedcdN8wdcq6XlNvu1Ujz%2Burq%2FO886B%2F%2F4Bz6kQ3nbn1enU9b5xuuO16DTp7mHdEOilXT91tnbcuqXuSto%2Frq57fvlVTx12pTgO9o79nfH%2BOfnKhvajNl8%2F3TqnRWo0bdL2mjrtVz4T5KMX6nHv5SG8oXz1ZF427W1NvuloX3lZPuL1wrK77sqS1S%2FTMYemy6ZO887B9Lntgua5LkvTWw7ro7Ct19W13a%2BpN49Tz7GG64zXnxwqRkK7LRnhD%2BR%2BuH6arb7tbN2QP05R8Z7loGKRHf2%2F%2BkSSzj9ytG749QJ0G3atX%2F%2BssDwAA0Da5IJxLid9aoA%2F%2F8xvd%2FfV0aVeBli9fq38cTdc37viNPng31DzoJN36u5c095I9%2BsPyAhVVJejcax7UlrcXaJTzcYfJE7XytQd12QdrtTy%2FWFWJ6Rrz2Ev68Onshqc%2BxGfrl3%2BdpsxESe8VaHnBEanBaR9hGPygtjydo3MTpXfy85T37vn65dYFGuUsJ0nqo9umD5KqqlWlQcr9jvcmVr%2BkbP3%2B7Zc095o%2BOqO2WBuW52n52mKdefk0vXCfc%2FpLZFz22Etaek26Emvf14bla%2FTuBXP0r19nO4tFxRk5z%2BjDggc1pm%2BSqnYVaPnyPP1hZ5K%2Bccdv9GjrVAEAACDqYjwej%2BHxeFRdXa1PKz1K6x6UhAEAAAC0AleMnAMAAAAgnAMAAACuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACAS8R4PB7D4%2FGourpan1Z6FGfUOMsAAAAAaAVB4Tyte5KzDAAAAIBWwLQWAAAAwCUI5wAAAIBLEM4BAAAAlyCcAwAAAC5BOAcAAABcgnAOAAAAuAThHAAAAHAJwjkAAADgEoRzAAAAwCUI5wAAAIBLEM4BAAAAlyCcAwAAAC5BOAcAAABcgnAOAAAAuAThHAAAAHAJwjkAAADgEoRzAAAAwCUI5wAAAIBLEM4BAAAAlyCcAwAAAC5BOAcAAABcgnAOAAAAuET7DOcH12na%2BCmat8O5wm7boim6elGhc3H0HFynaeNna9VB3%2Fc7Fulq6%2Fet5VTttyWcbddcYW2nVKtmTNG0NaXOFTbbFk3R1TPWab9zRYt49331%2BFbum63K2b6O78O8fiNmxyJvezfaL9q%2FVv%2BZGJLvGjjl9WhDdizS1eMXaZtzOYA2KYrhvFDzxvtChuWr1X7hAm3QtkX3a2X6VL20epleujPLuRqRdnCdps0r1Y0Ll%2Bml1Y9rQk9nAQAAWlcUw7nX8JnLvEFj9TK9NDNDm%2Ba1QkDvOUZLVi%2FTzMHOFS4z%2BM7oB4JQIyqtsV8peES0nRly5zK9NH%2BM0swFodq6SUq1v0RK65XuXBEh3jfMUb%2F%2BWqo1r9%2BDJdqvVKVF%2FVpAaKH6ZKomzG%2BlN6ctvmZPgbZYZwBNEvVwbjP4Tt13ubTpdT6uBAAAAJxiPB6P4fF4VF1drU8rPUrrnuQs00yFmjd%2BqTTTPgK2f81sTduWpSXzxyhtxyJdPU%2B6b6b02LxiKS3Hu9wst6o88MLLp%2FpHUrYtmqLHFPjeq1SrZtyvTUMe1ZJLt2vaXYUavtA6Ouytzybz28un6j4tDdrOtkVT9NhW87tk3WjdxsF1mnZXfmCOsaW%2BodiPIVk3zszSpnmWepnHv%2FpODbEc131aqse2SmkTHtWSsanBdQ%2Bx31DtZW4nIMO7L8d%2BJbMuxYGizn2Yr1mYrpWWNhjuOL9%2BzraS9XjC2J%2FTwXW%2BczpG%2B%2B8KtIVtm1JwW4U8h4UavvBOacH9WmlW0NK%2FrH3pPi2ytKuv%2FXzfWfuhvd9Yy3q35d%2BPsz6mEO0VaNswj2lmljbNy9d%2BRz2lEO1tbr9nfa917jOwzUavv0b7rLOs43v%2FOXJcJ431PUcbpk2YquHbllr2Yxd0ztJytGT%2Bpdo2435tGuJ97cr9LTkPclxzZvuHOD9BwtxXU6%2BHRq6zUOc21M%2BWoFFtZ%2F%2By7MfZzv72dL7Gv87ZP%2BTvI4HryHn%2BA6%2B58cD9gf01cLzOetnPSyPtH4rzGq6nzzdWv4bau946N%2FMasZ3LoP4bTj8FEBUej8c4efKkcezYMaOk7DMjcrYbc7872ZhbaF%2B69cnJRs6T273fFD5p5HzX8r21zHefNLb6lxwy%2Fnj3ZCPn7rVGiWG%2BzrresezAWuOW795j%2FPGAudJbl1teOOQvXvLCPUH7ttXNMLdpbsd5PIeMPz7pq08I3u1b6%2Bh9fWB7wcfhPW5nmzn36ytntkXI9tpuzLW1cQNt5a%2Brtb1CbNM8V5b9Bh%2Bjk%2Fe8WdvdCHd%2FTgfWGrd8N1SdLNvxlbHtz1dvf%2Fv5txPcPwLn3tffHNty1jF0f7Efg7NMyQtP2o7bLkR7NeWYLOcmtOC%2BVN9rnfW09bkQx2lfFrwfe591Hqfje%2Bf1G07f8x1H0D6dbecUdCzmubf3z%2Badh0A%2FClrm%2BJln05R9NXQ9NHoegjn7q7PPB%2F0sDnk9W342HlhrzA06jobrGNQfgq7PUG0UaOvAtoJ%2F7gcJOv%2Bhth2i%2FUPY%2BmSIdgrxM6Wh%2BoXT3iHrHPY14jhP1joG9V8Ap0qrTmvZv2a2HtuarBvHWUddHN8fXKeVW5N140LrO%2FZUTbg7R2n7C7XtoKTBl2q4irXNMk9x2%2BvF0uWXhnyXv3%2FNOm1Ky9F9lhGltLGP677LLYUOrtPKrRm6zzoiNHi8bkwr16btpdLBQ%2FpQyZa5qamacGfoERmpUKtWlWv4TOsxZGnmwpx6yluk5WiC7ZOGddp0%2BVTb6MeQcZa2CNleWZrpHNmql1lX%2B6jQkDunBrWxlKwb7w4cc9rYMSHKNKYp%2Bwtma1Pr%2BZG07YV87b98qn3ksJ6pVPb9Z2nmzAxp63b7PE7HtsKtY0DwHPK0sXc2PPrm0KRjmlBff2yc87XOeg65LEPaX%2BIdcWvk%2Bmu0zzZLw33PbCfbPu98VDc2t0EuH2M7%2FvDPg7WeqZowISP0Mmdfswh%2FXw1fDy0%2BDyF%2Ftjh%2BFoe8ni0%2FG3uO0UzbcVyq4SrX%2FnD272P%2B%2FF5i%2FZnWc4zum5Cs%2Fdu225%2BWZDveLE0IVaYRTWl%2FqyF32ttpyJBkqeRQ%2BPULq70b0vg1ognW6zp0X3T%2BLADQ%2BqIezjfNCzypZdqqVN0XdCOi42asgyXan5alIc4A0%2FNSDU8zf6h7f6gFflAWaltQ6A%2FYf6BcaUMubfgHzsES7VexHrM9XcbyMWrPMbrx8nKtvCuMR3wdPKQPlaEhoaZ7NCa9h%2F0jzgPl0tal9qfeWD%2BWrK%2B9wlVvXbM05HLpw%2F3WmzkjcONck%2FbnZH1z5OQNwsMvC%2B4DQy7LcPySDLGdnulKU6ktNATfmJmutLTG6mjl%2FeW3f9X9zbyBq4XHFLbQr92%2FZnagz9mmHzR8%2FTXaZ5ulob5Xfzs1l%2F3c17%2F94PMQSkN1d2rKvkKfN1OLz0N9P1usP4vrvZ4tfI%2FG9NbBOlUkPPX9%2FE67NEtp5htGc1nQNdtUTWn%2FYNsWWX%2FfWaam%2BDRYv3Dau0EN9TPvcXl%2FFln6g2NaUWN9CkDriHo4tz2tJYLz19IuzVKa%2BY5%2Fx3ZtCvVDranScrTEX9fAlzmCMuTOZXpp9aO6scT3C6%2BxkB4haRMeDapT6zxtBS02%2BE5vH5pQ6nvj15yQ3tq8T9CYti0rcD3MzLCVaOz6o8%2B6w6k%2BD9sWTdHVdxVq%2BEJz31M13FmoPfC9AXlMvsegrl6mJROSnaVOOfvvY%2FMrcr%2BXAURG1MN5k%2FVMD%2F0R3sHt2rTf8q6%2B56Uanub9yG7b68UhR1asgj%2Fa9I4k%2BNW33yC%2Bx3yFmgZhE2L6w0H7KE840no18rFs2PWuR88e%2BkqouqpQ27ZKX0kLvpGuRaK2v1SlpYf%2B2Hnb68VBn0g47d9eGHrUysrXB4df2vQ6po193BdMQh17fVp2TM22Y7s2KUP31XMjndTw9ddon42S4HYq0f6IVKI1z0Pk9tXi81Dfzxbrz%2BJ6r2f5r2nnFLamqu84vNdsetjtEZ7mtb%2B3Lo6pN00VTns3W%2F3HBcB9XBjOzekj1hHGUq1akK%2F9tnmg3ikDm15fpG1bM3RjiKcxmLzzLPP1mOV52%2FvXLLLd%2BW9%2BdLhygf0vPm5b5KvHwXWaF%2B7zunuO0Y2XS5vmWY%2BhUPOCPkJsnPejW3vdpULNM0ftQ7aXdX3wdA073xSFefa%2Fjrht0VJtcsx%2FbzrvL4T9B6zvgqK3vyHjcpS2dan9ueo7FoW4z8HRXgfX6bFVwR%2Bd7191v%2BX5y74%2B2FCAD2rrUq1a1LK%2FIBr%2BMYUjzGk5QccRqu%2FWf%2F012mcjzpw7u9T2vOxti5o%2BhaI%2BkT0PDYvUvlp8HkL%2BbHH%2BLA51PZv9Pri%2FBZ%2BT4DJOaWPHaPj%2BfE2z1tt3zbZ4fnRQX29e%2B6elpQbuyVCgfk0SVnuHrnM4hlwWfI006fcagFbjvnDumz5y3%2BXW%2Bd%2FeR1AFPb5r8KUavrVYm%2Bq5EdSv5xgtWZgjWebbPSbvDT4BqZow%2F1HdqHzL%2FMgpWtlrvH%2FbH1rn6zkfRegQfAzbNSScG0KdQtT96vHrlGb5JRG8r6WSOWfSOle%2BnikVaWMf15IJ8pUx22eqbH9gp5nMX3RXjw%2F8MaKo7S9UW81TiPscknXjzHStNMvclS8FPYLO%2Byi%2BtFVmHe%2FXSgU%2F9swmVFuXWPtT8KNFGxX2MYXDOgfe%2BYdfLHqO0X2287NdQxzTWqQGrr9QdXb02YgbfKf%2Fj5yZ%2B9x2WQtuCHUKdUzNPg%2BNiNS%2BQm2niech%2BGdL8M%2Fi4Ov5fm3qdanSfDczWve%2F7TLntJZw%2BmSWZq6equHW%2BfO%2BqTJNupZCCXXNhmq3xtp%2F8J32dlog3diMaS3htHfIOocjxDVy9V0lGtLAwBaAUyOKzzkHgFMp1POyAQBwN1eOnANAi7XgHgEAAE4VwjmAtm%2FHIvscYRVq3l3O%2B1QAAHA%2FprUAaPucf5Zc9fyZeQAAXI5wDgAAALgE01oAAAAAlyCcAwAAAC5BOAcAAABcgnAOAAAAuAThHAAAAHAJwjkAAADgEoRzAAAAwCUI5wAAAIBLEM4BAAAAlyCcAwAAAC5BOAcAAABcgnAOAAAAuAThHAAAAHAJwjkAAADgEoRzAAAAwCUI5wAAAIBLEM4BAAAAlyCcAwAAAC5BOAcAAABcgnAOAAAAuAThHAAAAHAJwjkAAADgEoRzAAAAwCWiG849n2nbUzN05bev1aUjZijvoLMAAAAAAFNUw%2FmhvAd097p96th%2FnB6%2B9evq4Sxwip144kp99sQO52IAAADglIhqON%2Bz94CkizX957n61rhrNLyns8Sp8fniG1XxaJ6MuHTFxJXo%2BKOT9dninapzFgQAAABaURTD%2BQEdKpGkTupymnPdqRU7YqLiz%2F1Ytf8skfHPDTLOHaeOI1KcxQAAAIBWFZ1wXvKCvj9iuhbvk6TNunvEtbp08gs6pAPKm3ytLh3xC%2F123c907bfN5ZI%2BKdYLD5vz06%2FVpTnTdPtT23XUY27UfO1Cbdq3QbNzJ%2BjSEdfqityFeqVMOlb8gmXZz%2FTiPmuF7BIuGqF4lcjoPkJx3UtUpwuVeFFKlBoDAAAACE%2Fcgw8%2B%2BJBhGPJ4PKqqMZTUOdFZpuk6fklpvbvL885OfXiir3J%2F%2Bn1dPyRDfXtKu1%2FcoMLPDujNTy7X0pU%2F08xr%2B6vL8e168Ac%2F18oPpAH%2F9z1NHzdQ3cre1iubC%2FTKwS%2Frmit6KUH%2FU%2FGLG1T42VEV7axU1vfGaODJ9%2FWv9%2Fdo01s7VLh%2Bn87Nnairztinzbs%2B0OYdHl0xNkNdnXWTpIpXdeLhVxU7%2B5fqNLhC1Ytek3F1tjpE4NABAACA5orOYPFpvTRoxMXq21mSumnQiGEaPriXOvoLnKEfzMjVOb4Fe%2F74nF6pkIbPeEq%2FvOMaDR9xjab%2FcoFm9peOvpqnv5T4Xyipg74142HdkjNSt8y9Xz84W9K%2Bferxo%2FmaOW6Yxt37E00%2FV1JZsd79xPo6i6QR%2BtK6VTp9oBQ78GZ1WfdznZ7kLAQAAAC0ruiE80ZlaEBf8%2F%2BH9eaOw5Iu1bev7GQpc4aGZPWSdEDv2cJ5hgZlmP%2FvoC91lqSL9Y2hHXzLeumccyWpUsePm%2BVC6NhRcd7%2FKC7wrgEAAAA4ZU5ROI809910CgAAADSVC8J5d2X07ySpWP%2FYUmlZXqk3dx2Q1FcZ%2FlF2AAAAoP1yQTiXMq6%2FSUM6VuqVn92h2596UZtefVGLb79Dj%2F1L6jomV%2BPOdr4CAAAAaH9cEc519kgt%2BO2Plds%2FQe%2B9%2BFvN%2Ftlv9cLBM%2FWtW%2Bfoj3f4J5gDAAAA7VqMx%2BMxPB6Pqqur9WmlR2ndeWwJAAAAcCq4Y%2BQcAAAAAOEcAAAAcAvCOQAAAOAShHMAAADAJQjnAAAAgEsQzgEAAACXIJwDAAAALkE4BwAAAFyi1f4IkWEYzkUAAABAmxYTE%2BNc1CJRD%2BeGYehkrUeVn9eo%2BmStaj11ziIAAABAmxIfF6uEjvHqdFoHdYyPi1hIj2o4NwxD%2F6us1vETJ9WlU4JOT%2ByguNiYiFUeAAAAaG2GYchTZ%2BhEVY2OVVar8%2Bkd9aVOCRHJuFGbc24G8%2BqTtUrp2llf6pSg%2BLjYiFQaAAAAOFViYmIUHxerL3VKUErXzqo%2BWav%2FVVZHZBp3VMK5YRiqrqnV8RMn1TXpdMXFRWU3AAAAwCkVFxerrkmn6%2FiJk6quqW1xQI9KajYMQ5Wf16hLpwSCOQAAANq1uLhYdemUoMrPa9wXzg3D8N4EWuPR6YkdnKsBAACAduf0xA46WePxZ%2BHming4N9V66hQXy%2FxyAAAAtH9xsTEReSphVMK5%2BW6Bmz8BAADwRWDm3paMmita4RwAAABA0xHOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKE89ZStFpTZ83T1FlLtb7MudLtDmn9E%2FN074ZDzhXuUbRaU2etVqFzeYtE6rjD207hinmauqLIudiuaHUb7UNwG2d%2Fs3%2Fv7bON9kcAQMS5NpyXbljqC7PmVxsOJGUFujevQjkzZmrp3KkaneIsAAAAALg0nBeumKcHdvXWI3Nnaqnv65ERSc5ibUfpUZUrSamE8siIyih5G5E53vEGr0iLZ83TYrcNcLb4HIX3aUOLtbieAaUblmrqEwUqda6waaXjarEeGn3PTC2dmOlcAQCIMheG8yIV7k5Szk3ZSrUsTR01nhFnAAAAtGsxHo%2FH8Hg8qq6u1qeVHqV1b9kItWEY8ng8Kj1a2cxtFWnxrAKVjsjVnFE9nCstvOWK%2Fd8nKWeGZUSxaLWm%2Fq2rHrnHGvK9r1HuTE3P9E03mb9XWbm9VZhXpHKla8rc8coyX59X4n%2BlkjMD2yor0L3zi1RuruufXe8IU%2BGKeVq227IgOVOP3NNPhU%2FkqXBAtrJ2FSi%2FXMow69TYcQXVWZJZb1udLcfiVLRaU%2FNkW1%2B6YakeeDXJtqxwxTytT8nVnFHS%2BifyVDggV6PL8gLHY20TKbjutvWHfNsIccwtaU%2FbsUtTZnTVesu2Au3q04R9Berc2HF7y%2BX7N%2Brcb2A705WvB16t8C23n6PCFfO0TNlaOvB9y3kM0a%2FNc%2Bfso0H7lW3fgespxDVWVqB75x%2FVaF99nO1s224jbe18rfU4neuC6xviHElKttTV21fNNmzsHCrE%2BfG2aeqGZtbTPP5caVleiZR8vr6uPXrNVmFnH2nouMzrK%2FjaqLceIa5hmW2zq7d%2F3%2FbX2%2FuSv7%2F52s7%2BvaPfmD93ZgxSyfzANW49L16OnwH9szVFBbb9AEB7tv9whVK7dlJcXJxiYmKcq8Pj8XiMkydPGseOHTNKyj4zWqqurs6oqalp2bbeWmVMmTnXmLL8Lecar9KNxuyZc43ZLx8MLPO9ZpH5krdWGVMe32gcCpQwDOMtY5G1jG87znKHXv61MWXmr411peaSg8a65b4ypRuN2c51jzdQV8Os2ypju3%2BB7zW27YR5XEF1NrcVYlm9dXK0g2UbgWXWMvWvD9TVuU3D2L48RJ1CHnNL29PSZyzn0nseLeWavK%2Fwj9u2jaDzGNiO9dxuXz7XVj%2Fv9%2FZtBfXFoGMPbnenQy%2F%2F2t7H62sr8%2FvSjcaioD7orEOI11vrFVTP0PWov97eNrNdCyHazN%2B2Qdd6wPblzjZd1UB7NuH4Hf0m6PhCCnVc9V8b9dcj1Hm3L3Met%2FM4nOvt3zvqaf7cCTrH1jo7rw2zXwS3FQC0VyVlnxk1NTVGXV2dc1XYXDitxZxXm62M3QXem0EdTwwo3FCk8v7Z9hGbzPGa0l8q3tn0ybcZ37SP%2Fv7p1Qpl5Frn9fbQ6Im%2BkagNRdKIHPu6b6ZLu99v%2BrzV%2FoNsU3XCPy7rtB%2Ff%2FkMtq7dOmcrqL5WW%2Bea9lr2jwvJ0ZdiWfaJSpSvLOtjVP9syypmp745IUvmud1QqqXTDmyq2rZeyRmUquXyvCq038oY45oi1p60NpNRRg5ShEhX6mq7Z%2B2rsuJMz9Yh1VDAlW9MtZfwc5zZrYratfpJvxNWyrdRROcpJrlBhUfPnKKdm9lZy%2BVGZY%2ByFO0uU3D%2FdtqykrELJA%2Fp52y4lW9NtfbCPMlShEtvBNNzWoZSUVUjdzgpca5njg0fNG1JWoPW7k5Qzwzpa3EOjbwrRz%2FwOqfSIlJzS3b%2Bk0Sly4R7%2FqKZUPgyOa6PhenivYdvPhaL3VWxes2UFWr87XVOs%2FTJzaIv7Ukaupe0d2zOvBWudU0dN1ZT%2B%2Fm8BAGFwZziXJGVq%2BtyZlpBu3rTl%2FWWbMTD4F2PWwHTpyCeN3JDllKR062fPoUKpn3ff5a%2Fm2Z8k45haEC5rYGj5cTXthtP0FEt4LD2q8v59NH1geiB0Fu1Vef8%2Bto%2FM7fW1KymrkMw3U%2BaX4yN8BW0jsu3ZcBs0f1%2BNHbc%2F1Fo4A7FCbqe70pMtb4gke3iVJPVQajepvOywbWmTpJylVH9wPqTSI0nKGjVUWcnmMu99HlmZliBYVqB7%2Fe1knWZlaqitQ8salank3QXNf%2FJS6VGVJ%2FdWlnO%2FKf2UlewMzybvGzDveW%2FCjZ9ROP7GBPePhuvhbc%2FAG8vCnSVKHjHUe82WHlW5SrTM2tdn2adeNZ3jZ6VDfdcCAKBpXBzOTZmaPjdXOcklWu%2BSJxxk5AaeIhP4qmd%2Bt0t5w6N3tLFwZ4n3TUFmH2WU71Vh2SEV7qoI%2BUahIckjckO0S%2BOPjmzN9mzNfbmHZZS17B0VqreyUnooa0CSd1nR%2Byq2hN7CFfM0df5eZc0w2ydbGc5NNkdKtubMnamluUnKnz%2Bv%2BSG9qTLHa%2BncmXpkRIUvrDYc0qN2%2FE3UaD1S%2BjX8Bis50%2FbEK%2FOr4Xt5AACnWhsI53KMHnr%2FH2r6SuHOEvvIo2Pk0jsq3gjbKKNT%2Fftuufq3HXRckeAfbSxS4W7zk4JMZfWvUEnpYZWU1%2FfpQWi2kfiw1X%2FMkRedfdV33KVFe1We3FXpjuU2Ze%2BosNwRqIIUqXB36E9UmsL89KWwaK%2FkG91Mzeyt5COfqNA24unbn21aV4RljtfSublNn2KR2jX09BVfOzY0qivfFAtvwK3v%2BlbrHH9YwqlH%2FW%2Bw6m2rKAu%2BFryfWAEAwufCcF6kxc6%2FSldWoPWWgGJ%2BPG57VnDRai3bbZkHmtlHGbKOth%2FS%2BueCp1kE884pLs6zjuod0voV3ucXZw1Ml3YX2J8rXVagxREY1Q%2FruCLG94s9r0DFlukr6Sm%2BZY0FSwfvSHyRox1CnEuHZrVnalclq0KlTQwezdpXI1JHDVJGeZEesB5nWYEWv1rhuJfBO6UmsG9ff3RO03Cc%2F8IVBYF5xCGFmBoTSmYfZZQXadmrCrwZSDlLqeVFWvZqhVJTzDcIwdvz1qGJQpyjwhUNj1jbhZjOk5Kt0f0rlD%2Ffuh1fOzrna%2FsFrt2QgurZ%2FONPTUkKHhAIEuK4QgqvHqmjBilj9%2FtavLPE3t98b77zn7Mfe9POQdN47zGx%2Fwwo3ZDfwqk0APDF48Jw7g0o9rnL3o92%2FTePpWRrzoxMyTp%2FOE%2BaYptCkanpueZc03maOitfuim8j6dTR03VIyPk%2B%2BjdO1ezMMU3spg5Xktz01WcZ63fUWVF4qPisI4rclIzeytZ9lFZc1mT546GqvusN5Xe2JuK5rSnP6Q1PkXBpjn7alSmpltvXg7VX32SR2Qr%2FW%2BBPpWvEI%2Fb65%2Bt0WWBNly2u4FHYkqOOdUN%2FTEi79QW2d4M%2BJbZwr%2F3BkvreSwcGN51YxPyHFnnQDsf7xgsMEc98Ed7sibO1JT%2Bwdtp8DF9R4r0gL%2B85VGqClXPFhx%2F5lDlJPvq1sAfIwp1XMHCrUemsvqXqNj%2F6Zeph0bfk6scWY99ntan%2BOakR0OInwGLlcMNoQDQRC58zjkAoL1wPk8dANqzSDzn3J0j5wCAdiAy90wAwBcJ4RwA0HJlBbrXdo%2FJIa1%2FokDFyZn6LtkcAMLGtBYAQAQUabHzmfDJIe6rAIB2LBLTWgjnAAAAQAREIpwzrQUAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA0Aw333yzbr75ZufiFiGcAwAAAE0U6VBuIpwDAAAATWAG8xtuuEHPPvusc3WLEM4BAACAMFmD%2BbBhw5yrWyyq4dwwDOciAAAAoE1qKJhHKvdGLZzHx8XKUxeZSgIAAACnUqhgbr0h1FNnKD6u5dG65VsIISYmRh07xOlEVY1zFQAAANCm1BfMrU5U1ahjhzjFxMTYljdVVMK5JJ2WEKdjldXyeOqcqwAAAIA2oaFgbt4Q6vHU6VhltU5LiLO9tjkiHs5jYmIUExOjDnGx6nRaBx2tOEFABwAAQJtkPo3FOsfcuswwDB2tOKFOp3VQh7hYfxZurhiPx2N4PB5VV1fr00qP0ronOcs0mWEYqqurk8fjUWVVrU5U1apLpwSdnthBcbEtqzAAAABwKhmGIU%2BdoRNVNTpWWa3TE%2BPVKTFecXFxio31BvTmiko4lyOgn6z1qOpknWpq61TLKDoAAADauPi4WHWIj1Vix1h1jI%2BLSDBXNMO5LAG9rq7O%2F39zOQAAANAWmQHcDOOxsbERCeaKdjiXL4ibX%2Bb3AAAAQFtmBnFzjnkkgrlaI5ybCOUAAABobyIVyk2tFs4BAAAANCzij1IEAAAA0DyEcwAAAMAlCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACASxDOAQAAAJdoW%2BH80AuquHKajh9yrgAAAADaviiG88%2B07Zl79b0xz2ibc1VT%2FfcF%2Fe%2BGO3Vs5zHFqLO08yn974ZZqvyvsyAAAADQdkUxnB%2FXR%2F96Tx9VVDtXNN1pAxU%2FeZhi%2Fv5X1Wmnav%2FeUXGTv6u405wFAQAAgLYrxuPxGB6PR9XV1fq00qO07knOMk1X8oK%2B%2F4M87bEtHKYFr96lIarRoVd%2Fq8dWbNSbB2skdVCXvpfo5ltv07iMTrZX2BzfomM%2FmC%2Fj4v6qe6uzOv72Xp3e2VkIAAAAaLuiM3J%2B9qWa%2FtMf6FtnS1Jf5f70Lj3%2B06vUV9JHK2fr2p9t0K64SzR9xl16eOIl6rpvu%2Bbd%2FYDy9jk3FFD1h2flSZuoxPtmqEPaFp38w25nEQAAAKBNi87IuSTpgPImT9fifeaIuaTPN2v2NQu16exr9LuVP9D5cb6i%2F3pGV87aqGMjfqztP73UvhkLz0kprqNUd%2FKk1LFjlN5ZAAAAAKdG6%2BbbnW9qk0c658qRgWAuSZdc7A3v%2Bw6ooQexxHX0%2FhtLMAcAAEA7RMYFAAAAXKJ1w3nfCzRI0kdb%2FqmPPJblxcUqltSlf1%2F1sCwGAAAAvkiiGM67q%2BvZkrRZi%2Be8qFeefFHbzhqlm8ecIe17Qd%2Bf%2FAvl5W%2FWKyt%2Foe%2FN2qBDHTN0x%2FcznBsBAAAAvjCieEOopH0bNPsnv9Wmshp1TLlGT%2Bf9QBmqVPELT2vx8%2F9ScUWNFNdB5%2FQfqVvunarhKc4NAAAAAF8c0Q3nAAAAAMIWxWktAAAAAJqCcA4AAAC4BOEcAAAAcAnCOQAAAOAShHMAAADAJQjnAAAAgEsQzgEAAACXIJwDAAAALtFqf4TIMAznIgAAAKBNi4mJcS5qkaiHc8MwdLLWo8rPa1R9sla1njpnEQAAAKBNiY%2BLVULHeHU6rYM6xsdFLKRHNZwbhqH%2FVVbr%2BImT6tIpQacndlBcbEzEKg8AAAC0NsMw5KkzdKKqRscqq9X59I76UqeEiGTcqM05N4N59clapXTtrC91SlB8XGxEKg0AAACcKjExMYqPi9WXOiUopWtnVZ%2Bs1f8qqyMyjTsq4dwwDFXX1Or4iZPqmnS64uKishsAAADglIqLi1XXpNN1%2FMRJVdfUtjigRyU1G4ahys9r1KVTAsEcAAAA7VpcXKy6dEpQ5ec17gvnhmF4bwKt8ej0xA7O1QAAAEC7c3piB52s8fizcHNFPJybaj11iotlfjkAAADav7jYmIg8lTAq4dx8t8DNnwAAAPgiMHNvS0bNFa1wDgAAAKDpCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcK5U9FqTZ21VOvLnCsirKxA986ap8VFzhWnVuGKeZq6wmWVsior0L1ROD8RO%2B6i1Zo6a7UKncutwjqGQ1r%2FRITqhNYXTj8AACAEV4bz0g1LNXXWvOAvggoAAADaMVeGc0lScqYemTtTS%2F1fuco5UhDZUe1Qo1uZ47V07lSNTrEubKFQ%2B0nJ1py5MzU907oQdkVa7MJPF1pHD42%2BZ6aWTjQ7iHck%2Fd4NhxzlTrWW16t0w1JNfaJApc4VzRDJbUVXy9sNANA%2BuTecB%2FGGlSn9K5T%2FXFv45QsAAAA0TYzH4zE8Ho%2Bqq6v1aaVHad2TnGWaxDAMeTwelR6tbPa2Sjcs1QO7euuRe7KV6lxZVqB75%2B9V1ozA6HbphqV64NUKf5GMXOuI9CGtfyJP%2BeXm90nKmTFVqRvmadlu%2F0skpWvK3PHKKlqtqXny%2Ft83F3mZsvVIypuWffjK%2Bl9bpMWzClTs3Jb5%2BlD7CXEcwdvx1tW%2F3v%2BaQSqZHyiXPCJXc0b18L8qwHvshQOs6737KLW%2BpqxA984%2FqtFzx0thHW8jbW62Ya60LK%2FE%2BymI71za28NxfFZFqzU1r8S2KCN3pqanhtsGjra01CGU8M5ziHo5t%2BvvP31UaNm%2FrX7%2B85gjPWfpm%2F2zHSPlvnOX%2BY7unV8kfxd2bs%2Fk6Lvyn6ck27LCFfO0PsX7eud5DF3Petq6rKD%2BejnbyXZsJue16WhP5zacbW1T%2F7ZKfOd2igq0bHegjvUee8hrM7h9na8PeQ04%2B4%2FMdq2n3UJsN3TbAQDcaP%2FhCqV27aS4uDjFxMQ4V4fH4%2FEYJ0%2BeNI4dO2aUlH1mtFRdXZ1RU1PTom0devnXxpTHNxqHnCsMwzCMt4xFM%2Bcai97yfhdUtnSjMduyfvvyucaU5b5vDMM49PIqY12p75u3VhlTZq4ytvvXBi%2FbvnyuMWXmXGP2ywd9Sw4a6x5vYJvma6x1CrWf0o3G7Jm%2FDrzOV%2B%2FAfszXBY7FLGPb1lurjCnW7TgEtY9vm9Zl1jLhHW%2FDbe7fh%2BU1Rohz0VjdnefaMMJtg%2BDXBZ0Th7CP21Ff7%2BucdXEsc55b%2FzEE1zmwP%2B%2F%2BnfWx9Y8gzuP2HYNtmbXMW8Yi6%2Flwnsew2jpEvZx927kfh6D%2BFG5bhxBqW%2Ba5tfUjZ51sxx7imBzLgvbjbLtQ17xNqH2EOkbfOWyg7wIA3KOk7DOjpqbGqKurc64KWxua1mLqrvRk8%2F9F%2BtOrUs5NltG0lGyN7i8V7yySdEilR6TklO7%2BV6eOGh96pLYhyZma7h%2Bl7KHR30yXdr%2Fvn0Pu3GbWwHSp%2FKjs474NK9xQpPL%2B2fbR0MzxmuI%2FloCMXMtoXOZQ5SRXqLAo9NzV1MzeSrbUpXBniZL7p9uWlZRVKHlAv0AbNni8jbW5KUk5oyyjfWUFWr87XVOsI4CN1L0hDbVB6YY3Vdw%2F2zafP2tUppLL96qwofsVGj3uCmXk2kdTsyZmK0MlKrSdoiTlzLDULyVb00ckqXzXO7bpWPZtZWp6rr1fNV2msvpLpWW%2B9ix7R4Xl6cqwLftEpUpXVqa3%2FHTr%2BUjpp6xkS1mfhto6pNKjKleSUq3H1qSR36a0dZiSM%2FVdWxUaOvYeyhrgOF9l76iwPElZmT2acA00UVmB1u929B310Oibwui7AIB2ow2G88MqMT8PLvtEpapQ%2Fnz7U10C0ya8Aav81bzgGzKbottZ9XyUHmB7woxjOkbjvG8iMgYGB5isgenSkU8soS5J6Y1VxirlLKX6A80hlR5JUtaoocpKNpcVqXC3GTp8GjreRtvcZA1nZmAr0TLbE3gc0xDC1nAblJRVSLsL7E%2F6cUwjCKnR4zZDrZUjEEvBxy4pNSXJ8YYtxDGkdlWyKlTaghCWnmIJlaVHVd6%2Fj6YPTPcvKy3aq%2FL%2BfRxTsho6HyHq2ZjMocpJ9p7rZt3w2KS2DlPIc1v%2FsaeOGqQMSyD2ttsg75uFsK%2BBJio9qvLk3spyDh6k9FNWcoVKuNEGAL4Q2l44D%2FrFna4ptqe6%2BL7MUbHM8Vo6d6YeGVHhC4YtCOkheX%2FBP7Crd%2BDpMrnpzkKnkDfQFO8s8o7%2BqbeyUrwjg8U7i6Si91UcKhA0qJE2r0%2FQE3i8X0FzpyMgeURu0H4i%2FhQeF%2FJ%2BUuINlYU7S7xv%2BDL7%2BILmIRXuqvC%2FCfS%2BoSyQcs32yVWO%2F1OplvA9aWZutlJfzdPU5ob0KGr82DOV1d%2F8hMDebl7NvAYAAGhEGwvnh7T%2BuSJpxFDvyJ9tVLhhqaOmauncFnwsXp%2Bi91WsdE2p90a1cPRQarfQH4kX7iypZ9QvfOboe2HRXsk3fSU1s7eSj3yiQueUlsY0oc1tUru22kfzttHjSKn3uItUuFtKTWn4DUbhzhLJNmIdrLRob%2BiR06bwj7IWqXB3YPpKVv8KlZQeVkm5ucwbOJNH5EbxcZ6Zmj53ph4JMaWnQS1s68aFd%2BxZ5icOvulB%2FgGBeuvXQvVdI74pNU3%2BBAMA0Ca1nXBeVqB7Z%2BUpv5t1XrZvVDjPPhpeumG171noh7R%2BRQOPXYzANILgbRRpsXNaS1CZYFmjMpW8u8A%2Bwli0Wst2O%2BZuN0dmH2WUF2nZqwpMX0k5S6nlRVr2akUTw05jbV4PX2h0PgazcEVDn2R47y9o6jQG7%2BhxkRbbRmuLtLhFf8QqU98dkaTiPPtz9gtXFKg4aD5ziZZZn7VdtFrLdjunLVUof77l2MsKtPjVht4oed%2FAlZcddq5w8H0qklegYsubgfQU37LkrvJ%2BrhO8vdIN%2BSGmtTQmeDsqWt2kZ9MHT%2FlpSlvbBW8rlOA6hzz2zKHK0V79acPewICAd0XzrgGb4Dp45607%2BoVvQMI%2FpQYA0O65N5yXF%2BkB25zhvcqaEfyxcdbEmZrS3z6X%2BYGyPoFfZEes2%2FF%2BjO0fLfP%2FMmzBdJeUbE0fIcv80%2FeV5ZzWEs5%2BUrI1Z0am5JsGMHXWPN%2Bj2CIxFcMbJmQblfUtCzm3t2GNtnlIPTT6nlzlyH5e16dYQ4%2BT9Z6BJvwxolBtOetNpbfwTU7qqKl6xHauvY%2FoWxr0qUm6pnzzaOA480ocj%2FeU96bR3K5ab5aZXySFejyihfkGbmoj00RSM3srWfY3A%2BYya%2FjPmpitDMvc%2FMUa1KxpLaHqVZxn6Rv1PRbVZJmjbv4BofDb2iHEtkIJ79h7KGuAVLzb8qbWp3nXgF2odgvervdxms6fewCA9suVzzkHAAAA2ppIPOfcvSPnAAAAwBcM4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAABAM9x88826%2BeabnYtbhHAOAAAANFGkQ7mJcA4AAAA0gRnMb7jhBj377LPO1S1COAcAAADCZA3mw4YNc65usaiGc8MwnIsAAACANqmhYB6p3Bu1cB4fFytPXWQqCQAAAJxKoYK59YZQT52h%2BLiWR%2BuWbyGEmJgYdewQpxNVNc5VAAAAQJtSXzC3OlFVo44d4hQTE2Nb3lRRCeeSdFpCnI5VVsvjqXOuAgAAANqEhoK5eUOox1OnY5XVOi0hzvba5oh4OI%2BJiVFMTIw6xMWq02kddLTiBAEdAAAAbZL5NBbrHHPrMsMwdLTihDqd1kEd4mL9Wbi5Yjwej%2BHxeFRdXa1PKz1K657kLNNkhmGorq5OHo9HlVW1OlFVqy6dEnR6YgfFxbaswgAAAMCpZBiGPHWGTlTV6FhltU5PjFenxHjFxcUpNtYb0JsrKuFcjoB%2BstajqpN1qqmtUy2j6AAAAGjj4uNi1SE%2BVokdY9UxPi4iwVzRDOeyBPS6ujr%2F%2F83lAAAAQFtkBnAzjMfGxkYkmCva4Vy%2BIG5%2Bmd8DAAAAbZkZxM055pEI5mqNcG4ilAMAAKC9iVQoN7VaOAcAAADQsIg%2FShEAAABA8xDOAQAAAJcgnAMAAAAuQTgHAAAAXIJwDgAAALgE4RwAAABwCcI5AAAA4BKEcwAAAMAlCOcAAACASxDOAQAAAJcgnAMAAAAuQTgHAAAAXCLG4%2FEYHo9H1dXV%2BrTSo7TuSc4yLWYYRsj%2Fo22KiYkJ%2Bf%2Bmol%2FAKVJ9CwCAtiqq4dwMXIZh%2BL%2Bsy9H2mIEpJibG%2F2VdHg76BUKJRN8CAKCti1o4twavfxUV67nfv6B%2FbinUgYOlhLA2LCYmRr16puqKoVm66YZxuiQzIyhMNYR%2Bgfq0tG8BANAeRCWcm%2BGrrq5OT8xforkLf%2BUsgnZi1l236J4Z0xQbG9toiKJfoCma0rcAAGgv4h588MGHDMOQx%2BNRVY2hpM6JzjJNYg1gj897RvOefNZZBO3Itu1vqq7O0OWXDWpwGgL9Ak0Vbt8CAKA9ifjIuRnA3nxrl771fzc4V6OdeuUvv9egiwf4Rzmd6Bdorsb6FgAA7UlEH6Vojo56PB79duWfnKvRjv125Z%2Fk8Xj8fcCKfoGWaKhvAQDQ3kQ0nMsyQrp56w7nKrRjm7fuUF1dXb3hiX6B5mqsbwEA0J5ELZwfPFTmXIV27OChsgYDFP0CzdVY3wIAoD2JaDg3f3ny8fMXj%2FWcO889%2FQIt0VDfAgCgvYloOBcB7AutoXPf0DqgMfQfAMAXRcTDOQAAAIDmIZwDAAAALhHR55zX1dXJ3Fav87Kcq1vdeb3PVbduydq2%2FQ3nKkTBgQ8KlZCQoLi4OMXGBt73RbNfpKR0V%2B9z05yL%2FaqqqrWreLdqaz3OVWhD6utbAAC0N%2B0unPdITdHYMVfp2tE56t%2BvjyTpm1d9T%2F8u3u0sigirL0BFq18se3a%2B%2Fu%2BqK52Lgxw7dly5N92qHW%2FsdK5CG1Ff3wIAoL1pF%2BH8zDOSNPqaURrznW8ra%2FDFkqTjxyvVuXMnSVLGJSN05Ei541WItPoCVDT6RbduySr%2B16v6fd4arVmf71zt16VzZy2a%2F4jW%2F%2BWvmv2Tx5yr0UbU17cAAGhv2uxvudNPP03jxuTo%2Beee1n%2BKNunxn9%2BnM85M0ryFv9LfCl5T586ddPx4pbYX%2FotgHuQmrfnPLh3ev14LnavaiPO%2Bco4kac36fG17%2Fc16v175%2Byb9%2FInFenv3HucmAAAAXKdNhfMOHeL1zZFf16%2BefkK7d76mpxfPUVpaDy1c%2FGtdMWKMho8cq3POSdM3s7%2BuV%2F72D3Xu3EnrX3zFuZn6TV2mPft36bD1a98b2rNpoe4a4CwceQs3Ofbt%2BNqz6ibnSxCGlc%2B%2FoJXPv%2BBc3Ay9NHbGQm18Y6s%2B3hc4Lx%2F%2FZ72eGess2%2Fq8%2FWer1kx1rgEAAG1FmwjnX83or4VzH9LbRa9p5YqndMH55%2BmXS1Zo6PDv6IoRYzRv4RLt%2BWCvnnry5xo3Jke%2Fz1uj%2F%2BzeI4%2FHo7%2B8%2FDfn5hpXWa497%2B3Vnvf2qqQyQUlfydbslcs0zVkuwkre9%2B5zz3t7VfKJd1lVWWDZ%2Bx%2F91%2FkSONwz83atW728wa%2Fnlj2pIZcOcr60EcM056%2Br9MyPspWR0kX63wHvefmwXNWJX1L3s5zlv4iu0sI%2Fv6o9H7TdT2QAADjVXB%2FO09N66eUXn1fmwAz9%2BjcrNXT4dzT8yrGat3CJ3v9wnyQpJiZGC%2Bc%2BpHFjcvSb3%2F5BM%2B55WNeOHqUtW3eovNyXcpui7J8aNnK0ho0cra9d%2FZyKKyWd1U8jozwiuXCqd5%2FDRo7W8nePSZJK%2FhlYlnPPy86XwOKembfr7jt%2F6FwcpF%2B%2Fvlq54il16dLZuapeuSse1qQLu0if%2FFtLbr9KX%2F7qVd7zMnyEzj9vhMYudb7ii%2BhspX8lWUkJzuUAACBcrg%2Fnx44d01tFxep3QR9NmZirG3LHqu%2F5X%2FGvN4P5dRPG6Jlf%2FVb33T9HGRddoHPPSdf6vzRhSkt9PipXRa19UcjpA%2FPX26ee%2BL%2BfoYdWveyfBvHx609rmne6dLNkTHxcG9%2FYGpju8sFWbf7dDI20lEn%2Fzgw9v8ky9WLfVhXnP65JLdhvW3Dp4Iu17fU3NWb8pAa%2FfjTjfnXu3EkZF17g3EQ9ZmjS8GSp9oDWzLhRD%2F35gLOAxQWa9ORqFf%2FHMu3l3%2Bv1%2FE%2BG%2BUtMW%2BU9f5ufvEpz8gPn8uPXl%2BmhkZL0Q%2BW%2Fu0uH97%2Bs5VdYNn3F43pj%2Fy4d%2FtfTyrUsrt9D2rx%2Flw7%2FZ5ke%2BskyvfGur07vvqznb%2BnlKxO4%2F%2BCZ79ynjf82%2B8wbemNVoF%2F56zzfsnlzGtimh3z%2Fn6GhSZLUW7n7vdtkBB0AgKZxfTj%2F9LMK%2Fd%2B131f2t7%2Brv218TRN%2F8D39s2Cd%2Fr5hlSbd9D0tXvCorpswRvOffFYP%2F3yBJGn0Nd9WTU2t8jf83bm5phs5UOlJklShw%2B85VzYu6ZLvaWL6URW8skMlFVJir2GaPb%2Fx0d1Q0m9ZpjWPXKWMZGnPtgKtyd%2BhPVVddP43btIzq25SuiSNfEjPz79JI7%2FSUf%2FbvVlr1mxW8Scd1W3AVXrwtw%2FZQjzCdEs%2FpcdLeq9At250rrTqpWmrfqM5Yy9QN%2B3VlvyXlb9tr6q%2F1Fsjb3lca%2FyB2Cv92z%2FR2C%2B9o%2Fw1m1V8pFqJvQZr2hNPK1e%2F1sa3qyX1UkbuYH%2F5oeMHKF1SyevPKc%2B2pUZ0%2Bqom3thDRzYVaMtHx6ROvTTyR3N0l61QT%2BX8PEdJ7xZozT%2Fe1RFPgtKH3KSFK661larXe96%2BtqdSksr15pqXtWbNRvEXBgAAaBrXh3PTf95%2BT9Pvvl8ZF39DD%2F1svrqedYbm%2FOw%2BjR93jZ6Y97R%2BMf9pf9lrR1%2Blf7y2TRUV3qkhTZZyhTZvXK%2FNG9er%2BFfZSle19qyeo1v%2F6SwYhv9u0eTLbtSkW6boa4t2qEJS4jlfVdPvHxys2dcPVpKq9eYvJ2jYhLt06y1TNOzqP6q4VkoaMkZ3nSPdNS1H5ydIJfl3KyPnNt36o9s08pI52nhESvzKlZoW5ak57VKfZCVJqqho5Kk%2FV9yuSUO6SJX%2F1sKrR2vsLbM1acJojVz5rqQuGvq9Kd43UD6JH%2BVr5LApmmQ5R%2BrWTzljpYWrduiIpPSvXqehkqTBmnRJL6n2XW2ct8OylTDE%2F1cFt1%2BlnFvu0thhv9aWCkmdemqQrRMm6P21E%2FS1CXfp1u%2BPV8Z9m3VEUrcB2eH11X8%2Bp3t%2FtENHaiXpf9rzo9m69Ue%2FbNqbCAAA0HbCuami4piWPPucLrn023p0ziJJ0n%2FLj%2FrXX3LxAPVITdGf%2F%2FJXy6uaqFOyzu%2FbW%2Bf37a1uceXa%2BPMxGjZjs7NUWCpKdso%2F2Lr0gA5LUkKCutlKheMqZZwjqeLfemm%2BZVrFR4%2Bp%2BGN55%2Fte%2BT0NPS9B0gG98bi1vmu15YNjkrqoW7gzOVzu8xOfS5I6dzrduSryKk5KkhISuzjX2OVcoHRJFf%2FeqMc%2FCiwueWC39khSci%2FlWIrvefsxlfi%2FM89RstIHS1r9nDZ%2FJKlXX026QtIV1ymjl6T3dmqJZdthqTikN%2Fyd8DmVlEtSghJtN7HuVfEDln61eof2VEjq1tP35gAAALSGNhfOTYZh6JfP%2FEZvFRVr8g%2Bu8y8f45vS8te%2F%2FcNWvkk%2BXKvuaVdp7JM7VBGfrJEzf6mFzAdxlV3%2FeVeffPKpnnryMd14%2FTjn6sjadFAlkhIvvEIPRXHefvekLpKq9b8jkrRDj%2F%2FjXf%2FUlqG5fZWuar35V2ugj6ZkJXWSVHnM%2B4YSAAC0ijYbzk0r89ao3wV99NWM%2FoqJidHoa0bp7wWv6fjxSmfRJjqgLfOn6NbVe1WV0Fu58wOPUtxz2DsKnX5JYD7wtF5n%2B%2F8fHTtUckRSUj%2BNtM5dPmeGMlIk1R7Unr%2F%2FUcWlktRLX%2FtR4AZEaZi%2B1ruLpHKVFFoWt2Eej0eTbp6h%2FJcjcF9BY%2F45X%2FlvV0sJF2jiyoWaVN8z73cc1BFJSRcOs930m%2F6T%2Ft7pLAf2yvq3TNPPuz0wzeWc2%2FW1cyTpv%2FrYN1G75IFCFddK6Rf%2BUHd9rZd0ZIeefzLw%2BsjqqfNnBPpV%2BoyB6hMv6b8HtUVSfmmFd%2Fl5t%2FvLDL3AO90HAABETpsP5%2Btf3KATJz7X9dddq8suvURnn91V6%2F%2FcgiktDhtnPKa171VLZw3WXb6bLvPfOyhJSh%2F5uDb%2B7nE9n%2F%2BqZg9pZMpDi72se%2F%2F8rqrURUPvWaXNqxbqmV8t0%2BaXblJGJ%2BnIxj%2Fq3o%2Bkh5YX6EitlD52gYrzn9YzTz6tjf9aoJwUqWpXvu5d7dxu2%2FX69jd1948fjtAfGGrIAT10yy%2B15RMp8ZxszcnfpT1veO9J2Pz6Vn38waveJ%2FesmaM1u6qlpMF66KX1WvOrx7V81XptnHKBEmvLlb%2FcPuqdePFNys9%2F2ncef6hBnaSqt17W4%2F57G%2BYr%2F61q6ZzBGtpNOvJ2QRTncCdo0LTfaePvfHW%2B%2FatKVLXeXP9LbZFUsm2fjkhKvPg6vbFqoZavelnLr%2B3t2MY78t7m0Vs5G5%2FW8vxlPK0FAIAmavPh%2FMSJz%2FWnNX%2FRd8f%2Bn3LHj1ZVVZVe2fias1gL7NBdj%2BRrT7WUNOSHWnhLL5U88JSWbDugqrhkZXzjKg09a69W%2FHWv84URV%2FLIeE3%2B1Wbt%2BV9HnT8kW2NzBut8lat4zWPKmbrWW2j1Xcp58GUVl51UtwHDNHbsMGUkndSefzynyTnzW2lKRDv00XMa%2B53ZWvKPvaqolpJSvPcknJ%2FSUdWfHlTxe%2FKG%2BJy7vWUSe2tozlXKGdJbKn9Xax78viY53hjt%2Besfteeswd7z2KlaJdue0913%2FtJ2jswbQ6UD2rzMd46jYq%2FyV%2BxV0mBvnZOqD2jL0gc1zby%2FYfUcLVyzVxW1XZQ%2BJFs5F5zUxjzvDc4BO%2FTQc5tVUikl9R2mnK8kONYDAIDGxHg8HsPj8ai6ulqfVnqU1r35H1TX1dXJ3Fav87Kcq6NmwEX99PcNqyRJa%2F%2B8QdNuv8dZBK3gwAeFSkhIUFxcnGJjA%2B%2F7WqtfPLfsSfXr11c%2FmnG%2Fc5XNwK9epAd%2Fere%2BedV1%2Bnfx287VUTdt1VY9NKSL9qweoGEznGsdxj%2Bt4vnD1O3tP%2Bpr347GfPObtOY%2FMzQ0aa%2Fy0kY7Hq%2FoHvX1LQAA2pt28Vtu13%2FeUeGOtyRJv8%2BL9hQHuNWzy36vrmedoXV%2FWt7g14M%2FvVurX3jxlATzppo2dqC6qVrF234XhWAOAADcpl2MnEtSQseO6tEjRfs%2BIsKcKvWNbrZmv%2BjSpXOjf%2FmzsvLzUxrMwxk5f2jpSmX06KlBA5KV%2BNHLun7Y7MAjOSOKkXMAANyk3fyWqz55kmAOHTt2XNu2v9ng16kM5uFK6vNVDR2QLB3YrIdujFYwBwAAbtNuRs5x6tU3ukm%2FQEvV17cAAGhv%2BC0HAAAAuAThHAAAAHAJwjkAAADgElEL5zExMc5FaMfCPd%2FhlgNM9BkAwBdJxMN5TEyMYmJi1CO1u3MV2rEeqd395z4U%2BgWaq7G%2BBQBAexLRcG7%2B8oyJidHllw1yrkY7dvllg2zn34p%2BgZZoqG8BANDeRDScy%2FfLMzY2Vtd%2Fb7RzFdqx6783WrGxsfWGJ%2FoFmquxvgUAQHsStXB%2B8cCLdMe0HzhXox26Y9oPdPHAixoMUPQLNEc4fQsAgPYk7sEHH3zIMAx5PB5V1RhK6pzoLBM250fPWV8bKI%2FHox1v7nSURHtxx7QfaOaPfqiOHTsqPj4%2BZIiiX6A5wulbAAC0NxH9C6GSZBiGDMNQXV2dampqdPLkSb351i7lrfqzXi98S6VlR2QYhvNlaCNiYmKUmtJNl2VdrNwJ39GgiweoY8eO6tChgz88hQpQ9As0prl9CwCA9iTi4VyOIFZbW6uamhrV1taqtrZWdXV1zuJoY2JjYxUfH6%2F4%2BHh16NDBNqrZUHiiX6Axze1bAAC0F1EJ57IEMXPKTF1dnerq6vzL0DaZISk2NlaxsbGKi4vzLwsnPNEvUJ%2BW9i0AANqDqIVz%2BYKY%2Ba81fBHC2i4zJDlDU1PCE%2F0CoUSibwEA0NZFNZybrKGLANb2WcNSS4IT%2FQJOkepbAAC0Va0SzgEAAAA0LuLPOQcAAADQPIRzAAAAwCUI5wAAAIBLEM4BAAAAlyCcAwAAAC5BOAcAAABc4v8B9v3gl1vT5K4AAAAASUVORK5CYII%3D%3B%22%20value%3D%22%22%20vertex%3D%221%22%3E%3CmxGeometry%20height%3D%22370%22%20width%3D%22685.56%22%20x%3D%22-830%22%20y%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
When this is supplied, the MCP Server then requests additional information from end user. This is a really powerful feature from an end user experience, as it also involves them into the lifecycle to obtain the end result. The below can be seen in the elicitation section of the MCP Inspector.
Once the user has selected the choice presented by the MCP Server, the dummy tool provides dummy route directions for playground. Please do not take the directions provided to heart should you wish to travel Middle Earth 😂.
Code Walkthrough
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | @McpTool( name = "hobbitTravelPlanner", description = "Provides direction to hobbits for travelling from one location to another" ) public TravelResponse hobbitTravelPlannerElicitation( final McpSyncRequestContext context, @McpToolParam(description = "Source from where the hobbit wants to start travelling") String from, @McpToolParam(description = "Destination where the hobbit wants to travel to") String to ) { if (context.elicitEnabled()) { StructuredElicitResult<UserTravelChoice> elicit = context.elicit(spec -> spec.message("please select hobbit options"), UserTravelChoice.class); if (elicit.action() == McpSchema.ElicitResult.Action.ACCEPT) { return switch (elicit.structuredContent().travelRoute()) { case VIA_ISENGUARD -> new TravelResponse(""" 1. Start from %s, 2. Take left to Isenguard. 3. March towards Gondor. 4. You will then arrive at your destination: %s """.formatted(from, to)); case VIA_MARSHLANDS -> new TravelResponse(""" 1. Start from %s, 2. You will meet Gollum 2. Follow him in marshlands, DO NOT look in water 3. Go up the stairs with Cirith ungol 4. You will then arrive at your destination: %s """.formatted(from, to)); }; } } return new TravelResponse("Sorry, we failed to recognize your selected route. " + "Please choose the route and accept"); } |
From the code above:
- Line 1 - 3: Annotation used to declare the business function as a MCP Tool. The metadata listed inside the annotation is of great importance as when a user in real world prompts the LLM, it will based on the description of the tool determine whether to invoke the tool or not
- Line 5: McpSyncRequestContext is a class provided by SpringAI that will help us gain metadata information as well as certain utility methods that we can use to invoke some of the capability of the tool. For this playground, we use Elicitation capability on this object.
- Line 6 -7: We expose certain parameters that we require input from the user before our tool can process the request. As mentioned the description mentioned here is of importance as LLM in real world will use to bind user input to these parameters.
- Line 10: Before we can elicit, we need to check if that capability is enabled in the tool or not. This is a good design practice and not assume.
- Line 12 - 15: Here we create an elicitation citing the message we would like to show the user, along with options. In this particular playground we use Enums to present two route options for user to choose. This is a blocking request at this stage and further execution pauses till user choses an option to proceed. There is a default timeout to the request by default from Spring AI to ensure request is processed in time.
- Line 17 - 31: We verify here if the user has selection an option or not and the rest of the logic is just presenting a dummy response for one of the two selected route options for a hobbit to find their route across Middle Earth.
- Line 36: This is an alternate response that we return if elicitation is not enabled in the tool capability.


.jpg)
.jpg)
Comments
Post a Comment