[{"data":1,"prerenderedAt":1788},["ShallowReactive",2],{"navigation":3,"/mcp/custom-client":166,"/mcp/custom-client-surround":1785},[4,23,44,89,111,136],{"title":5,"path":6,"stem":7,"children":8,"icon":22},"Getting Started","/getting-started","1.getting-started/1.index",[9,12,17],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Usage","/getting-started/usage","1.getting-started/3.usage","i-lucide-sliders",false,{"title":24,"icon":22,"path":25,"stem":26,"children":27,"page":22},"Time tracking & monitoring","/time-tracking","2.Time Tracking",[28,32,36,40],{"title":29,"path":30,"stem":31},"Time & Projects","/time-tracking/timeandprojects","2.Time Tracking/Time&Projects",{"title":33,"path":34,"stem":35},"Time Tracking","/time-tracking/time-tracking","2.Time Tracking/Time-tracking",{"title":37,"path":38,"stem":39},"Timeboard","/time-tracking/timeboard","2.Time Tracking/TimeBoard",{"title":41,"path":42,"stem":43},"Timesheets","/time-tracking/timesheets","2.Time Tracking/Timesheets",{"title":45,"icon":22,"path":46,"stem":47,"children":48,"page":22},"Features","/features","3.features",[49,53,57,61,65,69,73,77,81,85],{"title":50,"path":51,"stem":52},"Dashboard","/features/dashboard","3.features/1.dashboard",{"title":54,"path":55,"stem":56},"SMTP troubleshoot","/features/smtp-troubleshoot","3.features/10.smtp-troubleshoot",{"title":58,"path":59,"stem":60},"Calendar & Leave Overview","/features/calendar","3.features/2.calendar",{"title":62,"path":63,"stem":64},"Calendar Integration","/features/calendar-integration","3.features/3.calendar-integration",{"title":66,"path":67,"stem":68},"Shift Scheduling","/features/schedules","3.features/4.schedules",{"title":70,"path":71,"stem":72},"Project Management","/features/projects","3.features/5.projects",{"title":74,"path":75,"stem":76},"Expense Settings","/features/expense-settings","3.features/6.expense-settings",{"title":78,"path":79,"stem":80},"Auth0 SSO Integration","/features/auth0-integration","3.features/7.auth0-integration",{"title":82,"path":83,"stem":84},"Password & Authentication Policy","/features/policies","3.features/8.policies",{"title":86,"path":87,"stem":88},"Email Configuration (SMTP)","/features/email-configuration","3.features/9.email-configuration",{"title":90,"icon":22,"path":91,"stem":92,"children":93,"page":22},"Expenses","/expenses","4.expenses",[94,98,102,106],{"title":95,"path":96,"stem":97},"Expense Claims","/expenses/overview","4.expenses/1.overview",{"title":99,"path":100,"stem":101},"Add & Manage Purchases","/expenses/purchases","4.expenses/2.purchases",{"title":103,"path":104,"stem":105},"Travel & Mileage Entry","/expenses/travelentries","4.expenses/3.travelentries",{"title":107,"path":108,"stem":109,"icon":110},"Company Card Expenses","/expenses/company-cards","4.expenses/4.company-cards","i-lucide-credit-card",{"title":112,"icon":22,"path":113,"stem":114,"children":115,"page":22},"Settings","/settings","5.settings",[116,120,124,128,132],{"title":117,"path":118,"stem":119},"General","/settings/general","5.settings/1.general",{"title":121,"path":122,"stem":123},"Leave Types","/settings/leavetype","5.settings/2.leaveType",{"title":125,"path":126,"stem":127},"Carry Forward","/settings/carryforward","5.settings/3.carryForward",{"title":129,"path":130,"stem":131},"Department Management","/settings/departments","5.settings/4.departments",{"title":133,"path":134,"stem":135},"Public Holidays","/settings/publicholiday","5.settings/5.publicholiday",{"title":137,"path":138,"stem":139,"children":140,"page":22},"Mcp","/mcp","6.mcp",[141,146,151,156,161],{"title":142,"path":143,"stem":144,"icon":145},"Overview","/mcp/overview","6.mcp/1.overview","i-lucide-bot",{"title":147,"path":148,"stem":149,"icon":150},"Connecting","/mcp/connecting","6.mcp/2.connecting","i-lucide-plug",{"title":152,"path":153,"stem":154,"icon":155},"Tools Reference","/mcp/tools","6.mcp/3.tools","i-lucide-wrench",{"title":157,"path":158,"stem":159,"icon":160},"Security","/mcp/security","6.mcp/4.security","i-lucide-shield",{"title":162,"path":163,"stem":164,"icon":165},"Integrating Your Own MCP Client","/mcp/custom-client","6.mcp/5.custom-client","i-lucide-code",{"id":167,"title":162,"body":168,"description":1778,"extension":1779,"links":1780,"meta":1781,"navigation":1782,"path":163,"seo":1783,"stem":164,"__hash__":1784},"docs/6.mcp/5.custom-client.md",{"type":169,"value":170,"toc":1753},"minimark",[171,184,188,191,231,238,242,255,260,344,348,351,376,380,639,642,687,691,694,697,805,808,832,838,842,845,848,953,956,994,998,1138,1142,1145,1254,1257,1300,1304,1308,1311,1687,1691,1716,1720,1749],[172,173,174,175,183],"p",{},"This guide walks you through building a custom ",[176,177,182],"a",{"href":178,"rel":179,"target":181},"https://modelcontextprotocol.io/docs/develop/build-client",[180],"nofollow","_blank","MCP client"," that connects to the BookYourPTO MCP server. Use this if you're building your own AI tool, automation, or integration.",[185,186,142],"h2",{"id":187},"overview",[172,189,190],{},"The BookYourPTO MCP server supports two transport modes:",[192,193,194,210],"table",{},[195,196,197],"thead",{},[198,199,200,204,207],"tr",{},[201,202,203],"th",{},"Transport",[201,205,206],{},"Endpoint",[201,208,209],{},"Use case",[211,212,213],"tbody",{},[198,214,215,222,228],{},[216,217,218],"td",{},[219,220,221],"strong",{},"SSE (Server-Sent Events)",[216,223,224],{},[225,226,227],"code",{},"/sse",[216,229,230],{},"Remote connections over HTTP",[172,232,233,234,237],{},"BookYourPTO MCP uses ",[219,235,236],{},"OAuth 2.0 with PKCE"," for authentication. Your client must implement the standard MCP OAuth flow: discover server metadata, register dynamically, open a browser for user login, and exchange the authorization code for an access token. The MCP SDK handles most of this automatically.",[185,239,241],{"id":240},"prerequisites","Prerequisites",[243,244,245,252],"ul",{},[246,247,248,249],"li",{},"The hosted BookYourPTO MCP server at ",[225,250,251],{},"mcp.bookyourpto.com",[246,253,254],{},"An MCP client library for your language",[256,257,259],"h3",{"id":258},"mcp-sdks-by-language","MCP SDKs by language",[192,261,262,272],{},[195,263,264],{},[198,265,266,269],{},[201,267,268],{},"Language",[201,270,271],{},"SDK",[211,273,274,288,302,316,330],{},[198,275,276,279],{},[216,277,278],{},"TypeScript/JavaScript",[216,280,281],{},[176,282,285],{"href":283,"rel":284,"target":181},"https://github.com/modelcontextprotocol/typescript-sdk",[180],[225,286,287],{},"@modelcontextprotocol/sdk",[198,289,290,293],{},[216,291,292],{},"Python",[216,294,295],{},[176,296,299],{"href":297,"rel":298,"target":181},"https://github.com/modelcontextprotocol/python-sdk",[180],[225,300,301],{},"mcp",[198,303,304,307],{},[216,305,306],{},"Go",[216,308,309],{},[176,310,313],{"href":311,"rel":312,"target":181},"https://github.com/modelcontextprotocol/go-sdk",[180],[225,314,315],{},"go-sdk",[198,317,318,321],{},[216,319,320],{},"Rust",[216,322,323],{},[176,324,327],{"href":325,"rel":326,"target":181},"https://github.com/modelcontextprotocol/rust-sdk",[180],[225,328,329],{},"rust-sdk",[198,331,332,335],{},[216,333,334],{},"Java/Kotlin",[216,336,337],{},[176,338,341],{"href":339,"rel":340,"target":181},"https://github.com/modelcontextprotocol/java-sdk",[180],[225,342,343],{},"java-sdk",[185,345,347],{"id":346},"step-1-connect-via-sse-with-oauth","Step 1: Connect via SSE with OAuth",[172,349,350],{},"The MCP SDK handles the OAuth flow automatically. When connecting, the SDK will:",[352,353,354,360,367,370,373],"ol",{},[246,355,356,357],{},"Discover the server's OAuth metadata at ",[225,358,359],{},"/.well-known/oauth-authorization-server",[246,361,362,363,366],{},"Register your client dynamically via the ",[225,364,365],{},"/register"," endpoint",[246,368,369],{},"Open a browser for the user to sign in on BookYourPTO's domain",[246,371,372],{},"Exchange the authorization code for an access token (with PKCE)",[246,374,375],{},"Connect to the SSE endpoint with the Bearer token",[256,377,379],{"id":378},"typescript","TypeScript",[381,382,386],"pre",{"className":383,"code":384,"language":378,"meta":385,"style":385},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\n\nconst transport = new SSEClientTransport(\n  new URL(\"https://mcp.bookyourpto.com/sse\")\n);\n\nconst client = new Client({\n  name: \"my-custom-client\",\n  version: \"1.0.0\",\n});\n\n// The SDK handles OAuth automatically — a browser window will open\n// for the user to sign in on BookYourPTO's domain\nawait client.connect(transport);\nconsole.log(\"Connected to BookYourPTO MCP\");\n","",[225,387,388,424,447,454,476,498,506,511,530,550,567,577,582,589,595,615],{"__ignoreMap":385},[389,390,393,397,401,405,408,411,414,418,421],"span",{"class":391,"line":392},"line",1,[389,394,396],{"class":395},"s7zQu","import",[389,398,400],{"class":399},"sMK4o"," {",[389,402,404],{"class":403},"sTEyZ"," Client",[389,406,407],{"class":399}," }",[389,409,410],{"class":395}," from",[389,412,413],{"class":399}," \"",[389,415,417],{"class":416},"sfazB","@modelcontextprotocol/sdk/client/index.js",[389,419,420],{"class":399},"\"",[389,422,423],{"class":399},";\n",[389,425,427,429,431,434,436,438,440,443,445],{"class":391,"line":426},2,[389,428,396],{"class":395},[389,430,400],{"class":399},[389,432,433],{"class":403}," SSEClientTransport",[389,435,407],{"class":399},[389,437,410],{"class":395},[389,439,413],{"class":399},[389,441,442],{"class":416},"@modelcontextprotocol/sdk/client/sse.js",[389,444,420],{"class":399},[389,446,423],{"class":399},[389,448,450],{"class":391,"line":449},3,[389,451,453],{"emptyLinePlaceholder":452},true,"\n",[389,455,457,461,464,467,470,473],{"class":391,"line":456},4,[389,458,460],{"class":459},"spNyl","const",[389,462,463],{"class":403}," transport ",[389,465,466],{"class":399},"=",[389,468,469],{"class":399}," new",[389,471,433],{"class":472},"s2Zo4",[389,474,475],{"class":403},"(\n",[389,477,479,482,485,488,490,493,495],{"class":391,"line":478},5,[389,480,481],{"class":399},"  new",[389,483,484],{"class":472}," URL",[389,486,487],{"class":403},"(",[389,489,420],{"class":399},[389,491,492],{"class":416},"https://mcp.bookyourpto.com/sse",[389,494,420],{"class":399},[389,496,497],{"class":403},")\n",[389,499,501,504],{"class":391,"line":500},6,[389,502,503],{"class":403},")",[389,505,423],{"class":399},[389,507,509],{"class":391,"line":508},7,[389,510,453],{"emptyLinePlaceholder":452},[389,512,514,516,519,521,523,525,527],{"class":391,"line":513},8,[389,515,460],{"class":459},[389,517,518],{"class":403}," client ",[389,520,466],{"class":399},[389,522,469],{"class":399},[389,524,404],{"class":472},[389,526,487],{"class":403},[389,528,529],{"class":399},"{\n",[389,531,533,537,540,542,545,547],{"class":391,"line":532},9,[389,534,536],{"class":535},"swJcz","  name",[389,538,539],{"class":399},":",[389,541,413],{"class":399},[389,543,544],{"class":416},"my-custom-client",[389,546,420],{"class":399},[389,548,549],{"class":399},",\n",[389,551,553,556,558,560,563,565],{"class":391,"line":552},10,[389,554,555],{"class":535},"  version",[389,557,539],{"class":399},[389,559,413],{"class":399},[389,561,562],{"class":416},"1.0.0",[389,564,420],{"class":399},[389,566,549],{"class":399},[389,568,570,573,575],{"class":391,"line":569},11,[389,571,572],{"class":399},"}",[389,574,503],{"class":403},[389,576,423],{"class":399},[389,578,580],{"class":391,"line":579},12,[389,581,453],{"emptyLinePlaceholder":452},[389,583,585],{"class":391,"line":584},13,[389,586,588],{"class":587},"sHwdD","// The SDK handles OAuth automatically — a browser window will open\n",[389,590,592],{"class":391,"line":591},14,[389,593,594],{"class":587},"// for the user to sign in on BookYourPTO's domain\n",[389,596,598,601,604,607,610,613],{"class":391,"line":597},15,[389,599,600],{"class":395},"await",[389,602,603],{"class":403}," client",[389,605,606],{"class":399},".",[389,608,609],{"class":472},"connect",[389,611,612],{"class":403},"(transport)",[389,614,423],{"class":399},[389,616,618,621,623,626,628,630,633,635,637],{"class":391,"line":617},16,[389,619,620],{"class":403},"console",[389,622,606],{"class":399},[389,624,625],{"class":472},"log",[389,627,487],{"class":403},[389,629,420],{"class":399},[389,631,632],{"class":416},"Connected to BookYourPTO MCP",[389,634,420],{"class":399},[389,636,503],{"class":403},[389,638,423],{"class":399},[256,640,292],{"id":641},"python",[381,643,646],{"className":644,"code":645,"language":641,"meta":385,"style":385},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from mcp import ClientSession\nfrom mcp.client.sse import sse_client\n\n# The SDK handles OAuth automatically\nasync with sse_client(\"https://mcp.bookyourpto.com/sse\") as (read, write):\n    async with ClientSession(read, write) as session:\n        await session.initialize()\n        print(\"Connected to BookYourPTO MCP\")\n",[225,647,648,653,658,662,667,672,677,682],{"__ignoreMap":385},[389,649,650],{"class":391,"line":392},[389,651,652],{},"from mcp import ClientSession\n",[389,654,655],{"class":391,"line":426},[389,656,657],{},"from mcp.client.sse import sse_client\n",[389,659,660],{"class":391,"line":449},[389,661,453],{"emptyLinePlaceholder":452},[389,663,664],{"class":391,"line":456},[389,665,666],{},"# The SDK handles OAuth automatically\n",[389,668,669],{"class":391,"line":478},[389,670,671],{},"async with sse_client(\"https://mcp.bookyourpto.com/sse\") as (read, write):\n",[389,673,674],{"class":391,"line":500},[389,675,676],{},"    async with ClientSession(read, write) as session:\n",[389,678,679],{"class":391,"line":508},[389,680,681],{},"        await session.initialize()\n",[389,683,684],{"class":391,"line":513},[389,685,686],{},"        print(\"Connected to BookYourPTO MCP\")\n",[185,688,690],{"id":689},"step-2-discover-available-tools","Step 2: Discover Available Tools",[172,692,693],{},"Once connected (and authenticated via OAuth), list the available tools:",[256,695,379],{"id":696},"typescript-1",[381,698,700],{"className":383,"code":699,"language":378,"meta":385,"style":385},"const tools = await client.listTools();\n\nfor (const tool of tools.tools) {\n  console.log(`${tool.name}: ${tool.description}`);\n}\n",[225,701,702,726,730,756,800],{"__ignoreMap":385},[389,703,704,706,709,711,714,716,718,721,724],{"class":391,"line":392},[389,705,460],{"class":459},[389,707,708],{"class":403}," tools ",[389,710,466],{"class":399},[389,712,713],{"class":395}," await",[389,715,603],{"class":403},[389,717,606],{"class":399},[389,719,720],{"class":472},"listTools",[389,722,723],{"class":403},"()",[389,725,423],{"class":399},[389,727,728],{"class":391,"line":426},[389,729,453],{"emptyLinePlaceholder":452},[389,731,732,735,738,740,743,746,749,751,754],{"class":391,"line":449},[389,733,734],{"class":395},"for",[389,736,737],{"class":403}," (",[389,739,460],{"class":459},[389,741,742],{"class":403}," tool ",[389,744,745],{"class":399},"of",[389,747,748],{"class":403}," tools",[389,750,606],{"class":399},[389,752,753],{"class":403},"tools) ",[389,755,529],{"class":399},[389,757,758,761,763,765,767,770,773,775,778,780,783,786,788,790,793,796,798],{"class":391,"line":456},[389,759,760],{"class":403},"  console",[389,762,606],{"class":399},[389,764,625],{"class":472},[389,766,487],{"class":535},[389,768,769],{"class":399},"`${",[389,771,772],{"class":403},"tool",[389,774,606],{"class":399},[389,776,777],{"class":403},"name",[389,779,572],{"class":399},[389,781,782],{"class":416},": ",[389,784,785],{"class":399},"${",[389,787,772],{"class":403},[389,789,606],{"class":399},[389,791,792],{"class":403},"description",[389,794,795],{"class":399},"}`",[389,797,503],{"class":535},[389,799,423],{"class":399},[389,801,802],{"class":391,"line":478},[389,803,804],{"class":399},"}\n",[256,806,292],{"id":807},"python-1",[381,809,811],{"className":644,"code":810,"language":641,"meta":385,"style":385},"tools = await session.list_tools()\n\nfor tool in tools.tools:\n    print(f\"{tool.name}: {tool.description}\")\n",[225,812,813,818,822,827],{"__ignoreMap":385},[389,814,815],{"class":391,"line":392},[389,816,817],{},"tools = await session.list_tools()\n",[389,819,820],{"class":391,"line":426},[389,821,453],{"emptyLinePlaceholder":452},[389,823,824],{"class":391,"line":449},[389,825,826],{},"for tool in tools.tools:\n",[389,828,829],{"class":391,"line":456},[389,830,831],{},"    print(f\"{tool.name}: {tool.description}\")\n",[172,833,834,835,837],{},"This will return all BookYourPTO tools. See the ",[176,836,152],{"href":153}," for details.",[185,839,841],{"id":840},"step-3-call-a-tool","Step 3: Call a Tool",[172,843,844],{},"Authentication is already complete (handled by OAuth during connection). You can call any tool immediately:",[256,846,379],{"id":847},"typescript-2",[381,849,851],{"className":383,"code":850,"language":378,"meta":385,"style":385},"// Check leave balance\nconst result = await client.callTool({\n  name: \"get_leave_balance\",\n  arguments: {\n    year: 2026,\n  },\n});\n\nconsole.log(result.content);\n",[225,852,853,858,880,895,905,918,923,931,935],{"__ignoreMap":385},[389,854,855],{"class":391,"line":392},[389,856,857],{"class":587},"// Check leave balance\n",[389,859,860,862,865,867,869,871,873,876,878],{"class":391,"line":426},[389,861,460],{"class":459},[389,863,864],{"class":403}," result ",[389,866,466],{"class":399},[389,868,713],{"class":395},[389,870,603],{"class":403},[389,872,606],{"class":399},[389,874,875],{"class":472},"callTool",[389,877,487],{"class":403},[389,879,529],{"class":399},[389,881,882,884,886,888,891,893],{"class":391,"line":449},[389,883,536],{"class":535},[389,885,539],{"class":399},[389,887,413],{"class":399},[389,889,890],{"class":416},"get_leave_balance",[389,892,420],{"class":399},[389,894,549],{"class":399},[389,896,897,900,902],{"class":391,"line":456},[389,898,899],{"class":535},"  arguments",[389,901,539],{"class":399},[389,903,904],{"class":399}," {\n",[389,906,907,910,912,916],{"class":391,"line":478},[389,908,909],{"class":535},"    year",[389,911,539],{"class":399},[389,913,915],{"class":914},"sbssI"," 2026",[389,917,549],{"class":399},[389,919,920],{"class":391,"line":500},[389,921,922],{"class":399},"  },\n",[389,924,925,927,929],{"class":391,"line":508},[389,926,572],{"class":399},[389,928,503],{"class":403},[389,930,423],{"class":399},[389,932,933],{"class":391,"line":513},[389,934,453],{"emptyLinePlaceholder":452},[389,936,937,939,941,943,946,948,951],{"class":391,"line":532},[389,938,620],{"class":403},[389,940,606],{"class":399},[389,942,625],{"class":472},[389,944,945],{"class":403},"(result",[389,947,606],{"class":399},[389,949,950],{"class":403},"content)",[389,952,423],{"class":399},[256,954,292],{"id":955},"python-2",[381,957,959],{"className":644,"code":958,"language":641,"meta":385,"style":385},"# Check leave balance\nresult = await session.call_tool(\n    \"get_leave_balance\",\n    arguments={\"year\": 2026},\n)\n\nprint(result.content)\n",[225,960,961,966,971,976,981,985,989],{"__ignoreMap":385},[389,962,963],{"class":391,"line":392},[389,964,965],{},"# Check leave balance\n",[389,967,968],{"class":391,"line":426},[389,969,970],{},"result = await session.call_tool(\n",[389,972,973],{"class":391,"line":449},[389,974,975],{},"    \"get_leave_balance\",\n",[389,977,978],{"class":391,"line":456},[389,979,980],{},"    arguments={\"year\": 2026},\n",[389,982,983],{"class":391,"line":478},[389,984,497],{},[389,986,987],{"class":391,"line":500},[389,988,453],{"emptyLinePlaceholder":452},[389,990,991],{"class":391,"line":508},[389,992,993],{},"print(result.content)\n",[256,995,997],{"id":996},"example-create-a-leave-request","Example: Create a leave request",[381,999,1001],{"className":383,"code":1000,"language":378,"meta":385,"style":385},"const result = await client.callTool({\n  name: \"create_leave_request\",\n  arguments: {\n    userId: \"user-id-here\",\n    leaveTypeId: \"leave-type-id-here\",\n    startDate: \"2026-03-15\",\n    endDate: \"2026-03-16\",\n    reason: \"Personal day\",\n  },\n});\n",[225,1002,1003,1023,1038,1046,1062,1078,1094,1110,1126,1130],{"__ignoreMap":385},[389,1004,1005,1007,1009,1011,1013,1015,1017,1019,1021],{"class":391,"line":392},[389,1006,460],{"class":459},[389,1008,864],{"class":403},[389,1010,466],{"class":399},[389,1012,713],{"class":395},[389,1014,603],{"class":403},[389,1016,606],{"class":399},[389,1018,875],{"class":472},[389,1020,487],{"class":403},[389,1022,529],{"class":399},[389,1024,1025,1027,1029,1031,1034,1036],{"class":391,"line":426},[389,1026,536],{"class":535},[389,1028,539],{"class":399},[389,1030,413],{"class":399},[389,1032,1033],{"class":416},"create_leave_request",[389,1035,420],{"class":399},[389,1037,549],{"class":399},[389,1039,1040,1042,1044],{"class":391,"line":449},[389,1041,899],{"class":535},[389,1043,539],{"class":399},[389,1045,904],{"class":399},[389,1047,1048,1051,1053,1055,1058,1060],{"class":391,"line":456},[389,1049,1050],{"class":535},"    userId",[389,1052,539],{"class":399},[389,1054,413],{"class":399},[389,1056,1057],{"class":416},"user-id-here",[389,1059,420],{"class":399},[389,1061,549],{"class":399},[389,1063,1064,1067,1069,1071,1074,1076],{"class":391,"line":478},[389,1065,1066],{"class":535},"    leaveTypeId",[389,1068,539],{"class":399},[389,1070,413],{"class":399},[389,1072,1073],{"class":416},"leave-type-id-here",[389,1075,420],{"class":399},[389,1077,549],{"class":399},[389,1079,1080,1083,1085,1087,1090,1092],{"class":391,"line":500},[389,1081,1082],{"class":535},"    startDate",[389,1084,539],{"class":399},[389,1086,413],{"class":399},[389,1088,1089],{"class":416},"2026-03-15",[389,1091,420],{"class":399},[389,1093,549],{"class":399},[389,1095,1096,1099,1101,1103,1106,1108],{"class":391,"line":508},[389,1097,1098],{"class":535},"    endDate",[389,1100,539],{"class":399},[389,1102,413],{"class":399},[389,1104,1105],{"class":416},"2026-03-16",[389,1107,420],{"class":399},[389,1109,549],{"class":399},[389,1111,1112,1115,1117,1119,1122,1124],{"class":391,"line":513},[389,1113,1114],{"class":535},"    reason",[389,1116,539],{"class":399},[389,1118,413],{"class":399},[389,1120,1121],{"class":416},"Personal day",[389,1123,420],{"class":399},[389,1125,549],{"class":399},[389,1127,1128],{"class":391,"line":532},[389,1129,922],{"class":399},[389,1131,1132,1134,1136],{"class":391,"line":552},[389,1133,572],{"class":399},[389,1135,503],{"class":403},[389,1137,423],{"class":399},[185,1139,1141],{"id":1140},"step-5-read-resources","Step 5: Read Resources",[172,1143,1144],{},"The MCP server exposes read-only resources for context:",[381,1146,1148],{"className":383,"code":1147,"language":378,"meta":385,"style":385},"// List available resources\nconst resources = await client.listResources();\n\n// Read a specific resource\nconst orgSettings = await client.readResource({\n  uri: \"bypto://org-settings\",\n});\n\nconsole.log(orgSettings.contents);\n",[225,1149,1150,1155,1177,1181,1186,1208,1224,1232,1236],{"__ignoreMap":385},[389,1151,1152],{"class":391,"line":392},[389,1153,1154],{"class":587},"// List available resources\n",[389,1156,1157,1159,1162,1164,1166,1168,1170,1173,1175],{"class":391,"line":426},[389,1158,460],{"class":459},[389,1160,1161],{"class":403}," resources ",[389,1163,466],{"class":399},[389,1165,713],{"class":395},[389,1167,603],{"class":403},[389,1169,606],{"class":399},[389,1171,1172],{"class":472},"listResources",[389,1174,723],{"class":403},[389,1176,423],{"class":399},[389,1178,1179],{"class":391,"line":449},[389,1180,453],{"emptyLinePlaceholder":452},[389,1182,1183],{"class":391,"line":456},[389,1184,1185],{"class":587},"// Read a specific resource\n",[389,1187,1188,1190,1193,1195,1197,1199,1201,1204,1206],{"class":391,"line":478},[389,1189,460],{"class":459},[389,1191,1192],{"class":403}," orgSettings ",[389,1194,466],{"class":399},[389,1196,713],{"class":395},[389,1198,603],{"class":403},[389,1200,606],{"class":399},[389,1202,1203],{"class":472},"readResource",[389,1205,487],{"class":403},[389,1207,529],{"class":399},[389,1209,1210,1213,1215,1217,1220,1222],{"class":391,"line":500},[389,1211,1212],{"class":535},"  uri",[389,1214,539],{"class":399},[389,1216,413],{"class":399},[389,1218,1219],{"class":416},"bypto://org-settings",[389,1221,420],{"class":399},[389,1223,549],{"class":399},[389,1225,1226,1228,1230],{"class":391,"line":508},[389,1227,572],{"class":399},[389,1229,503],{"class":403},[389,1231,423],{"class":399},[389,1233,1234],{"class":391,"line":513},[389,1235,453],{"emptyLinePlaceholder":452},[389,1237,1238,1240,1242,1244,1247,1249,1252],{"class":391,"line":532},[389,1239,620],{"class":403},[389,1241,606],{"class":399},[389,1243,625],{"class":472},[389,1245,1246],{"class":403},"(orgSettings",[389,1248,606],{"class":399},[389,1250,1251],{"class":403},"contents)",[389,1253,423],{"class":399},[172,1255,1256],{},"Available resources:",[192,1258,1259,1269],{},[195,1260,1261],{},[198,1262,1263,1266],{},[201,1264,1265],{},"URI",[201,1267,1268],{},"Description",[211,1270,1271,1280,1290],{},[198,1272,1273,1277],{},[216,1274,1275],{},[225,1276,1219],{},[216,1278,1279],{},"Organization configuration",[198,1281,1282,1287],{},[216,1283,1284],{},[225,1285,1286],{},"bypto://leave-types",[216,1288,1289],{},"Available leave types",[198,1291,1292,1297],{},[216,1293,1294],{},[225,1295,1296],{},"bypto://team-directory",[216,1298,1299],{},"Team members with roles",[185,1301,1303],{"id":1302},"connection-lifecycle","Connection Lifecycle",[256,1305,1307],{"id":1306},"reconnection","Reconnection",[172,1309,1310],{},"SSE connections may drop due to network issues. Implement reconnection logic:",[381,1312,1314],{"className":383,"code":1313,"language":378,"meta":385,"style":385},"async function connectWithRetry(maxRetries = 5) {\n  for (let attempt = 1; attempt \u003C= maxRetries; attempt++) {\n    try {\n      const transport = new SSEClientTransport(\n        new URL(\"https://mcp.bookyourpto.com/sse\")\n      );\n      const client = new Client({\n        name: \"my-client\",\n        version: \"1.0.0\",\n      });\n      await client.connect(transport);\n      return client;\n    } catch (error) {\n      console.error(`Attempt ${attempt} failed:`, error.message);\n      if (attempt \u003C maxRetries) {\n        await new Promise((r) => setTimeout(r, 2000 * attempt));\n      }\n    }\n  }\n  throw new Error(\"Failed to connect after retries\");\n}\n",[225,1315,1316,1343,1384,1391,1407,1424,1431,1447,1463,1478,1487,1507,1516,1533,1577,1595,1640,1646,1652,1658,1682],{"__ignoreMap":385},[389,1317,1318,1321,1324,1327,1329,1333,1336,1339,1341],{"class":391,"line":392},[389,1319,1320],{"class":459},"async",[389,1322,1323],{"class":459}," function",[389,1325,1326],{"class":472}," connectWithRetry",[389,1328,487],{"class":399},[389,1330,1332],{"class":1331},"sHdIc","maxRetries",[389,1334,1335],{"class":399}," =",[389,1337,1338],{"class":914}," 5",[389,1340,503],{"class":399},[389,1342,904],{"class":399},[389,1344,1345,1348,1350,1353,1356,1358,1361,1364,1366,1369,1372,1374,1376,1379,1382],{"class":391,"line":426},[389,1346,1347],{"class":395},"  for",[389,1349,737],{"class":535},[389,1351,1352],{"class":459},"let",[389,1354,1355],{"class":403}," attempt",[389,1357,1335],{"class":399},[389,1359,1360],{"class":914}," 1",[389,1362,1363],{"class":399},";",[389,1365,1355],{"class":403},[389,1367,1368],{"class":399}," \u003C=",[389,1370,1371],{"class":403}," maxRetries",[389,1373,1363],{"class":399},[389,1375,1355],{"class":403},[389,1377,1378],{"class":399},"++",[389,1380,1381],{"class":535},") ",[389,1383,529],{"class":399},[389,1385,1386,1389],{"class":391,"line":449},[389,1387,1388],{"class":395},"    try",[389,1390,904],{"class":399},[389,1392,1393,1396,1399,1401,1403,1405],{"class":391,"line":456},[389,1394,1395],{"class":459},"      const",[389,1397,1398],{"class":403}," transport",[389,1400,1335],{"class":399},[389,1402,469],{"class":399},[389,1404,433],{"class":472},[389,1406,475],{"class":535},[389,1408,1409,1412,1414,1416,1418,1420,1422],{"class":391,"line":478},[389,1410,1411],{"class":399},"        new",[389,1413,484],{"class":472},[389,1415,487],{"class":535},[389,1417,420],{"class":399},[389,1419,492],{"class":416},[389,1421,420],{"class":399},[389,1423,497],{"class":535},[389,1425,1426,1429],{"class":391,"line":500},[389,1427,1428],{"class":535},"      )",[389,1430,423],{"class":399},[389,1432,1433,1435,1437,1439,1441,1443,1445],{"class":391,"line":508},[389,1434,1395],{"class":459},[389,1436,603],{"class":403},[389,1438,1335],{"class":399},[389,1440,469],{"class":399},[389,1442,404],{"class":472},[389,1444,487],{"class":535},[389,1446,529],{"class":399},[389,1448,1449,1452,1454,1456,1459,1461],{"class":391,"line":513},[389,1450,1451],{"class":535},"        name",[389,1453,539],{"class":399},[389,1455,413],{"class":399},[389,1457,1458],{"class":416},"my-client",[389,1460,420],{"class":399},[389,1462,549],{"class":399},[389,1464,1465,1468,1470,1472,1474,1476],{"class":391,"line":532},[389,1466,1467],{"class":535},"        version",[389,1469,539],{"class":399},[389,1471,413],{"class":399},[389,1473,562],{"class":416},[389,1475,420],{"class":399},[389,1477,549],{"class":399},[389,1479,1480,1483,1485],{"class":391,"line":552},[389,1481,1482],{"class":399},"      }",[389,1484,503],{"class":535},[389,1486,423],{"class":399},[389,1488,1489,1492,1494,1496,1498,1500,1503,1505],{"class":391,"line":569},[389,1490,1491],{"class":395},"      await",[389,1493,603],{"class":403},[389,1495,606],{"class":399},[389,1497,609],{"class":472},[389,1499,487],{"class":535},[389,1501,1502],{"class":403},"transport",[389,1504,503],{"class":535},[389,1506,423],{"class":399},[389,1508,1509,1512,1514],{"class":391,"line":579},[389,1510,1511],{"class":395},"      return",[389,1513,603],{"class":403},[389,1515,423],{"class":399},[389,1517,1518,1521,1524,1526,1529,1531],{"class":391,"line":584},[389,1519,1520],{"class":399},"    }",[389,1522,1523],{"class":395}," catch",[389,1525,737],{"class":535},[389,1527,1528],{"class":403},"error",[389,1530,1381],{"class":535},[389,1532,529],{"class":399},[389,1534,1535,1538,1540,1542,1544,1547,1550,1552,1555,1557,1560,1562,1565,1568,1570,1573,1575],{"class":391,"line":591},[389,1536,1537],{"class":403},"      console",[389,1539,606],{"class":399},[389,1541,1528],{"class":472},[389,1543,487],{"class":535},[389,1545,1546],{"class":399},"`",[389,1548,1549],{"class":416},"Attempt ",[389,1551,785],{"class":399},[389,1553,1554],{"class":403},"attempt",[389,1556,572],{"class":399},[389,1558,1559],{"class":416}," failed:",[389,1561,1546],{"class":399},[389,1563,1564],{"class":399},",",[389,1566,1567],{"class":403}," error",[389,1569,606],{"class":399},[389,1571,1572],{"class":403},"message",[389,1574,503],{"class":535},[389,1576,423],{"class":399},[389,1578,1579,1582,1584,1586,1589,1591,1593],{"class":391,"line":597},[389,1580,1581],{"class":395},"      if",[389,1583,737],{"class":535},[389,1585,1554],{"class":403},[389,1587,1588],{"class":399}," \u003C",[389,1590,1371],{"class":403},[389,1592,1381],{"class":535},[389,1594,529],{"class":399},[389,1596,1597,1600,1602,1606,1608,1610,1613,1615,1618,1621,1623,1625,1627,1630,1633,1635,1638],{"class":391,"line":617},[389,1598,1599],{"class":395},"        await",[389,1601,469],{"class":399},[389,1603,1605],{"class":1604},"sBMFI"," Promise",[389,1607,487],{"class":535},[389,1609,487],{"class":399},[389,1611,1612],{"class":1331},"r",[389,1614,503],{"class":399},[389,1616,1617],{"class":459}," =>",[389,1619,1620],{"class":472}," setTimeout",[389,1622,487],{"class":535},[389,1624,1612],{"class":403},[389,1626,1564],{"class":399},[389,1628,1629],{"class":914}," 2000",[389,1631,1632],{"class":399}," *",[389,1634,1355],{"class":403},[389,1636,1637],{"class":535},"))",[389,1639,423],{"class":399},[389,1641,1643],{"class":391,"line":1642},17,[389,1644,1645],{"class":399},"      }\n",[389,1647,1649],{"class":391,"line":1648},18,[389,1650,1651],{"class":399},"    }\n",[389,1653,1655],{"class":391,"line":1654},19,[389,1656,1657],{"class":399},"  }\n",[389,1659,1661,1664,1666,1669,1671,1673,1676,1678,1680],{"class":391,"line":1660},20,[389,1662,1663],{"class":395},"  throw",[389,1665,469],{"class":399},[389,1667,1668],{"class":472}," Error",[389,1670,487],{"class":535},[389,1672,420],{"class":399},[389,1674,1675],{"class":416},"Failed to connect after retries",[389,1677,420],{"class":399},[389,1679,503],{"class":535},[389,1681,423],{"class":399},[389,1683,1685],{"class":391,"line":1684},21,[389,1686,804],{"class":399},[256,1688,1690],{"id":1689},"clean-shutdown","Clean shutdown",[381,1692,1694],{"className":383,"code":1693,"language":378,"meta":385,"style":385},"// Always close the connection when done\nawait client.close();\n",[225,1695,1696,1701],{"__ignoreMap":385},[389,1697,1698],{"class":391,"line":392},[389,1699,1700],{"class":587},"// Always close the connection when done\n",[389,1702,1703,1705,1707,1709,1712,1714],{"class":391,"line":426},[389,1704,600],{"class":395},[389,1706,603],{"class":403},[389,1708,606],{"class":399},[389,1710,1711],{"class":472},"close",[389,1713,723],{"class":403},[389,1715,423],{"class":399},[185,1717,1719],{"id":1718},"key-references","Key References",[243,1721,1722,1730,1737,1743],{},[246,1723,1724,1729],{},[176,1725,1728],{"href":1726,"rel":1727,"target":181},"https://spec.modelcontextprotocol.io",[180],"MCP Specification"," — Full protocol standard",[246,1731,1732,1736],{},[176,1733,1735],{"href":178,"rel":1734,"target":181},[180],"Building an MCP Client"," — Official client guide",[246,1738,1739,1742],{},[176,1740,1741],{"href":153},"BookYourPTO MCP Tools"," — All 28 tools reference",[246,1744,1745,1748],{},[176,1746,1747],{"href":158},"Security & Permissions"," — Role-based access details",[1750,1751,1752],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":385,"searchDepth":392,"depth":426,"links":1754},[1755,1756,1759,1763,1767,1772,1773,1777],{"id":187,"depth":426,"text":142},{"id":240,"depth":426,"text":241,"children":1757},[1758],{"id":258,"depth":449,"text":259},{"id":346,"depth":426,"text":347,"children":1760},[1761,1762],{"id":378,"depth":449,"text":379},{"id":641,"depth":449,"text":292},{"id":689,"depth":426,"text":690,"children":1764},[1765,1766],{"id":696,"depth":449,"text":379},{"id":807,"depth":449,"text":292},{"id":840,"depth":426,"text":841,"children":1768},[1769,1770,1771],{"id":847,"depth":449,"text":379},{"id":955,"depth":449,"text":292},{"id":996,"depth":449,"text":997},{"id":1140,"depth":426,"text":1141},{"id":1302,"depth":426,"text":1303,"children":1774},[1775,1776],{"id":1306,"depth":449,"text":1307},{"id":1689,"depth":449,"text":1690},{"id":1718,"depth":426,"text":1719},"Build a custom MCP client that connects to the BookYourPTO MCP server using the SSE transport.","md",null,{},{"icon":165},{"title":162,"description":1778},"QNRf2D5vjGMEAh0U7GlHcRp-148EF8wqC4m3rPh2TWY",[1786,1780],{"title":157,"path":158,"stem":159,"description":1787,"icon":160,"children":-1},"Authentication, role-based access control, and security best practices for BookYourPTO MCP.",1774284207151]