Skip to main content
Glama
relayshield

relayshield-mcp

Official

scan_file

Submit a file download URL for malware analysis across 70+ antivirus engines. Returns an analysis ID to poll for verdict: malicious, suspicious, clean, or timeout.

Instructions

Submit a file for binary malware analysis across 70+ AV engines. Provide a publicly accessible download URL — RelayShield handles the download. Returns an analysis_id immediately (async). Call check_scan_result with the analysis_id every 5 seconds until verdict is returned. Verdicts: malicious | suspicious | clean | timeout. Use when a user receives an email attachment and forwards the download link. Requires subscription API key — coming soon for pay-as-you-go. Subscription: rapidapi.com/relayshield

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
file_urlYesPublicly accessible URL to download the file from
filenameNoOptional filename hint (e.g. invoice_march.pdf)

Implementation Reference

  • Tool registration for scan_file inside list_tools(). Defines name, description, and inputSchema (required file_url, optional filename).
    types.Tool(
        name="scan_file",
        description=(
            "Submit a file for binary malware analysis across 70+ AV engines. "
            "Provide a publicly accessible download URL — RelayShield handles the download. "
            "Returns an analysis_id immediately (async). "
            "Call check_scan_result with the analysis_id every 5 seconds until verdict is returned. "
            "Verdicts: malicious | suspicious | clean | timeout. "
            "Use when a user receives an email attachment and forwards the download link. "
            "Requires subscription API key — coming soon for pay-as-you-go. "
            "Subscription: rapidapi.com/relayshield"
        ),
        inputSchema={
            "type": "object",
            "required": ["file_url"],
            "properties": {
                "file_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Publicly accessible URL to download the file from",
                },
                "filename": {
                    "type": "string",
                    "description": "Optional filename hint (e.g. invoice_march.pdf)",
                },
            },
        },
    ),
  • Input schema for scan_file: requires 'file_url' (uri format) with optional 'filename' (string).
    inputSchema={
        "type": "object",
        "required": ["file_url"],
        "properties": {
            "file_url": {
                "type": "string",
                "format": "uri",
                "description": "Publicly accessible URL to download the file from",
            },
            "filename": {
                "type": "string",
                "description": "Optional filename hint (e.g. invoice_march.pdf)",
            },
        },
    },
  • Handler for scan_file inside _dispatch(). Builds POST body with file_url and optional filename, sends to /v1/scan-file or /v1/payg/scan-file endpoint.
    if name == "scan_file":
        body: dict = {"file_url": arguments["file_url"]}
        if "filename" in arguments:
            body["filename"] = arguments["filename"]
        return await client.post(
            f"{base}/scan-file",
            headers=headers,
            json=body,
        )
  • Guard that returns 'coming_soon' for scan_file (and scan_url) if no API_KEY is set — VT commercial licensing pending for PAYG.
    if not API_KEY and name in VT_COMING_SOON:
        return [types.TextContent(type="text", text=json.dumps({
            "ok": False,
            "tool": name,
            "status": "coming_soon",
            "message": (
                f"{name} requires a subscription API key. "
                "VT commercial licensing is pending for pay-as-you-go access. "
                "Subscribe at rapidapi.com/relayshield for early access."
            ),
        }))]
  • PAYG_PRICING entry showing scan_file as 'coming soon'.
    "scan_file":               "coming soon",
Behavior4/5

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

No annotations, so description carries full burden. Discloses async behavior, polling interval, verdict types, and that the tool fetches the URL. Does not mention file size limits or error handling, but covers core behavior well.

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?

Concise single paragraph with clear structure: purpose, async behavior, usage, requirements. Every sentence is informative with no redundancy.

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?

Covers the main flow, parameters, and pairing with check_scan_result. Lacks details on file size limits or error cases, but given the simple interface (2 params, no output schema), it is sufficiently complete for agent decision-making.

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 100%, baseline 3. Description adds context that file_url must be publicly accessible and that the tool handles download, which goes beyond schema. Also clarifies filename is optional hint.

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?

Clearly states the tool submits a file for malware analysis using 70+ AV engines, with a specific input (URL) and async output. Distinguishes from sibling tools like check_scan_result (polling) and scan_url (URL scanning).

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?

Provides clear usage scenario: 'when a user receives an email attachment and forwards the download link.' Also instructs to poll with check_scan_result every 5 seconds. Lacks explicit when-not-to-use or alternatives, but context is strong.

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

Install Server

Other Tools

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/relayshield/relayshield-mcp'

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