Skip to main content
Glama

cv_forge_setup

Configure CV Forge backend to generate professional ATS-friendly CVs. Choose local Docker setup or remote hosted service before creating PDF/DOCX documents.

Instructions

Set up CV Forge backend. MUST be called before generate_pdf or generate_docx.

Detects the environment and lets the user choose how to run CV Forge:

  • "local": Run locally via Docker (pulls image if needed, ~1.7 GB)

  • "remote": Use the hosted demo at cv.guidlab.pl (no install needed)

  • "auto": Auto-detect — use local if Docker is available, otherwise remote

If mode is "auto", present the user with the available options and ask which they prefer. If only one option is available, use it automatically.

Args: mode: "local", "remote", or "auto" (default).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
modeNoauto

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • The 'cv_forge_setup' function is defined here, which handles setting up the CV Forge backend by choosing between local Docker and remote hosting modes. It is also decorated with '@mcp.tool()', which handles the registration.
    @mcp.tool()
    def cv_forge_setup(mode: str = "auto") -> str:
        """Set up CV Forge backend. MUST be called before generate_pdf or generate_docx.
    
        Detects the environment and lets the user choose how to run CV Forge:
        - "local": Run locally via Docker (pulls image if needed, ~1.7 GB)
        - "remote": Use the hosted demo at cv.guidlab.pl (no install needed)
        - "auto": Auto-detect — use local if Docker is available, otherwise remote
    
        If mode is "auto", present the user with the available options and ask which
        they prefer. If only one option is available, use it automatically.
    
        Args:
            mode: "local", "remote", or "auto" (default).
        """
        global _base_url, _mode
    
        env_url = os.environ.get("CV_FORGE_URL", "").strip().rstrip("/")
        if env_url:
            _base_url = env_url
            _mode = "custom"
            return json.dumps({"status": "ready", "mode": "custom", "url": env_url})
    
        info = _check_environment()
    
        if mode == "remote":
            if not info["remote"]:
                return json.dumps({"status": "error", "message": "Remote server cv.guidlab.pl is not reachable."})
            _base_url = REMOTE_URL
            _mode = "remote"
            return json.dumps({"status": "ready", "mode": "remote", "url": REMOTE_URL})
    
        if mode == "local":
            if info["local_running"]:
                _base_url = LOCAL_URL
                _mode = "local"
                return json.dumps({"status": "ready", "mode": "local", "url": LOCAL_URL})
            if not info["docker"]:
                return json.dumps({"status": "error", "message": "Docker is not installed. Install Docker or use mode='remote'."})
            if _start_local():
                _base_url = LOCAL_URL
                _mode = "local"
                return json.dumps({"status": "ready", "mode": "local", "url": LOCAL_URL})
            return json.dumps({"status": "error", "message": "Failed to start local container."})
    
        # mode == "auto" — present options
        if info["local_running"]:
            _base_url = LOCAL_URL
            _mode = "local"
            return json.dumps({"status": "ready", "mode": "local", "url": LOCAL_URL,
                               "message": "Using already running local instance."})
    
        options = []
        if info["docker"]:
            if info["docker_image"]:
                options.append({"mode": "local", "description": "Local Docker (image ready, fast startup)"})
            else:
                options.append({"mode": "local", "description": "Local Docker (needs to pull ~1.7 GB image first)"})
        if info["remote"]:
            options.append({"mode": "remote", "description": "Remote server cv.guidlab.pl (no install needed)"})
    
        if not options:
            return json.dumps({"status": "error",
                               "message": "No backend available. Install Docker or check your internet connection."})
    
        if len(options) == 1:
            # Only one option — use it directly
            return cv_forge_setup(mode=options[0]["mode"])
Behavior5/5

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

No annotations provided, so description carries full disclosure burden. Rich behavioral details: environment detection, Docker image size (~1.7 GB), hosted demo URL (cv.guidlab.pl), auto-detection logic, and interactive user-prompting behavior for mode selection.

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?

Well-structured with critical prerequisite front-loaded. Clear separation of mode explanations. Slightly verbose in describing auto-mode interaction logic, but all sentences provide actionable value. 'Args:' section effectively bridges schema gap.

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?

Single-parameter tool with output schema present (so return values need no description). Despite 0% schema coverage and no annotations, description fully explains the setup workflow, environment requirements, and sibling dependencies. Complete for tool complexity.

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 has 0% description coverage. Description compensates by documenting all valid enum values ('local', 'remote', 'auto'), their meanings, and noting the default. Could explicitly state the parameter is optional (implied by 'default' mention but not explicit).

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?

Clear specific verb ('Set up') + resource ('CV Forge backend'). Explicitly distinguishes from sibling generation tools by stating 'MUST be called before generate_pdf or generate_docx', establishing the prerequisite relationship.

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

Usage Guidelines5/5

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

Explicit prerequisite declaration ('MUST be called before...'). Clear when-to-use guidance for each mode: local requires Docker, remote needs no install, auto detects availability. Explains interactive behavior for 'auto' mode (present options to user).

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/Guid-Lab/cv-forge-mcp'

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