[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7BVT151GFY6GX2CB4MBD9P9":3,"skill-same:01M7BVT151GFY6GX2CB4MBD9P9":45},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":20,"frontMatter":21,"refName":22,"commitSha":23,"skillDirectory":24,"forksCount":25,"repositoryHtmlUrl":26,"repositoryHomepageUrl":6,"ownerHtmlUrl":27,"ownerBlogUrl":28,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M7BVT151GFY6GX2CB4MBD9P9","adding-a-plugin",null,"CognitionAI\u002Fdevin-marketplace","CognitionAI","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F163493330?v=4","01M7BVSRD98NC4FG8T3EZS6V5M","Cognition","01M7BVSRDX111C2XPWJ0E6MY26",29,"MIT","https:\u002F\u002Fgithub.com\u002FCognitionAI\u002Fdevin-marketplace\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fadding-a-plugin\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"# Adding a plugin\n\nThe repo is itself a Devin plugin: `.devin-plugin\u002Fplugin.json` lists every\noffering under `optionalPlugins`, and that file is the only thing consumers\nread. Two kinds of entry: `\".\u002Fplugins\u002F\u003Cslug>\"` for a plugin authored here (every\nMCP server Devin hosts has one), and a `{ \"source\", \"url\", [\"path\",] \"sha\" }`\nobject for a third-party plugin pinned to an exact commit. Entries are sorted\nand each identity appears once; `python3 scripts\u002Fvalidate.py` enforces all of\nthis and CI runs it.\n\n## An MCP server we host\n\n1. Create `plugins\u002F\u003Cslug>\u002F.devin-plugin\u002Fplugin.json`, where `\u003Cslug>` is the\n   marketplace server slug:\n   * `name` is the slug; `displayName` is the server definition's `name`\n     (the human title, e.g. `\"MySQL\"`); `homepage`, `repository`, and\n     `keywords` come from the server definition too.\n   * Write `description` as one action-oriented sentence about what users\n     can do with the product and the value they get. Aim for 60–130 characters\n     (about 200 maximum), without a trailing period. Expand on\n     `shortDescription`; avoid filler such as \"integration\" or \"MCP server\".\n   * Put requirements outside the install form and connection caveats in optional\n     `setup`, immediately after `shortDescription`:\n     `{\"notice\": \"...\", \"steps\": [\"...\"]}`. Use a one- or two-sentence notice\n     and ordered setup steps without environment-specific URLs. At least one\n     key is required; `notice` must be a non-empty string and `steps` a\n     non-empty list of non-empty strings. No other keys are allowed. Only\n     add `setup` for external steps or meaningful connection caveats. Do not\n     repeat credential fields, placeholder names, OAuth sign-in instructions,\n     or default domains already handled by the install form.\n   * Check the brand mark in as `plugins\u002F\u003Cslug>\u002Flogo.svg` (or `.png`\u002F`.jpg`)\n     and set `\"logo\": \"logo.svg\"` — a path relative to the plugin directory,\n     as in Cursor's plugin format. Prefer this over an absolute `https` URL so\n     cards never load images from a third-party host.\n   * `mcpServers` declares the plugin's servers (usually one, keyed by the\n     slug): `command` + `args` + `env` for stdio, or `url` (+ `headers`) for\n     HTTP. A plugin that only ships `skills\u002F` omits it. Servers live only\n     here: no `.mcp.json`, `mcp.json` or root `plugin.json`.\n   * An HTTP server whose URLs differ only in the query (Supabase's\n     `?read_only=true`) may add `urlOptions`, a list of `{label, url}` that\n     includes `url`. `url` stays the default; members pick another option in\n     the server's settings. A `url` with a `${\u003CNAME>}` part a member types\n     (Datadog's site, `${DATADOG_DD_MCP_DOMAIN:-mcp.datadoghq.com}`) may list\n     instead that URL with the part filled in, one option per value; members\n     can still type a value no option lists.\n   * Never check in a credential. Anything a user supplies is a plain\n     `${\u003CNAME>}` placeholder, resolved from the credentials saved on the\n     user's installation (no `MCP_` prefix). A stdio `env` value must\n     reference its own key (`\"AWS_PROFILE\": \"${AWS_PROFILE}\"`) because a saved\n     credential replaces the env entry with the same key; in `args` and\n     `headers` the placeholder is the credential's only name.\n2. Add `\".\u002Fplugins\u002F\u003Cslug>\"` to `optionalPlugins` in `.devin-plugin\u002Fplugin.json`.\n\n## A third-party plugin\n\n1. Review the vendor and the exact upstream commit you are endorsing.\n2. Add an object to `optionalPlugins`:\n   * whole repository: `{ \"source\": \"url\", \"url\": \"https:\u002F\u002Fgithub.com\u002F\u003Cowner>\u002F\u003Crepo>.git\", \"sha\": \"\u003C40-hex>\" }`\n   * plugin inside a repository: `{ \"source\": \"git-subdir\", \"url\": \"...\", \"path\": \"\u003Cdir>\", \"sha\": \"\u003C40-hex>\" }`\n\n   Always pin a full 40-hex commit sha, never a branch or tag. Do not add\n   display metadata; the plugin's own manifest at that sha supplies it. If we\n   host the same integration ourselves, author it under `plugins\u002F` instead of\n   pointing upstream.\n\n## Testing your plugin\n\n`validate.py` only checks the manifest's shape; before opening a PR, install\nthe plugin from your checkout and have a session call one of its tools (or\nuse one of its skills).\n\n* Locally: `devin plugins install --local .\u002Fplugins\u002F\u003Cslug>`. The directory is\n  used in place, so edits apply on the next session. Export any `${\u003CNAME>}`\n  credential the server needs, then start `devin` and use it.\n* In Devin Cloud, get it into **Customize → Plugins** at personal scope by any\n  of: **Add plugin → Upload .zip** with a zip of `plugins\u002F\u003Cslug>`; **Add\n  plugin → From repository** with your fork and subdirectory `plugins\u002F\u003Cslug>`\n  (installs the fork's default branch); or a session on your branch where you\n  ask Devin to install your plugin as a personal plugin (it uploads the\n  directory, you approve). Then start a new session and have Devin call a\n  tool or use a skill: an MCP that needs OAuth prompts you to authorize it in chat; one that\n  needs a `${\u003CNAME>}` credential has to be connected first from the plugin's\n  Connect button in Customize.\n\n## Both\n\n1. Run `python3 scripts\u002Fvalidate.py --fix` to sort and format the manifest,\n   then `python3 scripts\u002Fvalidate.py --fetch` to confirm upstream pins resolve.\n2. To bump an upstream plugin, change its `sha`. To remove one, delete its\n   entry (and its `plugins\u002F\u003Cslug>` directory if it was authored here).\n3. Consumers pin this repo by commit; after the change lands on `main`, bump\n   their pin to the new sha.\n",{},"main","9836d94e88404aabb682086405c2aa9cba7657ac",".agents\u002Fskills\u002Fadding-a-plugin",156,"https:\u002F\u002Fgithub.com\u002FCognitionAI\u002Fdevin-marketplace","https:\u002F\u002Fgithub.com\u002FCognitionAI","https:\u002F\u002Fcognition.ai\u002F","Makers of Devin, the AI software engineer.","2026-11-13 07:08:23",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add CognitionAI\u002Fdevin-marketplace --skill adding-a-plugin",{"tool":37,"command":38},"bunx","bunx skills add CognitionAI\u002Fdevin-marketplace --skill adding-a-plugin",{"tool":40,"command":41},"pnpm","pnpm dlx skills add CognitionAI\u002Fdevin-marketplace --skill adding-a-plugin","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FCognitionAI\u002Fdevin-marketplace\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fadding-a-plugin\u002FSKILL.md",true,[],[46,52,59,65,72,79],{"skillNo":47,"name":48,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":49,"categories":50,"keywords":51,"publishedAt":18},"01M7BYC4AJGM98P2G9JH7QS24Z","business-data","https:\u002F\u002Fgithub.com\u002FCognitionAI\u002Fdevin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fwindsor-ai\u002Fskills\u002Fbusiness-data\u002FSKILL.md",[],[],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":58,"publishedAt":18},"01M7BYBZ0CD4CBCPZHRZ551BNK","workflow","Creates durable, resumable workflows using Vercel's Workflow SDK. Use when building workflows that need to survive restarts, pause for external events, retry on failure, or coordinate multi-step operations over time. Triggers on mentions of \"workflow\", \"durable functions\", \"resumable\", \"workflow sdk\", \"queue\", \"event\", \"push\", \"subscribe\", or step-based orchestration.","https:\u002F\u002Fgithub.com\u002FCognitionAI\u002Fdevin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fworkflow\u002Fupstream\u002FSKILL.md",[],[],{"skillNo":60,"name":54,"nameZh":6,"description":61,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":64,"publishedAt":18},"01M7BYB1XSZHKHD8JZTQJ62JN0","Vercel Workflow SDK expert guidance. Use when building durable workflows, long-running tasks, API routes or agents that need pause\u002Fresume, retries, step-based execution, or crash-safe orchestration with Vercel Workflow.","https:\u002F\u002Fgithub.com\u002FCognitionAI\u002Fdevin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fworkflow\u002FSKILL.md",[],[],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":18},"01M7BYASGMK935J33E21N5WTW0","verification","Full-story verification — infers what the user is building, then verifies the complete flow end-to-end: browser → API → data → response. Triggers on dev server start and 'why isn't this working' signals.","https:\u002F\u002Fgithub.com\u002FCognitionAI\u002Fdevin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fverification\u002FSKILL.md",[],[],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":18},"01M7BY9WJERKSKEH9HK6E71GW2","vercel-storage","Vercel storage expert guidance — Blob, Global Config (formerly Edge Config), and Marketplace storage (Neon Postgres, Upstash Redis). Use when choosing, configuring, or using data storage with Vercel applications.","https:\u002F\u002Fgithub.com\u002FCognitionAI\u002Fdevin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-storage\u002FSKILL.md",[],[],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":18},"01M7BY9N034894YV2J9DCRZHYS","vercel-services","Configure and troubleshoot Vercel Services for multiple frontends and backends in one project. Use when composing a polyglot or multi-service application on one Vercel deployment; defining the `services` key, service-targeted rewrites, or service bindings in `vercel.json`; or running all services with `vercel dev`.","https:\u002F\u002Fgithub.com\u002FCognitionAI\u002Fdevin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-services\u002FSKILL.md",[],[]]