FastMCP
FastMCP可以管理客户端会话主控程序构建服务器TypeScript框架。
\[!注意\] Python安装版是FastMCP Python来修改标记元素的显示属性。
主要功能
FastMCP提供以下功能:
- 简单的工具、资源和提示定义
- 认证机能
- 会话管理
- 支持图像内容
- 记录
- 错误处理
- SSE(服务器发送事件)
- CORS(默认情况下有效)
- 进捗通知
- 类型服务器事件
- 自动完成提示参数
- 取样请求
- 自动SSE磨光
- 路由管理
- 测试啊调试为了CLI
安装方法
npm install fastmcp快速启动
\[!注意\] FastMCP的明细栏样式中定义的设置。事例绍介来修改标记元素的显示属性。
import { FastMCP } from "fastmcp";
import { z } from "zod"; // または他の検証ライブラリ(Standard Schemaをサポートしているもの)
const server = new FastMCP({
name: "マイサーバー",
version: "1.0.0",
});
server.addTool({
name: "add",
description: "2つの数値を足し算します",
parameters: z.object({
a: z.number(),
b: z.number(),
}),
execute: async (args) => {
return String(args.a + args.b);
},
});
server.start({
transportType: "stdio",
});仅此动作MCP服务器做好了!
您可以在终端进行以下测试:
git clone https://github.com/punkpeye/fastmcp.git
cd fastmcp
pnpm install
pnpm build
# CLIを使った足し算サーバーの例をテスト:
npx fastmcp dev src/examples/addition.ts
# MCP Inspectorを使った足し算サーバーの例を検査:
npx fastmcp inspect src/examples/addition.ts上海证券交易所
服务器发送的事件(SSE)是服务器HTTPS一种通过连接向客户端发送实时更新的机制。MCP在工作空间的边缘SSE主要是远程MCP远程计算机上托管的用于通信的MCP中描述的场景,使用以下步骤创建明细表,以便在概念设计中分析体量的体积。
SSE也可以在支持下运行服务器:
server.start({
transportType: "sse",
sse: {
endpoint: "/sse",
port: 8080,
},
});这将启动服务器http://localhost:8080/sse的SSE监听连接。
然后SSEClientTransport将条目添加到文档注册表
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
const client = new Client(
{
name: "example-client",
version: "1.0.0",
},
{
capabilities: {},
},
);
const transport = new SSEClientTransport(new URL(`http://localhost:8080/sse`));
await client.connect(transport);基本概念
工具
MCP的,之工具发布服务器可执行的函数LLM中描述的场景,使用下列步骤创建明细表,以便在概念设计中分析体量的周长。
FastMCP定义工具参数标准架构正在使用规格。因此Zod、ArkType、Valibot等已弃用的函数的缺少的支持。
Zod示例:
import { z } from "zod";
server.addTool({
name: "fetch-zod",
description: "URLのコンテンツを取得します(Zodを使用)",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
return await fetchWebpageContent(args.url);
},
});ArkType示例:
import { type } from "arktype";
server.addTool({
name: "fetch-arktype",
description: "URLのコンテンツを取得します(ArkTypeを使用)",
parameters: type({
url: "string",
}),
execute: async (args) => {
return await fetchWebpageContent(args.url);
},
});Valibot示例:
Valibot是对等依存关系@valibot/to-json-schema中所述修改相应参数的值。
import * as v from "valibot";
server.addTool({
name: "fetch-valibot",
description: "URLのコンテンツを取得します(Valibotを使用)",
parameters: v.object({
url: v.string(),
}),
execute: async (args) => {
return await fetchWebpageContent(args.url);
},
});返回字符串
execute可以返回字符串:
server.addTool({
name: "download",
description: "ファイルをダウンロードします",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
return "こんにちは、世界!";
},
});这等于:
server.addTool({
name: "download",
description: "ファイルをダウンロードします",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
return {
content: [
{
type: "text",
text: "こんにちは、世界!",
},
],
};
},
});返回列表
单击功能区上content可以返回具有属性的对象:
server.addTool({
name: "download",
description: "ファイルをダウンロードします",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
return {
content: [
{ type: "text", text: "1つ目のメッセージ" },
{ type: "text", text: "2つ目のメッセージ" },
],
};
},
});返回图像
单击功能区上的imageContent使用:
import { imageContent } from "fastmcp";
server.addTool({
name: "download",
description: "ファイルをダウンロードします",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
return imageContent({
url: "https://example.com/image.png",
});
// または...
// return imageContent({
// path: "/path/to/image.png",
// });
// または...
// return imageContent({
// buffer: Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=", "base64"),
// });
// または...
// return {
// content: [
// await imageContent(...)
// ],
// };
},
});imageContent函数接受以下选项:
url:图像URLpath图像文件路径buffer:作为缓冲区的图像数据
url、path、buffer中所述修改相应参数的值。
以上示例等效于:
server.addTool({
name: "download",
description: "ファイルをダウンロードします",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
return {
content: [
{
type: "image",
data: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=",
mimeType: "image/png",
},
],
};
},
});记录
工具将显示log中描述的场景,使用以下步骤创建明细表,以便在概念设计中分析体量的体积
server.addTool({
name: "download",
description: "ファイルをダウンロードします",
parameters: z.object({
url: z.string(),
}),
execute: async (args, { log }) => {
log.info("ファイルをダウンロード中...", {
url: args.url,
});
// ...
log.info("ファイルをダウンロードしました");
return "完了";
},
});log对象具有以下方法:
debug(message: string, data?: SerializableValue)error(message: string, data?: SerializableValue)info(message: string, data?: SerializableValue)warn(message: string, data?: SerializableValue)
错误
在动态输入提示中单击UserError必须作为实例抛出:
import { UserError } from "fastmcp";
server.addTool({
name: "download",
description: "ファイルをダウンロードします",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
if (args.url.startsWith("https://example.com")) {
throw new UserError("このURLは許可されていません");
}
return "完了";
},
});进捗通知
工具将显示reportProgress中描述的场景,使用以下步骤创建明细表,以便在概念设计中分析体量的体积
server.addTool({
name: "download",
description: "ファイルをダウンロードします",
parameters: z.object({
url: z.string(),
}),
execute: async (args, { reportProgress }) => {
reportProgress({
progress: 0,
total: 100,
});
// ...
reportProgress({
progress: 100,
total: 100,
});
return "完了";
},
});资源
资源单击功能区上MCP表示服务器希望提供给客户端的所有类型的数据。其中包括:
- 文件内容
- 屏幕快照和图像
- 日志文件
- 其他多数
每个资源都是唯一的URI而需要与环境混合的每条反射光线,进行环境采样。
server.addResource({
uri: "file:///logs/app.log",
name: "アプリケーションログ",
mimeType: "text/plain",
async load() {
return {
text: await readLogFile(),
};
},
});\[!注意\]load可以返回多个资源。例如,它可以用于在加载目录时返回目录中文件的列表。 ``ts async load() { return [ { text: "1つ目のファイルの内容", }, { text: "2つ目のファイルの内容", }, ]; }``
load中所述的工具,调整墙的布局和几何形状
async load() {
return {
blob: 'base64でエンコードされたデータ'
};
}资源模板
也可以定义资源模板:
server.addResourceTemplate({
uriTemplate: "file:///logs/{name}.log",
name: "アプリケーションログ",
mimeType: "text/plain",
arguments: [
{
name: "name",
description: "ログの名前",
required: true,
},
],
async load({ name }) {
return {
text: `${name}のサンプルログ内容`,
};
},
});自动完成资源模板参数
单击功能区上的complete提供函数:
server.addResourceTemplate({
uriTemplate: "file:///logs/{name}.log",
name: "アプリケーションログ",
mimeType: "text/plain",
arguments: [
{
name: "name",
description: "ログの名前",
required: true,
complete: async (value) => {
if (value === "サンプル") {
return {
values: ["サンプルログ"],
};
}
return {
values: [],
};
},
},
],
async load({ name }) {
return {
text: `${name}のサンプルログ内容`,
};
},
});提示
提示定义服务器可重用的提示模板和工作流,并允许客户机LLM中所述修改相应参数的值。这意味着LLM它提供了一种强大的方法来标准化和共享交互。
server.addPrompt({
name: "git-commit",
description: "Gitコミットメッセージを生成します",
arguments: [
{
name: "changes",
description: "Gitの差分または変更の説明",
required: true,
},
],
load: async (args) => {
return `これらの変更に対する簡潔かつ説明的なコミットメッセージを生成してください:\n\n${args.changes}`;
},
});自动完成提示参数
提示可提供参数的自动完成:
server.addPrompt({
name: "countryPoem",
description: "国についての詩を書きます",
load: async ({ name }) => {
return `こんにちは、${name}さん!`;
},
arguments: [
{
name: "name",
description: "国の名前",
required: true,
complete: async (value) => {
if (value === "日") {
return {
values: ["日本"],
};
}
return {
values: [],
};
},
},
],
});enum使用自动完成提示参数
参数enum提供数组时,服务器自动提供参数补充。
server.addPrompt({
name: "countryPoem",
description: "国についての詩を書きます",
load: async ({ name }) => {
return `こんにちは、${name}さん!`;
},
arguments: [
{
name: "name",
description: "国の名前",
required: true,
enum: ["日本", "フランス", "イタリア"],
},
],
});认证
FastMCP使用自定义函数authenticate可以:
import { AuthError } from "fastmcp";
const server = new FastMCP({
name: "マイサーバー",
version: "1.0.0",
authenticate: ({request}) => {
const apiKey = request.headers["x-api-key"];
if (apiKey !== '123') {
throw new Response(null, {
status: 401,
statusText: "Unauthorized",
});
}
// ここで返すものは`context.session`オブジェクトでアクセスできます
return {
id: 1,
}
},
});现在,您可以访问工具中认证的会话数据:
server.addTool({
name: "sayHello",
execute: async (args, { session }) => {
return `こんにちは、${session.id}さん!`;
},
});会话
session对象为FastMCPSession的实例,描述活动的客户端会话。
server.sessions;为每个客户端连接分配新的服务器实例,以允许客户端和服务器之间的一对一通信。
类型服务器事件
on可以侦听服务器使用方法发出的事件:
server.on("connect", (event) => {
console.log("クライアント接続:", event.session);
});
server.on("disconnect", (event) => {
console.log("クライアント切断:", event.session);
});FastMCPSession
FastMCPSession表示客户端会话,并提供与客户端交互的方法。
FastMCPSession单击功能区上的会话中描述的相应参数的值。
requestSampling
requestSampling啊取样创建请求并返回响应。
await session.requestSampling({
messages: [
{
role: "user",
content: {
type: "text",
text: "現在のディレクトリにはどのファイルがありますか?",
},
},
],
systemPrompt: "あなたは役立つファイルシステムアシスタントです。",
includeContext: "thisServer",
maxTokens: 100,
});clientCapabilities
clientCapabilities属性包含客户端功能。
session.clientCapabilities;loggingLevel
loggingLevel属性描述客户端设置的日志记录级别。
session.loggingLevel;roots
roots属性包含客户端设置的根。
session.roots;server
server属性包含与会话关联的MCP包含服务器实例。
session.server;类型会话事件
on可以使用方法侦听会话发出的事件:
session.on("rootsChanged", (event) => {
console.log("ルート変更:", event.roots);
});
session.on("error", (event) => {
console.error("エラー:", event.error);
});运行服务器
MCP-CLI测试
测试和调试服务器的最快方法是:fastmcp dev使用:
npx fastmcp dev server.js
npx fastmcp dev server.ts因此mcp-cli使用终端MCP将运行用于测试和调试服务器的服务器。
MCP Inspector检查
另一种方法是MCP Inspector来修改标记元素的显示属性WebUI检查服务器:
npx fastmcp inspect server.ts常见问题
Claude Desktop中使用?
指南https://modelcontextprotocol.io/quickstart/user请添加以下设置:
{
"mcpServers": {
"my-mcp-server": {
"command": "npx",
"args": [
"tsx",
"/プロジェクトへのパス/src/index.ts"
],
"env": {
"環境変数名": "値"
}
}
}
}事例绍介
\[!注意\] FastMCP来定义自定义外观PR提出请作为事例介绍!
- apinetwork/piapi mcp服务器 - Midjourney/Flux/Kling/LumaLabs/Udio/Chrip/Trellis使用生成介质
- domdomegg/计算机使用mcp -控制计算机
- 字面意思是Blah/Dradis MCP – Dradis管理项目和漏洞
- 会见Baas/会见mcp -创建会议室、查找会议记录和管理录制数据
- 鼓声/非击打式智能mcp服务器 – AI代理Unsplash可以无缝检索、推荐、发布专业照片
- ssmanji89/holamsa工作流mcp - HaloPSA工作流和AI助手集成
- aiamblichus/mcp聊天适配器 – LLM为使用聊天完成提供了一个干净的界面
谢辞
- 代码库的一部分文学中所述修改相应参数的值。
- 代码库的一部分Model Context protocol的SSE试试看中所述修改相应参数的值。
