Pulse MCP server
Query the Pulse database from Claude, ChatGPT, Grok, and other AI assistants
Pulse runs a hosted MCP (Model Context Protocol) server that lets AI assistants search Pulse documents and query the Pulse database directly in your conversations. Connect it once and ask questions like "List the top 5 projects by gold grade in Canada" — the assistant searches and queries the live database and cites what it found.
Server URL
Every client connects to the same remote server:
https://mcp.pulseintelligence.com/mcpConnect your client
Follow the guide for your assistant:
| Client | Guide |
|---|---|
| Claude | Connect Claude |
| ChatGPT | Connect ChatGPT |
| Grok | Connect Grok |
| Anything else | Other MCP clients |
All clients need a Pulse Intelligence account with OAuth access enabled — contact your Pulse admin if you're unsure whether yours is.
Available tools
Once connected, the assistant can use these tools:
Screening and dossiers
| Tool | Description |
|---|---|
search_companies | Screen companies by structured attributes with field/operator/value filters |
get_company_dossier | Full single-company picture in one call — overview, financials, recent news, current mining assets, latest annual and interim reports |
search_mining_assets | Screen mining assets (mines, projects, deposits, facilities) by structured attributes |
get_asset_dossier | Full single-asset picture in one call — overview, owners, latest production and reserves, drill headlines, hierarchy. Every displayed figure comes with its numeric value and unit, so agents compute from the numbers and quote the labels |
describe_map_datasets | The map datasets you can search by area: without arguments a short list (each dataset's id, name, and whether it is available and from which source date); with dataset one dataset in full — its filters, what a row carries, and its area and page limits |
search_map_area | Everything of one dataset inside a circle, box or polygon — mining assets, mineral tenure, Pulse drill holes with their headline intercept, or the Western Australia (WAMEX), South Australia (SARIG), Queensland (GSQ), Northern Territory (NTGS), New South Wales (GSNSW), Victoria (GSV), Tasmania (MRT), Québec (SIGEOM), Manitoba (MGS), Nova Scotia (NSDNRR), Alberta (AGS) and Saskatchewan (SGS) government archives, Norway's drill-core register and report index (NGU, DMF), Argentina's geochemistry (SEGEMAR), the United States' national geochemistry (USGS), Brazil's geochemistry (SGB), Mexico's geochemistry (SGM), Peru's geochemistry (INGEMMET), Yukon's assessment-report geochemistry, core-library drill holes and reports (YGS), and New Brunswick's drill holes and reports of work (NBGS) |
get_wamex_report | One WAMEX exploration report by A-number, with its documents on request |
get_qld_report | One Queensland (GSQ) company report by its CR number, with its documents on request |
describe_filters | List the filters and columns available on a resource (companies or mining-assets). Per-commodity metrics come grouped as metric_families: a key template such as latest_annual_production_kg_{commodity}, the allowed parameters values, and the unit (unit, or unit_by when it depends on one parameter); substitute values to get a real key such as latest_annual_production_kg_gold |
resolve_options | Resolve a human term (e.g. "ASX", "Gold") to the option values filters expect |
resolve_options ranks matching labels and short labels such as "ASX".
Personal sets and saved searches are limited to those visible to your account.
A nonempty query with no matching option returns no matches; do not substitute an unrelated option.
An empty query lists available options up to the requested limit.
For pulse_tenements, the type filter accepts exploration, production, retention, other, and unclassified.
unclassified selects records whose tenure type has not been mapped; it is distinct from other, and both can be selected together.
Type and status filters combine to narrow the results; describe_map_datasets lists the accepted values.
Tenure rows return canonical type and status values for comparison and filtering, plus the cadastre's wording as registry_type and registry_status.
When those terms differ, assistants display both, such as Exploration (Permis de Recherche Industrielle) and Active (Renewal Request).
Drill datasets (pulse_drillholes, wamex_drillholes, sarig_drillholes, sigeom_drillholes, qld_drillholes, nt_drillholes, nsw_drillholes, vic_drillholes, ab_drillholes, sk_drillholes) accept grade_tier — economic, high or bonanza — resolved through your own drill-grade thresholds where you have set them and the registry's ramp otherwise; the response lists the grade_cutoffs it applied.
Archive source.snapshot_date is the source export date; null means source freshness is unknown.
source.built_at is the artifact build time and does not establish when the source data was current.
These fields accompany the catalogue, area-search results and report details.
Pages continue by passing the previous page's next_cursor as cursor; an archive cursor is tied to the release it was issued on and is refused once a newer release is active.
For a follow-up such as "show the next ten", an assistant without the previous cursor can
repeat the same search and page to the requested range, skipping records already shown.
Each page supports up to 100 records; totals and summary breakdowns do not require larger example pages.
By default, every search_map_area response also includes a summary of all matching records, not just
the returned page. Its total matches count; its dataset-specific breakdowns describe, for
example, Pulse holes by asset or WAMEX holes by archive submitter. The catalogue lists the
available dimensions. Each breakdown returns up to ten largest groups with exact counts,
plus other_count for records in the remaining groups and missing_count for records without
a value. Include both when interpreting proportions. Archive submitters are not current owners.
Drill summaries also count records with an elected headline intercept; this is not a count of
every assay and does not prove that a hole without a headline was never assayed.
On Pulse drill records, the company is the asset's sole current operator, which does not
establish who drilled the hole or owns the asset. An empty company value can mean that no
single operator was resolved, including a joint operation. Missing values mean the information
is unavailable in those results, unless the field's documented meaning is more specific.
Set include_total to false for a page-only search over a wider box or polygon. In that mode
count and summary are null, and next_cursor is the only indication that another page
exists. Do not use one or several retrieved pages to make whole-area composition or total-count claims.
Use the summary for an area's overall composition and the nearest-first records as examples. The first page is not a representative sample. Maximum depth, maximum grade and other statistics not included in the summary require examining all relevant results, or explicitly limiting the claim to the records examined. Different datasets may describe the same physical holes, so their record counts cannot be added as a unique-hole total.
Reserve dossier rows
Reserve rows in overview.company_reserves and overview.mining_asset_reserves always have five top-level tier keys:
reserves, resources, measured_indicated, inferred, and total_inventory.
Absent tiers are null; present tiers keep all fields, with unavailable individual values null.
For example, this excerpt shows a tungsten reserve:
{
"canonical_species": "W",
"is_grade_species_stated": true,
"reserves": {
"label": "20.3 kt WO₃",
"grade_label": "11.8 Mt @ 0.17 % WO₃",
"contained_kg": 20275000,
"contained_species": "WO₃",
"contained_canonical_kg": 16078075,
"ore_t": 11800000,
"grade": 0.171,
"grade_unit": "%",
"grade_species": "WO₃",
"grade_species_qualifier": null
},
"resources": null,
"measured_indicated": null,
"inferred": null,
"total_inventory": null
}contained_kg is the exact mass in contained_species;
contained_canonical_kg is the comparable mass in the row's canonical_species for metrics and SQL comparisons.
ore_t is metric tonnes of rock and is null for contained-metal-basis reports or non-tonnage source units such as mtu.
grade uses its own grade_unit and grade_species: lithium can have LCE contained mass and Li₂O grade.
Row-level is_grade_species_stated records whether the source named grade chemistry; it does not assert that the source used the normalized spelling.
Each tier's grade_species_qualifier is "assumed" when grade_species is the commodity convention rather than stated by the source (quote it beside grade_label), else null.
Company quantities are attributable and asset quantities are 100%.
Compute from numbers and quote backend labels; no client species conversion or label parsing is needed.
Dates, ownership, reporting standard and citation are shared once per row.
Total inventory carries the same fields with ore and grade null and follows the existing resource-inclusivity rules.
The nine legacy flat label fields and five *_figures blocks remain unchanged for compatibility and are deprecated; new consumers should use the tier objects.
Legacy blocks use canonical contained_in_kg, retain comparable-basis ore_quantity / ore_unit and per-tier grade provenance, and remain objects with null values for absent tiers.
Their removal requires confirmed client migration and a separate changelog announcement, targeting 60 days after deployment.
People and publications
| Tool | Description |
|---|---|
search_people | Search executives and directors in the Pulse curated roster |
search_publications | Search publications for news, announcements, and qualitative context |
read_publication_pages | Read pages of a publication's original PDF, such as an annual report |
For asset-specific results from publication search and asset dossiers, see Publications and asset updates.
read_publication_pages reads PDF publications only; the assistant reads other formats as text through run_read_query.
Each call returns up to 10 pages, as a page or range such as 12 or 12-15.
The pages arrive as an attached PDF document with the publication's title, date and page count,
so the assistant reads tables and charts as printed.
The assistant usually finds the right pages first by searching the publication's text with run_read_query.
When Pulse's structured data has no value for a figure, the assistant may take it from a company filing. It quotes the figure as printed, with its unit, period and basis, and cites the publication, and does not present it as a Pulse-curated value.
Database
| Tool | Description |
|---|---|
get_database_schema | Inspect database tables and columns |
get_column_values | List a column's distinct values to discover enums, units, or categories |
run_read_query | Execute read-only SQL queries against the Pulse database |
Missing-column errors can include table and available_columns to identify the relevant table and its columns.
When the table cannot be identified reliably, the response provides schema-inspection guidance instead of column hints.
Portfolio
| Tool | Description |
|---|---|
get_portfolio_positions | Read a portfolio's current holdings and totals |
portfolio_reconcile | Reconcile a holdings list (CSV or pasted table) against a Pulse portfolio — read-only dry run |
resolve_listing | Resolve a stock ticker to a Pulse company listing |
Reconciliation proposes changes only; it does not write holdings or transactions.
Portfolio position amounts carry their currency explicitly.
current_price is denominated in current_price_currency; it can differ from the holding's listing currency and the portfolio base currency.
current_price_listing identifies the quoted listing and current_price_date identifies the quote date.
Quote metadata may be unavailable; do not infer a holding-specific quote from the company price.
The *_base values and portfolio totals are converted into the portfolio's base currency.
Holding and transaction money and quantities are represented as decimal strings, as are portfolio monetary totals.
Holding and summary return percentages are JSON-number fractions, not whole percentages.
When transactions are requested, gross_value is quantity times price per share in the transaction's currency, before fees.
Example prompts
- "List the top 5 projects by gold grade in Canada — use the Pulse MCP."
- "What are the highest gold grades across our geological archives?"
- "Which companies reported new drill results in the last quarter?"
- "Show me the database schema for production data, then summarise 2025 copper output by country."
Adding "use the Pulse MCP" to a prompt nudges the assistant to reach for the connector instead of answering from memory.
Authentication and security
- OAuth 2.1 with PKCE — when you connect, you're redirected to the Pulse authorization page and sign in with your Pulse Intelligence credentials. Your credentials are never shared with the AI client; only a scoped access token is exchanged.
- Read-only — every tool is read-only. Queries cannot modify data.
- Tool approval — clients ask for your permission before each tool call (exact behaviour varies by client).
- Revoking access — disconnect or remove the connector in your AI client's settings at any time.
Filter descriptions, option lookups, company and asset dossiers, portfolio reads, reconciliation previews, listing lookups, map dataset discovery, area searches and WAMEX/GSQ report retrieval share your MCP access and quota checks.
Filter descriptions count toward request limits; option lookups count returned matches toward the daily row allowance, and a dossier counts as one logical result.
These calls are recorded against your Pulse account for auditing.
These checks apply before document listings are read, including when include_documents is enabled.
If a call is refused because a quota is exhausted or MCP access is blocked, contact your Pulse admin.
Troubleshooting
| Issue | Solution |
|---|---|
| Authorization fails | Check that your Pulse account has OAuth access enabled — contact your admin |
| Connection failed error | Verify the URL is exactly https://mcp.pulseintelligence.com/mcp |
| Tools not showing in chat | Start a new conversation after connecting the integration |
| Search returns no results | Try broadening your query or using different terminology |
Client-specific issues (plan requirements, developer mode, per-chat toggles) are covered in each connection guide.