mcp-framework
Version:
Framework for building Model Context Protocol (MCP) servers in Typescript
62 lines (58 loc) • 2.08 kB
JavaScript
import { writeFile, mkdir } from "fs/promises";
import { join } from "path";
import prompts from "prompts";
import { validateMCPProject } from "../utils/validate-project.js";
import { toPascalCase } from "../utils/string-utils.js";
export async function addResource(name) {
await validateMCPProject();
let resourceName = name;
if (!resourceName) {
const response = await prompts([
{
type: "text",
name: "name",
message: "What is the name of your resource?",
validate: (value) => /^[a-z0-9-]+$/.test(value)
? true
: "Resource name can only contain lowercase letters, numbers, and hyphens",
},
]);
if (!response.name) {
console.log("Resource creation cancelled");
process.exit(1);
}
resourceName = response.name;
}
if (!resourceName) {
throw new Error("Resource name is required");
}
const className = toPascalCase(resourceName);
const fileName = `${className}Resource.ts`;
const resourcesDir = join(process.cwd(), "src/resources");
try {
await mkdir(resourcesDir, { recursive: true });
const resourceContent = `import { MCPResource, ResourceContent } from "mcp-framework";
class ${className}Resource extends MCPResource {
uri = "resource://${resourceName}";
name = "${className}";
description = "${className} resource description";
mimeType = "application/json";
async read(): Promise<ResourceContent[]> {
return [
{
uri: this.uri,
mimeType: this.mimeType,
text: JSON.stringify({ message: "Hello from ${className} resource" }),
},
];
}
}
export default ${className}Resource;`;
await writeFile(join(resourcesDir, fileName), resourceContent);
console.log(`Resource ${resourceName} created successfully at src/resources/${fileName}`);
}
catch (error) {
console.error("Error creating resource:", error);
process.exit(1);
}
}