Research an upstream service and write a Provider Recipe for it in apps/reef/recipes.
63
79%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./.agents/skills/add-recipe/SKILL.mdWrite a Provider Recipe for the service the user names. A recipe states facts about one Upstream Service (its source, how to authenticate, its inputs and servers) so Reef can pre-fill Provider Setup. It lives at apps/reef/recipes/<id>/recipe.yaml, with an optional icon beside it.
Before you start, read:
GLOSSARY.md, the Provider Recipe entry.docs/adr/.apps/reef/recipes/schema.json: the recipe format. Its description fields are the field docs.linear (MCP, OAuth discovery), github (OpenAPI, device code, public client) and sentry (region input, owner-configured client, servers).Derive the id from the service name: lowercase, [a-z][a-z0-9_]*. If apps/reef/recipes/<id>/ exists, stop and ask the user whether to update that recipe or pick a new id.
Coral reads two kinds of source:
Search the vendor's official docs for both. Record the URL of every doc page you rely on; the PR description cites them.
If the vendor publishes no usable OpenAPI document and no MCP server, look for a third-party OpenAPI document (for example, a community-maintained repo). Audit it against the vendor's API reference before you use it:
If no source survives, stop. Report what you found. If the vendor's only spec is Swagger 2.0, note that converting it to 3.x is possible follow-up work.
Done when you hold at least one usable source URL, or have reported that none exists.
Show the user a short plan and wait for their approval. Cover each point:
<id> for OpenAPI and <id>_mcp for MCP. Give both the same display_name and set service: <id> in the MCP recipe, so the catalog shows both on one card and suggests one namespace (as github_mcp does). A self-hosted edition with its own host: offer <id>_self_hosted as well.default (see below).Authentication rules:
method can express, e.g. OAuth and an API key.oauth_discovery for MCP, or device code or authorization code with a public client. Otherwise default to the API key or personal access token.sentry does). Coral could register its own application later; list that as a follow-up.oauth_discovery server that does not advertise them (as github_mcp does). Request every scope it offers, read and write, with a comment naming what each grants. Coral reads and writes through providers.oauth_discovery server that advertises them (as hubspot does), or a service that takes them from the app's settings (as attio does). Omit scopes for oauth_discovery. The other OAuth methods require the field, so write scopes: []. Add a comment saying why the recipe names none, and for app settings, list the scopes the owner must turn on.Model regions and similar choices as an inputs enum inside one recipe.
For each approved recipe, write apps/reef/recipes/<id>/recipe.yaml. Start it with # yaml-language-server: $schema=../schema.json, then match the shape of the example recipes.
description follows the pattern "Issues, events and releases from Sentry."label and description text in the Reef copy style from AGENTS.md.For the icon, use the vendor's official brand SVG from their brand or press page, or the Simple Icons one. If you find no clean SVG, or its terms are unclear, leave icons out and list it as a follow-up.
Name the logo under icons.light. Reef shows it on a white plate in the light theme and a dark plate in the dark theme. If it does not read on the dark plate, e.g. a black glyph, add the vendor's official or Simple Icons light variant under icons.dark, named <name>-dark.svg. If there is no clean variant or its terms are unclear, leave icons.dark out and list it as a follow-up.
Done when every approved recipe has its file and the plan's decisions all appear in it.
Run, and fix until both pass:
npm ci --prefix apps/reef # once, if apps/reef/node_modules is missing
(cd apps/reef && npx vitest run --project server recipes.server)
npm run check --prefix apps/reefDo not use npm test -- recipes.server. It also runs the Storybook tests, which match no file and exit 1.
The recipe test also enforces rules the schema cannot, such as no undeclared {{input.x}} and no unused credential fields.
Check each source directly:
openapi field of 3.0.x or 3.1.x.initialize request to the URL. Confirm a Streamable HTTP response, or a 401 that points at OAuth when the server needs sign-in.Then give the user steps for a live test, which needs their browser and account:
./dev run (see docs/development.md)./workspaces/<workspace>/providers/new?recipe=<id>.Report:
Then offer to open the PR. If the user accepts, create a branch named <prefix>/add-<id>-recipe, using the user's usual branch prefix, and commit there.
withcoral/coral
b20795b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.