Skip to content

Remove financial framing; state the server is not for financial operations - #155

Merged
aterga merged 30 commits into
mainfrom
claude/icp-marketplace-compliance-vpawel-3-definancialize
Aug 27, 2026
Merged

aterga merged 30 commits into
mainfrom
claude/icp-marketplace-compliance-vpawel-3-definancialize

Conversation

@aterga

@aterga aterga commented Aug 26, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Third of three marketplace-compliance PRs (companions: #153 — top-up instructions-only, merged; #154 — the ledger-method guard and instructions-only canister creation, merged; this PR now targets main directly). It aligns everything a directory reviewer reads — README, tool/argument texts, the landing page, the crates.io metadata, and the submission docs — with the behavior the companions ship: financial transactions are not supported, stated plainly, instead of advertising DeFi/portfolio/trading use cases.

Related issues

None — part of the marketplace-compliance track. Goal: the OpenAI attestation "my plugin does not initiate or execute money transfers, crypto transfers, or investment trades on behalf of users" and Anthropic's financial-transactions acknowledgment, both answerable black-and-white.

Changes

  • README: an up-front "Not for financial operations" statement (what is refused, that top-up and creation are instructions-only, and that users act in a wallet they control, e.g. oisy.com); "DeFi" dropped from the skills enumeration; example apps neutralized — DEX names (MULTI/DEX, ICPSwap) and, per review, financial-adjacent ones (NNS, Oisy) are no longer used as examples: the neutral example is https://opencloud.org, with Oisy kept only where a wallet is genuinely meant (the refusal recommendation).
  • Tool/argument texts (tools.rs, discover.rs): the same example neutralization (including OpenAppArgs/FindAppArgs schema docs and the server-instruction walkthroughs), and "DeFi" removed from icp_list_skills' description. The financial policy itself lives in the server-level instructions via Refuse ledger transfer/approval methods in canister_update_call #154 — per review, no per-tool policy paragraphs.
  • Landing page (src/assets/index.html bundled template): the wallet-balance chat mock becomes a neutral app-data read; portfolio/badge/NNS-neuron prompts become neutral app examples; the tool-group copy says creation and top-ups return CLI steps; the Trust section gains a "Not for financial operations" card. Only the embedded template line changed — the edit script asserts decoded-value equality around the re-encode.
  • Submission docs (docs/anthropic-directory-submission.md, docs/openai-directory-submission.md): rewritten to the decided posture, per review — no counterexample lists, options, or open follow-ups: no tool initiates or executes a transfer of the user's funds (the guard refuses financial ledger methods; top-up and creation are instructions-only), so the attestation/acknowledgment sections state that plainly. Example prompts and test cases are financially neutral; the "standardized" qualifier is gone from submission-facing text.
  • crates.io metadata (Cargo.toml): the cryptography::cryptocurrencies category is removed.

Testing

Checklist

  • I have read the Contributing guidelines.
  • Docs (README / comments) updated for any user-visible change.
  • No secrets, credentials, or internal-only information are included.

claude added 2 commits August 26, 2026 12:13
Marketplace directories (Anthropic, OpenAI) prohibit connectors that
initiate or execute money or crypto transfers on the user's behalf, and
this server's purpose is reading, building, and operating canisters —
not moving funds.

canister_update_call now refuses the update methods that move value or
grant spending rights on ICP ledgers, on every canister, before any
network work. The disallow list leans on the ICRC standards that ledgers
on ICP follow — ICRC-1/ICRC-2 (fungible transfers and approvals), ICRC-4
(batch transfers), ICRC-7/ICRC-37 (NFT transfers and approvals) — plus
the ICP ledger's pre-ICRC surface (transfer, send_dfx, notify_dfx), the
cycles ledger's withdraw/withdraw_from, and the ERC-20-style names of
the older DIP20/EXT token standards (transferFrom, approve). Matching is
exact on a normalized name (lowercased, separators stripped), never a
substring test, so spelling variants are caught without false positives
on names that merely contain a blocked one.

The refusal is a recommendation, not a dead end: it tells the agent to
send the user to a wallet or frontend they control in their own browser
(e.g. https://oisy.com; for governance, the NNS dapp). The tool
description states the policy up front — financial transactions are not
supported, for marketplace compliance and user safety — and a test pins
both the description and the refusal wording.

The CMC's notify_create_canister / notify_top_up stay callable: they
move no funds out of any account and blocking them would strand the
documented recovery path for an interrupted ICP funding flow. The module
docs are explicit that a name-based list is a guardrail for the
standardized ledger surface, not a hermetic seal over bespoke canisters.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
…tions

The marketplace-compliance posture (top-up instructions-only, ledger
transfer/approval methods refused) needs the surrounding material to say
the same thing: this MCP server is infrastructure tooling and is not
intended for financial operations.

- README: a 'Not for financial operations' statement up front; the
  skills enumeration drops DeFi; DEX-app names (MULTI/DEX, ICPSwap) in
  examples give way to neutral ones (NNS, Oisy), with the known-app
  registry and its wrong-TLD repair behavior unchanged in code.
- Tool descriptions and server instructions: same example cleanup, plus
  a NOT FOR FINANCIAL OPERATIONS paragraph in the server instructions
  that tells agents to send users to a wallet they control (oisy.com)
  for such operations.
- Landing page (src/assets/index.html bundle): the wallet-balance chat
  mock becomes an app-data read, the portfolio/DEX example prompts
  become neutral app examples, the tool-group copy stops claiming
  server-side top-ups, and the trust section gains a 'Not for financial
  operations' card. Only the embedded template changed; decoded-value
  equality is asserted around the re-encode.
- Cargo.toml: drop the cryptography::cryptocurrencies crates.io
  category — network/api tooling categories remain.
- Directory-submission docs: the financial-transactions blockers now
  record the shipped posture (instructions-only top-up, ledger-method
  refusals, stated policy) and keep the honest caveats: the
  icp_create_canister icp path still executes an ICP-to-cycles
  conversion and needs an explicit decision, and a name-based guard
  covers the standardized ledger surface, not bespoke canisters. The
  listing description draft and reviewer instructions match the new
  behavior.

Factual technical references to ledgers (reading a ledger is a public
Candid query) and the ckUSDC lookup examples stay: identifying what a
canister is remains core, non-financial functionality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Aligns public messaging and marketplace submission materials around a non-financial-operations posture.

Changes:

  • Removes financial and DeFi examples.
  • Adds financial-operation disclaimers and refusal guidance.
  • Updates marketplace metadata and submission documentation.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
README.md Documents the intended non-financial posture.
Cargo.toml Removes the cryptocurrency category.
crates/imcp2-core/src/tools.rs Updates tool descriptions and server instructions.
crates/imcp2-core/src/discover.rs Neutralizes app examples.
src/assets/index.html Revises landing-page examples and trust messaging.
docs/openai-directory-submission.md Updates OpenAI compliance guidance.
docs/anthropic-directory-submission.md Updates Anthropic compliance guidance.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread README.md Resolved
Comment thread crates/imcp2-core/src/tools.rs Resolved
Comment thread src/assets/index.html Resolved
Comment thread docs/openai-directory-submission.md Resolved
Comment thread docs/anthropic-directory-submission.md Resolved
Comment thread crates/imcp2-core/src/discover.rs Resolved
claude added 2 commits August 26, 2026 14:02
…view)

Address the Copilot review on the ledger-method guard:

- The cycles ledger's create_canister / create_canister_from draw cycles
  from the caller's balance through the exact generic route this guard
  closes (withdraw was already blocked for that reason), so they join
  the disallow list. Their refusal redirects to the purpose-built
  icp_create_canister tool (or the icp CLI) rather than to a wallet —
  creation stays supported, only the uncontrolled generic route closes.
- The absolute 'this server does not move financial assets' wording in
  the tool description and the refusal message is scoped to 'this tool':
  precise on this branch standalone (icp_create_canister still funds at
  creation) and after the companion top-up change merges.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
…iew)

Address the reviews on the framing cleanup:

- Per author feedback, Oisy (also a DeFi app) stops serving as the
  neutral usage example: name examples use NNS (the registry app that
  fits), and URL / bare-host examples use https://opencloud.org — live
  and IC-served (x-ic-canister-id present), so it passes the IC-evidence
  gate as documented. Oisy remains only where a wallet is genuinely
  meant: the refusal recommendation for financial operations.
- The absolute 'never moves money or tokens' claims flagged by the
  review bot become enforcement-scoped statements: README, the landing
  trust card, and the server instructions now say token transfers,
  approvals, payments, and trades ARE REFUSED (via the update-call guard
  and the instructions-only top-up) and disclose that creating and
  funding the user's own canisters remains available through
  icp_create_canister.
- The OpenAI submission doc presents the shipped changes as mitigations
  toward a still-pending attestation decision (the icp_create_canister
  funding path and the bespoke-method limitation are named as the open
  counterexamples), not as grounds to check the box. The Anthropic doc's
  'shipped' section is phrased against the PR set (#153/#154) it
  describes rather than any single branch's tree.

This PR is documentation/framing for the enforcement #153 and #154
ship; merge order remains #153, #154, then this.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
@aterga
aterga marked this pull request as ready for review August 26, 2026 14:10
@aterga
aterga requested review from a team and Copilot August 26, 2026 14:10
…iew)

The review bot's follow-up is right that a method deny-list cannot make
the generic update tool UNABLE to move assets — a bespoke method name is
out of any list's reach, which the module docs and submission docs
already record. The description and refusal therefore stop claiming
impossibility: they state the binding policy (moving financial assets
through this tool is not supported and must not be attempted under any
method name) alongside what is mechanically enforced (the standardized
ledger surface is refused on every canister). Whether to go further —
dropping the generic update surface or moving to a reviewed allow-list —
is the recorded 'directory-safe profile' option and stays a product
decision, not something this PR takes on its own.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Suppressed comments (1)

docs/anthropic-directory-submission.md:51

  • This row is marked as a verified success, but the current code still has only the 17 read-only tools listed in tools.rs:2425-2429; top-up remains destructive at tools.rs:1356-1362. Rebase onto #153 before recording 18 read-only tools as verified, or mark this row pending so the reviewer instructions match the actual tool annotations.
| No catch-all read/write tool; reads and writes are separate tools | ✅ 18 read-only tools with [#153](https://github.com/dfinity/imcp2/pull/153) (incl. the instructions-only top-up); writes split per operation |

Comment thread README.md Resolved
Comment thread src/assets/index.html Resolved
Comment thread docs/openai-directory-submission.md Resolved
Comment thread crates/imcp2-core/src/tools.rs Resolved
…iew)

Second review pass on the framing: every remaining absolute 'X is
refused' claim is reworded to the stable formula the guard actually
supports — financial operations are unsupported BY POLICY, and the
STANDARDIZED ledger surface is refused mechanically. Applied to the
README statement, the server instructions (which now also tell the
model never to attempt a financial operation through any other method
or route), and the landing trust card ('standard ledger transfers and
token approvals are refused by design'). The Anthropic readiness row
for the read-only tool count is marked pending on the top-up PR rather
than verified.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
Copilot AI review requested due to automatic review settings August 26, 2026 14:16

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.

Suppressed comments (2)

docs/anthropic-directory-submission.md:351

  • This negative reviewer test does not pass on the current branch: canister_update_call has no icrc1_transfer refusal and will continue to encode and submit the update. The section above conditionally assumes #153/#154 are merged, but these pasted test instructions do not preserve that condition. Rebase after #154 lands before presenting this as intended behavior, or mark the test as pending.
> 5. Financial operations are refused by design: asking the assistant to
>    transfer tokens (e.g. call `icrc1_transfer`) returns a policy message
>    directing the user to a wallet they control — that behavior is intended.

docs/openai-directory-submission.md:120

  • The submission record calls these mitigations "shipped," but neither is in this PR's current base: top-up still executes management::top_up_canister, and the generic update handler has no financial-method guard. If this branch is merged first, the compliance record is factually wrong. Make #153/#154 blocking dependencies and rebase after both land, or describe them as pending rather than shipped.
- The attestation "my plugin does not initiate or execute money transfers,
  crypto transfers, or investment trades on behalf of users" is addressed by
  two shipped **mitigations** — not yet grounds to check the box:
  `canister_update_call` refuses the standardized ledger transfer/approval
  methods (ICRC-1/ICRC-2 and related standards, the ICP ledger's legacy
  `transfer`, the cycles ledger's `withdraw` and `create_canister` spends) on
  every canister and says so in its description
  ([#154](https://github.com/dfinity/imcp2/pull/154)), and
  `icp_top_up_canister` is instructions-only and executes nothing
  ([#153](https://github.com/dfinity/imcp2/pull/153)); README, landing page,

Comment thread crates/imcp2-core/src/tools.rs Resolved
Comment thread README.md Resolved
Comment thread src/assets/index.html Resolved
claude added 3 commits August 26, 2026 14:20
…e-compliance-vpawel-2-ledger-guard

# Conflicts:
#	crates/imcp2-core/src/tools.rs
…' into claude/icp-marketplace-compliance-vpawel-3-definancialize
The framing PR now contains the enforcement it describes: main (with
the merged instructions-only top-up, #153) and the ledger-method guard
branch (#154) are merged in, and the PR is retargeted onto #154's
branch so it cannot merge ahead of it — the ordering the review kept
flagging is now mechanical rather than a note in the description. The
Anthropic readiness row flips to verified since #153 is merged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
Copilot AI review requested due to automatic review settings August 26, 2026 14:22
@aterga
aterga changed the base branch from main to claude/icp-marketplace-compliance-vpawel-2-ledger-guard August 26, 2026 14:22

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.

Suppressed comments (1)

docs/anthropic-directory-submission.md:351

  • “Financial operations are refused” contradicts the two remaining exposures documented above: icp_create_canister still executes the ICP conversion, and bespoke value-moving methods are not caught. Narrow this reviewer test instruction to the behavior the guard actually guarantees.
> 5. Financial operations are refused by design: asking the assistant to
>    transfer tokens (e.g. call `icrc1_transfer`) returns a policy message
>    directing the user to a wallet they control — that behavior is intended.

Comment thread docs/anthropic-directory-submission.md Resolved
claude added 5 commits August 26, 2026 14:26
Per author direction on the PR: no web system can tell from the outside
whether a given request moves funds, so the honest claim is intention,
not capability. The description now reads 'not intended for moving
money, tokens, or other financial assets on the user's behalf' with the
ledger-method refusals presented as the reasonable measures taken to
refuse asset-moving requests; the refusal message matches, and the
description test pins the new header phrase.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
The pasted marketplace copy and the reviewer test instruction now match
the settled framing: the connector is not INTENDED for financial
transactions, and the STANDARDIZED token-ledger transfer/approval
methods are refused as the safety measure — neither line claims the
guard catches more than it does.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
Per author feedback: tokens are only valuable if they can be exchanged
or used, and the ICP ecosystem's financial platforms (wallets like Oisy,
exchanges like ICP Swap) integrate ledgers through the ICRC standards —
a token on a bespoke, non-standard ledger can exist, but the ecosystem's
platforms cannot hold or trade it, so it carries little exchangeable
value. Also syncs the quoted policy wording in the same note with the
intent framing the description now uses.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
…e-compliance-vpawel-2-ledger-guard

# Conflicts:
#	crates/imcp2-core/src/tools.rs
…' into claude/icp-marketplace-compliance-vpawel-3-definancialize
Comment thread crates/imcp2-core/src/tools.rs Resolved
claude added 3 commits August 27, 2026 13:51
Per maintainer review across the compliance PRs: creating and funding a
canister spends the user's ICP or cycles, so the connector must not
execute it. icp_create_canister now works exactly like the top-up tool
(#153): it returns the icp CLI steps for the user to run themselves —
install the CLI, check/mint cycles, icp canister create, and finally add
the connector's management principal (printed by icp_cycles_balance) as a
controller so icp_install_code and the lifecycle tools can operate the
new canister. The executing paths are removed from the binary: the
ICP-ledger transfer to the CMC, notify_create_canister, and the
cycles-ledger create_canister call, with their wire types and helpers.

With this, no tool initiates or executes a transfer of the user's funds:
the server-wide 'asset-moving requests are denied' instruction now has no
executing counterexample. The compliance refusal for cycles-ledger
creation spends may name icp_create_canister again — it prints steps and
executes nothing — and the CMC notify_* methods stay callable as the
recovery path for a user's own interrupted CLI mint. README and server
instructions updated; tests moved to pin the instructions-only contract
(annotations, description, echoed amounts, controller handover step).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
…' into claude/icp-marketplace-compliance-vpawel-3-definancialize
…e docs

Merge branch 'claude/icp-marketplace-compliance-vpawel-2-ledger-guard'
(icp_create_canister is now instructions-only) and apply the review sweep
on this branch's surfaces:

- NNS is no longer used as an example app or venue anywhere agent-facing
  or in the README/landing page (per review: it can hold funds). The
  functional pieces stay — the known-app registry, derivation-origin map,
  security guardrails, and dashboard status lines.
- The README intro now says creation, like top-up, returns icp CLI
  instructions for the user to run themselves.
- Both directory-submission docs state the decided posture plainly: no
  tool initiates or executes a transfer of the user's funds; the
  counterexample/options/open-question passages are gone (per review:
  submissions should be black or white, no grey areas or follow-ups).
  Example prompts and test cases are financially neutral (opencloud.org,
  cycles-instructions, plain canister ids); the OpenAI financial negative
  test case is removed.
- OpenAppArgs/FindAppArgs docs lose the MULTI/DEX/Oisy/NNS name examples
  (also flagged by review-bot); landing page prompt and group-04 copy
  updated to match the instructions-only behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
Copilot AI review requested due to automatic review settings August 27, 2026 13:59
claude added 2 commits August 27, 2026 14:01
Per review: policy language belongs in the server-level instructions, not
in per-tool descriptions. The top-up and creation descriptions now state
the one functional fact a calling model needs — the tool only prints the
icp CLI steps and never executes the operation — without the
provided-for-completeness / never-moves-funds disclaimer prose. Tests pin
the functional wording and that the descriptions stay free of financial
language.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
…' into claude/icp-marketplace-compliance-vpawel-3-definancialize

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.

Suppressed comments (4)

docs/openai-directory-submission.md:149

  • The PR description says the submission docs gain a “transfer is refused” negative test, but this revised negative-test list still contains only app resolution, authorization, authentication, and ownership failures. Add a standardized ledger-transfer prompt and its expected policy refusal so the control supporting the attestation is actually exercised during OpenAI review.
Negative:
1. "Open https://<a site with no Internet Computer presence>" → refused by
   the IC-evidence gate with guidance (web-search or ask the user for the
   real URL) rather than resolved to a wrong identity.

docs/anthropic-directory-submission.md:51

  • There are now 19 read-only tools, not 18: the annotation regression test lists the previous 17 reads plus both icp_top_up_canister and the newly instructions-only icp_create_canister (tools.rs:2401-2408). This count would give directory reviewers an inaccurate tool inventory.
| No catch-all read/write tool; reads and writes are separate tools | ✅ 18 read-only tools ([#153](https://github.com/dfinity/imcp2/pull/153) merged; incl. the instructions-only top-up); writes split per operation |

docs/anthropic-directory-submission.md:340

  • This repeats the unsupported “clean acknowledgment” claim in the submitter checklist. The implementation itself documents that arbitrary bespoke/forwarding methods bypass the name-based guard (compliance.rs:36-49), so canister_update_call can still execute a value-moving update. The checklist must preserve that limitation unless the generic update surface is restricted.
documentation. **Financial transactions** is a clean acknowledgment: no
tool initiates or executes a transfer of the user's funds — financial ledger
methods are refused, and top-up and canister creation are instructions-only.

docs/anthropic-directory-submission.md:319

  • The read-only count must be 19 here as well. Both canister creation and top-up are now instructions-only/read-only, and tools.rs:2401-2408 enumerates 19 tools with read_only_hint = true.
>    "Questions only" exercises the 18 read-only-annotated tools; "Actions &
>    questions" additionally allows state-changing calls.

Comment thread docs/openai-directory-submission.md Resolved
Comment thread docs/anthropic-directory-submission.md Resolved
Comment thread README.md Resolved
Copilot AI review requested due to automatic review settings August 27, 2026 14:03

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.

Suppressed comments (4)

docs/anthropic-directory-submission.md:51

  • This count is stale. The annotation test’s read-only list contains 19 tools: #153 made icp_top_up_canister read-only, and the current #154-based tree also marks icp_create_canister read-only (tools.rs:2401-2408). Reporting 18 gives directory reviewers an incorrect tool inventory.
| No catch-all read/write tool; reads and writes are separate tools | ✅ 18 read-only tools ([#153](https://github.com/dfinity/imcp2/pull/153) merged; incl. the instructions-only top-up); writes split per operation |

docs/anthropic-directory-submission.md:319

  • The current tool annotations expose 19, not 18, read-only tools: both icp_top_up_canister and icp_create_canister are now in the read-only set (tools.rs:2401-2408). The reviewer instructions should match the actual consent-screen inventory.
>    "Questions only" exercises the 18 read-only-annotated tools; "Actions &
>    questions" additionally allows state-changing calls.

docs/anthropic-directory-submission.md:176

  • This unconditional attestation is not established by the shipped guard. canister_update_call still executes arbitrary update methods, while compliance.rs:36-49 explicitly says bespoke value-moving methods, forwarding intermediaries, and legacy DIP20/EXT methods remain reachable. This also contradicts the PR description’s promise to keep that caveat on record. Either restrict the generic update tool to a reviewed non-financial allow-list/drop it for the directory profile, or restore the caveat and leave the acknowledgment pending.
**Posture, stated plainly — the black-and-white answer the compliance step
needs:** no tool initiates or executes a transfer of the user's funds.
Financial ledger methods are refused, and the funding operations — top-up and
canister creation — are instructions-only. The financial-transactions
acknowledgment is made on that basis, without qualifications.

docs/openai-directory-submission.md:114

  • The claim that no tool can execute a transfer is broader than the implementation. The name-based guard deliberately leaves bespoke value-moving methods, forwarding canisters, and legacy DIP20/EXT methods callable through canister_update_call (compliance.rs:36-49). This also conflicts with the PR description’s stated caveat. Either implement a reviewed non-financial allow-list/drop the generic update tool for this profile, or retain the caveat instead of declaring the attestation satisfied.
- The attestation "my plugin does not initiate or execute money transfers,
  crypto transfers, or investment trades on behalf of users" is satisfied by
  the shipped behavior — check it on that basis: no tool initiates or
  executes a transfer of the user's funds. `canister_update_call` refuses

Comment thread docs/anthropic-directory-submission.md Resolved
Comment thread docs/openai-directory-submission.md Resolved
Per review-bot findings on the submission docs: with creation now
instructions-only there are 19 read-only-annotated tools, not 18 (both
places); the cycles-instructions example prompt names a concrete canister
id since icp_top_up_canister requires one; and the README intro clause is
scoped to the two instructions-only tools.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
Copilot AI review requested due to automatic review settings August 27, 2026 14:09

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated no new comments.

Suppressed comments (4)

Previously missed (2) — in code that hasn't changed since the last review.

docs/anthropic-directory-submission.md:136

  • This heading says an answer is pending, but lines 178-183 say the topic is resolved and that no open compliance question remains. Use one status consistently so submitters do not treat a resolved item as a blocker.
### 2. Financial-transactions policy (mitigations shipped; answer pending)

docs/openai-directory-submission.md:149

  • The angle-bracket placeholder is parsed as an HTML <a ...> tag in Markdown, so the example prompt can disappear or render as malformed markup. Phrase the placeholder as ordinary text instead.
1. "Open https://<a site with no Internet Computer presence>" → refused by
   the IC-evidence gate with guidance (web-search or ask the user for the
   real URL) rather than resolved to a wrong identity.

docs/openai-directory-submission.md:115

  • This attestation is not supported by the shipped guard. compliance.rs:38-49 explicitly says the name blocklist is not a hermetic seal and deliberately permits legacy DIP20/EXT transfer/transferFrom/approve calls and bespoke forwarding/swap methods; canister_update_call then executes every unmatched update. An authenticated call can therefore still initiate a transfer from a user's custom-ledger account. A truthful absolute attestation requires removing/restricting the generic update tool (for example, a reviewed non-financial allowlist) or treating financial compliance as unresolved.
- The attestation "my plugin does not initiate or execute money transfers,
  crypto transfers, or investment trades on behalf of users" is satisfied by
  the shipped behavior — check it on that basis: no tool initiates or
  executes a transfer of the user's funds. `canister_update_call` refuses
  the financial ledger methods (ICRC-1/ICRC-2 and the ICRC-4/-7/-37

docs/anthropic-directory-submission.md:176

  • The absolute claim that no tool can transfer user funds contradicts the guard's documented limits in compliance.rs:38-49: bespoke methods and legacy DIP20/EXT transfers on arbitrary canisters are deliberately allowed, and canister_update_call executes unmatched methods as the user's app principal. This also explains why line 159 still needs the “standardized” qualifier despite the PR description saying that qualifier was removed. Restrict/remove the generic update tool for the directory profile, or keep this acknowledgment unresolved rather than submitting the absolute claim.
**Posture, stated plainly — the black-and-white answer the compliance step
needs:** no tool initiates or executes a transfer of the user's funds.
Financial ledger methods are refused, and the funding operations — top-up and
canister creation — are instructions-only. The financial-transactions
acknowledgment is made on that basis, without qualifications.

Base automatically changed from claude/icp-marketplace-compliance-vpawel-2-ledger-guard to main August 27, 2026 14:18
Copilot AI review requested due to automatic review settings August 27, 2026 14:21

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.

Suppressed comments (1)

docs/anthropic-directory-submission.md:136

  • This heading says the financial-transactions answer is pending, but the same section says the acknowledgment is made without qualification and that no open compliance question remains (lines 172–183). Mark it resolved so submitters do not receive contradictory status guidance.
### 2. Financial-transactions policy (mitigations shipped; answer pending)

Comment thread docs/openai-directory-submission.md Resolved
Comment thread crates/imcp2-core/src/tools.rs Resolved
… placeholder

Per review-bot findings: the open_app / canister_query descriptions and
the server instructions still used balance/holdings/positions and a
get_balance example as the model-visible illustrations of per-app data —
replaced with bookings/appointments/orders/profile. The anthropic doc's
section heading still said 'answer pending' above a body that says
resolved in code; and the openai doc's negative test case used an angle-
bracket placeholder that Markdown parses as a raw HTML tag — it now uses
a reserved example.com domain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvwAVXfx5kLNc4SqKXkavk
Copilot AI review requested due to automatic review settings August 27, 2026 14:32

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated no new comments.

Suppressed comments (3)

Previously missed (2) — in code that hasn't changed since the last review.

docs/anthropic-directory-submission.md:159

  • The PR description explicitly says the “standardized” qualifier was removed from submission-facing text, but this Anthropic submission still uses it. That weakens the stated black-and-white posture compared with lines 172–176; use the same “financial ledger methods” wording used elsewhere in this document.
- `canister_update_call` **refuses the standardized ledger methods** that

docs/anthropic-directory-submission.md:319

  • A Questions-only session cannot exercise all 19 read-only-annotated tools: icp_canister_status is annotated read-only but explicitly requires “Actions & questions” because it uses an IC update call (crates/imcp2-core/src/tools.rs:1400-1402). Calling it under Questions-only is rejected, so the reviewer instructions need to state this exception rather than imply Actions only adds state-changing calls.
>    "Questions only" exercises the 19 read-only-annotated tools; "Actions &
>    questions" additionally allows state-changing calls.

docs/anthropic-directory-submission.md:182

  • The submission-day checklist still leaves “Reply received … settling the financial-transactions … acknowledgment” unchecked at line 358, so this new “resolved in code / no open compliance question” status leaves the reviewer guide internally contradictory and does not meet the PR description’s promise of no open follow-up. Remove the financial-transactions portion from that checklist item (leaving the separately documented first-party API follow-up, if still required).
**Status: resolved in code.** An email to <mcp-review@anthropic.com>
(2026-07-31) had asked whether cycles funding and the general-purpose
`canister_update_call` pass review; the changes above made both questions
moot — funding no longer executes at all, and the update tool refuses
financial ledger methods. No open compliance question remains on this topic;

@aterga
aterga requested a review from sea-snake August 27, 2026 14:35
@aterga
aterga merged commit 670c77a into main Aug 27, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants