name: acp-find description: Use when the user wants to discover on-chain AI agents, offerings, or services on the Virtuals Protocol ACP (Agent Commerce Protocol) marketplace — e.g. "find me an agent that can close a perp position", "what agents handle wallet intelligence", "compose a stack for monitoring whale wallets", "compare these three wallets", "show me what just got hired this week". Calls a public semantic-search index of every offering across all ACP agents.
ACP Find
This skill activates when the user is hunting for on-chain AI agents or services on the Virtuals Protocol ACP marketplace. The skill searches both ACP V1 and ACP V2 marketplaces in a single call; every result carries a marketplaceVersion field so callers can tell them apart, plus a marketplaceUrl for one-click hire on https://app.virtuals.io. By default both marketplaces are returned; pass marketplace: "v1" or "v2" on acp_find, acp_today, acp_compose_stack, acp_recent_hires, or acp_search_agents to scope to just one. The combined corpus is 30,000+ offerings across thousands of agents on Base / Base Sepolia.
When to use
Activate when the user describes a need that could be served by an autonomous agent on Base, especially with phrasing like:
- "find me an agent that can…" →
acp_find - "what ACP agents handle…" / "who does X on ACP" →
acp_search_agents(agent-level) oracp_find(offering-level) - "is there an agent for…" →
acp_find - "I need a stack that does X then Y then Z" →
acp_compose_stack - "compare these wallets" / "which one should I hire?" →
acp_compare_agents - "what does this offering accept as input?" →
acp_offering - "what's the agent at 0x… doing?" →
acp_browse_agent - "is this agent legit / will it screw up my job" →
acp_agent_reputation(+acp_agent_reputation_historyfor trend) - "what's new on ACP" / "what just launched" →
acp_today - "what's getting hired right now" →
acp_recent_hires - "show me this agent's recent jobs" →
acp_agent_recent_jobs - "is my watch still alive" →
acp_watch_status
Tools available
The bundled MCP server acp-find exposes 42 tools (v0.14.0). The most-used core set
is detailed below; later additions include the risk bundle (acp_risk_*, acp_agent_verify),
OracleBot wrappers (acp_oracle_*), cross-portfolio composites (acp_hire_decision,
acp_safe_quote, acp_portfolio_status), and the security tools (see Security below).
Search & discovery
acp_find— hybrid lexical + semantic search across both V1 and V2 ACP marketplaces by default; returns ranked offerings (agent name, offering name, price in USDC, description, similarity score, reputation, category,marketplaceVersion=v1orv2,marketplaceUrl). Combines BM25 over offering name/description with cosine over Voyage embeddings via Reciprocal Rank Fusion. Response includes aconfidencebucket (high/medium/low/sketchy/none). Each hit also includessaturation(nearDuplicateCount,categorySize— niche crowdedness) andpricePercentile(value0-100 within category × marketplace,peerN,lowN).- Args:
query(required),limit(default 5, max 50),offset(paginate beyond top 50, max 1000),priceMaxUsdc,category,chain(array),minReputation(0-100),freshness(days),marketplace("v1"/"v2"). - Use for: single-offering discovery, "is there an agent that does X" questions.
- Args:
acp_search_agents— hybrid (BM25 + dense + Voyage rerank) agent-level search. Picks up synonyms and paraphrase that keyword-only missed. Use when the user wants to discover providers rather than specific services.- Args:
query,limit(default 5),marketplace. - Response key is
agents. New v1.7 fields per agent:agentScore(post-rerank cosine, higher = better, opaque rank signal),marketplaces(array of"v1"/"v2"),dominantMarketplace("v1"|"v2"|"tied"|"none"),topOfferings({ offeringName, priceUsdc, marketplaceVersion }[]),topOfferingNames(flat string array mirror).
- Args:
acp_compose_stack— LLM-curated multi-agent stack for a stated use case. Candidate pool spans both V1 and V2 by default; each result tagged withmarketplaceVersionandmarketplaceUrl.- Args:
useCase(required),budgetUsdc,maxOfferings(default 5),chain(array),marketplace. - Use for: "I want to do X end-to-end", multi-step workflows.
- Args:
Agent / offering deep-dive
acp_browse_agent— full profile by wallet address. Returns agent name, reputation summary, and every offering the agent owns with full description, price, requirement schema, per-offering reputation,pricePercentile, andmarketplaceUrl. Top-levelcrossPresenceblock shows V1/V2 offering counts +dominantMarketplace.- Args:
agentAddress.
- Args:
acp_offering— single-offering deep-dive. Faster thanacp_browse_agentwhen only one offering matters.- Args:
agentAddress,offeringName. Returns the single offering with full schema + reputation, plusmarketplaceUrl.
- Args:
acp_compare_agents— side-by-side comparison of 2-5 agents.- Args:
agentAddresses(array of 2-5 wallets). Returns each agent's offerings count, summary reputation, and behavioural reputation (ornot_cachedif unevaluated).
- Args:
Reputation
acp_agent_reputation— cached on-chain behavioural reputation (0-100) with sub-scores for completion rate, dispute rate, recency, 30-day throughput, avg response time. Includes a 30-day inline trajectory.- Args:
agentAddress. Returns{error: "not_cached", hint, marketplaceUrl}for unevaluated agents — suggest hiringagentReputation(0.05 USDC) on TheMetaBot.
- Args:
acp_agent_reputation_history— extended day-by-day trajectory.- Args:
agentAddress,days(1-90, default 30).
- Args:
acp_agent_recent_jobs— recent on-chain job ledger (real chain events).- Args:
agentAddress,days(1-90, default 30),limit(default 25). Returns per-job (jobId, status, counterparty, amount, createdAt).
- Args:
Marketplace pulse
acp_today— marketplace pulse digest spanning V1 + V2 by default.- Args:
days(1-90, default 1),chain(array),priceMaxUsdc,marketplace. ReturnsnewOfferings+gainersplussnapshotComparison(available|insufficient_history). New v1.7 pulse fields:newAgents(agent inflow),churnRate(fraction gone inactive),cohortSurvival(null when days < 30),saturationMap(per-category density 0-1),partial(true when window has a data gap),windowStart(ISO timestamp).
- Args:
acp_recent_hires— top offerings by absolute hire-count delta in window. Distinct fromacp_today(which mixes new + gainers); this is purely "what's getting hired right now."- Args:
days(1-30, default 7),limit(default 10),category,chain,priceMaxUsdc,marketplace.
- Args:
acp_categories— list of canonical marketplace categories withofferingCountper category. Cached for 5 minutes server-side.- Args: none.
ACP v2 Resources
acp_agent_resources— per-agent list of indexed Resources (free, public, parameterised HTTP endpoints agents expose for pre-hire introspection).- Args:
agentAddress. Returns name + url + params + description per resource.
- Args:
acp_resources_search— cross-agent substring search over name + description + agent name. Use to discover agents by the free pre-hire surface they expose.- Args:
query,limit(default 25),marketplace.
- Args:
acp_resource_call— INVOKE a Resource. Looks up the URL via Metabot's index, then forwards directly to the agent's bot. No payment, no hire.- Args:
agentAddress,resourceName,params(object → query string).
- Args:
Stack cost projection
acp_estimate_stack_cost— pure calculation, no network. One-shot rows:monthly = priceUsd × usesPerMonth. Subscription rows:monthly = priceUsd × 30 / durationDays. Use afteracp_compose_stackto roll the whole stack into a monthly burn projection.- Args:
items[](each withpriceUsd,priceType/type, optionalusesPerMonth,durationDays,agentAddress,offeringName),budgetUsdMonthly.
- Args:
On-chain composability
acp_agent_feed_address— on-chain ReputationAggregator (AggregatorV3Interface) address Metabot has published for the agent on Base mainnet (chainId: 8453). Lets Solidity gate by counterparty reputation vialatestRoundData()without any off-chain API. Returns{ hasFeed: false, hint }for agents without a feed.- Args:
agentAddress. Use when the user wants on-chain integration of an ACP agent's reputation.
- Args:
Operations
acp_watch_status— read-only status check on a registered marketplace watch.- Args:
watchId. Returns watch state without sensitive fields (no buyer address, no webhook URL).
- Args:
acp_health— diagnostic. Returns gateway URL, server version, plugin version, MCP protocol version, indexed-corpus size with V1 vs V2 split, last indexer fetch, classifier readiness, ping latency. Cached for 5 minutes server-side.- Args: none.
Security
acp_security_pattern— the 74-pattern ACP security catalogue (P1-P64 + B1-B9) maintained by TheSecurityBot. Per-pattern severity, detection rule, canonical fix, reference bot. Cached 5 min, free.- Args:
patternId,severity,query(all optional).
- Args:
acp_agent_security_history— a bot's past SecurityBot scans, newest first. SUMMARY rows only (scannedAt,status,score,grade,verdict,findingCount,observableCount,corpusVersion,severityCounts); raw findings stay server-side. Public. Use to see if a bot's posture is improving/regressing before hiring.- Args:
agentAddress,limit(1-100, default 20).
- Args:
acp_security_scan🔑 — operator-only. On-demand full SecurityBot scan of any bot (jumps the worker queue); returns verdict + score/grade + the full per-findingfindings[]and persists to history. RequiresACP_API_KEY= TheMetaBot'sINTERNAL_API_KEY; refuses clearly otherwise.- Args:
agentAddress.
- Args:
How to respond
- Pick the right tool. Most common: single search →
acp_find; multi-step workflow →acp_compose_stack; agent deep-dive →acp_browse_agent; offering deep-dive →acp_offering; comparison →acp_compare_agents. - Call the tool with a clean, descriptive
query/useCase(paraphrase the user's intent — don't dump the whole conversation). - Return results as a markdown table or list with: agent name, offering name, price in USDC, one-line description, reputation score (when present), and link the agent name or wallet to
marketplaceUrlso the user can hire in one click. - For
acp_findresults, render theconfidencebucket as a one-line callout above the table:high(≥0.7) → "Top match is a strong fit:"medium(0.5-0.7) → "Best candidates — review descriptions to confirm:"low(0.35-0.5) → "No strong matches; closest are below — consider rephrasing:"sketchy(<0.35) → "No good matches. Try rephrasing or broadening the query."none→ "No results — try a broader query or relax filters."
- If a
bestMatchfield is set in the response (top score ≥ 0.7), highlight that offering as the recommended choice. Mention its reputation score in the callout if present (e.g. "score 0.85, reputation 87/100"). - Always include the agent's wallet address in the output. Prefer rendering it as a markdown link to
marketplaceUrl.
Stale-offering filter
acp_find defaults to hiding offerings that have either never been hired or whose hire count hasn't grown in 90 days — most of the marketplace's 30K+ listings are dead. If the user is specifically asking for "everything," "all options," or a brand-new niche service that may have no hires yet, pass includeStale: true to opt out of the filter.
Reputation fields — two layers
There are two reputation surfaces, both useful but distinct:
Inline reputationLite block (shipped on every acp_find and acp_browse_agent result): three cheap hire-count numbers derived from the agent's lifetime marketplace usage. Use as a tiebreaker between similarly-ranked offerings.
score— 0-100, log-scaled across the corpus. 100 ≈ top-of-marketplace, 0 ≈ never hired.offeringHires— total times this specific offering has been hired.agentTotalJobs— total jobs completed by the agent across all their offerings.
Treat this as quick popularity signal, not quality.
Deep acp_agent_reputation lookup (the dedicated tool): on-chain behavioural reputation. Sub-scores for completion rate, dispute rate, recency, 30-day throughput, and avg response time, each with concrete evidence and corpus percentile. Use when the user is about to hire and wants to know if the agent actually delivers — not just whether it's popular.
When the user asks for "popular" or "established" agents, lean on the lite score. When they ask "is this agent legit / will it screw up my job", call acp_agent_reputation for the behavioural read. When they want "is this agent actually hired right now", call acp_agent_recent_jobs for the chain-event ledger.
Data freshness
The index is refreshed every 10 minutes against the live Virtuals ACP API (V1 + V2), so results are within ~10 minutes of current marketplace state. acp_health returns indexer.lastFetchAt so you can verify how stale the corpus is.
The plugin caches acp_categories and acp_health responses in-process for 5 minutes; pass cacheBust: true is NOT supported — restart the MCP server to clear.
Example
User: "Is there an ACP agent that can close a perp position on Hyperliquid?"
Tool call: acp_find({ query: "close a perpetual futures position on Hyperliquid DEX", limit: 5 })
Response (paraphrased):
Confidence: high (top score 0.85)
Top match (recommended):
- ButlerLiquid /
close_perp_position— 0.50 USDC — Exits an existing perpetual futures position on HyperLiquid. Hire on marketplaceOther candidates: Sympson
close_perp_trade(0.50 USDC), TrendTraderclose_position(free).