MCP服务器构建库

一个用于构建MCP(Model Context Protocol)服务器的TypeScript库,支持Cloudflare Workers和Node.js,提供多种认证策略和加密存储功能。

  • by fuongz
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 fuongz/phake-mcp

使用说明

@phake/mcp

用于构建的TypeScript库 MCP(模型上下文协议) 服务器-适用于Cloudflare Workers和Node.js。


为什么是@phake/mcp?

  • 多种身份验证策略:OAuth 2.1,Google/GitHub预设,承载,API密钥,自定义头
  • 加密令牌存储:AES-256-GCM处于静止状态+主动刷新
  • Cloudflare Workers本机:KV存储、内存回退、零配置
  • 生产就绪:CIMD验证、OAuth发现、DNS重新绑定保护
  • 快速脚手架: bun create @phake/mcp 开始吧

看 比较指南 与官方SDK进行全功能比较。


需求

  • 包子 1.x或Node.js 20+
  • 牧马人 CLI(用于Cloudflare Workers部署)
  • 具有Workers和KV访问权限的Cloudflare帐户(用于Worker部署)

安装

bun add @phake/mcp
# or
npm install @phake/mcp

快速启动(脚手架)

使用一个命令构建新的MCP服务器:

# Interactive (prompts for template)
bun create @phake/mcp

# With options
bun create @phake/mcp my-mcp-app --template cloudflare-workers --install

可用模板:

模板 说明
cloudflare-workers Cloudflare Workers+Hono(默认)
cloudflare-workers-google Cloudflare Workers+谷歌OAuth
node-hono Node.js+Bun+Hono

选项:

选项 描述
-t, --template 模板名称
-i, --install 自动安装依赖项
-p, --pm 包管理器: npm, bun, yarn, pnpm

入门指南

1.创建KV命名空间

wrangler kv namespace create TOKENS

2.将其绑定到Wrangler配置中

wrangler.toml

[[kv_namespaces]]
binding = "TOKENS"
id = "<your-kv-namespace-id>"

3.生成加密密钥

openssl rand -base64 32 | tr '+/' '-_' | tr -d '='

4.设置加密密钥

生产:

wrangler secret put RS_TOKENS_ENC_KEY

本地开发 -添加到 .dev.vars:

RS_TOKENS_ENC_KEY=<your-generated-key>

5.创造你的工人

import { createMCPServer } from "@phake/mcp";

const server = createMCPServer({
  adapter: "worker",
  tools: [/* your tools */],
});

export default server;

有关详细设置,请参阅 入门指南.


用法

定义工具

import { z } from "zod";
import { defineTool } from "@phake/mcp";

const greetTool = defineTool({
  name: "greet",
  description: "Returns a greeting for the given name",
  inputSchema: z.object({
    name: z.string().describe("Name to greet"),
  }),
  outputSchema: z.object({
    message: z.string().describe("The greeting message"),
  }),
  handler: async (args) => {
    return { message: `Hello, ${args.name}!` };
  },
});

经过身份验证的工具

const profileTool = defineTool({
  name: "get_profile",
  description: "Fetch the authenticated user's profile",
  inputSchema: z.object({}),
  requiresAuth: true,
  handler: async (_args, context) => {
    const response = await fetch("https://api.example.com/me", {
      headers: context.resolvedHeaders,
    });
    return await response.json();
  },
});

Cloudflare绑定

在您的工具中访问Cloudflare worker绑定(AI、Vectorize、D1、R2、KV等):

import { createMCPServer, defineTool, type ToolContext } from "@phake/mcp";

interface Env extends Cloudflare.Env {
  AI: unknown;
  VECTORIZE: unknown;
  MY_BUCKET: unknown;
}

const searchTool = defineTool({
  name: "search_vectors",
  inputSchema: z.object({ query: z.string() }),
  handler: async (args, context: ToolContext<Env>) => {
    // Type-safe access to bindings
    const ai = context.bindings?.AI;
    const vectorize = context.bindings?.VECTORIZE;
    
    return {
      content: [{
        type: "text",
        text: `AI: ${!!ai}, Vectorize: ${!!vectorize}`
      }]
    };
  },
});

const server = createMCPServer<Env>({
  tools: [searchTool],
});

获取用户信息(OAuth)

使用从OAuth提供程序获取用户配置文件 context.getUser():

const userTool = defineTool({
  name: "get_user_info",
  requiresAuth: true,
  inputSchema: z.object({}),
  handler: async (_, context) => {
    // Get token with error handling
    const { data: token, error: tokenError } = context.getToken();
    if (tokenError || !token) {
      return { content: [{ type: "text", text: tokenError }], isError: true };
    }

    // Get user info with error handling
    const { data, error } = await context.getUser();
    if (error || !data) {
      return { content: [{ type: "text", text: error }], isError: true };
    }

    return {
      content: [{
        type: "text",
        text: JSON.stringify({ email: data.email, name: data.name })
      }]
    };
  },
});

这 getUser() 方法根据以下内容自动检测提供者 AUTH_STRATEGY:

  • google → https://www.googleapis.com/oauth2/v2/userinfo
  • github → https://api.github.com/user

身份验证策略

策略 描述
oauth 使用RS令牌的完整OAuth 2.1 PKCE流=>提供者令牌映射
google 与OAuth相同,具有Google预设端点
github 与OAuth相同,具有GitHub预设端点
bearer 静态承载令牌
api_key 通过标头的静态API密钥
custom 任意自定义标题
none 无身份验证

看 身份验证指南 详细配置。


API 参考

createMCPServer(options)

创建MCP服务器实例。

const server = createMCPServer({
  adapter: "worker",
  tools: [greetTool, profileTool],
});

defineTool(def)

类型安全工具厂。看 API 参考 以获取完整的字段参考。

toolFail(defaults)

创建具有预设默认字段的键入错误工厂:

const fail = toolFail({ ok: false, items: null });
return fail("spreadsheet_id is required");
// => { ok: false, items: null, error: "spreadsheet_id is required" }

内置工具

工具 输入 输出 描述
echo { message, uppercase? } { echoed, length } 回复一条消息
health { verbose? } { status, timestamp, runtime, uptime? } 报告服务器运行状况

包装出口

导出 路径 描述
核心 @phake/mcp defineTool, createMCPServer,助手
Worker运行时 @phake/mcp/runtime/worker Cloudflare Workers适配器
节点运行时 @phake/mcp/runtime/node Node.js适配器(实验性的)

贡献

# Install dependencies
bun install

# Run tests
bun test

# Type check
bun run typecheck

# Build
bun run build

许可证

麻省理工学院