Atlas / MCP servers / thefalconry / talon-agent

talon-agentBLOCK

mcp/thefalconry/talon

๐Ÿฆ… Multi-platform agentic AI harness โ€” runs on Telegram, Discord, Teams & Terminal with a pluggable backend (Claude, Kilo, OpenCode, Codex, OpenAI Agents), full MCP tool access, and persistent background agents (Goals, Heartbeat, Dream).

Verdict
BLOCK
Grade
F
Trust score
35 /100
Exposed tools
162 106r ยท 43w ยท 13d
Transport
stdio ยท streamable-http
License
Apache-2.0
Stars
78
01

Overview

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

[](https://nodejs.org) [](https://bun.sh) [](https://www.typescriptlang.org/) [](#frontends) [](#backends) [](LICENSE) [](https://github.com/thefalconry/talon/actions/workflows/ci.yml)

Multi-platform agentic AI harness. Runs on Telegram, WhatsApp, Discord, Microsoft Teams, the Terminal, and a cross-platform Desktop/Mobile companion app (Flutter), with a pluggable backend (Claude Agent SDK, Kilo, OpenCode, Codex, Antigravity, or OpenAI Agents) and full tool access through MCP.

Features

Read from source at commit 58ab9642d68fOBSERVED ยท 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source โ€” not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add talon-agent --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env CODEX_API_KEY=${CODEX_API_KEY} --env GH_TOKEN=${GH_TOKEN} --env GITHUB_TOKEN=${GITHUB_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "talon-agent": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "CODEX_API_KEY": "${CODEX_API_KEY}",
        "GH_TOKEN": "${GH_TOKEN}",
        "GITHUB_TOKEN": "${GITHUB_TOKEN}"
      }
    }
  }
}
03

Exposed tools (162)

106 read ยท 43 write ยท 13 destructive. Blast radius: 13 tools can delete or overwrite โ€” an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
BashwriteRun a shell command. Uses PowerShell on Windows and
EditwriteReplace text in a file.
GlobreadList files matching a glob pattern (e.g.
GrepreadSearch for a regular expression in files using the system
ReadreadRead a text file from disk. Returns the file contents with
WritewriteWrite a string to a file, creating it (and any missing parent
add_sticker_to_setwriteAdd a new sticker to an existing sticker pack created by the bot.
agent_statusreadFull status of one sub-agent: state, backend/model, timings, inbox depth, children, and its result or error once it has settled.
backupreadSnapshots and checkpoints; restore <id>
backup-dbreadnightly dump
backup_statusreadHealth of the backup subsystem: when the last snapshot ran and when the next one is due, how many snapshots exist locally and how big they are, which remote targets are registered and whether they are ready, and whether recent runs have been failing.
bashwriteRun a shell command. Runs on the daemon host, or ON the active teleport device if one is engaged. On a teleported device,
bundledreadskill with extras
cancel_scheduledreadCancel a scheduled message.
check_inboxreadSub-agents only. Drain anything sent to you โ€” instructions from your parent, and notes from peer agents working alongside you. Each message names its sender. Messages are delivered no other way, so check at milestones: after a phase of work, before a long operation, and before you report.
copy_messagereadRepost a message without the
countedreaduse counting
create_cron_jobwriteCreate a persistent scheduled job. Jobs survive restarts. Cadence โ€” give EXACTLY ONE of: โ€ข schedule: a 5-field cron expression
create_sticker_setwriteCreate a new sticker pack owned by a user. The bot will be the creator. Sticker images must be PNG/WEBP, max 512x512px for static stickers. The set name will automatically get
delete_cron_jobdestructiveDelete a cron job permanently.
delete_goaldestructiveDelete a goal permanently. Prefer update_goal with status=
delete_messagedestructiveDelete a message โ€” or several at once via message_ids (Telegram; ids the bot can
delete_scriptdestructiveDelete a saved script and its file permanently.
delete_skilldestructiveDelete a saved skill and its entire folder (SKILL.md plus any bundled files) permanently.
delete_sticker_from_setdestructiveRemove a specific sticker from a pack by its file_id.
delete_sticker_setdestructivePermanently delete an entire sticker pack created by the bot.
demoreada demo
deploywriteShip it
device_computerreadLook at and operate the desktop of a mesh device that has a screen (today: macOS talon-nodes that list
device_execwriteRun a shell command ON a Talon companion device (e.g. the phone) and return its stdout/stderr/exit code. The device executes it at the highest privilege it has (Android: root if the device grants it, else Shizuku
device_list_dirreadList a directory on a Talon companion device (name, type, size per entry).
device_pull_filereadCopy a file FROM a Talon companion device to the daemon host (workspace). Streams disk-to-disk in a single HTTP request at full throughput (no size cap; chunked fallback for old app builds). Lands in workspace/mesh-pull/ unless a local path is given.
device_push_filewriteCopy a file FROM the daemon host (workspace) TO a Talon companion device. Streams disk-to-disk in a single HTTP request at full throughput (no size cap; chunked fallback for old app builds).
device_read_filereadRead a (text) file off a Talon companion device and return its contents. Small files ride the command channel; big files stream over HTTP automatically. No size cap.
device_write_filewriteWrite text content to a file on a Talon companion device (creates/overwrites).
doctorreadEnvironment and native-module health
download_mediareadDownload a photo, document, or other media from a message by its ID. Saves the file to the workspace and returns the file path so you can read/analyze it. Use this when you see a [photo] or [document] in chat history but don
download_stickerreadDownload a sticker image to workspace so you can view its contents. Returns the file path.
dreamdestructiveForce memory consolidation
echoreadEcho
echo-argsreadechoes its args
echo_pidreadEcho the input plus this process pid
editwriteExact-string replacement in a file. old_string must be unique unless replace_all is set. Runs on the daemon host or the active teleport device.
edit_cron_jobwriteEdit an existing cron job. Only provide the fields you want to change. Setting schedule switches to cron mode; setting every_seconds switches to interval mode. Pass an empty string to start_at/end_at/max_runs/model/provider/instructions to clear it.
edit_messagewriteEdit a previously sent message. For a media message (photo/video/file), pass is_caption=true to edit its caption instead of message text.
effortwriteShow or set thinking effort
emptyreadx
empty-bodyreadx
end_turnreadEnd your current turn and deliver your final reply to the user. This is the canonical way to respond. Call this AT MOST ONCE per turn โ€” it should be the last tool you call. Behaves like send(type=
failsreadalways fails
find_skillsreadSearch saved skills by query and return ranked discovery results. Use this to select the relevant workflow before loading its full body with read_skill.
fmt-testreadformats things
forward_messagereadForward a message. Defaults to within the current chat; from_chat_id / to_chat_id forward across chats the bot is in, and message_ids forwards a batch (albums stay grouped) (Telegram).
get_chat_adminsreadList chat administrators.
get_chat_inforeadGet chat title, type, member count.
get_chat_member_countreadGet total member count.
get_device_historyreadMovement and battery history for a Talon companion device: a timeline of its reported locations over a window (default 24h, max 168h), with distance traveled and battery trend. Answers questions like where a device was earlier or how fast its battery is draining.
get_device_locationreadGet any Talon companion device
get_device_statusreadGet live status straight from a Talon companion device: battery and charging state, platform/OS details, app version, and mesh sharing settings.
get_member_inforeadGet detailed info about a user by ID.
get_message_by_idreadGet a specific message by ID.
get_pinned_messagesreadGet all pinned messages in the current chat.
get_sticker_packreadGet all stickers in a sticker pack by its name. Returns emoji + file_id for each sticker so you can send them. Use when you see a sticker set name in chat history.
get_user_messagesreadGet messages from a specific user.
get_user_profile_photosreadGet a user
githubreadGitHub API access via the official GitHub MCP server
github-reviewreadaddress GitHub pull request review comments
globreadFind files matching a glob pattern (ripgrep-backed). Runs on the daemon host or the active teleport device.
greetreadprints a greeting
helpreadAll commands
hidereadhidden skill
homereadworkspace
keepreadkept skill
kill_agentdestructiveAbort a running agent. It settles as
list_agentsreadList this chat
list_backendsreadList the available backends (providers), which one this chat is currently using, and how much plan headroom each has left. Useful for understanding the model/provider landscape and for seeing where unpinned background work (sub-agents, cron query jobs, the heartbeat) will be routed. Note: a per-job
list_chat_membersreadList chat members with names, IDs, online status, badges.
list_checkpointsreadList recent snapshots โ€” id, kind, label, size, whether pinned, and which remote targets hold a copy. Newest first. Use it to find the id of something you or the schedule took earlier.
list_cron_jobswriteList all cron jobs in the current chat: status, schedule (cron or interval), run count, last-run outcome, next run time, and any bounds (run cap, start/end window, catch-up policy, model).
list_devicesreadList all Talon companion mesh devices with id, platform, online presence, last-seen age, battery state, last-known location, and supported commands.
list_goalsreadList this chat
list_mediareadList recent photos, documents, and other media in the current chat with file paths. Use this to find a previously sent photo or file to re-read or reference.
list_modelsreadList the selectable models on a backend. With no argument, lists the models on THIS chat
list_peersreadSub-agents only. List the other live agents you can message with message_peer โ€” id, label, how they relate to you and what each is working on. Default scope
list_scheduledwriteList pending scheduled messages in this chat (id, seconds until send, text). Scheduled messages persist across restarts.
list_scriptsreadList all saved scripts with language, usage stats, and descriptions. Check here before hand-writing a procedure you may have already saved.
list_skillsreadList saved skills with descriptions. Check here before re-deriving a reusable workflow or process.
lua-scriptreadx
make_companion_pair_linkreadMint a single-use pairing link that connects a Talon companion app (Android, macOS, Windows, Linux) to this daemon
make_node_install_linkwriteMint a single-use install link served by this daemon
mem0readmem0 โ€” long-term memory layer (hosted or self-hosted)
mem0_add_memorywriteStore new information in mem0 long-term memory. Pass conversational text; mem0 extracts and files the durable facts itself.
mem0_delete_memorydestructiveDelete a mem0 memory by id when it is wrong or stale.
mem0_get_memoryreadFetch a single mem0 memory by id, with full content and metadata.
mem0_list_memoriesreadBrowse stored mem0 memories with pagination. Use for inventory/cleanup, not search.
mem0_search_memoryreadSemantic search over mem0 memories. Use short keyword queries, not full sentences.
memoryreadWhat Talon remembers โ€” list, search, why <id>
mempalacereadMemory palace โ€” structured long-term memory with vector search
meshreadPing and list mesh devices
message_parentwriteSub-agents only. Send an interim note to whoever spawned you โ€” a finding worth acting on now, a question, or a heads-up. It wakes them, so use it sparingly. It does not end your run and does not count as your result.
message_peerwriteSub-agents only. Send a note straight to any live agent in your tree โ€” a sibling, your parent agent, a child, or a cousin working for the same chat โ€” by id or label, without routing it through anyone. Use it when you find something that changes another agent
metricsreadAggregate performance metrics
modelreadList models; pick one or switch backend
moderatereadAdminister the chat (requires the bot to be an admin with matching rights; Telegram reports missing rights in the error). Member ops: moderate(op=
node-cwdreadprints cwd
online_countreadGet how many members are currently online or recently active.
onlyreadthe only one
pin_messagereadPin a message.
pingreadhealth check
plan_usagereadRead usage and headroom for EVERY configured backend, not just this chat
playwrightreadBrowser automation via Playwright MCP (${endpoint ?
pluginsreadLoaded plugins and registered MCP servers (registry view)
pulsereadPeriodic check-ins: on, off, or an interval
reactwriteAdd an emoji reaction to a message. By default this also ends your turn (a reaction is usually a complete acknowledgement โ€” no separate end_turn() needed). Pass \
readreadRead a file (with line numbers). Runs on the daemon host or the active teleport device. Supports offset/limit for large files. ${NAMESPACE_DOC}
read_chat_historyreadRead messages from the chat. Use
read_skillreadRead the full SKILL.md body for a saved skill. Load it before following that workflow; descriptions are only discovery hints. If the skill bundles supporting files in its folder, they are listed so you can open them with the Read tool.
recallreadSearch long-term memory for stored claims โ€” full-text, best match first. Use it when you need more than the memory already in this prompt, before asking the user to repeat something. Returns lines prefixed with an id you can pass to remember(replace_id) or forget.
release-checkreadship a release
report_resultreadSub-agents only. Report your result to whoever spawned you. Call this exactly once, when you are done โ€” it is the ONLY channel your result reaches your parent through. Reporting a failure with what you tried is a valid result; silence is not. Calling this outside a sub-agent run is an error.
request_secretreadAsk the operator for a secret (password, API key, token) without it passing through the chat. Mints a single-use link, valid about 15 minutes, to a paste form served by Talon
resetdestructiveClear the session and start fresh
restartwriteRestart the daemon
resumereadList & resume a past session
review-flowreadreview pull requests carefully
review-prreadreview PRs
ring_devicereadMake a Talon companion device ring/vibrate so it can be found (find-my-phone). Optionally include a short message the device may display.
run_cron_jobwriteRun a cron job right now, ignoring its schedule (for testing or an ad-hoc run). The run is recorded like a scheduled one, so a one-shot job will retire after it.
run_preflightwriteRun the pre-flight lane (
run_scriptwriteRun a saved script to completion and get its output (stdout/stderr/exit code). Local execution โ€” fast and free. Pass args to parameterize (they arrive as the script
save_scriptwriteSave (or update) a reusable script โ€” a named program you can run later with run_script. Save a script whenever you
save_skillwriteSave (or update) a reusable skill โ€” a SKILL.md workflow bundle you can load later with read_skill. Follows Anthropic
save_sticker_packwriteAdd a sticker pack to your library (workspace/stickers/). Saved packs appear in your prompt\
searchreadSearch file contents with a regex (ripgrep-backed). Runs on the daemon host or the active teleport device.
search_chat_historyreadSearch messages by keyword, optionally within a date range (
secretreadStore a password via a one-time link, not the chat
send_messagewriteSend a message to the native chat bridge. Supports Markdown formatting. Examples: send_message(text=
send_message_with_buttonswriteSend a message with clickable link buttons. Buttons appear below the message in the native client. Example: send_message_with_buttons(text=
send_to_agentwritePut an instruction in a running agent
set_chat_descriptionwriteChange chat description (admin).
set_chat_titlewriteChange chat title (admin).
set_sticker_set_titlewriteChange the title of a sticker pack created by the bot.
settingsreadThis chat
sleeperreadsleeps forever
statusreadSession info, context usage and stats
stopwriteStop the current response
stop_pollwriteStop an active poll and get the final results. Returns vote counts for each option.
teleportreadSwitch Talon
teleport_backwriteReturn native tools to the daemon host โ€” bash/read/write/edit/glob/search run locally again.
testreadA test command
transformreadv1
trigger_cancelwriteCancel a running trigger (sends SIGTERM, then SIGKILL after 5s grace).
trigger_deletedestructiveDelete a trigger. Cancels it first if running, then removes its script and log from disk.
trigger_listwriteList all triggers in the current chat with their status, runtime, and fire count.
trigger_logswriteRead the tail of a trigger
unpin_messagereadUnpin a message.
update_devicewriteRemotely update a Talon companion (Android): stream a new APK from the daemon to the device and silently reinstall it at an elevated tier (root or Shizuku), keeping app data. The companion
update_goalwriteUpdate a goal: record progress, change status, or edit its fields. Only provide what changes. Record a progress_note whenever you advance a goal โ€” the next heartbeat run reads it to pick up where you left off. Set status=
usagereadPlan limits across every backend
wait_for_agentreadBlock until one agent settles, or until the timeout โ€” whichever comes first. This is a convenience for short waits only: the primary completion channel is the wake-up message the agent
whatsapp_accountreadRead and change the bot
writedestructiveWrite (create/overwrite) a file with the given content. Runs on the daemon host or the active teleport device. Under ~/.talon/ns the writable mounts are home/, skills/, scripts/ (logs/, proc/, plugins/ are read-only).
04

Trust audit

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

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

What the source does

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

Findings (25)

HIGHCode injection ยท code.eval_exec ยท CWE-78, CWE-94, CWE-95
src/core/fetch/rungs.ts:297
const out = await exec(device, parts.join(" "), req.timeoutMs);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection ยท code.eval_exec ยท CWE-78, CWE-94, CWE-95
src/core/plugin/provision.ts:213
const probe = await exec(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection ยท code.eval_exec ยท CWE-78, CWE-94, CWE-95
src/plugins/mempalace/provision.ts:121
const result = await exec(python, ["-c", HEALTH_SNIPPET], {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection ยท code.eval_exec ยท CWE-78, CWE-94, CWE-95
src/plugins/mempalace/provision.ts:420
const created = await exec(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMNetwork egress ยท net.raw_ip ยท CWE-200, CWE-319
Dockerfile:60
CMD bun -e "fetch('http://127.0.0.1:19876/health').then(r=>{process.exit(r.ok?0:1)}).catch(()=>process.exit(1))"
MEDIUMNetwork egress ยท net.raw_ip ยท CWE-200, CWE-319
Dockerfile:67
CMD node -e "fetch('http://127.0.0.1:19876/health').then(r=>{process.exit(r.ok?0:1)}).catch(()=>process.exit(1))"
MEDIUMNetwork egress ยท net.raw_ip ยท CWE-200, CWE-319
apps/companion/lib/src/ui/connect_screen.dart:566
hint: 'https://192.168.1.20:19880 โ€” used whenever it answers'),
MEDIUMObfuscation / stealth ยท obf.base64_blob ยท CWE-506, CWE-94
src/native/blake3-wasm-bytes.ts:7
"AGFzbQEAAAABiQEUYAN/f38Bf2ACf38Bf2ACf38AYAF/AGADf39/AGAFf39/f38Bf2AFf39/f38AYAF/AX9gBn9/f39+fwBgAAF/YAN/f34AYAJ/fgBgBH9/f38AYAAAYAR/f39/AX9gBX9/f35/AGAGf39/f39/AGAHf39/fn9/fwF/YAZ/f39/f38Bf2ACfn8BfwN
MEDIUMObfuscation / stealth ยท obf.base64_blob ยท CWE-506, CWE-94
src/native/htmlents-wasm-bytes.ts:7
"AGFzbQEAAAABKQdgBX9/f39/AGADf39/AGACf38AYAR/f39/AGABfwF/YAJ/fwF/YAAAAwsKAAECAwIEAgUCBgUDAQARBhkDfwFBgIDAAAt/AEGggMAAC38AQaCAwAALB0UGBm1lbW9yeQIABWFsbG9jAAULX19oZWFwX2Jhc2UDAQdkZWFsbG9jAAYLZXNjYXBlX2h
MEDIUMObfuscation / stealth ยท obf.base64_blob ยท CWE-506, CWE-94
src/native/sqlguard-wasm-bytes.ts:7
"AGFzbQEAAAABJQdgAn9/AGABfwF/YAN/f38AYAN/f38Bf2ABfwBgAn9/AX9gAAADCwoAAQIDAAQABQUGBQMBABEGGQN/AUGAgMAAC38AQZCAwAALfwBBiIDAAAsHUQcGbWVtb3J5AgAFYWxsb2MAAQtfX2hlYXBfYmFzZQMBB2RlYWxsb2MABgtlc2NhcGVfbGlrZQA
MEDIUMObfuscation / stealth ยท obf.base64_blob ยท CWE-506, CWE-94
src/native/strsim-wasm-bytes.ts:7
"AGFzbQEAAAABFgRgAX8Bf2ACf38AYAR/f39/AX9gAAADBgUAAQIBAwUDAQARBhkDfwFBgIDAAAt/AEGQoMAAC38AQYygwAALB0UGBm1lbW9yeQIABWFsbG9jAAALX19oZWFwX2Jhc2UDAQdkZWFsbG9jAAELbGV2ZW5zaHRlaW4AAgpfX2RhdGFfZW5kAwIKwwQFogE
MEDIUMObfuscation / stealth ยท obf.base64_blob ยท CWE-506, CWE-94
src/native/textops-wasm-bytes.ts:7
"AGFzbQEAAAABMgdgBH9/f38Bf2ACf38AYAN/f38AYAN/f38Bf2ABfwF/YAV/f39/fwBgBn9/f39/fwF/Aw4NAAEBAgADAAQFBgYBBAQFAXABBQUFAwEAEQYJAX8BQYCAwAALBywEBm1lbW9yeQIADXNwbGl0X21lc3NhZ2UAAAdkZWFsbG9jAAsFYWxsb2MADAkKAQB
MEDIUMObfuscation / stealth ยท obf.zero_width ยท CWE-506, CWE-94
src/core/tools/chat/messaging.ts:543
Valid emoji: ๐Ÿ‘ ๐Ÿ‘Ž โค ๐Ÿ”ฅ ๐Ÿฅฐ ๐Ÿ‘ ๐Ÿ˜ ๐Ÿค” ๐Ÿคฏ ๐Ÿ˜ฑ ๐Ÿคฌ ๐Ÿ˜ข ๐ŸŽ‰ ๐Ÿคฉ ๐Ÿคฎ ๐Ÿ’ฉ ๐Ÿ™ ๐Ÿ‘Œ ๐Ÿ•Š ๐Ÿคก ๐Ÿฅฑ ๐Ÿฅด ๐Ÿ˜ ๐Ÿณ โค๐Ÿ”ฅ ๐ŸŒš ๐ŸŒญ ๐Ÿ’ฏ ๐Ÿคฃ โšก ๐ŸŒ ๐Ÿ† ๐Ÿ’” ๐Ÿคจ ๐Ÿ˜ ๐Ÿ“ ๐Ÿพ ๐Ÿ’‹ ๐Ÿ–• ๐Ÿ˜ˆ ๐Ÿ˜ด ๐Ÿ˜ญ ๐Ÿค“ ๐Ÿ‘ป ๐Ÿ‘จ๐Ÿ’ป ๐Ÿ‘€ ๐ŸŽƒ ๐Ÿ™ˆ ๐Ÿ˜‡ ๐Ÿ˜จ ๐Ÿค โœ ๐Ÿค—  ๐ŸŽ… ๐ŸŽ„ โ˜ƒ ๐Ÿ’… ๐Ÿคช ๐Ÿ—ฟ ๐Ÿ†’ ๐Ÿ’˜ ๐Ÿ™‰ ๐Ÿฆ„ ๐Ÿ˜˜ ๐Ÿ’Š ๐Ÿ™Š ๐Ÿ˜Ž ๐Ÿ‘พ ๐Ÿคท ๐Ÿคทโ™‚ ๐Ÿคทโ™€ ๐Ÿ˜ก`,
MEDIUMObfuscation / stealth ยท obf.zero_width ยท CWE-506, CWE-94
src/frontend/discord/formatting.ts:54
.replace(/@everyone/g, "@everyone")
MEDIUMHard-coded secrets ยท secret.anthropic ยท CWE-798, CWE-321
src/__tests__/inbound-redaction.test.ts:72
["sk-ant-api03-abcdefghijklmnopqrstuvwx", "api-key"],
MEDIUMHard-coded secrets ยท secret.generic ยท CWE-798, CWE-321
src/__tests__/codex-oauth-incompat.test.ts:124
apiKey: "sk-key-A-0123456789abcdef-rest-of-secret-here",
MEDIUMHard-coded secrets ยท secret.generic ยท CWE-798, CWE-321
src/__tests__/codex-oauth-incompat.test.ts:131
apiKey: "sk-key-B-0123456789abcdef-rest-of-secret-here",
MEDIUMHard-coded secrets ยท secret.generic ยท CWE-798, CWE-321
src/__tests__/codex-oauth-incompat.test.ts:143
apiKey: "sk-key-A-0123456789abcdef-rest-of-secret-here",
MEDIUMHard-coded secrets ยท secret.generic ยท CWE-798, CWE-321
src/__tests__/core-swallow-logs.test.ts:30
const secret = "sk-ant-oat01-SECRETSECRET";
MEDIUMHard-coded secrets ยท secret.private_key ยท CWE-798, CWE-321
apps/companion/test/fixtures/bridge-key.pem:1
-----BEGIN PRIVATE KEY-----
MEDIUMHard-coded secrets ยท secret.private_key ยท CWE-798, CWE-321
src/__tests__/inbound-redaction.test.ts:95
"-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXk\nAAAA\n-----END OPENSSH PRIVATE KEY-----";
MEDIUMHard-coded secrets ยท secret.slack ยท CWE-798, CWE-321
src/__tests__/inbound-redaction.test.ts:79
["xoxb-1234567890-abcdefghij", "token"],
MEDIUMFilesystem / path ยท mcp.destructive_tools ยท CWE-22, CWE-59
delete_cron_job, delete_goal, delete_message, delete_script, delete_skill, delete_sticker_from_set, delete_sticker_set, dream, kill_agent, mem0_delete_memory, reset, trigger_delete, write
Why it matters. 13 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance ยท inv.binary ยท CWE-1104
apps/companion/test/fixtures/client.p12
client.p12
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance ยท inv.hidden_file ยท CWE-1104
.dependency-cruiser.cjs
.dependency-cruiser.cjs
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose

Gates applied: no_behavioural_pass.

Audited 2026-10-11 ยท audit v0.4.1 ยท source sha 58ab9642d68ffull audit observations/trust-audit/mcp-server/thefalconry__talon.json ยท Report an issue / request a re-scan
05

Audit history

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

DateSourceVerdictGradeScoreChange
2026-10-1158ab9642d68fBLOCKF35first audit
06

Questions

What is the talon-agent MCP server?

๐Ÿฆ… Multi-platform agentic AI harness โ€” runs on Telegram, Discord, Teams & Terminal with a pluggable backend (Claude, Kilo, OpenCode, Codex, OpenAI Agents), full MCP tool access, and persistent background agents (Goals, Heartbeat, Dream).

What tools does talon-agent expose?

162 in total: 106 read-only, 43 that write, and 13 that can delete or overwrite (delete_cron_job, delete_goal, delete_message, delete_script, delete_skill). Every one is listed on this page with its risk.

Is talon-agent safe to connect to an agent?

No โ€” not without reading the findings first. The audit graded it F (35/100) and found 4 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 13 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does talon-agent need?

It reads ANTHROPIC_API_KEY, CODEX_API_KEY, GH_TOKEN, GITHUB_TOKEN, MEM0_API_KEY, OPENAI_API_KEY, TALON_AGENTS_KEY, TALON_AGY_TOKEN_FILE, TALON_CODEX_KEY, TALON_GATEWAY_TOKEN, TALON_LUA_TEST_SECRET and TALON_TEST_BOT_TOKEN from the environment. Give it a token scoped to the least it needs โ€” an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does talon-agent run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as talon-agent at 5.37.1.

How current is this page?

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

Advertisement