Agent skill

Countercall

by CALLE-AI in CALLE-AI/awesome-phone-call-agents

Call a government service counter to find out exactly what a person must bring before they travel there, and return it as a validated checklist.

MITAuto-check passed

Install Countercall

skills CLI
$ npx skills add CALLE-AI/awesome-phone-call-agents --skill countercall -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install CALLE-AI/awesome-phone-call-agents countercall --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/CALLE-AI/awesome-phone-call-agents.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/countercall .claude/skills/countercall && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
countercall
GitHub stars
107
Token cost
~3k tokens
SKILL.md length
1,644 words
Files
11 (incl. scripts, references)
Skills in repo
101
Repo updated
First seen
Licence
MIT

At a glance

Call a government service counter to find out exactly what a person must bring before they travel there, and return it as a validated checklist.

  • Works in 5 steps: Collect the request → Pick a transport, then make sure the… → Place one call → …
  • Published requirements are incomplete
  • SKILL.md covers Before you start, Safety boundaries, What makes this different from… and Workflow, plus 3 more sections
  • Runs JavaScript scripts from its folder; calls node; needs CALLE_API_KEY

What it does

Countercall is an agent skill from CALLE-AI/awesome-phone-call-agents. Call a government service counter to find out exactly what a person must bring before they travel there, and return it as a validated checklist. Use when published requirements are incomplete or contradicted at the window and the only reliable source is the office's phone line. Returns required documents, total fee, payment method, whether an appointment is needed, and how certain the clerk sounded.

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 13 other files, including scripts and reference files (for example `data/offices.json`, `references/examples.md` and `references/result-contract.md`).

The repository describes itself as: Portable phone-call Agent Skills, apps, examples, adapters, and scheduler recipes for AI agents. The licence is MIT.

When your agent uses it

  • Published requirements are incomplete
  • Contradicted at the window and the only reliable source is the offices phone line

Example prompts

  • “/countercall”

Requirements

  • Node.js
  • A credential in CALLE_API_KEY

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Collect the request
  2. Pick a transport, then make sure the contract is honest
  3. Place one call
  4. Poll to a result or an error
  5. Render, or fail honestly

What it can do on your machine

Read from SKILL.md and the folder at commit 38d4118. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 6 files in scripts/ (JavaScript), which the agent can run.

    Shell commands in SKILL.md call:

    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • CALLE_API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Countercall loads about 3k tokens when it runs, and up to ~6.3k if it reads all its reference files. Until then it costs about 104 tokens; SKILL.md has 1,644 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~104
When it runs · the whole SKILL.md, loaded when a task matches
~3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~6.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from CALLE-AI/awesome-phone-call-agents at commit 38d4118, republished under its MIT licence (© CALLE-AI). 1,644 words, ~2,954 tokens.

Download SKILL.mdSave it as .claude/skills/countercall/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.
name
countercall
description
Call a government service counter to find out exactly what a person must bring before they travel there, and return it as a validated checklist. Use when published requirements are incomplete or contradicted at the window and the only reliable source is the office's phone line. Returns required documents, total fee, payment method, whether an appointment is needed, and how certain the clerk sounded.
license
MIT

CounterCall

Pak Yanto took the morning off work, rode forty minutes to the Samsat counter, and was turned away because his photocopy was folio instead of A4. He lost a day's income, and he still did not know what else was missing for tomorrow.

Public service counters publish requirement lists that are incomplete, outdated, or quietly contradicted at the window. The one reliable source is the office's phone line, and that line is busy, IVR-gated, and answered on the fourth try. So people do not call. They travel, they queue, and they get turned away over one document.

This skill makes the call instead, and returns a checklist the person can screenshot and take with them.

It is a good fit for CALL-E's design: low-frequency, personal, high-stakes phone work against a number that a human would otherwise have to redial all morning.

Before you start

This skill places a real phone call to a real public office. Confirm with the user:

  • which procedure they are asking about, in the office's own words
  • which office, and the phone number in E.164 format, from the office's published page
  • that they want a call placed now

Never infer a phone number. Not from a directory, not from a similar office, not by guessing a country code. A number enters the flow only when a human has read it off the office's own published page. Calling the wrong number means an automated caller reaches a stranger, which is the worst thing this skill can do.

Safety boundaries

This skill gathers counter requirements only.

  • It does not submit an application, book an appointment, pay a fee, or commit the user to anything. It asks and reports.
  • It does not give legal or immigration advice. If a clerk suggests an alternative route, report it verbatim as something the clerk said, never as a recommendation.
  • A clerk's spoken answer is informational, not legally binding, and every rendered result says so. Requirements change and individual counters apply discretion.
  • It states plainly at the start of the call that it is an automated assistant, and why it is calling. If the person declines to answer, it thanks them and ends the call. It does not persist, re-ask, or call back the same day.
  • One call per office per procedure per day. These are public service lines staffed by people with a queue in front of them. The idempotency key enforces this; do not remove it.
  • When the clerk is unsure, the result says unsure. It never fills a gap with what is typical, and it never presents a hedge as a fact. A person may travel across a city on the strength of this answer.
  • Call offices during their published opening hours only. A public line ringing out at 22:00 is not a data point, it is a nuisance. The code does not check this: the seed file carries no hours, and call.mjs --live and bench.mjs --live will dial at any time of day. Checking the office's hours before either is the operator's job.

Read references/safety.md before adapting this skill to a new institution. Some callees are not appropriate targets for an automated caller at all.

What makes this different from a transcript

Most call skills return prose and let the reader interpret it. This one returns a pinned, validated object, and refuses to return anything else.

The pinned result_schema sets additionalProperties: false and constrains four fields to enumerations — payment_method, appointment_required, originals_or_copies and clerk_certainty, each of which includes a value for "the clerk did not know". If the call comes back shaped differently, the result is quarantined rather than rendered. A half-parsed checklist is worse than no checklist, because the user acts on it.

The full contract is in references/result-contract.md.

Workflow

1. Collect the request

Required: the procedure name, the office name, the office's phone number in E.164, and the published source URL the number came from.

Validate the number before anything else happens. E.164 is a plus, a non-zero country code digit, then 7 to 14 more digits: ^\+[1-9]\d{7,14}$. Reject anything else and ask the user. Never guess a country code. A local-format number reaching the dialler is how the wrong person gets called.

Run scripts/preflight.mjs to check the number and the contract without dialling.

2. Pick a transport, then make sure the contract is honest

There are two ways to reach CALL-E, and scripts/transport.mjs picks between them. Both place a real outbound call and both return the same validated shape, so nothing above the transport changes.

needswho owns the schema
calls (default)CALLE_API_KEYyou do — it ships with the request as result_schema
goalsCALLE_API_KEY + COUNTERCALL_GOAL_IDthe published Goal

selectTransport() uses goals when COUNTERCALL_GOAL_ID is set and calls otherwise. COUNTERCALL_TRANSPORT=goals|calls forces one, and an unrecognised value throws rather than falling back — a typo must not silently dial on a path nobody chose.

Why calls is the default. Publishing a Goal is only possible inside CALL-E Chat: there is no POST /v1/goals, no MCP publish tool, and no action on the Goal detail page. That makes the Goals path dependent on a surface you may not be able to reach — during the 2026-09-02 CALL-E login suspension it was reachable by nobody. The Calls transport needs one credential and works regardless.

On calls, drift is impossible by construction. resultSchemaJSON() generates the request-scoped schema from the same CONTRACT object that validateResult checks the reply against, so the two cannot disagree. There is nothing to compare.

On goals, compare before every run. The published Goal owns the schema, so it can move underneath you:

js
import { diffContract, publishedRunSpec } from './scripts/_lib.mjs';

const goal = await client.goals.get(GOAL_ID);
const drift = diffContract(PINNED_CONTRACT, publishedRunSpec(goal));
if (drift.length) throw new ContractDrift(drift);   // refuse to dial

Use the publishedRunSpec(goal) helper, not goal.published_run_spec directly. The wire format and the docs spell it published_run_spec.result_schema; the TypeScript SDK camelCases it to publishedRunSpec.resultSchema. Reading only the documented name against the TS client returns undefined rather than throwing — the guard then concludes "no published spec" and refuses every single dial while looking like it is working. The helper reads both spellings. This cost us a day; it is written up in FEEDBACK.md at the repo root.

The CALL-E documentation recommends this comparison before deploying a variable change. Doing it on every run costs one API call and converts a silent failure into a loud refusal. Dialling a real person with a stale schema produces a result that looks fine and is quietly wrong.

Show full SKILL.md (599 more words)Show less
3. Place one call

transport.run(...) — goals.run or calls.create depending on the transport — always with an Idempotency-Key scoped to office, procedure and date, so a retry never double-dials a public line:

text
countercall:{office}:{procedure}:{yyyy-mm-dd}:v1
4. Poll to a result or an error

goals.waitForResult has one completion rule: stop when either result or error is non-null. A completed call can briefly return both null while CALL-E parses the structured result, so do not treat that window as a failure.

calls.waitForResult returns a terminal CallTask instead, and normaliseCall() folds it onto the same shape. One case there is worth knowing: status: "completed" with structuredResult: null means the call connected but the evidence could not satisfy the schema. That is terminal — it becomes result_unextractable, never an empty card. Handing a null result upward would make the renderer decide what a missing checklist means, and the only safe answer is to render nothing.

5. Render, or fail honestly

All eight published GoalRunError codes route to a distinct outcome. The set below is the one scripts/render.mjs implements — keep them in step if CALL-E adds a code.

OutcomeWhat the user sees
valid resultthe checklist, with the clerk's verbatim line and the source URL
no_answer"the line did not answer". No checklist
declined"the office declined to answer an automated caller". No checklist
result_invalidthe call completed but the answer did not match the contract. Quarantined
result_unavailablethe call completed but produced no structured answer. No checklist
result_failedthe answer could not be processed into a checklist. No checklist
timed_out"no usable answer" before the deadline. No checklist
call_failedthe call could not be completed. No checklist
canceledcancelled before it produced an answer. No checklist

No branch renders a partial checklist. Worked examples of each are in references/examples.md.

Running it

scripts/call.mjs is dry-run by default. It prints the exact request it would send and places no call. Dialling requires an explicit --live:

bash
# dry run — prints the request it would send, dials nothing, needs no credentials
node scripts/call.mjs --office <id> --procedure "<procedure>"

# actually rings a phone
node scripts/call.mjs --office <id> --procedure "<procedure>" --live

A skill that dials by default is a skill that dials by accident.

data/offices.json ships with its phone number masked (+62XXXXXXXXXX), so the seeded entry cannot dial and every command against it exits 3 with REFUSING TO DIAL. That is deliberate: a number enters the file only when a human has read it off the office's own published page and recorded source_url and source_checked. Add your own entry before running anything.

To see the dry-run output immediately, the test fixture carries a valid fictional number:

bash
node scripts/call.mjs --offices ../../test/fixtures/offices.test.json \
  --office fixture-sourced --procedure "perpanjangan paspor"

When not to use this

  • Emergencies. This is a requirements lookup with a multi-minute latency. It is not a way to reach anyone urgently.
  • Offices with a published, reliable, current requirements page. If the website is right, read the website. The call is justified only where the published answer is known to be incomplete.
  • Any institution that has asked not to be called by automated systems, or where local law restricts automated calling. Check before adding an office.
  • High-volume lookups. One office per procedure per day is the ceiling by design. If you need bulk, you need a data-sharing agreement, not a phone.
  • Anything where being wrong is cheap. The value here comes from the cost of a wasted trip. If the user can simply go and find out, let them.

Honest limitations

  • Coverage is limited to offices in the seed file, each with a published-source URL.
  • Answer rates on public service lines vary by office and time of day, and a large share of calls will not be answered. That unreliability is the reason this skill exists, and it is reported rather than hidden.
  • The result is one clerk's answer on one day. It is evidence, not a guarantee.

© CALLE-AI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 10 other files (scripts, references) in skills/countercall of CALLE-AI/awesome-phone-call-agents.

  • SKILL.md
  • data/offices.json
  • references/examples.md
  • references/result-contract.md
  • references/safety.md
  • scripts/_lib.mjs
  • scripts/call.mjs
  • scripts/contract.mjs
  • scripts/preflight.mjs
  • scripts/render.mjs
  • scripts/transport.mjs

Open the folder on GitHubat commit 38d4118

Compare with similar skills

Countercall next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Countercall compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Countercall this skillCALLE-AI/awesome-phone-call-agents107—~3kAutomated safety check: PassMIT
Docs Governanceaffaan-m/ECC277k—~1.1kAutomated safety check: PassMIT
Board Governancesickn33/agentic-awesome-skills47k1 repos~4.1kAutomated safety check: PassMIT
Agent Governancegithub/awesome-copilot40k2 repos~4.6kAutomated safety check: PassMIT
Model Registry Governancesickn33/agentic-awesome-skills47k2 repos~3.9kAutomated safety check: PassMIT
Protect MCP Governancesickn33/agentic-awesome-skills47k2 repos~2.3kAutomated safety check: PassMIT

Similar skills

  • Docs Governance

    affaan-m/ECC

    Route broad documentation-governance requests to existing ECC skills and run an opt-in, read-only audit of mapped documentation roles, links, ADR indexes, and evidence references.

    277k GitHub stars~1.1k tokensUpdated today
    DevelopmentAuto-check passed
  • Board Governance

    sickn33/agentic-awesome-skills

    Board and governance register: meeting date, agenda, decision, resolution number, vote result, action owner and due date.

    47k GitHub starsUsed in 1 repo~4.1k tokens
    Auto-check passed
  • Agent Governance

    github/awesome-copilot

    Official

    Patterns and techniques for adding governance, safety, and trust controls to AI agent systems.

    40k GitHub starsUsed in 2 repos~4.6k tokens
    AI & LLM EngineeringAuto-check passed
  • Model Registry Governance

    sickn33/agentic-awesome-skills

    Establish model registry standards, governance controls, metadata schemas, approvals, and lifecycle policies for enterprise AI deployments.

    47k GitHub starsUsed in 2 repos~3.9k tokens
    DevOps & CloudAuto-check passed
  • Protect MCP Governance

    sickn33/agentic-awesome-skills

    Agent governance skill for MCP tool calls — Cedar policy authoring, shadow-to-enforce rollout, and Ed25519 receipt verification.

    47k GitHub starsUsed in 2 repos~2.3k tokens
    Agent WorkflowsAuto-check passed
  • Keep a long-lived project's documentation from rotting by assigning existing project docs clear constitution, map, status, and history roles, then wiring the active agent harness to those canonical…

    277k GitHub starsUsed in 1 repo~2.1k tokens
    DevelopmentAuto-check passed

More from CALLE-AI/awesome-phone-call-agents

All 101 skills in this repo
  • Accessible Outing Verifier

    CALLE-AI/awesome-phone-call-agents

    Demonstrates advisory accessibility-planning checks with offline fixtures and a proposed bounded CALL-E workflow; use for exploring unknown or qualified venue claims without making calls.

    107 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed
  • Ground Truth Gate

    CALLE-AI/awesome-phone-call-agents

    A skill your agent uses when an agent holds some evidence for a physical-world claim but the evidence is broader, narrower, or older than the exact question asked, and it must first decide whether a…

    107 GitHub stars~3.3k tokensUpdated yesterday
    Auto-check passed
  • Is It Accessible

    CALLE-AI/awesome-phone-call-agents

    Call a venue and ask the accessibility questions that matter to one specific person — step-free entry, hearing loop, guide dogs, quiet hours, changing places — then return a per-need verdict backed…

    107 GitHub stars~4.3k tokensUpdated yesterday
    Auto-check passed
  • Landmark Navigation Assist

    CALLE-AI/awesome-phone-call-agents

    Turns a pre-written, building-level location config into a CALL-E outbound phone-call task that guides a delivery driver through the last few hundred metres to a specific building using landmarks…

    107 GitHub stars~1.6k tokensUpdated yesterday
    Auto-check passed
  • Research Gap Call Verifier

    CALLE-AI/awesome-phone-call-agents

    Turn cited business research into a bounded, approval-gated phone-call plan that asks only unresolved factual questions, then reconcile CALL-E-compatible results without treating voicemail, refusal…

    107 GitHub stars~1.7k tokensUpdated yesterday
    Auto-check passed
  • Structured Outcome Followup Call

    CALLE-AI/awesome-phone-call-agents

    Place a goal-driven CALL-E call that collects specific structured answers, score those answers against a deterministic rubric you supply, and conditionally trigger a follow-up action — all runnable…

    107 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed

Questions about Countercall

What does Countercall do?

Call a government service counter to find out exactly what a person must bring before they travel there, and return it as a validated checklist. Countercall is an agent skill from CALLE-AI/awesome-phone-call-agents. Call a government service counter to find out exactly what a person must bring before they travel there, and return it as a validated checklist.

When should I use Countercall?

Countercall fits situations like: published requirements are incomplete; contradicted at the window and the only reliable source is the offices phone line.

How do I install Countercall in Claude Code?

Run `npx skills add CALLE-AI/awesome-phone-call-agents --skill countercall -a claude-code`. Or copy the skill folder (skills/countercall in CALLE-AI/awesome-phone-call-agents) into .claude/skills/countercall in your project. Claude Code loads it when a task matches its description.

How do I install Countercall in Codex?

Run `npx skills add CALLE-AI/awesome-phone-call-agents --skill countercall -a codex`. Or copy the skill folder (skills/countercall in CALLE-AI/awesome-phone-call-agents) into .agents/skills/countercall in your project. Codex loads it when a task matches its description.

Can I use Countercall in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add CALLE-AI/awesome-phone-call-agents --skill countercall -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/countercall, .gemini/skills/countercall, .github/skills/countercall and .opencode/skills/countercall in your project.

What does Countercall need to run?

Going by SKILL.md and its folder, Countercall needs JavaScript for the scripts in its folder, the command-line tools its instructions call (node) and credentials named CALLE_API_KEY. Our summary lists: Node.js; A credential in CALLE_API_KEY.

Does Countercall access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Countercall safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Countercall use?

Countercall is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Countercall use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.3k tokens, read only when the agent opens those files.

What are the alternatives to Countercall?

Skills that share tags, products or a category with Countercall: Docs Governance (affaan-m/ECC, 277k stars), Board Governance (sickn33/agentic-awesome-skills, 47k stars), Agent Governance (github/awesome-copilot, 40k stars) and Model Registry Governance (sickn33/agentic-awesome-skills, 47k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Countercall?

CALLE-AI (a GitHub organization) maintains it in CALLE-AI/awesome-phone-call-agents, which has 107 GitHub stars. The repository holds 101 skills in this directory. The repository was last updated on October 10, 2026.

Source: CALLE-AI/awesome-phone-call-agents on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.