Daily Tech Briefing
AI 科技速览

每天 5 分钟内学习 AI。获取最新的人工智能新闻,理解其重要性,并学习如何将其应用于您的工作。

AI 快讯
Dev.to AI · 2026/7/28 06:12:03

Building an MCP Server with TypeScript from Scratch

AI 中文解读
这篇新闻的核心亮点是:一位开发者手把手教你用TypeScript从零搭建一个真正可用的MCP服务器,而且直接解决了官方文档“照抄没用、深入看又太啰嗦”的尴尬。 通俗来说,MCP(模型上下文协议)就像给AI大模型装上了“万能遥控器”,让AI能自己调用外部工具、读取文件、执行命令。这篇文章不仅教你怎么写代码,还特别提醒了一个致命坑:如果用标准输出(stdout)传数据,哪怕一行打印日志都会让整个通讯“死机”——必须用错误输出(stderr)才能正常工作。这个细节几乎每个初学者都会踩,作者直接把它放在了最前面。 实际影响:对于普通用户,这项技术意味着未来你用的AI助手将不再只是“聊天机器”,而是能帮你订票、查数据库、写代码并自动运行的工具集。而开发者学会了这个MCP服务器搭建方法,就能为各类AI平台开发插件或服务,让AI真正变成你工作流中的自动化“员工”。整个过程不需要高深框架,但讲究细节,这篇文章正好填补了官方文档的空白。
<p>The Model Context Protocol (MCP) has a fragmentation problem in its documentation: most examples are either too minimal to be useful, or they bury the key concepts under framework boilerplate. This article walks through building a real MCP server in TypeScript — one that implements all three primitives (Tools, Resources, Prompts) and runs over both stdio and HTTP transport.</p> <p>The code is production-shaped, not toy-shaped. By the end you'll understand not just what to write, but why each piece is the way it is.</p> <h2> The One Thing You Must Know About stdio </h2> <p>Before any code: if you use stdio transport, <strong>all logging must go to <code>stderr</code></strong>. Not <code>console.log</code> — <code>console.error</code>.</p> <p>stdio transport uses <code>stdout</code> as the protocol channel for JSON-RPC frames. A single <code>console.log</code> corrupts the frame and causes host parsing failures. The SDK won't warn you. The host just silently breaks.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight typescript"><code><span class="c1">// ✅ correct</span> <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="dl">'</span><span class="s1">Server started</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// ❌ corrupts the JSON-RPC channel</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Server started</span><span class="dl">'</span><span class="p">);</span> </code></pre> </div> <p>This trips up almost everyone the first time. Now you know.</p> <h2> Project Setup </h2> <p>An MCP server runs as an independent process — it doesn't share a process with your existing web server. Create a dedicated package:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight json"><code><span class="p">{</span><span class="w"> </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"@ts-ai/mcp-server"</span><span class="p">,</span><span class="w"> </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.0.0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"module"</span><span class="p">,</span><span class="w"> </span><span class="nl">"bin"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"ts-ai-mcp"</span><span class="p">:</span><span class="w"> </span><span class="s2">"./dist/index.js"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"scripts"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"dev"</span><span class="p">:</span><span class="w"> </span><span class="s2">"tsx watch src/index.ts"</span><span class="p">,</span><span class="w"> </span><span class="nl">"build"</span><span class="p">:</span><span class="w"> </span><span class="s2">"tsc"</span><span class="p">,</span><span class="w"> </span><span class="nl">"inspect"</span><span class="p">:</span><span class="w"> </span><span class="s2">"npx @modelcontextprotocol/inspector node dist/index.js"</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nl">"dependencies"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"@modelcontextprotocol/sdk"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^1.29.0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"zod"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^3.23.0"</span><span class="
分享
阅读原文