[{"data":1,"prerenderedAt":1973},["ShallowReactive",2],{"blog-article-/blog/building-your-first-mcp-server":3,"blog-surround-/blog/building-your-first-mcp-server":1964},{"id":4,"title":5,"body":6,"canonical":1950,"date":1951,"description":12,"extension":1952,"featured":1953,"image":1954,"meta":1955,"navigation":244,"ogImage":1954,"path":1957,"provider":1954,"published":244,"seo":1958,"stem":1959,"tags":1960,"url":1954,"__hash__":1963},"blog/blog/building-your-first-mcp-server.md","Building Your First MCP Server - A Beginner's Tutorial",{"type":7,"value":8,"toc":1935},"minimark",[9,13,18,21,25,28,41,45,48,62,66,69,113,117,120,150,154,161,941,945,948,951,985,988,1001,1005,1008,1295,1298,1733,1737,1740,1756,1819,1823,1826,1859,1863,1866,1883,1887,1890,1893,1897,1928,1931],[10,11,12],"p",{},"Learn how to build your first Model Context Protocol (MCP) server from scratch. This beginner-friendly tutorial walks you through the fundamentals of MCP and guides you step-by-step through creating your own server to enhance AI applications.",[14,15,17],"h2",{"id":16},"what-is-mcp","What is MCP?",[10,19,20],{},"Model Context Protocol (MCP) is an emerging standard that enables AI applications to securely access external data sources and tools. Think of it as a bridge between AI models and the real world - allowing them to interact with databases, APIs, file systems, and other resources in a controlled and secure way.",[14,22,24],{"id":23},"getting-started","Getting Started",[10,26,27],{},"In this tutorial, we'll build a simple MCP server that can:",[29,30,31,35,38],"ul",{},[32,33,34],"li",{},"Provide context about files in a directory",[32,36,37],{},"Execute simple commands",[32,39,40],{},"Return structured data to AI applications",[14,42,44],{"id":43},"prerequisites","Prerequisites",[10,46,47],{},"Before we begin, make sure you have:",[29,49,50,53,56,59],{},[32,51,52],{},"Node.js (version 18 or higher)",[32,54,55],{},"Basic knowledge of JavaScript/TypeScript",[32,57,58],{},"A text editor or IDE",[32,60,61],{},"Terminal access",[14,63,65],{"id":64},"setting-up-your-project","Setting Up Your Project",[10,67,68],{},"Let's start by creating a new directory for our MCP server:",[70,71,76],"pre",{"className":72,"code":73,"language":74,"meta":75,"style":75},"language-bash shiki shiki-themes github-light github-dark","mkdir my-first-mcp-server\ncd my-first-mcp-server\nnpm init -y\n","bash","",[77,78,79,92,101],"code",{"__ignoreMap":75},[80,81,84,88],"span",{"class":82,"line":83},"line",1,[80,85,87],{"class":86},"sScJk","mkdir",[80,89,91],{"class":90},"sZZnC"," my-first-mcp-server\n",[80,93,95,99],{"class":82,"line":94},2,[80,96,98],{"class":97},"sj4cs","cd",[80,100,91],{"class":90},[80,102,104,107,110],{"class":82,"line":103},3,[80,105,106],{"class":86},"npm",[80,108,109],{"class":90}," init",[80,111,112],{"class":97}," -y\n",[14,114,116],{"id":115},"installing-dependencies","Installing Dependencies",[10,118,119],{},"We'll need the MCP SDK to build our server:",[70,121,123],{"className":72,"code":122,"language":74,"meta":75,"style":75},"npm install @modelcontextprotocol/sdk\nnpm install --save-dev typescript @types/node\n",[77,124,125,135],{"__ignoreMap":75},[80,126,127,129,132],{"class":82,"line":83},[80,128,106],{"class":86},[80,130,131],{"class":90}," install",[80,133,134],{"class":90}," @modelcontextprotocol/sdk\n",[80,136,137,139,141,144,147],{"class":82,"line":94},[80,138,106],{"class":86},[80,140,131],{"class":90},[80,142,143],{"class":97}," --save-dev",[80,145,146],{"class":90}," typescript",[80,148,149],{"class":90}," @types/node\n",[14,151,153],{"id":152},"creating-your-first-mcp-server","Creating Your First MCP Server",[10,155,156,157,160],{},"Create a new file called ",[77,158,159],{},"server.ts"," in your project directory:",[70,162,166],{"className":163,"code":164,"language":165,"meta":75,"style":75},"language-typescript shiki shiki-themes github-light github-dark","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n  CallToolRequestSchema,\n  ListToolsRequestSchema,\n  Tool,\n} from '@modelcontextprotocol/sdk/types.js';\n\nclass MyMCPServer {\n  private server: Server;\n\n  constructor() {\n    this.server = new Server(\n      {\n        name: 'my-first-mcp-server',\n        version: '0.1.0',\n      },\n      {\n        capabilities: {\n          tools: {},\n        },\n      }\n    );\n\n    this.setupToolHandlers();\n  }\n\n  private setupToolHandlers() {\n    // List available tools\n    this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n      return {\n        tools: [\n          {\n            name: 'hello',\n            description: 'Say hello to the world',\n            inputSchema: {\n              type: 'object',\n              properties: {\n                name: {\n                  type: 'string',\n                  description: 'Name to greet',\n                },\n              },\n            },\n          },\n        ],\n      };\n    });\n\n    // Handle tool calls\n    this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n      const { name, arguments: args } = request.params;\n\n      switch (name) {\n        case 'hello':\n          const nameToGreet = args?.name || 'World';\n          return {\n            content: [\n              {\n                type: 'text',\n                text: `Hello, ${nameToGreet}! This is your first MCP server responding.`,\n              },\n            ],\n          };\n        \n        default:\n          throw new Error(`Unknown tool: ${name}`);\n      }\n    });\n  }\n\n  async run() {\n    const transport = new StdioServerTransport();\n    await this.server.connect(transport);\n    console.error('MCP server running on stdio');\n  }\n}\n\nconst server = new MyMCPServer();\nserver.run().catch(console.error);\n","typescript",[77,167,168,187,201,208,214,220,226,239,246,257,275,280,289,309,315,327,338,344,349,355,361,367,373,379,384,398,404,409,419,426,451,459,465,471,482,493,499,510,516,522,533,544,550,556,562,568,574,580,586,591,597,624,656,661,670,682,705,713,719,725,736,753,758,764,770,776,784,809,814,819,824,829,840,858,875,891,896,902,907,923],{"__ignoreMap":75},[80,169,170,174,178,181,184],{"class":82,"line":83},[80,171,173],{"class":172},"szBVR","import",[80,175,177],{"class":176},"sVt8B"," { Server } ",[80,179,180],{"class":172},"from",[80,182,183],{"class":90}," '@modelcontextprotocol/sdk/server/index.js'",[80,185,186],{"class":176},";\n",[80,188,189,191,194,196,199],{"class":82,"line":94},[80,190,173],{"class":172},[80,192,193],{"class":176}," { StdioServerTransport } ",[80,195,180],{"class":172},[80,197,198],{"class":90}," '@modelcontextprotocol/sdk/server/stdio.js'",[80,200,186],{"class":176},[80,202,203,205],{"class":82,"line":103},[80,204,173],{"class":172},[80,206,207],{"class":176}," {\n",[80,209,211],{"class":82,"line":210},4,[80,212,213],{"class":176},"  CallToolRequestSchema,\n",[80,215,217],{"class":82,"line":216},5,[80,218,219],{"class":176},"  ListToolsRequestSchema,\n",[80,221,223],{"class":82,"line":222},6,[80,224,225],{"class":176},"  Tool,\n",[80,227,229,232,234,237],{"class":82,"line":228},7,[80,230,231],{"class":176},"} ",[80,233,180],{"class":172},[80,235,236],{"class":90}," '@modelcontextprotocol/sdk/types.js'",[80,238,186],{"class":176},[80,240,242],{"class":82,"line":241},8,[80,243,245],{"emptyLinePlaceholder":244},true,"\n",[80,247,249,252,255],{"class":82,"line":248},9,[80,250,251],{"class":172},"class",[80,253,254],{"class":86}," MyMCPServer",[80,256,207],{"class":176},[80,258,260,263,267,270,273],{"class":82,"line":259},10,[80,261,262],{"class":172},"  private",[80,264,266],{"class":265},"s4XuR"," server",[80,268,269],{"class":172},":",[80,271,272],{"class":86}," Server",[80,274,186],{"class":176},[80,276,278],{"class":82,"line":277},11,[80,279,245],{"emptyLinePlaceholder":244},[80,281,283,286],{"class":82,"line":282},12,[80,284,285],{"class":172},"  constructor",[80,287,288],{"class":176},"() {\n",[80,290,292,295,298,301,304,306],{"class":82,"line":291},13,[80,293,294],{"class":97},"    this",[80,296,297],{"class":176},".server ",[80,299,300],{"class":172},"=",[80,302,303],{"class":172}," new",[80,305,272],{"class":86},[80,307,308],{"class":176},"(\n",[80,310,312],{"class":82,"line":311},14,[80,313,314],{"class":176},"      {\n",[80,316,318,321,324],{"class":82,"line":317},15,[80,319,320],{"class":176},"        name: ",[80,322,323],{"class":90},"'my-first-mcp-server'",[80,325,326],{"class":176},",\n",[80,328,330,333,336],{"class":82,"line":329},16,[80,331,332],{"class":176},"        version: ",[80,334,335],{"class":90},"'0.1.0'",[80,337,326],{"class":176},[80,339,341],{"class":82,"line":340},17,[80,342,343],{"class":176},"      },\n",[80,345,347],{"class":82,"line":346},18,[80,348,314],{"class":176},[80,350,352],{"class":82,"line":351},19,[80,353,354],{"class":176},"        capabilities: {\n",[80,356,358],{"class":82,"line":357},20,[80,359,360],{"class":176},"          tools: {},\n",[80,362,364],{"class":82,"line":363},21,[80,365,366],{"class":176},"        },\n",[80,368,370],{"class":82,"line":369},22,[80,371,372],{"class":176},"      }\n",[80,374,376],{"class":82,"line":375},23,[80,377,378],{"class":176},"    );\n",[80,380,382],{"class":82,"line":381},24,[80,383,245],{"emptyLinePlaceholder":244},[80,385,387,389,392,395],{"class":82,"line":386},25,[80,388,294],{"class":97},[80,390,391],{"class":176},".",[80,393,394],{"class":86},"setupToolHandlers",[80,396,397],{"class":176},"();\n",[80,399,401],{"class":82,"line":400},26,[80,402,403],{"class":176},"  }\n",[80,405,407],{"class":82,"line":406},27,[80,408,245],{"emptyLinePlaceholder":244},[80,410,412,414,417],{"class":82,"line":411},28,[80,413,262],{"class":172},[80,415,416],{"class":86}," setupToolHandlers",[80,418,288],{"class":176},[80,420,422],{"class":82,"line":421},29,[80,423,425],{"class":424},"sJ8bj","    // List available tools\n",[80,427,429,431,434,437,440,443,446,449],{"class":82,"line":428},30,[80,430,294],{"class":97},[80,432,433],{"class":176},".server.",[80,435,436],{"class":86},"setRequestHandler",[80,438,439],{"class":176},"(ListToolsRequestSchema, ",[80,441,442],{"class":172},"async",[80,444,445],{"class":176}," () ",[80,447,448],{"class":172},"=>",[80,450,207],{"class":176},[80,452,454,457],{"class":82,"line":453},31,[80,455,456],{"class":172},"      return",[80,458,207],{"class":176},[80,460,462],{"class":82,"line":461},32,[80,463,464],{"class":176},"        tools: [\n",[80,466,468],{"class":82,"line":467},33,[80,469,470],{"class":176},"          {\n",[80,472,474,477,480],{"class":82,"line":473},34,[80,475,476],{"class":176},"            name: ",[80,478,479],{"class":90},"'hello'",[80,481,326],{"class":176},[80,483,485,488,491],{"class":82,"line":484},35,[80,486,487],{"class":176},"            description: ",[80,489,490],{"class":90},"'Say hello to the world'",[80,492,326],{"class":176},[80,494,496],{"class":82,"line":495},36,[80,497,498],{"class":176},"            inputSchema: {\n",[80,500,502,505,508],{"class":82,"line":501},37,[80,503,504],{"class":176},"              type: ",[80,506,507],{"class":90},"'object'",[80,509,326],{"class":176},[80,511,513],{"class":82,"line":512},38,[80,514,515],{"class":176},"              properties: {\n",[80,517,519],{"class":82,"line":518},39,[80,520,521],{"class":176},"                name: {\n",[80,523,525,528,531],{"class":82,"line":524},40,[80,526,527],{"class":176},"                  type: ",[80,529,530],{"class":90},"'string'",[80,532,326],{"class":176},[80,534,536,539,542],{"class":82,"line":535},41,[80,537,538],{"class":176},"                  description: ",[80,540,541],{"class":90},"'Name to greet'",[80,543,326],{"class":176},[80,545,547],{"class":82,"line":546},42,[80,548,549],{"class":176},"                },\n",[80,551,553],{"class":82,"line":552},43,[80,554,555],{"class":176},"              },\n",[80,557,559],{"class":82,"line":558},44,[80,560,561],{"class":176},"            },\n",[80,563,565],{"class":82,"line":564},45,[80,566,567],{"class":176},"          },\n",[80,569,571],{"class":82,"line":570},46,[80,572,573],{"class":176},"        ],\n",[80,575,577],{"class":82,"line":576},47,[80,578,579],{"class":176},"      };\n",[80,581,583],{"class":82,"line":582},48,[80,584,585],{"class":176},"    });\n",[80,587,589],{"class":82,"line":588},49,[80,590,245],{"emptyLinePlaceholder":244},[80,592,594],{"class":82,"line":593},50,[80,595,596],{"class":424},"    // Handle tool calls\n",[80,598,600,602,604,606,609,611,614,617,620,622],{"class":82,"line":599},51,[80,601,294],{"class":97},[80,603,433],{"class":176},[80,605,436],{"class":86},[80,607,608],{"class":176},"(CallToolRequestSchema, ",[80,610,442],{"class":172},[80,612,613],{"class":176}," (",[80,615,616],{"class":265},"request",[80,618,619],{"class":176},") ",[80,621,448],{"class":172},[80,623,207],{"class":176},[80,625,627,630,633,636,639,642,645,648,651,653],{"class":82,"line":626},52,[80,628,629],{"class":172},"      const",[80,631,632],{"class":176}," { ",[80,634,635],{"class":97},"name",[80,637,638],{"class":176},", ",[80,640,641],{"class":265},"arguments",[80,643,644],{"class":176},": ",[80,646,647],{"class":97},"args",[80,649,650],{"class":176}," } ",[80,652,300],{"class":172},[80,654,655],{"class":176}," request.params;\n",[80,657,659],{"class":82,"line":658},53,[80,660,245],{"emptyLinePlaceholder":244},[80,662,664,667],{"class":82,"line":663},54,[80,665,666],{"class":172},"      switch",[80,668,669],{"class":176}," (name) {\n",[80,671,673,676,679],{"class":82,"line":672},55,[80,674,675],{"class":172},"        case",[80,677,678],{"class":90}," 'hello'",[80,680,681],{"class":176},":\n",[80,683,685,688,691,694,697,700,703],{"class":82,"line":684},56,[80,686,687],{"class":172},"          const",[80,689,690],{"class":97}," nameToGreet",[80,692,693],{"class":172}," =",[80,695,696],{"class":176}," args?.name ",[80,698,699],{"class":172},"||",[80,701,702],{"class":90}," 'World'",[80,704,186],{"class":176},[80,706,708,711],{"class":82,"line":707},57,[80,709,710],{"class":172},"          return",[80,712,207],{"class":176},[80,714,716],{"class":82,"line":715},58,[80,717,718],{"class":176},"            content: [\n",[80,720,722],{"class":82,"line":721},59,[80,723,724],{"class":176},"              {\n",[80,726,728,731,734],{"class":82,"line":727},60,[80,729,730],{"class":176},"                type: ",[80,732,733],{"class":90},"'text'",[80,735,326],{"class":176},[80,737,739,742,745,748,751],{"class":82,"line":738},61,[80,740,741],{"class":176},"                text: ",[80,743,744],{"class":90},"`Hello, ${",[80,746,747],{"class":176},"nameToGreet",[80,749,750],{"class":90},"}! This is your first MCP server responding.`",[80,752,326],{"class":176},[80,754,756],{"class":82,"line":755},62,[80,757,555],{"class":176},[80,759,761],{"class":82,"line":760},63,[80,762,763],{"class":176},"            ],\n",[80,765,767],{"class":82,"line":766},64,[80,768,769],{"class":176},"          };\n",[80,771,773],{"class":82,"line":772},65,[80,774,775],{"class":176},"        \n",[80,777,779,782],{"class":82,"line":778},66,[80,780,781],{"class":172},"        default",[80,783,681],{"class":176},[80,785,787,790,792,795,798,801,803,806],{"class":82,"line":786},67,[80,788,789],{"class":172},"          throw",[80,791,303],{"class":172},[80,793,794],{"class":86}," Error",[80,796,797],{"class":176},"(",[80,799,800],{"class":90},"`Unknown tool: ${",[80,802,635],{"class":176},[80,804,805],{"class":90},"}`",[80,807,808],{"class":176},");\n",[80,810,812],{"class":82,"line":811},68,[80,813,372],{"class":176},[80,815,817],{"class":82,"line":816},69,[80,818,585],{"class":176},[80,820,822],{"class":82,"line":821},70,[80,823,403],{"class":176},[80,825,827],{"class":82,"line":826},71,[80,828,245],{"emptyLinePlaceholder":244},[80,830,832,835,838],{"class":82,"line":831},72,[80,833,834],{"class":172},"  async",[80,836,837],{"class":86}," run",[80,839,288],{"class":176},[80,841,843,846,849,851,853,856],{"class":82,"line":842},73,[80,844,845],{"class":172},"    const",[80,847,848],{"class":97}," transport",[80,850,693],{"class":172},[80,852,303],{"class":172},[80,854,855],{"class":86}," StdioServerTransport",[80,857,397],{"class":176},[80,859,861,864,867,869,872],{"class":82,"line":860},74,[80,862,863],{"class":172},"    await",[80,865,866],{"class":97}," this",[80,868,433],{"class":176},[80,870,871],{"class":86},"connect",[80,873,874],{"class":176},"(transport);\n",[80,876,878,881,884,886,889],{"class":82,"line":877},75,[80,879,880],{"class":176},"    console.",[80,882,883],{"class":86},"error",[80,885,797],{"class":176},[80,887,888],{"class":90},"'MCP server running on stdio'",[80,890,808],{"class":176},[80,892,894],{"class":82,"line":893},76,[80,895,403],{"class":176},[80,897,899],{"class":82,"line":898},77,[80,900,901],{"class":176},"}\n",[80,903,905],{"class":82,"line":904},78,[80,906,245],{"emptyLinePlaceholder":244},[80,908,910,913,915,917,919,921],{"class":82,"line":909},79,[80,911,912],{"class":172},"const",[80,914,266],{"class":97},[80,916,693],{"class":172},[80,918,303],{"class":172},[80,920,254],{"class":86},[80,922,397],{"class":176},[80,924,926,929,932,935,938],{"class":82,"line":925},80,[80,927,928],{"class":176},"server.",[80,930,931],{"class":86},"run",[80,933,934],{"class":176},"().",[80,936,937],{"class":86},"catch",[80,939,940],{"class":176},"(console.error);\n",[14,942,944],{"id":943},"testing-your-server","Testing Your Server",[10,946,947],{},"To test your MCP server, you'll need an MCP client. You can use the MCP Inspector tool or integrate it with Claude Desktop.",[10,949,950],{},"First, compile your TypeScript:",[70,952,954],{"className":72,"code":953,"language":74,"meta":75,"style":75},"npx tsc server.ts --target es2022 --module node16 --moduleResolution node16\n",[77,955,956],{"__ignoreMap":75},[80,957,958,961,964,967,970,973,976,979,982],{"class":82,"line":83},[80,959,960],{"class":86},"npx",[80,962,963],{"class":90}," tsc",[80,965,966],{"class":90}," server.ts",[80,968,969],{"class":97}," --target",[80,971,972],{"class":90}," es2022",[80,974,975],{"class":97}," --module",[80,977,978],{"class":90}," node16",[80,980,981],{"class":97}," --moduleResolution",[80,983,984],{"class":90}," node16\n",[10,986,987],{},"Then run your server:",[70,989,991],{"className":72,"code":990,"language":74,"meta":75,"style":75},"node server.js\n",[77,992,993],{"__ignoreMap":75},[80,994,995,998],{"class":82,"line":83},[80,996,997],{"class":86},"node",[80,999,1000],{"class":90}," server.js\n",[14,1002,1004],{"id":1003},"adding-more-functionality","Adding More Functionality",[10,1006,1007],{},"Let's enhance our server with more useful tools:",[70,1009,1011],{"className":163,"code":1010,"language":165,"meta":75,"style":75},"// Add this to your tools list\n{\n  name: 'get-time',\n  description: 'Get the current time',\n  inputSchema: {\n    type: 'object',\n    properties: {},\n  },\n},\n{\n  name: 'calculate',\n  description: 'Perform basic mathematical calculations',\n  inputSchema: {\n    type: 'object',\n    properties: {\n      operation: {\n        type: 'string',\n        enum: ['add', 'subtract', 'multiply', 'divide'],\n        description: 'Mathematical operation to perform',\n      },\n      a: {\n        type: 'number',\n        description: 'First number',\n      },\n      b: {\n        type: 'number',\n        description: 'Second number',\n      },\n    },\n    required: ['operation', 'a', 'b'],\n  },\n}\n",[77,1012,1013,1018,1023,1035,1047,1055,1066,1074,1079,1084,1088,1099,1110,1116,1126,1132,1139,1150,1179,1191,1195,1202,1213,1224,1228,1235,1245,1256,1260,1265,1287,1291],{"__ignoreMap":75},[80,1014,1015],{"class":82,"line":83},[80,1016,1017],{"class":424},"// Add this to your tools list\n",[80,1019,1020],{"class":82,"line":94},[80,1021,1022],{"class":176},"{\n",[80,1024,1025,1028,1030,1033],{"class":82,"line":103},[80,1026,1027],{"class":86},"  name",[80,1029,644],{"class":176},[80,1031,1032],{"class":90},"'get-time'",[80,1034,326],{"class":176},[80,1036,1037,1040,1042,1045],{"class":82,"line":210},[80,1038,1039],{"class":86},"  description",[80,1041,644],{"class":176},[80,1043,1044],{"class":90},"'Get the current time'",[80,1046,326],{"class":176},[80,1048,1049,1052],{"class":82,"line":216},[80,1050,1051],{"class":86},"  inputSchema",[80,1053,1054],{"class":176},": {\n",[80,1056,1057,1060,1062,1064],{"class":82,"line":222},[80,1058,1059],{"class":86},"    type",[80,1061,644],{"class":176},[80,1063,507],{"class":90},[80,1065,326],{"class":176},[80,1067,1068,1071],{"class":82,"line":228},[80,1069,1070],{"class":86},"    properties",[80,1072,1073],{"class":176},": {},\n",[80,1075,1076],{"class":82,"line":241},[80,1077,1078],{"class":176},"  },\n",[80,1080,1081],{"class":82,"line":248},[80,1082,1083],{"class":176},"},\n",[80,1085,1086],{"class":82,"line":259},[80,1087,1022],{"class":176},[80,1089,1090,1092,1094,1097],{"class":82,"line":277},[80,1091,1027],{"class":86},[80,1093,644],{"class":176},[80,1095,1096],{"class":90},"'calculate'",[80,1098,326],{"class":176},[80,1100,1101,1103,1105,1108],{"class":82,"line":282},[80,1102,1039],{"class":86},[80,1104,644],{"class":176},[80,1106,1107],{"class":90},"'Perform basic mathematical calculations'",[80,1109,326],{"class":176},[80,1111,1112,1114],{"class":82,"line":291},[80,1113,1051],{"class":86},[80,1115,1054],{"class":176},[80,1117,1118,1120,1122,1124],{"class":82,"line":311},[80,1119,1059],{"class":86},[80,1121,644],{"class":176},[80,1123,507],{"class":90},[80,1125,326],{"class":176},[80,1127,1128,1130],{"class":82,"line":317},[80,1129,1070],{"class":86},[80,1131,1054],{"class":176},[80,1133,1134,1137],{"class":82,"line":329},[80,1135,1136],{"class":86},"      operation",[80,1138,1054],{"class":176},[80,1140,1141,1144,1146,1148],{"class":82,"line":340},[80,1142,1143],{"class":86},"        type",[80,1145,644],{"class":176},[80,1147,530],{"class":90},[80,1149,326],{"class":176},[80,1151,1152,1155,1158,1161,1163,1166,1168,1171,1173,1176],{"class":82,"line":346},[80,1153,1154],{"class":86},"        enum",[80,1156,1157],{"class":176},": [",[80,1159,1160],{"class":90},"'add'",[80,1162,638],{"class":176},[80,1164,1165],{"class":90},"'subtract'",[80,1167,638],{"class":176},[80,1169,1170],{"class":90},"'multiply'",[80,1172,638],{"class":176},[80,1174,1175],{"class":90},"'divide'",[80,1177,1178],{"class":176},"],\n",[80,1180,1181,1184,1186,1189],{"class":82,"line":351},[80,1182,1183],{"class":86},"        description",[80,1185,644],{"class":176},[80,1187,1188],{"class":90},"'Mathematical operation to perform'",[80,1190,326],{"class":176},[80,1192,1193],{"class":82,"line":357},[80,1194,343],{"class":176},[80,1196,1197,1200],{"class":82,"line":363},[80,1198,1199],{"class":86},"      a",[80,1201,1054],{"class":176},[80,1203,1204,1206,1208,1211],{"class":82,"line":369},[80,1205,1143],{"class":86},[80,1207,644],{"class":176},[80,1209,1210],{"class":90},"'number'",[80,1212,326],{"class":176},[80,1214,1215,1217,1219,1222],{"class":82,"line":375},[80,1216,1183],{"class":86},[80,1218,644],{"class":176},[80,1220,1221],{"class":90},"'First number'",[80,1223,326],{"class":176},[80,1225,1226],{"class":82,"line":381},[80,1227,343],{"class":176},[80,1229,1230,1233],{"class":82,"line":386},[80,1231,1232],{"class":86},"      b",[80,1234,1054],{"class":176},[80,1236,1237,1239,1241,1243],{"class":82,"line":400},[80,1238,1143],{"class":86},[80,1240,644],{"class":176},[80,1242,1210],{"class":90},[80,1244,326],{"class":176},[80,1246,1247,1249,1251,1254],{"class":82,"line":406},[80,1248,1183],{"class":86},[80,1250,644],{"class":176},[80,1252,1253],{"class":90},"'Second number'",[80,1255,326],{"class":176},[80,1257,1258],{"class":82,"line":411},[80,1259,343],{"class":176},[80,1261,1262],{"class":82,"line":421},[80,1263,1264],{"class":176},"    },\n",[80,1266,1267,1270,1272,1275,1277,1280,1282,1285],{"class":82,"line":428},[80,1268,1269],{"class":86},"    required",[80,1271,1157],{"class":176},[80,1273,1274],{"class":90},"'operation'",[80,1276,638],{"class":176},[80,1278,1279],{"class":90},"'a'",[80,1281,638],{"class":176},[80,1283,1284],{"class":90},"'b'",[80,1286,1178],{"class":176},[80,1288,1289],{"class":82,"line":453},[80,1290,1078],{"class":176},[80,1292,1293],{"class":82,"line":461},[80,1294,901],{"class":176},[10,1296,1297],{},"And handle these new tools:",[70,1299,1301],{"className":163,"code":1300,"language":165,"meta":75,"style":75},"case 'get-time':\n  return {\n    content: [\n      {\n        type: 'text',\n        text: `Current time: ${new Date().toISOString()}`,\n      },\n    ],\n  };\n\ncase 'calculate':\n  const { operation, a, b } = args as {\n    operation: string;\n    a: number;\n    b: number;\n  };\n  \n  let result: number;\n  switch (operation) {\n    case 'add':\n      result = a + b;\n      break;\n    case 'subtract':\n      result = a - b;\n      break;\n    case 'multiply':\n      result = a * b;\n      break;\n    case 'divide':\n      if (b === 0) throw new Error('Division by zero');\n      result = a / b;\n      break;\n    default:\n      throw new Error(`Unknown operation: ${operation}`);\n  }\n  \n  return {\n    content: [\n      {\n        type: 'text',\n        text: `${a} ${operation} ${b} = ${result}`,\n      },\n    ],\n  };\n",[77,1302,1303,1313,1320,1325,1329,1338,1364,1368,1373,1378,1382,1391,1423,1435,1447,1458,1462,1467,1481,1489,1499,1515,1522,1531,1544,1550,1559,1572,1578,1587,1617,1630,1636,1643,1663,1667,1671,1677,1681,1685,1693,1721,1725,1729],{"__ignoreMap":75},[80,1304,1305,1308,1311],{"class":82,"line":83},[80,1306,1307],{"class":172},"case",[80,1309,1310],{"class":90}," 'get-time'",[80,1312,681],{"class":176},[80,1314,1315,1318],{"class":82,"line":94},[80,1316,1317],{"class":172},"  return",[80,1319,207],{"class":176},[80,1321,1322],{"class":82,"line":103},[80,1323,1324],{"class":176},"    content: [\n",[80,1326,1327],{"class":82,"line":210},[80,1328,314],{"class":176},[80,1330,1331,1334,1336],{"class":82,"line":216},[80,1332,1333],{"class":176},"        type: ",[80,1335,733],{"class":90},[80,1337,326],{"class":176},[80,1339,1340,1343,1346,1349,1352,1354,1357,1360,1362],{"class":82,"line":222},[80,1341,1342],{"class":176},"        text: ",[80,1344,1345],{"class":90},"`Current time: ${",[80,1347,1348],{"class":172},"new",[80,1350,1351],{"class":86}," Date",[80,1353,934],{"class":90},[80,1355,1356],{"class":86},"toISOString",[80,1358,1359],{"class":90},"()",[80,1361,805],{"class":90},[80,1363,326],{"class":176},[80,1365,1366],{"class":82,"line":228},[80,1367,343],{"class":176},[80,1369,1370],{"class":82,"line":241},[80,1371,1372],{"class":176},"    ],\n",[80,1374,1375],{"class":82,"line":248},[80,1376,1377],{"class":176},"  };\n",[80,1379,1380],{"class":82,"line":259},[80,1381,245],{"emptyLinePlaceholder":244},[80,1383,1384,1386,1389],{"class":82,"line":277},[80,1385,1307],{"class":172},[80,1387,1388],{"class":90}," 'calculate'",[80,1390,681],{"class":176},[80,1392,1393,1396,1398,1401,1403,1406,1408,1411,1413,1415,1418,1421],{"class":82,"line":282},[80,1394,1395],{"class":172},"  const",[80,1397,632],{"class":176},[80,1399,1400],{"class":97},"operation",[80,1402,638],{"class":176},[80,1404,1405],{"class":97},"a",[80,1407,638],{"class":176},[80,1409,1410],{"class":97},"b",[80,1412,650],{"class":176},[80,1414,300],{"class":172},[80,1416,1417],{"class":176}," args ",[80,1419,1420],{"class":172},"as",[80,1422,207],{"class":176},[80,1424,1425,1428,1430,1433],{"class":82,"line":291},[80,1426,1427],{"class":265},"    operation",[80,1429,269],{"class":172},[80,1431,1432],{"class":97}," string",[80,1434,186],{"class":176},[80,1436,1437,1440,1442,1445],{"class":82,"line":311},[80,1438,1439],{"class":265},"    a",[80,1441,269],{"class":172},[80,1443,1444],{"class":97}," number",[80,1446,186],{"class":176},[80,1448,1449,1452,1454,1456],{"class":82,"line":317},[80,1450,1451],{"class":265},"    b",[80,1453,269],{"class":172},[80,1455,1444],{"class":97},[80,1457,186],{"class":176},[80,1459,1460],{"class":82,"line":329},[80,1461,1377],{"class":176},[80,1463,1464],{"class":82,"line":340},[80,1465,1466],{"class":176},"  \n",[80,1468,1469,1472,1475,1477,1479],{"class":82,"line":346},[80,1470,1471],{"class":172},"  let",[80,1473,1474],{"class":176}," result",[80,1476,269],{"class":172},[80,1478,1444],{"class":97},[80,1480,186],{"class":176},[80,1482,1483,1486],{"class":82,"line":351},[80,1484,1485],{"class":172},"  switch",[80,1487,1488],{"class":176}," (operation) {\n",[80,1490,1491,1494,1497],{"class":82,"line":357},[80,1492,1493],{"class":172},"    case",[80,1495,1496],{"class":90}," 'add'",[80,1498,681],{"class":176},[80,1500,1501,1504,1506,1509,1512],{"class":82,"line":363},[80,1502,1503],{"class":176},"      result ",[80,1505,300],{"class":172},[80,1507,1508],{"class":176}," a ",[80,1510,1511],{"class":172},"+",[80,1513,1514],{"class":176}," b;\n",[80,1516,1517,1520],{"class":82,"line":369},[80,1518,1519],{"class":172},"      break",[80,1521,186],{"class":176},[80,1523,1524,1526,1529],{"class":82,"line":375},[80,1525,1493],{"class":172},[80,1527,1528],{"class":90}," 'subtract'",[80,1530,681],{"class":176},[80,1532,1533,1535,1537,1539,1542],{"class":82,"line":381},[80,1534,1503],{"class":176},[80,1536,300],{"class":172},[80,1538,1508],{"class":176},[80,1540,1541],{"class":172},"-",[80,1543,1514],{"class":176},[80,1545,1546,1548],{"class":82,"line":386},[80,1547,1519],{"class":172},[80,1549,186],{"class":176},[80,1551,1552,1554,1557],{"class":82,"line":400},[80,1553,1493],{"class":172},[80,1555,1556],{"class":90}," 'multiply'",[80,1558,681],{"class":176},[80,1560,1561,1563,1565,1567,1570],{"class":82,"line":406},[80,1562,1503],{"class":176},[80,1564,300],{"class":172},[80,1566,1508],{"class":176},[80,1568,1569],{"class":172},"*",[80,1571,1514],{"class":176},[80,1573,1574,1576],{"class":82,"line":411},[80,1575,1519],{"class":172},[80,1577,186],{"class":176},[80,1579,1580,1582,1585],{"class":82,"line":421},[80,1581,1493],{"class":172},[80,1583,1584],{"class":90}," 'divide'",[80,1586,681],{"class":176},[80,1588,1589,1592,1595,1598,1601,1603,1606,1608,1610,1612,1615],{"class":82,"line":428},[80,1590,1591],{"class":172},"      if",[80,1593,1594],{"class":176}," (b ",[80,1596,1597],{"class":172},"===",[80,1599,1600],{"class":97}," 0",[80,1602,619],{"class":176},[80,1604,1605],{"class":172},"throw",[80,1607,303],{"class":172},[80,1609,794],{"class":86},[80,1611,797],{"class":176},[80,1613,1614],{"class":90},"'Division by zero'",[80,1616,808],{"class":176},[80,1618,1619,1621,1623,1625,1628],{"class":82,"line":453},[80,1620,1503],{"class":176},[80,1622,300],{"class":172},[80,1624,1508],{"class":176},[80,1626,1627],{"class":172},"/",[80,1629,1514],{"class":176},[80,1631,1632,1634],{"class":82,"line":461},[80,1633,1519],{"class":172},[80,1635,186],{"class":176},[80,1637,1638,1641],{"class":82,"line":467},[80,1639,1640],{"class":172},"    default",[80,1642,681],{"class":176},[80,1644,1645,1648,1650,1652,1654,1657,1659,1661],{"class":82,"line":473},[80,1646,1647],{"class":172},"      throw",[80,1649,303],{"class":172},[80,1651,794],{"class":86},[80,1653,797],{"class":176},[80,1655,1656],{"class":90},"`Unknown operation: ${",[80,1658,1400],{"class":176},[80,1660,805],{"class":90},[80,1662,808],{"class":176},[80,1664,1665],{"class":82,"line":484},[80,1666,403],{"class":176},[80,1668,1669],{"class":82,"line":495},[80,1670,1466],{"class":176},[80,1672,1673,1675],{"class":82,"line":501},[80,1674,1317],{"class":172},[80,1676,207],{"class":176},[80,1678,1679],{"class":82,"line":512},[80,1680,1324],{"class":176},[80,1682,1683],{"class":82,"line":518},[80,1684,314],{"class":176},[80,1686,1687,1689,1691],{"class":82,"line":524},[80,1688,1333],{"class":176},[80,1690,733],{"class":90},[80,1692,326],{"class":176},[80,1694,1695,1697,1700,1702,1705,1707,1709,1711,1714,1717,1719],{"class":82,"line":535},[80,1696,1342],{"class":176},[80,1698,1699],{"class":90},"`${",[80,1701,1405],{"class":176},[80,1703,1704],{"class":90},"} ${",[80,1706,1400],{"class":176},[80,1708,1704],{"class":90},[80,1710,1410],{"class":176},[80,1712,1713],{"class":90},"} = ${",[80,1715,1716],{"class":176},"result",[80,1718,805],{"class":90},[80,1720,326],{"class":176},[80,1722,1723],{"class":82,"line":546},[80,1724,343],{"class":176},[80,1726,1727],{"class":82,"line":552},[80,1728,1372],{"class":176},[80,1730,1731],{"class":82,"line":558},[80,1732,1377],{"class":176},[14,1734,1736],{"id":1735},"integrating-with-claude-desktop","Integrating with Claude Desktop",[10,1738,1739],{},"To use your MCP server with Claude Desktop, add it to your configuration file:",[10,1741,1742,1746,1747,1750,1746,1753],{},[1743,1744,1745],"strong",{},"On macOS:"," ",[77,1748,1749],{},"~/Library/Application Support/Claude/claude_desktop_config.json",[1743,1751,1752],{},"On Windows:",[77,1754,1755],{},"%APPDATA%/Claude/claude_desktop_config.json",[70,1757,1761],{"className":1758,"code":1759,"language":1760,"meta":75,"style":75},"language-json shiki shiki-themes github-light github-dark","{\n  \"mcpServers\": {\n    \"my-first-mcp-server\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/your/server.js\"]\n    }\n  }\n}\n","json",[77,1762,1763,1767,1774,1781,1793,1806,1811,1815],{"__ignoreMap":75},[80,1764,1765],{"class":82,"line":83},[80,1766,1022],{"class":176},[80,1768,1769,1772],{"class":82,"line":94},[80,1770,1771],{"class":97},"  \"mcpServers\"",[80,1773,1054],{"class":176},[80,1775,1776,1779],{"class":82,"line":103},[80,1777,1778],{"class":97},"    \"my-first-mcp-server\"",[80,1780,1054],{"class":176},[80,1782,1783,1786,1788,1791],{"class":82,"line":210},[80,1784,1785],{"class":97},"      \"command\"",[80,1787,644],{"class":176},[80,1789,1790],{"class":90},"\"node\"",[80,1792,326],{"class":176},[80,1794,1795,1798,1800,1803],{"class":82,"line":216},[80,1796,1797],{"class":97},"      \"args\"",[80,1799,1157],{"class":176},[80,1801,1802],{"class":90},"\"/path/to/your/server.js\"",[80,1804,1805],{"class":176},"]\n",[80,1807,1808],{"class":82,"line":222},[80,1809,1810],{"class":176},"    }\n",[80,1812,1813],{"class":82,"line":228},[80,1814,403],{"class":176},[80,1816,1817],{"class":82,"line":241},[80,1818,901],{"class":176},[14,1820,1822],{"id":1821},"best-practices","Best Practices",[10,1824,1825],{},"When building MCP servers, keep these best practices in mind:",[1827,1828,1829,1835,1841,1847,1853],"ol",{},[32,1830,1831,1834],{},[1743,1832,1833],{},"Security First",": Always validate inputs and sanitize outputs",[32,1836,1837,1840],{},[1743,1838,1839],{},"Clear Documentation",": Provide comprehensive descriptions for your tools",[32,1842,1843,1846],{},[1743,1844,1845],{},"Error Handling",": Implement robust error handling for all operations",[32,1848,1849,1852],{},[1743,1850,1851],{},"Performance",": Be mindful of response times and resource usage",[32,1854,1855,1858],{},[1743,1856,1857],{},"Logging",": Implement proper logging for debugging and monitoring",[14,1860,1862],{"id":1861},"next-steps","Next Steps",[10,1864,1865],{},"Now that you have a basic MCP server running, you can:",[29,1867,1868,1871,1874,1877,1880],{},[32,1869,1870],{},"Add file system operations",[32,1872,1873],{},"Integrate with external APIs",[32,1875,1876],{},"Implement database connections",[32,1878,1879],{},"Create more complex data processing tools",[32,1881,1882],{},"Build domain-specific functionality",[14,1884,1886],{"id":1885},"conclusion","Conclusion",[10,1888,1889],{},"Building your first MCP server opens up exciting possibilities for AI integration. You've learned the fundamentals and created a working server that can respond to tool calls and provide useful functionality.",[10,1891,1892],{},"The MCP ecosystem is rapidly evolving, and there are many opportunities to create powerful integrations that enhance AI applications. Keep experimenting and building!",[14,1894,1896],{"id":1895},"resources","Resources",[29,1898,1899,1907,1914,1921],{},[32,1900,1901],{},[1405,1902,1906],{"href":1903,"rel":1904},"https://modelcontextprotocol.io/",[1905],"nofollow","MCP Official Documentation",[32,1908,1909],{},[1405,1910,1913],{"href":1911,"rel":1912},"https://github.com/modelcontextprotocol/servers",[1905],"MCP SDK GitHub Repository",[32,1915,1916],{},[1405,1917,1920],{"href":1918,"rel":1919},"https://docs.anthropic.com/claude/docs/mcp",[1905],"Claude Desktop MCP Integration Guide",[32,1922,1923],{},[1405,1924,1927],{"href":1925,"rel":1926},"https://github.com/modelcontextprotocol/servers/tree/main/src",[1905],"MCP Server Examples",[10,1929,1930],{},"Happy building! 🚀",[1932,1933,1934],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":75,"searchDepth":94,"depth":94,"links":1936},[1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949],{"id":16,"depth":94,"text":17},{"id":23,"depth":94,"text":24},{"id":43,"depth":94,"text":44},{"id":64,"depth":94,"text":65},{"id":115,"depth":94,"text":116},{"id":152,"depth":94,"text":153},{"id":943,"depth":94,"text":944},{"id":1003,"depth":94,"text":1004},{"id":1735,"depth":94,"text":1736},{"id":1821,"depth":94,"text":1822},{"id":1861,"depth":94,"text":1862},{"id":1885,"depth":94,"text":1886},{"id":1895,"depth":94,"text":1896},"https://dev.to/debs_obrien/building-your-first-mcp-server-a-beginners-tutorial-5fag","2024-07-03","md",false,null,{"loading":1956},"eager","/blog/building-your-first-mcp-server",{"title":5,"description":12},"blog/building-your-first-mcp-server",[1961,1962],"mcp","ai","dRLqNXun2D8QJPXJZWZu0JBMmJjvAUejhZt-OB4z7hI",[1965,1969],{"title":1966,"path":1967,"stem":1968,"children":-1},"Install Playwright MCP Server in VS Code","/blog/install-playwright-mcp-server-in-vs-code","blog/install-playwright-mcp-server-in-vs-code",{"title":1970,"path":1971,"stem":1972,"children":-1},"Delivering a Talk","/blog/delivering-a-talk","blog/delivering-a-talk",1790839746549]