linear
Linear
Linear is reached through linearcli for everyday issue work and through GraphQL with the bundled helper for everything else. There is no Linear MCP in either harness; never ask for a key and never paste one.
Keys come from the environment, or failing that from .env at the root of the current repository: LINEAR_API_KEY for the default workspace, and one LINEAR_API_KEY_<WORKSPACE> per additional workspace. The user's own instructions say which workspace and team prefixes each variable covers; read that mapping there, never infer it from an email, project or issue prefix.
If neither place has the variable, say which one and stop. Never print a key or copy it into a file or command argument.
scripts/graphql reads LINEAR_API_KEY from the environment or the root .env, never from arguments, and posts a complete GraphQL JSON request from standard input to https://api.linear.app/graphql. For another workspace, run it with the variable re-pointed for that one subprocess:
printf '%s' '{"query":"query { viewer { name } }"}' | scripts/graphql
LINEAR_API_KEY="$(python3 scripts/read-credential.py LINEAR_API_KEY_OTHER)" scripts/graphql < request.json
The CLI for everyday issue work
When linearcli (npm @howells/linearcli) is on the path, use it for listing, reading, searching, creating, updating and commenting on issues. It returns JSON in an {ok, data, error, command} envelope. It reads only the environment, so hand it the key through the helper, which also checks the root .env: