Skip to content
Back to crevio

Card snapshot

mcp.crevio.co · 2026-08-23 02:36:09 UTC · 8cc7f7991ec25d9dbb49021b40c922b9ace22fd1faa3f1cf88ba5a271350bd15

This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.

{
  "name": "crevio",
  "title": "Crevio MCP Server",
  "description": "Delegate work to the Crevio agent or call the Crevio API through code execution \u2014 products, customers, orders, and more",
  "version": "2.0.0",
  "url": "https://mcp.crevio.co/mcp",
  "serverUrl": "https://mcp.crevio.co/mcp",
  "serverInfo": {
    "name": "crevio",
    "version": "2.0.0"
  },
  "transport": {
    "type": "streamable-http",
    "endpoint": "https://mcp.crevio.co/mcp"
  },
  "protocol": "MCP Streamable HTTP",
  "protocolVersion": "2026-07-28",
  "supportedVersions": [
    "2026-07-28"
  ],
  "capabilities": {
    "tools": {}
  },
  "tools": [
    {
      "name": "whoami",
      "description": "Identify the account, user, and credential behind this connection, with plan, credit balance, rate limits, and the tools available. Call it first to verify the setup.",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      }
    },
    {
      "name": "ask_crevio",
      "description": "Delegate a job to the Crevio agent and wait for the result. Starts a run that works your account through the Crevio API (products, customers, orders, email, socials, sites, research), waits up to timeout_seconds, and returns the run with the agent's final reply in `result`. For anything longer, use start_task and wait_for_run.",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      }
    },
    {
      "name": "start_chat",
      "description": "Open a chat with the Crevio agent and queue a run, without waiting. Returns the run immediately \u2014 its `chat_id` is the conversation to continue with send_message. Follow the run with wait_for_run or get_run.",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      }
    },
    {
      "name": "list_chats",
      "description": "List the account's chats, newest first.",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      }
    },
    {
      "name": "get_chat",
      "description": "Get a chat's title, kind, and latest run.",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      }
    },
    {
      "name": "send_message",
      "description": "Continue a chat with follow-up instructions or answers \u2014 the agent keeps its context. Resumes a run waiting in needs_input, or queues a new run when the last one finished. Returns run_busy while a run is still in progress. Optionally waits for the reply.",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      }
    },
    {
      "name": "list_messages",
      "description": "Read a chat's messages, oldest first. Returns the most recent `limit` messages; page back through older ones with starting_after.",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      }
    },
    {
      "name": "wait_for_run",
      "description": "Wait for a run to settle (completed, failed, or needs_input) and return it with the agent's final reply. Returns wait_timed_out if it is still running when the timeout passes; call again.",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      }
    },
    {
      "name": "get_run",
      "description": "Fetch a run's current status, summary, pending approvals, and (once settled) the agent's final reply.",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      }
    },
    {
      "name": "list_runs",
      "description": "List the account's task runs, newest first \u2014 delegated jobs and scheduled tasks alike. Filter by status or task.",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      }
    },
    {
      "name": "resolve_approvals",
      "description": "Approve or deny the integration actions a run is paused on (status needs_input with pending_approval_ids). Submit a decision for every pending id at once; the run resumes in the background.",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      }
    },
    {
      "name": "cancel_run",
      "description": "Stop a run that is pending, running, or waiting for input. The run is finalized as failed with 'Cancelled by the caller'.",
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      }
    },
    {
      "name": "api_search",
      "description": "Discover available Crevio API endpoints. Use this BEFORE `api_execute` when you're unsure which endpoint to call, need to check parameter names, or want to explore what's available for a domain (e.g. \"experiences\", \"discounts\"). A `tools` method returns the full API catalog \u2014 an array of hashes keyed with strings: \"method\", \"path\", \"summary\", \"description\", \"tags\", \"parameters\", \"request_body\". Examples: `tools.select { |t| t[\"tags\"]&.include?(\"Products\") }.map { |t| \"#{t[\"method\"]} #{t[\"path\"]} \u2014 #{t[\"summary\"]}\" }` `tools.find { |t| t[\"path\"].include?(\"price_variants\") && t[\"method\"] == \"POST\" }[\"request_body\"]` `tools.map { |t| t[\"tags\"] }.flatten.compact.uniq.sort` \u2014 list all API domains",
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      }
    },
    {
      "name": "api_execute",
      "description": "Execute Ruby in a sandboxed VM against the Crevio REST API. Use `api_search` first\nto find the endpoint and its body fields, then call it here. Chain calls, transform\nresults, return the final expression.\n\n## Available in your code\n\n```\nget(path, params = {})    # paths auto-prefixed with /v1, routed in-process\npost(path, **body)        # body as keyword args or a hash \u2014 both work\npatch(path, **body)\ndelete(path)\nfind_endpoints(query)     # -> [\"METHOD /path \u2014 summary\", ...]\niso8601(offset_seconds = 0)  # mruby Time has no strftime/iso8601\n```\n\nReturns the **last expression**; `puts` is side-channel only. Every run answers\n`{result:, calls:, output:}` \u2014 `calls` audits each REST call (`method`, `path`,\n`status`, plus `error_code`/`param` on failure). When `result` has unexpected nils,\nread `calls` for a non-2xx. Never project only success fields (`{id: r[\"id\"]}`) \u2014\nthat hides the error from `result`.\n\n## Rules that the schema does not tell you\n\n- Params are unwrapped, Stripe-style: fields at the TOP level. `{product: {...}}` is\n  silently dropped by most endpoints.\n- Associations take the bare resource name and a prefix_id string \u2014 `product: \"prod_x\"`,\n  never `product_id:`. Some required ones never appear in a schema's `properties`.\n- Courses and content live under `/experiences`, NOT `/products`.\n- Lists answer `{object: \"list\", data: [...], has_more}`; single resources answer the\n  object directly.\n- Connected integrations go through the same REST surface:\n  `post(\"/connections/<id>/execute\", tool: \"<tool>\", arguments: {...})`, with ids from\n  `get(\"/connections\", search: \"<service>\")`.\n- Sandboxed mruby: no `File`, `ENV`, `Net::HTTP`, `Process`. 10s, 10 MB.\n\n## Example \u2014 publishing a product (the ordering trap)\n\nA product cannot be created active: it needs a price variant first, or the call 422s.\n\n```ruby\nproduct = post(\"/products\", name: \"...\")\npost(\"/price_variants\", product: product[\"id\"], name: \"Standard\",\n     amount_type: \"fixed\", amount: 4900, currency: \"usd\", billing_type: \"one_time\")\npatch(\"/products/#{product[\"id\"]}\", status: \"active\")\n```\n\nAPI groups: Access, Account, Ads, Analytics, ApiKeys, Approvals, Audio, BlogCategories, BlogPosts, Bookings, Bots, Broadcasts, Calls, Chapters, CheckoutLinks, Checkouts, Connections, Customers, Deployments, Discounts, Domains, Email, EventSessions, EventSources, EventTypes, Events, Experiences, Files, FormSubmissions, FormationDocuments, Formations, Forms, ForumPosts, Images, Invoices, Jobs, Leads, LegalPages, Lessons, LinkItems, Logs, Me, OrderItems, Orders, Phone Consents, Phone Numbers, Phone Suppressions, PriceVariants, Products, Refunds, Reviews, Schedules, Secrets, Sites, Skills, Socials, Status, Subscriptions, Tags, TaskRuns, Tasks, Topics, Usage, Users, Video, Web, WebhookEndpoints, WebhookEvents.\n",
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      }
    }
  ],
  "auth": {
    "type": "oauth2",
    "protected_resource_metadata": "https://mcp.crevio.co/.well-known/oauth-protected-resource"
  }
}