MCP server for managing blockchain-based payroll on Solana using the Anchor framework. Provides tools for organization management, worker management, treasury funding, and payroll processing.
This MCP server has 15 tools with basic schemas and descriptions, but significant quality gaps prevent production readiness. All tools have descriptions (10-100 chars, mostly adequate), and input schemas are present with type definitions. However, parameter descriptions are sparse or missing entirely, most params lack actionable guidance on format, constraints, or dependencies. Output schemas are completely undocumented; the code shows tool execution but no structured response definitions. Error handling is minimal: tools return generic error objects without recovery guidance or categorization. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk distinctions (WRITE vs READ_ONLY). Tool composition is reasonable, each tool has one responsibility, but critical chaining IDs are not guaranteed in responses (e.g., create_organization likely returns orgPda, but this is not documented). Security concerns: wallet context is passed via module-level state rather than per-request injection, and no audit logging is visible. Naming is verb-first and clear (create_organization, fetch_user_organizations), meeting baseline conventions. Overall, the server is functional but lacks the rigor expected of production-grade agent tools.
Add a worker to an organization with a specified salary
Calculate the next payroll date based on the last payroll cycle
Calculate the total cost to pay all workers in an organization
Check if payroll is due for an organization
Create a new organization on the blockchain. Requires wallet connection.
Fetch all organizations on the blockchain
Fetch detailed information about a specific organization
Fetch all workers for a specific organization
Output schemas completely undocumented. No tool returns a documented structure, LLMs cannot infer what fields to expect or plan downstream calls. E.g., create_organization likely returns orgPda, but this is not declared.
Parameter descriptions missing or minimal. orgPda, workerPublicKey, walletPublicKey, amountInSol lack format guidance (e.g., 'Solana public key as base58 string', 'SOL amount as decimal, e.g., 1.5'). LLMs cannot validate input without explicit constraints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 41 | 2026-07-28+ | v2 |
Fetch all organizations created by the connected wallet
Fetch detailed information about a specific worker
Fetch all worker records for a specific wallet address
Add funds to an organization treasury
Get the current balance of an organization treasury
Process payroll for all workers in an organization
Withdraw funds from an organization treasury
No tool annotations despite clear risk distinctions. WRITE tools (create_organization, add_worker, fund_treasury, process_payroll, withdraw_from_treasury) lack destructiveHint=true. READ_ONLY tools lack readOnlyHint=true. Agents cannot distinguish safe from risky operations.
Error handling is generic. Tools return {error: 'message'} without recovery guidance or error classification. E.g., 'Wallet not connected' should suggest 'Call setWalletContext() first' or guide the user to connect their wallet.
Wallet context is module-level state (setWalletContext), not per-request. This violates stateless request handling and breaks multi-user/multi-agent scenarios. Each request should carry its own wallet context or signing capability.