Skip to main content
Glama

Faber MCP Server

MCP (Model Context Protocol) server for deploying Laravel applications to Faber servers directly from Cursor.

Overview

Faber MCP enables you to deploy and manage Laravel applications on Faber servers using AI agents in Cursor. Simply ask your AI assistant to "deploy this project to production" and it handles the rest - including provisioning new stacks, managing GitHub deploy keys, and triggering deployments.

Features

  • Deploy Laravel apps from Cursor with natural language commands

  • Available globally across all your projects

  • Multi-server support (production, staging, etc.)

  • Automatic GitHub deploy key setup via Device Flow OAuth

  • Full stack management (apps, domains, databases, SSL)

  • Release management and rollbacks

  • Real-time logs and debugging

Related MCP server: laravel-artisan-mcp

Installation

Option 1: Install from npm (when published)

npm install -g faber-mcp

Option 2: Install from source

git clone https://github.com/JoshTrebilco/faber-mcp.git
cd faber-mcp
npm install
npm run build
npm link  # Makes it available globally

Configuration

Step 1: Create Server Configuration

Create ~/.faber-mcp.json with your Faber server details.

You can copy example-config.json as a starting point:

cp example-config.json ~/.faber-mcp.json
# Edit with your server details
nano ~/.faber-mcp.json

Or create it from scratch:

{
  "defaultServer": "production",
  "servers": {
    "production": {
      "host": "your-production-server.com",
      "user": "root",
      "keyPath": "~/.ssh/id_rsa",
      "port": 22
    },
    "staging": {
      "host": "staging.example.com",
      "user": "root",
      "keyPath": "~/.ssh/id_rsa"
    }
  }
}

Requirements:

  • SSH key must have access to the Faber server

  • faber CLI must be installed on the server

  • You must be able to authenticate as root

Step 2: Configure Cursor

Edit ~/.cursor/mcp.json (create if it doesn't exist):

{
  "mcpServers": {
    "faber": {
      "command": "faber-mcp"
    }
  }
}

Alternative configurations:

If Cursor can't find the global command, use the full path:

{
  "mcpServers": {
    "faber": {
      "command": "node",
      "args": ["/usr/local/lib/node_modules/faber-mcp/dist/index.js"]
    }
  }
}

Or use npx (no global install needed):

{
  "mcpServers": {
    "faber": {
      "command": "npx",
      "args": ["-y", "faber-mcp"]
    }
  }
}

Important: Restart Cursor completely after adding the MCP server configuration.

Usage Examples

Deploy Current Project

Simply ask Cursor's AI agent:

"Deploy this project to production"

The agent will:

  1. Check if the app already exists on the server

  2. If not, prompt you for:

    • Project name (username in Faber)

    • Git repository URL

    • Domain name

    • PHP version

    • Git branch

  3. Create the full stack (app, domain, database, SSL, .env)

  4. GitHub Authorization (if GitHub OAuth is configured on server):

    • Cursor will display a message like:

      GitHub Authorization Required
      
      1. Open: https://github.com/login/device
      2. Enter code: A1B2-C3D4
      
      Waiting for authorization...
    • Click the verification URI and enter the code

    • Authorize the application in your browser

    • Server automatically adds the deploy key to your repository

  5. Or if the app exists, trigger a deployment

Other Commands

"Check if myapp is deployed on production"

"List all apps on the production server"

"Rollback myapp to the previous release"

"Show me the production server status"

"Deploy this to staging server"

Multi-Server Support

When using multiple servers, specify which one:

"Deploy this to staging server"

The agent will use the staging profile from your config. If not specified, it uses defaultServer.

Available Tools

The MCP server provides these tools to Cursor's AI agent:

App Management

  • faber_check_app - Check if an app exists and get details

  • faber_list_apps - List all deployed apps

  • faber_create_stack - Create full application stack (handles GitHub deploy key setup)

  • faber_deploy - Trigger zero-downtime deployment

  • faber_get_deploy_key - Retrieve SSH public key for an app (for manual GitHub setup)

Server Management

  • faber_server_status - Get server health and service status

  • faber_service_restart - Restart services (nginx, php, mysql, redis)

Domain Management

  • faber_list_domains - List configured domains

  • faber_create_domain - Create/assign domain to app

Database Management

  • faber_list_databases - List all databases

  • faber_create_database - Create a new database

Release Management

  • faber_list_releases - List available releases for an app

  • faber_rollback - Rollback to a previous release

Logs & Debugging

  • faber_webhook_logs - View webhook execution logs

  • faber_app_logs - View Laravel application logs

Environment

  • faber_get_env - Read .env file (read-only)

  • faber_set_env_var - Set a specific .env variable

Troubleshooting

MCP server not connecting

  • Verify SSH key has access: ssh -i ~/.ssh/id_rsa root@your-server.com

  • Check ~/.faber-mcp.json syntax is valid JSON

  • Ensure faber CLI is installed on the server: ssh root@server "which faber"

Cursor not recognizing tools

  • Restart Cursor completely after adding MCP config

  • Check Cursor's MCP logs: View → Output → Select "MCP" from dropdown

  • Verify the path in ~/.cursor/mcp.json is correct and absolute

SSH connection errors

  • Test SSH connection manually first

  • Ensure SSH key permissions: chmod 600 ~/.ssh/id_rsa

  • Check server firewall allows SSH on port 22

Faber commands failing

  • Verify you're running as root on the server

  • Check Faber is installed: ssh root@server "faber version"

  • Review server logs: ssh root@server "faber logs"

Requirements

  • Node.js 18+ (for running the MCP server locally)

  • SSH access to Faber server(s)

  • Faber CLI installed on target server(s)

  • Cursor IDE with MCP support

Development

# Clone the repository
git clone https://github.com/JoshTrebilco/faber-mcp.git
cd faber-mcp

# Install dependencies
npm install

# Build TypeScript
npm run build

# Or watch mode
npm run dev

License

MIT

Available Tools

17 tools
faber_app_logsC

View Laravel application logs for an app

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesThe app username
linesNoNumber of lines to show (default: 50)
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'View' logs, implying a read-only operation, but doesn't specify whether this requires authentication, has rate limits, affects system performance, or what the output format looks like (e.g., text, JSON). For a tool with no annotation coverage, this leaves significant gaps in understanding its behavior.

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, efficient sentence that directly states the tool's purpose without unnecessary words. It's front-loaded and wastes no space, making it highly concise and well-structured for quick comprehension.

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?

Given the tool's complexity (3 parameters, no output schema, no annotations), the description is insufficient. It doesn't explain what the logs contain, how they're formatted, or any behavioral traits like error handling. For a log-viewing tool with multiple parameters, more context is needed to ensure proper usage by an AI agent.

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

Parameters3/5

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

The input schema has 100% description coverage, so parameters are well-documented in the schema itself. The description adds no additional meaning beyond implying logs are for a Laravel app, which doesn't clarify parameter usage further. Thus, it meets the baseline for high schema coverage but doesn't enhance parameter understanding.

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 action ('View') and resource ('Laravel application logs for an app'), making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'faber_webhook_logs' or 'faber_list_releases', which might also involve log-related operations, so it falls short of a perfect score.

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?

The description provides no guidance on when to use this tool versus alternatives, such as 'faber_webhook_logs' for webhook-specific logs or other sibling tools for different app-related tasks. It lacks any mention of prerequisites, context, or exclusions, leaving usage entirely implicit.

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

faber_check_appC

Check if an app exists on the Faber server and get its details

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe app username to check
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool checks existence and gets details, but doesn't describe what 'details' include, whether it's a read-only operation, what happens if the app doesn't exist (error vs. null response), authentication requirements, rate limits, or response format. This is inadequate for a tool with potential side effects or complex behavior.

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, efficient sentence that states the purpose clearly without unnecessary words. It's appropriately sized for a simple lookup tool and front-loads the key information. Every word earns its place.

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?

Given no annotations, no output schema, and a simple input schema, the description is incomplete. It doesn't explain what 'details' are returned, error handling, or behavioral aspects. For a tool that checks existence and retrieves information, users need to know what information is returned and how failures are handled.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents both parameters ('name' as the app username to check, 'server' as optional with default). The description adds no additional parameter information beyond what's in the schema. According to scoring rules, when schema coverage is high (>80%), the baseline is 3 even with no param info in the description.

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 verb ('Check if exists') and resource ('app on Faber server'), and specifies the additional action of getting details. It distinguishes itself from siblings like 'faber_list_apps' by focusing on a specific app rather than listing all. However, it doesn't explicitly contrast with other siblings like 'faber_get_env' or 'faber_server_status'.

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?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when to choose this over 'faber_list_apps' for checking existence, or how it relates to tools like 'faber_get_env' or 'faber_server_status'. There's no context about prerequisites, error conditions, or typical use cases.

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

faber_create_databaseC

Create a new MySQL database with a dedicated user

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDatabase name (auto-generated if not provided)
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/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 mentions creating a database with a user, but lacks details on permissions needed, whether this is reversible, if it affects existing data, or what happens on failure. For a creation tool with zero annotation coverage, this is insufficient.

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, efficient sentence with zero waste. It's appropriately sized and front-loaded with the core action, making it easy to parse quickly.

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?

For a database creation tool with no annotations and no output schema, the description is incomplete. It doesn't explain what the tool returns, error conditions, or behavioral nuances like auto-generation rules, leaving significant gaps for agent understanding.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters. The description adds no additional parameter semantics beyond implying database creation, which the schema covers. Baseline 3 is appropriate when schema does the heavy lifting.

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 action ('Create a new MySQL database') and specifies it includes 'a dedicated user', which adds useful detail. However, it doesn't differentiate from sibling tools like 'faber_create_domain' or 'faber_create_stack' beyond mentioning MySQL specifically.

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. With siblings like 'faber_list_databases' and 'faber_create_domain', there's no indication of prerequisites, dependencies, or contextual triggers for choosing this tool.

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

faber_create_domainC

Create and assign a domain to an app (includes SSL setup)

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesDomain name
appYesApp username to assign the domain to
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/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 mentions 'includes SSL setup,' which adds some behavioral context beyond the basic creation. However, it lacks critical details such as permissions required, whether the operation is idempotent, potential side effects (e.g., downtime), or error conditions. For a mutation tool with zero annotation coverage, this is insufficient.

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, efficient sentence that front-loads the core action ('Create and assign a domain to an app') and includes a useful detail ('includes SSL setup'). There is no wasted wording, and it's appropriately sized for the tool's complexity.

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?

Given the tool's complexity (a mutation with 3 parameters) and lack of annotations and output schema, the description is incomplete. It doesn't cover behavioral aspects like authentication needs, rate limits, or what the tool returns. The mention of SSL setup is helpful but insufficient for a creation tool that likely has significant operational impact.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents the three parameters (domain, app, server). The description adds no additional meaning beyond what the schema provides, such as format examples or constraints. With high schema coverage, the baseline is 3, as the description doesn't compensate but doesn't detract either.

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 action ('Create and assign') and resource ('a domain to an app'), specifying that it includes SSL setup. It distinguishes from sibling tools like 'faber_list_domains' by indicating creation rather than listing. However, it doesn't explicitly differentiate from other creation tools like 'faber_create_database' or 'faber_create_stack' in terms of resource type.

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?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing app), exclusions, or compare with siblings like 'faber_list_domains' for viewing domains or 'faber_set_env_var' for other app configurations. Usage is implied only by the action described.

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

faber_create_stackA

Create a full application stack (app + domain + database + SSL + .env). Handles GitHub Device Flow OAuth for automatic deploy key setup if configured on server. First call shows a preview - set confirm: true to execute.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYesUsername for the app (lowercase, alphanumeric)
repositoryYesGit repository URL (HTTPS or SSH)
domainNoDomain name for the app
branchNoGit branch (default: main)
phpNoPHP version (default: 8.4)
dbnameNoDatabase name (defaults to username)
skipDbNoSkip database creation
skipDomainNoSkip domain creation
skipEnvNoSkip .env configuration
skipDeployNoSkip initial deployment
skipReverbNoSkip Reverb WebSocket configuration
confirmNoSet to true to execute the stack creation. Without this, returns a preview of what will be created.
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behavioral traits: the two-phase execution (preview vs. confirm), automatic OAuth handling for deploy keys, and the comprehensive scope of resources created. It could improve by mentioning potential side effects (e.g., resource consumption, timeouts) or error handling, but it covers the core workflow 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?

The description is efficiently structured in two sentences: the first states the purpose and scope, and the second explains the execution flow and OAuth feature. Every word contributes essential information without redundancy, making it front-loaded and easy to parse quickly.

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 of creating multiple resources and the lack of annotations or output schema, the description provides a solid foundation by explaining the tool's behavior, scope, and execution model. It could be more complete by detailing the preview output format or success/failure responses, but it adequately covers the critical aspects for a high-stakes creation tool.

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

Parameters3/5

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

The input schema has 100% description coverage, providing detailed documentation for all 13 parameters. The description adds minimal parameter semantics beyond the schema, only implicitly relating to 'confirm' for execution. Since the schema does the heavy lifting, the baseline score of 3 is appropriate, as the description doesn't significantly enhance parameter understanding.

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 specific action ('Create a full application stack') and enumerates the components involved (app + domain + database + SSL + .env), distinguishing it from simpler sibling tools like faber_create_database or faber_create_domain. It uses precise terminology that indicates a comprehensive, multi-resource creation process.

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 clear context for when to use this tool by explaining its two-phase behavior (preview first, then execution with confirm: true) and mentioning GitHub OAuth for deploy key setup. However, it does not explicitly state when to choose this over alternatives like using individual sibling tools (e.g., faber_create_database separately), which prevents a perfect score.

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

faber_deployC

Trigger a zero-downtime deployment for an app

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesThe app username to deploy
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions 'zero-downtime deployment', which implies availability during the process, but doesn't cover critical aspects like required permissions, potential side effects, error handling, or what constitutes success. This leaves significant gaps for a deployment 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 a single, clear sentence that efficiently conveys the core functionality without unnecessary words. It is front-loaded with the key action and resource, making it easy to parse and understand quickly.

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?

Given the complexity of a deployment operation, the lack of annotations and output schema, and the description's minimal detail, this is incomplete. It fails to address behavioral traits, error conditions, or output expectations, which are crucial for safe and effective tool use in this context.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents both parameters ('username' and 'server') adequately. The description adds no additional meaning or context about these parameters beyond what the schema provides, such as format examples or constraints, meeting the baseline for high coverage.

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 action ('trigger a zero-downtime deployment') and the resource ('for an app'), making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'faber_rollback' or 'faber_service_restart', which also involve deployment-related operations.

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?

The description provides no guidance on when to use this tool versus alternatives like 'faber_rollback' for reverting deployments or 'faber_service_restart' for restarting services. It also lacks context about prerequisites, such as whether the app must already exist or be in a specific state.

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

faber_get_deploy_keyA

Retrieve the SSH public key for an app (used for manual deploy key setup)

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesThe app username
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

A3.5/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 burden but only states it retrieves a public key without disclosing behavioral traits like authentication requirements, rate limits, error conditions, or response format. It mentions the key is 'for manual deploy key setup', which adds some context but lacks operational details needed for safe invocation.

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, efficient sentence that front-loads the core purpose ('Retrieve the SSH public key for an app') and adds clarifying context ('used for manual deploy key setup'). Every word earns its place with zero waste.

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 annotations and no output schema, the description is minimally complete for a simple retrieval tool but lacks details on return values (e.g., key format) and error handling. It covers the basic purpose but does not fully compensate for the missing structured data, leaving gaps in operational understanding.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents both parameters. The description does not add meaning beyond the schema (e.g., it doesn't explain what 'app username' entails or provide examples). Baseline 3 is appropriate as the schema handles parameter documentation adequately.

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 specific action ('Retrieve') and resource ('SSH public key for an app'), with additional context about its use case ('for manual deploy key setup'). It distinguishes from siblings like 'faber_get_env' (environment variables) or 'faber_list_apps' (listing apps) by focusing on a specific cryptographic key retrieval.

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 usage when manual deploy key setup is needed, but does not explicitly state when to use this tool versus alternatives (e.g., automated deployment methods or other key-related tools). No exclusions or prerequisites are mentioned, leaving usage context somewhat open-ended.

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

faber_get_envC

Read the .env file for an app (read-only)

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesThe app username
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/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 states 'read-only', which implies no destructive actions, but doesn't disclose other behavioral traits such as authentication needs, rate limits, or what the output looks like (e.g., format, error handling). This is a significant gap for a tool with no annotation coverage.

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, efficient sentence that directly states the tool's function without unnecessary words. It's front-loaded and appropriately sized, making it easy for an agent to parse quickly.

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?

Given the tool's complexity (read operation with 2 parameters) and lack of annotations and output schema, the description is incomplete. It doesn't explain the return values, error conditions, or how it fits into the broader context of app management with sibling tools, leaving gaps for effective agent use.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters ('username' and 'server'). The description doesn't add any meaning beyond what the schema provides, such as explaining how the username relates to the app or default server behavior. Baseline 3 is appropriate when the schema handles parameter 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 action ('Read') and resource ('.env file for an app'), making the purpose evident. However, it doesn't differentiate from sibling tools like 'faber_set_env_var' or 'faber_app_logs', which would require explicit comparison to earn a 5.

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?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention scenarios where this is preferred over other tools like 'faber_set_env_var' for setting environment variables or 'faber_app_logs' for logs, leaving the agent without context for selection.

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

faber_list_appsC

List all deployed apps on the Faber server

ParametersJSON Schema
NameRequiredDescriptionDefault
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states it's a list operation, implying read-only behavior, but doesn't cover critical aspects like pagination, rate limits, authentication needs, or what the output format looks like. This leaves significant gaps for an agent to understand how to interact with it effectively.

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, clear sentence with zero wasted words. It's front-loaded with the core purpose and efficiently conveys the essential information without unnecessary elaboration, making it easy for an agent to parse quickly.

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?

For a tool with no annotations and no output schema, the description is too minimal. It doesn't explain what 'deployed apps' entails, how results are structured, or any behavioral traits like error handling. Given the complexity implied by sibling tools (e.g., deployment and management operations), more context is needed for the agent to use it correctly.

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

Parameters3/5

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

The schema description coverage is 100%, with the single parameter 'server' documented as optional with a default. The description doesn't add any meaning beyond this, such as examples of server names or when to override the default. Given the high schema coverage, the baseline score of 3 is appropriate.

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 action ('List') and resource ('all deployed apps on the Faber server'), making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'faber_list_databases' or 'faber_list_domains', which prevents a perfect score.

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?

The description provides no guidance on when to use this tool versus alternatives like 'faber_check_app' for app details or 'faber_list_releases' for release history. It lacks any context about prerequisites, timing, or exclusions, offering only basic functional information.

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

faber_list_databasesC

List all databases on the Faber server

ParametersJSON Schema
NameRequiredDescriptionDefault
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/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 of behavioral disclosure. It states the action ('List all databases') but lacks details on permissions required, rate limits, pagination, error handling, or response format. For a tool with no annotation coverage, this leaves significant gaps in understanding its operational behavior.

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, clear sentence that efficiently conveys the core purpose without unnecessary words. It is front-loaded and wastes no space, making it easy for an agent to parse quickly. Every part of the sentence earns its place by specifying the action and scope.

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?

Given the lack of annotations and output schema, the description is incomplete for a tool that likely returns a list of databases. It doesn't explain what information is included in the list, format, or any limitations. For a list operation with no structured output documentation, more context is needed to fully understand the tool's behavior.

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

Parameters3/5

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

The description does not mention any parameters, but the input schema has 100% coverage with one optional parameter ('server') fully documented. Since schema coverage is high, the baseline score is 3, as the schema adequately describes the parameter without needing additional explanation in the description.

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 action ('List all databases') and resource ('on the Faber server'), making the purpose immediately understandable. It distinguishes from some siblings like 'faber_list_apps' or 'faber_list_domains' by specifying databases, though it doesn't explicitly contrast with all list operations. The description avoids tautology by not just repeating the tool name.

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?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, context, or exclusions, such as whether it's for administrative tasks or how it differs from other list tools like 'faber_list_apps'. Without such guidance, the agent must infer usage from the name alone.

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

faber_list_domainsC

List all configured domains on the Faber server

ParametersJSON Schema
NameRequiredDescriptionDefault
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/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 of behavioral disclosure. It states the tool lists domains but does not describe any behavioral traits, such as whether it requires authentication, how it handles errors, if results are paginated, or what format the output takes. This leaves significant gaps for an agent to understand how to interact with it effectively.

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, clear sentence that directly states the tool's purpose without unnecessary words. It is appropriately sized and front-loaded, making it easy for an agent to quickly understand the core functionality.

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?

Given the lack of annotations and output schema, the description is incomplete. It does not address behavioral aspects like authentication needs, error handling, or output format, which are crucial for a tool that interacts with a server. While it states the purpose clearly, it fails to provide enough context for safe and effective use by an AI agent.

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

Parameters3/5

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

The input schema has 100% description coverage, with one optional parameter ('server') documented in the schema. The description does not add any meaning beyond what the schema provides, as it does not mention parameters at all. According to the rules, with high schema coverage (>80%), the baseline is 3 when no param info is in the description.

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 action ('List') and resource ('all configured domains on the Faber server'), providing a specific verb+resource combination. However, it does not explicitly distinguish this tool from sibling tools like 'faber_list_apps' or 'faber_list_databases', which follow a similar pattern but target different resources.

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?

The description provides no guidance on when to use this tool versus alternatives. It does not mention any prerequisites, exclusions, or specific contexts for usage, such as when listing domains is necessary compared to other list operations or creation/deployment tools in the sibling set.

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

faber_list_releasesC

List all available releases for an app

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesThe app username
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/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 burden but only states basic functionality. It doesn't disclose behavioral traits like whether this is a read-only operation, if it requires authentication, rate limits, pagination, or what the output format looks like, which are critical for a list 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 a single, efficient sentence with zero waste, front-loading the core purpose. It's appropriately sized for a simple list operation, making it easy to parse quickly.

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?

Given the complexity (a list operation with 2 parameters), no annotations, and no output schema, the description is incomplete. It lacks details on behavior, output format, and usage context, making it inadequate for an agent to fully understand how to invoke and interpret results.

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

Parameters3/5

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

The input schema has 100% description coverage, so parameters are well-documented in the schema. The description adds no additional meaning beyond implying 'app' relates to 'username', which is already clear from the schema. Baseline 3 is appropriate as the schema does the heavy lifting.

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 verb ('List') and resource ('releases for an app'), making the purpose specific and understandable. However, it doesn't differentiate from sibling tools like 'faber_list_apps' or 'faber_list_databases' beyond specifying 'releases', leaving some ambiguity about scope.

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?

The description provides no guidance on when to use this tool versus alternatives, such as how it differs from other list tools in the sibling set. There's no mention of prerequisites, context, or exclusions, leaving usage entirely implicit.

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

faber_rollbackC

Roll back an app to a previous release

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesThe app username
releaseNoRelease name (timestamp) - optional, defaults to previous release
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/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 burden for behavioral disclosure. While 'roll back' implies a destructive/mutative operation, it doesn't specify critical details like whether this requires admin permissions, if the rollback is reversible, what happens to current app state, or potential side effects. The description is too minimal for a mutation tool with zero annotation coverage.

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, efficient sentence with zero wasted words. It's appropriately sized for the tool's complexity and gets straight to the point without unnecessary elaboration.

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?

For a mutation tool with no annotations and no output schema, the description is inadequate. It doesn't explain what happens during rollback, what constitutes success/failure, or what the agent should expect as a result. Given the destructive nature implied by 'roll back,' more behavioral context is needed.

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

Parameters3/5

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

Schema description coverage is 100%, so all parameters are documented in the schema. The description adds no parameter-specific information beyond what's already in the schema (e.g., it doesn't explain format of 'release' timestamp or how to determine 'server' values). Baseline 3 is appropriate when schema does the heavy lifting.

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 action ('roll back') and target ('an app to a previous release'), providing a specific verb+resource combination. However, it doesn't differentiate this tool from potential siblings like 'faber_deploy' or 'faber_list_releases' beyond the basic operation.

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?

The description provides no guidance on when to use this tool versus alternatives like 'faber_deploy' for forward changes or 'faber_list_releases' to see available rollback targets. It mentions no prerequisites, exclusions, or contextual triggers for invoking this operation.

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

faber_server_statusC

Get server health and service status

ParametersJSON Schema
NameRequiredDescriptionDefault
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/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 of behavioral disclosure. It states the tool 'Get[s] server health and service status,' implying a read-only operation, but doesn't clarify aspects like authentication requirements, rate limits, response format, or whether it's safe for frequent use. This leaves significant gaps for an agent to understand operational constraints.

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 extremely concise—a single, clear sentence that front-loads the core purpose without any wasted words. It efficiently communicates the essential action and target, making it easy for an agent to parse and understand quickly.

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?

For a tool with no annotations and no output schema, the description is insufficiently complete. It lacks details on behavioral traits (e.g., safety, response format) and doesn't address usage relative to siblings, leaving the agent with incomplete context to operate effectively in a complex server management environment.

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

Parameters3/5

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

The input schema has 100% description coverage, with the single parameter 'server' documented as optional and defaulting to 'defaultServer.' The description adds no additional parameter semantics beyond what the schema provides, such as examples or context for server names. Given the high schema coverage, a baseline score of 3 is appropriate, as the description doesn't compensate but also doesn't detract.

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's purpose with a specific verb ('Get') and resource ('server health and service status'), making it immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'faber_check_app' or 'faber_service_restart', which might also relate to health/status checks, leaving some ambiguity about its unique scope.

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?

The description provides no guidance on when to use this tool versus alternatives. With siblings like 'faber_check_app' and 'faber_service_restart' that could overlap in monitoring or troubleshooting contexts, there's no indication of prerequisites, exclusions, or comparative use cases, leaving the agent to guess based on tool names alone.

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

faber_service_restartC

Restart a system service (nginx, php, mysql, supervisor, redis)

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceYesService name: nginx, php, mysql, supervisor, or redis
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action ('Restart') which implies a mutation operation, but doesn't disclose critical behavioral traits such as whether this requires elevated permissions, if it's destructive (e.g., causes downtime), what happens if the service fails to restart, or any rate limits. The description is minimal and lacks the necessary context for safe and effective use.

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 extremely concise - a single sentence that efficiently communicates the core functionality. It's front-loaded with the main action and immediately specifies the applicable services. There's zero wasted language or unnecessary elaboration. Every word earns its place in this minimal but complete statement of purpose.

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?

Given this is a mutation tool with no annotations and no output schema, the description is insufficiently complete. While concise, it lacks critical information about what the tool actually does behaviorally (beyond the basic 'restart' action), what to expect as output, error conditions, or operational considerations. For a tool that potentially affects system services, more context about safety and behavior is needed.

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

Parameters3/5

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

The input schema has 100% description coverage, with clear documentation for both parameters including an enum for 'service' and optionality for 'server'. The description adds no additional parameter semantics beyond what's already in the schema. It lists the same service names as the enum but provides no extra context about parameter usage, format, or constraints. This meets the baseline of 3 when schema coverage is high.

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 action ('Restart') and the target ('system service'), and lists the specific services that can be restarted (nginx, php, mysql, supervisor, redis). It distinguishes this tool from siblings like faber_server_status or faber_check_app by focusing on service restart operations rather than monitoring or checking. However, it doesn't explicitly contrast with other potential service management tools that might exist elsewhere.

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?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing admin access), when not to use it (e.g., during peak hours), or what alternatives might exist among the sibling tools. The agent must infer usage from the tool name and description alone without explicit context.

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

faber_set_env_varC

Set a specific environment variable in an app's .env file

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesThe app username
keyYesEnvironment variable name (e.g., APP_DEBUG)
valueYesEnvironment variable value
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It implies a write operation ('Set') but does not specify permissions required, whether changes are reversible, potential side effects, or error handling. This is inadequate for a mutation tool without annotation support.

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, efficient sentence that directly states the tool's function without unnecessary details. It is front-loaded and wastes no words, making it highly concise and well-structured.

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?

Given the complexity of a write operation with no annotations and no output schema, the description is insufficient. It lacks details on behavioral traits, return values, or error conditions, leaving significant gaps for an AI agent to understand the tool fully.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema fully documents all parameters. The description adds no additional semantic context beyond what the schema provides, such as examples or constraints, resulting in a baseline score of 3.

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 verb ('Set') and resource ('a specific environment variable in an app's .env file'), making the purpose unambiguous. However, it does not explicitly differentiate from sibling tools like 'faber_get_env' (which likely retrieves environment variables), leaving room for improvement in sibling distinction.

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?

The description provides no guidance on when to use this tool versus alternatives, such as 'faber_get_env' for reading variables or other configuration tools. It lacks context about prerequisites, timing, or exclusions, offering minimal usage direction.

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

faber_webhook_logsC

View webhook execution logs

ParametersJSON Schema
NameRequiredDescriptionDefault
linesNoNumber of lines to show (default: 50)
serverNoServer name from config (optional, defaults to defaultServer)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. 'View' implies a read-only operation, but the description doesn't specify whether this requires authentication, what format the logs are returned in, whether there are rate limits, or if the logs are real-time or historical. Significant behavioral details are missing.

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 extremely concise - just four words that directly state the tool's function. There's zero wasted language, and the information is front-loaded effectively. This is an excellent example of efficient communication.

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?

For a logging tool with no annotations and no output schema, the description is insufficient. It doesn't explain what information the logs contain, their format, whether they're filtered or raw, or what the agent can expect to receive. Given the lack of structured metadata, the description should provide more operational context.

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

Parameters3/5

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

The input schema has 100% description coverage, with both parameters clearly documented in the schema itself. The description adds no additional parameter information beyond what's already in the structured schema, so it meets the baseline expectation but doesn't provide extra value.

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 verb ('View') and resource ('webhook execution logs'), making the purpose immediately understandable. However, it doesn't differentiate this tool from its sibling 'faber_app_logs', which appears to serve a similar logging function but for different resources.

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?

The description provides no guidance on when to use this tool versus alternatives. There's no mention of when webhook logs would be needed versus app logs, nor any prerequisites or contextual constraints for using this tool.

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

TDQS

A3.5/5.0
Disambiguation5/5

Every tool has a clearly distinct purpose targeting specific resources and actions, such as faber_create_database for database creation, faber_deploy for deployments, and faber_set_env_var for environment variable management. There is no overlap or ambiguity between tools, making it easy for an agent to select the correct one based on the task.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with the prefix 'faber_' and snake_case throughout, such as faber_list_apps, faber_create_domain, and faber_get_env. This predictable naming scheme enhances readability and usability for agents.

Tool Count4/5

With 17 tools, the count is slightly high but reasonable for the comprehensive scope of managing a Faber server, covering app deployment, domain setup, database management, and server operations. It is well-scoped with each tool serving a distinct function, though it borders on being heavy.

Completeness5/5

The tool set provides complete CRUD and lifecycle coverage for the Faber server domain, including creation (e.g., faber_create_stack), listing (e.g., faber_list_apps), updates (e.g., faber_set_env_var), and deletion implicitly through operations like rollback. There are no obvious gaps, and agents can handle full workflows from setup to maintenance.

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

  • A
    license
    B
    quality
    C
    maintenance
    Integrates Ploi.io API functionality into AI assistants for managing servers, sites, and databases through natural language. It enables features like one-command deployments, project linking, server log retrieval, and database backup management.
    46
    22
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables managing and deploying apps to your cloud directly from Cursor through natural language, including environment management, job monitoring, and approval workflows.
    1
    MIT

Appeared in Searches

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/JoshTrebilco/faber-mcp'

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