An MCP server that interacts with all Adfin public APIs.
This server has severe definition quality issues across all dimensions. Tool descriptions are minimal (mostly under 20 characters), parameter documentation is almost entirely absent, and schemas are either missing or inferred rather than explicitly defined. The dynamic tool registration via exec() makes it impossible to verify actual schemas at static analysis time. Critical security concerns: credentials passed as environment variables but loaded at module init, no input validation, no error recovery guidance. The filesystem tools (get_cwd, list_cwd, etc.) lack descriptions entirely or are trivial. The API tools are generated dynamically with generic docstrings that provide minimal guidance. No pagination support, no structured output documentation, no error categorization.
Get the current working directory.
Get the files from the current working directory.
Make the Desktop the current working directory.
Make a folder the current working directory. That folder must be present in the previous cwd.
Search recursively for a file starting from the current working directory given the exact name of the file. The file format of the file must be provided.
Search recursively for a file or folder starting from the current working directory.
Upload an invoice to Adfin given its absolute path.
Dynamically generated tools via exec(), schemas cannot be verified statically. Tool definitions are inferred from string templates rather than explicitly registered. Per HARD SCORING RULE: if tool definitions are inferred rather than directly visible, cap per-tool scores at 50.
Filesystem tools (get_cwd, list_cwd, make_desktop_cwd) have no descriptions or descriptions under 20 characters. Per HARD SCORING RULE: descriptions under 20 chars must score 0-20. Violates pattern:tool-description, every tool needs non-empty description explaining WHAT, WHEN, and WHY.
No input schema documentation. Parameters lack type declarations and descriptions. search_for_file accepts 'file_name' string but no schema visible in code. upload_invoice_to_adfin has a basic schema visible (invoice_path: string) but lacks constraints, format, or error guidance. Most tools have no documented return types.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 35 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 34 | - | v1 |
Credentials loaded at module init (adfin_interaction.py: Environment.get('ADFIN_EMAIL'), Environment.get('ADFIN_PASSWORD')), these are environment variables, not injected safely. No secret redaction in error responses. Violates pattern:secret-injection, secrets must never appear in tool parameters or responses.
Error handling is minimal and non-actionable. adfin_interaction.py returns generic messages like 'Error: {status_code} {text}' with no guidance on recovery. Violates pattern:recovery-guide, errors must tell the LLM what to do next (retry, lookup alternatives, ask user).
No input validation or constraint checking. upload_invoice_to_adfin accepts any string as invoice_path, no check for file existence, PDF format, or size limits. No actionable error messages if file is invalid or missing.
Filesystem tools operate on shared mutable state (current working directory). No isolation between agent calls, one agent changing cwd affects all subsequent calls. Violates pattern:stateless-handler. This is particularly risky in concurrent or multi-agent scenarios.
Dynamically generated API tools have generic, machine-generated descriptions ('Get post create_and_send_email', 'Modify ticket'). Violates pattern:tool-description, descriptions must state WHAT the tool does, WHEN to use it, and any prerequisites. Machine-generated text fails to guide LLM tool selection.
No pagination support. API tools accept request_data dict but no limit/offset/cursor parameters visible. If API returns large lists, responses could exhaust context window. Violates pattern:paginated-result.
No tool composition or chaining support documented. API tools are dynamically registered with unknown relationships. No documentation of which tools chain together or what IDs/references are passed between them. Violates pattern:tool-chain.