keel-mcp
Provides Keel's liquidity risk readings for Stellar assets: monitored assets with band, confidence, max safe collateral and flags; executable depth from the SDEX order book and AMM pools at +/-2%, 5% and 10%; historical band/depth/collateral over a ledger window; and collateral-size checks (within/exceeds/unknown, the binding manipulation or liquidation limit, and the ratio). Every figure carries provenance (ledger sequence, close time, methodology version) and assets are addressed as CODE:ISSUER.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@keel-mcpIs USTRY safe as collateral for a 500,000 USDC loan on Blend?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
keel-mcp
A Model Context Protocol server for Keel, the liquidity risk engine for Stellar. It lets an AI agent (Claude Desktop, Claude Code, Cursor, or any MCP client) answer questions like these with Keel's own numbers:
"Is USTRY safe as collateral for a 500,000 USDC loan?"
"How much AQUA can I sell before the price drops more than 5%?"
"Which monitored assets are CRITICAL right now, and why?"
"What did Keel see at ledger 61340263, the Blend exploit?"
An oracle answers what is the price. Keel answers what volume can that price actually
support: executable depth from the SDEX order book and AMM pools at +/-2%, 5% and 10%, and the
largest collateral position that liquidity can safely back. This server exposes those figures
to agents. It reads the public API at https://api.keels.app/v1; the dashboard is at
keels.app.
Install
Requires Node.js 20 or newer.
Claude Code
claude mcp add keel -- npx -y @keel-official/mcpClaude Desktop (claude_desktop_config.json) and Cursor (.cursor/mcp.json)
{
"mcpServers": {
"keel": {
"command": "npx",
"args": ["-y", "@keel-official/mcp"]
}
}
}From a checkout, before the package is published:
npm install && npm run build
claude mcp add keel -- node /absolute/path/to/keel-mcp/dist/index.jsConfiguration
Variable | Default | Purpose |
|
| Point at another deployment, or at the contract mock ( |
|
| Per request timeout |
|
| Cache for the asset list and methodology. Scans run every 15 minutes |
Related MCP server: BlackSwan MCP Server
Tools
Every tool is read-only and returns two things: a short text answer for the model, and the exact figures as structured JSON. Every answer carries its provenance: ledger sequence, ledger close time, data source, methodology version, and how far behind the latest ledger the data is.
Tool | Answers |
| Is the engine healthy, which ledger was scanned last, how many assets are monitored |
| Monitored assets with band, confidence, max safe collateral and flags. Filter by |
| Resolves a code ( |
| The full reading for one asset, or a historical reconstruction with |
|
|
| Which measured rung (2%, 5%, 10%) absorbs a buy or sell size, or that it exceeds them all |
| Band, depth and collateral over a ledger window or every stored reading of one source, with band changes |
| 2 to 10 assets side by side |
| Methodology version, every threshold, and the calibration note |
Resources: keel://methodology (JSON) and keel://report/blend-february-2026, the open
backtest report on the February 2026 Blend incident.
Prompt: assess_collateral(assetId, amount, protocol?) runs the tools in order and
asks for an answer that states the verdict, the binding limit, the band and its confidence,
every unevaluated flag, and the provenance.
Example
You: Is USTRY safe as collateral for a 500,000 USDC loan on Blend?
Agent (calls
find_asset,get_asset_risk,check_collateral_size): No. 500,000 USDC is 7.23x Keel's recommended maximum of 69,120.49 USDC forUSTRY:GCRY...MYWC. The binding limit is manipulation: pushing the price to the critical level through the order book caps the size well below the liquidation limit (133,252.90). USTRY is in band HIGH with partial confidence, so the band is a floor: HOLDER_CONCENTRATION_EXTREME fired (the largest holder has 91.46%), and NO_GENUINE_TRADE_30D, NO_GENUINE_TRADE_7D and WASH_TRADE_SUSPECTED could not be evaluated. Ledger 64657818, methodology 1.0.8-draft. Keel's thresholds are chosen, not calibrated.
(Figures from the live API on 28 September 2026. Yours will differ.)
How it keeps answers honest
These rules come from Keel's engine and are enforced here as well:
An asset is
CODE:ISSUER, never a ticker. Several issuers publishUSDY.find_assetreturns all of them and the agent is told to ask.Provenance on every answer. Ledger and methodology version travel with every number, so anything an agent says can be checked against the API.
Unknown is not safe. A figure the engine could not compute is reported with the reason Keel gives, never as zero.
check_collateral_sizeanswersunknownrather than guessing.Unevaluated is not clear. Flags that could not be checked are listed as such, and a
partialband is described as a floor.No new methodology. The server compares an amount with figures the engine published.
estimate_trade_depthgives a bracket between measured rungs, not an interpolated point, because the methodology defines no interpolation.Exact decimals. Every monetary comparison uses
decimal.js, never floating point.
What this server will never do
Sign or submit a transaction, or hold a key. Keel is permanently read-only, and the test suite fails if
src/issues anything but a GET.Publish a price feed or act as an oracle.
Send alerts, webhooks or notifications.
Make a credit or investment decision. It reports liquidity; the lender decides.
Development
npm install
npm run typecheck
npm test
npm run build
npm run inspect # MCP Inspector against the built serverThe API types in src/api/schema.d.ts are generated from openapi/keel-openapi.yaml, a copy of
the contract in keel-backend. Refresh both with
npm run sync:contract (it expects ../keel-backend, or pass a path). A test fails when the
copied contract's version differs from keel.contractVersion in package.json, so drift is
visible rather than silent.
License
MIT
Available Tools
9 toolscheck_collateral_sizeCheck a collateral size against KeelARead-onlyIdempotent
Compares a proposed collateral amount with Keel's recommended maximum safe collateral size for the asset, and says which limit binds: liquidation (the book cannot absorb a forced sale) or manipulation (pushing the price up is cheaper than the loan it would unlock). Answers within, exceeds, or unknown. Unknown is not safe and not unsafe. This is a comparison with published figures, not a credit decision.
| Name | Required | Description | Default |
|---|---|---|---|
| quote | No | Optional quote asset id. Omit it: every monitored asset is measured against USDC, and every notional in the answer is in that quote asset. | |
| amount | Yes | A plain decimal amount in the quote asset (USDC unless quote is given), for example "500000" or "1250.5". A string, not a number, so no precision is lost. | |
| assetId | Yes | Keel asset id: CODE:ISSUER for an issued asset (for example USTRY:GCRYUGD5NVARGXT56XEZI5CIFCQETYHAPQQTHO2O3IQZTHDH4LATMYWC), or XLM. An asset is the (code, issuer) pair, never the ticker alone: use find_asset first when only a code is known. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower; the description adds genuinely useful semantics by explaining the two binding-limit modes (liquidation vs manipulation) and by warning that 'unknown' is neither safe nor unsafe. It does not cover freshness of the published figures or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core comparison, then the two limit types, then the result vocabulary. Every sentence carries content, though the parenthetical explanation of manipulation/liquidation is slightly verbose for a description whose schema already carries the naming details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies the return vocabulary (within/exceeds/unknown) and interprets the ambiguous value. For a three-parameter read-only tool this covers everything an agent needs before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents assetId, amount, and quote, including the CODE:ISSUER format and string-for-precision rationale. The description adds no parameter-level detail beyond that, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('compares a proposed collateral amount with Keel's recommended maximum safe collateral size') and explicitly scopes it as a comparison against published figures rather than a credit decision, which separates it from risk/underwriting siblings like get_asset_risk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when the tool applies and draws a boundary ('not a credit decision'), and the schema points to find_asset when only a code is known. It does not, however, name sibling alternatives such as get_asset_risk or compare_assets and the conditions that would select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_assetsCompare Stellar assets side by sideARead-onlyIdempotent
Side-by-side comparison of 2 to 10 assets: band and confidence, max safe collateral, depth at 5% on both sides, and fired flags, each with its own ledger. Useful for choosing between collateral candidates. Figures are all in USDC.
| Name | Required | Description | Default |
|---|---|---|---|
| assetIds | Yes | The assets to compare, as CODE:ISSUER or XLM. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, so the description's job is lighter. It usefully adds that results span both sides of the book with separate ledgers and that all figures are denominated in USDC, which the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first front-loads the comparison scope and the returned metrics, the second adds the decision context and unit convention. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so by listing every metric produced, plus the USDC unit. It stops short of noting pagination or whether unknown asset ids are rejected, which is a minor gap for a read-only batch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single assetIds parameter is fully documented there, including the CODE:ISSUER format. The description only restates the 2-10 cardinality already encoded as minItems/maxItems, adding no new parameter meaning; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('side-by-side comparison of 2 to 10 assets') with the exact comparison dimensions enumerated, so an agent can distinguish it from get_asset_risk or estimate_trade_depth without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Offers implied usage ('useful for choosing between collateral candidates') but never states when not to use it or which sibling to prefer for single-asset or depth-only questions. The find_asset prerequisite is only mentioned in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_trade_depthPrice impact bracket for a trade sizeARead-onlyIdempotent
For traders and market makers: places a buy or sell size (in the quote asset, USDC) between the measured rungs of Keel's depth ladder, answering 'this moves the price by at most 2% / 5% / 10%' or 'this exceeds the measured depth'. It is a bracket, never a point estimate, because the methodology defines no interpolation between rungs. Depth combines the SDEX order book and AMM pools.
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | buy pushes the price up, sell pushes it down. | |
| quote | No | Optional quote asset id. Omit it: every monitored asset is measured against USDC, and every notional in the answer is in that quote asset. | |
| amount | Yes | A plain decimal amount in the quote asset (USDC unless quote is given), for example "500000" or "1250.5". A string, not a number, so no precision is lost. | |
| assetId | Yes | Keel asset id: CODE:ISSUER for an issued asset (for example USTRY:GCRYUGD5NVARGXT56XEZI5CIFCQETYHAPQQTHO2O3IQZTHDH4LATMYWC), or XLM. An asset is the (code, issuer) pair, never the ticker alone: use find_asset first when only a code is known. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the burden is lower, and the description adds real behavioral context: no interpolation exists between rungs, so results are coarse brackets, and depth aggregates SDEX order book plus AMM pools. It doesn't mention latency, rate limits, or staleness of the measured ladder.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose before the bracket/methodology caveat. Slightly dense but every sentence carries information; the parenthetical examples could arguably be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description helpfully sketches the return shape ('at most 2%/5%/10%' or 'exceeds measured depth') and the non-interpolated nature of the answer. It could go further by pointing agents to get_methodology for the ladder definition, but an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter (side direction, quote default to USDC, string amount, asset id format). The description reinforces the quote-asset convention but adds no syntax or format detail beyond the schema, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation: placing a trade size between measured rungs of the depth ladder and returning a price-impact bracket. The 'bracket, never a point estimate' framing and mention of SDEX + AMM depth make it unmistakable versus siblings like get_asset_risk or check_collateral_size.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The audience framing ('for traders and market makers') implies when the tool matters, but no explicit when-to-use/when-not guidance or named alternatives are given. The dependency on find_asset appears only in the schema, not in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_assetFind a Keel asset id by codeARead-onlyIdempotent
Resolves an asset code such as USDY or AQUA to the full CODE:ISSUER ids Keel monitors. When one code has several issuers, ALL of them are returned and none is chosen: ask the user which issuer they mean rather than picking one, because the same ticker from a different issuer is a different asset.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Asset code, case-insensitive, e.g. "usdy" or "XLM". | |
| issuer | No | Optional issuer account (G...) or a prefix of it, to narrow the matches. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds genuine behavioral context beyond them: that no single match is selected and that multiple matches are a normal, expected outcome the agent must handle by asking the user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler. The lookup behavior is front-loaded and the multi-issuer caveat follows immediately, each sentence earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still conveys what comes back (full CODE:ISSUER ids, possibly several), which is exactly the information an agent needs. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the code and issuer parameters are already documented in the schema. The description reinforces the multi-issuer case but adds no syntax, format, or matching rules beyond what the schema states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (resolves) and resource (an asset code such as USDY or AQUA) and states the concrete output form (CODE:ISSUER ids Keel monitors). It is distinguishable in effect from siblings like list_assets, though it does not name an alternative tool explicitly, keeping it at a strong 4.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear operational context: when one code has several issuers all are returned, and the agent is told to ask the user rather than pick one. That is real usage guidance, but there is no statement of when to prefer a sibling tool or when this lookup is unnecessary, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_asset_riskLiquidity risk of a Stellar assetARead-onlyIdempotent
The full Keel risk reading for one asset: risk band and its confidence, fired and unevaluated flags, executable depth at +/-2%, 5% and 10% (SDEX order book plus AMM pools), recommended maximum safe collateral size with its liquidation and manipulation terms, holder concentration, volume to supply, and the last genuine trade. Pass ledger to read a historical reconstruction instead of the latest scan. Always quote the provenance line with the numbers.
| Name | Required | Description | Default |
|---|---|---|---|
| quote | No | Optional quote asset id. Omit it: every monitored asset is measured against USDC, and every notional in the answer is in that quote asset. | |
| ledger | No | Optional ledger sequence for a historical reading. Only ledgers Keel has reconstructed exist (for example 61340263, the ledger of the February 2026 Blend exploit); others answer LEDGER_NOT_AVAILABLE. | |
| assetId | Yes | Keel asset id: CODE:ISSUER for an issued asset (for example USTRY:GCRYUGD5NVARGXT56XEZI5CIFCQETYHAPQQTHO2O3IQZTHDH4LATMYWC), or XLM. An asset is the (code, issuer) pair, never the ticker alone: use find_asset first when only a code is known. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, and the description adds real behavioral context: the LEDGER_NOT_AVAILABLE error for unreconstructed ledgers, the historical-vs-latest mode switch, and the mandatory provenance-quoting convention. It does not describe pagination or rate limits, but those are less relevant for a read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the return-value enumeration, while long, is the substance of an output-schema-less tool. The verbose field list is dense but each clause maps to a distinct returned metric; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by enumerating risk band, confidence, flags, depth tiers, collateral sizing, concentration, volume/supply and last trade, plus the ledger error. It could note the quote-asset scope in the return but is otherwise complete for calling the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents assetId, quote (USDC default) and ledger thoroughly. The description only restates the ledger mode ('historical reconstruction') and adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('The full Keel risk reading for one asset') and enumerates exactly what the reading contains, so an agent knows the scope of the result. It does not, however, explicitly distinguish itself from overlapping siblings such as estimate_trade_depth or check_collateral_size, which return some of the same sub-metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear conditional mode ('Pass ledger to read a historical reconstruction instead of the latest scan') and a routing pointer to find_asset when only a code is known. It stops short of saying when to prefer this tool over the depth/collateral siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_methodologyKeel methodology and thresholdsARead-onlyIdempotent
The methodology version and every threshold Keel uses to fire flags and size collateral, with the link to the full documentation. The thresholds are chosen, not calibrated against a set of incidents; mention that when explaining why an asset got its band.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: the thresholds are chosen rather than calibrated against incidents, and the agent should mention that when explaining an asset's band. This is useful domain context that affects how the tool's output should be interpreted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the contents of the response and followed by an instruction on how to use the thresholds when explaining bands. Every sentence earns its place, though the second sentence is more usage guidance than tool description, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the burden of explaining what is returned. It does so by naming the methodology version, every threshold, and the documentation link, and it adds interpretive context about thresholds being chosen. A slightly clearer enumeration of return structure would make it complete at a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There are no parameter semantics to clarify, and schema coverage is 100% with an empty object schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource: the Keel methodology version, every threshold used to fire flags and size collateral, and a documentation link. It distinguishes itself from siblings like get_asset_risk and check_collateral_size by being the source of thresholds rather than an application of them, though it lacks an explicit verb like 'retrieve' or 'list'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides implied usage guidance by saying to mention the chosen-not-calibrated thresholds 'when explaining why an asset got its band,' which tells the agent one context for using the output. However, it does not explicitly say when to call this tool versus alternatives like get_asset_risk, nor does it state prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_risk_historyRisk history of a Stellar assetARead-onlyIdempotent
A time series of band, flags, depth and max safe collateral for one asset, from ONE data source. Give from and to (ledger sequences, at most 90 days apart) for a window, or omit both to list every stored reading of that source. Reconstructions such as the February 2026 USTRY series live under source offers-implied and are reachable only with both bounds omitted. Band changes are summarised.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last ledger, inclusive. Requires from. | |
| from | No | First ledger, inclusive. Requires to. | |
| limit | No | Most points to return. Default 200 here (the API allows up to 5000). | |
| quote | No | Optional quote asset id. Omit it: every monitored asset is measured against USDC, and every notional in the answer is in that quote asset. | |
| source | No | horizon (default) and hubble are direct readings; offers-implied and trades-implied are reconstructions, and trades-implied is a lower bound. | |
| assetId | Yes | Keel asset id: CODE:ISSUER for an issued asset (for example USTRY:GCRYUGD5NVARGXT56XEZI5CIFCQETYHAPQQTHO2O3IQZTHDH4LATMYWC), or XLM. An asset is the (code, issuer) pair, never the ticker alone: use find_asset first when only a code is known. | |
| resolution | No | Bucket size for a windowed request. Default day. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds genuine behavioral context beyond that: the 90-day maximum window, the distinction between direct readings and reconstructions, that trades-implied is a lower bound, and that band changes are summarised rather than returned raw.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with what the tool returns, then usage conditions, then source semantics. The named USTRY example costs a little space but illustrates the bounds-omitted rule.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and seven parameters, the description carries the burden well: it names the returned dimensions, the windowing rule, the source taxonomy, and the summarisation behavior. Return shape/pagination details are the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description still adds value the schema lacks: the hard 'at most 90 days apart' constraint on from/to, and the operational consequence of the source enum (reconstructions only reachable without bounds).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('a time series of band, flags, depth and max safe collateral for one asset') scoped to ONE data source. The 'time series' framing implicitly distinguishes it from the snapshot sibling get_asset_risk without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states the two usage modes: supply from and to for a windowed request, or omit both to list every stored reading. It also names the non-obvious condition that reconstructions like the USTRY series are reachable only with bounds omitted. It does not explicitly name alternative tools, but the when-to-use conditions are concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_statusKeel service statusARead-onlyIdempotent
Whether the Keel engine is healthy, the ledger of its latest scan, how many Stellar assets it monitors, and the methodology version its numbers follow. Call this first when freshness matters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety and idempotency profile is fully covered by structured data. The description adds the content shape (what the status reports) but no traits annotations miss: no auth requirements, caching/TTL behavior, rate limits, or whether the ledger reference is live or stale. Given the annotation coverage, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence, front-loaded with the most important question (is the engine healthy) followed by supporting detail, then the usage cue. Nothing is wasted, though the inline list is packed tightly enough that it reads as a run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden, and it does by enumerating the four reported facts. Combined with annotations covering safety, an agent has enough to call and interpret the tool. Missing only detail on format/units of the returned values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No misleading parameter information is present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (Keel service) and enumerates the four facts it reports: engine health, latest scan ledger, monitored asset count, and methodology version. This clearly distinguishes it from the asset-level siblings (list_assets, find_asset, get_asset_risk). It lacks an explicit verb, reading as a noun phrase rather than 'Returns status of...', but the resource is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call this first when freshness matters' gives a concrete condition for invocation and positions the tool as an entry-point check. It does not name exclusions or alternatives, nor does it explain what 'freshness' means operationally, but the cue is actionable and unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assetsList monitored Stellar assetsARead-onlyIdempotent
Lists the Stellar assets Keel monitors with their risk band, band confidence, recommended maximum safe collateral size (USDC) and fired flags. Filter by band (e.g. CRITICAL) or by a single flag (e.g. MANIPULATION_CHEAP) to find risky collateral.
| Name | Required | Description | Default |
|---|---|---|---|
| band | No | Only assets in this band. | |
| limit | No | Page size, default 50, max 200. | |
| offset | No | Rows to skip, for paging. | |
| hasFlag | No | Only assets on which this flag fired. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the shape of returned data, but since there is no output schema this is mostly return-value context rather than behavioral disclosure; no auth, rate-limit, or ordering/pagination behavior is described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the resource and its returned fields, followed immediately by the filtering behavior. No filler or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields, and pagination/filter parameters are documented in the schema. Adequate overall, though it omits default ordering and any note on how limit/offset interact with result size.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with enums for band and hasFlag, so the schema fully documents all four parameters. The description's examples ('e.g. CRITICAL', 'e.g. MANIPULATION_CHEAP') restate enum values already present in the schema, adding only marginal value; baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the Stellar assets Keel monitors') and enumerates the returned fields (risk band, band confidence, max safe collateral size, fired flags). This clearly distinguishes it from siblings like find_asset or get_asset_risk, which operate on a single asset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The filtering sentence ('Filter by band... or by a single flag... to find risky collateral') gives an implied usage context, but there is no explicit when-to-use vs sibling guidance and no exclusions (e.g. when to prefer find_asset or compare_assets).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.1.0- First observed
check_collateral_size - First observed
compare_assets - First observed
estimate_trade_depth - First observed
find_asset - First observed
get_asset_risk - First observed
get_methodology - First observed
get_risk_history - First observed
keel_status - First observed
list_assets
TDQS
Scored across 9 tools
Each tool targets a distinct query: engine status, asset inventory, code resolution, per-asset risk, collateral comparison, trade depth, history, comparison, and methodology. The only mild overlap is between get_asset_risk (full reading including depth rungs) and estimate_trade_depth (bracket for a given size), but their stated purposes differ enough to guide selection.
Nearly all names follow a verb_noun pattern (list_assets, find_asset, get_asset_risk, check_collateral_size, estimate_trade_depth, get_risk_history, compare_assets, get_methodology). The lone exception is keel_status, which uses a server-name prefix instead of a verb, a minor deviation.
Nine tools is well-scoped for a read-only risk analytics server, with each tool covering a distinct query type (inventory, detail, history, comparison, methodology). No redundant or filler tools.
The surface covers the full read lifecycle for the domain: health, asset discovery, resolution, risk readings, historical reconstruction, comparison, collateral sizing, depth estimation, and methodology. There is no alert/watchlist or portfolio-level monitoring capability, but for a query-oriented analytics server the coverage is strong.
Maintenance
Related MCP Connectors
XRPL token rug-checks, issuer reputation & AMM data for AI agents. Pay-per-call USDC via x402.
Crypto yield data for AI agents: lending, savings, staking, borrowing & stablecoin rates. 18 tools.
Read-only Hyperliquid data for AI agents: fills, candles, funding, liquidations, wallet analytics.
Counterparty risk indicators for digital asset yield providers across 9 modules. 7 tools.
Related MCP Servers
- AlicenseAqualityFmaintenanceProvides DeFi vault risk analytics for AI agents to search, compare, and perform due diligence on over 700 vaults across major protocols like Morpho and Aave. It enables natural language analysis of risk scores, platform security, and portfolio-level risk assessments.95MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to access real-time crypto risk intelligence with two tools: Flare for precursor detection and Core for overall risk environment assessment.4-
- AlicenseBqualityCmaintenanceExposes 17 read-only tools from six XRPL-Utilities services so AI agents can access XRPL wallet analysis, signal feeds, macro telemetry, permissioned asset stacks, RWA tracking, and ETF flow data.41109 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to check DeFi liquidation risk levels for lending protocols like Aave, Compound, and Morpho, including at-risk positions, liquidation prices, current prices, and aggregate exposure. Access is pay-per-call via x402 micropayments with USDC on Base, requiring no API key or signup.MIT