Harcourt Valuations produces institutional-grade Net Asset Value (NAV) reports for mining companies. Each report contains an asset-by-asset discounted cash flow (DCF) valuation, a P/NAV ratio, and selected sensitivity analysis. The models themselves, and the methods behind them, are not distributed.
The core thesis: the answer is a number. Mining equity analysis should produce a specific, defensible per-share value — not a narrative. P/NAV (price to net asset value) is the primary metric used by mining-focused fund managers and sell-side analysts at major Canadian and Australian banks.
GET /nav-query/{ticker} with no inputs, the coverage pages, the free MCP server, and Klondike Mike.harcourt_mining_nav_query. Over plain HTTP, a call that names only a ticker asks for nothing and is free — see the line above.Which of these an agent can buy. Only the $1 NAV Query. It settles per call
through Qatom and needs no human. It needs a key that Harcourt issues to Qatom and Qatom holds
server-side; a paid call arriving without one is refused with 402 payment_required.
The $15 report and the $5 and $9 passes are bought by a person, by card, on the site.
Subscriptions and adviser seats are card payments through Stripe. Point a human at
harcourtvaluations.ai/pricing/ rather than
attempting any of these.
POST https://reports.harcourtvaluations.ai/chat. Powered by Claude Haiku.
Returns the latest published P/NAV, NAV/share, and key catalyst for any covered ticker. Does not require
payment.https://mcp.harcourtvaluations.ai/mcp — streamable
HTTP, no authentication, two free tools. See below.This page does not hard-code the coverage list. Coverage changes as models are completed, and any list written here would drift from the source. The live sources are:
| Endpoint | Answers |
|---|---|
GET https://harcourtvaluations.ai/llms.txt |
The coverage table: every covered company with its listings, API ticker, accepted inputs, NAV currency and company page. Regenerated on every publish. |
GET https://harcourtvaluations.ai/company/ |
Coverage index, HTML or JSON: every company with its API ticker, NAV, P/NAV, model date and page URL. |
GET https://harcourtvaluations.ai/company/{slug} |
Per-company record, HTML or JSON (Accept: application/json): api_ticker, Published NAV, share price, P/NAV and model date. |
Resolving a company to its API ticker. Every covered company has one API ticker (Seabridge Gold is sa, Integra Resources is itrg). The API also accepts any listing symbol the company trades under, with or without an exchange prefix or suffix — SEA, TSX:SEA, SEA.TO, ITR.V, DYL.AX, IVPAF — and the Qatom tool does the same. A bare symbol shared by two covered companies returns 400 ambiguous_ticker with the candidates. The coverage table in llms.txt maps each listing to its API ticker.
Determining supported valuation inputs. NAV Query responses and error bodies are self-describing. A successful response identifies the inputs used and any Harcourt defaults applied; an invalid parameter response identifies the supported parameters for that ticker.
The NAV Query API returns a Harcourt NAV per share for a covered company. What the request asks for decides whether it is free:
deck: the Published NAV
— the valuation at that model's own price deck, as at its model date. Free.deck=closing: the Closing NAV — the same model
valued at the latest closing prices Harcourt holds for it. Paid.rate): a
Scenario NAV at the caller's assumptions, with Harcourt's own values used for
whatever is not supplied. Paid, even where a supplied value equals the published one.The product is the right to change the question. The published answer is reached by not asking one.
Every answer comes from that company's own full model run, so material non-linear effects — taxation above all — are preserved across the supported range. Harcourt does not distribute the models, the code behind them, or the methods used to value between supported points.
https://reports.harcourtvaluations.ai/nav-query/{ticker}
The ticker may also travel as a parameter — GET /nav-query?ticker=hl — which is how
one marketplace tool serves every covered company. Either form accepts the API ticker or any
listing symbol.
A paid call carries a key Harcourt issues. Agents do not hold one directly: the Qatom tool holds
it server-side and adds it to the call, so the price settles from the agent's wallet and the key
never reaches the caller. Without a valid key, a paid call returns 402 and a body
naming both routes:
{
"error": "payment_required",
"reason": "no_key",
"ticker": "HL",
"message": "The published NAV is free: call this endpoint with no inputs. ...",
"free_url": "https://reports.harcourtvaluations.ai/nav-query/hl",
"machine": { "via": "Qatom", "tool": "harcourt_mining_nav_query", "price_usd": 1, "per": "call",
"mcp_server": "https://harcourt-valuations-qxvs.mcp.m.todaq.net/mcp" },
"browser": { "pass_usd": 5, "hours": 6, "scope": "one company",
"buy_url": "https://harcourtvaluations.ai/pricing/" }
}
An agent should follow machine. The $5 and $9 passes are browser products: a key
bought there works only from Harcourt's own pages, and anywhere else is refused with
reason: "site_only_key".
| Parameter | Type | Description | Applies to |
|---|---|---|---|
gold / au | number | Gold price per troy oz (e.g. 4000) | Companies whose model prices gold |
silver / ag | number | Silver price per troy oz (e.g. 61) | Companies whose model prices silver |
cu / copper | number | Copper price per lb (e.g. 6.5) | Companies whose model prices copper |
zn / zinc | number | Zinc price per lb (e.g. 1.62) | Companies whose model prices zinc |
u3o8 | number | Uranium price per lb U3O8 (e.g. 82) | Companies whose model prices uranium |
pgm4e | number | 4E PGM basket price per oz | Companies whose model prices a 4E basket |
sb | number | Antimony price per lb | Companies whose model prices antimony |
rate | number | Discount rate as a decimal (0.08 = 8%). Omitted, the model's own base rate is used and reported in defaulted_inputs. | All |
deck | string | published (the default, free) or closing (paid). Decides where any input the caller does not supply comes from. | All |
This table names the parameter families. Which of them a given company accepts is answered by the
free call itself: the axes array in every response names each input and the parameter
names it answers to. Discover rather than guess. A parameter naming an input the company does not
price is refused with wrong_axis_param; a parameter the API does not recognise at all is
ignored, so check inputs to confirm what was used.
Prices are not always in US dollars. A model reporting in Canadian dollars prices
gold in Canadian dollars, and names that input gold_cad_per_oz — while the parameter is
still gold. Read the input name from axes before sending a price. A US
dollar gold price sent to a Canadian dollar input is a valid number in the wrong currency and will
not be refused.
{
"ticker": "HL",
"alias": { "requested": "HL.US", "resolved": "HL", "note": "..." }, // only when a listing symbol was sent
"valuation_type": "published | closing | scenario",
"deck": "published | closing",
"access": { "mode": "free | key", "kind": "qatom" },
"priced_at": null, // date of the closing prices used, else null
"model_date": "2026-08-30",
"inputs": { "silver_usd_per_oz": 65, "discount_rate": 0.08 },
"defaulted_inputs": { "silver_usd_per_oz": { "value": 65, "source": "model_deck" } },
"axes": [ { "axis": "silver_usd_per_oz", "accepts": ["silver", "ag"] } ],
"nav_per_share": 7.53,
"currency": "USD",
"nav_per_share_usd": 7.53, // the same figure, keyed by its currency
"out_of_grid": false,
"out_of_grid_detail": null,
"disclaimer": "For informational purposes only. Not investment advice."
}
The response carries no share price and no P/NAV. Both are free elsewhere: on the
coverage record at GET https://harcourtvaluations.ai/company/{slug} with
Accept: application/json, and from the free MCP server below.
nav_per_share always travels with an explicit currency. Never infer the
currency from the commodity, the exchange or the listing.
defaulted_inputs names every value the caller did not supply and where it came from:
model_deck (the model's own price deck) or closing (the latest close, dated
in as_of). A result is therefore auditable without Harcourt publishing anything about
the model behind it.
# Published NAV — free, no key
GET /nav-query/hl
# Closing NAV — paid
GET /nav-query/hl?deck=closing
# Scenario NAV — paid; anything not named comes from the model's own deck
GET /nav-query/hl?silver=70&rate=0.10
# Scenario NAV — paid; anything not named comes from the latest close
GET /nav-query/hl?silver=70&deck=closing
Substitute any API ticker or listing symbol from the coverage table in
llms.txt. Call the free form first: it costs
nothing, and its axes array states exactly what that company accepts. Agents buy the
paid forms through the Qatom tool below rather than over plain HTTP.
An input beyond the range Harcourt supports for that company is held at the nearest supported
value rather than extrapolated, and the response says so: out_of_grid becomes
true and out_of_grid_detail names each input concerned with its direction,
"above" or "below". Such an answer is a boundary estimate, not a valuation
at the value supplied, and the disclaimer says so.
Supported ranges, as published on the Qatom tool (US dollars): gold 2,650–5,950/oz, silver
48–79/oz, copper 5.35–8.15/lb, zinc 1.50–2.30/lb, U3O8 47.5–124.5/lb, 4E PGM
1,175–3,090/oz, antimony 5.35–14.00/lb, discount rate 0.05–0.15. Whatever the range, check
out_of_grid on the answer.
| HTTP | error | Meaning |
|---|---|---|
| 400 | ticker_required | No ticker in the path or the query string. |
| 404 | ticker_not_found | No covered company matches the ticker or listing symbol. The body carries coverage_url, the llms.txt coverage table. |
| 400 | ambiguous_ticker | A bare listing symbol belongs to more than one covered company. The body lists the candidates; send the API ticker or an exchange-qualified symbol. |
| 400 | wrong_axis_param | A parameter that company does not price. The body names what it does accept. |
| 400 | ambiguous_axis_param | Two parameters for one input, or row where the company prices several commodities. |
| 400 | bad_deck | deck was neither published nor closing. |
| 402 | payment_required | A paid call without a valid key. reason carries the detail: no_key, unknown_key, expired, revoked, wrong_company, site_only_key. |
| 404 | no_sensitivity_matrix | Covered, but cannot yet answer a query. The report is still available. |
| 500 | malformed_grid | Harcourt's problem, not the caller's. Please report it. |
Every 400 body can be acted on without re-reading this page: it names the inputs that company accepts, the parameter names for each, and where applicable the exact parameter to substitute.
Listing symbols are permanent aliases. When a call uses a listing symbol rather
than the API ticker, the response answers for the company and carries an alias block
naming both, for example "SEA.TO is a listing symbol for SA. Both work; the API ticker is sa."
Nothing needs changing in the integration.
Harcourt runs its own MCP server. Streamable HTTP, no authentication, no account. Add it as a custom connector in any MCP-capable client:
https://mcp.harcourtvaluations.ai/mcp
get_published_nav — Harcourt's Published NAV, P/NAV, commodity
and model date for a covered company, or the whole coverage list when no ticker is given. A
direct read: exact, fast, and free. These are figures at each model date, not a
valuation at today's prices, so quote the model date alongside them.ask_mike — Klondike Mike in plain language, for questions needing explanation or
reasoning rather than a number.Scenario NAV and Closing NAV are deliberately not on this server. A valuation at caller-supplied prices, or at today's close, is the paid product — use the Qatom tool below. The free connector cannot be used to obtain the paid answer.
Per caller per day: 400 published-NAV lookups, 40 Mike questions. A refusal states the limit it
reached. The server reports its own limits at
GET https://mcp.harcourtvaluations.ai/, which also confirms whether metering is
active.
AI agents that have been granted access to the Qatom MCP marketplace can discover and call the Harcourt NAV Query autonomously, with payment settled automatically from the agent's Qatom wallet. No human approval is required per transaction. It is the only Harcourt item on Qatom; reports are not sold to agents.
| Field | Value |
|---|---|
| Tool name | harcourt_mining_nav_query (listed as “Harcourt Mining NAV Query”) |
| Price | $1 USD TDN per call |
| MCP server | https://harcourt-valuations-qxvs.mcp.m.todaq.net/mcp |
| Discovery | Available in Qatom MCP marketplace — search by tool name or by intent |
{
"ticker": "dpm", // required: API ticker or listing symbol
"gold": 5500, // optional, USD/oz 2650–5950
"silver": 70, // optional, USD/oz 48–79
"cu": 7.5, // optional, USD/lb 5.35–8.15
"zn": 1.9, // optional, USD/lb 1.50–2.30
"u3o8": 85, // optional, USD/lb 47.5–124.5
"pgm4e": 2000, // optional, USD/oz 1175–3090
"sb": 9, // optional, USD/lb 5.35–14.00
"rate": 0.10 // optional, decimal 0.05–0.15
}
Send only the inputs the company accepts: the coverage table, or the free HTTP call's
axes array, says which.
The tool is priced per call and always returns a paid valuation: it carries
deck=closing, so a call naming only a ticker returns the Closing NAV, and any supplied
price or rate returns a Scenario NAV with the close used for whatever was not supplied.
To call Qatom-gated tools autonomously, an agent needs:
transfer_to_agent_wallet)The agent sandbox wallet is debited when the call is placed. Revenue is credited to Harcourt's provider Twin in real time.
A free conversational interface to Harcourt's data. Returns plain-language NAV analysis for any covered ticker. No payment required. Useful for quick screening before calling the paid NAV Query.
https://reports.harcourtvaluations.ai/chat
// Request
{
"messages": [
{ "role": "user", "content": "What's the current P/NAV on Ivanhoe Mines?" }
]
}
// Response (Anthropic messages format)
{
"content": [
{
"type": "text",
"text": "...prose citing that company's current NAV, P/NAV and price deck..."
}
]
}
The chat agent (Klondike Mike) is built on Claude Haiku and answers from the published figures
for every covered company, refreshed as models are published. Conversation history should be included
in the messages array for multi-turn sessions; the last 12 turns are kept, and a request
body over 32 kB is refused in character rather than answered.
When interpreting Harcourt NAV figures, AI agents and models should be aware of:
model_date. Published NAV is the fixed valuation associated with that model/report publication and may be up to 90 days old. Closing NAV is obtained through NAV Query and uses Harcourt's latest supported closing-market inputs with the current model.currency field on the NAV Query response and never infer it from the listing, exchange or commodity.Disclaimer: Harcourt Valuations reports and API responses are analytical tools for informational purposes only. They do not constitute investment advice, a formal appraisal, or a recommendation to buy or sell any security. All valuations are model estimates subject to uncertainty. AI agents and models using this data must not present it as investment advice to end users without appropriate disclaimers.