An OpenClaw skill for rates you can act on.

OpenClaw is the open-source personal agent that runs on your own machine and learns new abilities from SKILL.md files. The RateAPI CLI installs that guidance and executes the four-step loop: which credit unions you can join, from your own facts; the best offer among those, with the institution named, an observed date and a link to its own page on every rate; whether a quote you already have is good; and how to watch instead of poll. No credit pull, no paid placement, no invented averages.

Updated 2026-09-18CLI + one SKILL.mdMCP bridge optional (89-tool registry)

Set up

The CLI installs the skill, reuses credentials securely, and gives OpenClaw stable JSON. Review every filesystem change before applying it.

  1. Install the CLI and skill

    $OpenClaw terminal
    # Install the persistent command once, with the human's approval
    npm install --global @rateapi/cli
    # Preview the exact OpenClaw skill change
    rateapi install --agent openclaw --dry-run
    # Apply only after the human approves the preview
    rateapi install --agent openclaw --apply
    # Load the machine-readable operating contract
    rateapi agent --json
  2. Verify first; authenticate only with approval

    $RateAPI CLI
    rateapi demo --json
    rateapi doctor --json
    # Only when doctor finds no key and the human approves key creation/storage:
    printf '%s
    ' '{"email":"[email protected]"}' | \
    rateapi login --input @- --confirm-key --json
  3. What the skill says

    //SKILL.md (head)
    ---
    name: rateapi
    description: Evidence-backed US credit union rates and membership eligibility. Use when the user asks which published products match their confirmed facts, which credit unions they may be able to join, whether a quote is good, or wants to be told when a rate moves.
    homepage: https://rateapi.dev/agents/openclaw
    metadata:
    { "openclaw": { "requires": { "bins": ["rateapi"] }, "emoji": "🏦" } }
    ---
    # RateAPI — rates the user can act on
    ... the CLI loop (eligibility → price → sanity-check → watch), approval rules, and MCP fallback.
    The full file is at /skills/openclaw/rateapi/SKILL.md. It is plain Markdown — read it before you install it, and edit it if your agent should behave differently. Its requires.bins entry makes OpenClaw report a missing rateapi command instead of silently falling back to invented HTTP.
  4. Optional: the MCP server too

    JS~/.openclaw/openclaw.json
    // ~/.openclaw/openclaw.json — optional: the same tools over MCP.
    // OpenClaw spawns MCP servers as stdio child processes; mcp-remote bridges to the
    // remote streamable-HTTP endpoint and forwards the header.
    {
    "mcpServers": {
    "rateapi": {
    "command": "npx",
    "args": ["-y", "mcp-remote", "https://mcp.rateapi.dev/mcp?profile=personal", "--header", "x-api-key:${RATEAPI_API_KEY}"],
    "env": { "RATEAPI_API_KEY": "${RATEAPI_API_KEY}" }
    }
    }
    }
    The CLI is enough for the loop. Add the bridge only after explicit approval if you want persistent native MCP tools or rich widgets. MCP uses RATEAPI_API_KEY from OpenClaw’s environment; it does not read the CLI credential file.

Why an agent needs eligibility before price

The lowest rate in the state and the lowest rate this user can get are different numbers. A real response, captured 2026-08-28 and unedited except for length.

JSget_financing_decision — mortgage, $420k, Charlotte NC, 740 (captured 2026-08-28)
{
"summary": "Shop Around - Better rates available",
"resolved_county": { "county": "Mecklenburg", "source": "explicit" },
"top_offers": [
{
"rank": 1, "provider": "State Employees' Credit Union", "product": "30-Year Fixed",
"rate": "6%", "apr": "6.073%", "points": 0, "monthly_payment": "$2,538",
"eligibility": { "status": "unknown", "unknown_reason": "charter_type_not_geo_matchable" },
"eligibility_explanation": { "reason": "Eligibility at State Employees' Credit Union is undetermined; it is not ruled out.", "evidence_url": "https://www.ncsecu.org/join" }
},
{
"rank": 2, "provider": "Piedmont Advantage Credit Union", "product": "30-Year Fixed",
"rate": "6.125%", "apr": "6.284%", "points": 0, "monthly_payment": "$2,595",
"eligibility": { "status": "likely_eligible" },
"eligibility_explanation": { "status": "eligible", "reason": "You qualify for membership at Piedmont Advantage Credit Union.", "source": "graph" }
},
{
"rank": 3, "provider": "Allegacy Credit Union", "product": "30-Year Fixed",
"rate": "6.625%", "apr": "6.625%", "points": 0.25, "monthly_payment": "$2,689",
"eligibility": { "status": "unknown", "unknown_reason": "low_confidence_record" }
}
],
"rate_range": { "min": "6.073%", "max": "6.625%" }
}
// Observed 2026-08-28. Trimmed. The agent leads with #2: it is the best offer behind a door this user can open.
// #1 is not ruled out — a state employee would qualify — so the agent asks, rather than hides it.
Read the eligibility field, not the rank. The best APR in the state belongs to a credit union whose membership rule this user’s facts cannot decide. The second offer is 21 basis points higher and the user qualifies today, by a published county rule with the evidence attached.
JSrate_sanity_check — 6.625% quoted, NC 30-year (observed 2026-08-28)
{
"quote": { "rate": 6.625, "apr": 6.625 },
"percentile": 20, "classification": "plausible",
"market": { "min": 6.073, "median": 6.8845, "max": 7.197, "count": 40, "as_of": "2026-08-28T04:36:37Z" },
"note": "This quote beats 80% of the 40 live NC 30-year mortgage offers we track (median 6.885%).",
"better_offers": [
{ "credit_union_name": "State Employees' Credit Union", "apr": 6.073, "apr_delta_bps": 55,
"estimated_monthly_savings": 144.23, "can_you_join": "unknown" },
{ "credit_union_name": "Piedmont Advantage Credit Union", "apr": 6.284, "apr_delta_bps": 34,
"estimated_monthly_savings": 89.52, "can_you_join": "yes" }
],
"share_url": "https://rateapi.dev/rate-check?product=mortgage&state=NC&rate=6.625&term=360&zip=28202"
}
// Observed 2026-08-28. "can_you_join: yes" is the field that turns a percentile into a plan.

The first conversation

Prompts that exercise the whole loop. The CLI routes each request through its capability catalog; a persistent MCP connection exposes the corresponding native tools.

Skills load into OpenClaw’s system prompt, so the agent knows the loop before you ask. Start with the ZIP question and let it ask for the employer.

1
“I live in 28202 and work at Atrium Health. Which credit unions can I actually join, and what is the best 30-year rate among them for a $420k purchase with a 740 score?”
2
“I was quoted 6.625% on a 30-year in North Carolina. Is that good, and can I do better somewhere that will have me?”
3
“Watch NC 30-year rates and tell me when something I can join drops below 6.1%.”
4
“Which credit unions have a branch within 10 miles of 28202, and what do they charge on a 60-month used auto loan?”
Start terminal agents with rateapi agent --json, then use the narrowest CLI capability for the job. If you later add persistent MCP, connect to https://mcp.rateapi.dev/mcp?profile=personal so the server advertises only the consumer surface (24 of 89 tools, in loop order). The corresponding first-conversation tools are: find_eligible_credit_unions, get_financing_decision, rate_sanity_check, subscribe_rate_alert, find_credit_unions_near_zip, get_eligibility_coverage. Drop ?profile=personal for the full developer registry.

A real run, captured 2026-08-28

OpenClaw 2026.7.1 on Gemini 3.1 Pro, captured with the earlier REST skill before CLI-first onboarding shipped. The same endpoints now run through the CLI’s validated JSON contract. Unedited except for length.

What it did
Read the skill, then curl: GET /v1/capabilities → POST /v1/eligibility/search → POST /v1/decisions. Six tool calls, no MCP bridge needed.
Its answer
“Because you live in Mecklenburg County, you are automatically eligible to join Piedmont Advantage Credit Union… The Best Rate You Are Confirmed Eligible For: 6.284% APR at Piedmont Advantage Credit Union, observed 2026-08-28, per its published page. Other Top Market Rates (Eligibility Unknown/Unconfirmed): 6.073% APR at State Employees’ Credit Union, observed 2026-08-28… Keep in mind that published pricing is not an offer or a commitment to lend.”
On the quote (second prompt)
“That 6.625% is actually a very good quote! … it beats 80% of the market. For context, the median rate among North Carolina credit unions is currently around 6.88%. That said, you can do better with an institution where you actually meet the membership requirements… Piedmont Advantage is a clear winner that you can join right now.” — nine calls, ending with POST /v1/rate-sanity-check.
The skill’s loop order held without an MCP server: eligibility, then price, then the disclaimer. The CLI now adds schema validation, credential reuse, and approval gates around the same loop.

What the agent will and will not do

These constraints ship in every tool description, so the agent inherits them without prompting.

Every rate is attributed and dated
“6.284% APR at Piedmont Advantage Credit Union, observed 2026-08-28, per its published rate sheet.” Never a bare number; never a rate outside the freshness window.
Unknown is never no
When eligibility cannot be confirmed the agent says so, with the reason, and asks the one question that would resolve it. It does not hide the institution.
No approvals
Published pricing is not an offer. Membership first, then the lender underwrites. The agent finds reachable offers and shows the evidence.
No national average
Benchmarks are medians across the credit unions tracked, labelled as such.
Credit unions only
About 2,950 with fresh rates across 55 states and territories. Not banks, not indices, not non-US lenders — the agent says so rather than guessing.
No credit pull
Eligibility is decided from published rules and the user’s own facts. Score, income and debt are never requested to decide who they can join.

Frequently asked