Server-side policy middleware for MCP servers and Node APIs with spend limits, approvals, schema drift checks, and signed receipts
ActionFence is a policy middleware library, not a primary MCP server. The 6 example tools have basic schemas and descriptions but significant gaps. Tool names are clear (search_flights, book_flight, check_status, bulk_booking, search_orders, delete_order), but descriptions are minimal (10-50 chars, well below the 194-char baseline). Parameters lack descriptions in most cases. No output schemas documented. Error handling and recovery guidance absent. The library itself focuses on policy enforcement (spend caps, approvals, schema drift) rather than tool quality. Example tools are illustrative but not production-grade.
Book a specific flight (requires verified identity)
Book multiple flights at once (blocked by policy)
Check the status of a booking
Delete an order by id
Search available flights by route and date
Search customer orders by query
Tool descriptions are critically short (10-50 chars vs 194-char baseline). Descriptions like 'Search available flights by route and date' lack context on when to use, prerequisites, or what the LLM should expect. LLMs cannot reliably select tools without richer descriptions.
Parameter descriptions are missing or absent. The 'origin', 'destination', 'date' params in search_flights have descriptions, but many tools lack parameter-level documentation. LLMs cannot infer what 'query' means in search_orders or 'orderId' in delete_order without explicit descriptions.
No output schemas documented. Tools return results but the response structure is not specified. LLMs cannot plan downstream calls or extract required fields (e.g., flight_id from search_flights to pass to book_flight) without knowing the response shape.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | 2026-07-28+ | v2 |
No error handling or recovery guidance. Tools lack descriptions of failure modes, retryability, or what the LLM should do if a call fails. E.g., book_flight may fail due to insufficient funds, invalid flight_id, or sold-out flight, but no guidance is provided.
Destructive tool (delete_order) lacks confirmation or dry-run support. No description warns the LLM that this is irreversible. No confirmation_request pattern implemented to prevent accidental deletions.