# Stonewake (remote · mcp.stonewake.ai)

Seventeen read only tools over cited company, portfolio and country data for bank credit desks.

- Trust score: 74/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-26

## Components

- remote · `mcp.stonewake.ai`: 74/100 (this document), [markdown](https://verifymcp.io/servers/ai-stonewake-stonewake/mcp.md), [page](https://verifymcp.io/servers/ai-stonewake-stonewake/mcp)

## Channel facts

- Endpoint: `https://mcp.stonewake.ai/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-26.

- **Endpoint Security**: 83/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 69/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3825 tokens (~225/item across 17 items; 17 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 3/100
  - Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 17 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 18 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Stonewake MCP server?

Stonewake is a hosted endpoint at https://mcp.stonewake.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http ai-stonewake-stonewake 'https://mcp.stonewake.ai/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "ai-stonewake-stonewake": {
      "url": "https://mcp.stonewake.ai/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "ai-stonewake-stonewake": {
      "type": "http",
      "url": "https://mcp.stonewake.ai/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.ai-stonewake-stonewake]
url = "https://mcp.stonewake.ai/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-stonewake-stonewake": {
      "type": "remote",
      "url": "https://mcp.stonewake.ai/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add ai-stonewake-stonewake --url 'https://mcp.stonewake.ai/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  ai-stonewake-stonewake:
    url: "https://mcp.stonewake.ai/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "ai-stonewake-stonewake": {
      "Transport": "http",
      "Url": "https://mcp.stonewake.ai/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add ai-stonewake-stonewake -t streamable-http -u 'https://mcp.stonewake.ai/mcp'
```

### Other

```json
{
  "mcpServers": {
    "ai-stonewake-stonewake": {
      "type": "http",
      "url": "https://mcp.stonewake.ai/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-26 (score 74, 0)

- [security] Tool “company_financials” rewrote its description, which is the text the model reads
- [functional improvement] Stability: unverified → 0.03

### 2026-09-25 (score 74)

First indexed and scored.

## MCP tools (17)

### `portfolio_overview` (~188 tokens)

Portfolio overview

Current health of the monitored portfolio: how many exposures sit in each status band (green, amber, red, insufficient, not_assessed), the active exposure count, the number of transitions in the last 30 days and how many of them are status changes (an exposure's first assessment is an addition to the book, a transition but not a change), and how many exposures have an overdue credit review. Optionally pass transitions_since (an ISO 8601 date-time) to also list the individual status transitions since that moment, newest first, each with its cause: the signals whose change moved the status, their citation ids, and the register record behind the lead one. Start here for questions like how the book is doing or what changed since a date and why.

Input parameters:

- `transitions_since` (string): Also return status transitions at or after this ISO 8601 date-time, newest first.

### `portfolio_book` (~243 tokens)

Portfolio book

The monitored book itself: one row per exposure with the team whose book holds it (team_id, team_name), its label, register identifier, entity class (corporate, sovereign_or_public_body, bank, spv or fund, derived from register-stated facts and null when none has been derived yet), desk, current status band, score, completeness, seen_share (the weight share of applicable signals actually observed), explained_share and reachable_share (the observed share of what a connected source can serve, the figure the insufficient floor reads), the top contributing signals with their citation ids, the most recent status change, and the standing credit review (disposition, note, next review date, and whether that date has passed). Ordered most severe first (red, amber, insufficient, not_assessed, green). Paged with limit and offset; the response carries the exact total. Set include_inactive true to include exposures no longer actively monitored.

Input parameters:

- `include_inactive` (boolean): Include exposures no longer actively monitored.
- `limit` (integer): Page size, default 50, maximum 100.
- `offset` (integer): Rows to skip, default 0.

### `portfolio_import_preview` (~242 tokens)

Portfolio import preview

Preview adding a book of companies to the caller team's monitored portfolio. Pass the book as CSV text whose header is identifier_type,identifier plus, optionally, name, currency, limit_amount and drawn_amount; at most 2,000 rows. Every row is matched by its registry identifier alone, where identifier_type is lei, uk_crn, de_register (register type, number and court, for example HRB 275806 München), us_cik or another national register scheme. The name column is echoed back and never used to match. Each row answers its outcome (add, reactivate, in_book, duplicate, ambiguous, unresolved, invalid), a reason, and the matched node_id and register name. Rows are paged with limit and offset in file order; counts and total always cover the whole file, so page on until offset reaches total. Nothing is written, and applying an import happens in the Stonewake dashboard.

Input parameters:

- `csv` (string, required): The book as CSV text, header row first.
- `limit` (integer): Page size, default 100, maximum 100.
- `offset` (integer): Rows to skip, default 0.

### `entity_risk_profile` (~248 tokens)

Entity risk profile

The caller team's credit-risk view of one company, by its graph node_id (the id search_companies hits carry). Answers one of three honest shapes: not in the portfolio (in_portfolio false), held but not yet assessed (assessment null), or the full current assessment with its status band, score, seen_share, explained_share and reachable_share (the figure the insufficient floor reads), a coverage_line of one to three sentences counting covered signals and gaps with their reasons, and every signal with its state (evidenced, register_quiet, gap, awaiting_bank_input, not_applicable), gap_reason, evidence grade (A to D), evidence value, note, and citation ids. A signal no connected source reaches for the company's jurisdiction is a gap, never not_applicable. A held company also carries entity_class: the class its checks route on (a bank is never scored on corporate distress models) and its source, either your team's analyst override or the register rule that derived it. Company nodes only; person lookups answer not_found.

Input parameters:

- `node_id` (integer, required): The graph node id, as returned by search_companies. Not the entity_id of company_profile.

### `search_companies` (~155 tokens)

Search companies

Find a company by name or identifier. The query can be a scheme-prefixed identifier such as lei:5493001KJTIIGC8Y1R12, a bare registration number (CRN, CIK, LEI and similar shapes), or a company name (matched exact, then prefix, then token, then fuzzy). Hits carry the graph node_id that entity_risk_profile takes, plus jurisdiction, status fields, and register identifiers. connected_sources names the registers an empty result was searched against. Companies only; persons are never returned.

Input parameters:

- `limit` (integer): Maximum hits, default 10, maximum 25.
- `query` (string, required): Company name, scheme:value identifier, or bare number.

### `company_profile` (~128 tokens)

Company profile

One registry row's identity from the closed Stonewake registry of named market participants (export credit agencies, multilaterals and banks, plus the trade publications deals cite): slug, display name, full name, kind, country, aliases, and group memberships. Takes entity_id from the registry's own id space. This is NOT the node_id that search_companies returns and entity_risk_profile takes; the two id spaces are different, and an id from the wrong space answers not_found.

Input parameters:

- `entity_id` (integer, required): The registry entity id. Not a graph node_id from search_companies.

### `scoring_rubric` (~75 tokens)

Scoring rubric

How scores are produced for the caller's team: the live scoring configuration (signal weights, status thresholds, evidence-coverage floor; version null means the built-in desk default is active) together with the team's stored rubric versions, newest first. Use this to interpret the status bands and scores that the portfolio and risk tools return.

### `search_stonewake_docs` (~97 tokens)

Search Stonewake docs

Search the Stonewake API documentation at docs.stonewake.ai: authentication and the swk_live_ key format, quickstart, key management, error bodies, status codes, and rate limits. Deterministic text search over the official pages; returns the best matching excerpts with each page's URL. This tool needs no Stonewake API key.

Input parameters:

- `query` (string, required): What to look up, for example: rate limits.

### `screening_lookup` (~310 tokens)

Screening lookup

Adverse media screenings run for the caller's team, covering organizations and countries; each row names its team (team_id, team_name; both null on a workspace wide screening every team reads). Without screening_id this lists screening runs newest first, filterable by subject_type (entity or country), by the subject's ids (node_id for a company from search_companies, entity_id for a registry institution from company_profile, iso3 for a country), or by subject name; paged with limit (default 20, maximum 100) and offset, and the response carries the exact total. With screening_id it returns that one run in full: per category verdicts with rationale and review state, the drafted summary, grounded findings with their press quotes, and the sources behind them. Findings quote reported coverage, not established fact.

Input parameters:

- `entity_id` (integer): Filter by the subject's registry entity id.
- `iso3` (string): Filter by the screened country's ISO alpha-3 code.
- `limit` (integer): Page size, default 20, maximum 100.
- `node_id` (integer): Filter by the subject's graph node id.
- `offset` (integer): Rows to skip, default 0.
- `screening_id` (integer): A screening id from the list; when present the other arguments are not used.
- `subject` (string): Filter by subject name, matched on its normalized form.
- `subject_type` (string): Filter the list by subject kind.

### `deal_book` (~802 tokens)

Deal book

The deal book of the one team the caller's key reads; every row names that team (team_id, team_name). Without deal_id this lists deals ordered by their ranking window first (financing open, early stage, not confirmed, financing closed, cancelled) and the chosen sort inside it, filterable by stage, window, country_code (ISO country codes), sector, status, eca, eca_named (only deals naming an export credit agency), minimum contract value (min_value_usd), and free text (q); sort by score (default), last_activity, value, or first_seen; paged with limit (default 50, maximum 100) and offset, with the exact total. Dismissed deals are excluded unless status asks for them, and the portfolio rows a desk holds back by default (closed, cancelled, older than the stale window of 18 months by default, own bank, domestic; score_hidden true) are off the page unless include_hidden is true, and score_own_bank marks the rows where your own bank is a lender. A row carrying merged_into was found to be a duplicate and folded into the deal that field names: read that deal instead, and expect this one to be dismissed. Each row carries its window (score_window and its label), the band word and reason count behind its score (score_band, score_reason_count), the confirmed state over its linked findings (state, state_label), the newest quote backed event date (event_date, null when no source stated one), the lender names on the deal (lenders), and the two derived sentences a desk reads first: angle (why the row is on the list) and ask (what is still to be financed, read from the confirmed state, the window, the agencies and the lenders; a row whose state no source confirmed reads State not confirmed by a source yet). With deal_id (the deal_id field of list rows) it returns one deal in full: score_reasons, one plain sentence per scoring component saying which fact it matched, alongside parties carrying entity_id and node_id where bound, the cited timeline with press quotes (each entry also carr…

Input parameters:

- `country_code` (array): Keep only deals in these ISO country codes.
- `deal_id` (string): A deal_id from the list; when present the other arguments are not used.
- `eca` (string): Keep only deals naming this export credit agency.
- `eca_named` (boolean): Keep only deals naming an export credit agency.
- `include_hidden` (boolean): Also serve the rows a desk holds back by default (closed, cancelled, older than the stale window, own bank, domestic); off by default.
- `limit` (integer): Page size, default 50, maximum 100.
- `min_value_usd` (number): Keep only deals at or above this contract value in USD.
- `offset` (integer): Rows to skip, default 0.
- `q` (string): Free-text filter over deal names and summaries.
- `sector` (array): Keep only these sectors.
- `sort` (string): Ranking, default score.
- `stage` (array): Keep only these lifecycle stages.
- `status` (array): Keep only these statuses; dismissed deals appear only when asked for here.
- `window` (array): Keep only these ranking windows: financing_open, early_stage, not_confirmed, financing_closed, cancelled.

### `country_profile` (~145 tokens)

Country profile

Country intelligence for export finance. Without iso3 this returns the index of covered countries with each one's risk score and the caller team's live deal rollup. With iso3 (a three letter ISO 3166-1 alpha-3 code such as TUR) it returns one country in depth: the risk score with its cited component breakdown, indicator values, membership lists with legal citations, reference events, and the team's deals there. Indicator and dataset entries carry attribution fields such as attribution_text stating the data licence terms; preserve that attribution whenever values are quoted onward.

Input parameters:

- `iso3` (string): ISO 3166-1 alpha-3 country code; omit to list every covered country.

### `company_financials` (~159 tokens)

Company financials

Every financial figure for one company, newest reporting period first, each figure citing the source record it came from (a public register, a public filing repository, or the annual financial report the issuer published on its own website). Takes node_id, the graph node id carried by search_companies hits (not the entity_id of company_profile). Figures are served as filed at the source, except a figure with derived true, which the filing does not state and which was calculated from two figures the same filing states; its derivation says how in plain words. A missing period means nothing was filed, not zero.

Input parameters:

- `node_id` (integer, required): The graph node id, as returned by search_companies hits. Not the entity_id of company_profile.

### `company_events` (~147 tokens)

Company events

The register event feed of one company: filings, status changes, and other register happenings, grouped into display rows and ordered by significance tier, each row citing its evidencing record where one exists. Takes node_id, the graph node id from search_companies hits. Related events arrive folded into one rollup row with a member_count and a group_key; pass that group_key as group to expand one rollup into its member events.

Input parameters:

- `group` (string): A group_key from a previous response; expands that one rollup into its member events.
- `node_id` (integer, required): The graph node id, as returned by search_companies hits. Not the entity_id of company_profile.

### `company_financing` (~186 tokens)

Company financing

The debt surface of one company: registered charges with status lines and bound lenders, listed debt instruments, filed debt position facts, derived aggregates, a maturity wall, and per section coverage states saying how complete each section is. Takes node_id, the graph node id from search_companies hits. Long instrument books fold into the maturity wall; pass bucket (within_12m, 1_to_2y, 2_to_5y, beyond_5y, or no_maturity) to expand one maturity slice, and include_matured true to also list matured instruments.

Input parameters:

- `bucket` (string): Expand one maturity-wall slice into its instruments.
- `include_matured` (boolean): Also list matured instruments, default false.
- `node_id` (integer, required): The graph node id, as returned by search_companies hits. Not the entity_id of company_profile.

### `ownership_chain` (~173 tokens)

Ownership chain

The upward ownership chains of one company, composed across registers and cited hop by hop, with per register coverage notes. Takes node_id, the graph node id from search_companies hits. threshold is the minimum ownership percentage a chain must keep to be followed, default 25; max_depth caps the number of hops, default and maximum 8. Served owners are organizations; a chain reaching an individual terminates there with a stated terminal reason. Hop values are served verbatim from the registers, never synthesized.

Input parameters:

- `max_depth` (integer): Maximum hops to walk, default and maximum 8.
- `node_id` (integer, required): The graph node id, as returned by search_companies hits. Not the entity_id of company_profile.
- `threshold` (number): Minimum ownership percentage a chain must keep, default 25.

### `company_records` (~216 tokens)

Company register records

The register records behind one company, a page at a time. Each row is a citation (register, record type, identifier, source URL, retrieval date), newest first. Takes node_id, the graph node id from search_companies hits. Every page states records_total, the company's whole count, and registers, each register's connector_id, name and count; pass one connector_id to page that register alone. A company listed in a securities register can hold over 100,000 records, so page with limit (default and maximum 25) and offset, and read registers first to decide what to page.

Input parameters:

- `connector_id` (string): One register to page, as a registers row names it; omit it to page every register newest first.
- `limit` (integer): Page size, default and maximum 25.
- `node_id` (integer, required): The graph node id, as returned by search_companies hits. Not the entity_id of company_profile.
- `offset` (integer): Rows to skip, default 0.

### `developments` (~209 tokens)

Developments

Dated, cited developments surfaced by your team's research runs, the runs of the one team the caller's key reads: grounded findings with a headline, category, verification state, and corroborating source count. Without run_id this is a feed paged with limit (default 25, maximum 100) and offset, with the exact total; sort is recent (default) or score. Each row names the run_id it came from and its team (team_id, team_name); pass run_id to load that whole research run with its grounded findings, press quotes, and cited sources. Another team's run_id answers not found, like an unknown one.

Input parameters:

- `limit` (integer): Page size, default 25, maximum 100.
- `offset` (integer): Rows to skip, default 0.
- `run_id` (string): A run_id from a development row; when present the other arguments are not used.
- `sort` (string): Feed order: recent (default) or score.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/ai-stonewake-stonewake/mcp#diagnostics

## Score history

- 2026-09-26: 74
- 2026-09-25: 74

## Common questions

### What is the Stonewake MCP server?

Stonewake is an MCP server listed in the public MCP registry as ai.stonewake/stonewake. Seventeen read only tools over cited company, portfolio and country data for bank credit desks. This page covers its hosted endpoint (https://mcp.stonewake.ai/mcp).

### Is the Stonewake MCP server safe to use?

Stonewake scores 74 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Stonewake MCP server expose?

Stonewake exposes 17 tools: portfolio_overview, portfolio_book, portfolio_import_preview, entity_risk_profile, search_companies, and 12 more. Their descriptions and schemas cost roughly 3,723 tokens of context every time the server is loaded.

### Does the Stonewake MCP server require authentication?

No. We connected to Stonewake without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Stonewake MCP server still maintained?

Stonewake is still listed as active in the MCP registry. We last reached this channel on 26 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.stonewake.ai/mcp
- Authorisation metadata: https://mcp.stonewake.ai/.well-known/oauth-protected-resource/mcp
- Website: https://docs.stonewake.ai/mcp
- Changelog RSS feed: https://verifymcp.io/servers/ai-stonewake-stonewake/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/ai-stonewake-stonewake/mcp.json
- HTML version of this page: https://verifymcp.io/servers/ai-stonewake-stonewake/mcp
