skills/emillindfors/mcp-prompts-guide/SKILL.md
Create powerful MCP prompts that guide AI interactions with templates, arguments, and context injection
npx skillsauth add aiskillstore/marketplace mcp-prompts-guideInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are an expert in creating MCP prompts using the rmcp crate, with knowledge of prompt design, template systems, and context management.
You guide developers on:
Prompts are predefined message templates that MCP servers provide to guide AI interactions. They help users start conversations with the right context and structure.
use rmcp::prelude::*;
use serde::{Deserialize, Serialize};
use schemars::JsonSchema;
#[derive(Clone)]
struct PromptService;
impl PromptService {
async fn list_prompts(&self) -> Vec<PromptInfo> {
vec![
PromptInfo {
name: "analyze_code".to_string(),
description: Some("Analyze code for issues and improvements".to_string()),
arguments: vec![
PromptArgument {
name: "language".to_string(),
description: Some("Programming language".to_string()),
required: true,
},
PromptArgument {
name: "focus".to_string(),
description: Some("Focus area (performance, security, style)".to_string()),
required: false,
},
],
},
]
}
async fn get_prompt(
&self,
name: &str,
arguments: HashMap<String, String>,
) -> Result<PromptResponse, Error> {
match name {
"analyze_code" => {
let language = arguments.get("language")
.ok_or_else(|| Error::MissingArgument("language".to_string()))?;
let focus = arguments.get("focus").map(|s| s.as_str()).unwrap_or("general");
let messages = vec![
PromptMessage {
role: Role::User,
content: format!(
"I need you to analyze {} code with a focus on {}. \
Please review the code carefully and provide:\n\
1. Issues found\n\
2. Recommendations\n\
3. Code examples for improvements",
language, focus
),
},
];
Ok(PromptResponse {
description: Some("Code analysis prompt".to_string()),
messages,
})
}
_ => Err(Error::PromptNotFound(name.to_string())),
}
}
}
impl PromptService {
fn create_code_review_prompt(&self, args: &HashMap<String, String>) -> PromptResponse {
let language = args.get("language").map(|s| s.as_str()).unwrap_or("any");
let file_path = args.get("file_path");
let mut context = format!(
"You are an expert code reviewer for {} projects.\n\n",
language
);
if let Some(path) = file_path {
context.push_str(&format!("File: {}\n\n", path));
}
context.push_str(
"Please review the code for:\n\
- Bugs and logic errors\n\
- Performance issues\n\
- Security vulnerabilities\n\
- Code style and best practices\n\
- Test coverage gaps\n\n\
Provide specific line numbers and actionable recommendations."
);
PromptResponse {
description: Some("Comprehensive code review".to_string()),
messages: vec![
PromptMessage {
role: Role::User,
content: context,
},
],
}
}
}
impl PromptService {
fn create_api_design_prompt(&self, args: &HashMap<String, String>) -> PromptResponse {
let api_type = args.get("api_type").map(|s| s.as_str()).unwrap_or("REST");
let domain = args.get("domain").map(|s| s.as_str()).unwrap_or("general");
PromptResponse {
description: Some(format!("Design {} API for {}", api_type, domain)),
messages: vec![
PromptMessage {
role: Role::System,
content: format!(
"You are an expert API architect specializing in {} APIs.",
api_type
),
},
PromptMessage {
role: Role::User,
content: format!(
"I need to design a {} API for a {} application.\n\n\
Please help me:\n\
1. Define the resource models\n\
2. Design the endpoints\n\
3. Specify request/response formats\n\
4. Consider authentication and authorization\n\
5. Plan for versioning and backwards compatibility\n\n\
Focus on best practices and industry standards.",
api_type, domain
),
},
],
}
}
}
impl PromptService {
fn create_learning_prompt(&self, args: &HashMap<String, String>) -> PromptResponse {
let topic = args.get("topic").ok_or(Error::MissingArgument("topic".to_string())).unwrap();
let level = args.get("level").map(|s| s.as_str()).unwrap_or("beginner");
PromptResponse {
description: Some(format!("Learn {} at {} level", topic, level)),
messages: vec![
PromptMessage {
role: Role::System,
content: format!(
"You are a patient and knowledgeable teacher of {}. \
Adapt your explanations to a {} level.",
topic, level
),
},
PromptMessage {
role: Role::User,
content: format!(
"I want to learn about {}. I'm at a {} level.\n\n\
Please:\n\
1. Start with the fundamentals\n\
2. Provide clear examples\n\
3. Build complexity gradually\n\
4. Check my understanding as we go\n\
5. Suggest exercises\n\n\
Let's begin!",
topic, level
),
},
],
}
}
}
impl PromptService {
async fn create_project_prompt(
&self,
args: &HashMap<String, String>,
project_context: &ProjectContext,
) -> PromptResponse {
let task = args.get("task").unwrap();
let context = format!(
"# Project Context\n\n\
Project: {}\n\
Language: {}\n\
Framework: {}\n\
Dependencies: {}\n\n\
# Task\n\n\
{}\n\n\
# Guidelines\n\n\
- Follow the project's existing patterns\n\
- Maintain code style consistency\n\
- Update tests and documentation\n\
- Consider existing dependencies",
project_context.name,
project_context.language,
project_context.framework,
project_context.dependencies.join(", "),
task
);
PromptResponse {
description: Some(format!("Project task: {}", task)),
messages: vec![
PromptMessage {
role: Role::User,
content: context,
},
],
}
}
}
impl PromptService {
fn create_debug_session_prompt(&self) -> PromptResponse {
PromptResponse {
description: Some("Interactive debugging session".to_string()),
messages: vec![
PromptMessage {
role: Role::System,
content: "You are an expert debugger. Help the user systematically \
identify and fix issues in their code.".to_string(),
},
PromptMessage {
role: Role::Assistant,
content: "I'll help you debug this issue. First, can you:\n\
1. Describe what you expected to happen\n\
2. Describe what actually happened\n\
3. Share any error messages\n\
4. Show the relevant code".to_string(),
},
PromptMessage {
role: Role::User,
content: "[User provides debugging information here]".to_string(),
},
],
}
}
}
impl PromptService {
fn create_few_shot_prompt(&self, args: &HashMap<String, String>) -> PromptResponse {
let task = args.get("task").unwrap();
PromptResponse {
description: Some("Task with examples".to_string()),
messages: vec![
PromptMessage {
role: Role::System,
content: "You help users by following the pattern shown in examples.".to_string(),
},
PromptMessage {
role: Role::User,
content: "Example 1: Convert 'hello world' to camelCase".to_string(),
},
PromptMessage {
role: Role::Assistant,
content: "helloWorld".to_string(),
},
PromptMessage {
role: Role::User,
content: "Example 2: Convert 'foo bar baz' to camelCase".to_string(),
},
PromptMessage {
role: Role::Assistant,
content: "fooBarBaz".to_string(),
},
PromptMessage {
role: Role::User,
content: format!("Now: {}", task),
},
],
}
}
}
impl PromptService {
async fn create_contextual_prompt(
&self,
args: &HashMap<String, String>,
context_loader: &ContextLoader,
) -> Result<PromptResponse, Error> {
let topic = args.get("topic").unwrap();
// Load relevant context
let docs = context_loader.load_documentation(topic).await?;
let examples = context_loader.load_examples(topic).await?;
let best_practices = context_loader.load_best_practices(topic).await?;
let context = format!(
"# Reference Documentation\n\n{}\n\n\
# Examples\n\n{}\n\n\
# Best Practices\n\n{}\n\n\
# Your Task\n\n\
Apply these concepts to solve the problem.",
docs, examples, best_practices
);
Ok(PromptResponse {
description: Some(format!("Contextual help for {}", topic)),
messages: vec![
PromptMessage {
role: Role::User,
content: context,
},
],
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_list_prompts() {
let service = PromptService;
let prompts = service.list_prompts().await;
assert!(!prompts.is_empty());
}
#[tokio::test]
async fn test_get_prompt_with_args() {
let service = PromptService;
let mut args = HashMap::new();
args.insert("language".to_string(), "Rust".to_string());
let response = service.get_prompt("analyze_code", args).await.unwrap();
assert!(!response.messages.is_empty());
}
#[tokio::test]
async fn test_missing_required_argument() {
let service = PromptService;
let args = HashMap::new();
let result = service.get_prompt("analyze_code", args).await;
assert!(result.is_err());
}
}
#[tokio::test]
async fn test_prompt_end_to_end() {
let service = PromptService;
// List prompts
let prompts = service.list_prompts().await;
let prompt_name = &prompts[0].name;
// Build arguments
let mut args = HashMap::new();
for arg in &prompts[0].arguments {
if arg.required {
args.insert(arg.name.clone(), "test_value".to_string());
}
}
// Get prompt
let response = service.get_prompt(prompt_name, args).await.unwrap();
// Verify structure
assert!(!response.messages.is_empty());
assert!(response.description.is_some());
}
fn create_code_gen_prompt(&self, args: &HashMap<String, String>) -> PromptResponse {
let language = args.get("language").unwrap();
let component = args.get("component").unwrap();
PromptResponse {
description: Some(format!("Generate {} {}", language, component)),
messages: vec![
PromptMessage {
role: Role::User,
content: format!(
"Generate a {} {} with:\n\
- Clean, idiomatic code\n\
- Comprehensive error handling\n\
- Unit tests\n\
- Documentation comments",
language, component
),
},
],
}
}
fn create_refactor_prompt(&self, args: &HashMap<String, String>) -> PromptResponse {
let goal = args.get("goal").unwrap();
PromptResponse {
description: Some(format!("Refactor to {}", goal)),
messages: vec![
PromptMessage {
role: Role::User,
content: format!(
"Refactor this code to {}.\n\n\
Requirements:\n\
- Preserve functionality\n\
- Improve code quality\n\
- Update tests\n\
- Explain changes",
goal
),
},
],
}
}
When helping with prompt creation:
Understand Goal
Design Arguments
Craft Messages
Add Context
Test Thoroughly
Your goal is to help developers create prompts that effectively guide AI assistants to produce high-quality, contextually appropriate responses.
development
Apple Human Interface Guidelines for content display components. Use this skill when the user asks about charts component, collection view, image view, web view, color well, image well, activity view, lockup, data visualization, content display, displaying images, rendering web content, color pickers, or presenting collections of items in Apple apps. Also use when the user says how should I display charts, what's the best way to show images, should I use a web view, how do I build a grid of items, what component shows media, or how do I present a share sheet. Cross-references: hig-foundations for color/typography/accessibility, hig-patterns for data visualization patterns, hig-components-layout for structural containers, hig-platforms for platform-specific component behavior.
tools
Automate HelpDesk tasks via Rube MCP (Composio): list tickets, manage views, use canned responses, and configure custom fields. Always search tools first for current schemas.
testing
Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.
tools
GraphQL gives clients exactly the data they need - no more, no less. One endpoint, typed schema, introspection. But the flexibility that makes it powerful also makes it dangerous. Without proper controls, clients can craft queries that bring down your server. This skill covers schema design, resolvers, DataLoader for N+1 prevention, federation for microservices, and client integration with Apollo/urql. Key insight: GraphQL is a contract. The schema is the API documentation. Design it carefully.