Skip to main content
Glama
nuwainfo

ffl-mcp

Official
by nuwainfo

ffl-mcp (local-only)

MCP server for ffl. Let AI share anything for you.

Backed by ffl, which turns any file/folder into an HTTPS link.

This is a minimal MCP server that shells out to ffl / ffl.com locally. No file contents are sent to the LLM; the model only triggers local ffl.

This demo shows collaborative debugging: Claude on the left shares a local environment (DB + logs) via P2P link, Claude on the right downloads and diagnoses the error. In this scenario, the two Claudes represent different people working on separate machines.

ffl-mcp-demo


Table of Contents


Related MCP server: kintone MCP Server

Installation

Short URLs for convenience

  • Linux/macOS: curl -fsSL https://fastfilelink.com/mcp/install.sh | bash

  • Windows (script): iwr -useb https://fastfilelink.com/mcp/install.ps1 | iex

🔒 fastfilelink.com/mcp/* is a redirect to GitHub. Use the direct GitHub URLs below if you prefer.

Windows — GUI Installer

Download and run ffl-mcp-setup.exe from the latest release.

No command line needed — the installer registers ffl-mcp with Claude Desktop and Claude Code automatically.

Linux / macOS — one-liner

curl -fsSL https://raw.githubusercontent.com/nuwainfo/ffl-mcp/refs/heads/main/install.sh | bash

Downloads the platform binary from the latest GitHub release and runs ffl-mcp install to register with Claude. Falls back to uvx automatically if no binary is available for your platform.

Windows — one-liner (PowerShell)

iwr -useb https://raw.githubusercontent.com/nuwainfo/ffl-mcp/refs/heads/main/install.ps1 | iex

Downloads ffl-mcp.exe from the latest GitHub release and registers it with Claude.

uvx (no binary, requires uv)

uvx --from git+https://github.com/nuwainfo/ffl-mcp install

Targets can be controlled with --target (default: all):

uvx --from git+https://github.com/nuwainfo/ffl-mcp install --target claude-desktop,codex-desktop,codex-cli
uvx --from git+https://github.com/nuwainfo/ffl-mcp install --print

If Claude Code CLI is installed, the installer also runs claude mcp add automatically (user scope). The installer also writes Codex MCP config to ~/.codex/config.toml for Codex Desktop/CLI/IDE. If Codex CLI is installed, the installer also runs codex mcp add automatically. For custom config paths, pass the file:

uvx --from git+https://github.com/nuwainfo/ffl-mcp install --config /path/to/claude_desktop_config.json
uvx --from git+https://github.com/nuwainfo/ffl-mcp install --codex-config /path/to/codex/config.toml

Run directly (development)

Prereq: uv installed.

# optional: override embedded ffl.com (APE) or use "ffl" on PATH
export FFL_BIN="$HOME/bin/ffl.com"
chmod +x "$FFL_BIN"

# optional safety: restrict file sharing to a directory
export ALLOWED_BASE_DIR="$HOME/Downloads"

# optional: use stdin for text/base64 instead of temp files
export FFL_USE_STDIN=1

uvx --from git+https://github.com/nuwainfo/ffl-mcp ffl-mcp

MCP Config (manual JSON)

{
  "mcpServers": {
    "ffl": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/nuwainfo/ffl-mcp", "ffl-mcp"],
      "env": {
        "ALLOWED_BASE_DIR": "/Users/you/Downloads",
        "FFL_USE_STDIN": "1"
      }
    }
  }
}

Tools

Sharing

Tool

Input

fflShareText(text, name?, ...)

Plain text

fflShareBase64(dataB64, name?, ...)

Binary data (base64-encoded)

fflShareFile(path, name?, ...)

Single local file or folder

fflShareFiles(paths, name?, ...)

Multiple files (ffl auto-zips them into one download)

Common options for all share tools:

Option

Default

Description

e2ee

False

End-to-end encryption

qrInTerminal

False

Return ASCII QR art (qrCode in response)

authUser / authPassword

HTTP Basic Auth to protect the link

maxDownloads

1

Stop serving after N downloads (P2P only)

timeoutSeconds

1800

Inactivity timeout in seconds (P2P only)

recipientAuth

pickup (6-digit code), pubkey (RSA), pubkey+pickup, or email (OTP)

pickupCode

auto

Specific pickup code for pickup mode

recipientPublicKey

Path to .fflpub file for pubkey mode

recipientEmail

Email(s) for email OTP mode, comma-separated

alias

Custom link alias e.g. my-release (requires Standard+ account)

receipt

Email notification when recipient downloads

receiptConfirm

Require recipient confirmation before download; pass a message or ""

forceRelay

False

Disable WebRTC, route all traffic through tunnel

port

Local HTTP server port (auto-detect by default). Useful with fixed tunnels.

invite

False

Open the ffl invite page in a local browser with the generated sharing link.

enableReporting

False

Enable ffl diagnostic error reporting. Disabled by default.

upload

Upload to FFL server instead of P2P — e.g. "1 day", "6 hours" (requires Standard+ account)

resumeUpload

False

Resume an interrupted upload

proxy

Proxy URL e.g. socks5://127.0.0.1:9050

Additional options for fflShareFile / fflShareFiles:

Option

Default

Description

preview

False

Enable preview sidecar routes for folder or multi-file shares. Returned links stay clean; add ?preview=true manually when you want the browser preview view.

exclude

Glob or regex patterns to exclude, comma-separated — e.g. *.pyc,__pycache__ or re:\.env$

pause

Pause server upload at a percentage from 1 to 99. Requires upload.

vfs

False

Expose as VFS server (vfs:// URI) — fflShareFile only

preferredTunnel

Set preferred tunnel for this and future runs — cloudflare, ngrok, bore, etc.

Preview sidecar routes (/manifest, /file, /thumb) are only created for folder shares and multi-file shares. Single-file shares are served as direct file links, even when preview=True. MCP returns the base FastFileLink URL and does not append ?preview=true; users may add that query string manually.

Response fields: sessionId, link, pid, qrCode? (ASCII art when qrInTerminal=True), debugLogPath?

Downloading

fflDownload(url, outputPath?, resume?, authUser?, authPassword?,
            recipientAuth?, pickupCode?, recipientPrivateKey?, proxy?,
            enableReporting?)
  -> {ok, returncode, outputPath?, transferMode?, transferInfo?, message?, ...}

Downloads from FastFileLink URLs (WebRTC P2P when possible, HTTP fallback) or any HTTP(S) URL (works like wget).

transferMode

Meaning

webrtc_p2p

Direct peer-to-peer (fastest)

http_fallback

HTTP relay when WebRTC fails

http_direct

Regular HTTP download (non-FastFileLink URL)

For authenticated links: pass recipientAuth + pickupCode (pickup mode) or recipientPrivateKey (pubkey mode). Set enableReporting=True only when you want to opt into ffl diagnostic error reporting for troubleshooting.

Keygen

fflKeygen(name?) -> {ok, returncode, output}

Generates an RSA keypair for passwordless pubkey recipient auth:

  • <name>.fflpub — share with the sender (pass as recipientPublicKey)

  • <name>.fflkey — keep private (pass as recipientPrivateKey when downloading)

Session Management

  • fflListSessions() — list active share sessions

  • fflStopSession(sessionId) — terminate a session

  • fflGetSession(sessionId) — get session details

  • fflGetSessionEvents(sessionId, limit=50) — retrieve webhook events


Notes

  • FFL_USE_STDIN=1 avoids writing text/base64 payloads to disk.

  • FFL_RUN_MODE=python runs the Core.py CLI (requires FFL_CORE_PATH).

  • FFL_USE_HOOK=1 starts a local webhook server and passes it to ffl for real-time link/progress events.

  • FFL_DEBUG=1 saves ffl output to a temp log file; path returned as debugLogPath. Set FFL_DEBUG=/path/to/log.txt to use a fixed path.

  • ALLOWED_BASE_DIR restricts fflShareFile/fflShareFiles to a specific directory.


Testing

# Unit + binary tests (no network needed)
python -m unittest discover -s tests -p "*Test.py" -v

# All tests including share/download round-trips (requires network)
FFL_INTEGRATION_TESTS=1 python -m unittest discover -s tests -p "*Test.py" -v

WSL2 Users

If you encounter TLSError([0x6300]) errors, run this command to disable Windows interop for .com files:

sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop'

This allows ffl.com (APE binary) to run natively on Linux instead of being executed through Windows.

Available Tools

10 tools
fflDownloadA

Download a file from a FastFileLink URL or regular HTTP(S) URL using ffl.

For FastFileLink URLs, this uses WebRTC P2P when possible for faster downloads. For regular URLs, it works like wget.

Args: url: FastFileLink URL or regular HTTP(S) URL to download from outputPath: Optional output file or directory path (default: use filename from server) resume: Resume incomplete download (default: False) authUser: Username for HTTP Basic Authentication authPassword: Password for HTTP Basic Authentication proxy: Proxy server URL (e.g. socks5://127.0.0.1:9050) recipientAuth: Recipient authentication mode required by sender — pickup, pubkey, or email pickupCode: 6-digit pickup code (when recipientAuth is pickup) recipientPrivateKey: Path to .fflkey private key file for pubkey auth

Returns: Dictionary with download status and output file path

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
outputPathNo
resumeNo
authUserNo
authPasswordNo
proxyNo
recipientAuthNo
pickupCodeNo
recipientPrivateKeyNo
enableReportingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses WebRTC P2P usage, resume capability, authentication modes, and proxy support. However, it does not mention potential file overwriting or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with headings and an Args section. It is front-loaded with the core purpose. Minor verbosity in parameter listing is justified by complexity, but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 10 parameters, no annotations, and an output schema, the description covers return value, authentication scenarios, and network protocol choice. Missing enableReporting and error handling details prevent a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It explains 9 of 10 parameters (missing enableReporting) with meaningful context beyond schema types, such as 'Resume incomplete download' and 'Recipient authentication mode required by sender.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it downloads a file from a FastFileLink or HTTP(S) URL, distinguishing between the two modes. The verb 'download' and resource 'file' are specific, and it differentiates from sibling tools like fflShareFile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use FastFileLink vs regular URLs but does not explicitly state when not to use this tool or mention alternatives like fflShareFile for uploading. Context is clear but lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fflGetSessionC

Get details for a running session.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided. The description only mentions that the session is 'running', suggesting a constraint, but does not disclose behavior for invalid or non-running sessions, or side effects. Minimal behavioral context beyond the basic purpose.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with no filler. Extremely concise and efficient, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a simple one-parameter tool with an output schema, the description is minimally adequate. However, it lacks usage guidance and behavioral transparency, which are needed given the number of sibling tools. Could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter sessionId has no schema description (0% coverage) and the tool description adds no explanation of its format or source. The parameter name is self-explanatory but the description does not compensate for the missing schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool gets details for a running session, distinguishing from sibling tools like fflListSessions or fflStopSession. It could be more specific about what details are returned, but the presence of an output schema mitigates this.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like fflListSessions or fflGetSessionEvents. The description implies it's for individual session details, but does not explicitly differentiate or provide context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fflGetSessionEventsC

Get recent hook events for a running session.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYes
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, and the description merely implies a read-only operation without disclosing side effects, authorization requirements, rate limits, or other behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no wasted words, but it is slightly underspecified for a tool with multiple parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (not shown), the description omits parameter details and usage context, making it insufficient for an agent to use the tool correctly without additional information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds no information about parameters like sessionId or limit, failing to clarify their meaning or expected values beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get recent hook events for a running session,' specifying the verb (Get), resource (hook events), and context (running session), which distinguishes it from siblings like fflGetSession or fflListSessions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives; the description does not mention prerequisites or scenarios, leaving the agent without explicit usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fflKeygenA

Generate an RSA keypair for passwordless pubkey authentication.

Produces two files:

  • .fflpub — public key (share with the sender)

  • .fflkey — private key (keep secret; used during download)

The sender then shares with: fflShareFile(..., recipientAuth='pubkey', recipientPublicKey='alice.fflpub') The recipient downloads with: fflDownload(..., recipientAuth='pubkey', recipientPrivateKey='alice.fflkey')

Args: name: Base name for the generated key files (default: ffl assigns a name)

Returns: Dictionary with returncode and output describing the generated key paths

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It fully discloses that it generates two files, the naming convention, the public/private key roles, and the output format (returncode and output). This is comprehensive for a simple file-generation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary, file output details, usage examples, and parameter/return documentation. It is concise (no wasted words) and front-loads the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and a clear output, the description covers all necessary information: what it does, how to use it, what files are created, and how they integrate with sibling tools. The agent can correctly select and invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'name' is explained as the base name for generated files, with a default behavior (ffl assigns a name). This adds meaning beyond the bare schema, which only specifies type and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it generates an RSA keypair for passwordless pubkey authentication, specifies the output files (.fflpub and .fflkey), and explains how the keys are used with sibling tools (fflShareFile, fflDownload), distinguishing its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit examples of when to use the tool (generating keys for passwordless auth) and shows how the output keys are used with other tools, though it doesn't explicitly state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fflListSessionsA

List active ffl share sessions started by this MCP server.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility for behavioral disclosure. It only states the basic action and omits critical details such as idempotency, potential side effects, or authentication requirements. A simple list tool may be safe, but this is not confirmed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. It efficiently communicates the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and an output schema, the description provides the essential function. However, it lacks details about possible empty results, pagination, or side effects. For a simple tool, it is minimally adequate but not rich.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema coverage is 100%. The description adds nothing about parameters, which is acceptable since there are none to describe. Baseline score of 4 is appropriate for no parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('list'), the resource ('active ffl share sessions'), and the scope ('started by this MCP server'). It effectively distinguishes from sibling tools like fflGetSession (single session) and fflGetSessionEvents (events).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to view active sessions started by this server, but it does not explicitly state when to use it over alternatives (e.g., fflGetSession) or provide any exclusions or prerequisites. Usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fflShareBase64A

Share arbitrary binary data (base64-encoded) using ffl. Returns a sessionId and link. If qrInTerminal is True, also returns a QR code as ASCII art for terminal display.

IMPORTANT: Always present the returned link so the user can click it to open in a browser. Do not display it as a plain unformatted URL — in some interfaces (such as Claude Dispatch) plain URLs are not auto-linked and will not be clickable.

Args: dataB64: Base64-encoded binary data to share name: Download filename shown to recipient (default: data.bin) e2ee: Enable end-to-end encryption (default: False) authUser: HTTP Basic Auth username to protect the link authPassword: HTTP Basic Auth password to protect the link maxDownloads: Stop serving after N downloads (default: 1) timeoutSeconds: Stop serving after N seconds of inactivity (default: 1800) waitLinkSeconds: Seconds to wait for link generation hookUrl: Custom webhook URL for events proxy: Proxy server URL (e.g. socks5://127.0.0.1:9050) qrInTerminal: Return ASCII QR code art for terminal display recipientAuth: Recipient authentication mode — pickup (6-digit code), pubkey (RSA challenge), pubkey+pickup (both), email (OTP) pickupCode: Specific pickup code to use (default: auto-generated) recipientPublicKey: Path to recipient .fflpub public key file for pubkey auth recipientEmail: Recipient email(s) for OTP auth, comma-separated alias: Custom link alias instead of random UID (requires Standard+ account) receipt: Send email notification when recipient downloads (pass email address, or empty string for account email) receiptConfirm: Require recipient to confirm before download starts; pass confirmation message or empty string for default forceRelay: Disable direct WebRTC; route all traffic through tunnel port: Local HTTP server port (default: auto-detect) invite: Open invite page in browser with the sharing link enableReporting: Enable ffl error reporting for diagnostics (disabled by default)

ParametersJSON Schema
NameRequiredDescriptionDefault
dataB64Yes
nameNodata.bin
e2eeNo
authUserNo
authPasswordNo
maxDownloadsNo
timeoutSecondsNo
waitLinkSecondsNo
hookUrlNo
proxyNo
qrInTerminalNo
recipientAuthNo
pickupCodeNo
recipientPublicKeyNo
recipientEmailNo
aliasNo
receiptNo
receiptConfirmNo
forceRelayNo
portNo
inviteNo
enableReportingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It explains that the tool returns a sessionId and link, and that qrInTerminal yields a QR code. However, it lacks details on error handling, security implications, or behavior under failure conditions. The extensive parameter list describes configuration but not overall behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but well-structured. The critical usage note is front-loaded. The Args section is systematic, though slightly verbose. Every sentence adds value, but it could be more concise by grouping related parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the complexity (22 parameters, no output schema description needed as output schema exists), the description covers all parameters and basic outputs. However, it omits context about the ffl system dependencies, authentication prerequisites, or error scenarios, which would aid completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It provides a detailed Args list for all 22 parameters, explaining each parameter's role (e.g., 'authUser: HTTP Basic Auth username to protect the link'). This fully adds meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Share arbitrary binary data (base64-encoded) using ffl.' It specifies the verb (share), resource (binary data via base64), and output (sessionId and link). This distinguishes it from sibling tools like fflShareFile, fflShareText, etc., which handle file or text sharing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes an important usage note about presenting the link as clickable, but it does not explicitly state when to use this tool vs alternatives (e.g., fflShareFile for files). Usage context is implied but no exclusions or prerequisites are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fflShareFileA

Share a local file or folder using ffl. Respects ALLOWED_BASE_DIR when configured. If qrInTerminal is True, also returns a QR code as ASCII art for terminal display.

IMPORTANT: Always present the returned link so the user can click it to open in a browser. Do not display it as a plain unformatted URL — in some interfaces (such as Claude Dispatch) plain URLs are not auto-linked and will not be clickable.

Args: path: Path to file or folder to share name: Custom download filename shown to recipient e2ee: Enable end-to-end encryption (default: False) preview: Open recipient's browser directly in preview mode — ideal for folders or multiple files so the recipient sees a file list before downloading (default: False) authUser: HTTP Basic Auth username to protect the link authPassword: HTTP Basic Auth password to protect the link maxDownloads: Stop serving after N downloads, P2P only (default: 1) timeoutSeconds: Stop serving after N seconds of inactivity, P2P only (default: 1800) waitLinkSeconds: Seconds to wait for link generation hookUrl: Custom webhook URL for events proxy: Proxy server URL (e.g. socks5://127.0.0.1:9050) qrInTerminal: Return ASCII QR code art for terminal display exclude: Exclude files matching glob or regex patterns, comma-separated (e.g. '*.log' or 're:.tmp$') recipientAuth: Recipient authentication mode — pickup (6-digit code), pubkey (RSA challenge), pubkey+pickup (both), email (OTP) pickupCode: Specific pickup code to use (default: auto-generated) recipientPublicKey: Path to recipient .fflpub public key file for pubkey auth recipientEmail: Recipient email(s) for OTP auth, comma-separated alias: Custom link alias instead of random UID (requires Standard+ account) receipt: Send email notification when recipient downloads (pass email address, or empty string for account email) receiptConfirm: Require recipient to confirm before download starts; pass confirmation message or empty string for default forceRelay: Disable direct WebRTC; route all traffic through tunnel upload: Upload to FFL server for async sharing — recipient doesn't need sender online. Pass duration e.g. '1 day', '6 hours', '1 week' (requires Standard+ account) resumeUpload: Resume an interrupted upload (default: False) vfs: Expose as VFS server (vfs:// URI) instead of regular download preferredTunnel: Set preferred tunnel for this and future runs — cloudflare, ngrok, bore, etc.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
nameNo
e2eeNo
authUserNo
authPasswordNo
maxDownloadsNo
timeoutSecondsNo
waitLinkSecondsNo
hookUrlNo
proxyNo
qrInTerminalNo
previewNo
excludeNo
recipientAuthNo
pickupCodeNo
recipientPublicKeyNo
recipientEmailNo
aliasNo
receiptNo
receiptConfirmNo
forceRelayNo
uploadNo
resumeUploadNo
vfsNo
preferredTunnelNo
portNo
inviteNo
pauseNo
enableReportingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that it shares via ffl, respects ALLOWED_BASE_DIR, and can return a QR code. The IMPORTANT note about presenting the link is helpful. However, it does not detail what happens to the files after sharing (e.g., cleanup, session lifecycle) or potential side effects, which could be improved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long due to many parameters, but it is well-structured with a clear initial purpose, an important usage note, and a list of parameters. While verbose, every part serves a purpose. It could be slightly more concise by grouping related parameters, but it remains functional.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (29 parameters, 1 required), the description covers most parameters in detail, though it misses a few (port, invite, pause, enableReporting) that are in the schema. There is an output schema but it is not shown, so return values are not explained. Overall, it provides strong context but has minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite the schema having 0% description coverage, the tool description exhaustively explains each parameter with meaning, defaults, and examples (e.g., 'exclude: Exclude files matching glob or regex patterns, comma-separated'). This adds significant value beyond the raw schema, aiding correct usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Share a local file or folder using ffl.' The verb 'share' and resource 'local file or folder' are specific. It also mentions respecting ALLOWED_BASE_DIR, providing context. This distinguishes it from siblings like fflShareText and fflShareBase64, which handle other data types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for local file/folder sharing, and the sibling list provides alternatives for other types. However, it lacks explicit guidance on when to choose this tool over siblings or when not to use it. The context is clear enough but without outright exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fflShareFilesA

Share multiple local files at once using ffl. ffl auto-zips them into a single download.

IMPORTANT: Always present the returned link so the user can click it to open in a browser. Do not display it as a plain unformatted URL — in some interfaces (such as Claude Dispatch) plain URLs are not auto-linked and will not be clickable.

Args: paths: List of local file paths to share together (auto-zipped by ffl) name: Custom download filename shown to recipient (e.g. 'release-v2.0.zip') e2ee: Enable end-to-end encryption (default: False) preview: Open recipient's browser directly in preview mode — shows a file list before downloading (default: False). Recommended when sharing multiple files so the recipient can inspect contents first. authUser: HTTP Basic Auth username to protect the link authPassword: HTTP Basic Auth password to protect the link maxDownloads: Stop serving after N downloads, P2P only (default: 1) timeoutSeconds: Stop serving after N seconds of inactivity, P2P only (default: 1800) waitLinkSeconds: Seconds to wait for link generation hookUrl: Custom webhook URL for events proxy: Proxy server URL (e.g. socks5://127.0.0.1:9050) qrInTerminal: Return ASCII QR code art for terminal display exclude: Exclude files matching glob or regex patterns, comma-separated recipientAuth: Recipient authentication mode — pickup, pubkey, pubkey+pickup, email pickupCode: Specific pickup code to use (default: auto-generated) recipientPublicKey: Path to recipient .fflpub public key file for pubkey auth recipientEmail: Recipient email(s) for OTP auth, comma-separated alias: Custom link alias instead of random UID (requires Standard+ account) receipt: Send email notification when recipient downloads receiptConfirm: Require recipient to confirm before download starts forceRelay: Disable direct WebRTC; route all traffic through tunnel upload: Upload to FFL server for async sharing — e.g. '1 day', '6 hours' (requires Standard+ account) resumeUpload: Resume an interrupted upload (default: False) preferredTunnel: Set preferred tunnel — cloudflare, ngrok, bore, etc.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYes
nameNo
e2eeNo
authUserNo
authPasswordNo
maxDownloadsNo
timeoutSecondsNo
waitLinkSecondsNo
hookUrlNo
proxyNo
qrInTerminalNo
previewNo
excludeNo
recipientAuthNo
pickupCodeNo
recipientPublicKeyNo
recipientEmailNo
aliasNo
receiptNo
receiptConfirmNo
forceRelayNo
uploadNo
resumeUploadNo
preferredTunnelNo
portNo
inviteNo
pauseNo
enableReportingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It mentions sharing and returning a link, but lacks details on side effects, error handling, permissions, or rate limits. Important note about presenting URL is a usage instruction but not behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is front-loaded with purpose and important note, then structured parameter list. Some redundancy (e.g., default values repeated), but reasonable for the number of parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complex tool with 28 params, no annotations, and an output schema exists (so return values not needed). Input parameter descriptions are thorough, but missing behavioral warnings and explicit usage guidance. Still fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description fully compensates by explaining all 28 parameters with clear semantics, defaults, and usage notes. Each parameter gets a meaningful explanation beyond the schema's type-only information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'share', resource 'multiple local files', and action 'auto-zips them into a single download'. Distinguishes from siblings like fflShareFile (single file) and fflShareBase64 (base64).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description implies use for multiple files ('auto-zips') but does not explicitly state when to use this tool versus alternatives. No explicit 'when not to use' or comparison with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fflShareTextA

Share text content using ffl. Returns a sessionId and link. If qrInTerminal is True, also returns a QR code as ASCII art for terminal display.

IMPORTANT: Always present the returned link so the user can click it to open in a browser. Do not display it as a plain unformatted URL — in some interfaces (such as Claude Dispatch) plain URLs are not auto-linked and will not be clickable.

Args: text: Text content to share name: Download filename shown to recipient (default: shared.txt) e2ee: Enable end-to-end encryption (default: False) authUser: HTTP Basic Auth username to protect the link authPassword: HTTP Basic Auth password to protect the link maxDownloads: Stop serving after N downloads (default: 1) timeoutSeconds: Stop serving after N seconds of inactivity (default: 1800) waitLinkSeconds: Seconds to wait for link generation hookUrl: Custom webhook URL for events proxy: Proxy server URL (e.g. socks5://127.0.0.1:9050) qrInTerminal: Return ASCII QR code art for terminal display recipientAuth: Recipient authentication mode — pickup (6-digit code), pubkey (RSA challenge), pubkey+pickup (both), email (OTP) pickupCode: Specific pickup code to use (default: auto-generated) recipientPublicKey: Path to recipient .fflpub public key file for pubkey auth recipientEmail: Recipient email(s) for OTP auth, comma-separated alias: Custom link alias instead of random UID (requires Standard+ account) receipt: Send email notification when recipient downloads (pass email address, or empty string for account email) receiptConfirm: Require recipient to confirm before download starts; pass confirmation message or empty string for default forceRelay: Disable direct WebRTC; route all traffic through tunnel port: Local HTTP server port (default: auto-detect) invite: Open invite page in browser with the sharing link enableReporting: Enable ffl error reporting for diagnostics (disabled by default)

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
nameNoshared.txt
e2eeNo
authUserNo
authPasswordNo
maxDownloadsNo
timeoutSecondsNo
waitLinkSecondsNo
hookUrlNo
proxyNo
qrInTerminalNo
recipientAuthNo
pickupCodeNo
recipientPublicKeyNo
recipientEmailNo
aliasNo
receiptNo
receiptConfirmNo
forceRelayNo
portNo
inviteNo
enableReportingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It explains the primary function, return values, and parameter effects, but does not address error handling, side effects, or limitations. The description is informative but leaves some behavioral aspects implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with an introductory sentence, an important usage note, and a bulleted parameter list. While verbose due to 22 parameters, the structure is logical and front-loaded with key information. Some redundancy could be trimmed, but it is functional.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (22 parameters, 1 required), the description covers the core functionality, return values (sessionId, link, optional QR), and parameter details. It lacks explicit error handling or edge case guidance, but for selecting and invoking the tool, it provides sufficient context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, meaning no parameter descriptions in the JSON Schema. However, the tool description provides a comprehensive 'Args' section detailing every parameter's purpose, default values, and constraints (e.g., types, defaults, special conditions). This fully compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Share text content using ffl' and mentions returning a sessionId and link. This is a specific verb+resource, and the shared context with sibling tools (e.g., fflShareFile, fflShareBase64) differentiates it effectively.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides important usage guidance, such as how to present the link to users and the optional QR code behavior. However, it does not explicitly compare to sibling tools or state when not to use this tool, though the context implies text sharing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fflStopSessionB

Stop a running ffl session by sessionId.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must cover behavioral traits. It only says 'Stop', omitting whether the operation is safe, idempotent, or has side effects, leaving significant gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with no wasted words. However, it could be more informative without sacrificing brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool, the description barely covers the basics. It does not mention the output schema, preconditions, or error cases, which limits completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description merely mentions 'by sessionId' without adding meaning beyond the parameter name. With 0% schema coverage, the description fails to clarify the parameter's format or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action ('Stop'), resource ('ffl session'), and the required identifier ('sessionId'). It effectively distinguishes from sibling tools like fflGetSession and fflListSessions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The implied usage is to stop a running session, but there is no explicit guidance on when to use it versus alternatives, or conditions for use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A3.9/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: download vs. share (file, files, text, base64), key generation, and session management. There is no overlap or ambiguity.

Naming Consistency5/5

All tool names follow the consistent pattern 'ffl' + camelCase verb or verb-noun (e.g., fflDownload, fflShareFile), with no deviations.

Tool Count5/5

10 tools is well-scoped for a file sharing server, covering essential operations (share, download, manage sessions, generate keys) without redundancy or missing functionality.

Completeness5/5

The tool surface is complete: all typical file sharing workflows are supported (sharing various content types, downloading, session lifecycle management, and key generation). No obvious gaps.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nuwainfo/ffl-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server