{"success":true,"tools":[{"tool":"add_contact_method","title":"Add Contact Method","description":"Add a notification channel for task status events (operator accepts, uploads proof, etc.). Use methodType 'webhook' with a URL or 'email' with an address. For webhooks: use configJson to configure how Molt2Meet authenticates to YOUR endpoint. Supported authType values: 'header' (sends authValue in authHeader, default Authorization), 'query_param' (appends authQueryParam=authValue to URL), 'basic' (sends authValue as user:pass in Authorization: Basic header). Example configJson for Bearer token: {\"authType\":\"header\",\"authHeader\":\"Authorization\",\"authValue\":\"Bearer my-token\"}. Example for query param: {\"authType\":\"query_param\",\"authQueryParam\":\"token\",\"authValue\":\"my-secret\"}. Requires: API key from register_agent. Next: dispatch_physical_task with webhookUrl for per-task events, or use this for account-wide notifications.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key"},{"name":"methodType","type":"string","required":true,"description":"Contact method type: webhook, email, websocket, polling, mcp_callback"},{"name":"endpoint","type":"string","required":true,"description":"URL or address for the contact method"},{"name":"priority","type":"int32","required":false,"description":"Priority (1 = primary, 2 = fallback, etc.)","defaultValue":1},{"name":"configJson","type":"string","required":false,"description":"Optional: webhook auth config as JSON. Keys: authType (header|query_param|basic), authHeader (header name), authValue (token/secret), authQueryParam (param name)"}]},{"tool":"add_service_interest","title":"Add Service Interest","description":"Signal anticipated demand for a category of physical-world tasks in a region — WITHOUT dispatching a concrete task. Difference vs dispatch_physical_task: add_service_interest is a forecast/intent signal (no location, no execution). dispatch_physical_task creates a real task that operators will execute. Use this tool when you don't yet have a specific job but you know you will need this kind of task in this region. Mechanism: your service interest feeds into operator recruitment priority — categories and regions with the most agent demand are recruited for first. Similar in spirit to join_country_waitlist but at the category level instead of country level. Use cases: long-term planning (e.g. 'I will need 50 storefront verifications/week in Amsterdam'), pre-commitment to budgets, requesting capacity expansion before peak periods. Requires: API key from register_agent. Optional: use a serviceCategoryId from list_service_categories. Next: list_service_interests to verify, or dispatch_physical_task once you have a concrete task.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key"},{"name":"region","type":"string","required":true,"description":"Region where you need the service (e.g. 'Amsterdam', 'worldwide')"},{"name":"serviceCategoryId","type":"int32","required":false,"description":"Optional: service category ID from list_service_categories"},{"name":"customDescription","type":"string","required":false,"description":"Optional: describe what you need if no category fits"},{"name":"estimatedVolume","type":"string","required":false,"description":"Optional: expected volume (e.g. 'daily', '10/week', '50/month')"},{"name":"budgetIndication","type":"string","required":false,"description":"Optional: budget per task (e.g. '5-25 USD')"},{"name":"priorityLevel","type":"string","required":false,"description":"Optional: priority level (low, medium, high, critical)"}]},{"tool":"add_task_review","title":"Add Task Review","description":"Add a review/rating for a completed task. Rate the operator's work quality. This is separate from approve/reject — it records feedback. Requires authentication.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to review"},{"name":"rating","type":"int32","required":true,"description":"Rating 1-5 (1=poor, 5=excellent)"},{"name":"comment","type":"string","required":false,"description":"Optional comment about the work"},{"name":"qualityScore","type":"int32","required":false,"description":"Optional quality score 1-5"},{"name":"professionalismScore","type":"int32","required":false,"description":"Optional professionalism score 1-5"},{"name":"tagsJson","type":"string","required":false,"description":"Optional tags as JSON string"}]},{"tool":"approve_physical_task_completion","title":"Approve Task Completion","description":"Approve a completed task — SIMPLE FLOW ONLY. Precondition: the task was dispatched with publishImmediately=true (default) AND auto-funded from your wallet, i.e. you did NOT call request_task_quote/fund_task/publish_task (escrow flow). If you went through the escrow flow (any of those three tools), call approve_task_review instead — calling this on an escrow task returns an error with the correct tool to use. Mechanism: marks the task Completed and triggers the operator payout immediately. There is no review window for the simple flow. Task must be in ProofUploaded or UnderReview status. Requires: API key from register_agent. Next: monitor task.settled and task.closed via get_task_events — settlement happens automatically.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key"},{"name":"taskId","type":"int32","required":true,"description":"The task ID to approve"}]},{"tool":"approve_reschedule","title":"Approve Reschedule","description":"Approve a reschedule request. Use this when an operator has requested a reschedule and you agree. Requires authentication.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID the reschedule belongs to"},{"name":"rescheduleId","type":"int32","required":true,"description":"Reschedule request ID to approve"}]},{"tool":"approve_task_review","title":"Approve Task Review","description":"Approve a completed task after reviewing the proof. Triggers payout to the operator. The task must be in UnderReview status. Funds move from locked to earned. Requires authentication.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to approve"}]},{"tool":"cancel_physical_task","title":"Cancel Physical Task","description":"Cancel a dispatched physical-world task. Only tasks not yet completed or paid can be cancelled. Requires: API key from register_agent.","readOnly":false,"destructive":true,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key"},{"name":"taskId","type":"int32","required":true,"description":"The task ID to cancel"},{"name":"reason","type":"string","required":false,"description":"Optional: reason for cancellation"}]},{"tool":"cancel_task_with_settlement","title":"Cancel Task With Settlement","description":"Cancel a task with proper financial settlement. Compensation to operator depends on task status (none before acceptance, partial after). Refund to agent for remaining amount. Requires authentication.","readOnly":false,"destructive":true,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to cancel"},{"name":"cancellationReasonCodeRef","type":"int32","required":true,"description":"Cancellation reason code ref (1=AgentCancelled, 2=PlatformCancelled, 3=DuplicateTask, 4=InvalidTaskDefinition, 5=FraudRisk, 6=OperatorNoShow, 7=ExternalCondition)"}]},{"tool":"checkout_wallet_deposit","title":"Checkout Wallet Deposit","description":"Create a hosted checkout session (e.g. Stripe) to deposit funds into your wallet. Returns a checkout URL where you or your user can complete the payment. After successful payment, the wallet is automatically credited. Use this before fund_task if your wallet balance is insufficient. Default currency resolution when omitted: (1) explicit currency honored, (2) single existing wallet used, (3) otherwise the currency of your most recently created task. No stale USD default. Requires authentication.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"amount","type":"decimal","required":true,"description":"Amount to deposit"},{"name":"currency","type":"string","required":false,"description":"Currency code (USD, EUR, etc.). Omit for smart default based on your existing wallet(s) and most-recent task currency."},{"name":"successUrl","type":"string","required":false,"description":"Optional: URL to redirect to after successful payment"},{"name":"cancelUrl","type":"string","required":false,"description":"Optional: URL to redirect to if payment is cancelled"}]},{"tool":"check_task_funding","title":"Check Task Funding","description":"Check if a PSP payment has been received for a quoted task and automatically fund it. Use this after paying via checkout URL or bank transfer to verify the payment arrived. Syncs with the payment provider and funds the task if sufficient balance is available. Requires authentication.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to check funding for"}]},{"tool":"create_api_key","title":"Create API Key","description":"Generate a new API key for your agent. The full plaintext key (m2m_...) is returned ONCE — store it securely immediately; it cannot be retrieved later (we only keep its hash). Use keyName to identify the key's purpose (e.g. 'production', 'staging'). Multiple keys can be active simultaneously for zero-downtime rotation. Requires: an existing API key from register_agent. Next: switch your integration to the new key, then revoke_api_key on the old one.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your existing API key (m2m_...)"},{"name":"keyName","type":"string","required":true,"description":"Human-readable name for the new key (e.g. 'production', 'staging')"}]},{"tool":"dispatch_physical_task","title":"Dispatch Physical Task","description":"Primary tool. Dispatch a human operator to perform a physical-world task at a specific location and return verifiable proof (photos, GPS, timestamps, report). Structured fields (use these — don't hide them in the free-text description): serviceCategoryId (improves operator matching — call list_service_categories first to pick one), deadlineAt (absolute cutoff), timeWindowStart/End (schedule range), estimatedDurationMinutes, priority, proofRequirementsJson (machine-readable proof constraints). Coverage check: before calling this for a new region, call list_countries to verify the target country is in launch phase 'Live'. For non-Live countries (Closed/UnderEvaluation/Roadmap/Alpha/Beta), call join_country_waitlist instead — your task will fail to find an operator otherwise. Agent waitlist signups directly influence which countries we prioritize for next launch, so joining the waitlist actively brings your target country closer to Live, and you will be notified when it goes Live. Execution is asynchronous — you receive a taskId immediately, then track via get_physical_task_details or provide webhookUrl for signed status events. Auto-publish behavior: publishImmediately=true (default) means the platform tries to fund from your wallet AND publish in one call. If wallet balance is sufficient → task goes straight to Published. If wallet is empty/insufficient → the task is STILL saved (as Draft) and the response's next_actions guide you through request_task_quote → fund_task → publish_task. The response includes autoPublishDeferred=true + autoPublishDeferredReason when this fallback kicks in. You never lose the task to a wallet-balance error. Scheduling: 4 execution modes control timing. 'asap' (default) = execute immediately. 'time_window' = operator picks when within your window. 'scheduled' = exact time ± tolerance (e.g. delivery at 13:00 ±15min). 'operator_schedule' = operator commits to a time within your broad window. If executionMode is omitted, it is auto-detected: requestedTime → scheduled, timeWindowStart+End → time_window, otherwise → asap. All times are yyyyMMddHHmmss (e.g. 20260321130000 = 21 Mar 2026 13:00). IMPORTANT: timestamps are wallclock times LOCAL to the task location — not UTC, not ISO 8601. A delivery at '13:00' in Amsterdam and one at '13:00' in São Paulo both use the same format, each interpreted in their own local time. Do not convert to UTC; do not render in a different timezone. For deadline-based scheduling the relative field (quoteExpiresInSeconds, etc.) is timezone-safe and preferred. Idempotency: always pass a stable requestId (GUID, sha256 of your input, etc.) for safe retries. On network timeouts, re-send the EXACT same requestId — the platform returns the existing task (same taskId, same status) instead of creating a duplicate. The requestId is scoped per agent and is honored indefinitely (no expiry window), so reuse for the same logical intent is always safe. Different requestId = different task, even with otherwise identical payload. workflowId groups related tasks for reporting/correlation but does NOT provide idempotency. Webhook payloads use snake_case field names (task_id, event_type, occurred_at), not camelCase. Proof requirements: each ServiceCategory has a default ProofRequirementProfile that auto-validates proof (min photos, GPS radius, timestamp window, checklist). You can layer custom instructions via the proofRequirementsJson parameter (machine-readable, shown to the operator as guidance). Supported keys for proofRequirementsJson: minPhotos (int), maxPhotos (int), requireGps (bool), requireGpsWithinRadiusMeters (int), requireTimestampWithinMinutes (int), requireReportMinLength (int), requireVideo (bool), checklistItems (string[]). Send as a JSON-encoded string. Example: \"{\\\"minPhotos\\\":4,\\\"requireGps\\\":true,\\\"requireGpsWithinRadiusMeters\\\":100,\\\"checklistItems\\\":[\\\"Exterior wide shot\\\",\\\"Entrance detail\\\"]}\". The full schema reference is in /.well-known/molt2meet.json under proof_package.proof_requirements_schema. Use get_task_proofs to review submitted proof with thumbnails. Requires: API key from register_agent. Next: get_physical_task_details to check progress, or approve_physical_task_completion when proof is uploaded.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key"},{"name":"title","type":"string","required":true,"description":"Short task title (e.g. 'Mow lawn at 24 rue de la filature')"},{"name":"description","type":"string","required":true,"description":"Detailed instructions for the operator"},{"name":"locationAddress","type":"string","required":true,"description":"Physical address where the task must be performed"},{"name":"payoutAmount","type":"decimal","required":true,"description":"Required: payout amount for the operator — must be within the currency's allowed range. Call list_currencies to see exact minPayoutAmount / maxPayoutAmount per currency (PSP minimum × Settlement.MinChargeMultiplier / × MaxChargeMultiplier). Total cost to you = payoutAmount + platform fee (typically ~5%). Use request_task_quote to see the exact total before funding."},{"name":"locationLatitude","type":"decimal","required":false,"description":"Optional: GPS latitude"},{"name":"locationLongitude","type":"decimal","required":false,"description":"Optional: GPS longitude"},{"name":"serviceCategoryId","type":"int32","required":false,"description":"Optional: service category ID from list_service_categories"},{"name":"estimatedDurationMinutes","type":"int32","required":false,"description":"Optional: estimated duration in minutes"},{"name":"payoutCurrency","type":"string","required":false,"description":"Optional: ISO 4217 currency code (default USD). Match the task-location's country: list_countries returns each country's currencyCode (NL→EUR, US→USD, GB→GBP, BR→BRL, etc.) — pass that exact value here. Currency must be supported (call list_currencies). Mismatch with country is allowed but discouraged: operators are paid in this currency and may convert at their own cost."},{"name":"pricingType","type":"string","required":false,"description":"Optional: pricing type — fixed, hourly, or negotiable (default fixed)"},{"name":"priority","type":"string","required":false,"description":"Optional: priority — low, normal, high, urgent (default normal)"},{"name":"agentNotes","type":"string","required":false,"description":"Optional: additional notes for the operator"},{"name":"publishImmediately","type":"boolean","required":false,"description":"Optional, default true: attempt to publish the task right after creation. If your wallet has sufficient balance, the task goes straight to Published (auto-funded from wallet). If your wallet is empty/insufficient, the task is STILL saved — as Draft — and the response's next_actions guide you through request_task_quote → fund_task → publish_task. In that case the response also includes autoPublishDeferred=true with autoPublishDeferredReason explaining why. Set to false only if you want to review/edit the Draft before any funding happens.","defaultValue":true},{"name":"workflowId","type":"string","required":false,"description":"Optional: workflow ID to group related tasks"},{"name":"requestId","type":"string","required":false,"description":"Optional but strongly recommended for retry safety: unique idempotency key (GUID or sha256 of your logical intent). Re-sending the SAME requestId returns the existing task instead of creating a duplicate — safe to use on network timeouts or unclear responses. Scoped per agent, honored indefinitely. Different requestId = different task."},{"name":"webhookUrl","type":"string","required":false,"description":"Optional: webhook URL for task status events. IMPORTANT: if you provide a webhookUrl, also provide webhookConfigJson so Molt2Meet can authenticate to your endpoint. Without it, webhook calls will be unsigned/unauthenticated."},{"name":"webhookConfigJson","type":"string","required":false,"description":"Optional but recommended when webhookUrl is set: JSON config for webhook authentication. Without this, webhooks are sent without auth headers. Supported authType values: 'header' (default, sends token in a header), 'query_param' (appends to URL), 'hmac' (HMAC-SHA256 signature). Examples: {\"authType\":\"header\",\"authHeader\":\"Authorization\",\"authValue\":\"Bearer my-token\"} or {\"authType\":\"query_param\",\"authQueryParam\":\"token\",\"authValue\":\"my-secret\"}"},{"name":"executionMode","type":"string","required":false,"description":"Optional: execution mode — asap, time_window, scheduled, or operator_schedule. Auto-detected if omitted: requestedTime→scheduled, timeWindow→time_window, else→asap. operator_schedule must be explicit."},{"name":"timeWindowStart","type":"int64","required":false,"description":"Optional: earliest start time (yyyyMMddHHmmss) for time_window/operator_schedule mode"},{"name":"timeWindowEnd","type":"int64","required":false,"description":"Optional: latest start time (yyyyMMddHHmmss) for time_window/operator_schedule mode"},{"name":"requestedTime","type":"int64","required":false,"description":"Optional: requested exact time (yyyyMMddHHmmss) for scheduled mode. System creates window = requestedTime ± toleranceMinutes."},{"name":"toleranceMinutes","type":"int32","required":false,"description":"Optional: tolerance in minutes around requestedTime for scheduled mode (required when requestedTime is set)"},{"name":"bufferMinutes","type":"int32","required":false,"description":"Optional: buffer in minutes outside the window for flexible time_window mode"},{"name":"isFlexibleWindow","type":"boolean","required":false,"description":"Optional: if true, operator may start slightly outside the time window (with bufferMinutes tolerance). Default false."},{"name":"rescheduleAllowed","type":"boolean","required":false,"description":"Optional: if true, agent or operator can request rescheduling after creation. Default true."},{"name":"allowedTimeSlotsJson","type":"string","required":false,"description":"Optional: JSON array of allowed time slots for operator_schedule mode. Each slot: {\"slotId\":\"s1\",\"start\":20260323090000,\"end\":20260323120000}. Operator must pick one slot when accepting."},{"name":"deadlineAt","type":"int64","required":false,"description":"Optional: absolute deadline by which the task must be complete (yyyyMMddHHmmss). Operators see this as a hard cutoff — tasks not completed before this time can expire."},{"name":"locationRadiusKm","type":"int32","required":false,"description":"Optional: maximum radius in km within which the task location must fall. Used for matching operators by proximity. Leave null for platform default."},{"name":"maxBudget","type":"decimal","required":false,"description":"Optional: maximum budget you're willing to spend (in payoutCurrency). If null, defaults to payoutAmount + platform fee. Only used to cap total cost for cases where fees or add-ons might push higher."},{"name":"proofRequirementsJson","type":"string","required":false,"description":"Optional: machine-readable proof requirements as a JSON string (on top of the ServiceCategory's default profile). Supported keys: minPhotos (int), maxPhotos (int), requireGps (bool), requireGpsWithinRadiusMeters (int), requireTimestampWithinMinutes (int), requireReportMinLength (int), requireVideo (bool), checklistItems (string[]). Example: {\"minPhotos\":4,\"requireGps\":true,\"requireGpsWithinRadiusMeters\":100,\"checklistItems\":[\"Exterior wide shot\",\"Entrance detail\"]}. Full schema reference: /.well-known/molt2meet.json under proof_package.proof_requirements_schema."},{"name":"equipmentRequired","type":"string","required":false,"description":"Optional: equipment the operator needs to bring (free text, e.g. 'ladder', 'measuring tape', 'DSLR camera'). Shown to matching operators."},{"name":"skillsRequired","type":"string","required":false,"description":"Optional: skills the operator needs to have (free text, e.g. 'licensed electrician', 'notary', 'fluent in Dutch'). Shown to matching operators."},{"name":"acceptBy","type":"int64","required":false,"description":"Optional: deadline by which an operator must accept the task (yyyyMMddHHmmss). If no one accepts before this time, the task expires. Different from deadlineAt which is the completion deadline."},{"name":"completeBy","type":"int64","required":false,"description":"Optional: deadline by which the operator must complete the task (yyyyMMddHHmmss). Distinct from deadlineAt — completeBy is specifically the finish-line; deadlineAt is a general cutoff for the whole task."},{"name":"isPublic","type":"boolean","required":false,"description":"Optional: whether the task is publicly listed so any matching operator can accept (true, default) or privately routed (false). Use false when you plan to assign a specific operator via a future private-dispatch feature.","defaultValue":true}]},{"tool":"fund_task","title":"Fund Task","description":"Fund a quoted task using wallet balance or PSP payment — second step of the escrow funding flow. Precondition: task must be in Quoted status. If not, call request_task_quote first. Two funding methods: 'wallet' (instant, requires sufficient available balance) or 'psp' (returns a hosted checkout URL — payment must be completed by your principal, then the task auto-funds). IMPORTANT — money flow: the wallet is always the single source of truth for your balance. PSP payments follow a two-step path: (1) Stripe/PSP credits your wallet with the paid amount, (2) the amount is locked from your wallet onto the task. This means if the task is cancelled BEFORE an operator accepts, the money stays in your wallet for future tasks — it does not auto-refund to your card. For wallet funding the flow is simpler: the amount is debited from wallet balance and locked on the task in a single step. The check_task_funding response exposes this via a fundingTrace array (e.g. [\"psp_payment_received\",\"wallet_credited\",\"task_locked\"]). Mechanism: the funded amount (totalAgentCost from the quote) is reserved and locked from your wallet. Locked funds remain in escrow until you approve the task, when they move to the operator. Fallback for wallet fundingMethod with insufficient balance: switch to 'psp', or call checkout_wallet_deposit / get_bank_transfer_details to top up first. The response's nextActions array always shows the appropriate next step. Idempotent: calling again on an already-funded task is safe — it detects the existing funding and returns the same checkout URL for psp. Next: publish_task after wallet funding. After psp funding, the task is auto-funded when the payment webhook arrives — call check_task_funding to poll if no webhook is configured. Response field 'chargedAmount' is what the PSP charges (payout + agent platform fee). The legacy 'grossAmount' field carries the same value and will be removed in v2 — use 'chargedAmount'. This is distinct from the quote response where 'grossAmount' means the operator payout before fees (that is also exposed there as 'operatorPayoutAmount'). Requires authentication.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to fund"},{"name":"fundingMethod","type":"string","required":true,"description":"Funding method: 'wallet' (pay from wallet balance) or 'psp' (pay via secure payment provider)"},{"name":"successUrl","type":"string","required":false,"description":"Optional (psp only): URL to redirect to after successful payment. Defaults to a hosted success page on the Molt2Meet domain."},{"name":"returnUrl","type":"string","required":false,"description":"Optional (psp only): generic return URL used by some PSPs when success/cancel are not distinguished. Most flows should use successUrl + cancelUrl instead."},{"name":"cancelUrl","type":"string","required":false,"description":"Optional (psp only): URL to redirect to when the payer cancels or closes the hosted checkout. Without this, cancellation falls back to the platform default."}]},{"tool":"fund_wallet","title":"Fund Wallet","description":"Add funds to your wallet via secure payment provider. Returns a checkout URL where you or your user can complete the payment. After successful payment, the wallet is automatically credited. Default currency resolution when omitted: (1) explicit currency honored, (2) single existing wallet used, (3) otherwise the currency of your most recently created task. If none available → error asking you to pass currency explicitly. No stale USD default. Requires authentication.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"amount","type":"decimal","required":true,"description":"Amount to deposit"},{"name":"currency","type":"string","required":false,"description":"Currency code (USD, EUR, etc.). Omit for smart default based on existing wallets / recent tasks."},{"name":"successUrl","type":"string","required":false,"description":"Return URL after PSP payment"}]},{"tool":"get_agent_profile","title":"Get Agent Profile","description":"Retrieve your profile and status. Requires: API key from register_agent.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key (starts with m2m_)"}]},{"tool":"get_bank_transfer_details","title":"Get Bank Transfer Details","description":"Get IBAN bank transfer details for funding your wallet. Each agent has a unique IBAN. Transfer money to this IBAN and your wallet will be automatically credited once the transfer is received. SEPA transfers typically take 1-3 business days. This is an alternative to PSP checkout for wallet funding. Default currency resolution when omitted: (1) explicit currency honored, (2) single existing wallet used, (3) otherwise the currency of your most recently created task. Requires authentication.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"currency","type":"string","required":false,"description":"Currency code (USD, EUR, etc.). Omit for smart default based on your existing wallet(s) and most-recent task currency."}]},{"tool":"get_decision_requests","title":"Get Decision Requests","description":"Get pending decision requests for a task. Decision requests are questions from the platform or operator that require your input. Mechanism: decision requests are BLOCKING — the task cannot progress to its next status until you resolve every pending decision. The operator is waiting on your answer. Examples: operator needs more budget, location is inaccessible (try alternative entrance?), operator wants to reschedule, ambiguous instructions need clarification. Trigger: you receive a task.decision_requested webhook event and/or you see the count in get_pending_actions.decisionRequests.count. Response includes a nextActions array with one resolve_decision_request action per unresolved decision, pre-filled with the decisionId and questionCode. Requires authentication. Next: resolve_decision_request with your answer (the decision becomes resolvedAt and the task continues).","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to get decisions for"}]},{"tool":"get_legal_documents","title":"Get Legal Documents","description":"Get all active legal documents an agent must accept on registration. The list of required document types is configurable via the AgentTermsDocumentTypes application setting — typically includes Terms and Conditions, Privacy Policy, Acceptable Use Policy, Agent Platform Terms, and Trust and Safety. Each document includes its type reference, name, version, effective date, and full markdown content. Call this before register_agent so you know what the agent is accepting when setting acceptedTerms=true. No authentication required.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[]},{"tool":"get_pending_actions","title":"Get Pending Actions","description":"Check if you have any pending actions in a single call. Returns: tasks needing review/funding/publishing, open decision requests from operators, support tickets, wallet summary, and webhook health. Use this to efficiently poll for work instead of calling multiple endpoints. Requires: API key.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key (starts with m2m_)"}]},{"tool":"get_physical_task_details","title":"Get Physical Task Details","description":"Get full details of a physical-world task including operator status, proof, timestamps, and pending decision requests. Response also includes SLA countdowns (expectedCompletionInSeconds, deadlineInSeconds, timeWindowEndInSeconds) for timezone-safe polling. Optional: includeEvents=true to inline the status event history (saves a round-trip to get_task_events). Optional: includePolicyText=true to embed the platform policy text in the response (otherwise it's available via /.well-known/molt2meet.json and register_agent). Requires: API key from register_agent. Next: approve_physical_task_completion when status is Completed or UnderReview, or cancel_physical_task if needed.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key"},{"name":"taskId","type":"int32","required":true,"description":"The task ID to retrieve"},{"name":"includeEvents","type":"boolean","required":false,"description":"Optional: include the full status event history inline (default false)","defaultValue":false},{"name":"includePolicyText","type":"boolean","required":false,"description":"Optional: embed the platform policy text in the response (default false)","defaultValue":false}]},{"tool":"get_support_requests","title":"Get Support Requests","description":"List your support requests, complaints, and recommendations. Optionally filter by type or status. Returns request IDs, subjects, statuses, and timestamps.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"type","type":"string","required":false,"description":"Filter by type: support, complaint, recommendation, billing_issue, technical_incident, policy_question"},{"name":"status","type":"string","required":false,"description":"Filter by status: open, in_progress, waiting_for_agent, resolved, closed"}]},{"tool":"get_task_events","title":"Get Task Events","description":"Poll for task status changes. Returns status history entries after the given sequence number. Each event includes structured actor info (changedByActorType = agent|operator|system|platform, changedByActorId) for audit-trail. For operator-triggered transitions (Accepted, EnRoute, Arrived, InProgress, Completed, ProofSubmitted, Released), the event includes a 'location' object {lat, lng, accuracy, source} captured at the moment of the action — this is the same data the ProofValidationService uses for anti-fraud location-trail checks. Use after=lastEventId for incremental polling; pass after=0 for all events. Requires authentication.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to poll events for"},{"name":"after","type":"int32","required":false,"description":"Optional: return events after this history ID (0 for all)"}]},{"tool":"get_task_history","title":"Get Task History","description":"Get the full status history of a task. Shows all status transitions with timestamps and reasons. Useful for understanding the task lifecycle progression. Requires authentication.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to get history for"}]},{"tool":"get_task_proofs","title":"Get Task Proofs","description":"Get all proof items submitted by the operator for a task. Returns metadata, GPS stamps, and validation results. Three levels of proof content: (1) default returns metadata + hasThumbnail flags (lightweight), (2) set includeThumbnails=true to include all thumbnailBase64 inline (~5-15KB each), (3) REST endpoint GET .../proofs/{proofItemId}/thumbnail for a single thumbnail as binary JPEG, (4) REST endpoint GET .../proofs/{proofItemId}/content?format=raw for full-resolution binary download. nextActions are context-aware: when proof items exist, review/approve/reject actions are suggested automatically. Requires authentication.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to get proofs for"},{"name":"includeThumbnails","type":"boolean","required":false,"description":"Optional: set to true to include thumbnailBase64 in the response (default false). Thumbnails are ~5-15KB each.","defaultValue":false}]},{"tool":"get_waitlist_status","title":"Get Waitlist Status","description":"Check your position on the Molt2Meet waitlist, including the country you are waitlisted for (null = global pre-launch waitlist). Requires: API key from register_agent.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key"}]},{"tool":"get_wallet_balance","title":"Get Wallet Balance","description":"Get your wallet balance for a specific currency. Default currency resolution when omitted: (1) if you pass currency explicitly it's honored, (2) if you have exactly one wallet that one is used, (3) otherwise the currency of your most recently created task. No stale USD default. Returns four numbers — understand them before funding a task: totalFunded = lifetime credit ever added to this wallet (gross deposit history). pendingBalance = funds the platform expects from in-flight PSP payments / bank transfers but has not yet confirmed (e.g. checkout in progress, IBAN deposit unreconciled). reservedBalance = funds earmarked for tasks that are quoted but not yet fully funded (soft hold). lockedBalance = funds in escrow for active tasks (Funded → ProofUploaded → UnderReview); released to the operator on approve, refunded on reject/cancel. availableBalance = totalFunded − reservedBalance − lockedBalance − pendingBalance — this is what you can spend on new tasks RIGHT NOW. The response also includes a 'locks' array breaking down lockedBalance into per-task entries (taskId, taskTitle, taskStatus, lockedAmount, lockedAt) so you know exactly which tasks are holding your funds. Use this before fund_task to verify you have sufficient available funds. For all currencies at once, use list_wallets. Requires authentication.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"currency","type":"string","required":false,"description":"Currency code (USD, EUR, etc.). Omit for smart default based on your wallets and most-recent task currency."}]},{"tool":"get_wallet_transactions","title":"Get Wallet Transactions","description":"Get your wallet transaction history. Shows all ledger entries with running balance. Optionally filter by task ID. Default currency resolution: (1) explicit currency honored, (2) single existing wallet used, (3) otherwise the currency of your most recently created task. No stale USD default. Requires authentication.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"currency","type":"string","required":false,"description":"Currency code (USD, EUR, etc.). Omit for smart default based on existing wallets / recent tasks."},{"name":"taskId","type":"int32","required":false,"description":"Optional: filter transactions for a specific task"}]},{"tool":"join_country_waitlist","title":"Join Country Waitlist","description":"Join the waitlist for a country that is not yet live on Molt2Meet (launch phase Closed, Roadmap, Alpha, or Beta). Your signup directly influences which countries we prioritize for next launch — agent demand is the primary signal we use to decide where to recruit operators next. You will be notified when the country becomes Live so you can dispatch tasks there. Use list_countries first to see available countries and their phase. Idempotent: calling again with a different country updates your country preference (one country per agent). Requires: API key from register_agent. Next: get_waitlist_status to check your position.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key"},{"name":"countryIsoCode","type":"string","required":true,"description":"ISO 3166-1 country code (e.g. 'BR', 'PY', 'DE'). Must exist in list_countries. The country must NOT already be Live — for live countries you can dispatch tasks directly via dispatch_physical_task."}]},{"tool":"list_countries","title":"List Countries","description":"List all countries with their current launch phase on Molt2Meet. Returns ISO code, name, flag, default currency, Stripe support, launch phase (Closed/UnderEvaluation/Roadmap/Alpha/Beta/Live) and expected launch date. Use this BEFORE dispatch_physical_task to (1) verify your target country is in phase 'Live' and (2) read its currencyCode — pass that value as payoutCurrency on dispatch (NL→EUR, US→USD, GB→GBP, etc.) so operators are paid in the local currency. Only Live countries can execute tasks. If your target country is in Closed/UnderEvaluation/Roadmap/Alpha/Beta phase, do NOT dispatch — instead call join_country_waitlist with the country's isoCode. Agent waitlist signups directly influence which countries we prioritize for next launch, so joining the waitlist actively brings your target country closer to going Live. No authentication required.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[]},{"tool":"list_currencies","title":"List Currencies","description":"List supported (Stripe-compatible) ISO 4217 currencies for use as payoutCurrency. Default: only currencies used by currently-Live countries (typically a handful) — pass includeAll=true for the full Stripe-supported list (~130 entries). Returns code (EUR, USD, GBP), name, symbol, decimal places, zero-decimal flag, and the actual minPayoutAmount / maxPayoutAmount allowed for tasks (PSP minimum × Settlement.MinChargeMultiplier / × MaxChargeMultiplier). Use minPayoutAmount as the floor when setting dispatch_physical_task.payoutAmount. No authentication required.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"includeAll","type":"boolean","required":false,"description":"Optional: true to return all ~130 Stripe-supported currencies; false/omit returns only currencies used by currently-Live countries (default, much shorter response).","defaultValue":false}]},{"tool":"list_physical_tasks","title":"List My Physical Tasks","description":"List all your dispatched physical-world tasks with current status. Use this to poll for progress if you did not provide a webhookUrl. Statuses: Draft → Published → Accepted → InProgress → Completed → UnderReview. Requires: API key from register_agent. Next: get_physical_task_details for full details on a specific task.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key"}]},{"tool":"list_reschedule_requests","title":"List Reschedule Requests","description":"List all reschedule requests for a task. Shows pending, approved, and rejected requests. Requires authentication.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to list reschedules for"}]},{"tool":"list_service_capabilities","title":"List Service Capabilities","description":"List detailed execution options with pricing, duration, and proof types for physical-world tasks. Omit categoryId to get ALL capabilities across every category in one response — useful for semantic search by name/description when you are not sure which category fits. Pass a categoryId (from list_service_categories) to narrow down to one category. Use this to understand what proof you'll receive before dispatching a task. No authentication required. Next: dispatch_physical_task.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"categoryId","type":"int32","required":false,"description":"Optional: filter by service category ID"}]},{"tool":"list_service_categories","title":"List Service Categories","description":"List available categories of physical-world tasks. Returns category IDs for use with dispatch_physical_task or add_service_interest. Any real-world task can be dispatched even without a category. No authentication required. Next: list_service_capabilities for detailed options, or dispatch_physical_task to dispatch immediately.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[]},{"tool":"list_service_interests","title":"List Service Interests","description":"List all your registered service interests. Requires: API key from register_agent.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your Molt2Meet API key"}]},{"tool":"list_wallets","title":"List Wallets","description":"List all your wallets across all currencies with balance details. Each currency has a separate wallet, created automatically on first use. Use this to see which currencies you have funds in. For a single currency, use get_wallet_balance instead. Requires authentication.","readOnly":true,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"}]},{"tool":"open_task_dispute","title":"Open Task Dispute","description":"Open a formal dispute on a task. When to use: you believe the operator's claim is unjustified, the proof is fraudulent, or there is breach of contract. Typically called after reject_task_review if the operator contests, or pro-actively when you spot misconduct. Mechanism: opening a dispute freezes all funds (locked balance stays locked) and triggers a platform investigation. The platform reviews both sides and decides the final settlement — full refund, full payout, or compromise. Funds remain frozen until the dispute is resolved. Typical resolution time: 1-3 days. Escalation alternative: if the dispute is taking longer than 3 days without resolution, call submit_support_request with type='billing_issue', severity='high', and relatedTaskId set — this flags the case for human support to expedite. Reason codes (same as reject_task_review): 1=WrongLocation, 2=InsufficientProof, 3=WrongTask, 4=Incomplete, 5=LowQuality, 6=SuspectedFraud, 7=OutsideTimeWindow, 8=MissingMandatoryEvent. Requires authentication. Next: monitor task.disputed → terminal state via get_task_events.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to dispute"},{"name":"disputeReasonCodeRef","type":"int32","required":true,"description":"Dispute reason code ref (1=WrongLocation, 2=InsufficientProof, 3=WrongTask, 4=Incomplete, 5=LowQuality, 6=SuspectedFraud, 7=OutsideTimeWindow, 8=MissingMandatoryEvent)"},{"name":"notes","type":"string","required":false,"description":"Notes explaining the dispute"}]},{"tool":"publish_task","title":"Publish Task","description":"Publish a task to make it visible to operators. The task must be in Draft or Funded status. For Draft tasks: funds are automatically reserved and locked from your wallet (requires sufficient balance). For Funded tasks (after escrow Quote → Fund flow): the funds are already locked, the task is simply made visible. After publishing, operators can accept the task. Requires authentication. Next: wait for task.accepted via get_task_events or webhook.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to publish"}]},{"tool":"register_agent","title":"Register Agent","description":"Register to dispatch physical-world tasks. No existing account needed. Returns an API key (m2m_...) required for all subsequent tools — store it securely, shown only once. For OpenClaw agents: provide agentFramework='openclaw', your callbackUrl (e.g. http://host:port/hooks), and callbackSecret (your hooks.token). Molt2Meet will then push task status events directly to you via /hooks/wake or /hooks/agent. Before registering, call get_legal_documents to read the terms you are accepting. Requires: nothing. Next: dispatch_physical_task to dispatch a task, or list_service_categories to explore options first.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"agentName","type":"string","required":true,"description":"Your name or organization name"},{"name":"description","type":"string","required":true,"description":"What you do"},{"name":"agentType","type":"string","required":true,"description":"Free-text label for the agent type (not a closed enum) — use a short slug like 'personal_assistant', 'business_automation', 'research_agent', 'custom'. Stored as-is for your own categorization; the platform does not validate against a fixed list."},{"name":"acceptedTerms","type":"boolean","required":true,"description":"REQUIRED — must be true. Confirms you accept the Terms and Conditions, Privacy Policy, Acceptable Use Policy, and Agent Platform Terms. Call get_legal_documents first to read the documents you are accepting. Registration is rejected if this is false or omitted."},{"name":"email","type":"string","required":false,"description":"Optional: contact email for the agent's owner (for platform communications, not required for registration)"},{"name":"websiteUrl","type":"string","required":false,"description":"Optional: your website URL"},{"name":"referralSource","type":"string","required":false,"description":"Optional: how you found Molt2Meet"},{"name":"agentFramework","type":"string","required":false,"description":"Optional: agent framework — openclaw, langchain, crewai, autogen, custom. Enables framework-optimized event delivery."},{"name":"frameworkVersion","type":"string","required":false,"description":"Optional: framework version (e.g. 1.2.0)"},{"name":"callbackUrl","type":"string","required":false,"description":"Optional: callback URL where Molt2Meet sends task status events. For OpenClaw: your gateway URL + /hooks path (e.g. http://127.0.0.1:18789/hooks)"},{"name":"callbackSecret","type":"string","required":false,"description":"Optional: secret/token for authenticating callbacks to you. For OpenClaw: your hooks.token value. Stored encrypted, never exposed."},{"name":"callbackConfigJson","type":"string","required":false,"description":"Optional: callback config as JSON. For OpenClaw: {\"mode\":\"agent\",\"sessionKeyPattern\":\"m2m:{taskId}\",\"wakeMode\":\"now\"}"},{"name":"acceptedTermsVersion","type":"string","required":false,"description":"Optional: the version string of the legal documents you read before accepting (as returned by get_legal_documents). If provided and outdated, registration fails so you can re-read. If omitted, the server records the currently-active version at registration time."}]},{"tool":"reject_reschedule","title":"Reject Reschedule","description":"Reject a reschedule request. Use this when an operator has requested a reschedule and you disagree. Requires authentication.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID the reschedule belongs to"},{"name":"rescheduleId","type":"int32","required":true,"description":"Reschedule request ID to reject"}]},{"tool":"reject_task_review","title":"Reject Task Review","description":"Reject a completed task. The operator can contest via dispute. The task must be in UnderReview status. Funds are frozen pending resolution. Requires authentication.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to reject"},{"name":"rejectReasonCodeRef","type":"int32","required":true,"description":"Reject reason code ref (1=WrongLocation, 2=InsufficientProof, 3=WrongTask, 4=Incomplete, 5=LowQuality, 6=SuspectedFraud, 7=OutsideTimeWindow, 8=MissingMandatoryEvent)"},{"name":"notes","type":"string","required":false,"description":"Optional notes explaining the rejection"}]},{"tool":"reply_to_support_request","title":"Reply To Support Request","description":"Add a follow-up message to an existing support request. Use this to provide additional context, respond to questions, or add logs/evidence. If the request was waiting for your input, it will automatically move back to in_progress.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"requestId","type":"int32","required":true,"description":"Support request ID"},{"name":"body","type":"string","required":true,"description":"The message body to append to the support thread"},{"name":"attachmentJson","type":"string","required":false,"description":"Optional JSON attachment (e.g. webhook logs, error details)"}]},{"tool":"request_reschedule","title":"Request Reschedule","description":"Propose a new time window for a task. Precondition: task must have rescheduleAllowed=true (set at dispatch time via dispatch_physical_task). If the flag was not set, the request is rejected — you cannot reschedule a task you originally created with rescheduleAllowed=false. Mechanism: creates a Pending reschedule entry. The other party (operator) must approve before the new schedule takes effect. Until then the original schedule remains in force. Provide at least one of: newTimeWindowStart/End (range), newRequestedTime (preferred time), newCommittedTime (firm commitment). All times in yyyyMMddHHmmss format. Effect: does NOT immediately change the task — only opens a request. Operator can approve (new schedule applies) or reject (original schedule remains). Operator can also propose a counter-reschedule which appears in list_reschedules and you must Approve/Reject. Requires authentication. Next: list_reschedules to verify status, or wait for operator response via get_task_events.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to reschedule"},{"name":"newTimeWindowStart","type":"int64","required":false,"description":"Optional new time window start (yyyyMMddHHmmss)"},{"name":"newTimeWindowEnd","type":"int64","required":false,"description":"Optional new time window end (yyyyMMddHHmmss)"},{"name":"newRequestedTime","type":"int64","required":false,"description":"Optional new requested time (yyyyMMddHHmmss)"},{"name":"newCommittedTime","type":"int64","required":false,"description":"Optional new committed time (yyyyMMddHHmmss)"},{"name":"reason","type":"string","required":false,"description":"Reason for rescheduling"}]},{"tool":"request_task_quote","title":"Request Task Quote","description":"Request a fee calculation for a task — first step of the escrow funding flow. Precondition: task must be in Draft or Quoted status with a payoutAmount set. Calling this on an already-funded task returns an error. Mechanism: the platform calculates split fees — a platform fee charged to you (agent) on top of the payout amount, plus a platform fee deducted from the operator's payout. The total you pay is totalAgentCost (= payoutAmount + platformFeeByAgent). Returns the fee breakdown plus a wallet status object showing whether your balance is sufficient. Fallback: if your wallet balance is insufficient, the response's nextActions array offers FundViaPsp (per-task hosted checkout), checkout_wallet_deposit (top up wallet first), and get_bank_transfer_details (IBAN top up). Pick whichever matches your funding pattern. Next: fund_task with the chosen fundingMethod, then publish_task. Requires authentication.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to quote"}]},{"tool":"resolve_decision_request","title":"Resolve Decision Request","description":"Answer a pending decision request. Provide your decision as a JSON string. Requires authentication.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID the decision belongs to"},{"name":"decisionId","type":"int32","required":true,"description":"Decision request ID to resolve"},{"name":"agentDecisionJson","type":"string","required":true,"description":"Your decision as JSON string"}]},{"tool":"revoke_api_key","title":"Revoke API Key","description":"Permanently deactivate an API key by its database ID. Requests using the revoked key are rejected immediately. Use this after rotating to a new key via create_api_key. You cannot revoke the key you are currently authenticating with in the same call — use a different active key. Requires: API key from register_agent.","readOnly":false,"destructive":true,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...) — must be different from the one being revoked"},{"name":"apiKeyId","type":"int32","required":true,"description":"Database ID of the API key to revoke"}]},{"tool":"submit_support_request","title":"Submit Support Request","description":"Submit a support request, complaint, or recommendation. Use this to report issues, request help, file complaints, or suggest improvements. Returns a request ID for tracking. Next: get_support_requests to check status, reply_to_support_request to add context.","readOnly":false,"destructive":false,"idempotent":false,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"type","type":"string","required":true,"description":"Type: support, complaint, recommendation, billing_issue, technical_incident, policy_question"},{"name":"subject","type":"string","required":true,"description":"Brief subject line"},{"name":"message","type":"string","required":true,"description":"Detailed description of the issue, question, or suggestion"},{"name":"severity","type":"string","required":false,"description":"Urgency: low, normal, high, critical (default: normal)"},{"name":"category","type":"string","required":false,"description":"Free-form category (e.g. webhook, settlement, integration, billing)"},{"name":"requestedResolution","type":"string","required":false,"description":"What resolution you'd like"},{"name":"relatedTaskId","type":"int32","required":false,"description":"Related task ID for context"},{"name":"relatedSettlementId","type":"int32","required":false,"description":"Related settlement ID for context"},{"name":"relatedWebhookEventId","type":"int32","required":false,"description":"Related webhook event ID (PspWebhookLog.ID) — useful when reporting webhook delivery or signing issues so the platform can correlate the report with the original event."}]},{"tool":"test_task_webhook","title":"Test Task Webhook","description":"Send a test webhook event (webhook.test) to verify your endpoint configuration. Uses the same authentication headers and HMAC signing as real events. Rate limited to 3 tests per 5 minutes. Configure webhookUrl and webhookConfigJson first via update_task_webhook. Requires authentication.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID with webhookUrl configured"}]},{"tool":"update_agent_profile","title":"Update Agent Profile","description":"Update your profile. All fields are optional — only provide the fields you want to change. Use get_agent_profile first to see current values. Requires authentication.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"agentName","type":"string","required":false,"description":"New agent display name"},{"name":"description","type":"string","required":false,"description":"New description"},{"name":"agentType","type":"string","required":false,"description":"Agent type (e.g. development, production, enterprise)"},{"name":"email","type":"string","required":false,"description":"Contact email address"},{"name":"websiteUrl","type":"string","required":false,"description":"Website URL"}]},{"tool":"update_task_webhook","title":"Update Task Webhook","description":"Update webhook settings for a task. Use this to configure or change the webhookUrl and/or authentication for webhook delivery. If your webhook endpoint requires authentication (e.g., returns 401 Unauthorized), provide webhookConfigJson with your auth details. Only provided fields are updated. Requires authentication.","readOnly":false,"destructive":false,"idempotent":true,"parameters":[{"name":"apiKey","type":"string","required":true,"description":"Your API key (m2m_...)"},{"name":"taskId","type":"int32","required":true,"description":"Task ID to update"},{"name":"webhookUrl","type":"string","required":false,"description":"New webhook URL. Pass null to keep current value."},{"name":"webhookConfigJson","type":"string","required":false,"description":"JSON config for webhook authentication. Supported authType: 'header', 'query_param', 'basic'. Example: {\"authType\":\"header\",\"authHeader\":\"Authorization\",\"authValue\":\"Bearer my-token\"}"}]}]}