mirror of
https://github.com/Lydanne/spaceflow.git
synced 2026-03-11 19:52:45 +08:00
chore: 初始化仓库
This commit is contained in:
29
templates/mcp/README.md.hbs
Normal file
29
templates/mcp/README.md.hbs
Normal file
@@ -0,0 +1,29 @@
|
||||
# @spaceflow/{{kebabName}}
|
||||
|
||||
{{name}} MCP 工具插件
|
||||
|
||||
## 使用方法
|
||||
|
||||
该插件通过 `spaceflow mcp` 命令自动发现并注册 MCP 工具。
|
||||
|
||||
```bash
|
||||
# 启动 MCP Server(包含所有已安装插件的工具)
|
||||
spaceflow mcp
|
||||
|
||||
# 使用 Inspector 调试
|
||||
spaceflow mcp --inspector
|
||||
```
|
||||
|
||||
## 提供的工具
|
||||
|
||||
- **{{kebabName}}_hello** — 示例工具,返回问候信息
|
||||
|
||||
## 开发
|
||||
|
||||
```bash
|
||||
# 构建
|
||||
spaceflow build
|
||||
|
||||
# 开发模式
|
||||
spaceflow dev
|
||||
```
|
||||
26
templates/mcp/package.json.hbs
Normal file
26
templates/mcp/package.json.hbs
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"name": "@spaceflow/{{kebabName}}",
|
||||
"version": "1.0.0",
|
||||
"description": "Spaceflow {{name}} MCP 工具插件",
|
||||
"main": "./dist/index.js",
|
||||
"type": "module",
|
||||
"spaceflow": {
|
||||
"commands": ["."]
|
||||
},
|
||||
"scripts": {
|
||||
"build": "spaceflow build",
|
||||
"dev": "spaceflow dev"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"spaceflow": "workspace:*",
|
||||
"@nestjs/common": "catalog:",
|
||||
"@nestjs/config": "catalog:",
|
||||
"@nestjs/swagger": "catalog:",
|
||||
"nest-commander": "catalog:",
|
||||
"class-validator": "catalog:",
|
||||
"class-transformer": "catalog:"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "catalog:"
|
||||
}
|
||||
}
|
||||
22
templates/mcp/src/__name__.mcp.ts.hbs
Normal file
22
templates/mcp/src/__name__.mcp.ts.hbs
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* {{pascalName}} MCP 服务
|
||||
* 提供 {{name}} 相关的 MCP 工具
|
||||
*/
|
||||
|
||||
import { McpServer, McpTool } from "@spaceflow/core";
|
||||
import { {{pascalName}}Service } from "./{{kebabName}}.service";
|
||||
import { {{pascalName}}HelloInput } from "./dto/mcp.dto";
|
||||
|
||||
@McpServer({ name: "{{kebabName}}-mcp", version: "1.0.0", description: "{{name}} MCP 工具" })
|
||||
export class {{pascalName}}Mcp {
|
||||
constructor(private readonly {{camelName}}Service: {{pascalName}}Service) {}
|
||||
|
||||
@McpTool({
|
||||
name: "{{kebabName}}_hello",
|
||||
description: "示例工具:返回问候信息",
|
||||
dto: {{pascalName}}HelloInput,
|
||||
})
|
||||
async hello(input: {{pascalName}}HelloInput) {
|
||||
return this.{{camelName}}Service.hello(input.name, input.lang);
|
||||
}
|
||||
}
|
||||
9
templates/mcp/src/__name__.module.ts.hbs
Normal file
9
templates/mcp/src/__name__.module.ts.hbs
Normal file
@@ -0,0 +1,9 @@
|
||||
import { Module } from "@spaceflow/core";
|
||||
import { {{pascalName}}Mcp } from "./{{kebabName}}.mcp";
|
||||
import { {{pascalName}}Service } from "./{{kebabName}}.service";
|
||||
|
||||
@Module({
|
||||
providers: [{{pascalName}}Service, {{pascalName}}Mcp],
|
||||
exports: [{{pascalName}}Mcp],
|
||||
})
|
||||
export class {{pascalName}}Module {}
|
||||
19
templates/mcp/src/__name__.service.ts.hbs
Normal file
19
templates/mcp/src/__name__.service.ts.hbs
Normal file
@@ -0,0 +1,19 @@
|
||||
import { Injectable } from "@spaceflow/core";
|
||||
|
||||
export interface HelloResult {
|
||||
readonly message: string;
|
||||
readonly timestamp: string;
|
||||
}
|
||||
|
||||
/** {{pascalName}} 业务逻辑服务 */
|
||||
@Injectable()
|
||||
export class {{pascalName}}Service {
|
||||
/** 生成问候信息 */
|
||||
hello(name: string, lang: string = "zh"): HelloResult {
|
||||
const message = lang === "en" ? `Hello, ${name}!` : `你好,${name}!`;
|
||||
return {
|
||||
message,
|
||||
timestamp: new Date().toISOString(),
|
||||
};
|
||||
}
|
||||
}
|
||||
18
templates/mcp/src/dto/mcp.dto.ts.hbs
Normal file
18
templates/mcp/src/dto/mcp.dto.ts.hbs
Normal file
@@ -0,0 +1,18 @@
|
||||
import {
|
||||
ApiProperty,
|
||||
ApiPropertyOptional,
|
||||
IsString,
|
||||
IsOptional,
|
||||
} from "@spaceflow/core";
|
||||
|
||||
/** {{pascalName}} hello 工具输入参数 */
|
||||
export class {{pascalName}}HelloInput {
|
||||
@ApiProperty({ description: "用户名称" })
|
||||
@IsString()
|
||||
name!: string;
|
||||
|
||||
@ApiPropertyOptional({ description: "问候语言(zh/en)" })
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
lang?: string;
|
||||
}
|
||||
27
templates/mcp/src/index.ts.hbs
Normal file
27
templates/mcp/src/index.ts.hbs
Normal file
@@ -0,0 +1,27 @@
|
||||
import { SpaceflowExtension, SpaceflowExtensionMetadata } from "spaceflow";
|
||||
import { {{pascalName}}Module } from "./{{kebabName}}.module";
|
||||
|
||||
/** {{pascalName}} Extension 元数据 */
|
||||
export const {{camelName}}Metadata: SpaceflowExtensionMetadata = {
|
||||
name: "{{kebabName}}",
|
||||
commands: [],
|
||||
configKey: "{{kebabName}}",
|
||||
version: "1.0.0",
|
||||
description: "{{name}} MCP 工具插件",
|
||||
};
|
||||
|
||||
export class {{pascalName}}Extension implements SpaceflowExtension {
|
||||
getMetadata(): SpaceflowExtensionMetadata {
|
||||
return {{camelName}}Metadata;
|
||||
}
|
||||
|
||||
getModule() {
|
||||
return {{pascalName}}Module;
|
||||
}
|
||||
}
|
||||
|
||||
export default {{pascalName}}Extension;
|
||||
|
||||
export * from "./{{kebabName}}.module";
|
||||
export * from "./{{kebabName}}.mcp";
|
||||
export * from "./{{kebabName}}.service";
|
||||
5
templates/mcp/tsconfig.json.hbs
Normal file
5
templates/mcp/tsconfig.json.hbs
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"extends": "../../core/tsconfig.skill.json",
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist"]
|
||||
}
|
||||
Reference in New Issue
Block a user