Hermes Agent, with rates it can act on.
Hermes Agent is Nous Research’s open-source personal agent — it remembers you, runs on a schedule, and can operate terminal commands as well as native MCP tools. Start it with the RateAPI CLI: live credit union rates with the institution named, an observed date and a link to its own page on every number, and membership eligibility resolved from your facts with no credit pull. The result is an agent that recommends the best rate behind a door you can open, not the best rate in the state.
Set up
Use the CLI through Hermes terminal tools first. Add MCP later only if you want RateAPI to remain in Hermes’ native tool registry.
Install once and load the agent protocol
$Hermes terminalnpm install --global @rateapi/clirateapi agent --jsonVerify first; authenticate only with approval
$RateAPI CLIrateapi demo --jsonrateapi doctor --json# Only after the human approves key creation and secure local storage:printf '%s' '{"email":"[email protected]"}' | \rateapi login --input @- --confirm-key --jsonThe demo is synthetic and free.doctorreuses an environment or stored credential when one exists. The agent must ask separately before key creation/storage and before every metered request.Optional: keep RateAPI as native MCP tools
$~/.hermes/.env# ~/.hermes/.env — Hermes resolves ${RATEAPI_API_KEY} from here at connect timeRATEAPI_API_KEY=rk_your_key_here//~/.hermes/config.yaml# ~/.hermes/config.yamlmcp_servers:rateapi:url: "https://mcp.rateapi.dev/mcp?profile=personal"headers:x-api-key: "${RATEAPI_API_KEY}"$Equivalent Hermes command# Optional persistent native MCP connection:hermes mcp add rateapi --url "https://mcp.rateapi.dev/mcp?profile=personal" --header "x-api-key:${RATEAPI_API_KEY}"# ?profile=personal already narrows the 89-tool registry to the consumer# surface, in loop order. Drop the query string for the full developer registry.CLI and MCP credentials are separate. Use an existing key from the dashboard in the environment that launches Hermes; do not copy the CLI credential file into config. Restart Hermes after adding MCP.
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.
{ "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.{ "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.
Because Hermes keeps memory, the facts from the first prompt — ZIP, employer — carry into every later one. Tell it once.
- 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?”
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
Hermes Agent v0.20.6 on Gemini 3.6 Flash, captured with the persistent MCP option before the CLI-first onboarding shipped. The data contract and loop are the same; unedited except for length.
- Tool sequence
find_eligible_credit_unions→check_membership_eligibility→find_product_rates_near_zip→find_credit_unions_near_zip→get_financing_decision→get_credit_union— 21 calls, 51 seconds. Eligibility first, price second, without being told to.- Its answer, on the best rate
- “If you or an immediate family member have a connection to NC state employment, SECU offers the lowest rate at 6.000% (6.073% APR). Otherwise, Piedmont Advantage Credit Union offers the best directly eligible rate for Mecklenburg County residents.”
- On the quote (second prompt)
- “Your quote sits in the top 20th percentile of the 30-year fixed mortgage market in North Carolina… YES — Piedmont Advantage Credit Union: 6.125% rate / 6.284% APR (0 points). Cuts your APR by 34 basis points… Membership Eligibility: 100% YES. PACU has a community charter covering Mecklenburg County.” — and it pasted the
share_urlso the user could re-check live. 5 calls, 19 seconds. - What it got from the tools, not from memory
- The Truliant, Skyla and Allegacy membership paths it listed (American Consumer Council association, family of member) appear in the get_credit_union and eligibility results in the session export — grounded, with the reason for each verdict.
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
Use Hermes terminal tools to run npm install --global @rateapi/cli, then rateapi agent --json. The CLI is the default execution path and asks separately before key creation, credential storage, and metered calls. Add https://mcp.rateapi.dev/mcp?profile=personal only if you want a persistent native tool registry; that MCP connection uses RATEAPI_API_KEY from ~/.hermes/.env.
Hermes keeps memory across sessions and runs on a schedule, so the loop does not end when the conversation does: it can remember that you live in Mecklenburg County and work at Atrium Health, re-check reachable offers weekly, and hold a rate alert without you re-explaining yourself. Every rate it reports still carries the institution, the observed date and a link to the source page.
No. Which credit unions you can join is decided from published membership rules and facts you give the agent — ZIP, employer, school, associations, military status. Rates are published prices, not quotes. Nothing about credit score, income or debt is required, and the agent is told not to ask for it to decide eligibility.
No. Institutions the data cannot decide come back as unknown with a reason, and the agent asks the question that would resolve it. Absence from a result is never presented as a rejection; the institution makes the final membership decision.
A key is required for rate calls; the Free tier covers occasional core Rates use and paid plans add volume. Dedicated eligibility, coverage, and reachable-offer tools are RateAPI Routes and require Enterprise. The capability catalog and agent instructions need no key. No institution pays for placement in any result.