This project was created with create-xmcp-app.
First, run the development server:
npm run dev
# or
yarn dev
# or
pnpm devThis will start the MCP server with the selected transport method.
This project uses the structured approach where tools, prompts, and resources are automatically discovered from their respective directories:
src/tools- Tool definitionssrc/prompts- Prompt templatessrc/resources- Resource handlers
Each tool is defined in its own file with the following structure:
import { z } from "zod";
import { type InferSchema, type ToolMetadata } from "xmcp";
export const schema = {
name: z.string().describe("The name of the user to greet"),
};
export const metadata: ToolMetadata = {
name: "greet",
description: "Greet the user",
annotations: {
title: "Greet the user",
readOnlyHint: true,
destructiveHint: false,
idempotentHint: true,
},
};
export default function greet({ name }: InferSchema<typeof schema>) {
return `Hello, ${name}!`;
}Prompts are template definitions for AI interactions:
import { z } from "zod";
import { type InferSchema, type PromptMetadata } from "xmcp";
export const schema = {
code: z.string().describe("The code to review"),
};
export const metadata: PromptMetadata = {
name: "review-code",
title: "Review Code",
description: "Review code for best practices and potential issues",
role: "user",
};
export default function reviewCode({ code }: InferSchema<typeof schema>) {
return `Please review this code: ${code}`;
}Resources provide data or content with URI-based access:
import { z } from "zod";
import { type ResourceMetadata, type InferSchema } from "xmcp";
export const schema = {
userId: z.string().describe("The ID of the user"),
};
export const metadata: ResourceMetadata = {
name: "user-profile",
title: "User Profile",
description: "User profile information",
};
export default function handler({ userId }: InferSchema<typeof schema>) {
return `Profile data for user ${userId}`;
}To add a new tool:
- Create a new
.tsfile in thesrc/toolsdirectory - Export a
schemaobject defining the tool parameters using Zod - Export a
metadataobject with tool information - Export a default function that implements the tool logic
To add a new prompt:
- Create a new
.tsfile in thesrc/promptsdirectory - Export a
schemaobject defining the prompt parameters using Zod - Export a
metadataobject with prompt information and role - Export a default function that returns the prompt text
To add a new resource:
- Create a new
.tsfile in thesrc/resourcesdirectory - Use folder structure to define the URI (e.g.,
(users)/[userId]/profile.ts→users://{userId}/profile) - Export a
schemaobject for dynamic parameters (optional for static resources) - Export a
metadataobject with resource information - Export a default function that returns the resource content
To build your project for production:
npm run build
# or
yarn build
# or
pnpm buildThis will compile your TypeScript code and output it to the dist directory.
You can run the server for the transport built with:
- HTTP:
node dist/http.js - STDIO:
node dist/stdio.js
Given the selected transport method, you will have a custom start script added to the package.json file.
For HTTP:
npm run start-http
# or
yarn start-http
# or
pnpm start-httpFor STDIO:
npm run start-stdio
# or
yarn start-stdio
# or
pnpm start-stdio