From claude-team-toolkit
Sentry issues/events/releases via API. Use to fetch errors, resolve/assign issues, release health. SaaS + self-hosted. Multi-org via SENTRY_PROFILE.
npx claudepluginhub tuannv14/claude-team-toolkit --plugin claude-team-toolkitThis skill is limited to using the following tools:
REST against `https://sentry.io/api/0/` (or self-hosted Sentry instance).
Prevents silent decimal mismatch bugs in EVM ERC-20 tokens via runtime decimals lookup, chain-aware caching, bridged-token handling, and normalization. For DeFi bots, dashboards using Python/Web3, TypeScript/ethers, Solidity.
Share bugs, ideas, or general feedback.
REST against https://sentry.io/api/0/ (or self-hosted Sentry instance).
Bearer auth with API token. Profiles isolate org/project pairs.
Arguments: $ARGUMENTS. Profile resolution: --profile <name> → SENTRY_PROFILE → ~/.sentry/active_profile → [default].
curl, jq.
~/.sentry/credentials (mode 600):
[default]
api_url = https://sentry.io/api/0
auth_token = sntrys_xxxxxxxxxxxxxxxxxxxxxxxx
org = my-org-slug
project = backend
[work]
api_url = https://sentry.example.com/api/0 # self-hosted
auth_token = sntrys_xxxxxxxxxxxxxxxxxxxxxxxx
org = company-org
project = api
[client_a]
api_url = https://sentry.io/api/0
auth_token = sntrys_xxxxxxxxxxxxxxxxxxxxxxxx
org = client-a-org
project = mobile
Token scopes (least privilege):
| Operation | Required scope |
|---|---|
| Read issues, events | event:read + project:read |
| Resolve / assign issues | event:write + project:read |
| Read releases | project:releases |
| Manage members | org:read (avoid unless needed) |
Get token: User Settings → Auth Tokens → Create New Token. Use org-scoped tokens (limits to one org) when possible.
source "$HOME/.claude-team-toolkit/lib/credentials.sh"
ctt_load_creds sentry "$PROFILE"
sentry_api() {
local method="$1" path="$2"; shift 2
curl -s -X "$method" \
-H "Authorization: Bearer $CTT_AUTH_TOKEN" \
-H "Content-Type: application/json" \
"$@" \
"$CTT_API_URL$path"
}
issues [--query <q>] [--limit N] — list issuesQ="${QUERY:-is:unresolved}"
sentry_api GET "/projects/$CTT_ORG/$CTT_PROJECT/issues/?query=$(printf %s "$Q" | jq -sRr @uri)&limit=${LIMIT:-25}" \
| jq -r '.[] | "\(.shortId)\t\(.level)\t\(.count)\t\(.title)\n \(.permalink)"'
Common queries:
is:unresolved — open issuesis:unresolved age:-24h — last 24hlevel:error — errors onlyrelease:1.2.3 — specific releaseassigned:me — yoursissue <issueId> — full issue detailsentry_api GET "/issues/$1/" | jq '{
id: .shortId, title, level, status, count, userCount,
firstSeen, lastSeen, assignedTo,
release: .firstRelease.version,
permalink
}'
events <issueId> [--limit N] — recent events for an issuesentry_api GET "/issues/$1/events/?limit=${LIMIT:-10}" \
| jq -r '.[] | "\(.eventID)\t\(.dateCreated)\t\(.user.email // "—")"'
event <eventId> — full event detail (stacktrace + context)sentry_api GET "/projects/$CTT_ORG/$CTT_PROJECT/events/$1/" | jq '{
id: .eventID, message, level, dateCreated,
user, environment, release, dist,
exception: (.entries[] | select(.type=="exception") | .data.values[0] | {type, value, frames: (.stacktrace.frames | map({function, filename, lineno}))})
}'
resolve <issueId> — mark resolvedsource "$HOME/.claude-team-toolkit/lib/confirm.sh"
ctt_confirm "Resolve issue $1 on $CTT_PROFILE?" || return 1
sentry_api PUT "/issues/$1/" -d '{"status":"resolved"}'
ctt_audit_log sentry "resolved $1"
assign <issueId> <username>BODY=$(jq -n --arg u "$2" '{assignedTo: $u}')
sentry_api PUT "/issues/$1/" -d "$BODY"
ctt_audit_log sentry "assigned $1 → $2"
releases [--limit N] — recent releasessentry_api GET "/organizations/$CTT_ORG/releases/?per_page=${LIMIT:-20}" \
| jq -r '.[] | "\(.version)\t\(.dateCreated)\t\(.newGroups // 0) new issues\t\(.commitCount) commits"'
release <version> — release detail + healthsentry_api GET "/organizations/$CTT_ORG/releases/$1/" | jq '{
version, dateCreated,
newGroups, commitCount,
authors: [.authors[].name],
projects: [.projects[].slug]
}'
projects — list projects in orgsentry_api GET "/organizations/$CTT_ORG/projects/" \
| jq -r '.[] | "\(.slug)\t\(.platform)\t\(.id)"'
--full flag opt-in for raw.assignedTo field can be a user OR a team — confirm with user which.delete is not — there is
intentionally NO delete command in this skill.api_url includes path /api/0. Don't forget.Use organization-scoped tokens. They're limited to one org which limits blast radius if leaked.