Source profileQuality 84/100Review permissions

Liberty91LTD/cti-skills/skills/cti-setup/SKILL.md

cti-setup

Use when the user wants to configure API keys for the CTI skills pack, asks "how do I set up keys", "configure VirusTotal", "add my Shodan key", or runs /cti-setup. Walks through API key configuration inside Claude Code without needing to run a shell script. Also handles re-running setup, adding individual keys, and verifying that configured keys work.

Source repository stars
11
Declared platforms
1
Static risk flags
4
Last source update
2026-08-04
Source checked
2026-08-04

Decision brief

What it does—and where it fits

In-chat configuration of API keys for the threat-intel integrations bundled with this pack. Use this when the user is in Claude Code and doesn't want to drop to a shell to run ./scripts/setup.sh.

Best for

  • Use when the user wants to configure API keys for the CTI skills pack, asks "how do I set up keys", "configure VirusTotal", "add my Shodan key", or runs /cti-setup.

Not for

  • Tasks that require unconfirmed production actions or broad system permissions.
  • Environments where the pinned source and install steps cannot be inspected.

Compatibility matrix

Platform support, with evidence labels

PlatformStatusEvidenceWhat to check
CodexNot declaredNo explicit evidencePortability before use
Claude CodeDeclaredSource recordInstall path and trigger
CursorNot declaredNo explicit evidencePortability before use
Gemini CLINot declaredNo explicit evidencePortability before use
Open the compatibility checker

Installation

Inspect first. Install second.

The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

Source-detected install commandSource
npx skills add https://github.com/Liberty91LTD/cti-skills --skill "skills/cti-setup"
Safe inspection promptEditorial

Inspect the Agent Skill "cti-setup" from https://github.com/Liberty91LTD/cti-skills/blob/97d66b3687ba6d32b316a7df3391beb3e2de88de/skills/cti-setup/SKILL.md at commit 97d66b3687ba6d32b316a7df3391beb3e2de88de. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

Workflow

What the source asks the agent to do

  1. 01

    How to write the file

    The file is .claude/settings.local.json. It is gitignored. Do not overwrite it — read, merge the env block, write back. Use the bundled setup script which handles this safely:

    which keys were added (by service name, not the key value)which keys are still unconfiguredthat the file is gitignored
  2. 02

    When to invoke

    User asks "how do I set up keys", "configure my API keys", "add a VirusTotal key", etc.

    User asks "how do I set up keys", "configure my API keys", "add a VirusTotal key", etc.User runs /cti-setupA lookup- skill failed because a key is missing and you want to offer to add it
  3. 03

    What you do

    1. Check current state. Read .claude/settings.local.json. If it's missing or has no env block, the user has zero keys configured. If it has some, list which are present and which are missing. 2. Tell the user the menu. Present the services in a table with: name, env variable, fr…

    Check current state. Read .claude/settings.local.json. If it's missing or has no env block, the user has zero keys configured. If it has some, list which are present and which are missing.Tell the user the menu. Present the services in a table with: name, env variable, free-tier limit, signup URL. Make clear all are optional and that the pack degrades gracefully.Ask which to configure. Let the user provide one, several, or all. Don't force them through every prompt.
  4. 04

    The services

    If the user has a Liberty91 account, configure LIBERTY91APIKEY first — it is the pack's first-party source and /lookup-liberty91 runs before third-party lookups, so it saves other services' quota. Keys are l91live (production) or l91test (development); an empty scope list on the…

    If the user has a Liberty91 account, configure LIBERTY91APIKEY first — it is the pack's first-party source and /lookup-liberty91 runs before third-party lookups, so it saves other services' quota. Keys are l91live (prod…A starter set of VirusTotal + OTX + URLScan + AbuseIPDB covers most IP/domain/URL/hash investigations. Shodan and GreyNoise add value for IP-focused work. Censys is optional (very tight rate limit). MISP requires both a…
  5. 05

    Verifying keys

    If the user wants to verify, run:

    If the user wants to verify, run:This dry-runs each lookup CLI and reports OK/fail per service without making a real API call. If setup.sh is unavailable, dry-run each CLI individually:Exit code 0 = key present and CLI invocation OK. Exit code 2 = missing key.

Permission review

Static risk signals and limitations

Runs scripts

medium · line 4

The documentation asks the agent to run terminal commands or scripts.

In-chat configuration of API keys for the threat-intel integrations bundled with this pack. Use this when the user is in Claude Code and doesn't want to drop to a shell to run `./scripts/setup.sh`.

Writes files

medium · line 19

The documentation asks the agent to create, modify, or delete local files.

**Write the merged file.** Use the non-destructive merge below — preserve every other field in `settings.local.json`.

Runs scripts

medium · line 20

The documentation asks the agent to run terminal commands or scripts.

**Offer to verify.** Ask if they want you to dry-run each configured key against its CLI to confirm it's wired up.

Network access

medium · line 40

The documentation includes network, browsing, or remote request actions.

| Microsoft Sentinel | `SENTINEL_TENANT_ID` + `SENTINEL_CLIENT_ID` + `SENTINEL_CLIENT_SECRET` + `SENTINEL_WORKSPACE_ID` | your Azure tenancy (query API is free; 200 queries/30s) | Azure portal — Entra ID app registration + Log Analytics Rea

Writes files

medium · line 46

The documentation asks the agent to create, modify, or delete local files.

## How to write the file

Network access

medium · line 55

The documentation includes network, browsing, or remote request actions.

-misp-url=https://misp.example.org \

Reads files

low · line 74

The documentation asks the agent to read local files, directories, or repositories.

try { cur = JSON.parse(fs.readFileSync(path, 'utf8')); } catch(e) {}

Evidence record

Why each signal appears

EvidenceSourceComputedTestedEditorial
SignalValueEvidence typeMeaning
Quality score84/100ComputedDocumentation, specificity, maintenance, and trust rules
Repository stars11SourceRepository attention, not individual Skill quality
Compatibility1 platformsSourceDeclared in the catalog source record
Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

Pinned source

Provenance and original SKILL.md

Repository
Liberty91LTD/cti-skills
Skill path
skills/cti-setup/SKILL.md
Commit
97d66b3687ba6d32b316a7df3391beb3e2de88de
License
MIT
Collected
2026-08-04
Default branch
main
View the original SKILL.md

cti-setup

In-chat configuration of API keys for the threat-intel integrations bundled with this pack. Use this when the user is in Claude Code and doesn't want to drop to a shell to run ./scripts/setup.sh.

When to invoke

  • User asks "how do I set up keys", "configure my API keys", "add a VirusTotal key", etc.
  • User runs /cti-setup
  • A lookup-* skill failed because a key is missing and you want to offer to add it
  • After install via /plugin marketplace add or npx (no shell setup ran)

What you do

  1. Check current state. Read .claude/settings.local.json. If it's missing or has no env block, the user has zero keys configured. If it has some, list which are present and which are missing.
  2. Tell the user the menu. Present the services in a table with: name, env variable, free-tier limit, signup URL. Make clear all are optional and that the pack degrades gracefully.
  3. Ask which to configure. Let the user provide one, several, or all. Don't force them through every prompt.
  4. Receive the keys. When the user shares a key, treat it as sensitive — do not echo it back in plain text in your response (refer to it as your VirusTotal key or the masked tail …<last 4 chars>).
  5. Write the merged file. Use the non-destructive merge below — preserve every other field in settings.local.json.
  6. Offer to verify. Ask if they want you to dry-run each configured key against its CLI to confirm it's wired up.
  7. Tell them what's next. "Try /ip-investigation 8.8.8.8" or similar concrete next command.

The services

ServiceEnv variableFree tierSignup
Liberty91 (first-party)LIBERTY91_API_KEY (optional LIBERTY91_API_URL)per-key rate limit + monthly credits on your planLiberty91 platform → user menu → API Access (Owner/Admin only; the secret is shown once)
VirusTotalVIRUSTOTAL_API_KEY4/min, 500/dayvirustotal.com → profile → API key
URLScan.ioURLSCAN_API_KEY100 scans/dayurlscan.io → user settings
ShodanSHODAN_API_KEY1 req/secaccount.shodan.io
AbuseIPDBABUSEIPDB_API_KEY1000 checks/dayabuseipdb.com → account → API
GreyNoiseGREYNOISE_API_KEY50 req/day (community)viz.greynoise.io → account
AlienVault OTXOTX_API_KEY10k req/hourotx.alienvault.com → settings
CensysCENSYS_PAT250 queries/monthaccounts.censys.io → settings → personal-access-tokens
MISPMISP_URL + MISP_API_KEYself-hosted / org-providedyour MISP instance → My Profile → Auth keys
OpenCTIOPENCTI_URL + OPENCTI_TOKENself-hosted / org-providedyour OpenCTI instance → profile → API access (token)
Ransomware.liveRANSOMWARE_LIVE3000 req/day (PRO)my.ransomware.live → free PRO key
ReversingLabs A1000REVERSINGLABS_USER + REVERSINGLABS_PASSWORD (optional REVERSINGLABS_HOST)undocumented; 429+Retry-Afterlicensed product — issued by your RL admin or RL account team
CrowdStrike Falcon IntelligenceCROWDSTRIKE_CLIENT_ID + CROWDSTRIKE_CLIENT_SECRET (optional CROWDSTRIKE_BASE_URL)per-tenant; 429+Retry-Afterlicensed product — Falcon console → Support and resources → API clients and keys (assign Intel read scopes)
Microsoft SentinelSENTINEL_TENANT_ID + SENTINEL_CLIENT_ID + SENTINEL_CLIENT_SECRET + SENTINEL_WORKSPACE_IDyour Azure tenancy (query API is free; 200 queries/30s)Azure portal — Entra ID app registration + Log Analytics Reader role; walkthrough in tools/integrations/sentinel.md

If the user has a Liberty91 account, configure LIBERTY91_API_KEY first — it is the pack's first-party source and /lookup-liberty91 runs before third-party lookups, so it saves other services' quota. Keys are l91_live_ (production) or l91_test_ (development); an empty scope list on the key grants all read scopes, which is the right default for enrichment. Set LIBERTY91_API_URL only to point at a non-production host.

A starter set of VirusTotal + OTX + URLScan + AbuseIPDB covers most IP/domain/URL/hash investigations. Shodan and GreyNoise add value for IP-focused work. Censys is optional (very tight rate limit). MISP requires both a base URL and an auth key — point it at your org's instance. OpenCTI likewise takes a base URL plus an API token and powers /lookup-opencti (two-way: query your knowledge base + push vetted intel back). Ransomware.live powers the lookup-ransomwarelive and ransomware-ecosystem skills (victim/group tracking). ReversingLabs is a licensed product — only configure if your organisation has a Spectra Analyze (A1000) account. CrowdStrike Falcon Intelligence is a licensed subscription — it powers /lookup-crowdstrike for IOC reputation AND threat-actor / TTP / report intelligence; configure if your org has a Falcon Intelligence licence with Intel API scopes. Microsoft Sentinel takes four values and powers /lookup-sentinel (hunt your own workspace: IOC exposure sweeps + ATT&CK TTP hunts, read-only). All four come from the Azure portal: create an Entra ID app registration (→ tenant id + client id), add a client secret (shown once), grant the app Log Analytics Reader on the Sentinel workspace, and copy the Workspace ID from the workspace Overview blade — the step-by-step is in tools/integrations/sentinel.md. No extra licence is needed beyond the workspace itself.

How to write the file

The file is .claude/settings.local.json. It is gitignored. Do not overwrite it — read, merge the env block, write back. Use the bundled setup script which handles this safely:

./scripts/setup.sh --non-interactive \
  --liberty91=USER_PROVIDED_KEY \
  --virustotal=USER_PROVIDED_KEY \
  --shodan=USER_PROVIDED_KEY \
  --misp-url=https://misp.example.org \
  --misp=USER_PROVIDED_KEY \
  --opencti-url=https://opencti.example.org \
  --opencti=USER_PROVIDED_TOKEN \
  --ransomwarelive=USER_PROVIDED_KEY \
  --reversinglabs-user=USER_PROVIDED_USERNAME \
  --reversinglabs-password=USER_PROVIDED_PASSWORD \
  --reversinglabs-host=https://a1000.reversinglabs.com

(Pass only the flags for keys the user actually shared. Available flags: --liberty91, --liberty91-url, --virustotal, --urlscan, --shodan, --abuseipdb, --greynoise, --otx, --censys, --misp-url, --misp, --opencti-url, --opencti, --ransomwarelive, --reversinglabs-user, --reversinglabs-password, --reversinglabs-host, --crowdstrike-client-id, --crowdstrike-client-secret, --crowdstrike-base-url, --sentinel-tenant-id, --sentinel-client-id, --sentinel-client-secret, --sentinel-workspace-id.)

If scripts/setup.sh is not present (e.g. plugin-only install), do the merge yourself with this Node one-liner. Replace KEY=VAL pairs with the user's input:

node -e "
  const fs = require('fs');
  const path = '.claude/settings.local.json';
  let cur = {};
  try { cur = JSON.parse(fs.readFileSync(path, 'utf8')); } catch(e) {}
  cur.env = cur.env || {};
  Object.assign(cur.env, {
    VIRUSTOTAL_API_KEY: 'USER_PROVIDED_KEY',
    SHODAN_API_KEY: 'USER_PROVIDED_KEY',
  });
  fs.mkdirSync('.claude', { recursive: true });
  fs.writeFileSync(path, JSON.stringify(cur, null, 2) + '\n');
"

After writing, confirm to the user:

  • which keys were added (by service name, not the key value)
  • which keys are still unconfigured
  • that the file is gitignored

Verifying keys

If the user wants to verify, run:

./scripts/setup.sh --verify

This dry-runs each lookup CLI and reports OK/fail per service without making a real API call. If setup.sh is unavailable, dry-run each CLI individually:

node tools/clis/virustotal.js ip 8.8.8.8 --dry-run

Exit code 0 = key present and CLI invocation OK. Exit code 2 = missing key.

Removing or rotating a key

To remove a key, edit .claude/settings.local.json and delete the entry from the env block (or set its value to ""). To rotate, just re-run setup with the new value — the merge overwrites that key only.

Security notes

  • Never commit .claude/settings.local.json (already gitignored at repo root).
  • Never echo the full key value back to the user in chat — they shared it once; mask thereafter.
  • Don't write keys to logs, screenshots, or other artefacts.
  • If the user accidentally pastes a key into a public channel, advise them to rotate it on the provider's site and re-run /cti-setup with the new value.

What this does NOT do

  • Does not call the threat-intel APIs (only --dry-run invocations of the local CLIs).
  • Does not download MITRE ATT&CK data — for that, run ./scripts/download-mitre.sh (the /mitre-attack skill self-heals on first use).
  • Does not configure permissions, hooks, or other Claude Code settings — only the env block of settings.local.json.

Alternatives

Compare before choosing

Computed 1007

narrative-io/narrative-skills-marketplace

design-analysis

Translate a fuzzy analytical question into a rigorous investigation plan. Interrogates the ask, grounds the plan in the available data dictionary, applies analytical best practices, and produces a structured brief of query specifications for a downstream query-writing skill. Plans, does not write SQL. Use when: "why did X drop", "is there a relationship between A and B", "who are our highest-value customers", "what's driving the change in Y", "investigate this trend", "design an analysis for", "

Computed 9840,833

luongnv89/claude-howto

self-assessment

Comprehensive Claude Code self-assessment and learning path advisor. Runs a multi-category quiz covering 10 feature areas, produces a detailed skill profile with per-topic scores, identifies specific gaps, and generates a personalized learning path with prioritized next steps. Use when asked to "assess my level", "take the quiz", "find my level", "where should I start", "what should I learn next", "check my skills", "skill check", or "level up".

Computed 97195

PramodDutta/qaskills

Pairwise Test Generator

Generate optimized test combinations using pairwise (all-pairs) testing algorithms to achieve maximum coverage with minimum test cases across multiple input parameters

Computed 97195

PramodDutta/qaskills

RAG Regression Testing

Gate RAG pipelines in CI with versioned golden eval sets, per-metric thresholds, baseline drift detection, and a build that fails when retrieval or answer quality regresses.