https://mcp.metal.ai/mcp. Your AI client discovers these tools automatically after OAuth sign-in. Use this reference when building integrations, debugging tool calls, or understanding what data comes back.
Tool availability depends on your OAuth scopes and organization settings. If a tool is missing or returns
insufficient scope, your connection may not have been granted that permission.How tool calls work
Metal implements the Model Context Protocol over streamable HTTP. Your client sends JSON-RPC messages to/mcp; each tools/call request names a tool and passes a JSON arguments object.
Tool discovery and schemas
After OAuth sign-in, your MCP client discovers the exact live tool metadata from the server with the MCPtools/list method. That response is the source of truth for each tool’s description, inputSchema, and safety annotations.
Use this page as the human-readable reference for tool behavior, common parameters, scopes, response shapes, and examples. If you are generating code, validating arguments, or debugging a client integration, inspect the live inputSchema from tools/list instead of hardcoding this page’s parameter tables.
When you inspect a call in a client like Cursor, you typically see:
Response format
Every tool returns a text content block containing JSON (or a plain-text error message). Successful responses fall into three shapes: Single record — the JSON object is the payload directly:data and pagination:
data contains grouped documents and excerpts instead of a flat array:
Errors
When a call fails validation or the backend returns an error, the tool result is marked as an error and the text content holds a message:
Rate-limit errors return structured JSON in the error text:
Pagination
Most list and search tools use page mode (paginationMode: "page"). Pass page (default 1) and pageSize (default 20, max 50). Continue while hasMore is true.
get_list_entries uses cursor mode (paginationMode: "cursor"). Pass nextToken from the prior response to fetch the next page.
Field definitions for each resource type are available as MCP resources — see Resources below.
OAuth scopes
Tools require OAuth scopes granted during sign-in:Companies
search_companies
Search companies by name. Uses hybrid semantic + keyword matching on company names.
Scope: read:companies
website and linkedinUrl use the resolved observation value when available, with the native company field as a fallback. The remaining discovery fields keep their compact search representation.
list_companies
Browse companies with structured filters only — no text query. Use this for sector, tag, team, or location lists.
Scope: read:companies
Same filter parameters as search_companies except query is not accepted. At least one filter is required.
list_company_tags
List company tags so you can pass exact IDs to tagIds filters.
Scope: read:companies
Returns a paginated list of tag objects with
id and name.
get_companies
Retrieve selected resolved fields for exact company IDs. Use this when you already have IDs and need the same fields across many companies without loading each full profile.
Find IDs with search_companies or list_companies. Compact discovery results already return resolved website and linkedinUrl. Use get_company only when you need the full profile, including enrichedValues.
Scope: read:companies
id and canonicalName are always returned and must not appear in fields. relevance is returned only by search_companies and cannot be requested here. A request can contain at most 2,500 ID-field cells. For example, 500 IDs can request up to five fields. The server rejects responses above 512 KiB. Reduce the IDs or fields and retry when a response exceeds that limit.
Observation-backed fields such as website and linkedinUrl use the resolved observation value when available, with the native company field as a fallback. That is the compact equivalent of the values on a full get_company profile.
Use the metal://fields/companies MCP resource to discover standard selectable fields. It includes public native company fields (except relevance) and registered company observation fields. Use get_custom_field_definitions for organization-defined fields:
- Request schema custom fields as
custom.<key>, such ascustom.ideaPriorityStr. - Request custom financial metrics with their existing
custom:<key>names, such ascustom:arr. - Do not request the complete
custom,enrichedValues, ormetricCustommaps.
values; absent or unresolved values are null. Nonexistent or inaccessible records appear in missingIds without failing records that were found.
When includeProvenance is true, each company also has a provenance map parallel to values. Observation provenance can include provider, source, sourceId, capturedOn, resolution, and compact citations with id, title, type, and sourceUrl. Native and custom fallbacks identify their sourceKind. Citation excerpts and source text are not returned.
get_company
Get a full company profile by ID.
Scope: read:companies
enrichedValues with citations. Field keys match the metal://fields/companies resource.
Custom fields
get_custom_field_definitions
List org-defined custom field definitions for companies and deals. Use this before passing customFilters to search_companies, list_companies, or search_deals, and before requesting organization-defined fields with get_companies.
Scope: read:companies for company fields; read:deals for deal fields.
Each definition includes the field key, display name, type, whether it can be used in
customFilters, and supported operators. String fields support eq, neq, in, and nin; number fields support eq, neq, gt, gte, lt, lte, in, and nin; boolean fields support eq and neq; date fields support range operators gt, gte, lt, and lte.
Documents
search_documents
Search document content or list documents by type and date.
Scope: read:documents
Content search — find text inside documents:
sourceLinkMarkdown from each excerpt when presenting facts.
get_document
Get extracted text from a document by line number.
Scope: read:documents
reachedEof is false, call again with startLine set to nextLine.
People
search_people
Search contacts by name, title, company, or email.
Scope: read:people
list_person_tags
List person tags so you can pass exact IDs to the tagIds filter on search_people.
Scope: read:people
Returns a paginated list of tag objects with
id and name.
get_person
Get a full contact profile by ID.
Scope: read:people
Deals
search_deals
Search or filter deals. query is optional for filter-only searches.
Scope: read:deals
Resolve company names with
search_companies, user names with search_users, and team IDs with list_teams before passing ID filters.
get_deal
Get a full deal record by ID.
Scope: read:deals
Users and teams
get_current_user
Return the authenticated user and connected organization. No arguments.
Scope: read:users
search_users
Search Metal users by name or email. query is required.
Scope: read:users
get_user
Get a user by ID.
Scope: read:users
list_teams
List teams in your organization. Returns team names and IDs for use in deal and company filters.
Scope: read:teams
get_team
Get a team by ID.
Scope: read:teams
Lists
list_lists
List resource lists in your organization.
Scope: read:lists
get_list
Get a list’s metadata and column schema by ID. Does not include row data — use get_list_entries.
Scope: read:lists
get_list_entries
Page through list rows with cursor pagination.
Scope: read:lists
List authoring
The list write tools let an assistant build and maintain resource lists from a chat surface — create a list, evolve its columns, add rows, and edit cells. Every write requires bothread:lists and write:lists, so tokens without the read scope cannot write either.
create_list
Create a new resource list. The list is created private to you regardless of your role; sharing is managed in the Metal UI.
Scope: read:lists and write:lists
update_list_columns, add_list_entries, and update_list_entry.
update_list
Rename a list or change its description. Only provided fields are patched.
Scope: read:lists and write:lists
At least one of
name or description is required. Use update_list_columns to change the column schema.
update_list_columns
Modify a list’s column schema by adding, removing, or renaming columns.
Scope: read:lists and write:lists
At least one of
add, remove, or rename is required. Column IDs come from get_list.
Renames run before adds and removes, so a rename that targets a missing column fails before any destructive delete commits. Removing and renaming the same column ID in a single call is rejected up front.
add_list_entries
Append rows to a list in one batch (backend cap: 1,000 entries per call).
Scope: read:lists and write:lists
Each entry supports:
resourceId and resourceType are provided together to link an entry to an existing Metal record, or both omitted for a standalone row (required for resourceType=none lists). dataEntity lists always require a resource.
failed array in the response. Each failed item includes the input index and error message. Do not assume every entry landed.
update_list_entry
Update cell values on one existing list entry.
Scope: read:lists and write:lists
Activities
get_activities
Get meetings, calls, and interactions for a company.
Scope: read:activities
get_activity
Get a single activity by ID, including participants, linked deals, and attached documents.
Scope: read:activities
Screenings and scoring
search_screenings
List or filter CIM screenings. Free-text query is not supported — use structured filters.
Scope: read:screenings
get_screening
Get a screening by ID, including financials, analysis, and validation metadata.
Scope: read:screenings
get_screening_scores
Get score records for a screening.
Scope: read:screenings and read:scores
list_scoring_frameworks
List scoring frameworks visible to your organization.
Scope: read:scores
get_scoring_framework
Get a framework definition by ID. Standard frameworks use IDs like standard:Porter's Five Forces.
Scope: read:scores
Dashboards
Dashboard authoring tools let an assistant build canvas dashboards end to end: create the dashboard, add widgets with agent, script, or resource-list backing, rearrange the layout, and edit widget authoring source in place. Only canvas dashboards are supported; other dashboard contexts returnno access.
Every write requires both read:dashboards and write:dashboards. Layout writes use optimistic concurrency: each write echoes the baseVersion from the caller’s most recent read, and a stale token returns 409 Conflict without persisting. On 409, re-fetch the dashboard and retry with the fresh version.
create_dashboard
Create an empty canvas dashboard. Org-scoped and private to you until shared in the UI.
Scope: read:dashboards and write:dashboards
Returns the new
dashboardId. Add widgets with add_dashboard_widget.
update_dashboard
Rename or re-describe a canvas dashboard. Sparse patch — omitted fields are unchanged; an empty string clears a field. Layout is never touched by this tool.
Scope: read:dashboards and write:dashboards
add_dashboard_widget
Add one widget to a canvas dashboard.
Scope: read:dashboards and write:dashboards
Data source rules:
agent— supplyprompt. The widget renders through Metal’s agent runtime.script— supplyscript(PythonDASHBOARD_DATA). Rejected if empty or whitespace-only; enforced against a per-script byte cap. Not allowed onLISTwidgets.resourceList— supplyresourceListId. Only valid forLISTwidgets;LISTwidgets require this data source.
list_sdk_methods and get_sdk_method to look up SDK signatures before writing widget scripts.
update_dashboard_widget
Sparse patch for one widget. Omitted fields are unchanged. widgetType cannot be changed — remove and re-add.
Scope: read:dashboards and write:dashboards
Read the current script or template with
get_dashboard_widget_source before rewriting.
reorder_dashboard_widgets
Reposition existing widgets. Widgets not listed keep their current geometry.
Scope: read:dashboards and write:dashboards
remove_dashboard_widget
Remove one widget from a canvas dashboard.
Scope: read:dashboards and write:dashboards
Removing a default or system widget is durable — the server records a tombstone so the widget is not reinserted on the next dashboard reconcile.
get_dashboard_widget_source
Read the current authoring source of a widget on a canvas dashboard: the Python script (with sha256 and byte count) for script-backed widgets, or the stored HTML template (widgetCode) for agent-backed HTML widgets. Use this before editing so you push a change against the exact source the server holds.
Scope: read:dashboards and write:dashboards (source is an authoring asset and is gated by edit access to the dashboard, not view access)
widgetCode is empty until an agent-backed HTML widget has rendered its first template.
SDK methods
The Metal SDK method catalog lets scripts discover the read-only Python methods available torun_metal_sdk_query and to dashboard widget DASHBOARD_DATA scripts. Look up methods before writing code so signatures and response shapes are confirmed rather than guessed.
Both tools are on the core MCP surface and accept either scope:
Scope: read:programmatic or read:dashboards
list_sdk_methods
Search available SDK methods by name, HTTP path, or documentation text.
get_sdk_method
Get the exact signature, route, response contract, examples, and usage notes for one method returned by list_sdk_methods.
Call
get_sdk_method before using an SDK call in a script — its examples pin down the shape you need to return from a widget’s DASHBOARD_DATA output.
Workflows
Workflow tools split into read/inspect, run, and authoring groups.Read and inspect
Scope:read:workflows
view shortcuts for get_workflow_run: overview, steps, outputs, errors, failures, artifacts, citations, full. Do not pass view and fieldPath together.
view shortcuts for get_workflow_run_step: overview, outputs, transcript, toolCalls, artifacts, errors, iteratorItems, hitl, execution, full.
Run workflows
Scope:write:workflow_runs
run_workflow
Start a workflow run. Inspect inputSchema with get_workflow first and supply every required field in input.
get_workflow_run when the run completes to read bounded outputs.
review_workflow_hitl_step
Approve or reject a human-in-the-loop step. Inspect the pending step with get_workflow_run_step using view: "hitl" first.
Authoring
Scope:write:workflows
These tools create and edit draft workflows:
Call
list_workflow_building_options before authoring to discover allowed step types and field shapes. Authoring tool inputs are validated server-side; validation errors return structured JSON in the error text.
Resources
Your client can read MCP resources alongside tools. These are read-only catalogs — not tool calls.Prompts
The server also exposes guided prompts your client can invoke:
Prompts orchestrate multiple tool calls — they do not return data directly.
Tool index
All 58 tools (alphabetical)
All 58 tools (alphabetical)
add_dashboard_widget · add_list_entries · add_workflow_step · configure_workflow_input · configure_workflow_output · configure_workflow_trigger · create_dashboard · create_list · create_workflow · delete_workflow_step · get_activities · get_activity · get_company · get_current_user · get_custom_field_definitions · get_dashboard_widget_source · get_deal · get_document · get_list · get_list_entries · get_person · get_scoring_framework · get_screening · get_screening_scores · get_sdk_method · get_team · get_user · get_workflow · get_workflow_run · get_workflow_run_step · get_workflow_step · list_companies · list_company_tags · list_lists · list_scoring_frameworks · list_sdk_methods · list_teams · list_workflow_building_options · list_workflow_runs · list_workflows · move_workflow_step · remove_dashboard_widget · reorder_dashboard_widgets · review_workflow_hitl_step · run_workflow · search_companies · search_deals · search_documents · search_people · search_screenings · search_users · update_dashboard · update_dashboard_widget · update_list · update_list_columns · update_list_entry · update_workflow_details · update_workflow_step
