github TypeScript re-analysis due

flurryport/cli

github

Webhook capture, inspection, and replay for you and your AI agent, plus signed multi-agent rooms. MCP server included: npx -y flurryport mcp gets a capture URL in one tool call, no signup. Replay real payloads into your app deterministically, signatures intact. No tunnels. Read-only mirror of the FlurryPORT CLI; on npm as flurryport.

maintainer
flurryport
license
MIT
first seen
2026-09-01
last seen
2026-09-03
releases · 30d
1
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 54 tools
transport stdio · streamable-http · http counts 54 tools · 0 res · 0 prompts permission surface via code analysis

tools

  • add_to_collection
  • attach_standing
  • authorize_standing
  • bind_transformation
  • capture_count
  • create_collection
  • create_endpoint
  • create_invite
  • create_replay_target
  • create_transformation
  • forward_to_localhost
  • get_canon
  • get_capture
  • get_capture_digest
  • get_capture_url
  • get_recipe
  • get_replay_target
  • get_roster
  • get_server_info
  • get_upgrade_options
  • join_invite
  • lint_recipe
  • list_captures
  • list_members
  • list_sections
  • list_watches
  • mint_seat
  • ping
  • post_intent
  • read_pipe_manifest
  • record_recipe_install
  • redeem_seat_code
  • register_watch
  • remove_from_collection
  • replace_collection_item
  • replay_to_target
  • request_seat
  • request_secret_setup
  • request_standing_credential
  • revoke_invite
  • revoke_member
  • search_recipes
  • send_test_event
  • set_endpoint_signing
  • set_orientation
  • set_target_headers
  • set_watch_enabled
  • start_echo_server
  • update_replay_target
  • update_transformation
  • verify_chain
  • wait_for_captures
  • wait_for_posts
  • write_pipe_manifest
code evidence vHEAD · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 123

filesystem 35

  • fs (weak) flurryport-cli-3673b50/nvim/tests/run.mjs :13 import { readdirSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/scripts/build-mcpb.mjs :17 import { cpSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
  • fs flurryport-cli-3673b50/src/commands/console.ts :2 import { readFileSync } from 'node:fs';
  • fs flurryport-cli-3673b50/src/commands/mcp.ts :3 import { readFileSync } from 'node:fs';
  • fs flurryport-cli-3673b50/src/commands/post.ts :2 import { readFileSync } from 'node:fs';
  • fs flurryport-cli-3673b50/src/commands/seat-server.ts :3 import { readFileSync } from 'node:fs';
  • fs flurryport-cli-3673b50/src/index.ts :3 import { readFileSync } from 'node:fs';
  • fs flurryport-cli-3673b50/src/lib/pipe-manifest.ts :1 import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
  • fs flurryport-cli-3673b50/src/lib/store.ts :2 import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
  • fs flurryport-cli-3673b50/src/lib/version-nudge.ts :1 import { readFileSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/ansi-sanitize.test.mjs :10 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/collection-edits.test.mjs :9 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/console-comfort.test.mjs :8 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/console.test.mjs :12 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/description-casing.test.mjs :11 import { readFileSync, readdirSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/device-login.test.mjs :9 import { mkdtempSync, readFileSync, existsSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/hosted-rooms.test.mjs :11 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/lifecycle.test.mjs :18 import { mkdtempSync, mkdirSync, writeFileSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/mcp-pacing.test.mjs :10 import { mkdtempSync, mkdirSync, writeFileSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/mint-seat.test.mjs :8 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/pilot1-hardening.test.mjs :250 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/post-intent-and-search.test.mjs :12 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/recipe-version-pins.test.mjs :11 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/record-control.test.mjs :7 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/room-canon.test.mjs :9 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/seat-server.test.mjs :17 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/session-isolation.test.mjs :13 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/set-orientation.test.mjs :12 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/slice3-validation.test.mjs :13 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/slice4-mcp-surface.test.mjs :12 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/slice6-request-seat.test.mjs :13 import { mkdtempSync, mkdirSync, writeFileSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/standing-attach.test.mjs :13 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/store.test.mjs :8 import { chmodSync, existsSync, mkdirSync, mkdtempSync, readdirSync, statSync, writeFileSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/transport-guard.test.mjs :10 import { mkdtempSync } from 'node:fs';
  • fs (weak) flurryport-cli-3673b50/tests/write-plane-libs.test.mjs :3 import { mkdtempSync, readFileSync, existsSync } from 'node:fs';

shell / exec 13

  • shell (weak) flurryport-cli-3673b50/nvim/tests/run.mjs :12 import { spawnSync } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/scripts/build-mcpb.mjs :18 import { execSync } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/tests/collection-edits.test.mjs :8 import { spawn } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/tests/device-login.test.mjs :8 import { spawn } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/tests/lifecycle.test.mjs :17 import { spawn } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/tests/mcp-pacing.test.mjs :7 import { spawn } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/tests/pilot1-hardening.test.mjs :249 import { spawn } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/tests/post-intent-and-search.test.mjs :11 import { spawn } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/tests/room-canon.test.mjs :8 import { spawn } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/tests/seat-server.test.mjs :16 import { spawn } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/tests/set-orientation.test.mjs :11 import { spawn } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/tests/slice3-validation.test.mjs :12 import { spawn } from 'node:child_process';
  • shell (weak) flurryport-cli-3673b50/tests/slice6-request-seat.test.mjs :12 import { spawn } from 'node:child_process';

network 34

  • net flurryport-cli-3673b50/src/commands/echo.ts :2 import http from 'node:http';
  • net flurryport-cli-3673b50/src/commands/listen.ts :51 // the fetch (i.e. ?targetId=<b62> was passed). Non-empty means one or more
  • net flurryport-cli-3673b50/src/lib/anon-api.ts :254 const res = await fetch(url, { method: 'POST', headers: jsonHeaders });
  • net flurryport-cli-3673b50/src/lib/api.ts :61 const res = await fetch(`${baseUrl}${path}`, { headers: baseHeaders });
  • net flurryport-cli-3673b50/src/lib/auth-api.ts :127 return handle(await fetch(`${baseUrl}${path}`, { headers, signal: getOpts?.signal }));
  • net flurryport-cli-3673b50/src/lib/catalog-api.ts :109 const res = await fetch(url, { headers: { Accept: 'application/json' } });
  • net flurryport-cli-3673b50/src/lib/echo-server.ts :1 import { createServer, type Server } from 'node:http';
  • net flurryport-cli-3673b50/src/lib/fetch-error.ts :2 * Node's fetch() throws an opaque `TypeError: fetch failed` when the underlying
  • net flurryport-cli-3673b50/src/lib/intent-post.ts :123 const res = await fetch(`${opts.baseUrl}/api/v1/capture/${opts.projectId}/${opts.endpointSlug}`, {
  • net flurryport-cli-3673b50/src/lib/invite-api.ts :90 const res = await fetch(`${base}/api/v1/invites/${inviteToken}/device/start`, {
  • net flurryport-cli-3673b50/src/lib/local-forward.ts :117 const res = await fetch(target, {
  • net flurryport-cli-3673b50/src/lib/local-target.ts :2 import { isIP } from 'node:net';
  • net flurryport-cli-3673b50/src/lib/mcp-http.ts :1 import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';
  • net flurryport-cli-3673b50/src/lib/mcp-server-info.ts :52 const res = await fetch(`${apiBaseUrl}/api/v1/billing/plans`, {
  • net flurryport-cli-3673b50/src/lib/mcp-test-events.ts :97 const res = await fetch(opts.captureUrl, { method: 'POST', headers, body });
  • net flurryport-cli-3673b50/src/lib/plans-api.ts :121 const res = await fetch(url, { headers: { Accept: 'application/json' } });
  • net flurryport-cli-3673b50/src/lib/seat-ceremony.ts :98 const res = await fetch(`${apiBase}/api/v1/invites/seats/redeem`, {
  • net (weak) flurryport-cli-3673b50/tests/ansi-sanitize.test.mjs :9 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/collection-edits.test.mjs :7 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/device-login.test.mjs :7 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/hosted-rooms.test.mjs :190 const res = await fetch(url, {
  • net (weak) flurryport-cli-3673b50/tests/lifecycle.test.mjs :16 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/mcp-pacing.test.mjs :8 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/pilot1-hardening.test.mjs :17 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/post-intent-and-search.test.mjs :10 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/recipe-version-pins.test.mjs :10 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/room-canon.test.mjs :7 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/seat-server.test.mjs :14 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/set-orientation.test.mjs :10 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/slice3-validation.test.mjs :11 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/slice4-mcp-surface.test.mjs :10 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/slice6-request-seat.test.mjs :11 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/standing-attach.test.mjs :12 import { createServer } from 'node:http';
  • net (weak) flurryport-cli-3673b50/tests/transport-guard.test.mjs :13 import { request } from 'node:http';

secrets 1

  • secrets flurryport-cli-3673b50/src/commands/mcp.ts :460 const envToken = process.env.FLURRYPORT_TOKEN;

tool registrations 68

  • get_capture_url flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :634
  • start_echo_server flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :685
  • get_capture_digest flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :750
  • register_watch flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :795
  • list_watches flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :844
  • set_watch_enabled flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :882
  • list_captures flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :908
  • wait_for_captures flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :967
  • get_capture flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :1018
  • create_collection flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :1149
  • add_to_collection flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :1214
  • remove_from_collection flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :1283
  • replace_collection_item flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :1346
  • get_replay_target flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :1410
  • capture_count flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :1446
  • send_test_event flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :1527
  • forward_to_localhost flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :1647
  • replay_to_target flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :1773
  • create_endpoint flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :2174
  • create_transformation flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :2220
  • update_transformation flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :2273
  • bind_transformation flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :2325
  • request_secret_setup flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :2444
  • create_invite flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :2602
  • mint_seat flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :2692
  • authorize_standing flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :2844
  • list_members flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :2892
  • revoke_invite flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :2940
  • revoke_member flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :2974
  • create_replay_target flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :3009
  • update_replay_target flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :3076
  • set_target_headers flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :3136
  • set_endpoint_signing flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :3211
  • record_recipe_install flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :3297
  • set_orientation flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :3382
  • list_sections flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :3489
  • get_canon flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :3527
  • post_intent flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :3567
  • request_seat flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :3797
  • read_pipe_manifest flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :3973
  • write_pipe_manifest flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :4001
  • get_upgrade_options flurryport-cli-3673b50/src/lib/mcp-auth-tools.ts :4078
  • search_recipes flurryport-cli-3673b50/src/lib/mcp-catalog-tools.ts :53
  • get_recipe flurryport-cli-3673b50/src/lib/mcp-catalog-tools.ts :103
  • lint_recipe flurryport-cli-3673b50/src/lib/mcp-catalog-tools.ts :212
  • verify_chain flurryport-cli-3673b50/src/lib/mcp-catalog-tools.ts :263
  • join_invite flurryport-cli-3673b50/src/lib/mcp-invite-tools.ts :149
  • wait_for_posts flurryport-cli-3673b50/src/lib/mcp-seat-tools.ts :785
  • ping flurryport-cli-3673b50/src/lib/mcp-seat-tools.ts :899
  • get_roster flurryport-cli-3673b50/src/lib/mcp-seat-tools.ts :935
  • redeem_seat_code flurryport-cli-3673b50/src/lib/mcp-seat-tools.ts :1025
  • attach_standing flurryport-cli-3673b50/src/lib/mcp-seat-tools.ts :1153
  • request_standing_credential flurryport-cli-3673b50/src/lib/mcp-seat-tools.ts :1278
  • get_server_info flurryport-cli-3673b50/src/lib/mcp-server-info.ts :29
  • get_capture_url flurryport-cli-3673b50/src/lib/mcp-tools.ts :120
  • list_captures flurryport-cli-3673b50/src/lib/mcp-tools.ts :177
  • get_capture_digest flurryport-cli-3673b50/src/lib/mcp-tools.ts :230
  • register_watch flurryport-cli-3673b50/src/lib/mcp-tools.ts :271
  • list_watches flurryport-cli-3673b50/src/lib/mcp-tools.ts :317
  • read_pipe_manifest flurryport-cli-3673b50/src/lib/mcp-tools.ts :354
  • get_capture flurryport-cli-3673b50/src/lib/mcp-tools.ts :383
  • forward_to_localhost flurryport-cli-3673b50/src/lib/mcp-tools.ts :436
  • capture_count flurryport-cli-3673b50/src/lib/mcp-tools.ts :545
  • send_test_event flurryport-cli-3673b50/src/lib/mcp-tools.ts :588
  • start_echo_server flurryport-cli-3673b50/src/lib/mcp-tools.ts :698
  • get_upgrade_options flurryport-cli-3673b50/src/lib/mcp-tools.ts :731
  • request_secret_setup flurryport-cli-3673b50/src/lib/mcp-tools.ts :778
  • create_invite flurryport-cli-3673b50/src/lib/mcp-tools.ts :846

install hooks 1

  • prepublishOnly flurryport-cli-3673b50/package.json :16 npm run build && node --test tests/mcp-pacing.test.mjs tests/write-plane-libs.test.mjs tests/post-intent-and-search.test.mjs tests/credential-router.test.mjs tests/pilot1-hardening.test.mjs tests/seat

declared dependencies 6

  • @modelcontextprotocol/sdk@^1.29.0
  • chalk@^5.4.1
  • commander@^13.1.0
  • zod@^4.4.3
  • @types/node@^22.13.0
  • typescript@~5.6.2

perm:untrusted 1

  • untrusted (weak) flurryport-cli-3673b50/tests/seat-server.test.mjs :402 const who = await (await fetch(`${base}/whoami`)).json();