Hono MCP服务器

将Hono API端点暴露为MCP工具,支持输入输出模式验证和动态API交互。

  • by mattzcarey
  • TypeScript
  • 本地部署
  • 86 星标
  • 更新于
在 GitHub 查看 mattzcarey/hono-mcp-server

使用说明

适用于Hono的MCP服务器

暴露你的 荣誉 API端点为 主控程序 工具。

用法

import { Hono } from "hono";
import { z } from "zod";
import { mcp, registerTool } from "hono-mcp-server";

const app = new Hono()
  .get("/users", registerTool("List all users"), (c) => c.json([{ id: 1, name: "Alice" }]))
  .get("/users/:id", registerTool("Get user by ID"), (c) => c.json({ id: c.req.param("id") }))
  .post(
    "/users",
    registerTool({
      description: "Create a new user",
      inputSchema: {
        name: z.string().describe("User's full name"),
        email: z.string().email().describe("User's email address"),
      },
    }),
    async (c) => {
      const { name } = c.req.valid("json"); // typed!
      return c.json({ id: 1, name });
    },
  );

export default mcp(app, {
  name: "Users API",
  version: "1.0.0",
});

这增加了一个 /mcp 端点,将您的路由作为MCP工具公开。

输入和输出模式

使用 registerTool() 随着 inputSchema 用于经过验证的键入输入。通过以下方式访问已验证的数据 c.req.valid('json'):

import { z } from "zod";
import { registerTool } from "hono-mcp-server";

app.post(
  "/search",
  registerTool({
    description: "Search for items",
    inputSchema: {
      query: z.string().describe("Search query"),
      limit: z.number().optional().describe("Max results"),
    },
    outputSchema: {
      results: z.array(z.object({ id: z.string(), title: z.string() })),
    },
  }),
  async (c) => {
    const { query, limit } = c.req.valid("json"); // typed!
    return c.json({ results: [] });
  },
);

当 outputSchema 如果定义了,该工具将返回MCP客户端可以解析的结构化内容。

选项

mcp(app, {
  name: "API Name", // required
  version: "1.0.0", // required
  description: "...", // optional
  instructions: "...", // optional
  mcpPath: "/mcp", // optional, default: "/mcp"
  codemode: false, // optional, see below
});

编码模式

codemode不是将单个路由作为工具公开,而是公开 search 和 execute 用于动态API交互的工具。需要 Cloudflare工作加载器.

export default mcp(app, {
  name: "API",
  version: "1.0.0",
  codemode: true,
});
// wrangler.jsonc
{
  "worker_loaders": [{ "binding": "LOADER" }],
}