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.
- 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.
- Reads private data10
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write16
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- 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/mcpclaude mcp add --transport http method-crm https://method-crm.usefulapi.io/mcpRun 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.
{
"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.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/io.usefulapi/method-crm)Source: MCP Registry · repository. Synced Oct 24, 2026, 12:17 UTC.