{"id":"25b27dae-22ef-4ee1-a483-6fe6ca10589e","shortId":"RFpaV3","kind":"skill","title":"MCP Integration Assistant","tagline":"Helps design and implement Model Context Protocol (MCP) server integrations for AI agents.","description":"# MCP Integration Assistant\n\n## What this skill does\n\nThis skill guides the design and implementation of a Model Context Protocol (MCP) server that exposes an external system, API, or data source as tools, resources, or prompts for AI agents. It designs the tool schema, writes the server handler code, generates the client configuration snippet, and explains how to test the integration. The output is a working MCP server ready for use with Claude Desktop, Claude Code, Cline, or any MCP-compatible agent.\n\nUse this when you want to give an AI agent access to a new system — a database, an internal API, a third-party service, a file system, or any data source — through the standard MCP protocol.\n\n## How to use\n\n### Claude Code / Cline\n\nCopy this file to `.agents/skills/mcp-integration-assistant/SKILL.md` in your project root.\n\nThen describe what you want to expose and ask:\n- *\"Use the MCP Integration Assistant skill to build an MCP server for our Postgres database.\"*\n- *\"Design an MCP integration for the GitHub API using the MCP Integration Assistant skill.\"*\n\nDescribe the external system, what operations the agent should be able to perform, and any auth requirements.\n\n### Cursor\n\nAdd the \"Prompt / Instructions\" section to your `.cursorrules` file. Describe the system you want to expose and ask Cursor to design the MCP server.\n\n### Codex\n\nDescribe the target system and the operations you want to expose, then include the instructions below. Provide any relevant API docs or existing SDK code.\n\n## The Prompt / Instructions for the Agent\n\nWhen asked to design an MCP integration, follow these steps:\n\n1. **Understand the target system.** Ask for or infer:\n   - What external system, API, or data source needs to be exposed\n   - What operations should the agent be able to perform (read, write, search, execute, etc.)\n   - Authentication method (API key, OAuth, none, environment variable)\n   - Any existing SDK or client library available\n   - Programming language preference (TypeScript/Node.js is the primary MCP SDK language)\n\n2. **Choose the right MCP primitive for each capability:**\n   - **Tools** — actions the agent can invoke with parameters and receive a result (call an API, query a database, run a command). Use for anything that *does something*.\n   - **Resources** — data the agent can read (files, URLs, database records). Use for structured data the agent needs as context. Resources have URIs.\n   - **Prompts** — reusable prompt templates the agent can invoke. Use for common workflows or task templates.\n\n   Most integrations primarily use Tools. Resources are best for large, browseable data. Prompts are optional.\n\n3. **Design the tool schema for each tool:**\n   - `name`: lowercase, hyphenated, descriptive verb-noun (e.g., `search-issues`, `create-record`, `get-user`)\n   - `description`: one sentence. Explain what the tool does AND what an agent should use it for. Good descriptions help the agent decide when to call the tool.\n   - `inputSchema`: JSON Schema object defining all parameters with:\n     - `type`, `description`, and `required` for each field\n     - Meaningful `enum` values where the set of options is known\n     - Realistic `examples` or `default` values where applicable\n   - Keep tools focused: one tool, one action. Avoid \"do everything\" tools.\n\n4. **Write the MCP server in TypeScript** using the `@modelcontextprotocol/sdk` package:\n\n   ```typescript\n   import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n   import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n   import { z } from \"zod\";\n\n   const server = new McpServer({\n     name: \"your-server-name\",\n     version: \"1.0.0\",\n   });\n\n   server.tool(\"tool-name\", \"Description\", { param: z.string() }, async ({ param }) => {\n     // implementation\n     return { content: [{ type: \"text\", text: result }] };\n   });\n\n   const transport = new StdioServerTransport();\n   await server.connect(transport);\n   ```\n\n   Use Zod for input validation. Return `{ content: [{ type: \"text\", text: \"...\" }] }` for success. Return `{ content: [...], isError: true }` for errors.\n\n5. **Handle authentication securely:**\n   - API keys and secrets must come from environment variables, never hardcoded\n   - Show how to read them: `const apiKey = process.env.MY_SERVICE_API_KEY`\n   - Include an error if required env vars are missing at startup\n\n6. **Generate the client configuration snippet** for `claude_desktop_config.json`:\n   ```json\n   {\n     \"mcpServers\": {\n       \"your-server-name\": {\n         \"command\": \"node\",\n         \"args\": [\"/absolute/path/to/dist/index.js\"],\n         \"env\": {\n           \"MY_SERVICE_API_KEY\": \"your-key-here\"\n         }\n       }\n     }\n   }\n   ```\n   Also show the equivalent for Claude Code / Cline if different.\n\n7. **Explain the testing approach:**\n   - Run the server manually with `node dist/index.js` and send JSON-RPC messages via stdin\n   - List the MCP Inspector tool (`npx @modelcontextprotocol/inspector`) for interactive testing\n   - Describe a smoke test for each tool\n\n8. **Output format:**\n\n```\n## MCP Integration: [System Name]\n\n### Tools Designed\n| Tool Name | Description | Key Parameters |\n|-----------|-------------|----------------|\n| ... | ... | ... |\n\n### Server Code\n```typescript\n[Full server implementation]\n```\n\n### package.json dependencies\n```json\n[Required packages]\n```\n\n### Client Configuration\n```json\n[claude_desktop_config.json snippet]\n```\n\n### Environment Variables\n| Variable | Required | Description |\n|----------|----------|-------------|\n| ... | ... | ... |\n\n### Testing\n[How to test each tool]\n```\n\n## Example\n\n**Input to Agent:**\n> \"Use the MCP Integration Assistant skill to build an MCP server that lets an AI agent search and create Notion pages. Auth is via a Notion integration token.\"\n\n**Output from Agent:**\n> ## MCP Integration: Notion\n>\n> ### Tools Designed\n> | Tool Name | Description | Key Parameters |\n> |-----------|-------------|----------------|\n> | `search-notion` | Search for pages and databases by title or content. Use when the agent needs to find existing Notion content. | `query` (string), `filter` (page/database) |\n> | `get-notion-page` | Retrieve the full content of a Notion page by ID. Use when the agent needs to read a specific page. | `pageId` (string) |\n> | `create-notion-page` | Create a new page in a Notion database. Use when the agent needs to write structured data to Notion. | `parentId`, `title`, `properties`, `content` |\n>\n> ### Server Code\n> ```typescript\n> import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n> import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n> import { z } from \"zod\";\n> import { Client } from \"@notionhq/client\";\n>\n> const notionToken = process.env.NOTION_TOKEN;\n> if (!notionToken) throw new Error(\"NOTION_TOKEN environment variable is required\");\n>\n> const notion = new Client({ auth: notionToken });\n>\n> const server = new McpServer({\n>   name: \"notion-mcp\",\n>   version: \"1.0.0\",\n> });\n>\n> server.tool(\n>   \"search-notion\",\n>   \"Search Notion pages and databases by title or content. Use when you need to find existing Notion content before reading or updating it.\",\n>   {\n>     query: z.string().describe(\"The search query\"),\n>     filter: z.enum([\"page\", \"database\"]).optional().describe(\"Filter results to pages or databases only\"),\n>   },\n>   async ({ query, filter }) => {\n>     try {\n>       const response = await notion.search({\n>         query,\n>         filter: filter ? { property: \"object\", value: filter } : undefined,\n>       });\n>       const results = response.results.map((r: any) => ({\n>         id: r.id,\n>         title: r.properties?.title?.title?.[0]?.plain_text ?? r.title?.[0]?.plain_text ?? \"Untitled\",\n>         url: r.url,\n>         type: r.object,\n>       }));\n>       return { content: [{ type: \"text\", text: JSON.stringify(results, null, 2) }] };\n>     } catch (err: any) {\n>       return { content: [{ type: \"text\", text: `Error: ${err.message}` }], isError: true };\n>     }\n>   }\n> );\n>\n> server.tool(\n>   \"get-notion-page\",\n>   \"Retrieve the full content of a Notion page by its ID. Use when you have a page ID from search results and need to read the content.\",\n>   { pageId: z.string().describe(\"The Notion page ID\") },\n>   async ({ pageId }) => {\n>     try {\n>       const [page, blocks] = await Promise.all([\n>         notion.pages.retrieve({ page_id: pageId }),\n>         notion.blocks.children.list({ block_id: pageId }),\n>       ]);\n>       return { content: [{ type: \"text\", text: JSON.stringify({ page, blocks: blocks.results }, null, 2) }] };\n>     } catch (err: any) {\n>       return { content: [{ type: \"text\", text: `Error: ${err.message}` }], isError: true };\n>     }\n>   }\n> );\n>\n> const transport = new StdioServerTransport();\n> await server.connect(transport);\n> ```\n>\n> ### Client Configuration\n> ```json\n> {\n>   \"mcpServers\": {\n>     \"notion-mcp\": {\n>       \"command\": \"node\",\n>       \"args\": [\"/absolute/path/to/notion-mcp/dist/index.js\"],\n>       \"env\": {\n>         \"NOTION_TOKEN\": \"secret_your_integration_token_here\"\n>       }\n>     }\n>   }\n> }\n> ```\n>\n> ### Environment Variables\n> | Variable | Required | Description |\n> |----------|----------|-------------|\n> | `NOTION_TOKEN` | Yes | Notion integration token from https://www.notion.so/my-integrations |\n>\n> ### Testing\n> 1. Run `npx @modelcontextprotocol/inspector node dist/index.js` to open the interactive inspector\n> 2. Test `search-notion` with a query matching a known page title\n> 3. Copy the returned ID and test `get-notion-page` with it\n> 4. Test `create-notion-page` with a known database ID and verify the page appears in Notion","tags":["mcp","integration","assistant","openagentskills","notysoty","agent-skills","claude","claude-code","claude-skills","cline","cursor","llm"],"capabilities":["skill","source-notysoty","skill-mcp-integration-assistant","topic-agent-skills","topic-claude","topic-claude-code","topic-claude-skills","topic-cline","topic-cursor","topic-llm","topic-llm-skills","topic-skills"],"categories":["openagentskills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Notysoty/openagentskills/mcp-integration-assistant","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Notysoty/openagentskills","source_repo":"https://github.com/Notysoty/openagentskills","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 8 github stars · SKILL.md body (9,685 chars)","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-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:13:22.746Z","embedding":null,"createdAt":"2026-05-18T13:20:44.020Z","updatedAt":"2026-05-18T19:13:22.746Z","lastSeenAt":"2026-05-18T19:13:22.746Z","tsv":"'/absolute/path/to/dist/index.js':645 '/absolute/path/to/notion-mcp/dist/index.js':1118 '/my-integrations':1141 '0':990,994 '1':273,1143 '1.0.0':549,916 '2':332,1010,1088,1154 '3':420,1167 '4':515,1180 '5':591 '6':628 '7':665 '8':702 'abl':199,299 'access':109 'action':342,510 'add':207 'agent':16,54,98,108,196,262,297,344,371,383,395,456,465,746,762,777,803,831,855 'agents/skills/mcp-integration-assistant/skill.md':146 'ai':15,53,107,761 'also':655 'anyth':364 'api':43,118,182,251,285,309,355,595,615,649 'apikey':612 'appear':1195 'applic':503 'approach':669 'arg':644,1117 'ask':159,224,264,278 'assist':3,19,164,187,751 'async':557,963,1062 'auth':204,768,905 'authent':307,593 'avail':321 'avoid':511 'await':570,969,1068,1105 'best':412 'block':1067,1075,1085 'blocks.results':1086 'browseabl':415 'build':167,754 'call':353,469 'capabl':340 'catch':1011,1089 'choos':333 'claud':88,90,139,660 'claude_desktop_config.json':635,730 'client':67,319,631,727,883,904,1108 'cline':92,141,662 'code':64,91,140,256,661,717,868 'codex':231 'come':600 'command':361,642,1115 'common':400 'compat':97 'configur':68,632,728,1109 'const':539,566,611,886,901,907,967,979,1065,1101 'content':561,579,586,799,809,821,866,929,938,1003,1015,1031,1054,1079,1093 'context':9,34,386 'copi':142,1168 'creat':440,765,841,844,1183 'create-notion-pag':840,1182 'create-record':439 'cursor':206,225 'cursorrul':214 'data':45,129,287,369,381,416,860 'databas':115,174,358,376,795,851,925,953,961,1189 'decid':466 'default':500 'defin':476 'depend':723 'describ':152,189,216,232,695,946,955,1057 'descript':431,445,462,481,554,713,736,785,1131 'design':5,28,56,175,227,266,421,710,782 'desktop':89 'differ':664 'dist/index.js':676,1148 'doc':252 'e.g':435 'enum':488 'env':622,646,1119 'environ':313,602,732,897,1127 'equival':658 'err':1012,1090 'err.message':1020,1098 'error':590,619,894,1019,1097 'etc':306 'everyth':513 'exampl':498,743 'execut':305 'exist':254,316,807,936 'explain':71,448,666 'expos':39,157,222,242,292 'extern':41,191,283 'field':486 'file':125,144,215,374 'filter':812,950,956,965,972,973,977 'find':806,935 'focus':506 'follow':270 'format':704 'full':719,820,1030 'generat':65,629 'get':443,815,1025,1175 'get-notion-pag':814,1024,1174 'get-us':442 'github':181 'give':105 'good':461 'guid':26 'handl':592 'handler':63 'hardcod':605 'help':4,463 'hyphen':430 'id':827,984,1038,1045,1061,1072,1076,1171,1190 'implement':7,30,559,721 'import':527,531,535,870,874,878,882 'includ':244,617 'infer':281 'input':576,744 'inputschema':472 'inspector':688,1153 'instruct':210,246,259 'integr':2,13,18,76,163,178,186,269,406,706,750,773,779,1124,1136 'interact':693,1152 'intern':117 'invok':346,397 'iserror':587,1021,1099 'issu':438 'json':473,636,680,724,729,1110 'json-rpc':679 'json.stringify':1007,1083 'keep':504 'key':310,596,616,650,653,714,786 'known':496,1164,1188 'languag':323,331 'larg':414 'let':759 'librari':320 'list':685 'lowercas':429 'manual':673 'match':1162 'mcp':1,11,17,36,82,96,134,162,169,177,185,229,268,329,336,518,687,705,749,756,778,914,1114 'mcp-compat':95 'mcpserver':528,542,637,871,910,1111 'meaning':487 'messag':682 'method':308 'miss':625 'model':8,33 'modelcontextprotocol/inspector':691,1146 'modelcontextprotocol/sdk':524 'modelcontextprotocol/sdk/server/mcp.js':530,873 'modelcontextprotocol/sdk/server/stdio.js':534,877 'must':599 'name':428,543,547,553,641,708,712,784,911 'need':289,384,804,832,856,933,1050 'never':604 'new':112,541,568,846,893,903,909,1103 'node':643,675,1116,1147 'none':312 'notion':766,772,780,790,808,816,824,842,850,862,895,902,913,920,922,937,1026,1034,1059,1113,1120,1132,1135,1158,1176,1184,1197 'notion-mcp':912,1112 'notion.blocks.children.list':1074 'notion.pages.retrieve':1070 'notion.search':970 'notionhq/client':885 'notiontoken':887,891,906 'noun':434 'npx':690,1145 'null':1009,1087 'oauth':311 'object':475,975 'one':446,507,509 'open':1150 'oper':194,238,294 'option':419,494,954 'output':78,703,775 'packag':525,726 'package.json':722 'page':767,793,817,825,837,843,847,923,952,959,1027,1035,1044,1060,1066,1071,1084,1165,1177,1185,1194 'page/database':813 'pageid':838,1055,1063,1073,1077 'param':555,558 'paramet':348,478,715,787 'parentid':863 'parti':122 'perform':201,301 'plain':991,995 'postgr':173 'prefer':324 'primari':328 'primarili':407 'primit':337 'process.env.my':613 'process.env.notion':888 'program':322 'project':149 'promise.all':1069 'prompt':51,209,258,390,392,417 'properti':865,974 'protocol':10,35,135 'provid':248 'queri':356,810,944,949,964,971,1161 'r':982 'r.id':985 'r.object':1001 'r.properties':987 'r.title':993 'r.url':999 'read':302,373,609,834,940,1052 'readi':84 'realist':497 'receiv':350 'record':377,441 'relev':250 'requir':205,483,621,725,735,900,1130 'resourc':49,368,387,410 'respons':968 'response.results.map':981 'result':352,565,957,980,1008,1048 'retriev':818,1028 'return':560,578,585,1002,1014,1078,1092,1170 'reusabl':391 'right':335 'root':150 'rpc':681 'run':359,670,1144 'schema':59,424,474 'sdk':255,317,330 'search':304,437,763,789,791,919,921,948,1047,1157 'search-issu':436 'search-not':788,918,1156 'secret':598,1122 'section':211 'secur':594 'send':678 'sentenc':447 'server':12,37,62,83,170,230,519,540,546,640,672,716,720,757,867,908 'server.connect':571,1106 'server.tool':550,917,1023 'servic':123,614,648 'set':492 'show':606,656 'skill':22,25,165,188,752 'skill-mcp-integration-assistant' 'smoke':697 'snippet':69,633,731 'someth':367 'sourc':46,130,288 'source-notysoty' 'specif':836 'standard':133 'startup':627 'stdin':684 'stdioservertransport':532,569,875,1104 'step':272 'string':811,839 'structur':380,859 'success':584 'system':42,113,126,192,218,235,277,284,707 'target':234,276 'task':403 'templat':393,404 'test':74,668,694,698,737,740,1142,1155,1173,1181 'text':563,564,581,582,992,996,1005,1006,1017,1018,1081,1082,1095,1096 'third':121 'third-parti':120 'throw':892 'titl':797,864,927,986,988,989,1166 'token':774,889,896,1121,1125,1133,1137 'tool':48,58,341,409,423,427,451,471,505,508,514,552,689,701,709,711,742,781,783 'tool-nam':551 'topic-agent-skills' 'topic-claude' 'topic-claude-code' 'topic-claude-skills' 'topic-cline' 'topic-cursor' 'topic-llm' 'topic-llm-skills' 'topic-skills' 'transport':567,572,1102,1107 'tri':966,1064 'true':588,1022,1100 'type':480,562,580,1000,1004,1016,1080,1094 'typescript':521,526,718,869 'typescript/node.js':325 'undefin':978 'understand':274 'untitl':997 'updat':942 'uri':389 'url':375,998 'use':86,99,138,160,183,362,378,398,408,458,522,573,747,800,828,852,930,1039 'user':444 'valid':577 'valu':489,501,976 'var':623 'variabl':314,603,733,734,898,1128,1129 'verb':433 'verb-noun':432 'verifi':1192 'version':548,915 'via':683,770 'want':103,155,220,240 'work':81 'workflow':401 'write':60,303,516,858 'www.notion.so':1140 'www.notion.so/my-integrations':1139 'yes':1134 'your-key-her':651 'your-server-nam':544,638 'z':536,879 'z.enum':951 'z.string':556,945,1056 'zod':538,574,881","prices":[{"id":"ec726319-d88c-4086-aa69-f6ee89115fe6","listingId":"25b27dae-22ef-4ee1-a483-6fe6ca10589e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Notysoty","category":"openagentskills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:20:44.020Z"}],"sources":[{"listingId":"25b27dae-22ef-4ee1-a483-6fe6ca10589e","source":"github","sourceId":"Notysoty/openagentskills/mcp-integration-assistant","sourceUrl":"https://github.com/Notysoty/openagentskills/tree/main/skills/mcp-integration-assistant","isPrimary":false,"firstSeenAt":"2026-05-18T13:20:44.020Z","lastSeenAt":"2026-05-18T19:13:22.746Z"}],"details":{"listingId":"25b27dae-22ef-4ee1-a483-6fe6ca10589e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Notysoty","slug":"mcp-integration-assistant","github":{"repo":"Notysoty/openagentskills","stars":8,"topics":["agent-skills","claude","claude-code","claude-skills","cline","cursor","llm","llm-skills","skills"],"license":"mit","html_url":"https://github.com/Notysoty/openagentskills","pushed_at":"2026-03-28T06:50:19Z","description":"A  community-driven library of reusable AI agent skills for Claude Code, Cursor, Codex, Cline, and more.","skill_md_sha":"94365d9aaf17fa375e37c0fcd812b260e80e6575","skill_md_path":"skills/mcp-integration-assistant/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Notysoty/openagentskills/tree/main/skills/mcp-integration-assistant"},"layout":"multi","source":"github","category":"openagentskills","frontmatter":{"name":"MCP Integration Assistant","description":"Helps design and implement Model Context Protocol (MCP) server integrations for AI agents."},"skills_sh_url":"https://skills.sh/Notysoty/openagentskills/mcp-integration-assistant"},"updatedAt":"2026-05-18T19:13:22.746Z"}}