# 用 Deno 构建 MCP Server

MCP Server 把工具、资源与 prompt 通过协议暴露给 AI 客户端。Deno 很适合运行本地 stdio server：单文件 TypeScript、明确权限、无需单独编译。

```bash
deno add npm:@modelcontextprotocol/sdk npm:zod
```

```ts title="mcp_server.ts"
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const server = new McpServer({ name: "project-info", version: "1.0.0" });

server.registerTool(
  "read_project_note",
  {
    description: "Read one approved note by its short name",
    inputSchema: { name: z.string().regex(/^[a-z0-9-]+$/) },
  },
  async ({ name }) => ({
    content: [{
      type: "text",
      text: await Deno.readTextFile(`./notes/${name}.md`),
    }],
  }),
);

await server.connect(new StdioServerTransport());
```

客户端配置只授予 notes 目录读取权限：

```json
{
  "mcpServers": {
    "project-info": {
      "command": "deno",
      "args": ["run", "--allow-read=./notes", "mcp_server.ts"]
    }
  }
}
```

<Callout type="warn" title="stdio 的 stdout 是协议通道">
不要向 stdout 打印调试日志；它会破坏 JSON-RPC。日志写 stderr，并确保不包含工具参数中的秘密。
</Callout>

远程 server 优先使用 Streamable HTTP；旧 HTTP+SSE transport 只用于兼容。公开部署时还要实现认证、Origin/DNS rebinding 防护、速率限制与每次调用的授权判断。

官方参考：[Deno MCP server example](https://docs.deno.com/examples/mcp_server/)、[MCP TypeScript SDK server](https://ts.sdk.modelcontextprotocol.io/server)、[Model Context Protocol](https://modelcontextprotocol.io/docs/)。
