ffl-mcp
OfficialClick on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ffl-mcpshare the file /tmp/debug.log and give me the link"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
Table of Contents
Related MCP server: kintone MCP Server
Installation
⚡ Short URLs for convenience
Linux/macOS:
curl -fsSL https://fastfilelink.com/mcp/install.sh | bashWindows (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 | bashDownloads 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 | iexDownloads 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 installTargets can be controlled with --target (default: all):
uvx --from git+https://github.com/nuwainfo/ffl-mcp install --target claude-desktop,codex-desktop,codex-cliuvx --from git+https://github.com/nuwainfo/ffl-mcp install --printIf 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.tomlRun 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-mcpMCP 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 |
| Plain text |
| Binary data (base64-encoded) |
| Single local file or folder |
| Multiple files (ffl auto-zips them into one download) |
Common options for all share tools:
Option | Default | Description |
|
| End-to-end encryption |
|
| Return ASCII QR art ( |
| — | HTTP Basic Auth to protect the link |
|
| Stop serving after N downloads (P2P only) |
|
| Inactivity timeout in seconds (P2P only) |
| — |
|
| auto | Specific pickup code for |
| — | Path to |
| — | Email(s) for |
| — | Custom link alias e.g. |
| — | Email notification when recipient downloads |
| — | Require recipient confirmation before download; pass a message or |
|
| Disable WebRTC, route all traffic through tunnel |
| — | Local HTTP server port (auto-detect by default). Useful with fixed tunnels. |
|
| Open the ffl invite page in a local browser with the generated sharing link. |
|
| Enable ffl diagnostic error reporting. Disabled by default. |
| — | Upload to FFL server instead of P2P — e.g. |
|
| Resume an interrupted upload |
| — | Proxy URL e.g. |
Additional options for fflShareFile / fflShareFiles:
Option | Default | Description |
|
| Enable preview sidecar routes for folder or multi-file shares. Returned links stay clean; add |
| — | Glob or regex patterns to exclude, comma-separated — e.g. |
| — | Pause server upload at a percentage from 1 to 99. Requires |
|
| Expose as VFS server ( |
| — | Set preferred tunnel for this and future runs — |
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).
| Meaning |
| Direct peer-to-peer (fastest) |
| HTTP relay when WebRTC fails |
| 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 asrecipientPublicKey)<name>.fflkey— keep private (pass asrecipientPrivateKeywhen downloading)
Session Management
fflListSessions()— list active share sessionsfflStopSession(sessionId)— terminate a sessionfflGetSession(sessionId)— get session detailsfflGetSessionEvents(sessionId, limit=50)— retrieve webhook events
Notes
FFL_USE_STDIN=1avoids writing text/base64 payloads to disk.FFL_RUN_MODE=pythonruns the Core.py CLI (requiresFFL_CORE_PATH).FFL_USE_HOOK=1starts a local webhook server and passes it tofflfor real-time link/progress events.FFL_DEBUG=1saves ffl output to a temp log file; path returned asdebugLogPath. SetFFL_DEBUG=/path/to/log.txtto use a fixed path.ALLOWED_BASE_DIRrestrictsfflShareFile/fflShareFilesto 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" -vWSL2 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 toolsfflDownloadA
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
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| outputPath | No | ||
| resume | No | ||
| authUser | No | ||
| authPassword | No | ||
| proxy | No | ||
| recipientAuth | No | ||
| pickupCode | No | ||
| recipientPrivateKey | No | ||
| enableReporting | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
fflStopSessionB
Stop a running ffl session by sessionId.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
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.
All tool names follow the consistent pattern 'ffl' + camelCase verb or verb-noun (e.g., fflDownload, fflShareFile), with no deviations.
10 tools is well-scoped for a file sharing server, covering essential operations (share, download, manage sessions, generate keys) without redundancy or missing functionality.
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
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
MCP server for Flux AI image generation
MCP server for AI dialogue using various LLM models via AceDataCloud
MCP server for NanoBanana AI image generation and editing
Official remote MCP server for Archivist AI TTRPG campaign memory: characters, sessions, and more.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for fffinstill — A Research Lab for Your Investment IdeasMIT

kintone MCP Serverofficial
AlicenseAqualityAmaintenanceOfficial MCP server for kintone, enabling AI assistants to manage kintone apps, records, and settings through natural language.201,50455Apache 2.0- AlicenseAqualityDmaintenanceMCP server for Woody, an AI firearms expert that answers questions with verified citations, checks state-specific laws, and routes to specialist agents.3MIT
- FlicenseNot gradedqualityBmaintenanceMCP server enabling AI agents to generate AI videos and images, analyze video content, and download videos from Douyin and Xiaohongshu.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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