{"id":"f3232444-39a6-4300-96c6-9493133e62f3","shortId":"kpbg4L","kind":"skill","title":"Rust Mcp Server Generator","tagline":"Awesome Copilot skill by Github","description":"# Rust MCP Server Generator\n\nYou are a Rust MCP server generator. Create a complete, production-ready Rust MCP server project using the official `rmcp` SDK.\n\n## Project Requirements\n\nAsk the user for:\n1. **Project name** (e.g., \"my-mcp-server\")\n2. **Server description** (e.g., \"A weather data MCP server\")\n3. **Transport type** (stdio, sse, http, or all)\n4. **Tools to include** (e.g., \"weather lookup\", \"forecast\", \"alerts\")\n5. **Whether to include prompts and resources**\n\n## Project Structure\n\nGenerate this structure:\n\n```\n{project-name}/\n├── Cargo.toml\n├── .gitignore\n├── README.md\n├── src/\n│   ├── main.rs\n│   ├── handler.rs\n│   ├── tools/\n│   │   ├── mod.rs\n│   │   └── {tool_name}.rs\n│   ├── prompts/\n│   │   ├── mod.rs\n│   │   └── {prompt_name}.rs\n│   ├── resources/\n│   │   ├── mod.rs\n│   │   └── {resource_name}.rs\n│   └── state.rs\n└── tests/\n    └── integration_test.rs\n```\n\n## File Templates\n\n### Cargo.toml\n\n```toml\n[package]\nname = \"{project-name}\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[dependencies]\nrmcp = { version = \"0.8.1\", features = [\"server\"] }\nrmcp-macros = \"0.8\"\ntokio = { version = \"1\", features = [\"full\"] }\nserde = { version = \"1.0\", features = [\"derive\"] }\nserde_json = \"1.0\"\nanyhow = \"1.0\"\ntracing = \"0.1\"\ntracing-subscriber = \"0.3\"\nschemars = { version = \"0.8\", features = [\"derive\"] }\nasync-trait = \"0.1\"\n\n# Optional: for HTTP transports\naxum = { version = \"0.7\", optional = true }\ntower-http = { version = \"0.5\", features = [\"cors\"], optional = true }\n\n[dev-dependencies]\ntokio-test = \"0.4\"\n\n[features]\ndefault = []\nhttp = [\"dep:axum\", \"dep:tower-http\"]\n\n[[bin]]\nname = \"{project-name}\"\npath = \"src/main.rs\"\n```\n\n### .gitignore\n\n```gitignore\n/target\nCargo.lock\n*.swp\n*.swo\n*~\n.DS_Store\n```\n\n### README.md\n\n```markdown\n# {Project Name}\n\n{Server description}\n\n## Installation\n\n```bash\ncargo build --release\n```\n\n## Usage\n\n### Stdio Transport\n\n```bash\ncargo run\n```\n\n### SSE Transport\n\n```bash\ncargo run --features http -- --transport sse\n```\n\n### HTTP Transport\n\n```bash\ncargo run --features http -- --transport http\n```\n\n## Configuration\n\nConfigure in your MCP client (e.g., Claude Desktop):\n\n```json\n{\n  \"mcpServers\": {\n    \"{project-name}\": {\n      \"command\": \"path/to/target/release/{project-name}\",\n      \"args\": []\n    }\n  }\n}\n```\n\n## Tools\n\n- **{tool_name}**: {Tool description}\n\n## Development\n\nRun tests:\n\n```bash\ncargo test\n```\n\nRun with logging:\n\n```bash\nRUST_LOG=debug cargo run\n```\n```\n\n### src/main.rs\n\n```rust\nuse anyhow::Result;\nuse rmcp::{\n    protocol::ServerCapabilities,\n    server::Server,\n    transport::StdioTransport,\n};\nuse tokio::signal;\nuse tracing_subscriber;\n\nmod handler;\nmod state;\nmod tools;\nmod prompts;\nmod resources;\n\nuse handler::McpHandler;\n\n#[tokio::main]\nasync fn main() -> Result<()> {\n    // Initialize tracing\n    tracing_subscriber::fmt()\n        .with_max_level(tracing::Level::INFO)\n        .with_target(false)\n        .init();\n    \n    tracing::info!(\"Starting {project-name} MCP server\");\n    \n    // Create handler\n    let handler = McpHandler::new();\n    \n    // Create transport (stdio by default)\n    let transport = StdioTransport::new();\n    \n    // Build server with capabilities\n    let server = Server::builder()\n        .with_handler(handler)\n        .with_capabilities(ServerCapabilities {\n            tools: Some(Default::default()),\n            prompts: Some(Default::default()),\n            resources: Some(Default::default()),\n            ..Default::default()\n        })\n        .build(transport)?;\n    \n    tracing::info!(\"Server started, waiting for requests\");\n    \n    // Run server until Ctrl+C\n    server.run(signal::ctrl_c()).await?;\n    \n    tracing::info!(\"Server shutting down\");\n    Ok(())\n}\n```\n\n### src/handler.rs\n\n```rust\nuse rmcp::{\n    model::*,\n    protocol::*,\n    server::{RequestContext, ServerHandler, RoleServer, ToolRouter},\n    ErrorData,\n};\nuse rmcp::{tool_router, tool_handler};\nuse async_trait::async_trait;\n\nuse crate::state::ServerState;\nuse crate::tools;\n\npub struct McpHandler {\n    state: ServerState,\n    tool_router: ToolRouter,\n}\n\n#[tool_router]\nimpl McpHandler {\n    // Include tool definitions from tools module\n    #[tool(\n        name = \"example_tool\",\n        description = \"An example tool\",\n        annotations(read_only_hint = true)\n    )]\n    async fn example_tool(params: Parameters<tools::ExampleParams>) -> Result<String, String> {\n        tools::example::execute(params).await\n    }\n    \n    pub fn new() -> Self {\n        Self {\n            state: ServerState::new(),\n            tool_router: Self::tool_router(),\n        }\n    }\n}\n\n#[tool_handler]\n#[async_trait]\nimpl ServerHandler for McpHandler {\n    async fn list_prompts(\n        &self,\n        _request: Option<PaginatedRequestParam>,\n        _context: RequestContext<RoleServer>,\n    ) -> Result<ListPromptsResult, ErrorData> {\n        let prompts = vec![\n            Prompt {\n                name: \"example-prompt\".to_string(),\n                description: Some(\"An example prompt\".to_string()),\n                arguments: Some(vec![\n                    PromptArgument {\n                        name: \"topic\".to_string(),\n                        description: Some(\"The topic to discuss\".to_string()),\n                        required: Some(true),\n                    },\n                ]),\n            },\n        ];\n        \n        Ok(ListPromptsResult { prompts })\n    }\n    \n    async fn get_prompt(\n        &self,\n        request: GetPromptRequestParam,\n        _context: RequestContext<RoleServer>,\n    ) -> Result<GetPromptResult, ErrorData> {\n        match request.name.as_str() {\n            \"example-prompt\" => {\n                let topic = request.arguments\n                    .as_ref()\n                    .and_then(|args| args.get(\"topic\"))\n                    .ok_or_else(|| ErrorData::invalid_params(\"topic required\"))?;\n                \n                Ok(GetPromptResult {\n                    description: Some(\"Example prompt\".to_string()),\n                    messages: vec![\n                        PromptMessage::user(format!(\"Let's discuss: {}\", topic)),\n                    ],\n                })\n            }\n            _ => Err(ErrorData::invalid_params(\"Unknown prompt\")),\n        }\n    }\n    \n    async fn list_resources(\n        &self,\n        _request: Option<PaginatedRequestParam>,\n        _context: RequestContext<RoleServer>,\n    ) -> Result<ListResourcesResult, ErrorData> {\n        let resources = vec![\n            Resource {\n                uri: \"example://data/info\".to_string(),\n                name: \"Example Resource\".to_string(),\n                description: Some(\"An example resource\".to_string()),\n                mime_type: Some(\"text/plain\".to_string()),\n            },\n        ];\n        \n        Ok(ListResourcesResult { resources })\n    }\n    \n    async fn read_resource(\n        &self,\n        request: ReadResourceRequestParam,\n        _context: RequestContext<RoleServer>,\n    ) -> Result<ReadResourceResult, ErrorData> {\n        match request.uri.as_str() {\n            \"example://data/info\" => {\n                Ok(ReadResourceResult {\n                    contents: vec![\n                        ResourceContents::text(\"Example resource content\".to_string())\n                            .with_uri(request.uri)\n                            .with_mime_type(\"text/plain\"),\n                    ],\n                })\n            }\n            _ => Err(ErrorData::invalid_params(\"Unknown resource\")),\n        }\n    }\n}\n```\n\n### src/state.rs\n\n```rust\nuse std::sync::Arc;\nuse tokio::sync::RwLock;\n\n#[derive(Clone)]\npub struct ServerState {\n    // Add shared state here\n    counter: Arc<RwLock<i32>>,\n}\n\nimpl ServerState {\n    pub fn new() -> Self {\n        Self {\n            counter: Arc::new(RwLock::new(0)),\n        }\n    }\n    \n    pub async fn increment(&self) -> i32 {\n        let mut counter = self.counter.write().await;\n        *counter += 1;\n        *counter\n    }\n    \n    pub async fn get(&self) -> i32 {\n        *self.counter.read().await\n    }\n}\n```\n\n### src/tools/mod.rs\n\n```rust\npub mod example;\n\npub use example::ExampleParams;\n```\n\n### src/tools/example.rs\n\n```rust\nuse rmcp::model::Parameters;\nuse serde::{Deserialize, Serialize};\nuse schemars::JsonSchema;\n\n#[derive(Debug, Deserialize, JsonSchema)]\npub struct ExampleParams {\n    pub input: String,\n}\n\npub async fn execute(params: Parameters<ExampleParams>) -> Result<String, String> {\n    let input = &params.inner().input;\n    \n    // Tool logic here\n    Ok(format!(\"Processed: {}\", input))\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    \n    #[tokio::test]\n    async fn test_example_tool() {\n        let params = Parameters::new(ExampleParams {\n            input: \"test\".to_string(),\n        });\n        \n        let result = execute(params).await.unwrap();\n        assert!(result.contains(\"test\"));\n    }\n}\n```\n\n### src/prompts/mod.rs\n\n```rust\n// Prompt implementations can go here if needed\n```\n\n### src/resources/mod.rs\n\n```rust\n// Resource implementations can go here if needed\n```\n\n### tests/integration_test.rs\n\n```rust\nuse rmcp::{\n    model::*,\n    protocol::*,\n    server::{RequestContext, ServerHandler, RoleServer},\n};\n\n// Replace with your actual project name in snake_case\n// Example: if project is \"my-mcp-server\", use my_mcp_server\nuse my_mcp_server::handler::McpHandler;\n\n#[tokio::test]\nasync fn test_list_tools() {\n    let handler = McpHandler::new();\n    let context = RequestContext::default();\n    \n    let result = handler.list_tools(None, context).await.unwrap();\n    \n    assert!(!result.tools.is_empty());\n    assert!(result.tools.iter().any(|t| t.name == \"example_tool\"));\n}\n\n#[tokio::test]\nasync fn test_call_tool() {\n    let handler = McpHandler::new();\n    let context = RequestContext::default();\n    \n    let request = CallToolRequestParam {\n        name: \"example_tool\".to_string(),\n        arguments: Some(serde_json::json!({\n            \"input\": \"test\"\n        })),\n    };\n    \n    let result = handler.call_tool(request, context).await;\n    assert!(result.is_ok());\n}\n\n#[tokio::test]\nasync fn test_list_prompts() {\n    let handler = McpHandler::new();\n    let context = RequestContext::default();\n    \n    let result = handler.list_prompts(None, context).await.unwrap();\n    assert!(!result.prompts.is_empty());\n}\n\n#[tokio::test]\nasync fn test_list_resources() {\n    let handler = McpHandler::new();\n    let context = RequestContext::default();\n    \n    let result = handler.list_resources(None, context).await.unwrap();\n    assert!(!result.resources.is_empty());\n}\n```\n\n## Implementation Guidelines\n\n1. **Use rmcp-macros**: Leverage `#[tool]`, `#[tool_router]`, and `#[tool_handler]` macros for cleaner code\n2. **Type Safety**: Use `schemars::JsonSchema` for all parameter types\n3. **Error Handling**: Return `Result` types with proper error messages\n4. **Async/Await**: All handlers must be async\n5. **State Management**: Use `Arc<RwLock<T>>` for shared state\n6. **Testing**: Include unit tests for tools and integration tests for handlers\n7. **Logging**: Use `tracing` macros (`info!`, `debug!`, `warn!`, `error!`)\n8. **Documentation**: Add doc comments to all public items\n\n## Example Tool Patterns\n\n### Simple Read-Only Tool\n\n```rust\n#[derive(Debug, Deserialize, JsonSchema)]\npub struct GreetParams {\n    pub name: String,\n}\n\n#[tool(\n    name = \"greet\",\n    description = \"Greets a user by name\",\n    annotations(read_only_hint = true, idempotent_hint = true)\n)]\nasync fn greet(params: Parameters<GreetParams>) -> String {\n    format!(\"Hello, {}!\", params.inner().name)\n}\n```\n\n### Tool with Error Handling\n\n```rust\n#[derive(Debug, Deserialize, JsonSchema)]\npub struct DivideParams {\n    pub a: f64,\n    pub b: f64,\n}\n\n#[tool(name = \"divide\", description = \"Divides two numbers\")]\nasync fn divide(params: Parameters<DivideParams>) -> Result<f64, String> {\n    let p = params.inner();\n    if p.b == 0.0 {\n        Err(\"Cannot divide by zero\".to_string())\n    } else {\n        Ok(p.a / p.b)\n    }\n}\n```\n\n### Tool with State\n\n```rust\n#[tool(\n    name = \"increment\",\n    description = \"Increments the counter\",\n    annotations(destructive_hint = true)\n)]\nasync fn increment(state: &ServerState) -> i32 {\n    state.increment().await\n}\n```\n\n## Running the Generated Server\n\nAfter generation:\n\n```bash\ncd {project-name}\ncargo build\ncargo test\ncargo run\n```\n\nFor Claude Desktop integration:\n\n```json\n{\n  \"mcpServers\": {\n    \"{project-name}\": {\n      \"command\": \"path/to/{project-name}/target/release/{project-name}\",\n      \"args\": []\n    }\n  }\n}\n```\n\nNow generate the complete project based on the user's requirements!","tags":["rust","mcp","server","generator","awesome","copilot","github"],"capabilities":["skill","source-github","category-awesome-copilot"],"categories":["awesome-copilot"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/github/awesome-copilot/rust-mcp-server-generator","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under github/awesome-copilot","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T14:40:17.473Z","embedding":null,"createdAt":"2026-04-18T20:25:50.507Z","updatedAt":"2026-04-22T14:40:17.473Z","lastSeenAt":"2026-04-22T14:40:17.473Z","tsv":"'/target':211 '/target/release':1258 '0':742 '0.0':1192 '0.1':154,167 '0.1.0':125 '0.3':158 '0.4':192 '0.5':181 '0.7':174 '0.8':137,161 '0.8.1':131 '1':42,140,755,1026 '1.0':145,150,152 '2':50,1042 '2021':127 '3':59,1052 '4':67,1062 '5':76,1069 '6':1078 '7':1090 '8':1099 'actual':878 'add':723,1101 'alert':75 'annot':477,1136,1215 'anyhow':151,295 'arc':713,728,738,1073 'arg':271,593,1262 'args.get':594 'argument':546,957 'ask':38 'assert':844,924,927,971,996,1021 'async':165,326,440,442,482,511,517,568,627,668,744,758,798,825,904,936,976,1001,1068,1144,1179,1219 'async-trait':164 'async/await':1063 'await':414,495,753,764,970,1226 'await.unwrap':843,923,995,1020 'awesom':5 'axum':172,197 'b':1170 'base':1268 'bash':224,231,236,245,280,286,1233 'bin':202 'build':226,368,396,1239 'builder':375 'c':409,413 'call':939 'calltoolrequestparam':951 'cannot':1194 'capabl':371,380 'cargo':225,232,237,246,281,290,1238,1240,1242 'cargo.lock':212 'cargo.toml':91,117 'case':883 'category-awesome-copilot' 'cd':1234 'cfg':817 'claud':259,1245 'cleaner':1040 'client':257 'clone':719 'code':1041 'command':266,1253 'comment':1103 'complet':23,1266 'configur':252,253 'content':686,692 'context':524,575,634,675,914,922,946,969,986,994,1011,1019 'copilot':6 'cor':183 'counter':727,737,751,754,756,1214 'crate':445,449 'creat':21,353,359 'ctrl':408,412 'data':56 'data/info':644,683 'debug':289,788,1096,1118,1160 'default':194,363,384,385,388,389,392,393,394,395,916,948,988,1013 'definit':465 'dep':196,198 'depend':128,188 'deriv':147,163,718,787,1117,1159 'descript':52,222,276,473,539,554,606,652,1130,1175,1211 'deseri':782,789,1119,1161 'desktop':260,1246 'destruct':1216 'dev':187 'dev-depend':186 'develop':277 'discuss':559,619 'divid':1174,1176,1181,1195 'divideparam':1165 'doc':1102 'document':1100 'ds':215 'e.g':45,53,71,258 'edit':126 'els':598,1200 'empti':926,998,1023 'err':621,702,1193 'error':1053,1060,1098,1156 'errordata':432,528,579,599,622,638,679,703 'exampl':471,475,484,492,535,542,584,608,648,655,690,769,772,828,884,932,953,1108 'example-prompt':534,583 'exampleparam':773,793,834 'execut':493,800,841 'f64':1168,1171,1185 'fals':343 'featur':132,141,146,162,182,193,239,248 'file':115 'fmt':334 'fn':327,483,497,518,569,628,669,733,745,759,799,826,905,937,977,1002,1145,1180,1220 'forecast':74 'format':616,814,1150 'full':142 'generat':4,13,20,85,1229,1232,1264 'get':570,760 'getpromptrequestparam':574 'getpromptresult':578,605 'github':9 'gitignor':92,209,210 'go':852,861 'greet':1129,1131,1146 'greetparam':1123 'guidelin':1025 'handl':1054,1157 'handler':312,322,354,356,377,378,438,510,900,910,942,982,1007,1037,1065,1089 'handler.call':966 'handler.list':919,991,1016 'handler.rs':96 'hello':1151 'hint':480,1139,1142,1217 'http':64,170,179,195,201,240,243,249,251 'i32':748,762,1224 'idempot':1141 'impl':461,513,730 'implement':850,859,1024 'includ':70,79,463,1080 'increment':746,1210,1212,1221 'info':340,346,399,416,1095 'init':344 'initi':330 'input':795,807,809,816,835,962 'instal':223 'integr':1086,1247 'integration_test.rs':114 'invalid':600,623,704 'item':1107 'json':149,261,960,961,1248 'jsonschema':786,790,1047,1120,1162 'let':355,364,372,529,586,617,639,749,806,830,839,909,913,917,941,945,949,964,981,985,989,1006,1010,1014,1187 'level':337,339 'leverag':1031 'list':519,629,907,979,1004 'listpromptsresult':527,566 'listresourcesresult':637,666 'log':285,288,1091 'logic':811 'lookup':73 'macro':136,1030,1038,1094 'main':325,328 'main.rs':95 'manag':1071 'markdown':218 'match':580,680 'max':336 'mcp':2,11,18,28,48,57,256,351,890,894,898 'mcphandler':323,357,453,462,516,901,911,943,983,1008 'mcpserver':262,1249 'messag':612,1061 'mime':659,699 'mod':311,313,315,317,319,768,819 'mod.rs':98,103,108 'model':425,778,869 'modul':468 'must':1066 'mut':750 'my-mcp-serv':46,888 'name':44,90,100,105,110,120,123,203,206,220,265,270,274,350,470,533,550,647,880,952,1125,1128,1135,1153,1173,1209,1237,1252,1257,1261 'need':855,864 'new':358,367,498,503,734,739,741,833,912,944,984,1009 'none':921,993,1018 'number':1178 'offici':33 'ok':420,565,596,604,665,684,813,973,1201 'option':168,175,184,523,633 'p':1188 'p.a':1202 'p.b':1191,1203 'packag':119 'param':486,494,601,624,705,801,831,842,1147,1182 'paramet':487,779,802,832,1050,1148,1183 'params.inner':808,1152,1189 'path':207 'path/to':1254 'path/to/target/release':267 'pattern':1110 'process':815 'product':25 'production-readi':24 'project':30,36,43,83,89,122,205,219,264,269,349,879,886,1236,1251,1256,1260,1267 'project-nam':88,121,204,263,268,348,1235,1250,1255,1259 'prompt':80,102,104,318,386,520,530,532,536,543,567,571,585,609,626,849,980,992 'promptargu':549 'promptmessag':614 'proper':1059 'protocol':299,426,870 'pub':451,496,720,732,743,757,767,770,791,794,797,1121,1124,1163,1166,1169 'public':1106 'read':478,670,1113,1137 'read-on':1112 'readi':26 'readme.md':93,217 'readresourcerequestparam':674 'readresourceresult':678,685 'ref':590 'releas':227 'replac':875 'request':404,522,573,632,673,950,968 'request.arguments':588 'request.name.as':581 'request.uri':697 'request.uri.as':681 'requestcontext':428,525,576,635,676,872,915,947,987,1012 'requir':37,562,603,1273 'resourc':82,107,109,320,390,630,640,642,649,656,667,671,691,707,858,1005,1017 'resourcecont':688 'result':296,329,488,526,577,636,677,803,840,918,965,990,1015,1056,1184 'result.contains':845 'result.is':972 'result.prompts.is':997 'result.resources.is':1022 'result.tools.is':925 'result.tools.iter':928 'return':1055 'rmcp':34,129,135,298,424,434,777,868,1029 'rmcp-macro':134,1028 'roleserv':430,874 'router':436,457,460,505,508,1034 'rs':101,106,111 'run':233,238,247,278,283,291,405,1227,1243 'rust':1,10,17,27,287,293,422,709,766,775,848,857,866,1116,1158,1207 'rwlock':717,729,740,1074 'safeti':1044 'schemar':159,785,1046 'sdk':35 'self':499,500,506,521,572,631,672,735,736,747,761 'self.counter.read':763 'self.counter.write':752 'serd':143,148,781,959 'serial':783 'server':3,12,19,29,49,51,58,133,221,301,302,352,369,373,374,400,406,417,427,871,891,895,899,1230 'server.run':410 'servercap':300,381 'serverhandl':429,514,873 'serverst':447,455,502,722,731,1223 'share':724,1076 'shut':418 'signal':307,411 'simpl':1111 'skill':7 'snake':882 'source-github' 'src':94 'src/handler.rs':421 'src/main.rs':208,292 'src/prompts/mod.rs':847 'src/resources/mod.rs':856 'src/state.rs':708 'src/tools/example.rs':774 'src/tools/mod.rs':765 'sse':63,234,242 'start':347,401 'state':314,446,454,501,725,1070,1077,1206,1222 'state.increment':1225 'state.rs':112 'std':711 'stdio':62,229,361 'stdiotransport':304,366 'store':216 'str':582,682 'string':489,490,538,545,553,561,611,646,651,658,664,694,796,804,805,838,956,1126,1149,1186,1199 'struct':452,721,792,1122,1164 'structur':84,87 'subscrib':157,310,333 'super':822 'swo':214 'swp':213 'sync':712,716 't.name':931 'target':342 'templat':116 'test':113,191,279,282,818,820,824,827,836,846,903,906,935,938,963,975,978,1000,1003,1079,1082,1087,1241 'tests/integration_test.rs':865 'text':689 'text/plain':662,701 'tokio':138,190,306,324,715,823,902,934,974,999 'tokio-test':189 'toml':118 'tool':68,97,99,272,273,275,316,382,435,437,450,456,459,464,467,469,472,476,485,491,504,507,509,810,829,908,920,933,940,954,967,1032,1033,1036,1084,1109,1115,1127,1154,1172,1204,1208 'toolrout':431,458 'topic':551,557,587,595,602,620 'tower':178,200 'tower-http':177,199 'trace':153,156,309,331,332,338,345,398,415,1093 'tracing-subscrib':155 'trait':166,441,443,512 'transport':60,171,230,235,241,244,250,303,360,365,397 'true':176,185,481,564,1140,1143,1218 'two':1177 'type':61,660,700,1043,1051,1057 'unit':1081 'unknown':625,706 'uri':643,696 'usag':228 'use':31,294,297,305,308,321,423,433,439,444,448,710,714,771,776,780,784,821,867,892,896,1027,1045,1072,1092 'user':40,615,1133,1271 'vec':531,548,613,641,687 'version':124,130,139,144,160,173,180 'wait':402 'warn':1097 'weather':55,72 'whether':77 'zero':1197","prices":[{"id":"a7bbf348-b3a9-4569-93c8-69c9500638a3","listingId":"f3232444-39a6-4300-96c6-9493133e62f3","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"github","category":"awesome-copilot","install_from":"skills.sh"},"createdAt":"2026-04-18T20:25:50.507Z"}],"sources":[{"listingId":"f3232444-39a6-4300-96c6-9493133e62f3","source":"github","sourceId":"github/awesome-copilot/rust-mcp-server-generator","sourceUrl":"https://github.com/github/awesome-copilot/tree/main/skills/rust-mcp-server-generator","isPrimary":false,"firstSeenAt":"2026-04-18T21:51:09.232Z","lastSeenAt":"2026-04-22T12:52:23.016Z"},{"listingId":"f3232444-39a6-4300-96c6-9493133e62f3","source":"skills_sh","sourceId":"github/awesome-copilot/rust-mcp-server-generator","sourceUrl":"https://skills.sh/github/awesome-copilot/rust-mcp-server-generator","isPrimary":true,"firstSeenAt":"2026-04-18T20:25:50.507Z","lastSeenAt":"2026-04-22T14:40:17.473Z"}],"details":{"listingId":"f3232444-39a6-4300-96c6-9493133e62f3","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"github","slug":"rust-mcp-server-generator","source":"skills_sh","category":"awesome-copilot","skills_sh_url":"https://skills.sh/github/awesome-copilot/rust-mcp-server-generator"},"updatedAt":"2026-04-22T14:40:17.473Z"}}