Skip to main content
Glama
brynj-digital

laravel-forge-readonly-mcp

Forge API Read (any endpoint)

forge_get
Read-onlyIdempotent

Fetch data from documented Laravel Forge API GET endpoints not covered by named tools, like monitors, firewall rules, or PHP config, via a relative path and query parameters. Requests are read-only.

Instructions

Perform an arbitrary GET against the Forge API for endpoints the named tools do not cover — monitors, firewall rules, Nginx templates, recipes, teams, PHP config, heartbeats, providers and so on. Pass a path relative to the API base with real ids substituted, e.g. "/orgs/acme/servers/12345/monitors". Only documented Forge GET endpoints are permitted: writes are impossible, and a small set of reads that would expose secrets (.env contents, registry and provider credentials, SSH and deploy keys) or hand over a deploy capability (the deployment trigger URL) are refused with an explanation. Query parameters go in query, not in the path — e.g. {"page[size]": 50}.

Input Schema

NameRequiredDescriptionDefault
pathYesAPI path with ids filled in, starting with "/" and with no query string, e.g. /orgs/acme/servers/12345/monitors
queryNoQuery parameters, e.g. {"page[size]": 50, "sort": "-created_at"}.
tail_linesNoReturn only the last N lines, where failures appear (default 200). Output is additionally capped by character count, so a very long single line cannot flood the response.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.3.0
    • addedInput schema / properties / tail_lines
      Added value: +{
      +  "description": "Return only the last N lines, where failures appear (default 200). Output is additionally capped by character count, so a very long single line cannot flood the response.",
      +  "exclusiveMinimum": 0,
      +  "maximum": 5000,
      +  "type": "integer"
      +}
  2. First observedv0.1.0

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint/idempotentHint/openWorldHint, yet the description adds substantial non-derivable behavior: writes are impossible, only documented GET endpoints are permitted, and a specific deny-list (.env contents, registry/provider credentials, SSH and deploy keys, deployment trigger URL) is refused with an explanation. That is exactly the failure-mode disclosure an agent needs before composing an arbitrary path.

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?

Three sentences, all front-loaded: scope/routing first, then path semantics, then the refusal policy and query-param placement. Every sentence carries information that changes how the tool is called; no filler or restatement of the name.

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

Completeness5/5

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

For an open-world passthrough tool with no output schema, the description covers the crucial risks: what is allowed, what is refused and why, how to format the path and query, and concrete examples. The only unaddressed item, rate limits, is secondary; an agent has enough to call this safely and correctly.

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%, so baseline is 3; the description still adds real semantic value by explaining that `path` must be relative to the API base with real ids substituted (with a worked example) and that query parameters belong in `query`, not in the path. It does not discuss `tail_lines`, but the schema documents that field thoroughly.

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?

States a specific verb (arbitrary GET) and resource (the Forge API), and immediately frames itself as the escape hatch for endpoints the named sibling tools do not cover, listing concrete resource families (monitors, firewall rules, Nginx templates, recipes, teams, PHP config, heartbeats, providers). An agent can distinguish it from get_server/list_sites etc. without opening any schema.

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 routing: use this only for endpoints the named tools do not cover, with the alternative (the named per-resource tools) implied as the default choice. It also tells the agent when the tool will refuse (secret-exposing reads, deploy trigger URL), which is actionable usage guidance rather than general prose.

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