Skip to content

Method CRM MCP by usefulapi

io.usefulapi/method-crmusefulapi.iostreamable-httpv1.0.0Scanned

Query Method CRM customers, leads, activities and invoices; create and update records.

16 tools: 4 can delete or cancel things and 12 only read.

Tools: 4 delete, 0 irreversible, 0 write, 12 read.
  • Reads private data · 10
  • Reads text others write · 16
  • Can send data out · 0
  • No findings

Anlyon alternative

4 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

16 tools

Deletes or cancels 4Claude Code: deny
  • method_create_activityWRITE: logs an activity (call, email, to-do, note) on a customer/lead.Reads text others writeNo findings

    Why it is in this group

    • The name "method_create_activity" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: logs an activity (call, email, to-do, note) on a customer/lead. entity_id is the Customer RecordID; contact_id is the Contact RecordID (not the Customer's; method_list_contacts finds it). The text goes in Comments. Prefer activity_type_id (read it from an existing activity of that type) over the caption activity_type: a caption that matches zero or several options is silently dropped. Method requires an assignee on standard accounts. The reply re-reads the activity so you can check the links were stored (field names are account-specific; method_get_table_fields with table Activity shows them). It does not email anyone. Not idempotent. POST /api/v1/tables/Activity.

    Annotations the server declares

    • title: Log an activity
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • method_create_customerWRITE: creates a record in Method's Customer table.Reads text others writeNo findings

    Why it is in this group

    • The name "method_create_customer" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: creates a record in Method's Customer table. is_lead true = a Customer Lead (does not sync to the accounting system); is_lead false = a full customer, which Method syncs to QuickBooks/Xero (it appears there too). Method also creates the primary Contact; its RecordID is returned as contact_id when it could be found (use it, not the customer id, to link activities). Name is required (for a person with no company use "First Last"). `extra_fields` sets other fields by their exact names (see method_get_table_fields, table Customer). Not idempotent: calling twice creates two records, so search first (method_search_customers). POST /api/v1/tables/Customer.

    Annotations the server declares

    • title: Create customer or lead
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • method_create_recordWRITE: creates a record in any table that allows it (method_list_tables shows canCreate), e.g.Reads text others writeNo findings

    Why it is in this group

    • The name "method_create_record" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: creates a record in any table that allows it (method_list_tables shows canCreate), e.g. Estimate, Invoice, Item, Vendor. For customers/leads and activities use the dedicated tools. Field names are case-sensitive and a wrong one is silently ignored: read them with method_get_table_fields first, and send dropdown links as their `_RecordID` integer. Creating accounting records (Invoice, Estimate, Customer ...) makes Method sync them to QuickBooks/Xero. Child lines (InvoiceLine ...) are not supported here. Not idempotent. Returns the new RecordID. POST /api/v1/tables/{table}.

    Annotations the server declares

    • title: Create a record
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • method_update_recordWRITE: changes fields on one record (PATCH: only the fields you pass change).Reads text others writeNo findings

    Why it is in this group

    • The name "method_update_record" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: changes fields on one record (PATCH: only the fields you pass change). Field names are case-sensitive and Method silently ignores wrong or read-only names, so the reply re-reads the record and shows the stored values of the fields you sent: check them. Linked fields are changed through their `_RecordID` integer field. Updating accounting records (Customer, Invoice ...) makes Method sync the change to QuickBooks/Xero; setting IsLeadStatusOnly to false converts a lead into a synced customer. There is no delete tool. PATCH /api/v1/tables/{table}/{recordId}.

    Annotations the server declares

    • title: Update a record
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
Only reads 12Show 12 read-only tools
  • method_count_recordsHow many records a table has, optionally matching a filter (same filter syntax as method_query_records).Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "method_count_records" says "count": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "table": it reads databases.
    • private-dataThe input names a table (input.table), and the tool reads: it reads databases.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    How many records a table has, optionally matching a filter (same filter syntax as method_query_records). Cheap: call it before paging through a big table. GET /api/v1/tables/{table}/count.

    Annotations the server declares

    • title: Count records
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • method_get_accountWho the API key acts as: the Method user behind it (id and name; use the id as an assignee).Reads text others writeNo findings

    Why it is in this group

    • The name "method_get_account" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Who the API key acts as: the Method user behind it (id and name; use the id as an assignee). Also a cheap check that the key works. GET /api/v1/me.

    Annotations the server declares

    • title: Get API key owner
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • method_get_file_urlA temporary download link (valid 20 minutes) for an attached file, by the file id from method_list_files.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "method_get_file_url" says "get": a word for reading.

    What it can reach

    • private-dataThe name "method_get_file_url" says "get" and "file": it reads files.
    • private-dataThe description's first sentence says "file": it reads files.
    • private-dataThe input names a file (input.file_id), and the tool reads: it reads files.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe name "method_get_file_url" says "get" and "url": it reads web pages, which anyone can write.
    Description, as the server wrote it
    A temporary download link (valid 20 minutes) for an attached file, by the file id from method_list_files. The link works without the API key: share it only with someone allowed to see the file. GET /api/v1/files/{id}/url.

    Annotations the server declares

    • title: Get file download link
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • method_get_recordOne record by RecordID from any table.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "method_get_record" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "table": it reads databases.
    • private-dataThe input names a table (input.table), and the tool reads: it reads databases.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One record by RecordID from any table. Pass `select` to limit the columns; `expand` names a related CHILD table whose rows are embedded (e.g. InvoiceLine on Invoice; at most 50 rows); a parent such as a contact's Entity is not expanded: read it with its own RecordID (Entity_RecordID). GET /api/v1/tables/{table}/{recordId}.

    Annotations the server declares

    • title: Get record
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • method_get_table_fieldsThe exact field names of a table with type, whether required, creatable and mutable, and for dropdowns the table they reference.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "method_get_table_fields" says "get": a word for reading.

    What it can reach

    • private-dataThe name "method_get_table_fields" says "get" and "table": it reads databases.
    • private-dataThe description's first sentence says "table": it reads databases.
    • private-dataThe input names a table (input.table), and the tool reads: it reads databases.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    The exact field names of a table with type, whether required, creatable and mutable, and for dropdowns the table they reference. Use it to pick `select` fields and to name fields in create/update calls (names are case-sensitive and wrong ones are silently ignored). GET /api/v1/tables/{table}/fields.

    Annotations the server declares

    • title: Get table fields
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • method_list_activitiesList activities (calls, emails, to-dos, notes), newest first.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "method_list_activities" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "list" and "email": it reads mail.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe description's first sentence says "list" and "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    List activities (calls, emails, to-dos, notes), newest first. Filter by the entity they belong to, the assigned user or a due-date window. The note text is in Comments. Override `select` for other fields (method_get_table_fields with table Activity). GET /api/v1/tables/Activity.

    Annotations the server declares

    • title: List activities
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • method_list_contactsList contacts (people), optionally those of one customer/lead entity (entity_id = the Customer's RecordID) or matching text in name/email/phone.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "method_list_contacts" says "list": a word for reading.

    What it can reach

    • private-dataThe name "method_list_contacts" says "list" and "contact": it reads contacts.
    • private-dataThe description's first sentence says "list" and "contact": it reads contacts.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe description's first sentence says "list" and "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    List contacts (people), optionally those of one customer/lead entity (entity_id = the Customer's RecordID) or matching text in name/email/phone. Returns RecordID, name, email, phone, the entity link and active flag. Use a Contact's RecordID (not the Customer's) when linking activities. GET /api/v1/tables/Contacts.

    Annotations the server declares

    • title: List contacts
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • method_list_filesList the files attached to a record (name, size, who added it, id).Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "method_list_files" says "list": a word for reading.

    What it can reach

    • private-dataThe name "method_list_files" says "list" and "file": it reads files.
    • private-dataThe description's first sentence says "list" and "file": it reads files.
    • private-dataThe input names a table (input.table), and the tool reads: it reads databases.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List the files attached to a record (name, size, who added it, id). Use the id with method_get_file_url. GET /api/v1/files.

    Annotations the server declares

    • title: List files on a record
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • method_list_invoicesList invoices, newest first, optionally only unpaid ones (BalanceRemaining > 0), one customer's (customer_id = Customer RecordID) or created since a time.Reads text others writeNo findings

    Why it is in this group

    • The name "method_list_invoices" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List invoices, newest first, optionally only unpaid ones (BalanceRemaining > 0), one customer's (customer_id = Customer RecordID) or created since a time. Returns reference number, customer, dates, amount and balance; override `select` for other fields. For totals use method_query_records with `apply`. GET /api/v1/tables/Invoice.

    Annotations the server declares

    • title: List invoices
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • method_list_tablesList every table on this Method account (standard QuickBooks/Xero/Method tables and custom ones) with its source and whether it can be created, updated or deleted.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "method_list_tables" says "list": a word for reading.

    What it can reach

    • private-dataThe name "method_list_tables" says "list" and "table": it reads databases.
    • private-dataThe description's first sentence says "list" and "table": it reads databases.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List every table on this Method account (standard QuickBooks/Xero/Method tables and custom ones) with its source and whether it can be created, updated or deleted. Tables differ per account: call this before querying a table you are unsure of. GET /api/v1/tables.

    Annotations the server declares

    • title: List tables
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • method_query_recordsQuery any table (Customer, Contacts, Activity, Invoice, Estimate, Item, Users, custom tables ...).Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "method_query_records" says "query": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "query" and "table": it reads databases.
    • private-dataThe input names a table (input.table), and the tool reads: it reads databases.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Query any table (Customer, Contacts, Activity, Invoice, Estimate, Item, Users, custom tables ...). Always pass `select`. `filter` uses OData-style syntax: strings in single quotes, dates as '2026-05-26T00:00:00Z' with Z or an offset, operators eq ne lt gt le ge and or not, functions contains(Name,'x') startswith() endswith(); e.g. "BalanceRemaining gt 0 and DueDate lt '2026-10-01T00:00:00Z'". `apply` runs server-side aggregation instead of listing rows, e.g. "aggregate(BalanceRemaining with sum as Outstanding)" or "groupby((Customer), aggregate(Amount with sum as Total))". Default order is RecordID ascending (stable paging); page with next_skip. GET /api/v1/tables/{table}.

    Annotations the server declares

    • title: Query records
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • method_search_customersFind customers and leads (the Customer table: Customers & Leads in Method) by text in the name or email, by lead/customer type, or list them all.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "method_search_customers" says "search": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "find" and "table": it reads databases.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe description's first sentence says "find" and "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    Find customers and leads (the Customer table: Customers & Leads in Method) by text in the name or email, by lead/customer type, or list them all. Returns RecordID, name, email, phone, lead flag and status; override `select` for other fields (see method_get_table_fields with table Customer). Page with next_skip. GET /api/v1/tables/Customer.

    Annotations the server declares

    • title: Search customers and leads
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged outbound.

Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Findings

Matches of fixed checks, with the text they matched.

No check matched anything in these tool definitions. That is not a safety guarantee.

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http method-crm https://method-crm.usefulapi.io/mcp
claude mcp add --transport http method-crm https://method-crm.usefulapi.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__method-crm__method_get_account",
      "mcp__method-crm__method_list_tables",
      "mcp__method-crm__method_get_table_fields",
      "mcp__method-crm__method_query_records",
      "mcp__method-crm__method_count_records",
      "mcp__method-crm__method_get_record",
      "mcp__method-crm__method_search_customers",
      "mcp__method-crm__method_list_contacts",
      "mcp__method-crm__method_list_activities",
      "mcp__method-crm__method_list_invoices",
      "mcp__method-crm__method_list_files",
      "mcp__method-crm__method_get_file_url"
    ],
    "ask": [],
    "deny": [
      "mcp__method-crm__method_create_customer",
      "mcp__method-crm__method_create_activity",
      "mcp__method-crm__method_create_record",
      "mcp__method-crm__method_update_record"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as method-crm. Review it before you use it.

Capability tags behind 16 rules
  • mcp__method-crm__method_get_account untrusted-input
  • mcp__method-crm__method_list_tables private-data, untrusted-input
  • mcp__method-crm__method_get_table_fields private-data, untrusted-input
  • mcp__method-crm__method_query_records private-data, untrusted-input
  • mcp__method-crm__method_count_records private-data, untrusted-input
  • mcp__method-crm__method_get_record private-data, untrusted-input
  • mcp__method-crm__method_search_customers private-data, untrusted-input
  • mcp__method-crm__method_list_contacts private-data, untrusted-input
  • mcp__method-crm__method_list_activities private-data, untrusted-input
  • mcp__method-crm__method_list_invoices untrusted-input
  • mcp__method-crm__method_list_files private-data, untrusted-input
  • mcp__method-crm__method_get_file_url private-data, untrusted-input
  • mcp__method-crm__method_create_customer untrusted-input
  • mcp__method-crm__method_create_activity untrusted-input
  • mcp__method-crm__method_create_record untrusted-input
  • mcp__method-crm__method_update_record untrusted-input

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/io.usefulapi/method-crm/verify?hash=d4f8697fe8badba2200f6461c0a04c7205157d9fe3149f49c45bb5eee2874ac7" | jq -e '.changed == false'

Pinned hash d4f8697fe8ba, from Oct 24, 2026, 12:18 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/io.usefulapi/method-crm/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for io.usefulapi/method-crm
[![anlyon.dev](https://anlyon.dev/badge/io.usefulapi/method-crm.svg)](https://anlyon.dev/servers/io.usefulapi/method-crm)

Source: MCP Registry · repository. Synced Oct 24, 2026, 12:17 UTC.