Skip to main content
Glama

Grade a volunteer form

grade_form
Read-only

Grade a blank volunteer form from pasted text or a document URL. No API key. Send a url or text, not both. Uses the on-server grader only: Workers AI and other models stay off. Returns score, letter grade, fixes (the top recommendations), and reportUrl (/tools/r/{id}) for the public share page when one is stored. Restricted fields such as Social Security numbers are left out of parsed; the score still counts them. Anonymous use shares the Form Grader limit of 5 per network per day and counts toward the daily anonymous MCP cap. An organization hourly limit applies when an org API key with the forms:read scope is sent. Does not grade a saved form.

Input Schema

NameRequiredDescriptionDefault
urlNohttps URL of a blank volunteer form.
textNoPasted blank form text.

Output Schema

NameRequiredDescriptionDefault
fixesYesTop fixes, the same recommendations as report.recommendations.
gradeYesLetter grade.
scoreYesScore from 0 to 100.
parsedYesParsed form. Restricted fields are left out.
parserNoSet on anonymous grades. Workers AI stays off.
reportYesFull grade report. Restricted field labels are left out.
reportIdYes
reportUrlNoPublic report path, /tools/r/{reportId}, when one is stored.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • addedInput schema / oneOf
      Added value: +[
      +  {
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "text"
      +          ]
      +        }
      +      ]
      +    },
      +    "required": [
      +      "url"
      +    ]
      +  },
      +  {
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "url"
      +          ]
      +        }
      +      ]
      +    },
      +    "required": [
      +      "text"
      +    ]
      +  }
      +]
    • addedInput schema / properties / text / description
      Added value: +"Pasted blank form text."
    • addedInput schema / properties / url / description
      Added value: +"https URL of a blank volunteer form."
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "fixes": {
      +      "description": "Top fixes, the same recommendations as report.recommendations.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "detail": {
      +            "description": "What to change on the form.",
      +            "type": "string"
      +          },
      +          "id": {
      +            "description": "Stable id for this fix.",
      +            "type": "string"
      +          },
      +          "severity": {
      +            "enum": [
      +              "critical",
      +              "high",
      +              "medium",
      +              "low"
      +            ],
      +            "type": "string"
      +          },
      +          "title": {
      +            "description": "Short name of the fix.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "severity",
      +          "title",
      +          "detail"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "grade": {
      +      "description": "Letter grade.",
      +      "enum": [
      +        "A",
      +        "B",
      +        "C",
      +        "D",
      +        "F"
      +      ],
      +      "type": "string"
      +    },
      +    "parsed": {
      +      "additionalProperties": true,
      +      "description": "Parsed form. Restricted fields are left out.",
      +      "properties": {
      +        "fields": {
      +          "items": {
      +            "additionalProperties": true,
      +            "properties": {
      +              "label": {
      +                "type": "string"
      +              },
      +              "type": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "label",
      +              "type"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "title": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "title"
      +      ],
      +      "type": "object"
      +    },
      +    "parser": {
      +      "const": "heuristic",
      +      "description": "Set on anonymous grades. Workers AI stays off.",
      +      "type": "string"
      +    },
      +    "report": {
      +      "additionalProperties": true,
      +      "description": "Full grade report. Restricted field labels are left out.",
      +      "properties": {
      +        "grade": {
      +          "enum": [
      +            "A",
      +            "B",
      +            "C",
      +            "D",
      +            "F"
      +          ],
      +          "type": "string"
      +        },
      +        "recommendations": {
      +          "items": {
      +            "additionalProperties": true,
      +            "properties": {
      +              "detail": {
      +                "type": "string"
      +              },
      +              "id": {
      +                "type": "string"
      +              },
      +              "severity": {
      +                "type": "string"
      +              },
      +              "title": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "id",
      +              "severity",
      +              "title",
      +              "detail"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "score": {
      +          "maximum": 100,
      +          "minimum": 0,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "score",
      +        "grade",
      +        "recommendations"
      +      ],
      +      "type": "object"
      +    },
      +    "reportId": {
      +      "type": "string"
      +    },
      +    "reportUrl": {
      +      "description": "Public report path, /tools/r/{reportId}, when one is stored.",
      +      "type": "string"
      +    },
      +    "score": {
      +      "description": "Score from 0 to 100.",
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "report",
      +    "parsed",
      +    "reportId",
      +    "score",
      +    "grade",
      +    "fixes"
      +  ],
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the readOnly/openWorld annotations: discloses that only the on-server grader is used (Workers AI and other models stay off), that restricted fields like SSNs are excluded from parsing but still counted in scoring, and details three separate rate-limit regimes (anonymous 5/network/day, daily anonymous MCP cap, org hourly limit with forms:read). This is exactly the kind of auth, cost, and constraint context annotations cannot carry.

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?

Purpose is front-loaded in the first sentence, followed by output shape and then limits in rough priority order. It is dense but nearly every sentence carries non-redundant information; the only blemish is the garbled clause 'left out of parsed'.

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?

An output schema exists, yet the description still names the key return fields (score, letter grade, fixes, reportUrl share page), covers input exclusivity, privacy handling, and all applicable rate limits. Nothing an agent needs to invoke it correctly is missing.

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 coverage is 100% and both parameters are documented there, including the oneOf mutual exclusion. The description's 'url or text, not both' restates what the schema already enforces, adding no format or semantic detail beyond it, so the baseline 3 applies.

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 and resource ('Grade a blank volunteer form') plus the two supported input modes (pasted text or document URL). It explicitly scopes itself against a sibling concept with 'Does not grade a saved form', so an agent can distinguish it from get_form/update_form without opening schemas.

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?

Gives usable context: 'Send a url or text, not both', 'No API key', and the exclusion 'Does not grade a saved form.' It stops short of naming an alternative sibling (e.g. preview_volunteer_form or get_form) for the saved-form case, so routing is inferred rather than explicit.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources