{"id":"4e1ab2ee-0923-4d88-a2b7-ddb5f070425b","shortId":"HzmYEF","kind":"skill","title":"Go Mcp Server Generator","tagline":"Awesome Copilot skill by Github","description":"# Go MCP Server Project Generator\n\nGenerate a complete, production-ready Model Context Protocol (MCP) server project in Go.\n\n## Project Requirements\n\nYou will create a Go MCP server with:\n\n1. **Project Structure**: Proper Go module layout\n2. **Dependencies**: Official MCP SDK and necessary packages\n3. **Server Setup**: Configured MCP server with transports\n4. **Tools**: At least 2-3 useful tools with typed inputs/outputs\n5. **Error Handling**: Proper error handling and context usage\n6. **Documentation**: README with setup and usage instructions\n7. **Testing**: Basic test structure\n\n## Template Structure\n\n```\nmyserver/\n├── go.mod\n├── go.sum\n├── main.go\n├── tools/\n│   ├── tool1.go\n│   └── tool2.go\n├── resources/\n│   └── resource1.go\n├── config/\n│   └── config.go\n├── README.md\n└── main_test.go\n```\n\n## go.mod Template\n\n```go\nmodule github.com/yourusername/{{PROJECT_NAME}}\n\ngo 1.23\n\nrequire (\n    github.com/modelcontextprotocol/go-sdk v1.0.0\n)\n```\n\n## main.go Template\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"log\"\n    \"os\"\n    \"os/signal\"\n    \"syscall\"\n\n    \"github.com/modelcontextprotocol/go-sdk/mcp\"\n    \"github.com/yourusername/{{PROJECT_NAME}}/config\"\n    \"github.com/yourusername/{{PROJECT_NAME}}/tools\"\n)\n\nfunc main() {\n    cfg := config.Load()\n    \n    ctx, cancel := context.WithCancel(context.Background())\n    defer cancel()\n\n    // Handle graceful shutdown\n    sigCh := make(chan os.Signal, 1)\n    signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM)\n    go func() {\n        <-sigCh\n        log.Println(\"Shutting down...\")\n        cancel()\n    }()\n\n    // Create server\n    server := mcp.NewServer(\n        &mcp.Implementation{\n            Name:    cfg.ServerName,\n            Version: cfg.Version,\n        },\n        &mcp.Options{\n            Capabilities: &mcp.ServerCapabilities{\n                Tools:     &mcp.ToolsCapability{},\n                Resources: &mcp.ResourcesCapability{},\n                Prompts:   &mcp.PromptsCapability{},\n            },\n        },\n    )\n\n    // Register tools\n    tools.RegisterTools(server)\n\n    // Run server\n    transport := &mcp.StdioTransport{}\n    if err := server.Run(ctx, transport); err != nil {\n        log.Fatalf(\"Server error: %v\", err)\n    }\n}\n```\n\n## tools/tool1.go Template\n\n```go\npackage tools\n\nimport (\n    \"context\"\n    \"fmt\"\n\n    \"github.com/modelcontextprotocol/go-sdk/mcp\"\n)\n\ntype Tool1Input struct {\n    Param1 string `json:\"param1\" jsonschema:\"required,description=First parameter\"`\n    Param2 int    `json:\"param2,omitempty\" jsonschema:\"description=Optional second parameter\"`\n}\n\ntype Tool1Output struct {\n    Result string `json:\"result\" jsonschema:\"description=The result of the operation\"`\n    Status string `json:\"status\" jsonschema:\"description=Operation status\"`\n}\n\nfunc Tool1Handler(ctx context.Context, req *mcp.CallToolRequest, input Tool1Input) (\n    *mcp.CallToolResult,\n    Tool1Output,\n    error,\n) {\n    // Validate input\n    if input.Param1 == \"\" {\n        return nil, Tool1Output{}, fmt.Errorf(\"param1 is required\")\n    }\n\n    // Check context\n    if ctx.Err() != nil {\n        return nil, Tool1Output{}, ctx.Err()\n    }\n\n    // Perform operation\n    result := fmt.Sprintf(\"Processed: %s\", input.Param1)\n\n    return nil, Tool1Output{\n        Result: result,\n        Status: \"success\",\n    }, nil\n}\n\nfunc RegisterTool1(server *mcp.Server) {\n    mcp.AddTool(server,\n        &mcp.Tool{\n            Name:        \"tool1\",\n            Description: \"Description of what tool1 does\",\n        },\n        Tool1Handler,\n    )\n}\n```\n\n## tools/registry.go Template\n\n```go\npackage tools\n\nimport \"github.com/modelcontextprotocol/go-sdk/mcp\"\n\nfunc RegisterTools(server *mcp.Server) {\n    RegisterTool1(server)\n    RegisterTool2(server)\n    // Register additional tools here\n}\n```\n\n## config/config.go Template\n\n```go\npackage config\n\nimport \"os\"\n\ntype Config struct {\n    ServerName string\n    Version    string\n    LogLevel   string\n}\n\nfunc Load() *Config {\n    return &Config{\n        ServerName: getEnv(\"SERVER_NAME\", \"{{PROJECT_NAME}}\"),\n        Version:    getEnv(\"VERSION\", \"v1.0.0\"),\n        LogLevel:   getEnv(\"LOG_LEVEL\", \"info\"),\n    }\n}\n\nfunc getEnv(key, defaultValue string) string {\n    if value := os.Getenv(key); value != \"\" {\n        return value\n    }\n    return defaultValue\n}\n```\n\n## main_test.go Template\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"testing\"\n\n    \"github.com/yourusername/{{PROJECT_NAME}}/tools\"\n)\n\nfunc TestTool1Handler(t *testing.T) {\n    ctx := context.Background()\n    input := tools.Tool1Input{\n        Param1: \"test\",\n        Param2: 42,\n    }\n\n    result, output, err := tools.Tool1Handler(ctx, nil, input)\n    if err != nil {\n        t.Fatalf(\"Tool1Handler failed: %v\", err)\n    }\n\n    if output.Status != \"success\" {\n        t.Errorf(\"Expected status 'success', got '%s'\", output.Status)\n    }\n\n    if result != nil {\n        t.Error(\"Expected result to be nil\")\n    }\n}\n```\n\n## README.md Template\n\n```markdown\n# {{PROJECT_NAME}}\n\nA Model Context Protocol (MCP) server built with Go.\n\n## Description\n\n{{PROJECT_DESCRIPTION}}\n\n## Installation\n\n\\`\\`\\`bash\ngo mod download\ngo build -o {{PROJECT_NAME}}\n\\`\\`\\`\n\n## Usage\n\nRun the server with stdio transport:\n\n\\`\\`\\`bash\n./{{PROJECT_NAME}}\n\\`\\`\\`\n\n## Configuration\n\nConfigure via environment variables:\n\n- `SERVER_NAME`: Server name (default: \"{{PROJECT_NAME}}\")\n- `VERSION`: Server version (default: \"v1.0.0\")\n- `LOG_LEVEL`: Logging level (default: \"info\")\n\n## Available Tools\n\n### tool1\n{{TOOL1_DESCRIPTION}}\n\n**Input:**\n- `param1` (string, required): First parameter\n- `param2` (int, optional): Second parameter\n\n**Output:**\n- `result` (string): Operation result\n- `status` (string): Status of the operation\n\n## Development\n\nRun tests:\n\n\\`\\`\\`bash\ngo test ./...\n\\`\\`\\`\n\nBuild:\n\n\\`\\`\\`bash\ngo build -o {{PROJECT_NAME}}\n\\`\\`\\`\n\n## License\n\nMIT\n```\n\n## Generation Instructions\n\nWhen generating a Go MCP server:\n\n1. **Initialize Module**: Create `go.mod` with proper module path\n2. **Structure**: Follow the template directory structure\n3. **Type Safety**: Use structs with JSON schema tags for all inputs/outputs\n4. **Error Handling**: Validate inputs, check context, wrap errors\n5. **Documentation**: Add clear descriptions and examples\n6. **Testing**: Include at least one test per tool\n7. **Configuration**: Use environment variables for config\n8. **Logging**: Use structured logging (log/slog)\n9. **Graceful Shutdown**: Handle signals properly\n10. **Transport**: Default to stdio, document alternatives\n\n## Best Practices\n\n- Keep tools focused and single-purpose\n- Use descriptive names for types and functions\n- Include JSON schema documentation in struct tags\n- Always respect context cancellation\n- Return descriptive errors\n- Keep main.go minimal, logic in packages\n- Write tests for tool handlers\n- Document all exported functions","tags":["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/go-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-22T08:40:12.485Z","embedding":null,"createdAt":"2026-04-18T20:26:11.451Z","updatedAt":"2026-04-22T08:40:12.485Z","lastSeenAt":"2026-04-22T08:40:12.485Z","tsv":"'-3':67 '/config':145 '/modelcontextprotocol/go-sdk':124 '/modelcontextprotocol/go-sdk/mcp':139,229,344 '/tools':151,421 '/yourusername/':116,142,148,418 '1':39,169,578 '1.23':120 '10':650 '2':46,66,587 '3':54,594 '4':62,606 '42':433 '5':73,615 '6':82,622 '7':90,631 '8':638 '9':644 'add':617 'addit':354 'altern':656 'alway':680 'avail':528 'awesom':5 'bash':486,502,558,562 'basic':92 'best':657 'build':491,561,564 'built':479 'cancel':157,161,180,683 'capabl':191 'category-awesome-copilot' 'cfg':154 'cfg.servername':187 'cfg.version':189 'chan':167 'check':296,611 'clear':618 'complet':17 'config':106,361,365,375,377,637 'config.go':107 'config.load':155 'config/config.go':357 'configur':57,505,506,632 'context':22,80,132,225,297,414,475,612,682 'context.background':159,427 'context.context':277 'context.withcancel':158 'copilot':6 'creat':33,181,581 'ctx':156,210,276,426,438 'ctx.err':299,304 'default':514,520,526,652 'defaultvalu':396,407 'defer':160 'depend':47 'descript':239,248,260,271,329,330,482,484,532,619,667,685 'develop':555 'directori':592 'document':83,616,655,676,698 'download':489 'environ':508,634 'err':208,212,218,436,442,448 'error':74,77,216,284,607,614,686 'exampl':621 'expect':453,463 'export':700 'fail':446 'first':240,537 'fmt':226 'fmt.errorf':292 'fmt.sprintf':308 'focus':661 'follow':589 'func':152,175,274,320,345,373,393,422 'function':672,701 'generat':4,14,15,570,573 'getenv':379,385,389,394 'github':9 'github.com':115,123,138,141,147,228,343,417 'github.com/modelcontextprotocol/go-sdk':122 'github.com/modelcontextprotocol/go-sdk/mcp':137,227,342 'github.com/yourusername/':114,140,146,416 'go':1,10,28,35,43,112,119,128,174,221,338,359,410,481,487,490,559,563,575 'go.mod':98,110,582 'go.sum':99 'got':456 'grace':163,645 'handl':75,78,162,608,647 'handler':697 'import':131,224,341,362,413 'includ':624,673 'info':392,527 'initi':579 'input':280,286,428,440,533,610 'input.param1':288,311 'inputs/outputs':72,605 'instal':485 'instruct':89,571 'int':243,540 'json':235,244,257,268,600,674 'jsonschema':237,247,259,270 'keep':659,687 'key':395,402 'layout':45 'least':65,626 'level':391,523,525 'licens':568 'load':374 'log':133,390,522,524,639,642 'log.fatalf':214 'log.println':177 'log/slog':643 'logic':690 'loglevel':371,388 'main':130,153,412 'main.go':100,126,688 'main_test.go':109,408 'make':166 'markdown':470 'mcp':2,11,24,36,49,58,477,576 'mcp.addtool':324 'mcp.calltoolrequest':279 'mcp.calltoolresult':282 'mcp.implementation':185 'mcp.newserver':184 'mcp.options':190 'mcp.promptscapability':198 'mcp.resourcescapability':196 'mcp.server':323,348 'mcp.servercapabilities':192 'mcp.stdiotransport':206 'mcp.tool':326 'mcp.toolscapability':194 'minim':689 'mit':569 'mod':488 'model':21,474 'modul':44,113,580,585 'myserv':97 'name':118,144,150,186,327,381,383,420,472,494,504,511,513,516,567,668 'necessari':52 'nil':213,290,300,302,313,319,439,443,461,467 'o':492,565 'offici':48 'omitempti':246 'one':627 'oper':265,272,306,547,554 'option':249,541 'os':134,363 'os.getenv':401 'os.interrupt':172 'os.signal':168 'os/signal':135 'output':435,544 'output.status':450,458 'packag':53,129,222,339,360,411,692 'param1':233,236,293,430,534 'param2':242,245,432,539 'paramet':241,251,538,543 'path':586 'per':629 'perform':305 'practic':658 'process':309 'product':19 'production-readi':18 'project':13,26,29,40,117,143,149,382,419,471,483,493,503,515,566 'prompt':197 'proper':42,76,584,649 'protocol':23,476 'purpos':665 'readi':20 'readm':84 'readme.md':108,468 'regist':199,353 'registertool':346 'registertool1':321,349 'registertool2':351 'req':278 'requir':30,121,238,295,536 'resourc':104,195 'resource1.go':105 'respect':681 'result':255,258,262,307,315,316,434,460,464,545,548 'return':289,301,312,376,404,406,684 'run':203,496,556 'safeti':596 'schema':601,675 'sdk':50 'second':250,542 'server':3,12,25,37,55,59,182,183,202,204,215,322,325,347,350,352,380,478,498,510,512,518,577 'server.run':209 'servernam':367,378 'setup':56,86 'shut':178 'shutdown':164,646 'sigch':165,171,176 'signal':648 'signal.notify':170 'singl':664 'single-purpos':663 'skill':7 'source-github' 'status':266,269,273,317,454,549,551 'stdio':500,654 'string':234,256,267,368,370,372,397,398,535,546,550 'struct':232,254,366,598,678 'structur':41,94,96,588,593,641 'success':318,451,455 'syscal':136 'syscall.sigterm':173 't.error':462 't.errorf':452 't.fatalf':444 'tag':602,679 'templat':95,111,127,220,337,358,409,469,591 'test':91,93,415,431,557,560,623,628,694 'testing.t':425 'testtool1handler':423 'tool':63,69,101,193,200,223,340,355,529,630,660,696 'tool1':328,333,530,531 'tool1.go':102 'tool1handler':275,335,445 'tool1input':231,281 'tool1output':253,283,291,303,314 'tool2.go':103 'tools.registertools':201 'tools.tool1handler':437 'tools.tool1input':429 'tools/registry.go':336 'tools/tool1.go':219 'transport':61,205,211,501,651 'type':71,230,252,364,595,670 'usag':81,88,495 'use':68,597,633,640,666 'v':217,447 'v1.0.0':125,387,521 'valid':285,609 'valu':400,403,405 'variabl':509,635 'version':188,369,384,386,517,519 'via':507 'wrap':613 'write':693","prices":[{"id":"fd189d54-d689-4168-b328-f2a8a01ae534","listingId":"4e1ab2ee-0923-4d88-a2b7-ddb5f070425b","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:26:11.451Z"}],"sources":[{"listingId":"4e1ab2ee-0923-4d88-a2b7-ddb5f070425b","source":"github","sourceId":"github/awesome-copilot/go-mcp-server-generator","sourceUrl":"https://github.com/github/awesome-copilot/tree/main/skills/go-mcp-server-generator","isPrimary":false,"firstSeenAt":"2026-04-18T21:49:36.370Z","lastSeenAt":"2026-04-22T06:52:22.528Z"},{"listingId":"4e1ab2ee-0923-4d88-a2b7-ddb5f070425b","source":"skills_sh","sourceId":"github/awesome-copilot/go-mcp-server-generator","sourceUrl":"https://skills.sh/github/awesome-copilot/go-mcp-server-generator","isPrimary":true,"firstSeenAt":"2026-04-18T20:26:11.451Z","lastSeenAt":"2026-04-22T08:40:12.485Z"}],"details":{"listingId":"4e1ab2ee-0923-4d88-a2b7-ddb5f070425b","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"github","slug":"go-mcp-server-generator","source":"skills_sh","category":"awesome-copilot","skills_sh_url":"https://skills.sh/github/awesome-copilot/go-mcp-server-generator"},"updatedAt":"2026-04-22T08:40:12.485Z"}}