
xmcp Application
This project was created with create-xmcp-app.
Getting Started
First, run the development server:
npm run dev# oryarn dev# orpnpm dev
This will start the MCP server with the selected transport method.
Project Structure
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
Tools
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
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
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}`;}
Adding New Components
Adding New Tools
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
Adding New Prompts
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
Adding New Resources
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
Building for Production
To build your project for production:
npm run build# oryarn build# orpnpm build
This will compile your TypeScript code and output it to the dist directory.
Running the Server
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# oryarn start-http# orpnpm start-http
For STDIO:
npm run start-stdio# oryarn start-stdio# orpnpm start-stdio
