{
  "$schema": "https://static.modelcontextprotocol.io/schemas/mcp-server-card/v1.json",
  "version": "1.0",
  "protocolVersion": "2025-06-18",
  "serverInfo": {
    "name": "bennybooks",
    "title": "BennyBooks",
    "version": "1.0.0"
  },
  "description": "AI-friendly accounting for small companies. Connect via Streamable HTTP MCP at /api/mcp with a bb_live_ token. Writes are proposals until a human approves. OpenAPI + AnythingMCP remains supported.",
  "documentationUrl": "https://bennybooks.com/developers/guides/mcp-server.md",
  "transport": {
    "type": "streamable-http",
    "endpoint": "https://bennybooks.com/api/mcp"
  },
  "authentication": {
    "required": true,
    "schemes": [
      "bearer"
    ]
  },
  "instructions": "Read /auth.md for token issuance (Settings → MCP & agents). Prefer Streamable HTTP at /api/mcp with Authorization: Bearer bb_live_… Alternatively import /openapi.json into an MCP bridge (AnythingMCP). Prefer categoryCode; never auto-post journal entries. Do not pass org_id — the token is org-scoped.",
  "capabilities": {
    "tools": {},
    "resources": {},
    "prompts": {}
  },
  "tools": [
    {
      "name": "get_ontology",
      "description": "Load the public BennyBooks ontology (JSON-LD): chart codes, synonyms, and seed counterparties"
    },
    {
      "name": "list_categories",
      "description": "Return this org's chart of accounts with stable codes, synonyms, and inUse flags"
    },
    {
      "name": "list_transactions",
      "description": "List ledger rows for the token's organization"
    },
    {
      "name": "get_transaction",
      "description": "Fetch one transaction plus linked notes and receipts"
    },
    {
      "name": "get_dashboard_summary",
      "description": "Org financial snapshot and workload: revenue, expenses, cashPosition, uncategorized, missingReceipts, agentSuggested (pending proposals count), notifications"
    },
    {
      "name": "search_receipts",
      "description": "Search receipt file names and OCR text by query string q"
    },
    {
      "name": "list_connectors",
      "description": "Show bank/payment connectors with provider, lastSyncAt, and syncStatus (ok|error|stale)"
    },
    {
      "name": "import_revolut_csv",
      "description": "Ingest a Revolut statement CSV into the ledger"
    },
    {
      "name": "list_pending_proposals",
      "description": "List agent proposals awaiting human approval"
    },
    {
      "name": "propose_categorization",
      "description": "Propose a category for an existing transaction"
    },
    {
      "name": "propose_journal_entry",
      "description": "Propose a new manual ledger row (date, amount, currency, description, optional categoryCode)"
    },
    {
      "name": "propose_receipt_link",
      "description": "Propose linking an existing receiptId to a transactionId"
    },
    {
      "name": "attach_note",
      "description": "Propose attaching a free-text note to a transaction (approval-gated; audit-logged in Log)"
    }
  ],
  "_meta": {
    "io.bennybooks/integration": {
      "mode": "streamable-http",
      "mcp": "https://bennybooks.com/api/mcp",
      "openapi": "https://bennybooks.com/openapi.json",
      "auth": "https://bennybooks.com/auth.md",
      "skill": "https://bennybooks.com/skill.md",
      "cli": "npx @bennybooks/cli",
      "agentSetup": "npx @bennybooks/cli agent setup",
      "cliGuide": "https://bennybooks.com/developers/guides/cli.md",
      "anythingmcpYaml": "https://bennybooks.com/developers/guides/anythingmcp.md",
      "curatedToolsDoc": "https://bennybooks.com/developers/guides/mcp-design.md"
    }
  }
}
