NullShot字体脚本MCP模板
用于为空镜头/类型脚本代理框架引导MCP(模型上下文协议)的模板存储库。
入门指南
设置存储库
选项A:使用nullshot cli
您可以按照以下交互式提示创建新项目:
npx @nullshot/cli create mcp选项B:使用部署到cloudflare按钮
以下按钮将在您的组织中创建一个新的仓库,并使用Cloudflare设置CI/CD:

*注意:配置只需要 npm run deploy 使Deploy命令工作*
选项C:Github模板
- 单击此存储库顶部的“使用此模板”按钮
- 克隆您的新存储库
以上内容将使用以下网址来增强与无服务器cloudflare兼容的MCP服务器:
- /ws-Websocket连接端点
- /sse-sse连接端点
特性
- WebSocket客户端支持:包括官方 WebSocket客户端 用于实时双向通信
- SSE客户支持:包括 服务器发送事件客户端 用于服务器到客户端流式传输
- MCP检查员:在开发过程中调试和监控MCP
- Cloudflare员工集成:基于Cloudflare Workers构建边缘计算功能
- 集成测试套件:Websocket和SSE测试工具,用于与本地微眩光服务(D1/KV/等)进行完全集成测试,以便于测试功能而无需模拟。
可用脚本
pnpm run dev:同时运行MCP检查器(端口6274)和Cloudflare Worker(端口8787)pnpm start:仅运行Cloudflare Worker(端口8787)pnpm test:使用Vitest运行测试pnpm run deploy:将您的MCP部署到Cloudflare Workerspnpm run cf-typegen:为Cloudflare Workers生成TypeScript类型(每次向wrangler.json添加新更改时都运行此操作)
使用概述
有两种方法可以利用在有和没有Hono的情况下运行MCP服务器来进行请求路由。
环境设置
您可以选择创建 .dev.vars 这将引导本地 环境变量 或 秘密.
当你奔跑时 pnpm cf-typegen 它生成 worker-configuration.d.ts 这创造了一个 Env 类,以便您的代码访问cloudflare绑定、env-vars等。
McpHonoServerDO实现
默认情况下,模板使用 McpHonoServerDO 它将MCP服务器与 荣誉,一个快速轻量级的web框架。这提供了一个干净的路由系统和中间件功能。
使用Hono自定义路线
使用添加自定义HTTP端点 McpHonoServerDO,延长 setupRoutes 方法:
export class ExampleMcpServer extends McpHonoServerDO {
// Other methods...
protected setupRoutes(app: Hono): void {
// Call the parent implementation to set up MCP routes
super.setupRoutes(app);
// Add your custom routes
app.get('/api/status', (c) => {
return c.json({ status: 'ok' });
});
app.post('/api/data', async (c) => {
const body = await c.req.json();
// Process data
return c.json({ success: true });
});
}
}McpServerDO实现(原生Cloudflare路由)
如果您需要对HTTP请求处理进行更多控制,可以直接扩展 McpServerDO 相反。这使您可以完全控制 fetch 方法:
export class CustomMcpServer extends McpServerDO {
// Required abstract method implementations
getImplementation(): Implementation {
return {
name: 'CustomMcpServer',
version: '1.0.0',
};
}
configureServer(server: McpServer): void {
setupServerTools(server);
setupServerResources(server);
setupServerPrompts(server);
}
// Override the fetch method for complete control over routing
async fetch(request: Request): Promise {
const url = new URL(request.url);
const path = url.pathname;
// Handle custom routes
if (path === '/api/custom') {
return new Response(JSON.stringify({ custom: true }), {
headers: { 'Content-Type': 'application/json' }
});
}
// Pass through MCP-related requests to the parent implementation
return super.fetch(request);
}
}当您需要以下情况时,这种方法很有用:
- 使用自定义逻辑处理特定路线
- 实施复杂的中间件或身份验证
- 在请求到达MCP处理程序之前拦截或修改请求
- 在标准MCP实现之外添加自定义WebSocket或SSE端点
创建工具、资源和提示
主服务器实现在 src/server.ts 并延伸 McpHonoServerDO:
export class ExampleMcpServer extends McpHonoServerDO {
// Required abstract method implementation
getImplementation(): Implementation {
return {
name: 'ExampleMcpServer',
version: '1.0.0',
};
}
// Configure server by adding tools, resources, and prompts
configureServer(server: McpServer): void {
setupServerTools(server);
setupServerResources(server);
setupServerPrompts(server);
}
}要添加功能,请使用以下模块:
- 工具 (
src/tools.ts):定义客户端可以调用的函数
export function setupServerTools(server: McpServer) {
server.tool(
'tool_name', // Name of the tool
'Tool description', // Description
{ // Parameters schema using zod
param1: z.string().describe('Parameter description'),
},
async ({ param1 }) => {
// Tool implementation
return {
content: [
{
type: "text",
text: `Result: ${param1}`
}
]
};
}
);
}- 资源 (
src/resources.ts):定义客户端可以访问的持久资源
export function setupServerResources(server: McpServer) {
server.resource(
'resource_name',
'resource://path/{id}',
async (uri: URL) => {
// Resource implementation
return {
contents: [
{
text: `Resource data`,
uri: uri.href
}
]
};
}
);
}- 提示 (
src/prompts.ts):定义提示模板
export function setupServerPrompts(server: McpServer) {
server.prompt(
'prompt_name',
'Prompt description',
() => ({
messages: [{
role: 'assistant',
content: {
type: 'text',
text: `Your prompt text here`
}
}]
})
);
}示例
- CRUD MCP示例 -利用D1数据库
- MCP费用示例 -利用工作流
- 非独立代理人 -具有MCP依赖关系的AI代理
相关资源
核心包
- MCP包:具有高级功能和测试实用程序的核心MCP实现
- TypeScript代理框架:使用代理框架构建由LLM驱动的智能代理
文档
社区
加入我们的社区,获得帮助,分享想法,并为项目做出贡献:
- Discord 的中文翻译是“不和谐”或“纷争”。:加入
#typescript-framework功能请求、支持和讨论渠道
贡献
我们欢迎为改进此模板做出贡献!以下是您如何做出贡献:
- 复刻仓库:创建一个fork来进行更改
- 创建分支:在新分支中进行更改
git checkout -b feature/your-feature-name- 提交您的更改:做出有意义的承诺
git commit -m "Add feature: brief description"- 推你的叉子:将更改推到叉子上
git push origin feature/your-feature-name- 创建pull请求:打开一个PR,详细描述您的更改
拉取请求指南
- 为你的公关提供一个清晰、描述性的标题
- 包括你的公关工作的详细描述
- 参考任何相关问题
- 包括截图或示例(如适用)
- 确保所有测试通过
- 让PR专注于单个功能或修复
对于较大的更改或功能,我们建议先在我们的Discord频道中讨论它们,以确保与项目方向保持一致。
或者使用上面的Deploy to Cloudflare按钮直接从GitHub进行部署。
