本地MCP服务器

一个用于创建和管理本地MCP服务器的工具,支持资源定义、提示翻译和工具计算等功能。

  • by 7nohe
  • JavaScript
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 7nohe/local-mcp-server-tutorial

使用说明

本地MCP服务器教程

本地MCP创建服务器的教程。

事前准备

  • Node.js(v22)想定)
  • Claude Desktop或其他MCP客户机

教程

1.项目创建

npx giget@latest gh:7nohe/local-mcp-server-tutorial my-mcp-server
cd my-mcp-server
npm install
git init
git branch -M main
git add .
git commit -m "Initial commit"

2. TypeScript构建并运行代码

小于等于src/index.ts中描述的场景,使用下列步骤创建明细表,以便在概念设计中分析体量的周长。

#!/usr/bin/env node
async function main() {
  console.error("Hello, world!");
}

main().catch((error) => {
  console.error("Fatal error in main():", error);
  process.exit(1);
});
npm run build
./dist/index.js
# Hello, world!

[!注意] package.json的,之bin属性设置node_modules/.bin/以下创建符号链接,./dist/index.js中所述修改相应参数的值。

3.安装所需的库

npm install @modelcontextprotocol/sdk zod

4. MCP服务器实施

#!/usr/bin/env node
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

// MCPサーバーのインスタンスを作成します。
const server = new McpServer({
  name: "my-mcp-server",
  version: "1.0.0",
  capabilities: {
    resources: {},
    tools: {},
  },
});

async function main() {
  const transport = new StdioServerTransport();
  // Resources

  // Hello, world!を返すResourceを定義します。
  server.resource(
    "Greeting",
    "greeting://hello",
    (uri, { }) => {
      console.log(uri)
      return {
        contents: [
          {
            uri: uri.href,
            text: "Hello, world!",
          }
        ]
      }
    })

  // 動的なResourceにはResourceTemplateクラスを使用します。
  // listオプションはこのテンプレートにマッチする全てのResourcesをリストするためのコールバックです。ResourceTemplateを使用する場合はundefinedでも指定する必要があります。
  server.resource(
    "Greeting with name",
    new ResourceTemplate("greeting://hello/{name}", {
      // listは
      list: async () => {
        // 例えばここでAPIを叩いてユーザー一覧を取得することができます。
        await setTimeout(() => { }, 1000);
        // ここではダミーのデータを返します。
        return {
          resources:
            [
              { name: "Alice", uri: "greeting://hello/Alice" },
              { name: "Bob", uri: "greeting://hello/Bob" },
              { name: "Charlie", uri: "greeting://hello/Charlie" },
            ]
        }
      },
    }),
    (uri, { name }) => {
      return {
        contents: [
          {
            uri: uri.href,
            text: `Hello, ${name}!`,
          }
        ]
      }
    })

    // Prompts
  server.prompt(
    "Japanese Translation",
    {
      englishText: z.string().describe("翻訳する英語のテキスト"),
    },
    ({ englishText }) => ({
      messages: [{
        role: 'user',
        content: {
          type: 'text',
          text: `あなたはプロの翻訳者です。次のテキストを日本語に翻訳してください: ${englishText}`,
        }
      }]
    }));


  // Tools
  server.tool(
    "calculate-bmi",
    "BMIの計算を行います",
    {
      weightKg: z.number().describe("体重(kg)"),
      heightM: z.number().describe("身長(m)"),
    },
    ({ weightKg, heightM }) => {
      return {
        content: [
          {
            type: "text",
            text: String(weightKg / (heightM * heightM)),
          }
        ]
      }
    })

  server.connect(transport);
  console.error("my-mcp-server started");
}

main().catch((error) => {
  console.error("Fatal error in main():", error);
  process.exit(1);
});

5.调试

Inspector中所述修改相应参数的值。

npx @modelcontextprotocol/inspector ./dist/index.js

http://127.0.0.1:6274在浏览器中打开时定义的Resources屋脊Tools查看项目中可用的所有族。

[!注意] 如果每次构建命令都很麻烦的话npm run watch中描述的场景,使用以下步骤创建明细表,以便在概念设计中分析体量的体积。

下一个Claude Desktop中所述修改相应参数的值。 Settings -> Developer -> Edit Config从…开始claude_desktop_config.json在编辑器中打开,设置为:。

{
  "mcpServers": {
    "my-mcp-server": {
      "command": "/<Projectまでの絶対パス>/my-mcp-server/dist/index.js"
    }
  }
}

保存后Claude Desktop重新启动。

Tools从按钮确认一览Attach from MCP按钮Resource屋脊Prompt的明细栏样式中定义的设置。

6.公开包装

npm login
npm publish

[!注意] npm publish时package.json的,之name打开username/my-mcp-server这样的话,如果是自己制作的包装的话就容易理解了。

[!警告] npm包装一旦公开就很难删除,所以要慎重公开。

要点:

  • package.json的,之scripts.prepublishOnly如果您想要发送文档作为只读文件,请选择npm publish中所述修改相应参数的值。
  • package.json的,之bin将属性设置为:CLI中所述修改相应参数的值。
"bin": "./dist/index.js"
  • package.json的,之files将属性设置为:dist只公开文件夹。
"files": [
  "dist"
]

7.公开了MCP运行服务器

Claude Desktop将条目添加到文档注册表。

"my-mcp-server": {
  "command": "npx",
  "args": [
    "@your-name/my-mcp-server@latest"
  ]
}