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.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
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
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();