Atlas / MCP servers / osauer / canary

canaryBLOCK

mcp/osauer/canary

Canary is a local risk desk for your brokerage account: daily brief, portfolio and market evidence, read-only MCP tools, CLI, paired app and a Go client. Runs with Interactive Brokers today; the broker layer is its own package. Gated broker actions need the separate trading build.

Verdict
BLOCK
Grade
F
Trust score
58 /100
Exposed tools
—
Transport
—
License
MIT
Stars
8
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://github.com/osauer/canary/actions/workflows/ci.yml) [](https://github.com/osauer/canary/releases/latest) [](LICENSE)

A local risk desk for your brokerage account.

It runs with Interactive Brokers today, through IB Gateway or TWS, and keeps the broker layer in its own Go package, pkg/ibkr, so other brokers can follow.

Canary turns one local IB Gateway or TWS session into a daily brief, current portfolio and market evidence, and a broker-confirmed review of what past position changes delivered. Use the same daemon from an MCP host, the shell, or a paired phone. The standard binary and every MCP tool are structurally read-only: they contain no broker-order preview or execution surface.

Canary is for an IBKR Pro user who runs Gateway or TWS locally and wants stale, missing, or held evidence to remain visible. It is not a hosted brokerage service, a trade recommender, or a complete TWS API replacement. If you only need a Go wire-protocol client, use pkg/ibkr. To read a running Canary from your own Go program, import the module root github.com/osauer/canary/v2: it runs the same read-only tool catalogue over the daemon socket, and canarytest serves the wire types on a temporary socket for tests. The client also exposes a narrow audited cash-sweep ordering preference; its tool catalogue remains read-only and the preference cannot activate reserves or broker execution.

[Documentation](https://osauer.dev/canary/docs/) · Install · First session · Canary Edge · MCP tools · Safety · Privacy

Start

You need I

Read from source at commit c94fe4122977OBSERVED · 2026-10-10
02

Trust audit

BLOCKgrade F · trust 58/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryFAIL
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (6 observation(s))
Network
declared (11 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHInventory / provenance · inv.suspicious_name · CWE-1104
scripts/check-release-payload-inventory.sh
check-release-payload-inventory.sh
Why it matters. member named after an attack tool
Fix. remove or justify
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
internal/risk/rulebook.go:605
row := eval(set, c.pol.SetForBucket(set))
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInventory / provenance · inv.symlink · CWE-1104
claude-plugin/.claude-plugin/plugin.json
claude-plugin/.claude-plugin/plugin.json
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
claude-plugin/hooks
claude-plugin/hooks
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
claude-plugin/scripts/canary-mcp.sh
claude-plugin/scripts/canary-mcp.sh
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
claude-plugin/skills
claude-plugin/skills
Why it matters. link not followed
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
.agents/skills/canary-preview/SKILL.md:8
Open the isolated Canary SPA at `http://127.0.0.1:8766/`. Never adopt, kill,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
.agents/skills/canary-preview/SKILL.md:18
canary app --addr 127.0.0.1:8766 --public-url http://127.0.0.1:8766 --state-dir /tmp/ibkr-codex-preview-app-state-8766 --preview-read-grant
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
.agents/skills/canary-preview/SKILL.md:21
3. Open `http://127.0.0.1:8766/` in a Codex browser panel. Prefer the Codex app
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
Makefile:173
APP_SMOKE_URL ?= http://127.0.0.1:8765
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
pkg/ibkr/testdata/wire/place_order_whatif_v203.hex:1
000000cb084d1219080012044d5346541a0353544b4205534d41525452035553441a8b010801180020002a03425559320132380042034c4d54490000000000987a405a0344415962084455313233343536e2010c707265766965772d74657374f00100f8
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
internal/daemon/flex_transport_test.go:60
const token = "private-token-never-forward"
LOWInventory / provenance · inv.hidden_file · CWE-1104
docs/.nojekyll
.nojekyll
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.suspicious_name · CWE-1104
scripts/check-release-payload-inventory_test.sh
check-release-payload-inventory_test.sh
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scripts/copy-lint.mjs:82
const hash = (rule, s) => createHash("sha1").update(rule + "|" + s.toLowerCase().replace(/\s+/g, " ")).digest("hex").slice(0, 12);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
Makefile:610
@go -C scripts/docgen/docs-html run . -root ../../.. -output-root ../../../dist/pages
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
scripts/check-no-account-data_test.sh:120
ln -s ../../scripts/pre-commit "$repo/.git/hooks/pre-commit"
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
scripts/check-release-source_test.sh:134
"$checker" --mode tag 'v1.2.3/../../unsafe' >/dev/null 2>&1
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/integration/integration_test.go:213
cmd := exec.Command("go", "build", "-ldflags", ldflags, "-o", out, "../../cmd/canary")
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.agents/docs/spa-authority-matrix.md:40
canary app pair --public-url http://127.0.0.1:8765 --json
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
cloudflare/remote-relay/src/worker.js:414
const binary = atob(raw);
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
web/app/auth.js:180
const raw = atob((input + pad).replaceAll("-", "+").replaceAll("_", "/"));
LOWObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
internal/rpc/setups_test.go:26
{"nonascii", func(p *SetupEvaluateParams) { p.Contract.Symbol = "SYNΘ" }},
LOWObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
internal/rpc/setups_test.go:51
for _, bad := range []SetupCoverageParams{{Session: "2026-9-30"}, {Session: "2026-02-30"}, {Session: "latest"}, {Symbol: "AAA,BBB"}, {Symbol: "SYNΘ"}} {
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
cloudflare/remote-relay/package.json
wrangler
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha c94fe4122977full audit observations/trust-audit/mcp-server/osauer__canary.json · Report an issue / request a re-scan
03

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10c94fe4122977BLOCKF58first audit
04

Questions

What is the canary MCP server?

Canary is a local risk desk for your brokerage account: daily brief, portfolio and market evidence, read-only MCP tools, CLI, paired app and a Go client. Runs with Interactive Brokers today; the broker layer is its own package. Gated broker actions need the separate trading build.

Is canary safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (58/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does canary need?

No credential environment variables were found in its source, so it appears to need none.

How current is this page?

The grade is for one exact copy of the source (c94fe4122977), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement